| #! /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() |