mirror of https://github.com/python/cpython.git
193 lines
3.9 KiB
Python
193 lines
3.9 KiB
Python
|
from cvslib import CVS, Entry
|
||
|
import RCSProxy
|
||
|
import client
|
||
|
import md5
|
||
|
import os
|
||
|
import string
|
||
|
import sys
|
||
|
import time
|
||
|
import fnmatch
|
||
|
|
||
|
|
||
|
ignored_patterns = ['*.pyc', '.*', '*~', '@*']
|
||
|
def ignored(file):
|
||
|
if os.path.isdir(file): return 1
|
||
|
for pat in ignored_patterns:
|
||
|
if fnmatch.fnmatch(file, pat): return 1
|
||
|
return 0
|
||
|
|
||
|
|
||
|
class PCVS(CVS):
|
||
|
|
||
|
def __init__(self, proxy):
|
||
|
CVS.__init__(self)
|
||
|
self.proxy = proxy
|
||
|
self.readsums()
|
||
|
self.calcsums()
|
||
|
|
||
|
def calcsums(self):
|
||
|
for file in self.keys():
|
||
|
e = self.entries[file]
|
||
|
if not e.new and e.sum is None:
|
||
|
sum = self.proxy.sum((file, e.rev))
|
||
|
e.setsum(sum)
|
||
|
|
||
|
def fullcheck(self):
|
||
|
ok = 1
|
||
|
for file in self.keys():
|
||
|
e = self.entries[file]
|
||
|
if e.new:
|
||
|
if self.proxy.isfile(file):
|
||
|
print "%s: created by someone else!"
|
||
|
ok = 0
|
||
|
continue
|
||
|
rrev = self.proxy.head(file)
|
||
|
if rrev != e.rev:
|
||
|
print "%s: out of date (%s vs. %s)" % \
|
||
|
(file, e.rev, rrev)
|
||
|
ok = 0
|
||
|
return ok
|
||
|
|
||
|
def update(self):
|
||
|
for file in self.keys():
|
||
|
e = self.entries[file]
|
||
|
if e.new:
|
||
|
print 'A', file
|
||
|
continue
|
||
|
rrev = self.proxy.head(file)
|
||
|
lsum = sumfile(file)
|
||
|
if rrev == e.rev:
|
||
|
if lsum == e.sum:
|
||
|
print '=', file
|
||
|
else:
|
||
|
print 'M', file
|
||
|
continue
|
||
|
if e.sum != lsum:
|
||
|
print "%s: conflict -- not updated" % file
|
||
|
continue
|
||
|
print "%s: getting ..." % file
|
||
|
data = self.proxy.get(file)
|
||
|
f = open(file, 'w')
|
||
|
f.write(data)
|
||
|
f.close()
|
||
|
nsum = md5.new(data).digest()
|
||
|
e.setsum(nsum)
|
||
|
e.rev = rrev
|
||
|
print 'U', file
|
||
|
self.writeentries()
|
||
|
self.writesums()
|
||
|
|
||
|
def commit(self):
|
||
|
if not self.fullcheck():
|
||
|
print "correct above errors first"
|
||
|
return
|
||
|
needed = []
|
||
|
for file in self.keys():
|
||
|
e = self.entries[file]
|
||
|
if e.new:
|
||
|
needed.append(file)
|
||
|
continue
|
||
|
lsum = sumfile(file)
|
||
|
if lsum != e.sum:
|
||
|
needed.append(file)
|
||
|
continue
|
||
|
if not needed:
|
||
|
print "no changes need committing"
|
||
|
return
|
||
|
message = raw_input("One-liner: ")
|
||
|
for file in needed:
|
||
|
print "%s: putting ..." % file
|
||
|
e = self.entries[file]
|
||
|
data = open(file).read()
|
||
|
self.proxy.put(file, data, message)
|
||
|
e.rev = self.proxy.head(file)
|
||
|
e.setsum(self.proxy.sum(file))
|
||
|
# XXX get it?
|
||
|
mtime, ctime = os.stat(file)[-2:]
|
||
|
e.mtime = mtime
|
||
|
e.ctime = ctime
|
||
|
self.writeentries()
|
||
|
self.writesums()
|
||
|
|
||
|
def report(self):
|
||
|
keys = self.keys()
|
||
|
files = os.listdir(os.curdir)
|
||
|
allfiles = files
|
||
|
for file in keys:
|
||
|
if file not in allfiles:
|
||
|
allfiles.append(file)
|
||
|
allfiles.sort()
|
||
|
for file in allfiles:
|
||
|
if file not in keys:
|
||
|
if not ignored(file):
|
||
|
print '?', file
|
||
|
continue
|
||
|
if file not in files:
|
||
|
print file, ': lost'
|
||
|
continue
|
||
|
e = self.entries[file]
|
||
|
if not os.path.exists(file):
|
||
|
print "%s: lost" % file
|
||
|
continue
|
||
|
if e.new:
|
||
|
print 'A', file
|
||
|
continue
|
||
|
lsum = sumfile(file)
|
||
|
rrev = self.proxy.head(file)
|
||
|
if rrev == e.rev:
|
||
|
if lsum == e.sum:
|
||
|
print '=', file
|
||
|
else:
|
||
|
print 'M', file
|
||
|
else:
|
||
|
if lsum == e.sum:
|
||
|
print 'U', file
|
||
|
else:
|
||
|
print 'C', file
|
||
|
|
||
|
def add(self, file):
|
||
|
if self.entries.has_key(file):
|
||
|
print "%s: already known"
|
||
|
else:
|
||
|
self.entries[file] = Entry('/%s/0/Initial %s//\n' %
|
||
|
(file, file))
|
||
|
|
||
|
|
||
|
def sumfile(file):
|
||
|
return md5.new(open(file).read()).digest()
|
||
|
|
||
|
|
||
|
def test():
|
||
|
proxy = RCSProxy.RCSProxyClient(('voorn.cwi.nl', 4127))
|
||
|
proxy.cd('/ufs/guido/voorn/python-RCS/Demo/pdist')
|
||
|
x = PCVS(proxy)
|
||
|
args = sys.argv[1:]
|
||
|
if args:
|
||
|
cmd = args[0]
|
||
|
files = args[1:]
|
||
|
if cmd == 'add':
|
||
|
if not files:
|
||
|
print "add needs at least one file argument"
|
||
|
else:
|
||
|
for file in files:
|
||
|
x.add(file)
|
||
|
x.writeentries()
|
||
|
elif cmd in ('update', 'up'):
|
||
|
if files:
|
||
|
print "updates wants no file arguments"
|
||
|
else:
|
||
|
x.update()
|
||
|
elif cmd in ('commit', 'com'):
|
||
|
if files:
|
||
|
print "commit wants no file arguments"
|
||
|
else:
|
||
|
x.commit()
|
||
|
else:
|
||
|
print "Unknown command", cmd
|
||
|
else:
|
||
|
x.report()
|
||
|
if sys.argv[1:]: x.writesums()
|
||
|
|
||
|
if __name__ == "__main__":
|
||
|
test()
|