]> git.proxmox.com Git - mirror_edk2.git/blame - AppPkg/Applications/Python/Python-2.7.2/Demo/pdist/RCSProxy.py
EmbeddedPkg: Extend NvVarStoreFormattedLib LIBRARY_CLASS
[mirror_edk2.git] / AppPkg / Applications / Python / Python-2.7.2 / Demo / pdist / RCSProxy.py
CommitLineData
4710c53d 1#! /usr/bin/env python\r
2\r
3"""RCS Proxy.\r
4\r
5Provide a simplified interface on RCS files, locally or remotely.\r
6The functionality is geared towards implementing some sort of\r
7remote CVS like utility. It is modeled after the similar module\r
8FSProxy.\r
9\r
10The module defines two classes:\r
11\r
12RCSProxyLocal -- used for local access\r
13RCSProxyServer -- used on the server side of remote access\r
14\r
15The corresponding client class, RCSProxyClient, is defined in module\r
16rcsclient.\r
17\r
18The remote classes are instantiated with an IP address and an optional\r
19verbosity flag.\r
20"""\r
21\r
22import server\r
23import md5\r
24import os\r
25import fnmatch\r
26import string\r
27import tempfile\r
28import rcslib\r
29\r
30\r
31class DirSupport:\r
32\r
33 def __init__(self):\r
34 self._dirstack = []\r
35\r
36 def __del__(self):\r
37 self._close()\r
38\r
39 def _close(self):\r
40 while self._dirstack:\r
41 self.back()\r
42\r
43 def pwd(self):\r
44 return os.getcwd()\r
45\r
46 def cd(self, name):\r
47 save = os.getcwd()\r
48 os.chdir(name)\r
49 self._dirstack.append(save)\r
50\r
51 def back(self):\r
52 if not self._dirstack:\r
53 raise os.error, "empty directory stack"\r
54 dir = self._dirstack[-1]\r
55 os.chdir(dir)\r
56 del self._dirstack[-1]\r
57\r
58 def listsubdirs(self, pat = None):\r
59 files = os.listdir(os.curdir)\r
60 files = filter(os.path.isdir, files)\r
61 return self._filter(files, pat)\r
62\r
63 def isdir(self, name):\r
64 return os.path.isdir(name)\r
65\r
66 def mkdir(self, name):\r
67 os.mkdir(name, 0777)\r
68\r
69 def rmdir(self, name):\r
70 os.rmdir(name)\r
71\r
72\r
73class RCSProxyLocal(rcslib.RCS, DirSupport):\r
74\r
75 def __init__(self):\r
76 rcslib.RCS.__init__(self)\r
77 DirSupport.__init__(self)\r
78\r
79 def __del__(self):\r
80 DirSupport.__del__(self)\r
81 rcslib.RCS.__del__(self)\r
82\r
83 def sumlist(self, list = None):\r
84 return self._list(self.sum, list)\r
85\r
86 def sumdict(self, list = None):\r
87 return self._dict(self.sum, list)\r
88\r
89 def sum(self, name_rev):\r
90 f = self._open(name_rev)\r
91 BUFFERSIZE = 1024*8\r
92 sum = md5.new()\r
93 while 1:\r
94 buffer = f.read(BUFFERSIZE)\r
95 if not buffer:\r
96 break\r
97 sum.update(buffer)\r
98 self._closepipe(f)\r
99 return sum.digest()\r
100\r
101 def get(self, name_rev):\r
102 f = self._open(name_rev)\r
103 data = f.read()\r
104 self._closepipe(f)\r
105 return data\r
106\r
107 def put(self, name_rev, data, message=None):\r
108 name, rev = self._unmangle(name_rev)\r
109 f = open(name, 'w')\r
110 f.write(data)\r
111 f.close()\r
112 self.checkin(name_rev, message)\r
113 self._remove(name)\r
114\r
115 def _list(self, function, list = None):\r
116 """INTERNAL: apply FUNCTION to all files in LIST.\r
117\r
118 Return a list of the results.\r
119\r
120 The list defaults to all files in the directory if None.\r
121\r
122 """\r
123 if list is None:\r
124 list = self.listfiles()\r
125 res = []\r
126 for name in list:\r
127 try:\r
128 res.append((name, function(name)))\r
129 except (os.error, IOError):\r
130 res.append((name, None))\r
131 return res\r
132\r
133 def _dict(self, function, list = None):\r
134 """INTERNAL: apply FUNCTION to all files in LIST.\r
135\r
136 Return a dictionary mapping files to results.\r
137\r
138 The list defaults to all files in the directory if None.\r
139\r
140 """\r
141 if list is None:\r
142 list = self.listfiles()\r
143 dict = {}\r
144 for name in list:\r
145 try:\r
146 dict[name] = function(name)\r
147 except (os.error, IOError):\r
148 pass\r
149 return dict\r
150\r
151\r
152class RCSProxyServer(RCSProxyLocal, server.SecureServer):\r
153\r
154 def __init__(self, address, verbose = server.VERBOSE):\r
155 RCSProxyLocal.__init__(self)\r
156 server.SecureServer.__init__(self, address, verbose)\r
157\r
158 def _close(self):\r
159 server.SecureServer._close(self)\r
160 RCSProxyLocal._close(self)\r
161\r
162 def _serve(self):\r
163 server.SecureServer._serve(self)\r
164 # Retreat into start directory\r
165 while self._dirstack: self.back()\r
166\r
167\r
168def test_server():\r
169 import string\r
170 import sys\r
171 if sys.argv[1:]:\r
172 port = string.atoi(sys.argv[1])\r
173 else:\r
174 port = 4127\r
175 proxy = RCSProxyServer(('', port))\r
176 proxy._serverloop()\r
177\r
178\r
179def test():\r
180 import sys\r
181 if not sys.argv[1:] or sys.argv[1] and sys.argv[1][0] in '0123456789':\r
182 test_server()\r
183 sys.exit(0)\r
184 proxy = RCSProxyLocal()\r
185 what = sys.argv[1]\r
186 if hasattr(proxy, what):\r
187 attr = getattr(proxy, what)\r
188 if callable(attr):\r
189 print apply(attr, tuple(sys.argv[2:]))\r
190 else:\r
191 print repr(attr)\r
192 else:\r
193 print "%s: no such attribute" % what\r
194 sys.exit(2)\r
195\r
196\r
197if __name__ == '__main__':\r
198 test()\r