Guido van Rossum | 097c55a | 1995-04-27 18:07:07 +0000 | [diff] [blame] | 1 | #! /usr/local/bin/python |
| 2 | |
Guido van Rossum | c218a7e | 1995-04-27 23:33:43 +0000 | [diff] [blame] | 3 | """Remote CVS -- command line interface""" |
Guido van Rossum | 097c55a | 1995-04-27 18:07:07 +0000 | [diff] [blame] | 4 | |
Guido van Rossum | c218a7e | 1995-04-27 23:33:43 +0000 | [diff] [blame] | 5 | from cvslib import CVS, File |
Guido van Rossum | 5f07b84 | 1995-04-26 22:57:11 +0000 | [diff] [blame] | 6 | import md5 |
| 7 | import os |
| 8 | import string |
| 9 | import sys |
Guido van Rossum | c218a7e | 1995-04-27 23:33:43 +0000 | [diff] [blame] | 10 | from cmdfw import CommandFrameWork |
Guido van Rossum | 5f07b84 | 1995-04-26 22:57:11 +0000 | [diff] [blame] | 11 | |
| 12 | |
Guido van Rossum | c218a7e | 1995-04-27 23:33:43 +0000 | [diff] [blame] | 13 | class MyFile(File): |
Guido van Rossum | 5f07b84 | 1995-04-26 22:57:11 +0000 | [diff] [blame] | 14 | |
Guido van Rossum | ae21ced | 1995-04-28 14:32:26 +0000 | [diff] [blame^] | 15 | def action(self): |
| 16 | """Return a code indicating the update status of this file. |
| 17 | |
| 18 | The possible return values are: |
Guido van Rossum | c218a7e | 1995-04-27 23:33:43 +0000 | [diff] [blame] | 19 | |
Guido van Rossum | ae21ced | 1995-04-28 14:32:26 +0000 | [diff] [blame^] | 20 | '=' -- everything's fine |
| 21 | '0' -- file doesn't exist anywhere |
| 22 | '?' -- exists locally only |
| 23 | 'A' -- new locally |
| 24 | 'R' -- deleted locally |
| 25 | 'U' -- changed remotely, no changes locally |
| 26 | 'M' -- changed locally, no changes remotely |
| 27 | 'C' -- conflict: changed locally as well as remotely |
| 28 | (includes cases where the file has been added |
| 29 | or removed locally and remotely) |
| 30 | """ |
| 31 | if not self.eseen: |
| 32 | pass |
| 33 | return '?' |
| 34 | |
| 35 | def update(self): |
| 36 | code = self.action() |
| 37 | print code, self.file |
| 38 | if code == 'U': |
| 39 | self.get() |
| 40 | elif code == 'C': |
| 41 | print "%s: conflict resolution not yet implemented" % \ |
| 42 | self.file |
| 43 | |
| 44 | def commit(self, message = ""): |
| 45 | code = self.action() |
| 46 | if code in ('A', 'M'): |
| 47 | self.put(message) |
| 48 | elif code == 'R': |
| 49 | print "%s: committing removes not yet implemented" % \ |
| 50 | self.file |
| 51 | elif code == 'C': |
| 52 | print "%s: conflict resolution not yet implemented" % \ |
| 53 | self.file |
| 54 | |
| 55 | def commitcheck(self): |
| 56 | return self.action() != 'C' |
| 57 | |
| 58 | def put(self, message = ""): |
| 59 | print "%s: put not yet implemented" % self.file |
| 60 | |
| 61 | def get(self): |
| 62 | data = self.proxy.get(self.file) |
| 63 | f = open(self.file, 'w') |
| 64 | f.write(data) |
| 65 | f.close() |
| 66 | self.eseen = 1 |
| 67 | self.esum = self.rsum |
| 68 | self.emtime, self.ectime = os.stat(self.file)[-2:] |
| 69 | self.erev = self.rrev |
| 70 | self.enew = 0 |
| 71 | self.edeleted = 0 |
| 72 | # XXX anything else? |
Guido van Rossum | 5f07b84 | 1995-04-26 22:57:11 +0000 | [diff] [blame] | 73 | |
| 74 | |
Guido van Rossum | c218a7e | 1995-04-27 23:33:43 +0000 | [diff] [blame] | 75 | class RCVS(CVS): |
| 76 | |
| 77 | FileClass = MyFile |
| 78 | |
| 79 | def __init__(self): |
| 80 | CVS.__init__(self) |
| 81 | |
| 82 | def checkfiles(self, files): |
| 83 | if not files: |
| 84 | def ok(file, self=self): |
| 85 | e = self.entries[file] |
| 86 | return e.eseen or e.rseen |
| 87 | files[:] = filter(ok, self.entries.keys()) |
| 88 | files.sort() |
Guido van Rossum | ae21ced | 1995-04-28 14:32:26 +0000 | [diff] [blame^] | 89 | if not files: |
| 90 | print "no files to be processed" |
| 91 | return 1 |
| 92 | else: |
| 93 | return None |
| 94 | else: |
| 95 | sts = None |
| 96 | for file in files: |
| 97 | if not self.entries.has_key(file): |
| 98 | print "%s: nothing known" % file |
| 99 | sts = 1 |
| 100 | return sts |
Guido van Rossum | c218a7e | 1995-04-27 23:33:43 +0000 | [diff] [blame] | 101 | |
| 102 | |
| 103 | class rcvs(CommandFrameWork): |
| 104 | |
| 105 | GlobalFlags = 'd:h:p:qv' |
| 106 | UsageMessage = \ |
| 107 | "usage: rcvs [-d directory] [-h host] [-p port] [-q] [-v] subcommand arg ..." |
| 108 | |
| 109 | def __init__(self): |
| 110 | """Constructor.""" |
| 111 | CommandFrameWork.__init__(self) |
| 112 | self.proxy = None |
| 113 | self.cvs = RCVS() |
| 114 | |
| 115 | def options(self, opts): |
| 116 | self.opts = opts |
| 117 | |
| 118 | def ready(self): |
| 119 | import rcsclient |
| 120 | self.proxy = rcsclient.openrcsclient(self.opts) |
| 121 | self.cvs.setproxy(self.proxy) |
| 122 | self.cvs.getentries() |
| 123 | self.cvs.getlocalfiles() |
| 124 | self.cvs.getremotefiles(self.proxy) |
| 125 | |
| 126 | def default(self): |
Guido van Rossum | ae21ced | 1995-04-28 14:32:26 +0000 | [diff] [blame^] | 127 | files = [] |
| 128 | if self.cvs.checkfiles(files): |
| 129 | return 1 |
Guido van Rossum | c218a7e | 1995-04-27 23:33:43 +0000 | [diff] [blame] | 130 | self.cvs.report() |
| 131 | |
| 132 | def do_update(self, opts, files): |
Guido van Rossum | ae21ced | 1995-04-28 14:32:26 +0000 | [diff] [blame^] | 133 | """update [file] ...""" |
| 134 | if self.cvs.checkfiles(files): |
| 135 | return 1 |
Guido van Rossum | c218a7e | 1995-04-27 23:33:43 +0000 | [diff] [blame] | 136 | for file in files: |
| 137 | if not self.cvs.entries.has_key(file): |
| 138 | print "%s: not found" % file |
| 139 | else: |
| 140 | self.cvs.entries[file].update() |
Guido van Rossum | 5f07b84 | 1995-04-26 22:57:11 +0000 | [diff] [blame] | 141 | |
Guido van Rossum | ae21ced | 1995-04-28 14:32:26 +0000 | [diff] [blame^] | 142 | def do_commit(self, opts, files): |
| 143 | """commit [file] ...""" |
| 144 | if self.cvs.checkfiles(files): |
| 145 | return 1 |
| 146 | sts = 0 |
| 147 | for file in files: |
| 148 | if not self.entries[file].commitcheck(): |
| 149 | sts = 1 |
| 150 | if sts: |
| 151 | return sts |
| 152 | message = raw_input("One-liner: ") |
| 153 | for file in files: |
| 154 | self.entries[file].commit(message) |
| 155 | |
Guido van Rossum | 5f07b84 | 1995-04-26 22:57:11 +0000 | [diff] [blame] | 156 | |
Guido van Rossum | deb627c | 1995-04-27 21:28:53 +0000 | [diff] [blame] | 157 | def main(): |
Guido van Rossum | c218a7e | 1995-04-27 23:33:43 +0000 | [diff] [blame] | 158 | rcvs().run() |
Guido van Rossum | 097c55a | 1995-04-27 18:07:07 +0000 | [diff] [blame] | 159 | |
Guido van Rossum | 5f07b84 | 1995-04-26 22:57:11 +0000 | [diff] [blame] | 160 | |
| 161 | if __name__ == "__main__": |
Guido van Rossum | deb627c | 1995-04-27 21:28:53 +0000 | [diff] [blame] | 162 | main() |