cpython/Demo/pdist/RCSProxy.py

199 lines
4.6 KiB
Python
Raw Normal View History

#! /usr/bin/env python
1995-04-26 19:57:11 -03:00
"""RCS Proxy.
Provide a simplified interface on RCS files, locally or remotely.
The functionality is geared towards implementing some sort of
remote CVS like utility. It is modeled after the similar module
FSProxy.
1995-06-23 19:07:17 -03:00
The module defines two classes:
1995-04-26 19:57:11 -03:00
RCSProxyLocal -- used for local access
RCSProxyServer -- used on the server side of remote access
1995-06-23 19:07:17 -03:00
1995-06-23 19:37:53 -03:00
The corresponding client class, RCSProxyClient, is defined in module
rcsclient.
1995-04-26 19:57:11 -03:00
The remote classes are instantiated with an IP address and an optional
verbosity flag.
"""
import server
import md5
import os
import fnmatch
import string
import tempfile
1995-06-23 19:07:17 -03:00
import rcslib
class DirSupport:
def __init__(self):
1998-09-14 13:44:15 -03:00
self._dirstack = []
1995-06-23 19:07:17 -03:00
def __del__(self):
1998-09-14 13:44:15 -03:00
self._close()
1995-06-23 19:07:17 -03:00
def _close(self):
1998-09-14 13:44:15 -03:00
while self._dirstack:
self.back()
1995-06-23 19:07:17 -03:00
def pwd(self):
1998-09-14 13:44:15 -03:00
return os.getcwd()
1995-06-23 19:07:17 -03:00
def cd(self, name):
1998-09-14 13:44:15 -03:00
save = os.getcwd()
os.chdir(name)
self._dirstack.append(save)
1995-06-23 19:07:17 -03:00
def back(self):
1998-09-14 13:44:15 -03:00
if not self._dirstack:
raise os.error, "empty directory stack"
dir = self._dirstack[-1]
os.chdir(dir)
del self._dirstack[-1]
1995-06-23 19:07:17 -03:00
def listsubdirs(self, pat = None):
1998-09-14 13:44:15 -03:00
files = os.listdir(os.curdir)
files = filter(os.path.isdir, files)
return self._filter(files, pat)
1995-06-23 19:07:17 -03:00
def isdir(self, name):
1998-09-14 13:44:15 -03:00
return os.path.isdir(name)
1995-06-23 19:07:17 -03:00
def mkdir(self, name):
1998-09-14 13:44:15 -03:00
os.mkdir(name, 0777)
1995-06-23 19:07:17 -03:00
def rmdir(self, name):
1998-09-14 13:44:15 -03:00
os.rmdir(name)
1995-06-23 19:07:17 -03:00
1995-04-26 19:57:11 -03:00
1995-06-23 19:07:17 -03:00
class RCSProxyLocal(rcslib.RCS, DirSupport):
1995-04-26 19:57:11 -03:00
1995-06-23 19:07:17 -03:00
def __init__(self):
1998-09-14 13:44:15 -03:00
rcslib.RCS.__init__(self)
DirSupport.__init__(self)
1995-06-23 19:07:17 -03:00
def __del__(self):
1998-09-14 13:44:15 -03:00
DirSupport.__del__(self)
rcslib.RCS.__del__(self)
1995-06-23 19:07:17 -03:00
def sumlist(self, list = None):
1998-09-14 13:44:15 -03:00
return self._list(self.sum, list)
1995-06-23 19:07:17 -03:00
def sumdict(self, list = None):
1998-09-14 13:44:15 -03:00
return self._dict(self.sum, list)
1995-06-23 19:07:17 -03:00
def sum(self, name_rev):
1998-09-14 13:44:15 -03:00
f = self._open(name_rev)
BUFFERSIZE = 1024*8
sum = md5.new()
while 1:
buffer = f.read(BUFFERSIZE)
if not buffer:
break
sum.update(buffer)
self._closepipe(f)
return sum.digest()
1995-06-23 19:07:17 -03:00
def get(self, name_rev):
1998-09-14 13:44:15 -03:00
f = self._open(name_rev)
data = f.read()
self._closepipe(f)
return data
1995-06-23 19:07:17 -03:00
def put(self, name_rev, data, message=None):
1998-09-14 13:44:15 -03:00
name, rev = self._unmangle(name_rev)
f = open(name, 'w')
f.write(data)
f.close()
self.checkin(name_rev, message)
self._remove(name)
1995-06-23 19:07:17 -03:00
def _list(self, function, list = None):
1998-09-14 13:44:15 -03:00
"""INTERNAL: apply FUNCTION to all files in LIST.
1995-06-23 19:07:17 -03:00
1998-09-14 13:44:15 -03:00
Return a list of the results.
1995-06-23 19:07:17 -03:00
1998-09-14 13:44:15 -03:00
The list defaults to all files in the directory if None.
1995-06-23 19:07:17 -03:00
1998-09-14 13:44:15 -03:00
"""
if list is None:
list = self.listfiles()
res = []
for name in list:
try:
res.append((name, function(name)))
except (os.error, IOError):
res.append((name, None))
return res
1995-06-23 19:07:17 -03:00
def _dict(self, function, list = None):
1998-09-14 13:44:15 -03:00
"""INTERNAL: apply FUNCTION to all files in LIST.
1995-06-23 19:07:17 -03:00
1998-09-14 13:44:15 -03:00
Return a dictionary mapping files to results.
1995-06-23 19:07:17 -03:00
1998-09-14 13:44:15 -03:00
The list defaults to all files in the directory if None.
1995-06-23 19:07:17 -03:00
1998-09-14 13:44:15 -03:00
"""
if list is None:
list = self.listfiles()
dict = {}
for name in list:
try:
dict[name] = function(name)
except (os.error, IOError):
pass
return dict
1995-04-26 19:57:11 -03:00
1995-06-20 23:09:20 -03:00
class RCSProxyServer(RCSProxyLocal, server.SecureServer):
1995-06-23 19:07:17 -03:00
def __init__(self, address, verbose = server.VERBOSE):
1998-09-14 13:44:15 -03:00
RCSProxyLocal.__init__(self)
server.SecureServer.__init__(self, address, verbose)
1995-06-23 19:07:17 -03:00
def _close(self):
1998-09-14 13:44:15 -03:00
server.SecureServer._close(self)
RCSProxyLocal._close(self)
1995-06-23 19:07:17 -03:00
def _serve(self):
1998-09-14 13:44:15 -03:00
server.SecureServer._serve(self)
# Retreat into start directory
while self._dirstack: self.back()
1995-04-26 19:57:11 -03:00
def test_server():
1995-06-23 19:07:17 -03:00
import string
import sys
if sys.argv[1:]:
1998-09-14 13:44:15 -03:00
port = string.atoi(sys.argv[1])
1995-06-23 19:07:17 -03:00
else:
1998-09-14 13:44:15 -03:00
port = 4127
1995-06-23 19:07:17 -03:00
proxy = RCSProxyServer(('', port))
proxy._serverloop()
1995-04-26 19:57:11 -03:00
def test():
1995-06-23 19:07:17 -03:00
import sys
if not sys.argv[1:] or sys.argv[1] and sys.argv[1][0] in '0123456789':
1998-09-14 13:44:15 -03:00
test_server()
sys.exit(0)
1995-06-23 19:07:17 -03:00
proxy = RCSProxyLocal()
what = sys.argv[1]
if hasattr(proxy, what):
1998-09-14 13:44:15 -03:00
attr = getattr(proxy, what)
if callable(attr):
print apply(attr, tuple(sys.argv[2:]))
else:
print `attr`
1995-06-23 19:07:17 -03:00
else:
1998-09-14 13:44:15 -03:00
print "%s: no such attribute" % what
sys.exit(2)
1995-04-26 19:57:11 -03:00
if __name__ == '__main__':
1995-06-23 19:07:17 -03:00
test()