cvsshell-devel Mailing List for CvsShell (Page 6)
Status: Beta
Brought to you by:
stefanheimann
You can subscribe to this list here.
| 2002 |
Jan
|
Feb
|
Mar
(82) |
Apr
|
May
(14) |
Jun
(3) |
Jul
(27) |
Aug
(18) |
Sep
(10) |
Oct
(1) |
Nov
(8) |
Dec
|
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 2003 |
Jan
|
Feb
(1) |
Mar
(1) |
Apr
(63) |
May
(2) |
Jun
(2) |
Jul
(2) |
Aug
|
Sep
(3) |
Oct
(2) |
Nov
|
Dec
|
| 2004 |
Jan
|
Feb
(5) |
Mar
|
Apr
|
May
|
Jun
|
Jul
(1) |
Aug
|
Sep
|
Oct
|
Nov
|
Dec
|
|
From: Stefan H. <ste...@us...> - 2002-07-27 15:34:15
|
Update of /cvsroot/cvsshell/cvsshell/src
In directory usw-pr-cvs1:/tmp/cvs-serv12224/src
Added Files:
entry_parser.py
Log Message:
just a try...
--- NEW FILE: entry_parser.py ---
import sys, re, os, stat
dirname = os.path.dirname
from time import *
lineRe = re.compile(r'(?P<isdir>D?)/(?P<name>[^/]*)/(?P<revision>[^/]*)/(?P<mtime>[^/]*)//')
def parse(filename):
dir = dirname(dirname(filename))
f = open(filename)
for line in f.readlines():
result = lineRe.match(line)
if not result: continue
if result.group('isdir'):
print 'directory:', result.group('name')
else:
name = result.group('name')
revision = result.group('revision')
repTime = mktime(strptime(result.group('mtime')))
localTime = mktime(gmtime(os.stat(os.path.join(dir, name))[stat.ST_MTIME])) # this is bit dirty
if repTime == localTime:
print name, 'with revision', revision, 'was NOT modified.'
else:
print name, 'with revision', revision, 'was modified.'
if __name__ == '__main__':
if len(sys.argv) < 2:
print 'error'
sys.exit(1)
parse(sys.argv[1])
|
|
From: Stefan H. <ste...@us...> - 2002-07-27 14:55:11
|
Update of /cvsroot/cvsshell/cvsshell/src
In directory usw-pr-cvs1:/tmp/cvs-serv4319
Modified Files:
interactive_app.py
Log Message:
forget to commmit some changes
Index: interactive_app.py
===================================================================
RCS file: /cvsroot/cvsshell/cvsshell/src/interactive_app.py,v
retrieving revision 1.11
retrieving revision 1.12
diff -C2 -d -r1.11 -r1.12
*** interactive_app.py 27 Jul 2002 14:42:13 -0000 1.11
--- interactive_app.py 27 Jul 2002 14:55:08 -0000 1.12
***************
*** 37,41 ****
readline.parse_and_bind("tab: complete")
readline.set_completer_delims(' \t\n`~!@#$%^&*()-=+[{]}\\|;:\'",<>?')
- # readline.set_completer(complete)
def setHistoryFile(self,filename):
--- 37,40 ----
***************
*** 104,110 ****
raise AppError, 'evalCommand must be redefined!'
- def complete(self, text, state):
- if state == 0:
- dir = dirname(text)
- print 'text: ', text
- if state == 0: return 'd/'
--- 103,104 ----
|
|
From: Stefan H. <ste...@us...> - 2002-07-27 14:42:16
|
Update of /cvsroot/cvsshell/cvsshell/src
In directory usw-pr-cvs1:/tmp/cvs-serv1211/src
Modified Files:
interactive_app.py
Log Message:
Index: interactive_app.py
===================================================================
RCS file: /cvsroot/cvsshell/cvsshell/src/interactive_app.py,v
retrieving revision 1.10
retrieving revision 1.11
diff -C2 -d -r1.10 -r1.11
*** interactive_app.py 27 Jul 2002 13:32:32 -0000 1.10
--- interactive_app.py 27 Jul 2002 14:42:13 -0000 1.11
***************
*** 23,30 ****
from app import App, AppError
- def complete(text, state):
- print 'text: ', text
- if state == 0: return 'd/'
-
class InteractiveApp(App):
--- 23,26 ----
***************
*** 40,44 ****
else:
readline.parse_and_bind("tab: complete")
! readline.set_completer(complete)
def setHistoryFile(self,filename):
--- 36,41 ----
else:
readline.parse_and_bind("tab: complete")
! readline.set_completer_delims(' \t\n`~!@#$%^&*()-=+[{]}\\|;:\'",<>?')
! # readline.set_completer(complete)
def setHistoryFile(self,filename):
***************
*** 107,108 ****
--- 104,110 ----
raise AppError, 'evalCommand must be redefined!'
+ def complete(self, text, state):
+ if state == 0:
+ dir = dirname(text)
+ print 'text: ', text
+ if state == 0: return 'd/'
|
|
From: Stefan H. <ste...@us...> - 2002-07-27 14:42:16
|
Update of /cvsroot/cvsshell/cvsshell
In directory usw-pr-cvs1:/tmp/cvs-serv1211
Modified Files:
ChangeLog
Log Message:
Index: ChangeLog
===================================================================
RCS file: /cvsroot/cvsshell/cvsshell/ChangeLog,v
retrieving revision 1.7
retrieving revision 1.8
diff -C2 -d -r1.7 -r1.8
*** ChangeLog 27 Jul 2002 09:05:37 -0000 1.7
--- ChangeLog 27 Jul 2002 14:42:13 -0000 1.8
***************
*** 19,23 ****
- improved status command: the repository revision, the working revision and
the time of last modification is displayed, too.
!
* Version 0.2.1
--- 19,24 ----
- improved status command: the repository revision, the working revision and
the time of last modification is displayed, too.
! - improved readline support: completion is now possible for more than one
! directory
* Version 0.2.1
|
|
From: Stefan H. <ste...@us...> - 2002-07-27 13:32:36
|
Update of /cvsroot/cvsshell/cvsshell/src
In directory usw-pr-cvs1:/tmp/cvs-serv21925/src
Modified Files:
interactive_app.py
Log Message:
Index: interactive_app.py
===================================================================
RCS file: /cvsroot/cvsshell/cvsshell/src/interactive_app.py,v
retrieving revision 1.9
retrieving revision 1.10
diff -C2 -d -r1.9 -r1.10
*** interactive_app.py 26 Jul 2002 15:44:25 -0000 1.9
--- interactive_app.py 27 Jul 2002 13:32:32 -0000 1.10
***************
*** 23,26 ****
--- 23,30 ----
from app import App, AppError
+ def complete(text, state):
+ print 'text: ', text
+ if state == 0: return 'd/'
+
class InteractiveApp(App):
***************
*** 34,40 ****
self.printErr("Could not import readline.\nHistory browsing " \
"and tab completion will not be available.")
- return
else:
readline.parse_and_bind("tab: complete")
def setHistoryFile(self,filename):
--- 38,44 ----
self.printErr("Could not import readline.\nHistory browsing " \
"and tab completion will not be available.")
else:
readline.parse_and_bind("tab: complete")
+ readline.set_completer(complete)
def setHistoryFile(self,filename):
|
|
From: Stefan H. <ste...@us...> - 2002-07-27 09:05:41
|
Update of /cvsroot/cvsshell/cvsshell/src
In directory usw-pr-cvs1:/tmp/cvs-serv11318/src
Modified Files:
cvs_cmds.py cvs_shell.py
Log Message:
improved status cmd
Index: cvs_cmds.py
===================================================================
RCS file: /cvsroot/cvsshell/cvsshell/src/cvs_cmds.py,v
retrieving revision 1.12
retrieving revision 1.13
diff -C2 -d -r1.12 -r1.13
*** cvs_cmds.py 26 Jul 2002 18:12:07 -0000 1.12
--- cvs_cmds.py 27 Jul 2002 09:05:38 -0000 1.13
***************
*** 32,41 ****
"""Display status information on checked out files.
This command creates a listing with all checked out files and
! their status.
The listing can be filtered by setting the variable
`filter' in the CONFIG section of ~/.cvsshellrc."""
entries = []
regexHead = re.compile(r'File: (?P<name>\S+)\s+Status: (?P<status>.+)')
regexDir = re.compile(r'.*Examining (?P<dir>\S+)')
regexUnknown = re.compile(r'^\?\s+(?P<filename>\S+)')
--- 32,46 ----
"""Display status information on checked out files.
This command creates a listing with all checked out files and
! their status. The abbreviation `rr' stands for `repository revision',
! `wr' means working revision.
The listing can be filtered by setting the variable
`filter' in the CONFIG section of ~/.cvsshellrc."""
+ import stat
+ from time import gmtime,strftime
entries = []
regexHead = re.compile(r'File: (?P<name>\S+)\s+Status: (?P<status>.+)')
+ regexWorkingRev = re.compile(r'\s*Working revision:\s+(\S+)')
+ regexRepRev = re.compile(r'\s*Repository revision:\s+(\S+)')
regexDir = re.compile(r'.*Examining (?P<dir>\S+)')
regexUnknown = re.compile(r'^\?\s+(?P<filename>\S+)')
***************
*** 54,58 ****
entries = []
dir = None
! for line in lines:
unknownRes = regexUnknown.search(line)
if unknownRes:
--- 59,67 ----
entries = []
dir = None
! n = len(lines)
! i = 0
! while i < n:
! line = lines[i]
! i = i+1
unknownRes = regexUnknown.search(line)
if unknownRes:
***************
*** 68,72 ****
name = headRes.group('name')
status = headRes.group('status').strip()
! entries.append(Entry(dir, name, status))
continue
dirRes = regexDir.search(line)
--- 77,90 ----
name = headRes.group('name')
status = headRes.group('status').strip()
! i = i+1 # skip empty line
! workingRev = regexWorkingRev.search(lines[i]).group(1)
! i = i+1
! repRev = regexRepRev.search(lines[i]).group(1)
! i = i+1
! try:
! time = strftime('%Y-%m-%d %H:%M', gmtime(os.stat(os.path.join(os.getcwd(), dir, name))[stat.ST_MTIME]))
! except OSError: time = ''
! info = 'rr: ' + repRev + ', wr: ' + workingRev + ', ' + time
! entries.append(Entry(dir, name, status, info))
continue
dirRes = regexDir.search(line)
Index: cvs_shell.py
===================================================================
RCS file: /cvsroot/cvsshell/cvsshell/src/cvs_shell.py,v
retrieving revision 1.27
retrieving revision 1.28
diff -C2 -d -r1.27 -r1.28
*** cvs_shell.py 19 Jul 2002 11:36:03 -0000 1.27
--- cvs_shell.py 27 Jul 2002 09:05:38 -0000 1.28
***************
*** 28,32 ****
from plugable_app import PlugableApp
! VERSION = '0.2.2'
NAME ='CvsShell'
COPYRIGHT = 'Copyright 2002 Stefan Heimann (ma...@st...).\n' \
--- 28,32 ----
from plugable_app import PlugableApp
! VERSION = '0.3'
NAME ='CvsShell'
COPYRIGHT = 'Copyright 2002 Stefan Heimann (ma...@st...).\n' \
***************
*** 315,319 ****
! def printListing(self):
if not self.listing:
self.printErr(self.noListingErrMsg)
--- 315,319 ----
! def printListing(self, footer=None):
if not self.listing:
self.printErr(self.noListingErrMsg)
***************
*** 325,329 ****
self.dirtyListing = 0
else:
! self.listing.printEntries()
if self.getDirtyListing():
self.printMsg("Listing may be out-of-date. " \
--- 325,329 ----
self.dirtyListing = 0
else:
! self.listing.printEntries(footer=footer)
if self.getDirtyListing():
self.printMsg("Listing may be out-of-date. " \
***************
*** 417,429 ****
self.entries.sort(__EntrySorter(self.sortOrder).cmp)
! def printEntries(self, verbose=1):
if not self.entries:
if verbose: self.app.printMsg('No entries available.')
return
! max = 0
for e in self.entries:
! l = len(e.status)
! if l > max: max = l
! formatStr = " %%%dd %%-%ds %%s%%s\n" % (len(`len(self.entries)`), max)
oldDir = None
id = 0
--- 417,430 ----
self.entries.sort(__EntrySorter(self.sortOrder).cmp)
! def printEntries(self, verbose=1, footer=None):
if not self.entries:
if verbose: self.app.printMsg('No entries available.')
return
! maxStatus = 0
! maxName = 0
for e in self.entries:
! maxStatus = max(len(e.status), maxStatus)
! maxName = max(len(e.name), maxName)
! formatStr = " %%%dd %%-%ds %%s%%s" % (len(`len(self.entries)`), maxStatus)
oldDir = None
id = 0
***************
*** 435,439 ****
lines.append("%s:\n" % newDir)
if os.path.isdir(os.path.join(self.rootDir, e.dir, e.name)):
! isDir = "<dir> "
else:
isDir = ''
--- 436,440 ----
lines.append("%s:\n" % newDir)
if os.path.isdir(os.path.join(self.rootDir, e.dir, e.name)):
! isDir = '<dir> '
else:
isDir = ''
***************
*** 441,447 ****
--- 442,451 ----
color = self.app.getConfigMap().get(colorKey, '')
s = self.app.col(color, formatStr % (id, e.status, isDir, e.name))
+ s = s + (maxName - len(e.name))*' ' + ' ' + e.info + '\n'
lines.append(s)
id += 1
oldDir = newDir
+ if footer:
+ lines.append(footer + '\n')
self.app.more(lines)
***************
*** 463,471 ****
S_DELETED = 'D' # file scheduled for removal has been commited
statusToColorKey = None
! def __init__(self, dir, name, status):
GetSetProvider.__init__(self)
self.dir = dir
self.name = name
self.status = status
if Entry.statusToColorKey is None:
Entry.statusToColorKey = {}
--- 467,476 ----
S_DELETED = 'D' # file scheduled for removal has been commited
statusToColorKey = None
! def __init__(self, dir, name, status, info=''):
GetSetProvider.__init__(self)
self.dir = dir
self.name = name
self.status = status
+ self.info = info
if Entry.statusToColorKey is None:
Entry.statusToColorKey = {}
|
|
From: Stefan H. <ste...@us...> - 2002-07-27 09:05:41
|
Update of /cvsroot/cvsshell/cvsshell In directory usw-pr-cvs1:/tmp/cvs-serv11318 Modified Files: ChangeLog Log Message: improved status cmd Index: ChangeLog =================================================================== RCS file: /cvsroot/cvsshell/cvsshell/ChangeLog,v retrieving revision 1.6 retrieving revision 1.7 diff -C2 -d -r1.6 -r1.7 *** ChangeLog 19 Jul 2002 11:36:03 -0000 1.6 --- ChangeLog 27 Jul 2002 09:05:37 -0000 1.7 *************** *** 1,9 **** CvsShell Version History ! * Version 0.2.2 + Bugfixes: ! - fixed bug that caused arguments of a command which are delimited by newlines ! to be ignored. --- 1,22 ---- CvsShell Version History ! * Version 0.3 + Bugfixes: ! - fixed bug that caused arguments of a command which are delimited ! by newlines to be ignored. ! - fixed bug that caused options to the update command to be ignored ! (bug ID: 584831) ! - fixed bug ID 560963 ! ! + Enhancements: ! - new command: scan. scan reads all files recursivly starting at a ! given directory (or the current working directory if none is given) ! and creates a directory listing without contacting the server. You ! can refer to the ids in the listing in all subsequent commands. ! - improved status/refresh/update command: you now can specify the ! directory to operate on. ! - improved status command: the repository revision, the working revision and ! the time of last modification is displayed, too. |
|
From: Stefan H. <ste...@us...> - 2002-07-27 09:04:00
|
Update of /cvsroot/cvsshell/cvsshell/testing In directory usw-pr-cvs1:/tmp/cvs-serv11180/testing Removed Files: refstdout refstderr run-test.py testinput Log Message: tests were not good, so I removed them --- refstdout DELETED --- --- refstderr DELETED --- --- run-test.py DELETED --- --- testinput DELETED --- |
|
From: <no...@so...> - 2002-07-26 18:13:35
|
Feature Requests item #537083, was opened at 2002-03-30 13:42 You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=452215&aid=537083&group_id=48175 Category: None Group: None >Status: Closed Priority: 5 Submitted By: Nobody/Anonymous (nobody) Assigned to: Nobody/Anonymous (nobody) Summary: Listing out of date Initial Comment: The warning that the listing is out of date should be printed colorized. ---------------------------------------------------------------------- You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=452215&aid=537083&group_id=48175 |
|
From: <no...@so...> - 2002-07-26 18:12:50
|
Bugs item #584831, was opened at 2002-07-22 12:27 You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=452212&aid=584831&group_id=48175 Category: None Group: None Status: Closed Resolution: Fixed Priority: 5 Submitted By: Nobody/Anonymous (nobody) Assigned to: Nobody/Anonymous (nobody) Summary: update commit does not propagate options Initial Comment: for exmple: update -j simple-formdata . is not executed with the -j option ---------------------------------------------------------------------- >Comment By: Stefan Heimann (stefanheimann) Date: 2002-07-26 20:12 Message: Logged In: YES user_id=327401 fixed in 0.3 ---------------------------------------------------------------------- You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=452212&aid=584831&group_id=48175 |
|
From: Stefan H. <ste...@us...> - 2002-07-26 18:12:10
|
Update of /cvsroot/cvsshell/cvsshell/src
In directory usw-pr-cvs1:/tmp/cvs-serv6445/src
Modified Files:
cvs_cmds.py
Log Message:
fixed bug ID 560963
Index: cvs_cmds.py
===================================================================
RCS file: /cvsroot/cvsshell/cvsshell/src/cvs_cmds.py,v
retrieving revision 1.11
retrieving revision 1.12
diff -C2 -d -r1.11 -r1.12
*** cvs_cmds.py 26 Jul 2002 16:35:37 -0000 1.11
--- cvs_cmds.py 26 Jul 2002 18:12:07 -0000 1.12
***************
*** 271,282 ****
else:
rest = answ
- def __doIt(e,filename):
- if e.status == Entry.S_REMOVED:
- e.status = Entry.S_DELETED
- else:
- e.status = Entry.S_OK
- return filename
try:
! filenames = app.applyOnEntryList(rest, __doIt)
try:
if filenames:
--- 271,276 ----
else:
rest = answ
try:
! filenames = app.applyOnEntryList(rest, lambda e, fname: fname)
try:
if filenames:
***************
*** 284,288 ****
globOpts=globOpts,
args=opts+' '+string.join(filenames), fork=0)
! except CvsError: pass
except utils.ParseError: # args do not spefiy ids in the current listing
try:
--- 278,288 ----
globOpts=globOpts,
args=opts+' '+string.join(filenames), fork=0)
! def __doIt(e,filename):
! if e.status == Entry.S_REMOVED:
! e.status = Entry.S_DELETED
! else:
! e.status = Entry.S_OK
! app.applyOnEntryList(rest, __doIt)
! except CvsError: return
except utils.ParseError: # args do not spefiy ids in the current listing
try:
***************
*** 290,294 ****
args=opts+' '+rest, fork=0)
app.setDirtyListing(1)
! except CvsError: pass
except AppError, msg:
app.printErr(msg)
--- 290,294 ----
args=opts+' '+rest, fork=0)
app.setDirtyListing(1)
! except CvsError: return
except AppError, msg:
app.printErr(msg)
|
|
From: <no...@so...> - 2002-07-26 18:10:59
|
Bugs item #560963, was opened at 2002-05-27 09:38 You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=452212&aid=560963&group_id=48175 Category: None Group: None >Status: Closed >Resolution: Fixed Priority: 5 Submitted By: Nobody/Anonymous (nobody) Assigned to: Nobody/Anonymous (nobody) Summary: commit command changes status incorrect Initial Comment: The commit command changes the status of the local listing even if the user aborts the operation (for example by not specifying a commit message and choosing *abort in the next dialog) ---------------------------------------------------------------------- >Comment By: Stefan Heimann (stefanheimann) Date: 2002-07-26 20:10 Message: Logged In: YES user_id=327401 fixed in 0.3 ---------------------------------------------------------------------- You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=452212&aid=560963&group_id=48175 |
|
From: <no...@so...> - 2002-07-26 16:40:21
|
Bugs item #584831, was opened at 2002-07-22 12:27 You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=452212&aid=584831&group_id=48175 Category: None Group: None >Status: Closed >Resolution: Fixed Priority: 5 Submitted By: Nobody/Anonymous (nobody) Assigned to: Nobody/Anonymous (nobody) Summary: update commit does not propagate options Initial Comment: for exmple: update -j simple-formdata . is not executed with the -j option ---------------------------------------------------------------------- You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=452212&aid=584831&group_id=48175 |
|
From: Stefan H. <ste...@us...> - 2002-07-26 16:35:40
|
Update of /cvsroot/cvsshell/cvsshell/src
In directory usw-pr-cvs1:/tmp/cvs-serv13101/src
Modified Files:
basic_cmds.py cvs_cmds.py utils.py
Log Message:
implemented scan-command
Index: basic_cmds.py
===================================================================
RCS file: /cvsroot/cvsshell/cvsshell/src/basic_cmds.py,v
retrieving revision 1.19
retrieving revision 1.20
diff -C2 -d -r1.19 -r1.20
*** basic_cmds.py 27 May 2002 07:32:29 -0000 1.19
--- basic_cmds.py 26 Jul 2002 16:35:37 -0000 1.20
***************
*** 21,24 ****
--- 21,25 ----
import os, string, re
+ from cvs_shell import Listing, Entry
######################################
***************
*** 104,105 ****
--- 105,127 ----
in the local listing."""
app.autoRefresh = app.toggle(app.autoRefresh, args)
+
+ def scan(app, name, args):
+ """Scans the local filesystem starting at the given directory and creates a listing.
+ The server is not contacted, so the status of all files will be `unknown'."""
+ def visit(entries, dirname, names):
+ if dirname.find('CVS') >= 0: return
+ for name in names:
+ if name.find('CVS') < 0:
+ entries.append(Entry(dirname, name, Entry.S_UNKNOWN))
+ dir = '.'
+ entries = []
+ if args != '': dir = args
+ try:
+ os.path.walk(dir, visit, entries)
+ except OSError, msg:
+ app.printErr(msg)
+ app.setListing(Listing(app, dir, entries))
+ app.setDirtyListing(0)
+ app.getListing().sortEntries()
+ app.printListing()
+
Index: cvs_cmds.py
===================================================================
RCS file: /cvsroot/cvsshell/cvsshell/src/cvs_cmds.py,v
retrieving revision 1.10
retrieving revision 1.11
diff -C2 -d -r1.10 -r1.11
*** cvs_cmds.py 26 Jul 2002 15:44:25 -0000 1.10
--- cvs_cmds.py 26 Jul 2002 16:35:37 -0000 1.11
***************
*** 46,49 ****
--- 46,52 ----
app.printErr(msg)
return
+ rootDir = utils.getAbsDir(rest)
+ if rootDir is None:
+ return
try:
lines = app.runCvsCmd('status', globOpts=globOpts, args=opts+' '+rest, getStderr=1)
***************
*** 71,75 ****
dir = dirRes.group('dir')
if dir == '.': dir = ''
! app.setListing(Listing(app, os.getcwd(), entries))
app.setDirtyListing(0)
app.getListing().sortEntries()
--- 74,78 ----
dir = dirRes.group('dir')
if dir == '.': dir = ''
! app.setListing(Listing(app, rootDir, entries))
app.setDirtyListing(0)
app.getListing().sortEntries()
***************
*** 93,96 ****
--- 96,102 ----
return
if simulate: globOpts += '-n'
+ rootDir = utils.getAbsDir(rest)
+ if rootDir is None:
+ return
try:
lines = app.runCvsCmd('update', globOpts=globOpts, args=opts+' '+rest)
***************
*** 104,108 ****
dir = os.path.dirname(x[1])
entries.append(Entry(dir, name, status))
! app.setListing(Listing(app, os.getcwd(), entries))
app.setDirtyListing(0)
app.getListing().sortEntries()
--- 110,114 ----
dir = os.path.dirname(x[1])
entries.append(Entry(dir, name, status))
! app.setListing(Listing(app, rootDir, entries))
app.setDirtyListing(0)
app.getListing().sortEntries()
Index: utils.py
===================================================================
RCS file: /cvsroot/cvsshell/cvsshell/src/utils.py,v
retrieving revision 1.10
retrieving revision 1.11
diff -C2 -d -r1.10 -r1.11
*** utils.py 27 May 2002 07:32:29 -0000 1.10
--- utils.py 26 Jul 2002 16:35:37 -0000 1.11
***************
*** 23,28 ****
from app import AppError
- ParseError = 'ParseError'
###########################
--- 23,46 ----
from app import AppError
+ def getAbsDir(str):
+ """Returns the absolute directory str denotes. If str does not denote a directory, None is returned.
+ """
+ import os
+ try:
+ if str == '': return os.getcwd()
+ str = os.path.expandvars(str)
+ str = os.path.expanduser(str)
+ if not os.path.exists(str):
+ return None
+ if not os.path.isabs(str):
+ str = os.path.join(os.getcwd(), str)
+ return os.path.dirname(str)
+ except OSError, msg:
+ print msg
+ return None
+
+
+ ParseError = 'ParseError'
###########################
|
|
From: Stefan H. <ste...@us...> - 2002-07-26 16:35:40
|
Update of /cvsroot/cvsshell/cvsshell/etc
In directory usw-pr-cvs1:/tmp/cvs-serv13101/etc
Modified Files:
cvsshell.ini
Log Message:
implemented scan-command
Index: cvsshell.ini
===================================================================
RCS file: /cvsroot/cvsshell/cvsshell/etc/cvsshell.ini,v
retrieving revision 1.9
retrieving revision 1.10
diff -C2 -d -r1.9 -r1.10
*** cvsshell.ini 27 May 2002 07:38:52 -0000 1.9
--- cvsshell.ini 26 Jul 2002 16:35:37 -0000 1.10
***************
*** 19,22 ****
--- 19,23 ----
full-info = basic_cmds.toggleFullInfoLine
auto-refresh = basic_cmds.setAutoRefresh
+ scan = basic_cmds.scan
end
|
|
From: Stefan H. <ste...@us...> - 2002-07-26 15:44:28
|
Update of /cvsroot/cvsshell/cvsshell/src
In directory usw-pr-cvs1:/tmp/cvs-serv26587/src
Modified Files:
cvs_cmds.py interactive_app.py
Log Message:
* fixed bug with status/update command (dirnames were not passed to the command)
* KeyboardInterrupt exception is catched at a higher level in interactive_app (no more
unwanted termination)
Index: cvs_cmds.py
===================================================================
RCS file: /cvsroot/cvsshell/cvsshell/src/cvs_cmds.py,v
retrieving revision 1.9
retrieving revision 1.10
diff -C2 -d -r1.9 -r1.10
*** cvs_cmds.py 26 Jul 2002 15:32:57 -0000 1.9
--- cvs_cmds.py 26 Jul 2002 15:44:25 -0000 1.10
***************
*** 47,51 ****
return
try:
! lines = app.runCvsCmd('status', globOpts=globOpts, args=opts, getStderr=1)
except CvsError: return
entries = []
--- 47,51 ----
return
try:
! lines = app.runCvsCmd('status', globOpts=globOpts, args=opts+' '+rest, getStderr=1)
except CvsError: return
entries = []
***************
*** 94,98 ****
if simulate: globOpts += '-n'
try:
! lines = app.runCvsCmd('update', globOpts=globOpts, args=opts)
except CvsError: return
entries = []
--- 94,98 ----
if simulate: globOpts += '-n'
try:
! lines = app.runCvsCmd('update', globOpts=globOpts, args=opts+' '+rest)
except CvsError: return
entries = []
Index: interactive_app.py
===================================================================
RCS file: /cvsroot/cvsshell/cvsshell/src/interactive_app.py,v
retrieving revision 1.8
retrieving revision 1.9
diff -C2 -d -r1.8 -r1.9
*** interactive_app.py 3 Jun 2002 07:40:48 -0000 1.8
--- interactive_app.py 26 Jul 2002 15:44:25 -0000 1.9
***************
*** 52,59 ****
def run(self):
while 1:
! command = self.readCommand()
! if command == None:
! break
! result = self.evalCommand(command)
if result is self.BREAK_REPL: break
elif result is None: continue
--- 52,66 ----
def run(self):
while 1:
! try:
! command = self.readCommand()
! if command == None:
! break
! result = self.evalCommand(command)
! except EOFError:
! self.printMsg()
! return None
! except KeyboardInterrupt:
! self.printMsg()
! return None
if result is self.BREAK_REPL: break
elif result is None: continue
***************
*** 83,94 ****
else:
msg += '[%s] ' % default
! try:
! a = raw_input(msg)
! except EOFError:
! self.printMsg()
! return None
! except KeyboardInterrupt:
! self.printMsg()
! return None
a = os.path.expandvars(a)
a = os.path.expanduser(a)
--- 90,94 ----
else:
msg += '[%s] ' % default
! a = raw_input(msg)
a = os.path.expandvars(a)
a = os.path.expanduser(a)
|
|
From: Stefan H. <ste...@us...> - 2002-07-26 15:33:01
|
Update of /cvsroot/cvsshell/cvsshell/src
In directory usw-pr-cvs1:/tmp/cvs-serv22241/src
Modified Files:
cvs_cmds.py
Log Message:
fixed bug in update command (bug id: 584831)
Index: cvs_cmds.py
===================================================================
RCS file: /cvsroot/cvsshell/cvsshell/src/cvs_cmds.py,v
retrieving revision 1.8
retrieving revision 1.9
diff -C2 -d -r1.8 -r1.9
*** cvs_cmds.py 27 May 2002 07:32:29 -0000 1.8
--- cvs_cmds.py 26 Jul 2002 15:32:57 -0000 1.9
***************
*** 77,81 ****
! def update(app, args, name, simulate=0):
"""Bring work tree in sync with repository.
This command donwloads new files and changes to already
--- 77,81 ----
! def update(app, name, args, simulate=0):
"""Bring work tree in sync with repository.
This command donwloads new files and changes to already
|
|
From: <no...@so...> - 2002-07-26 10:18:00
|
Feature Requests item #586917, was opened at 2002-07-26 03:17 You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=452215&aid=586917&group_id=48175 Category: None Group: None Status: Open Priority: 5 Submitted By: Nobody/Anonymous (nobody) Assigned to: Nobody/Anonymous (nobody) Summary: Replace file with previous revision Initial Comment: It should be possible to replace a file with a previous revision. There should be a option to commit the changes immediately after replacing In cvs you would write cvs update -p -r x.x SomeFile > SomeFile ; cvs commit -m "replaced with revision x.x" SomeFile With cvsshell one could write replace SomeFile x.x ---------------------------------------------------------------------- You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=452215&aid=586917&group_id=48175 |
|
From: <no...@so...> - 2002-07-22 10:27:04
|
Bugs item #584831, was opened at 2002-07-22 03:27 You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=452212&aid=584831&group_id=48175 Category: None Group: None Status: Open Resolution: None Priority: 5 Submitted By: Nobody/Anonymous (nobody) Assigned to: Nobody/Anonymous (nobody) Summary: update commit does not propagate options Initial Comment: for exmple: update -j simple-formdata . is not executed with the -j option ---------------------------------------------------------------------- You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=452212&aid=584831&group_id=48175 |
|
From: Stefan H. <ste...@us...> - 2002-07-19 11:36:06
|
Update of /cvsroot/cvsshell/cvsshell In directory usw-pr-cvs1:/tmp/cvs-serv22719 Modified Files: ChangeLog Log Message: fixed bug that caused arguments separated by newlines to be ignored. Index: ChangeLog =================================================================== RCS file: /cvsroot/cvsshell/cvsshell/ChangeLog,v retrieving revision 1.5 retrieving revision 1.6 diff -C2 -d -r1.5 -r1.6 *** ChangeLog 3 Jun 2002 07:42:17 -0000 1.5 --- ChangeLog 19 Jul 2002 11:36:03 -0000 1.6 *************** *** 1,4 **** --- 1,11 ---- CvsShell Version History + * Version 0.2.2 + + + Bugfixes: + - fixed bug that caused arguments of a command which are delimited by newlines + to be ignored. + + * Version 0.2.1 |
|
From: Stefan H. <ste...@us...> - 2002-07-19 11:36:06
|
Update of /cvsroot/cvsshell/cvsshell/src
In directory usw-pr-cvs1:/tmp/cvs-serv22719/src
Modified Files:
cvs_shell.py
Log Message:
fixed bug that caused arguments separated by newlines to be ignored.
Index: cvs_shell.py
===================================================================
RCS file: /cvsroot/cvsshell/cvsshell/src/cvs_shell.py,v
retrieving revision 1.26
retrieving revision 1.27
diff -C2 -d -r1.26 -r1.27
*** cvs_shell.py 3 Jun 2002 07:45:22 -0000 1.26
--- cvs_shell.py 19 Jul 2002 11:36:03 -0000 1.27
***************
*** 28,32 ****
from plugable_app import PlugableApp
! VERSION = '0.2.1'
NAME ='CvsShell'
COPYRIGHT = 'Copyright 2002 Stefan Heimann (ma...@st...).\n' \
--- 28,32 ----
from plugable_app import PlugableApp
! VERSION = '0.2.2'
NAME ='CvsShell'
COPYRIGHT = 'Copyright 2002 Stefan Heimann (ma...@st...).\n' \
***************
*** 64,68 ****
(?P<opts>.*) # the options of the command
)? # options are optional
! """, re.VERBOSE)
self.cvsChangeCmdRE = re.compile(r"""\s+
(ad(d)?|new|ci|com(mit)?|delete|remove)
--- 64,68 ----
(?P<opts>.*) # the options of the command
)? # options are optional
! """, re.VERBOSE | re.DOTALL)
self.cvsChangeCmdRE = re.compile(r"""\s+
(ad(d)?|new|ci|com(mit)?|delete|remove)
|
|
From: Stefan H. <ste...@us...> - 2002-06-03 07:45:26
|
Update of /cvsroot/cvsshell/cvsshell/src In directory usw-pr-cvs1:/tmp/cvs-serv23287/src Modified Files: cvs_shell.py Log Message: incremented version Index: cvs_shell.py =================================================================== RCS file: /cvsroot/cvsshell/cvsshell/src/cvs_shell.py,v retrieving revision 1.25 retrieving revision 1.26 diff -C2 -d -r1.25 -r1.26 *** cvs_shell.py 3 Jun 2002 07:40:48 -0000 1.25 --- cvs_shell.py 3 Jun 2002 07:45:22 -0000 1.26 *************** *** 28,32 **** from plugable_app import PlugableApp ! VERSION = '0.2' NAME ='CvsShell' COPYRIGHT = 'Copyright 2002 Stefan Heimann (ma...@st...).\n' \ --- 28,32 ---- from plugable_app import PlugableApp ! VERSION = '0.2.1' NAME ='CvsShell' COPYRIGHT = 'Copyright 2002 Stefan Heimann (ma...@st...).\n' \ |
|
From: Stefan H. <ste...@us...> - 2002-06-03 07:42:20
|
Update of /cvsroot/cvsshell/cvsshell In directory usw-pr-cvs1:/tmp/cvs-serv22641 Modified Files: ChangeLog Log Message: added entries for release 0.2.1 Index: ChangeLog =================================================================== RCS file: /cvsroot/cvsshell/cvsshell/ChangeLog,v retrieving revision 1.4 retrieving revision 1.5 diff -C2 -d -r1.4 -r1.5 *** ChangeLog 27 May 2002 07:38:25 -0000 1.4 --- ChangeLog 3 Jun 2002 07:42:17 -0000 1.5 *************** *** 1,4 **** --- 1,15 ---- CvsShell Version History + * Version 0.2.1 + + + Bugfixes: + - fixed bug in InteractiveApp + + + Enhancements + - auto-refresh of the directory listing is now invoked when the listing + is dirty _and_ should be printed and not only when the listing is + out-of-date. + + * Version 0.2 |
|
From: Stefan H. <ste...@us...> - 2002-06-03 07:40:51
|
Update of /cvsroot/cvsshell/cvsshell/src
In directory usw-pr-cvs1:/tmp/cvs-serv21726/src
Modified Files:
cvs_shell.py interactive_app.py
Log Message:
* fixed bug in InteractiveApp
* auto-refresh of the directory listing is now invoked when the listing
is dirty _and_ should be printed and not only when the listing is
out-of-date.
Index: cvs_shell.py
===================================================================
RCS file: /cvsroot/cvsshell/cvsshell/src/cvs_shell.py,v
retrieving revision 1.24
retrieving revision 1.25
diff -C2 -d -r1.24 -r1.25
*** cvs_shell.py 27 May 2002 07:32:29 -0000 1.24
--- cvs_shell.py 3 Jun 2002 07:40:48 -0000 1.25
***************
*** 97,104 ****
def getPrompt(self):
- if self.autoRefresh and self.dirtyListing and self.cvsRoot:
- self.printMsg('getting listing from ' + self.cvsRoot)
- self.evalCommand('refresh')
- self.dirtyListing = 0
status = ''
if self.cvsRootAutoUpdate: status += 'a'
--- 97,100 ----
***************
*** 322,325 ****
--- 318,327 ----
if not self.listing:
self.printErr(self.noListingErrMsg)
+ return
+ if self.autoRefresh and self.dirtyListing and self.cvsRoot:
+ self.printMsg('getting listing from ' + self.cvsRoot +
+ ". To disable this feature execute `auto-root off'.")
+ self.evalCommand('refresh')
+ self.dirtyListing = 0
else:
self.listing.printEntries()
Index: interactive_app.py
===================================================================
RCS file: /cvsroot/cvsshell/cvsshell/src/interactive_app.py,v
retrieving revision 1.7
retrieving revision 1.8
diff -C2 -d -r1.7 -r1.8
*** interactive_app.py 28 Mar 2002 23:07:37 -0000 1.7
--- interactive_app.py 3 Jun 2002 07:40:48 -0000 1.8
***************
*** 1,104 ****
! ###############################################################################
! # This file is part of CvsShell
! #
! # CvsShell is free software; you can redistribute it and/or modify
! # it under the terms of the GNU General Public License as published by
! # the Free Software Foundation; either version 2 of the License, or
! # (at your option) any later version.
! #
! # CvsShell is distributed in the hope that it will be useful,
! # but WITHOUT ANY WARRANTY; without even the implied warranty of
! # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
! # GNU General Public License for more details.
! #
! # You should have received a copy of the GNU General Public License
! # along with CvsShell; if not, write to the Free Software
! # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
! #
! # Copyright 2002 by Stefan Heimann
! # Website: http://cvsshell.sourceforge.net/
! ###############################################################################
!
! import os, types
! from app import App, AppError
!
! class InteractiveApp(App):
!
! def __init__(self):
! App.__init__(self)
! self.BREAK_REPL = 'BREAK_REPL'
! self.DEF_PATTERN = '%%def%%'
! try:
! import readline
! except ImportError:
! self.printErr("Could not import readline.\nHistory browsing " \
! "and tab completion will not be available.")
! return
! else:
! readline.parse_and_bind("tab: complete")
!
! def setHistoryFile(self,filename):
! self.historyFile = filename
! try:
! import readline
! except ImportError: return
! try:
! readline.read_history_file(self.historyFile)
! except IOError:
! pass
! import atexit
! atexit.register(readline.write_history_file, self.historyFile)
!
! def run(self): # define App.run here
! while 1:
! command = self.readCommand()
! if command == None:
! break
! result = self.evalCommand(command)
! if result is self.BREAK_REPL: break
! elif result is None: continue
! else: self.printMsg(result)
!
! def readCommand(self): # subclass hooks + App.start,stop
! p = self.getPrompt()
! if type(p) == types.TupleType:
! return self.prompt(p[0], p[1])
! else:
! return self.prompt(p)
!
! def getPrompt(self):
! return '? '
!
! def prompt(self, msg, default=None):
! """Displayes msg and prompts the user for input.
! If input is EOF, None is returned.
! If input is the emtpy string and default is given, default is returned.
! If a default value is given and msg contains self.DEF_PATTERN,
! this part of msg is replaced by the default value surrounded with [].
! Otherwise the default value is append at the end of msg."""
! if default is not None:
! i = msg.find(self.DEF_PATTERN)
! if i >= 0:
! msg = msg[:i] + '[' + default + ']'+ msg[i+len(self.DEF_PATTERN):]
! else:
! msg += '[%s] ' % default
! try:
! a = raw_input(msg)
! except EOFError:
! self.printMsg()
! return None
! except KeyboardInterrupt:
! self.printMsg()
! return None
! a = os.path.expandvars(a)
! a = os.path.expanduser(a)
! a = a.strip()
! if a == '' and default is not None: return default
! else: return a
!
! def evalCommand(self, command):
! """Subclasses should override this method.
! If BREAK_REPL is returned, the repl is terminated,
! otherwise the return-value is printed (if not None)."""
! raise AppError, 'evalCommand must be redefined!'
!
--- 1,104 ----
! ###############################################################################
! # This file is part of CvsShell
! #
! # CvsShell is free software; you can redistribute it and/or modify
! # it under the terms of the GNU General Public License as published by
! # the Free Software Foundation; either version 2 of the License, or
! # (at your option) any later version.
! #
! # CvsShell is distributed in the hope that it will be useful,
! # but WITHOUT ANY WARRANTY; without even the implied warranty of
! # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
! # GNU General Public License for more details.
! #
! # You should have received a copy of the GNU General Public License
! # along with CvsShell; if not, write to the Free Software
! # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
! #
! # Copyright 2002 by Stefan Heimann
! # Website: http://cvsshell.sourceforge.net/
! ###############################################################################
!
! import os, types
! from app import App, AppError
!
! class InteractiveApp(App):
!
! def __init__(self):
! App.__init__(self)
! self.BREAK_REPL = 'BREAK_REPL'
! self.DEF_PATTERN = '%%def%%'
! try:
! import readline
! except ImportError:
! self.printErr("Could not import readline.\nHistory browsing " \
! "and tab completion will not be available.")
! return
! else:
! readline.parse_and_bind("tab: complete")
!
! def setHistoryFile(self,filename):
! self.historyFile = filename
! try:
! import readline
! except ImportError: return
! try:
! readline.read_history_file(self.historyFile)
! except IOError:
! pass
! import atexit
! atexit.register(readline.write_history_file, self.historyFile)
!
! def run(self):
! while 1:
! command = self.readCommand()
! if command == None:
! break
! result = self.evalCommand(command)
! if result is self.BREAK_REPL: break
! elif result is None: continue
! else: self.printMsg(result)
!
! def readCommand(self):
! p = self.getPrompt()
! if type(p) == types.TupleType:
! return self.prompt(p[0], p[1])
! else:
! return self.prompt(p)
!
! def getPrompt(self):
! return '? '
!
! def prompt(self, msg, default=None):
! """Displayes msg and prompts the user for input.
! If input is EOF, None is returned.
! If input is the emtpy string and default is given, default is returned.
! If a default value is given and msg contains self.DEF_PATTERN,
! this part of msg is replaced by the default value surrounded with [].
! Otherwise the default value is append at the end of msg."""
! if default is not None:
! i = msg.find(self.DEF_PATTERN)
! if i >= 0:
! msg = msg[:i] + '[' + default + ']'+ msg[i+len(self.DEF_PATTERN):]
! else:
! msg += '[%s] ' % default
! try:
! a = raw_input(msg)
! except EOFError:
! self.printMsg()
! return None
! except KeyboardInterrupt:
! self.printMsg()
! return None
! a = os.path.expandvars(a)
! a = os.path.expanduser(a)
! a = a.strip()
! if a == '' and default is not None: return default
! else: return a
!
! def evalCommand(self, command):
! """Subclasses should override this method.
! If BREAK_REPL is returned, the repl is terminated,
! otherwise the return-value is printed (if not None)."""
! raise AppError, 'evalCommand must be redefined!'
!
|
|
From: Stefan H. <ste...@us...> - 2002-05-27 08:32:00
|
Update of /cvsroot/cvsshell/cvsshell In directory usw-pr-cvs1:/tmp/cvs-serv10099 Modified Files: README index.html Added Files: ReleaseNotes Log Message: added feature list --- NEW FILE: ReleaseNotes --- CvsShell 0.2 released! http://cvsshell.sourceforge.net CvsShell is a console-based cvs client. It provides convenient access to the cvs commands through a shell-like user interface. Features: * CvsShell prompts you for all arguments needed for executing a command. * Aliases for different cvsroots. * Listing of all modified files in the current directory tree. * Operations on files in the listing can be executed quickly, because those files can be accessed using a numerical ID instead of a (typically long) pathname. * Output of external shell commands can be embedded in cvsshell commands. * IDs of files in the listing can be used in external shell commands. * Shortcuts for cvs commands: - Commit is automatically executed after an add or delete command (if you want to). - Renaming files with cvs is lenghty: you have the rename the file in the local filesystem, remove the old file, add the new file and commit your changes. With CvsShell, this is done with a single command. * New commands can be integrated easily into CvsShell. CvsShell is written on python and runs on every platform for which cvs and python is available. CvsShell is available from http://cvsshell.sourceforge.net Index: README =================================================================== RCS file: /cvsroot/cvsshell/cvsshell/README,v retrieving revision 1.5 retrieving revision 1.6 diff -C2 -d -r1.5 -r1.6 *** README 27 May 2002 07:54:34 -0000 1.5 --- README 27 May 2002 08:31:57 -0000 1.6 *************** *** 22,25 **** --- 22,45 ---- + Features + -------- + + * CvsShell prompts you for all arguments needed for executing a command. + * Aliases for different cvsroots. + * Listing of all modified files in the current directory tree. + * Operations on files in the listing can be executed quickly, because + those files can be accessed using a numerical ID instead of a + (typically long) pathname. + * Output of external shell commands can be embedded in cvsshell commands. + * IDs of files in the listing can be used in external shell commands. + * Shortcuts for cvs commands: + - Commit is automatically executed after an add or delete command (if you + want to). + - Renaming files with cvs is lenghty: you have the rename the file in the + local filesystem, remove the old file, add the new file and commit your + changes. With CvsShell, this is done with a single command. + * New commands can be integrated easily into CvsShell. + + Installation ------------ *************** *** 112,115 **** --- 132,154 ---- the filename. You can also specify several IDs. Type `help list' to get more information on how to do this. + + You can also use arbitrary external shell commands. To force a command to be executed + as a external command, you have to prepend a `!' to its name. + + Example: $ !rename + + You can use the ouput of a external shell command in the argument + string of a CvsShell command: + + $ commit `find . -name '*.java'` + + Commits all files ending with *.java + + It is also possible to use IDs of the listing in external shell commands. CvsShell + replaces these IDs with the corresponding filenames. + + Example: $ rm [[ 1,2,5-8 ]] + + Removes the files with IDs 1,2,5,6,7,8. To finish your session with CvsShell, just type `exit' or hit Ctrl-D. Index: index.html =================================================================== RCS file: /cvsroot/cvsshell/cvsshell/index.html,v retrieving revision 1.4 retrieving revision 1.5 diff -C2 -d -r1.4 -r1.5 *** index.html 27 May 2002 07:54:34 -0000 1.4 --- index.html 27 May 2002 08:31:57 -0000 1.5 *************** *** 10,16 **** <p> CvsShell is a console-based cvs-client written in <a href="http://www.python.org">Python</a>. ! The current version is 0.2 (2002-05-27). </p> <ul> <li><a href="README">Readme</a></li> --- 10,40 ---- <p> CvsShell is a console-based cvs-client written in <a href="http://www.python.org">Python</a>. ! The current version is 0.2 (2002-05-27). Read the <a href="ChangeLog">change log</a> and the ! <a href="ReleaseNotes">release notes</a>. </p> + <h3>Features:</h3> + <ul> + <li>CvsShell prompts you for all arguments needed for executing a command.</li> + <li>Aliases for different cvsroots.</li> + <li>Listing of all modified files in the current directory tree.</li> + <li>Operations on files in the listing can be executed quickly, because + those files can be accessed using a numerical ID instead of a + (typically long) pathname.</li> + <li>Output of external shell commands can be embedded in cvsshell commands.</li> + <li>IDs of files in the listing can be used in external shell commands.</li> + <li>Shortcuts for cvs commands: + <ul> + <li>Commit is automatically executed after an add or delete command (if you + want to).</li> + <li>Renaming files with cvs is lenghty: you have the rename the file in the + local filesystem, remove the old file, add the new file and commit your + changes. With CvsShell, this is done with a single command.</li> + </ul> + </li> + <li>New commands can be integrated easily into CvsShell.</li> + </ul> + + <h3>Resources:</h3> <ul> <li><a href="README">Readme</a></li> *************** *** 27,31 **** <p>You can view a screenshot <a href="images/screenshot.jpg">here</a>.</p> ! <p>Release history:</p> <ul> <li>0.2: 2002-05-27</li> --- 51,55 ---- <p>You can view a screenshot <a href="images/screenshot.jpg">here</a>.</p> ! <h3>Release history:</h3> <ul> <li>0.2: 2002-05-27</li> |