#! /usr/bin/env python "Remote RCS -- command line interface" import sys import os import getopt import string import md5 import tempfile from rcsclient import openrcsclient def main(): 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:] if cmd not in commands: raise getopt.error("unknown command") coptset, func = commands[cmd] copts, files = getopt.getopt(rest, coptset) except getopt.error as 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 = openrcsclient(opts) if not files: files = x.listfiles() for fn in files: try: func(x, copts, fn) except (IOError, os.error) as msg: print("%s: %s" % (fn, msg)) def checkin(x, copts, fn): f = open(fn) data = f.read() f.close() new = not x.isvalid(fn) if not new and same(x, copts, fn, data): print("%s: unchanged since last checkin" % fn) return print("Checking in", fn, "...") 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 lock(x, copts, fn): x.lock(fn) def unlock(x, copts, fn): x.unlock(fn) def info(x, copts, fn): dict = x.info(fn) keys = list(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.isvalid(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) tf = tempfile.NamedTemporaryFile() tf.write(data) tf.flush() print('diff %s -r%s %s' % (flags, x.head(fn), fn)) sts = os.system('diff %s %s %s' % (flags, tf.name, fn)) if sts: print('='*70) 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,", end=' ') else: print("enter log message,", end=' ') 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), 'lock': ('', lock), 'unlock': ('', unlock), 'log': ('bhLRtd:l:r:s:w:V:', log), 'diff': ('c', diff), } if __name__ == '__main__': main()