summaryrefslogtreecommitdiffstats
path: root/Demo/pdist/rcvs.py
diff options
context:
space:
mode:
authorGuido van Rossum <guido@python.org>1995-04-26 22:57:11 (GMT)
committerGuido van Rossum <guido@python.org>1995-04-26 22:57:11 (GMT)
commit5f07b84796c207a0068f6ac5a0d6981d14801ff6 (patch)
treed82516c437ec3872d6fd344bd6556407bfd940e1 /Demo/pdist/rcvs.py
parent107c747009b3717840f4d5fae8f0d5987ae27f89 (diff)
downloadcpython-5f07b84796c207a0068f6ac5a0d6981d14801ff6.zip
cpython-5f07b84796c207a0068f6ac5a0d6981d14801ff6.tar.gz
cpython-5f07b84796c207a0068f6ac5a0d6981d14801ff6.tar.bz2
Initial revision
Diffstat (limited to 'Demo/pdist/rcvs.py')
-rwxr-xr-xDemo/pdist/rcvs.py192
1 files changed, 192 insertions, 0 deletions
diff --git a/Demo/pdist/rcvs.py b/Demo/pdist/rcvs.py
new file mode 100755
index 0000000..eb43bb8
--- /dev/null
+++ b/Demo/pdist/rcvs.py
@@ -0,0 +1,192 @@
+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()