1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 | Demo/pdist/rrcs.py
#! /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 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) x = openrcsclient(opts) 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() 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 = 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,", 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), 'lock': ('', lock), 'unlock': ('', unlock), 'log': ('bhLRtd:l:r:s:w:V:', log), 'diff': ('c', diff), } if __name__ == '__main__': main() |