| 
									
										
										
										
											1995-04-26 22:57:11 +00:00
										 |  |  | #! /usr/local/bin/python | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											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(): | 
					
						
							|  |  |  | 	sys.stdout = sys.stderr | 
					
						
							|  |  |  | 	try: | 
					
						
							| 
									
										
										
										
											1995-06-23 22:40:59 +00:00
										 |  |  | 		opts, rest = getopt.getopt(sys.argv[1:], 'h:p:d:qvL') | 
					
						
							| 
									
										
										
										
											1995-04-26 22:57:11 +00:00
										 |  |  | 		if not rest: | 
					
						
							| 
									
										
										
										
											1995-04-27 18:07:20 +00:00
										 |  |  | 			cmd = 'head' | 
					
						
							|  |  |  | 		else: | 
					
						
							|  |  |  | 			cmd, rest = rest[0], rest[1:] | 
					
						
							| 
									
										
										
										
											1995-04-26 22:57:11 +00: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 18:07:20 +00:00
										 |  |  | 	x = openrcsclient(opts) | 
					
						
							| 
									
										
										
										
											1995-04-26 22:57:11 +00: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() | 
					
						
							| 
									
										
										
										
											1995-07-18 18:40:41 +00:00
										 |  |  | 	new = not x.isvalid(fn) | 
					
						
							| 
									
										
										
										
											1995-04-26 22:57:11 +00:00
										 |  |  | 	if not new and same(x, copts, fn, data): | 
					
						
							|  |  |  | 		print "%s: unchanged since last checkin" % fn | 
					
						
							|  |  |  | 		return | 
					
						
							| 
									
										
										
										
											1995-04-27 21:28:20 +00:00
										 |  |  | 	print "Checking in", fn, "..." | 
					
						
							| 
									
										
										
										
											1995-04-26 22:57:11 +00: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() | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1995-07-18 18:40:41 +00:00
										 |  |  | def lock(x, copts, fn): | 
					
						
							|  |  |  | 	x.lock(fn) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def unlock(x, copts, fn): | 
					
						
							|  |  |  | 	x.unlock(fn) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1995-04-26 22:57:11 +00:00
										 |  |  | 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): | 
					
						
							| 
									
										
										
										
											1995-07-18 18:40:41 +00:00
										 |  |  | 	if x.isvalid(fn): | 
					
						
							| 
									
										
										
										
											1995-04-26 22:57:11 +00:00
										 |  |  | 		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), | 
					
						
							| 
									
										
										
										
											1995-07-18 18:40:41 +00:00
										 |  |  | 	'lock': ('', lock), | 
					
						
							|  |  |  | 	'unlock': ('', unlock), | 
					
						
							| 
									
										
										
										
											1995-04-26 22:57:11 +00:00
										 |  |  | 	'log': ('bhLRtd:l:r:s:w:V:', log), | 
					
						
							|  |  |  | 	'diff': ('c', diff), | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											1995-04-27 21:28:20 +00:00
										 |  |  | if __name__ == '__main__': | 
					
						
							|  |  |  | 	main() |