| 
									
										
										
										
											1996-11-27 19:52:01 +00:00
										 |  |  | #! /usr/bin/env python | 
					
						
							| 
									
										
										
										
											1995-04-26 22:57:11 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											1995-04-27 18:07:20 +00:00
										 |  |  | "Remote RCS -- command line interface" | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1995-04-26 22:57:11 +00:00
										 |  |  | import sys | 
					
						
							|  |  |  | import os | 
					
						
							|  |  |  | import getopt | 
					
						
							|  |  |  | import string | 
					
						
							|  |  |  | import md5 | 
					
						
							|  |  |  | import tempfile | 
					
						
							| 
									
										
										
										
											1995-04-27 18:07:20 +00:00
										 |  |  | from rcsclient import openrcsclient | 
					
						
							| 
									
										
										
										
											1995-04-26 22:57:11 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | def main(): | 
					
						
							| 
									
										
										
										
											2004-07-18 05:56:09 +00:00
										 |  |  |     sys.stdout = sys.stderr | 
					
						
							|  |  |  |     try: | 
					
						
							|  |  |  |         opts, rest = getopt.getopt(sys.argv[1:], 'h:p:d:qvL') | 
					
						
							|  |  |  |         if not rest: | 
					
						
							|  |  |  |             cmd = 'head' | 
					
						
							|  |  |  |         else: | 
					
						
							|  |  |  |             cmd, rest = rest[0], rest[1:] | 
					
						
							| 
									
										
										
										
											2007-07-17 20:59:35 +00:00
										 |  |  |         if cmd not in commands: | 
					
						
							|  |  |  |             raise getopt.error("unknown command") | 
					
						
							| 
									
										
										
										
											2004-07-18 05:56:09 +00:00
										 |  |  |         coptset, func = commands[cmd] | 
					
						
							|  |  |  |         copts, files = getopt.getopt(rest, coptset) | 
					
						
							| 
									
										
										
										
											2007-01-10 16:19:56 +00:00
										 |  |  |     except getopt.error as msg: | 
					
						
							| 
									
										
										
										
											2007-07-17 20:59:35 +00:00
										 |  |  |         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") | 
					
						
							| 
									
										
										
										
											2004-07-18 05:56:09 +00:00
										 |  |  |         sys.exit(2) | 
					
						
							|  |  |  |     x = openrcsclient(opts) | 
					
						
							|  |  |  |     if not files: | 
					
						
							|  |  |  |         files = x.listfiles() | 
					
						
							|  |  |  |     for fn in files: | 
					
						
							|  |  |  |         try: | 
					
						
							|  |  |  |             func(x, copts, fn) | 
					
						
							| 
									
										
										
										
											2007-01-10 16:19:56 +00:00
										 |  |  |         except (IOError, os.error) as msg: | 
					
						
							| 
									
										
										
										
											2007-07-17 20:59:35 +00:00
										 |  |  |             print("%s: %s" % (fn, msg)) | 
					
						
							| 
									
										
										
										
											1995-04-26 22:57:11 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | def checkin(x, copts, fn): | 
					
						
							| 
									
										
										
										
											2004-07-18 05:56:09 +00:00
										 |  |  |     f = open(fn) | 
					
						
							|  |  |  |     data = f.read() | 
					
						
							|  |  |  |     f.close() | 
					
						
							|  |  |  |     new = not x.isvalid(fn) | 
					
						
							|  |  |  |     if not new and same(x, copts, fn, data): | 
					
						
							| 
									
										
										
										
											2007-07-17 20:59:35 +00:00
										 |  |  |         print("%s: unchanged since last checkin" % fn) | 
					
						
							| 
									
										
										
										
											2004-07-18 05:56:09 +00:00
										 |  |  |         return | 
					
						
							| 
									
										
										
										
											2007-07-17 20:59:35 +00:00
										 |  |  |     print("Checking in", fn, "...") | 
					
						
							| 
									
										
										
										
											2004-07-18 05:56:09 +00:00
										 |  |  |     message = asklogmessage(new) | 
					
						
							|  |  |  |     messages = x.put(fn, data, message) | 
					
						
							|  |  |  |     if messages: | 
					
						
							| 
									
										
										
										
											2007-07-17 20:59:35 +00:00
										 |  |  |         print(messages) | 
					
						
							| 
									
										
										
										
											1995-04-26 22:57:11 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | def checkout(x, copts, fn): | 
					
						
							| 
									
										
										
										
											2004-07-18 05:56:09 +00:00
										 |  |  |     data = x.get(fn) | 
					
						
							|  |  |  |     f = open(fn, 'w') | 
					
						
							|  |  |  |     f.write(data) | 
					
						
							|  |  |  |     f.close() | 
					
						
							| 
									
										
										
										
											1995-04-26 22:57:11 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											1995-07-18 18:40:41 +00:00
										 |  |  | def lock(x, copts, fn): | 
					
						
							| 
									
										
										
										
											2004-07-18 05:56:09 +00:00
										 |  |  |     x.lock(fn) | 
					
						
							| 
									
										
										
										
											1995-07-18 18:40:41 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | def unlock(x, copts, fn): | 
					
						
							| 
									
										
										
										
											2004-07-18 05:56:09 +00:00
										 |  |  |     x.unlock(fn) | 
					
						
							| 
									
										
										
										
											1995-07-18 18:40:41 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											1995-04-26 22:57:11 +00:00
										 |  |  | def info(x, copts, fn): | 
					
						
							| 
									
										
										
										
											2007-08-06 21:07:53 +00:00
										 |  |  |     info_dict = x.info(fn) | 
					
						
							|  |  |  |     for key in sorted(info_dict.keys()): | 
					
						
							|  |  |  |         print(key + ':', info_dict[key]) | 
					
						
							| 
									
										
										
										
											2007-07-17 20:59:35 +00:00
										 |  |  |     print('='*70) | 
					
						
							| 
									
										
										
										
											1995-04-26 22:57:11 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | def head(x, copts, fn): | 
					
						
							| 
									
										
										
										
											2004-07-18 05:56:09 +00:00
										 |  |  |     head = x.head(fn) | 
					
						
							| 
									
										
										
										
											2007-07-17 20:59:35 +00:00
										 |  |  |     print(fn, head) | 
					
						
							| 
									
										
										
										
											1995-04-26 22:57:11 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | def list(x, copts, fn): | 
					
						
							| 
									
										
										
										
											2004-07-18 05:56:09 +00:00
										 |  |  |     if x.isvalid(fn): | 
					
						
							| 
									
										
										
										
											2007-07-17 20:59:35 +00:00
										 |  |  |         print(fn) | 
					
						
							| 
									
										
										
										
											1995-04-26 22:57:11 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | def log(x, copts, fn): | 
					
						
							| 
									
										
										
										
											2004-07-18 05:56:09 +00:00
										 |  |  |     flags = '' | 
					
						
							|  |  |  |     for o, a in copts: | 
					
						
							|  |  |  |         flags = flags + ' ' + o + a | 
					
						
							|  |  |  |     flags = flags[1:] | 
					
						
							|  |  |  |     messages = x.log(fn, flags) | 
					
						
							| 
									
										
										
										
											2007-07-17 20:59:35 +00:00
										 |  |  |     print(messages) | 
					
						
							| 
									
										
										
										
											1995-04-26 22:57:11 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | def diff(x, copts, fn): | 
					
						
							| 
									
										
										
										
											2004-07-18 05:56:09 +00:00
										 |  |  |     if same(x, copts, fn): | 
					
						
							|  |  |  |         return | 
					
						
							|  |  |  |     flags = '' | 
					
						
							|  |  |  |     for o, a in copts: | 
					
						
							|  |  |  |         flags = flags + ' ' + o + a | 
					
						
							|  |  |  |     flags = flags[1:] | 
					
						
							|  |  |  |     data = x.get(fn) | 
					
						
							|  |  |  |     tf = tempfile.NamedTemporaryFile() | 
					
						
							|  |  |  |     tf.write(data) | 
					
						
							|  |  |  |     tf.flush() | 
					
						
							| 
									
										
										
										
											2007-07-17 20:59:35 +00:00
										 |  |  |     print('diff %s -r%s %s' % (flags, x.head(fn), fn)) | 
					
						
							| 
									
										
										
										
											2004-07-18 05:56:09 +00:00
										 |  |  |     sts = os.system('diff %s %s %s' % (flags, tf.name, fn)) | 
					
						
							|  |  |  |     if sts: | 
					
						
							| 
									
										
										
										
											2007-07-17 20:59:35 +00:00
										 |  |  |         print('='*70) | 
					
						
							| 
									
										
										
										
											1995-04-26 22:57:11 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | def same(x, copts, fn, data = None): | 
					
						
							| 
									
										
										
										
											2004-07-18 05:56:09 +00:00
										 |  |  |     if data is None: | 
					
						
							|  |  |  |         f = open(fn) | 
					
						
							|  |  |  |         data = f.read() | 
					
						
							|  |  |  |         f.close() | 
					
						
							|  |  |  |     lsum = md5.new(data).digest() | 
					
						
							|  |  |  |     rsum = x.sum(fn) | 
					
						
							|  |  |  |     return lsum == rsum | 
					
						
							| 
									
										
										
										
											1995-04-26 22:57:11 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | def asklogmessage(new): | 
					
						
							| 
									
										
										
										
											2004-07-18 05:56:09 +00:00
										 |  |  |     if new: | 
					
						
							| 
									
										
										
										
											2007-07-17 20:59:35 +00:00
										 |  |  |         print("enter description,", end=' ') | 
					
						
							| 
									
										
										
										
											2004-07-18 05:56:09 +00:00
										 |  |  |     else: | 
					
						
							| 
									
										
										
										
											2007-07-17 20:59:35 +00:00
										 |  |  |         print("enter log message,", end=' ') | 
					
						
							|  |  |  |     print("terminate with single '.' or end of file:") | 
					
						
							| 
									
										
										
										
											2004-07-18 05:56:09 +00:00
										 |  |  |     if new: | 
					
						
							| 
									
										
										
										
											2007-07-17 20:59:35 +00:00
										 |  |  |         print("NOTE: This is NOT the log message!") | 
					
						
							| 
									
										
										
										
											2004-07-18 05:56:09 +00:00
										 |  |  |     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 | 
					
						
							| 
									
										
										
										
											1995-04-26 22:57:11 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | def remove(fn): | 
					
						
							| 
									
										
										
										
											2004-07-18 05:56:09 +00:00
										 |  |  |     try: | 
					
						
							|  |  |  |         os.unlink(fn) | 
					
						
							|  |  |  |     except os.error: | 
					
						
							|  |  |  |         pass | 
					
						
							| 
									
										
										
										
											1995-04-26 22:57:11 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | commands = { | 
					
						
							| 
									
										
										
										
											2004-07-18 05:56:09 +00:00
										 |  |  |         'ci': ('', checkin), | 
					
						
							|  |  |  |         'put': ('', checkin), | 
					
						
							|  |  |  |         'co': ('', checkout), | 
					
						
							|  |  |  |         'get': ('', checkout), | 
					
						
							|  |  |  |         'info': ('', info), | 
					
						
							|  |  |  |         'head': ('', head), | 
					
						
							|  |  |  |         'list': ('', list), | 
					
						
							|  |  |  |         'lock': ('', lock), | 
					
						
							|  |  |  |         'unlock': ('', unlock), | 
					
						
							|  |  |  |         'log': ('bhLRtd:l:r:s:w:V:', log), | 
					
						
							|  |  |  |         'diff': ('c', diff), | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											1995-04-26 22:57:11 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											1995-04-27 21:28:20 +00:00
										 |  |  | if __name__ == '__main__': | 
					
						
							| 
									
										
										
										
											2004-07-18 05:56:09 +00:00
										 |  |  |     main() |