accept more invalid dates
when reading sums file, ignore files not in entries
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 @@
 	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 @@
 				sum = self.proxy.sum((file, e.rev))
 				e.setsum(sum)
 	
-	def fullcheck(self):
-		ok = 1
-		for file in self.keys():
+	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.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 @@
 			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 @@
 		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 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 @@
 			print "Unknown command", cmd
 	else:
 		x.report()
-		if sys.argv[1:]: x.writesums()
 
 if __name__ == "__main__":
 	test()