Initial revision
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()