Merged release21-maint changes.
[python/dscho.git] / Demo / pdist / rrcs.py
blobecb01a29dca9c3bb0a8bc990b7ce35d54e334cd7
1 #! /usr/bin/env python
3 "Remote RCS -- command line interface"
5 import sys
6 import os
7 import getopt
8 import string
9 import md5
10 import tempfile
11 from rcsclient import openrcsclient
13 def main():
14 sys.stdout = sys.stderr
15 try:
16 opts, rest = getopt.getopt(sys.argv[1:], 'h:p:d:qvL')
17 if not rest:
18 cmd = 'head'
19 else:
20 cmd, rest = rest[0], rest[1:]
21 if not commands.has_key(cmd):
22 raise getopt.error, "unknown command"
23 coptset, func = commands[cmd]
24 copts, files = getopt.getopt(rest, coptset)
25 except getopt.error, msg:
26 print msg
27 print "usage: rrcs [options] command [options] [file] ..."
28 print "where command can be:"
29 print " ci|put # checkin the given files"
30 print " co|get # checkout"
31 print " info # print header info"
32 print " head # print revision of head branch"
33 print " list # list filename if valid"
34 print " log # print full log"
35 print " diff # diff rcs file and work file"
36 print "if no files are given, all remote rcs files are assumed"
37 sys.exit(2)
38 x = openrcsclient(opts)
39 if not files:
40 files = x.listfiles()
41 for fn in files:
42 try:
43 func(x, copts, fn)
44 except (IOError, os.error), msg:
45 print "%s: %s" % (fn, msg)
47 def checkin(x, copts, fn):
48 f = open(fn)
49 data = f.read()
50 f.close()
51 new = not x.isvalid(fn)
52 if not new and same(x, copts, fn, data):
53 print "%s: unchanged since last checkin" % fn
54 return
55 print "Checking in", fn, "..."
56 message = asklogmessage(new)
57 messages = x.put(fn, data, message)
58 if messages:
59 print messages
61 def checkout(x, copts, fn):
62 data = x.get(fn)
63 f = open(fn, 'w')
64 f.write(data)
65 f.close()
67 def lock(x, copts, fn):
68 x.lock(fn)
70 def unlock(x, copts, fn):
71 x.unlock(fn)
73 def info(x, copts, fn):
74 dict = x.info(fn)
75 keys = dict.keys()
76 keys.sort()
77 for key in keys:
78 print key + ':', dict[key]
79 print '='*70
81 def head(x, copts, fn):
82 head = x.head(fn)
83 print fn, head
85 def list(x, copts, fn):
86 if x.isvalid(fn):
87 print fn
89 def log(x, copts, fn):
90 flags = ''
91 for o, a in copts:
92 flags = flags + ' ' + o + a
93 flags = flags[1:]
94 messages = x.log(fn, flags)
95 print messages
97 def diff(x, copts, fn):
98 if same(x, copts, fn):
99 return
100 flags = ''
101 for o, a in copts:
102 flags = flags + ' ' + o + a
103 flags = flags[1:]
104 data = x.get(fn)
105 tfn = tempfile.mktemp()
106 try:
107 tf = open(tfn, 'w')
108 tf.write(data)
109 tf.close()
110 print 'diff %s -r%s %s' % (flags, x.head(fn), fn)
111 sts = os.system('diff %s %s %s' % (flags, tfn, fn))
112 if sts:
113 print '='*70
114 finally:
115 remove(tfn)
117 def same(x, copts, fn, data = None):
118 if data is None:
119 f = open(fn)
120 data = f.read()
121 f.close()
122 lsum = md5.new(data).digest()
123 rsum = x.sum(fn)
124 return lsum == rsum
126 def asklogmessage(new):
127 if new:
128 print "enter description,",
129 else:
130 print "enter log message,",
131 print "terminate with single '.' or end of file:"
132 if new:
133 print "NOTE: This is NOT the log message!"
134 message = ""
135 while 1:
136 sys.stderr.write(">> ")
137 sys.stderr.flush()
138 line = sys.stdin.readline()
139 if not line or line == '.\n': break
140 message = message + line
141 return message
143 def remove(fn):
144 try:
145 os.unlink(fn)
146 except os.error:
147 pass
149 commands = {
150 'ci': ('', checkin),
151 'put': ('', checkin),
152 'co': ('', checkout),
153 'get': ('', checkout),
154 'info': ('', info),
155 'head': ('', head),
156 'list': ('', list),
157 'lock': ('', lock),
158 'unlock': ('', unlock),
159 'log': ('bhLRtd:l:r:s:w:V:', log),
160 'diff': ('c', diff),
163 if __name__ == '__main__':
164 main()