cpython/Demo/pdist/rrcs.py

157 lines
3.3 KiB
Python
Raw Normal View History

1995-04-26 19:57:11 -03:00
#! /usr/local/bin/python
1995-04-27 15:07:20 -03:00
"Remote RCS -- command line interface"
1995-04-26 19:57:11 -03:00
import sys
import os
import getopt
import string
import md5
import tempfile
1995-04-27 15:07:20 -03:00
from rcsclient import openrcsclient
1995-04-26 19:57:11 -03:00
def main():
sys.stdout = sys.stderr
try:
1995-06-23 19:40:59 -03:00
opts, rest = getopt.getopt(sys.argv[1:], 'h:p:d:qvL')
1995-04-26 19:57:11 -03:00
if not rest:
1995-04-27 15:07:20 -03:00
cmd = 'head'
else:
cmd, rest = rest[0], rest[1:]
1995-04-26 19:57:11 -03:00
if not commands.has_key(cmd):
raise getopt.error, "unknown command"
coptset, func = commands[cmd]
copts, files = getopt.getopt(rest, coptset)
except getopt.error, msg:
print msg
print "usage: rrcs [options] command [options] [file] ..."
print "where command can be:"
print " ci|put # checkin the given files"
print " co|get # checkout"
print " info # print header info"
print " head # print revision of head branch"
print " list # list filename if valid"
print " log # print full log"
print " diff # diff rcs file and work file"
print "if no files are given, all remote rcs files are assumed"
sys.exit(2)
1995-04-27 15:07:20 -03:00
x = openrcsclient(opts)
1995-04-26 19:57:11 -03:00
if not files:
files = x.listfiles()
for fn in files:
try:
func(x, copts, fn)
except (IOError, os.error), msg:
print "%s: %s" % (fn, msg)
def checkin(x, copts, fn):
f = open(fn)
data = f.read()
f.close()
new = not x.isfile(fn)
if not new and same(x, copts, fn, data):
print "%s: unchanged since last checkin" % fn
return
print "Checking in", fn, "..."
1995-04-26 19:57:11 -03:00
message = asklogmessage(new)
messages = x.put(fn, data, message)
if messages:
print messages
def checkout(x, copts, fn):
data = x.get(fn)
f = open(fn, 'w')
f.write(data)
f.close()
def info(x, copts, fn):
dict = x.info(fn)
keys = dict.keys()
keys.sort()
for key in keys:
print key + ':', dict[key]
print '='*70
def head(x, copts, fn):
head = x.head(fn)
print fn, head
def list(x, copts, fn):
if x.isfile(fn):
print fn
def log(x, copts, fn):
flags = ''
for o, a in copts:
flags = flags + ' ' + o + a
flags = flags[1:]
messages = x.log(fn, flags)
print messages
def diff(x, copts, fn):
if same(x, copts, fn):
return
flags = ''
for o, a in copts:
flags = flags + ' ' + o + a
flags = flags[1:]
data = x.get(fn)
tfn = tempfile.mktemp()
try:
tf = open(tfn, 'w')
tf.write(data)
tf.close()
print 'diff %s -r%s %s' % (flags, x.head(fn), fn)
sts = os.system('diff %s %s %s' % (flags, tfn, fn))
if sts:
print '='*70
finally:
remove(tfn)
def same(x, copts, fn, data = None):
if data is None:
f = open(fn)
data = f.read()
f.close()
lsum = md5.new(data).digest()
rsum = x.sum(fn)
return lsum == rsum
def asklogmessage(new):
if new:
print "enter description,",
else:
print "enter log message,",
print "terminate with single '.' or end of file:"
if new:
print "NOTE: This is NOT the log message!"
message = ""
while 1:
sys.stderr.write(">> ")
sys.stderr.flush()
line = sys.stdin.readline()
if not line or line == '.\n': break
message = message + line
return message
def remove(fn):
try:
os.unlink(fn)
except os.error:
pass
commands = {
'ci': ('', checkin),
'put': ('', checkin),
'co': ('', checkout),
'get': ('', checkout),
'info': ('', info),
'head': ('', head),
'list': ('', list),
'log': ('bhLRtd:l:r:s:w:V:', log),
'diff': ('c', diff),
}
if __name__ == '__main__':
main()