From 097c55ad75c82e8572591fa99ac3bab756ab33c3 Mon Sep 17 00:00:00 2001 From: Guido van Rossum Date: Thu, 27 Apr 1995 18:07:07 +0000 Subject: accept more invalid dates when reading sums file, ignore files not in entries --- Demo/pdist/rcvs.py | 224 ++++++++++++++++++++++++++++++++++++----------------- 1 file changed, 153 insertions(+), 71 deletions(-) diff --git a/Demo/pdist/rcvs.py b/Demo/pdist/rcvs.py index eb43bb8..1c323e2 100755 --- a/Demo/pdist/rcvs.py +++ b/Demo/pdist/rcvs.py @@ -1,6 +1,8 @@ +#! /usr/local/bin/python + +"Remote CVS -- command line interface" + from cvslib import CVS, Entry -import RCSProxy -import client import md5 import os import string @@ -15,6 +17,8 @@ def ignored(file): for pat in ignored_patterns: if fnmatch.fnmatch(file, pat): return 1 return 0 +def not_ignored(file): + return not ignored(file) class PCVS(CVS): @@ -32,51 +36,161 @@ class PCVS(CVS): sum = self.proxy.sum((file, e.rev)) e.setsum(sum) + def prepare(self): + self.localfiles = filter(not_ignored, os.listdir(os.curdir)) + self.localfiles.sort() + + self.entryfiles = self.keys() + + self.remotefiles = self.proxy.listfiles() + + self.rcsfiles = self.entryfiles[:] + for file in self.remotefiles: + if file not in self.rcsfiles: + self.rcsfiles.append(file) + self.rcsfiles.sort() + + self.localonlyfiles = [] + for file in self.localfiles: + if file not in self.rcsfiles: + self.localonlyfiles.append(file) + self.localonlyfiles.sort() + + self.allfiles = self.rcsfiles + self.localonlyfiles + self.allfiles.sort() + + def preparedetails(self, file): + entry = file in self.entryfiles + if entry: + e = self.entries[file] + else: + e = Entry('/%s/0///' % file) + e.entry = entry + e.local = file in self.localfiles + e.remote = file in self.remotefiles + if e.local: + e.lsum = sumfile(file) + else: + e.lsum = None + if e.remote: + e.rrev = self.proxy.head(file) + if e.rrev == e.rev: + e.rsum = e.sum + else: + e.rsum = self.proxy.sum(file) + else: + e.rrev = '0' + e.rsum = None + return e + + def report(self): + self.prepare() + for file in self.allfiles: + e = self.preparedetails(file) + if e.lsum == e.sum == e.rsum: + # All three exist and are equal + print '=', file + elif e.lsum == e.sum: + # Not modified locally, remote update pending + if e.lsum is None: + print 'N', file, '(new remote)' + else: + print 'U', file + elif e.sum == e.rsum: + # No remote update, modified locally + if e.rsum is None: + if e.new: + print 'A', file + else: + print '?', file + else: + if e.lsum is None: + print 'LOST', file + else: + print 'M', file + else: + # Conflict: remote update and locally modified + if e.lsum == e.rsum: + # Local and remote match! + print 'c', file + else: + print 'C', file + def fullcheck(self): + self.prepare() ok = 1 - for file in self.keys(): - e = self.entries[file] + for file in self.allfiles: + if file not in self.entryfiles \ + and file not in self.remotefiles: + continue + e = self.preparedetails(file) if e.new: - if self.proxy.isfile(file): - print "%s: created by someone else!" + if e.rrev: + print "%s: created by someone else"%file ok = 0 continue - rrev = self.proxy.head(file) - if rrev != e.rev: + if e.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 + self.prepare() + for file in self.rcsfiles: + e = self.preparedetails(file) + if e.lsum == e.sum == e.rsum: + print '=', file continue - rrev = self.proxy.head(file) - lsum = sumfile(file) - if rrev == e.rev: - if lsum == e.sum: - print '=', file - else: - print 'M', file + if e.sum == e.rsum: + if e.rev != e.rrev: + print '%s: %s -> %s w/o change' % \ + (file, e.rev, e.rrev) + e.rev = e.rrev + if e.lsum != e.sum: + if e.lsum is None: + print '%s: file was lost' % \ + (file,) + self.get(e) + elif e.new: + print 'A', file + else: + print 'M', file continue - if e.sum != lsum: - print "%s: conflict -- not updated" % file + if e.lsum == e.sum: + if e.rev == e.rrev: + print '%s: no new revision' % file + print 'U', file, + sys.stdout.flush() + self.get(e) + print 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 + if e.lsum == e.rsum: + print 'c', file + print e.__dict__ + e.rev = e.rrev + e.sum = e.rsum + e.new = e.sum is None and e.lsum is not None + if e.sum: + e.mtime, e.ctime = os.stat(e.file)[-2:] + print e.__dict__ + self.entries[file] = e + continue + print 'C', file, '(not resolved)' self.writeentries() self.writesums() + def get(self, e): + data = self.proxy.get(e.file) + f = open(e.file, 'w') + f.write(data) + f.close() + nsum = md5.new(data).digest() + e.setsum(nsum) + e.mtime, e.ctime = os.stat(e.file)[-2:] + e.new = 0 + e.rev = e.rrev + def commit(self): if not self.fullcheck(): print "correct above errors first" @@ -102,6 +216,7 @@ class PCVS(CVS): self.proxy.put(file, data, message) e.rev = self.proxy.head(file) e.setsum(self.proxy.sum(file)) + e.new = 0 # XXX get it? mtime, ctime = os.stat(file)[-2:] e.mtime = mtime @@ -109,45 +224,9 @@ class PCVS(CVS): 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" + print "%s: already known" % file else: self.entries[file] = Entry('/%s/0/Initial %s//\n' % (file, file)) @@ -158,10 +237,14 @@ def sumfile(file): def test(): - proxy = RCSProxy.RCSProxyClient(('voorn.cwi.nl', 4127)) - proxy.cd('/ufs/guido/voorn/python-RCS/Demo/pdist') + import sys + import getopt + from rcsclient import openrcsclient + + opts, args = getopt.getopt(sys.argv[1:], 'd:h:p:vq') + proxy = openrcsclient(opts) x = PCVS(proxy) - args = sys.argv[1:] + if args: cmd = args[0] files = args[1:] @@ -186,7 +269,6 @@ def test(): print "Unknown command", cmd else: x.report() - if sys.argv[1:]: x.writesums() if __name__ == "__main__": test() -- cgit v0.12