1 | 1 patch for repository davidsarah@tahoe-lafs.org:/home/source/darcs/tahoe-lafs/ticket798: |
---|
2 | |
---|
3 | Mon Aug 2 05:30:04 GMT Daylight Time 2010 david-sarah@jacaranda.org |
---|
4 | * Basedir/node directory option improvements for ticket798 branch. addresses #188, #706, #715, #772, #890 |
---|
5 | |
---|
6 | New patches: |
---|
7 | |
---|
8 | [Basedir/node directory option improvements for ticket798 branch. addresses #188, #706, #715, #772, #890 |
---|
9 | david-sarah@jacaranda.org**20100802043004 |
---|
10 | Ignore-this: d19fc24349afa19833406518595bfdf7 |
---|
11 | ] { |
---|
12 | hunk ./src/allmydata/scripts/cli.py 3 |
---|
13 | import os.path, re, sys, fnmatch |
---|
14 | from twisted.python import usage |
---|
15 | -from allmydata.scripts.common import BaseOptions, get_aliases |
---|
16 | -from allmydata.util.encodingutil import argv_to_unicode, argv_to_abspath |
---|
17 | +from allmydata.scripts.common import BaseOptions, get_aliases, get_default_nodedir, DEFAULT_ALIAS |
---|
18 | +from allmydata.util.encodingutil import argv_to_unicode, argv_to_abspath, quote_output |
---|
19 | |
---|
20 | NODEURL_RE=re.compile("http(s?)://([^:]*)(:([1-9][0-9]*))?") |
---|
21 | |
---|
22 | hunk ./src/allmydata/scripts/cli.py 8 |
---|
23 | -class VDriveOptions(BaseOptions, usage.Options): |
---|
24 | +_default_nodedir = get_default_nodedir() |
---|
25 | + |
---|
26 | +class VDriveOptions(BaseOptions): |
---|
27 | optParameters = [ |
---|
28 | hunk ./src/allmydata/scripts/cli.py 12 |
---|
29 | - ["node-directory", "d", "~/.tahoe", |
---|
30 | - "Look here to find out which Tahoe node should be used for all " |
---|
31 | - "operations. The directory should either contain a full Tahoe node, " |
---|
32 | - "or a file named node.url which points to some other Tahoe node. " |
---|
33 | - "It should also contain a file named private/aliases which contains " |
---|
34 | - "the mapping from alias name to root dirnode URI." |
---|
35 | - ], |
---|
36 | + ["node-directory", "d", None, |
---|
37 | + "Specify which Tahoe node directory should be used. The directory " |
---|
38 | + "should either contain a full Tahoe node, or a file named node.url " |
---|
39 | + "that points to some other Tahoe node. It should also contain a file " |
---|
40 | + "named private/aliases which contains the mapping from alias name " |
---|
41 | + "to root dirnode URI." + ( |
---|
42 | + _default_nodedir and (" [default for most commands: " + quote_output(_default_nodedir) + "]") or "")], |
---|
43 | ["node-url", "u", None, |
---|
44 | "URL of the tahoe node to use, a URL like \"http://127.0.0.1:3456\". " |
---|
45 | "This overrides the URL found in the --node-directory ."], |
---|
46 | hunk ./src/allmydata/scripts/cli.py 27 |
---|
47 | ] |
---|
48 | |
---|
49 | def postOptions(self): |
---|
50 | - # compute a node-url from the existing options, put in self['node-url'] |
---|
51 | if self['node-directory']: |
---|
52 | hunk ./src/allmydata/scripts/cli.py 28 |
---|
53 | - if sys.platform == 'win32' and self['node-directory'] == '~/.tahoe': |
---|
54 | - from allmydata.windows import registry |
---|
55 | - self['node-directory'] = registry.get_base_dir_path() |
---|
56 | - else: |
---|
57 | - self['node-directory'] = argv_to_abspath(self['node-directory']) |
---|
58 | + self['node-directory'] = argv_to_abspath(self['node-directory']) |
---|
59 | + else: |
---|
60 | + self['node-directory'] = _default_nodedir |
---|
61 | + |
---|
62 | + # compute a node-url from the existing options, put in self['node-url'] |
---|
63 | if self['node-url']: |
---|
64 | if (not isinstance(self['node-url'], basestring) |
---|
65 | or not NODEURL_RE.match(self['node-url'])): |
---|
66 | hunk ./src/allmydata/scripts/cli.py 48 |
---|
67 | |
---|
68 | aliases = get_aliases(self['node-directory']) |
---|
69 | if self['dir-cap']: |
---|
70 | - aliases["tahoe"] = self['dir-cap'] |
---|
71 | + aliases[DEFAULT_ALIAS] = self['dir-cap'] |
---|
72 | self.aliases = aliases # maps alias name to dircap |
---|
73 | |
---|
74 | |
---|
75 | hunk ./src/allmydata/scripts/common.py 9 |
---|
76 | from allmydata.util.encodingutil import unicode_to_url, quote_output, argv_to_abspath |
---|
77 | from allmydata.util.fileutil import abspath_expanduser_unicode |
---|
78 | |
---|
79 | -class BaseOptions: |
---|
80 | + |
---|
81 | +_default_nodedir = None |
---|
82 | +if sys.platform == 'win32': |
---|
83 | + from allmydata.windows import registry |
---|
84 | + path = registry.get_base_dir_path() |
---|
85 | + if path: |
---|
86 | + precondition(isinstance(path, unicode), path) |
---|
87 | + _default_nodedir = abspath_expanduser_unicode(path) |
---|
88 | + |
---|
89 | +if _default_nodedir is None: |
---|
90 | + path = abspath_expanduser_unicode(u"~/.tahoe") |
---|
91 | + precondition(isinstance(path, unicode), path) |
---|
92 | + _default_nodedir = path |
---|
93 | + |
---|
94 | +def get_default_nodedir(): |
---|
95 | + return _default_nodedir |
---|
96 | + |
---|
97 | + |
---|
98 | +class BaseOptions(usage.Options): |
---|
99 | # unit tests can override these to point at StringIO instances |
---|
100 | stdin = sys.stdin |
---|
101 | stdout = sys.stdout |
---|
102 | hunk ./src/allmydata/scripts/common.py 37 |
---|
103 | ["quiet", "q", "Operate silently."], |
---|
104 | ["version", "V", "Display version numbers and exit."], |
---|
105 | ["version-and-path", None, "Display version numbers and paths to their locations and exit."], |
---|
106 | - ] |
---|
107 | + ] |
---|
108 | + optParameters = [ |
---|
109 | + ["node-directory", "d", None, "Specify which Tahoe node directory should be used." + ( |
---|
110 | + _default_nodedir and (" [default for most commands: " + quote_output(_default_nodedir) + "]") or "")], |
---|
111 | + ] |
---|
112 | |
---|
113 | def opt_version(self): |
---|
114 | import allmydata |
---|
115 | hunk ./src/allmydata/scripts/common.py 55 |
---|
116 | |
---|
117 | |
---|
118 | class BasedirMixin: |
---|
119 | - optFlags = [ |
---|
120 | - ["multiple", "m", "allow multiple basedirs to be specified at once"], |
---|
121 | - ] |
---|
122 | + default_nodedir = _default_nodedir |
---|
123 | + allow_multiple = True |
---|
124 | |
---|
125 | hunk ./src/allmydata/scripts/common.py 58 |
---|
126 | - def postOptions(self): |
---|
127 | - if not self.basedirs: |
---|
128 | - raise usage.UsageError("<basedir> parameter is required") |
---|
129 | - if self['basedir']: |
---|
130 | - del self['basedir'] |
---|
131 | - self['basedirs'] = self.basedirs |
---|
132 | + optParameters = [ |
---|
133 | + ["basedir", "C", None, "Same as --node-directory."], |
---|
134 | + ] |
---|
135 | + optFlags = [ |
---|
136 | + ["multiple", "m", "Specify multiple node directories at once"], |
---|
137 | + ] |
---|
138 | |
---|
139 | def parseArgs(self, *args): |
---|
140 | hunk ./src/allmydata/scripts/common.py 66 |
---|
141 | - self.basedirs = [] |
---|
142 | - if self['basedir']: |
---|
143 | - precondition(isinstance(self['basedir'], str), self['basedir']) |
---|
144 | - self.basedirs.append(argv_to_abspath(self['basedir'])) |
---|
145 | - if self['multiple']: |
---|
146 | - self.basedirs.extend(map(argv_to_abspath, args)) |
---|
147 | + if self['node-directory'] and self['basedir']: |
---|
148 | + raise usage.UsageError("The --node-directory (or -d) and --basedir (or -C) " |
---|
149 | + "options cannot both be used.") |
---|
150 | + |
---|
151 | + if self['node-directory'] or self['basedir']: |
---|
152 | + self.basedirs = [argv_to_abspath(self['node-directory'] or self['basedir'])] |
---|
153 | else: |
---|
154 | hunk ./src/allmydata/scripts/common.py 73 |
---|
155 | - if len(args) == 0 and not self.basedirs: |
---|
156 | - if sys.platform == 'win32': |
---|
157 | - from allmydata.windows import registry |
---|
158 | - rbdp = registry.get_base_dir_path() |
---|
159 | - if rbdp: |
---|
160 | - precondition(isinstance(registry.get_base_dir_path(), unicode), registry.get_base_dir_path()) |
---|
161 | - self.basedirs.append(rbdp) |
---|
162 | - else: |
---|
163 | - self.basedirs.append(abspath_expanduser_unicode(u"~/.tahoe")) |
---|
164 | - if len(args) > 0: |
---|
165 | - self.basedirs.append(argv_to_abspath(args[0])) |
---|
166 | - if len(args) > 1: |
---|
167 | - raise usage.UsageError("I wasn't expecting so many arguments") |
---|
168 | + self.basedirs = [] |
---|
169 | |
---|
170 | hunk ./src/allmydata/scripts/common.py 75 |
---|
171 | -class NoDefaultBasedirMixin(BasedirMixin): |
---|
172 | - def parseArgs(self, *args): |
---|
173 | - # create-client won't default to --basedir=~/.tahoe |
---|
174 | - self.basedirs = [] |
---|
175 | - if self['basedir']: |
---|
176 | - self.basedirs.append(argv_to_abspath(self['basedir'])) |
---|
177 | - if self['multiple']: |
---|
178 | + if self.allow_multiple and self['multiple']: |
---|
179 | self.basedirs.extend(map(argv_to_abspath, args)) |
---|
180 | else: |
---|
181 | if len(args) > 0: |
---|
182 | hunk ./src/allmydata/scripts/common.py 81 |
---|
183 | self.basedirs.append(argv_to_abspath(args[0])) |
---|
184 | if len(args) > 1: |
---|
185 | - raise usage.UsageError("I wasn't expecting so many arguments") |
---|
186 | + raise usage.UsageError("I wasn't expecting so many arguments." + |
---|
187 | + (self.allow_multiple and |
---|
188 | + " Use the --multiple option to specify more than one node directory." or "")) |
---|
189 | + |
---|
190 | + if len(args) == 0 and self.default_nodedir and not self.basedirs: |
---|
191 | + self.basedirs.append(self.default_nodedir) |
---|
192 | + elif len(args) > 0: |
---|
193 | + self.basedirs.append(argv_to_abspath(args[0])) |
---|
194 | + |
---|
195 | + def postOptions(self): |
---|
196 | if not self.basedirs: |
---|
197 | hunk ./src/allmydata/scripts/common.py 92 |
---|
198 | - raise usage.UsageError("--basedir must be provided") |
---|
199 | + raise usage.UsageError("A base directory for the node must be provided.") |
---|
200 | + del self['basedir'] |
---|
201 | + self['basedirs'] = self.basedirs |
---|
202 | + |
---|
203 | |
---|
204 | DEFAULT_ALIAS = u"tahoe" |
---|
205 | |
---|
206 | hunk ./src/allmydata/scripts/common.py 109 |
---|
207 | f = open(rootfile, "r") |
---|
208 | rootcap = f.read().strip() |
---|
209 | if rootcap: |
---|
210 | - aliases[u"tahoe"] = uri.from_string_dirnode(rootcap).to_string() |
---|
211 | + aliases[DEFAULT_ALIAS] = uri.from_string_dirnode(rootcap).to_string() |
---|
212 | except EnvironmentError: |
---|
213 | pass |
---|
214 | try: |
---|
215 | hunk ./src/allmydata/scripts/create_node.py 3 |
---|
216 | |
---|
217 | import os, sys |
---|
218 | -from twisted.python import usage |
---|
219 | -from allmydata.scripts.common import BasedirMixin, NoDefaultBasedirMixin |
---|
220 | +from allmydata.scripts.common import BasedirMixin, BaseOptions |
---|
221 | from allmydata.util.assertutil import precondition |
---|
222 | from allmydata.util.encodingutil import listdir_unicode, argv_to_unicode, quote_output |
---|
223 | import allmydata |
---|
224 | hunk ./src/allmydata/scripts/create_node.py 8 |
---|
225 | |
---|
226 | -class CreateClientOptions(BasedirMixin, usage.Options): |
---|
227 | +class CreateClientOptions(BasedirMixin, BaseOptions): |
---|
228 | optParameters = [ |
---|
229 | ("basedir", "C", None, "which directory to create the node in"), |
---|
230 | # we provide 'create-node'-time options for the most common |
---|
231 | hunk ./src/allmydata/scripts/create_node.py 25 |
---|
232 | ("no-storage", None, "do not offer storage service to other nodes"), |
---|
233 | ] |
---|
234 | |
---|
235 | -class CreateIntroducerOptions(NoDefaultBasedirMixin, usage.Options): |
---|
236 | +class CreateIntroducerOptions(BasedirMixin, BaseOptions): |
---|
237 | + default_nodedir = None |
---|
238 | + |
---|
239 | optParameters = [ |
---|
240 | ["basedir", "C", None, "which directory to create the introducer in"], |
---|
241 | ] |
---|
242 | hunk ./src/allmydata/scripts/keygen.py 3 |
---|
243 | |
---|
244 | import os, sys |
---|
245 | -from twisted.python import usage |
---|
246 | -#from allmydata.scripts.common import BasedirMixin, NoDefaultBasedirMixin |
---|
247 | -from allmydata.util.encodingutil import listdir_unicode, argv_to_abspath, quote_output |
---|
248 | +from allmydata.scripts.common import BasedirMixin, BaseOptions |
---|
249 | +from allmydata.util.encodingutil import listdir_unicode, quote_output |
---|
250 | + |
---|
251 | +class CreateKeyGeneratorOptions(BasedirMixin, BaseOptions): |
---|
252 | + default_nodedir = None |
---|
253 | + allow_multiple = False |
---|
254 | |
---|
255 | hunk ./src/allmydata/scripts/keygen.py 10 |
---|
256 | -class CreateKeyGeneratorOptions(usage.Options): |
---|
257 | optParameters = [ |
---|
258 | ["basedir", "C", None, "which directory to create the key-generator in"], |
---|
259 | hunk ./src/allmydata/scripts/keygen.py 12 |
---|
260 | - ] |
---|
261 | + ] |
---|
262 | |
---|
263 | keygen_tac = """ |
---|
264 | # -*- python -*- |
---|
265 | hunk ./src/allmydata/scripts/keygen.py 30 |
---|
266 | """ |
---|
267 | |
---|
268 | def create_key_generator(config, out=sys.stdout, err=sys.stderr): |
---|
269 | - if not config['basedir']: |
---|
270 | - print >>err, "a basedir was not provided, please use --basedir or -C" |
---|
271 | - return -1 |
---|
272 | - basedir = argv_to_abspath(config['basedir']) |
---|
273 | + basedir = config['basedirs'][0] |
---|
274 | if os.path.exists(basedir): |
---|
275 | if listdir_unicode(basedir): |
---|
276 | print >>err, "The base directory %s is not empty." % quote_output(basedir) |
---|
277 | hunk ./src/allmydata/scripts/startstop_node.py 3 |
---|
278 | |
---|
279 | import os, sys, signal, time |
---|
280 | -from twisted.python import usage |
---|
281 | -from allmydata.scripts.common import BasedirMixin |
---|
282 | +from allmydata.scripts.common import BasedirMixin, BaseOptions |
---|
283 | from allmydata.util import fileutil, find_exe |
---|
284 | |
---|
285 | hunk ./src/allmydata/scripts/startstop_node.py 6 |
---|
286 | -class StartOptions(BasedirMixin, usage.Options): |
---|
287 | +class StartOptions(BasedirMixin, BaseOptions): |
---|
288 | optParameters = [ |
---|
289 | ["basedir", "C", None, "which directory to start the node in"], |
---|
290 | ] |
---|
291 | hunk ./src/allmydata/scripts/startstop_node.py 15 |
---|
292 | ["syslog", None, "tell the node to log to syslog, not a file"], |
---|
293 | ] |
---|
294 | |
---|
295 | -class StopOptions(BasedirMixin, usage.Options): |
---|
296 | +class StopOptions(BasedirMixin, BaseOptions): |
---|
297 | optParameters = [ |
---|
298 | ["basedir", "C", None, "which directory to stop the node in"], |
---|
299 | ] |
---|
300 | hunk ./src/allmydata/scripts/startstop_node.py 20 |
---|
301 | |
---|
302 | -class RestartOptions(BasedirMixin, usage.Options): |
---|
303 | +class RestartOptions(BasedirMixin, BaseOptions): |
---|
304 | optParameters = [ |
---|
305 | ["basedir", "C", None, "which directory to restart the node in"], |
---|
306 | ] |
---|
307 | hunk ./src/allmydata/scripts/startstop_node.py 29 |
---|
308 | ["syslog", None, "tell the node to log to syslog, not a file"], |
---|
309 | ] |
---|
310 | |
---|
311 | -class RunOptions(usage.Options): |
---|
312 | +class RunOptions(BasedirMixin, BaseOptions): |
---|
313 | + default_nodedir = u"." |
---|
314 | + |
---|
315 | optParameters = [ |
---|
316 | ["basedir", "C", None, "which directory to run the node in, CWD by default"], |
---|
317 | ] |
---|
318 | hunk ./src/allmydata/test/test_runner.py 205 |
---|
319 | |
---|
320 | # make sure it rejects a missing basedir specification |
---|
321 | argv = ["create-key-generator"] |
---|
322 | - rc, out, err = self.run_tahoe(argv) |
---|
323 | - self.failIfEqual(rc, 0, str((out, err, rc))) |
---|
324 | - self.failUnlessEqual(out, "") |
---|
325 | - self.failUnless("a basedir was not provided" in err) |
---|
326 | + self.failUnlessRaises(usage.UsageError, |
---|
327 | + runner.runner, argv, |
---|
328 | + run_by_human=False) |
---|
329 | |
---|
330 | def test_stats_gatherer(self): |
---|
331 | basedir = self.workdir("test_stats_gatherer") |
---|
332 | } |
---|
333 | |
---|
334 | Context: |
---|
335 | |
---|
336 | [Makefile: change tahoe_lafs* globs to *tahoe* (in order to also catch allmydata-tahoe). Change 'clean' to no longer delete bundled egg directories for setuptools, setuptools-trial and darcver. |
---|
337 | david-sarah@jacaranda.org**20100802033536 |
---|
338 | Ignore-this: d2cb81aaf9da4151fc0a3f89efa1de73 |
---|
339 | ] |
---|
340 | [Makefile: fix 'clean' target to remove tahoe_lafs*.egg_info, and 'upload-tarballs' to upload tahoe_lafs* (instead of allmydata_tahoe*). Change 'upload-tarballs' to upload even for branches, and add 'upload-tarballs-trunkonly' that does what the name says. |
---|
341 | david-sarah@jacaranda.org**20100802031829 |
---|
342 | Ignore-this: d5765c6f51234b374fe32b3699e4fa1f |
---|
343 | ] |
---|
344 | [test_util.py: Python < 2.6 portability fix -- use .replace("1", "") instead of .translate(None, "1") |
---|
345 | david-sarah@jacaranda.org**20100802023210 |
---|
346 | Ignore-this: 2aa7e85362df25d3189c91633be9fdc2 |
---|
347 | ] |
---|
348 | [.darcs-boringfile: Tahoe egg-info directories are no longer called allmydata-tahoe.egg-info. |
---|
349 | david-sarah@jacaranda.org**20100802015019 |
---|
350 | Ignore-this: a48fc3388290700ad24e37c963c3f683 |
---|
351 | ] |
---|
352 | [test_runner.py: Fix error in message arguments to 'fail' calls. |
---|
353 | david-sarah@jacaranda.org**20100802013526 |
---|
354 | Ignore-this: 3bfdef19ae3cf993194811367da5d020 |
---|
355 | ] |
---|
356 | [Additional Unicode basedir changes for ticket798 branch. |
---|
357 | david-sarah@jacaranda.org**20100802010552 |
---|
358 | Ignore-this: 7090d8c6b04eb6275345a55e75142028 |
---|
359 | ] |
---|
360 | [Unicode basedir changes for ticket798 branch. |
---|
361 | david-sarah@jacaranda.org**20100801235310 |
---|
362 | Ignore-this: a00717eaeae8650847b5395801e04c45 |
---|
363 | ] |
---|
364 | [New files added by New Downloader. |
---|
365 | david-sarah@jacaranda.org**20100801234004 |
---|
366 | Ignore-this: f44a1622f92d3c5b8a7603f0295c3f63 |
---|
367 | ] |
---|
368 | [fileutil: change WindowsError to OSError in abspath_expanduser_unicode, because WindowsError might not exist. |
---|
369 | david-sarah@jacaranda.org**20100725222603 |
---|
370 | Ignore-this: e125d503670ed049a9ade0322faa0c51 |
---|
371 | ] |
---|
372 | [test_system: correct a failure in _test_runner caused by Unicode basedir patch on non-Unicode platforms. |
---|
373 | david-sarah@jacaranda.org**20100724032123 |
---|
374 | Ignore-this: 399b3953104fdd1bbed3f7564d163553 |
---|
375 | ] |
---|
376 | [Brian's New Downloader, for testing in 1.8beta. (rebased for ticket798 branch) |
---|
377 | david-sarah@jacaranda.org**20100801175522 |
---|
378 | Ignore-this: c4a9455865e13908e7c1bba4d5142c75 |
---|
379 | ] |
---|
380 | [Fix test failures due to Unicode basedir patches. |
---|
381 | david-sarah@jacaranda.org**20100725010318 |
---|
382 | Ignore-this: fe92cd439eb3e60a56c007ae452784ed |
---|
383 | ] |
---|
384 | [util.encodingutil: change quote_output to do less unnecessary escaping, and to use double-quotes more consistently when needed. This version avoids u-escaping for characters that are representable in the output encoding, when double quotes are used, and includes tests. fixes #1135 |
---|
385 | david-sarah@jacaranda.org**20100723075314 |
---|
386 | Ignore-this: b82205834d17db61612dd16436b7c5a2 |
---|
387 | ] |
---|
388 | [Replace uses of os.path.abspath with abspath_expanduser_unicode where necessary. This makes basedir paths consistently represented as Unicode. |
---|
389 | david-sarah@jacaranda.org**20100722001418 |
---|
390 | Ignore-this: 9f8cb706540e695550e0dbe303c01f52 |
---|
391 | ] |
---|
392 | [util.fileutil, test.test_util: add abspath_expanduser_unicode function, to work around <http://bugs.python.org/issue3426>. util.encodingutil: add a convenience function argv_to_abspath. |
---|
393 | david-sarah@jacaranda.org**20100721231507 |
---|
394 | Ignore-this: eee6904d1f65a733ff35190879844d08 |
---|
395 | ] |
---|
396 | [TAG tahoe-lafs-ticket798-1.7.1 |
---|
397 | zooko@zooko.com**20100801165549 |
---|
398 | Ignore-this: ab7966b17c0f091b4f532cc0cf518068 |
---|
399 | ] |
---|
400 | Patch bundle hash: |
---|
401 | 632304e342f5f910dc976a44eb8d2d23f5136b82 |
---|