blob: 9e246b8014085a19dd6ceb18e2980322b5d4ad59 [file] [log] [blame]
Benjamin Peterson90f5ba52010-03-11 22:53:45 +00001#! /usr/bin/env python3
Guido van Rossum5f07b841995-04-26 22:57:11 +00002
Guido van Rossum4d4ee8b1995-04-27 18:07:20 +00003"Remote RCS -- command line interface"
4
Guido van Rossum5f07b841995-04-26 22:57:11 +00005import sys
6import os
7import getopt
8import string
9import md5
10import tempfile
Guido van Rossum4d4ee8b1995-04-27 18:07:20 +000011from rcsclient import openrcsclient
Guido van Rossum5f07b841995-04-26 22:57:11 +000012
13def main():
Tim Peterse6ddc8b2004-07-18 05:56:09 +000014 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:]
Collin Winter6f2df4d2007-07-17 20:59:35 +000021 if cmd not in commands:
22 raise getopt.error("unknown command")
Tim Peterse6ddc8b2004-07-18 05:56:09 +000023 coptset, func = commands[cmd]
24 copts, files = getopt.getopt(rest, coptset)
Guido van Rossumb940e112007-01-10 16:19:56 +000025 except getopt.error as msg:
Collin Winter6f2df4d2007-07-17 20:59:35 +000026 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")
Tim Peterse6ddc8b2004-07-18 05:56:09 +000037 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)
Guido van Rossumb940e112007-01-10 16:19:56 +000044 except (IOError, os.error) as msg:
Collin Winter6f2df4d2007-07-17 20:59:35 +000045 print("%s: %s" % (fn, msg))
Guido van Rossum5f07b841995-04-26 22:57:11 +000046
Guido van Rossum5f07b841995-04-26 22:57:11 +000047def checkin(x, copts, fn):
Tim Peterse6ddc8b2004-07-18 05:56:09 +000048 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):
Collin Winter6f2df4d2007-07-17 20:59:35 +000053 print("%s: unchanged since last checkin" % fn)
Tim Peterse6ddc8b2004-07-18 05:56:09 +000054 return
Collin Winter6f2df4d2007-07-17 20:59:35 +000055 print("Checking in", fn, "...")
Tim Peterse6ddc8b2004-07-18 05:56:09 +000056 message = asklogmessage(new)
57 messages = x.put(fn, data, message)
58 if messages:
Collin Winter6f2df4d2007-07-17 20:59:35 +000059 print(messages)
Guido van Rossum5f07b841995-04-26 22:57:11 +000060
61def checkout(x, copts, fn):
Tim Peterse6ddc8b2004-07-18 05:56:09 +000062 data = x.get(fn)
63 f = open(fn, 'w')
64 f.write(data)
65 f.close()
Guido van Rossum5f07b841995-04-26 22:57:11 +000066
Guido van Rossumff99a721995-07-18 18:40:41 +000067def lock(x, copts, fn):
Tim Peterse6ddc8b2004-07-18 05:56:09 +000068 x.lock(fn)
Guido van Rossumff99a721995-07-18 18:40:41 +000069
70def unlock(x, copts, fn):
Tim Peterse6ddc8b2004-07-18 05:56:09 +000071 x.unlock(fn)
Guido van Rossumff99a721995-07-18 18:40:41 +000072
Guido van Rossum5f07b841995-04-26 22:57:11 +000073def info(x, copts, fn):
Skip Montanaro1e8ce582007-08-06 21:07:53 +000074 info_dict = x.info(fn)
75 for key in sorted(info_dict.keys()):
76 print(key + ':', info_dict[key])
Collin Winter6f2df4d2007-07-17 20:59:35 +000077 print('='*70)
Guido van Rossum5f07b841995-04-26 22:57:11 +000078
79def head(x, copts, fn):
Tim Peterse6ddc8b2004-07-18 05:56:09 +000080 head = x.head(fn)
Collin Winter6f2df4d2007-07-17 20:59:35 +000081 print(fn, head)
Guido van Rossum5f07b841995-04-26 22:57:11 +000082
83def list(x, copts, fn):
Tim Peterse6ddc8b2004-07-18 05:56:09 +000084 if x.isvalid(fn):
Collin Winter6f2df4d2007-07-17 20:59:35 +000085 print(fn)
Guido van Rossum5f07b841995-04-26 22:57:11 +000086
87def log(x, copts, fn):
Tim Peterse6ddc8b2004-07-18 05:56:09 +000088 flags = ''
89 for o, a in copts:
90 flags = flags + ' ' + o + a
91 flags = flags[1:]
92 messages = x.log(fn, flags)
Collin Winter6f2df4d2007-07-17 20:59:35 +000093 print(messages)
Guido van Rossum5f07b841995-04-26 22:57:11 +000094
95def diff(x, copts, fn):
Tim Peterse6ddc8b2004-07-18 05:56:09 +000096 if same(x, copts, fn):
97 return
98 flags = ''
99 for o, a in copts:
100 flags = flags + ' ' + o + a
101 flags = flags[1:]
102 data = x.get(fn)
103 tf = tempfile.NamedTemporaryFile()
104 tf.write(data)
105 tf.flush()
Collin Winter6f2df4d2007-07-17 20:59:35 +0000106 print('diff %s -r%s %s' % (flags, x.head(fn), fn))
Tim Peterse6ddc8b2004-07-18 05:56:09 +0000107 sts = os.system('diff %s %s %s' % (flags, tf.name, fn))
108 if sts:
Collin Winter6f2df4d2007-07-17 20:59:35 +0000109 print('='*70)
Guido van Rossum5f07b841995-04-26 22:57:11 +0000110
111def same(x, copts, fn, data = None):
Tim Peterse6ddc8b2004-07-18 05:56:09 +0000112 if data is None:
113 f = open(fn)
114 data = f.read()
115 f.close()
116 lsum = md5.new(data).digest()
117 rsum = x.sum(fn)
118 return lsum == rsum
Guido van Rossum5f07b841995-04-26 22:57:11 +0000119
120def asklogmessage(new):
Tim Peterse6ddc8b2004-07-18 05:56:09 +0000121 if new:
Collin Winter6f2df4d2007-07-17 20:59:35 +0000122 print("enter description,", end=' ')
Tim Peterse6ddc8b2004-07-18 05:56:09 +0000123 else:
Collin Winter6f2df4d2007-07-17 20:59:35 +0000124 print("enter log message,", end=' ')
125 print("terminate with single '.' or end of file:")
Tim Peterse6ddc8b2004-07-18 05:56:09 +0000126 if new:
Collin Winter6f2df4d2007-07-17 20:59:35 +0000127 print("NOTE: This is NOT the log message!")
Tim Peterse6ddc8b2004-07-18 05:56:09 +0000128 message = ""
129 while 1:
130 sys.stderr.write(">> ")
131 sys.stderr.flush()
132 line = sys.stdin.readline()
133 if not line or line == '.\n': break
134 message = message + line
135 return message
Guido van Rossum5f07b841995-04-26 22:57:11 +0000136
137def remove(fn):
Tim Peterse6ddc8b2004-07-18 05:56:09 +0000138 try:
139 os.unlink(fn)
140 except os.error:
141 pass
Guido van Rossum5f07b841995-04-26 22:57:11 +0000142
143commands = {
Tim Peterse6ddc8b2004-07-18 05:56:09 +0000144 'ci': ('', checkin),
145 'put': ('', checkin),
146 'co': ('', checkout),
147 'get': ('', checkout),
148 'info': ('', info),
149 'head': ('', head),
150 'list': ('', list),
151 'lock': ('', lock),
152 'unlock': ('', unlock),
153 'log': ('bhLRtd:l:r:s:w:V:', log),
154 'diff': ('c', diff),
155 }
Guido van Rossum5f07b841995-04-26 22:57:11 +0000156
Guido van Rossum547e8d81995-04-27 21:28:20 +0000157if __name__ == '__main__':
Tim Peterse6ddc8b2004-07-18 05:56:09 +0000158 main()