blob: fe8651c488f22bc2670657f479b4596b136092d4 [file] [log] [blame]
Guido van Rossum097c55a1995-04-27 18:07:07 +00001#! /usr/local/bin/python
2
Guido van Rossumc218a7e1995-04-27 23:33:43 +00003"""Remote CVS -- command line interface"""
Guido van Rossum097c55a1995-04-27 18:07:07 +00004
Guido van Rossumc218a7e1995-04-27 23:33:43 +00005from cvslib import CVS, File
Guido van Rossum5f07b841995-04-26 22:57:11 +00006import md5
7import os
8import string
9import sys
Guido van Rossumc218a7e1995-04-27 23:33:43 +000010from cmdfw import CommandFrameWork
Guido van Rossum5f07b841995-04-26 22:57:11 +000011
12
Guido van Rossumc218a7e1995-04-27 23:33:43 +000013class MyFile(File):
Guido van Rossum5f07b841995-04-26 22:57:11 +000014
Guido van Rossumae21ced1995-04-28 14:32:26 +000015 def action(self):
16 """Return a code indicating the update status of this file.
17
18 The possible return values are:
Guido van Rossumc218a7e1995-04-27 23:33:43 +000019
Guido van Rossumae21ced1995-04-28 14:32:26 +000020 '=' -- 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 Rossum5f07b841995-04-26 22:57:11 +000073
74
Guido van Rossumc218a7e1995-04-27 23:33:43 +000075class 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 Rossumae21ced1995-04-28 14:32:26 +000089 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 Rossumc218a7e1995-04-27 23:33:43 +0000101
102
103class 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 Rossumae21ced1995-04-28 14:32:26 +0000127 files = []
128 if self.cvs.checkfiles(files):
129 return 1
Guido van Rossumc218a7e1995-04-27 23:33:43 +0000130 self.cvs.report()
131
132 def do_update(self, opts, files):
Guido van Rossumae21ced1995-04-28 14:32:26 +0000133 """update [file] ..."""
134 if self.cvs.checkfiles(files):
135 return 1
Guido van Rossumc218a7e1995-04-27 23:33:43 +0000136 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 Rossum5f07b841995-04-26 22:57:11 +0000141
Guido van Rossumae21ced1995-04-28 14:32:26 +0000142 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 Rossum5f07b841995-04-26 22:57:11 +0000156
Guido van Rossumdeb627c1995-04-27 21:28:53 +0000157def main():
Guido van Rossumc218a7e1995-04-27 23:33:43 +0000158 rcvs().run()
Guido van Rossum097c55a1995-04-27 18:07:07 +0000159
Guido van Rossum5f07b841995-04-26 22:57:11 +0000160
161if __name__ == "__main__":
Guido van Rossumdeb627c1995-04-27 21:28:53 +0000162 main()