cpython/Demo/pdist/rcvs.py

163 lines
3.4 KiB
Python
Executable File

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