summaryrefslogtreecommitdiffstats
path: root/Demo/pdist/rrcs.py
diff options
context:
space:
mode:
authorGuido van Rossum <guido@python.org>1995-04-26 22:57:11 (GMT)
committerGuido van Rossum <guido@python.org>1995-04-26 22:57:11 (GMT)
commit5f07b84796c207a0068f6ac5a0d6981d14801ff6 (patch)
treed82516c437ec3872d6fd344bd6556407bfd940e1 /Demo/pdist/rrcs.py
parent107c747009b3717840f4d5fae8f0d5987ae27f89 (diff)
downloadcpython-5f07b84796c207a0068f6ac5a0d6981d14801ff6.zip
cpython-5f07b84796c207a0068f6ac5a0d6981d14801ff6.tar.gz
cpython-5f07b84796c207a0068f6ac5a0d6981d14801ff6.tar.bz2
Initial revision
Diffstat (limited to 'Demo/pdist/rrcs.py')
-rwxr-xr-xDemo/pdist/rrcs.py174
1 files changed, 174 insertions, 0 deletions
diff --git a/Demo/pdist/rrcs.py b/Demo/pdist/rrcs.py
new file mode 100755
index 0000000..74bce56
--- /dev/null
+++ b/Demo/pdist/rrcs.py
@@ -0,0 +1,174 @@
+#! /usr/local/bin/python
+
+import sys
+import os
+import getopt
+import string
+import md5
+import tempfile
+
+def main():
+ sys.stdout = sys.stderr
+ try:
+ opts, rest = getopt.getopt(sys.argv[1:], 'h:p:qv')
+ if not rest:
+ raise getopt.error, "missing command"
+ cmd, rest = rest[0], rest[1:]
+ 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)
+ x = openclient(opts)
+ 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 openclient(opts):
+ import client
+ import RCSProxy
+ host = 'spam'
+ port = 4127
+ verbose = client.VERBOSE
+ for o, a in opts:
+ if o == '-h':
+ host = a
+ if ':' in host:
+ i = string.find(host, ':')
+ host, p = host[:i], host[i+1:]
+ if p:
+ port = string.atoi(p)
+ if o == '-p':
+ port = string.atoi(a)
+ if o == '-v':
+ verbose = verbose + 1
+ if o == '-q':
+ verbose = 0
+ address = (host, port)
+ x = RCSProxy.RCSProxyClient(address, verbose)
+ return x
+
+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
+ 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),
+ }
+
+main()