| #! /usr/local/bin/python |
| |
| """Remote CVS -- command line interface""" |
| |
| from cvslib import CVS, File |
| import md5 |
| import os |
| import string |
| import sys |
| from cmdfw import CommandFrameWork |
| |
| |
| class MyFile(File): |
| |
| def action(self): |
| """Return a code indicating the update status of this file. |
| |
| The possible return values are: |
| |
| '=' -- everything's fine |
| '0' -- file doesn't exist anywhere |
| '?' -- exists locally only |
| 'A' -- new locally |
| 'R' -- deleted locally |
| 'U' -- changed remotely, no changes locally |
| 'M' -- changed locally, no changes remotely |
| 'C' -- conflict: changed locally as well as remotely |
| (includes cases where the file has been added |
| or removed locally and remotely) |
| """ |
| if not self.eseen: |
| pass |
| return '?' |
| |
| def update(self): |
| code = self.action() |
| print code, self.file |
| if code == 'U': |
| self.get() |
| elif code == 'C': |
| print "%s: conflict resolution not yet implemented" % \ |
| self.file |
| |
| def commit(self, message = ""): |
| code = self.action() |
| if code in ('A', 'M'): |
| self.put(message) |
| elif code == 'R': |
| print "%s: committing removes not yet implemented" % \ |
| self.file |
| elif code == 'C': |
| print "%s: conflict resolution not yet implemented" % \ |
| self.file |
| |
| def commitcheck(self): |
| return self.action() != 'C' |
| |
| def put(self, message = ""): |
| print "%s: put not yet implemented" % self.file |
| |
| def get(self): |
| data = self.proxy.get(self.file) |
| f = open(self.file, 'w') |
| f.write(data) |
| f.close() |
| self.eseen = 1 |
| self.esum = self.rsum |
| self.emtime, self.ectime = os.stat(self.file)[-2:] |
| self.erev = self.rrev |
| self.enew = 0 |
| self.edeleted = 0 |
| # XXX anything else? |
| |
| |
| class RCVS(CVS): |
| |
| FileClass = MyFile |
| |
| def __init__(self): |
| CVS.__init__(self) |
| |
| def checkfiles(self, files): |
| if not files: |
| def ok(file, self=self): |
| e = self.entries[file] |
| return e.eseen or e.rseen |
| files[:] = filter(ok, self.entries.keys()) |
| files.sort() |
| if not files: |
| print "no files to be processed" |
| return 1 |
| else: |
| return None |
| else: |
| sts = None |
| for file in files: |
| if not self.entries.has_key(file): |
| print "%s: nothing known" % file |
| sts = 1 |
| return sts |
| |
| |
| class rcvs(CommandFrameWork): |
| |
| GlobalFlags = 'd:h:p:qv' |
| UsageMessage = \ |
| "usage: rcvs [-d directory] [-h host] [-p port] [-q] [-v] subcommand arg ..." |
| |
| def __init__(self): |
| """Constructor.""" |
| CommandFrameWork.__init__(self) |
| self.proxy = None |
| self.cvs = RCVS() |
| |
| def options(self, opts): |
| self.opts = opts |
| |
| def ready(self): |
| import rcsclient |
| self.proxy = rcsclient.openrcsclient(self.opts) |
| self.cvs.setproxy(self.proxy) |
| self.cvs.getentries() |
| self.cvs.getlocalfiles() |
| self.cvs.getremotefiles(self.proxy) |
| |
| def default(self): |
| files = [] |
| if self.cvs.checkfiles(files): |
| return 1 |
| self.cvs.report() |
| |
| def do_update(self, opts, files): |
| """update [file] ...""" |
| if self.cvs.checkfiles(files): |
| return 1 |
| for file in files: |
| if not self.cvs.entries.has_key(file): |
| print "%s: not found" % file |
| else: |
| self.cvs.entries[file].update() |
| |
| def do_commit(self, opts, files): |
| """commit [file] ...""" |
| if self.cvs.checkfiles(files): |
| return 1 |
| sts = 0 |
| for file in files: |
| if not self.entries[file].commitcheck(): |
| sts = 1 |
| if sts: |
| return sts |
| message = raw_input("One-liner: ") |
| for file in files: |
| self.entries[file].commit(message) |
| |
| |
| def main(): |
| rcvs().run() |
| |
| |
| if __name__ == "__main__": |
| main() |