1 | 1 patch for repository davidsarah@dev.allmydata.org:/home/darcs/tahoe/trunk: |
---|
2 | |
---|
3 | Sun Jul 24 23:54:40 BST 2011 david-sarah@jacaranda.org |
---|
4 | * Fix the help synopses of CLI commands to include [options] in the right place. fixes #1359, fixes #636 |
---|
5 | |
---|
6 | New patches: |
---|
7 | |
---|
8 | [Fix the help synopses of CLI commands to include [options] in the right place. fixes #1359, fixes #636 |
---|
9 | david-sarah@jacaranda.org**20110724225440 |
---|
10 | Ignore-this: 2a8e488a5f63dabfa9db9efd83768a5 |
---|
11 | ] { |
---|
12 | hunk ./src/allmydata/scripts/cli.py 55 |
---|
13 | class MakeDirectoryOptions(VDriveOptions): |
---|
14 | def parseArgs(self, where=""): |
---|
15 | self.where = argv_to_unicode(where) |
---|
16 | + |
---|
17 | + def getSynopsis(self): |
---|
18 | + return "Usage: %s mkdir [options] [REMOTE_DIR]" % (self.command_name,) |
---|
19 | + |
---|
20 | longdesc = """Create a new directory, either unlinked or as a subdirectory.""" |
---|
21 | |
---|
22 | class AddAliasOptions(VDriveOptions): |
---|
23 | hunk ./src/allmydata/scripts/cli.py 69 |
---|
24 | self.cap = cap |
---|
25 | |
---|
26 | def getSynopsis(self): |
---|
27 | - return "Usage: %s add-alias ALIAS[:] DIRCAP" % (os.path.basename(sys.argv[0]),) |
---|
28 | + return "Usage: %s add-alias [options] ALIAS[:] DIRCAP" % (self.command_name,) |
---|
29 | |
---|
30 | longdesc = """Add a new alias for an existing directory.""" |
---|
31 | |
---|
32 | hunk ./src/allmydata/scripts/cli.py 80 |
---|
33 | self.alias = self.alias[:-1] |
---|
34 | |
---|
35 | def getSynopsis(self): |
---|
36 | - return "Usage: %s create-alias ALIAS[:]" % (os.path.basename(sys.argv[0]),) |
---|
37 | + return "Usage: %s create-alias [options] ALIAS[:]" % (self.command_name,) |
---|
38 | |
---|
39 | longdesc = """Create a new directory and add an alias for it.""" |
---|
40 | |
---|
41 | hunk ./src/allmydata/scripts/cli.py 84 |
---|
42 | -class ListAliasOptions(VDriveOptions): |
---|
43 | +class ListAliasesOptions(VDriveOptions): |
---|
44 | + def getSynopsis(self): |
---|
45 | + return "Usage: %s list-aliases [options]" % (self.command_name,) |
---|
46 | + |
---|
47 | longdesc = """Display a table of all configured aliases.""" |
---|
48 | |
---|
49 | class ListOptions(VDriveOptions): |
---|
50 | hunk ./src/allmydata/scripts/cli.py 145 |
---|
51 | self.to_file = None |
---|
52 | |
---|
53 | def getSynopsis(self): |
---|
54 | - return "Usage: %s get REMOTE_FILE LOCAL_FILE" % (os.path.basename(sys.argv[0]),) |
---|
55 | + return "Usage: %s get [options] REMOTE_FILE LOCAL_FILE" % (self.command_name,) |
---|
56 | |
---|
57 | longdesc = """ |
---|
58 | Retrieve a file from the grid and write it to the local filesystem. If |
---|
59 | hunk ./src/allmydata/scripts/cli.py 184 |
---|
60 | self.from_file = None |
---|
61 | |
---|
62 | def getSynopsis(self): |
---|
63 | - return "Usage: %s put LOCAL_FILE REMOTE_FILE" % (os.path.basename(sys.argv[0]),) |
---|
64 | + return "Usage: %s put [options] LOCAL_FILE REMOTE_FILE" % (self.command_name,) |
---|
65 | |
---|
66 | longdesc = """ |
---|
67 | Put a file into the grid, copying its contents from the local filesystem. |
---|
68 | hunk ./src/allmydata/scripts/cli.py 215 |
---|
69 | "When copying to local files, write out filecaps instead of actual " |
---|
70 | "data (only useful for debugging and tree-comparison purposes)."), |
---|
71 | ] |
---|
72 | + |
---|
73 | def parseArgs(self, *args): |
---|
74 | if len(args) < 2: |
---|
75 | raise usage.UsageError("cp requires at least two arguments") |
---|
76 | hunk ./src/allmydata/scripts/cli.py 221 |
---|
77 | self.sources = map(argv_to_unicode, args[:-1]) |
---|
78 | self.destination = argv_to_unicode(args[-1]) |
---|
79 | + |
---|
80 | def getSynopsis(self): |
---|
81 | hunk ./src/allmydata/scripts/cli.py 223 |
---|
82 | - return "Usage: tahoe [options] cp FROM.. TO" |
---|
83 | + return "Usage: tahoe cp [options] FROM.. TO" |
---|
84 | + |
---|
85 | longdesc = """ |
---|
86 | Use 'tahoe cp' to copy files between a local filesystem and a Tahoe grid. |
---|
87 | Any FROM/TO arguments that begin with an alias indicate Tahoe-side |
---|
88 | hunk ./src/allmydata/scripts/cli.py 255 |
---|
89 | self.where = argv_to_unicode(where) |
---|
90 | |
---|
91 | def getSynopsis(self): |
---|
92 | - return "Usage: %s rm REMOTE_FILE" % (os.path.basename(sys.argv[0]),) |
---|
93 | + return "Usage: %s rm [options] REMOTE_FILE" % (self.command_name,) |
---|
94 | |
---|
95 | class UnlinkOptions(RmOptions): |
---|
96 | def getSynopsis(self): |
---|
97 | hunk ./src/allmydata/scripts/cli.py 259 |
---|
98 | - return "Usage: %s unlink REMOTE_FILE" % (os.path.basename(sys.argv[0]),) |
---|
99 | + return "Usage: %s unlink [options] REMOTE_FILE" % (self.command_name,) |
---|
100 | |
---|
101 | class MvOptions(VDriveOptions): |
---|
102 | def parseArgs(self, frompath, topath): |
---|
103 | hunk ./src/allmydata/scripts/cli.py 267 |
---|
104 | self.to_file = argv_to_unicode(topath) |
---|
105 | |
---|
106 | def getSynopsis(self): |
---|
107 | - return "Usage: %s mv FROM TO" % (os.path.basename(sys.argv[0]),) |
---|
108 | + return "Usage: %s mv [options] FROM TO" % (self.command_name,) |
---|
109 | + |
---|
110 | longdesc = """ |
---|
111 | Use 'tahoe mv' to move files that are already on the grid elsewhere on |
---|
112 | the grid, e.g., 'tahoe mv alias:some_file alias:new_file'. |
---|
113 | hunk ./src/allmydata/scripts/cli.py 287 |
---|
114 | self.to_file = argv_to_unicode(topath) |
---|
115 | |
---|
116 | def getSynopsis(self): |
---|
117 | - return "Usage: %s ln FROM_LINK TO_LINK" % (os.path.basename(sys.argv[0]),) |
---|
118 | + return "Usage: %s ln [options] FROM_LINK TO_LINK" % (self.command_name,) |
---|
119 | |
---|
120 | longdesc = """ |
---|
121 | Use 'tahoe ln' to duplicate a link (directory entry) already on the grid |
---|
122 | hunk ./src/allmydata/scripts/cli.py 333 |
---|
123 | self.from_dir = argv_to_unicode(localdir) |
---|
124 | self.to_dir = argv_to_unicode(topath) |
---|
125 | |
---|
126 | - def getSynopsis(Self): |
---|
127 | - return "Usage: %s backup FROM ALIAS:TO" % os.path.basename(sys.argv[0]) |
---|
128 | + def getSynopsis(self): |
---|
129 | + return "Usage: %s backup [options] FROM ALIAS:TO" % (self.command_name,) |
---|
130 | |
---|
131 | def opt_exclude(self, pattern): |
---|
132 | """Ignore files matching a glob pattern. You may give multiple |
---|
133 | hunk ./src/allmydata/scripts/cli.py 392 |
---|
134 | self.where = argv_to_unicode(where) |
---|
135 | |
---|
136 | def getSynopsis(self): |
---|
137 | - return "Usage: %s webopen [ALIAS:PATH]" % (os.path.basename(sys.argv[0]),) |
---|
138 | + return "Usage: %s webopen [options] [ALIAS:PATH]" % (self.command_name,) |
---|
139 | |
---|
140 | longdesc = """Open a web browser to the contents of some file or |
---|
141 | directory on the grid. When run without arguments, open the Welcome |
---|
142 | hunk ./src/allmydata/scripts/cli.py 409 |
---|
143 | self.where = argv_to_unicode(where) |
---|
144 | |
---|
145 | def getSynopsis(self): |
---|
146 | - return "Usage: %s manifest [ALIAS:PATH]" % (os.path.basename(sys.argv[0]),) |
---|
147 | + return "Usage: %s manifest [options] [ALIAS:PATH]" % (self.command_name,) |
---|
148 | |
---|
149 | longdesc = """Print a list of all files and directories reachable from |
---|
150 | the given starting point.""" |
---|
151 | hunk ./src/allmydata/scripts/cli.py 422 |
---|
152 | self.where = argv_to_unicode(where) |
---|
153 | |
---|
154 | def getSynopsis(self): |
---|
155 | - return "Usage: %s stats [ALIAS:PATH]" % (os.path.basename(sys.argv[0]),) |
---|
156 | + return "Usage: %s stats [options] [ALIAS:PATH]" % (self.command_name,) |
---|
157 | |
---|
158 | longdesc = """Print statistics about of all files and directories |
---|
159 | reachable from the given starting point.""" |
---|
160 | hunk ./src/allmydata/scripts/cli.py 438 |
---|
161 | self.where = argv_to_unicode(where) |
---|
162 | |
---|
163 | def getSynopsis(self): |
---|
164 | - return "Usage: %s check [ALIAS:PATH]" % (os.path.basename(sys.argv[0]),) |
---|
165 | + return "Usage: %s check [options] [ALIAS:PATH]" % (self.command_name,) |
---|
166 | |
---|
167 | longdesc = """ |
---|
168 | Check a single file or directory: count how many shares are available and |
---|
169 | hunk ./src/allmydata/scripts/cli.py 457 |
---|
170 | self.where = argv_to_unicode(where) |
---|
171 | |
---|
172 | def getSynopsis(self): |
---|
173 | - return "Usage: %s deep-check [ALIAS:PATH]" % (os.path.basename(sys.argv[0]),) |
---|
174 | + return "Usage: %s deep-check [options] [ALIAS:PATH]" % (self.command_name,) |
---|
175 | |
---|
176 | longdesc = """ |
---|
177 | Check all files and directories reachable from the given starting point |
---|
178 | hunk ./src/allmydata/scripts/cli.py 468 |
---|
179 | ["mkdir", None, MakeDirectoryOptions, "Create a new directory."], |
---|
180 | ["add-alias", None, AddAliasOptions, "Add a new alias cap."], |
---|
181 | ["create-alias", None, CreateAliasOptions, "Create a new alias cap."], |
---|
182 | - ["list-aliases", None, ListAliasOptions, "List all alias caps."], |
---|
183 | + ["list-aliases", None, ListAliasesOptions, "List all alias caps."], |
---|
184 | ["ls", None, ListOptions, "List a directory."], |
---|
185 | ["get", None, GetOptions, "Retrieve a file from the grid."], |
---|
186 | ["put", None, PutOptions, "Upload a file into the grid."], |
---|
187 | hunk ./src/allmydata/scripts/common.py 43 |
---|
188 | _default_nodedir and (" [default for most commands: " + quote_output(_default_nodedir) + "]") or "")], |
---|
189 | ] |
---|
190 | |
---|
191 | + def __init__(self): |
---|
192 | + super(BaseOptions, self).__init__() |
---|
193 | + self.command_name = os.path.basename(sys.argv[0]) |
---|
194 | + if self.command_name == 'trial': |
---|
195 | + self.command_name = 'tahoe' |
---|
196 | + |
---|
197 | def opt_version(self): |
---|
198 | import allmydata |
---|
199 | print >>self.stdout, allmydata.get_package_versions_string(debug=True) |
---|
200 | hunk ./src/allmydata/scripts/create_node.py 20 |
---|
201 | ] |
---|
202 | |
---|
203 | def getSynopsis(self): |
---|
204 | - return "Usage: %s create-client [options] [NODEDIR]" % (os.path.basename(sys.argv[0]),) |
---|
205 | + return "Usage: %s create-client [options] [NODEDIR]" % (self.command_name,) |
---|
206 | |
---|
207 | |
---|
208 | class CreateNodeOptions(CreateClientOptions): |
---|
209 | hunk ./src/allmydata/scripts/create_node.py 29 |
---|
210 | ] |
---|
211 | |
---|
212 | def getSynopsis(self): |
---|
213 | - return "Usage: %s create-node [options] [NODEDIR]" % (os.path.basename(sys.argv[0]),) |
---|
214 | + return "Usage: %s create-node [options] [NODEDIR]" % (self.command_name,) |
---|
215 | |
---|
216 | |
---|
217 | class CreateIntroducerOptions(BasedirMixin, BaseOptions): |
---|
218 | hunk ./src/allmydata/scripts/create_node.py 40 |
---|
219 | ] |
---|
220 | |
---|
221 | def getSynopsis(self): |
---|
222 | - return "Usage: %s create-introducer [options] NODEDIR" % (os.path.basename(sys.argv[0]),) |
---|
223 | + return "Usage: %s create-introducer [options] NODEDIR" % (self.command_name,) |
---|
224 | |
---|
225 | |
---|
226 | client_tac = """ |
---|
227 | hunk ./src/allmydata/scripts/startstop_node.py 16 |
---|
228 | ] |
---|
229 | |
---|
230 | def getSynopsis(self): |
---|
231 | - return "Usage: %s start [options] [NODEDIR]" % (os.path.basename(sys.argv[0]),) |
---|
232 | + return "Usage: %s start [options] [NODEDIR]" % (self.command_name,) |
---|
233 | |
---|
234 | |
---|
235 | class StopOptions(BasedirMixin, BaseOptions): |
---|
236 | hunk ./src/allmydata/scripts/startstop_node.py 21 |
---|
237 | def getSynopsis(self): |
---|
238 | - return "Usage: %s stop [options] [NODEDIR]" % (os.path.basename(sys.argv[0]),) |
---|
239 | + return "Usage: %s stop [options] [NODEDIR]" % (self.command_name,) |
---|
240 | |
---|
241 | |
---|
242 | class RestartOptions(BasedirMixin, BaseOptions): |
---|
243 | hunk ./src/allmydata/scripts/startstop_node.py 31 |
---|
244 | ] |
---|
245 | |
---|
246 | def getSynopsis(self): |
---|
247 | - return "Usage: %s restart [options] [NODEDIR]" % (os.path.basename(sys.argv[0]),) |
---|
248 | + return "Usage: %s restart [options] [NODEDIR]" % (self.command_name,) |
---|
249 | |
---|
250 | |
---|
251 | class RunOptions(BasedirMixin, BaseOptions): |
---|
252 | hunk ./src/allmydata/scripts/startstop_node.py 42 |
---|
253 | ] |
---|
254 | |
---|
255 | def getSynopsis(self): |
---|
256 | - return "Usage: %s run [options] [NODEDIR]" % (os.path.basename(sys.argv[0]),) |
---|
257 | + return "Usage: %s run [options] [NODEDIR]" % (self.command_name,) |
---|
258 | |
---|
259 | |
---|
260 | def start(opts, out=sys.stdout, err=sys.stderr): |
---|
261 | hunk ./src/allmydata/test/test_cli.py 450 |
---|
262 | |
---|
263 | |
---|
264 | class Help(unittest.TestCase): |
---|
265 | - |
---|
266 | def test_get(self): |
---|
267 | help = str(cli.GetOptions()) |
---|
268 | hunk ./src/allmydata/test/test_cli.py 452 |
---|
269 | - self.failUnless("get REMOTE_FILE LOCAL_FILE" in help, help) |
---|
270 | - self.failUnless("% tahoe get FOO |less" in help, help) |
---|
271 | + self.failUnlessIn(" get [options] REMOTE_FILE LOCAL_FILE", help) |
---|
272 | + self.failUnlessIn("% tahoe get FOO |less", help) |
---|
273 | |
---|
274 | def test_put(self): |
---|
275 | help = str(cli.PutOptions()) |
---|
276 | hunk ./src/allmydata/test/test_cli.py 457 |
---|
277 | - self.failUnless("put LOCAL_FILE REMOTE_FILE" in help, help) |
---|
278 | - self.failUnless("% cat FILE | tahoe put" in help, help) |
---|
279 | + self.failUnlessIn(" put [options] LOCAL_FILE REMOTE_FILE", help) |
---|
280 | + self.failUnlessIn("% cat FILE | tahoe put", help) |
---|
281 | + |
---|
282 | + def test_unlink(self): |
---|
283 | + help = str(cli.UnlinkOptions()) |
---|
284 | + self.failUnlessIn(" unlink [options] REMOTE_FILE", help) |
---|
285 | |
---|
286 | def test_rm(self): |
---|
287 | help = str(cli.RmOptions()) |
---|
288 | hunk ./src/allmydata/test/test_cli.py 466 |
---|
289 | - self.failUnless("rm REMOTE_FILE" in help, help) |
---|
290 | + self.failUnlessIn(" rm [options] REMOTE_FILE", help) |
---|
291 | |
---|
292 | def test_mv(self): |
---|
293 | help = str(cli.MvOptions()) |
---|
294 | hunk ./src/allmydata/test/test_cli.py 470 |
---|
295 | - self.failUnless("mv FROM TO" in help, help) |
---|
296 | - self.failUnless("Use 'tahoe mv' to move files" in help) |
---|
297 | + self.failUnlessIn(" mv [options] FROM TO", help) |
---|
298 | + self.failUnlessIn("Use 'tahoe mv' to move files", help) |
---|
299 | + |
---|
300 | + def test_cp(self): |
---|
301 | + help = str(cli.CpOptions()) |
---|
302 | + self.failUnlessIn(" cp [options] FROM.. TO", help) |
---|
303 | + self.failUnlessIn("Use 'tahoe cp' to copy files", help) |
---|
304 | |
---|
305 | def test_ln(self): |
---|
306 | help = str(cli.LnOptions()) |
---|
307 | hunk ./src/allmydata/test/test_cli.py 480 |
---|
308 | - self.failUnless("ln FROM_LINK TO_LINK" in help, help) |
---|
309 | - self.failUnless("Use 'tahoe ln' to duplicate a link" in help) |
---|
310 | + self.failUnlessIn(" ln [options] FROM_LINK TO_LINK", help) |
---|
311 | + self.failUnlessIn("Use 'tahoe ln' to duplicate a link", help) |
---|
312 | + |
---|
313 | + def test_mkdir(self): |
---|
314 | + help = str(cli.MakeDirectoryOptions()) |
---|
315 | + self.failUnlessIn(" mkdir [options] [REMOTE_DIR]", help) |
---|
316 | + self.failUnlessIn("Create a new directory", help) |
---|
317 | |
---|
318 | def test_backup(self): |
---|
319 | help = str(cli.BackupOptions()) |
---|
320 | hunk ./src/allmydata/test/test_cli.py 490 |
---|
321 | - self.failUnless("backup FROM ALIAS:TO" in help, help) |
---|
322 | + self.failUnlessIn(" backup [options] FROM ALIAS:TO", help) |
---|
323 | |
---|
324 | def test_webopen(self): |
---|
325 | help = str(cli.WebopenOptions()) |
---|
326 | hunk ./src/allmydata/test/test_cli.py 494 |
---|
327 | - self.failUnless("webopen [ALIAS:PATH]" in help, help) |
---|
328 | + self.failUnlessIn(" webopen [options] [ALIAS:PATH]", help) |
---|
329 | |
---|
330 | def test_manifest(self): |
---|
331 | help = str(cli.ManifestOptions()) |
---|
332 | hunk ./src/allmydata/test/test_cli.py 498 |
---|
333 | - self.failUnless("manifest [ALIAS:PATH]" in help, help) |
---|
334 | + self.failUnlessIn(" manifest [options] [ALIAS:PATH]", help) |
---|
335 | |
---|
336 | def test_stats(self): |
---|
337 | help = str(cli.StatsOptions()) |
---|
338 | hunk ./src/allmydata/test/test_cli.py 502 |
---|
339 | - self.failUnless("stats [ALIAS:PATH]" in help, help) |
---|
340 | + self.failUnlessIn(" stats [options] [ALIAS:PATH]", help) |
---|
341 | |
---|
342 | def test_check(self): |
---|
343 | help = str(cli.CheckOptions()) |
---|
344 | hunk ./src/allmydata/test/test_cli.py 506 |
---|
345 | - self.failUnless("check [ALIAS:PATH]" in help, help) |
---|
346 | + self.failUnlessIn(" check [options] [ALIAS:PATH]", help) |
---|
347 | |
---|
348 | def test_deep_check(self): |
---|
349 | help = str(cli.DeepCheckOptions()) |
---|
350 | hunk ./src/allmydata/test/test_cli.py 510 |
---|
351 | - self.failUnless("deep-check [ALIAS:PATH]" in help, help) |
---|
352 | + self.failUnlessIn(" deep-check [options] [ALIAS:PATH]", help) |
---|
353 | |
---|
354 | def test_create_alias(self): |
---|
355 | help = str(cli.CreateAliasOptions()) |
---|
356 | hunk ./src/allmydata/test/test_cli.py 514 |
---|
357 | - self.failUnless("create-alias ALIAS[:]" in help, help) |
---|
358 | + self.failUnlessIn(" create-alias [options] ALIAS[:]", help) |
---|
359 | |
---|
360 | hunk ./src/allmydata/test/test_cli.py 516 |
---|
361 | - def test_add_aliases(self): |
---|
362 | + def test_add_alias(self): |
---|
363 | help = str(cli.AddAliasOptions()) |
---|
364 | hunk ./src/allmydata/test/test_cli.py 518 |
---|
365 | - self.failUnless("add-alias ALIAS[:] DIRCAP" in help, help) |
---|
366 | + self.failUnlessIn(" add-alias [options] ALIAS[:] DIRCAP", help) |
---|
367 | + |
---|
368 | + def test_list_aliases(self): |
---|
369 | + help = str(cli.ListAliasesOptions()) |
---|
370 | + self.failUnlessIn(" list-aliases [options]", help) |
---|
371 | + |
---|
372 | + def test_start(self): |
---|
373 | + help = str(startstop_node.StartOptions()) |
---|
374 | + self.failUnlessIn(" start [options] [NODEDIR]", help) |
---|
375 | + |
---|
376 | + def test_stop(self): |
---|
377 | + help = str(startstop_node.StopOptions()) |
---|
378 | + self.failUnlessIn(" stop [options] [NODEDIR]", help) |
---|
379 | + |
---|
380 | + def test_restart(self): |
---|
381 | + help = str(startstop_node.RestartOptions()) |
---|
382 | + self.failUnlessIn(" restart [options] [NODEDIR]", help) |
---|
383 | + |
---|
384 | + def test_run(self): |
---|
385 | + help = str(startstop_node.RunOptions()) |
---|
386 | + self.failUnlessIn(" run [options] [NODEDIR]", help) |
---|
387 | + |
---|
388 | + def test_create_client(self): |
---|
389 | + help = str(create_node.CreateClientOptions()) |
---|
390 | + self.failUnlessIn(" create-client [options] [NODEDIR]", help) |
---|
391 | + |
---|
392 | + def test_create_node(self): |
---|
393 | + help = str(create_node.CreateNodeOptions()) |
---|
394 | + self.failUnlessIn(" create-node [options] [NODEDIR]", help) |
---|
395 | + |
---|
396 | + def test_create_introducer(self): |
---|
397 | + help = str(create_node.CreateIntroducerOptions()) |
---|
398 | + self.failUnlessIn(" create-introducer [options] NODEDIR", help) |
---|
399 | |
---|
400 | def test_debug_trial(self): |
---|
401 | help = str(debug.TrialOptions()) |
---|
402 | hunk ./src/allmydata/test/test_cli.py 554 |
---|
403 | - self.failUnless("debug trial [options] [[file|package|module|TestCase|testmethod]...]" in help, help) |
---|
404 | - self.failUnless("The 'tahoe debug trial' command uses the correct imports" in help, help) |
---|
405 | + self.failUnlessIn(" debug trial [options] [[file|package|module|TestCase|testmethod]...]", help) |
---|
406 | + self.failUnlessIn("The 'tahoe debug trial' command uses the correct imports", help) |
---|
407 | |
---|
408 | |
---|
409 | class CreateAlias(GridTestMixin, CLITestMixin, unittest.TestCase): |
---|
410 | } |
---|
411 | |
---|
412 | Context: |
---|
413 | |
---|
414 | [misc/build_helpers/run_trial.py: undo change to block pywin32 (it didn't work because run_trial.py is no longer used). refs #1334 |
---|
415 | david-sarah@jacaranda.org**20110722035402 |
---|
416 | Ignore-this: 5d03f544c4154f088e26c7107494bf39 |
---|
417 | ] |
---|
418 | [misc/build_helpers/run_trial.py: ensure that pywin32 is not on the sys.path when running the test suite. Includes some temporary debugging printouts that will be removed. refs #1334 |
---|
419 | david-sarah@jacaranda.org**20110722024907 |
---|
420 | Ignore-this: 5141a9f83a4085ed4ca21f0bbb20bb9c |
---|
421 | ] |
---|
422 | [frontends/ftpd.py: remove the check for IWriteFile.close since we're now guaranteed to be using Twisted >= 10.1 which has it. |
---|
423 | david-sarah@jacaranda.org**20110722000320 |
---|
424 | Ignore-this: 55cd558b791526113db3f83c00ec328a |
---|
425 | ] |
---|
426 | [Update the dependency on zope.interface to fix an incompatiblity between Nevow and zope.interface 3.6.4. fixes #1435 |
---|
427 | david-sarah@jacaranda.org**20110721234941 |
---|
428 | Ignore-this: 2ff3fcfc030fca1a4d4c7f1fed0f2aa9 |
---|
429 | ] |
---|
430 | [Update the dependency on Twisted to >= 10.1. This allows us to simplify some documentation: it's no longer necessary to install pywin32 on Windows, or apply a patch to Twisted in order to use the FTP frontend. fixes #1274, #1438. refs #1429 |
---|
431 | david-sarah@jacaranda.org**20110721233658 |
---|
432 | Ignore-this: 81b41745477163c9b39c0b59db91cc62 |
---|
433 | ] |
---|
434 | [docs/running.rst: use 'tahoe run ~/.tahoe' instead of 'tahoe run' (the default is the current directory, unlike 'tahoe start'). |
---|
435 | david-sarah@jacaranda.org**20110718005949 |
---|
436 | Ignore-this: 81837fbce073e93d88a3e7ae3122458c |
---|
437 | ] |
---|
438 | [docs/running.rst: say to put the introducer.furl in tahoe.cfg. |
---|
439 | david-sarah@jacaranda.org**20110717194315 |
---|
440 | Ignore-this: 954cc4c08e413e8c62685d58ff3e11f3 |
---|
441 | ] |
---|
442 | [setup: remove the dependency on foolscap's "secure_connections" extra, add a dependency on pyOpenSSL |
---|
443 | zooko@zooko.com**20110717114226 |
---|
444 | Ignore-this: df222120d41447ce4102616921626c82 |
---|
445 | fixes #1383 |
---|
446 | ] |
---|
447 | [docs: add missing link in NEWS.rst |
---|
448 | zooko@zooko.com**20110712153307 |
---|
449 | Ignore-this: be7b7eb81c03700b739daa1027d72b35 |
---|
450 | ] |
---|
451 | [contrib: remove the contributed fuse modules and the entire contrib/ directory, which is now empty |
---|
452 | zooko@zooko.com**20110712153229 |
---|
453 | Ignore-this: 723c4f9e2211027c79d711715d972c5 |
---|
454 | Also remove a couple of vestigial references to figleaf, which is long gone. |
---|
455 | fixes #1409 (remove contrib/fuse) |
---|
456 | ] |
---|
457 | [README.txt: say that quickstart.rst is in the docs directory. |
---|
458 | david-sarah@jacaranda.org**20110717192400 |
---|
459 | Ignore-this: bc6d35a85c496b77dbef7570677ea42a |
---|
460 | ] |
---|
461 | [test_sftp.py cleanup: remove a redundant definition of failUnlessReallyEqual. |
---|
462 | david-sarah@jacaranda.org**20110716181813 |
---|
463 | Ignore-this: 50113380b368c573f07ac6fe2eb1e97f |
---|
464 | ] |
---|
465 | [add Protovis.js-based download-status timeline visualization |
---|
466 | Brian Warner <warner@lothar.com>**20110629222606 |
---|
467 | Ignore-this: 477ccef5c51b30e246f5b6e04ab4a127 |
---|
468 | |
---|
469 | provide status overlap info on the webapi t=json output, add decode/decrypt |
---|
470 | rate tooltips, add zoomin/zoomout buttons |
---|
471 | ] |
---|
472 | [add more download-status data, fix tests |
---|
473 | Brian Warner <warner@lothar.com>**20110629222555 |
---|
474 | Ignore-this: e9e0b7e0163f1e95858aa646b9b17b8c |
---|
475 | ] |
---|
476 | [prepare for viz: improve DownloadStatus events |
---|
477 | Brian Warner <warner@lothar.com>**20110629222542 |
---|
478 | Ignore-this: 16d0bde6b734bb501aa6f1174b2b57be |
---|
479 | |
---|
480 | consolidate IDownloadStatusHandlingConsumer stuff into DownloadNode |
---|
481 | ] |
---|
482 | [docs: fix error in crypto specification that was noticed by Taylor R Campbell <campbell+tahoe@mumble.net> |
---|
483 | zooko@zooko.com**20110629185711 |
---|
484 | Ignore-this: b921ed60c1c8ba3c390737fbcbe47a67 |
---|
485 | ] |
---|
486 | [setup.py: don't make bin/tahoe.pyscript executable. fixes #1347 |
---|
487 | david-sarah@jacaranda.org**20110130235809 |
---|
488 | Ignore-this: 3454c8b5d9c2c77ace03de3ef2d9398a |
---|
489 | ] |
---|
490 | [Makefile: remove targets relating to 'setup.py check_auto_deps' which no longer exists. fixes #1345 |
---|
491 | david-sarah@jacaranda.org**20110626054124 |
---|
492 | Ignore-this: abb864427a1b91bd10d5132b4589fd90 |
---|
493 | ] |
---|
494 | [Makefile: add 'make check' as an alias for 'make test'. Also remove an unnecessary dependency of 'test' on 'build' and 'src/allmydata/_version.py'. fixes #1344 |
---|
495 | david-sarah@jacaranda.org**20110623205528 |
---|
496 | Ignore-this: c63e23146c39195de52fb17c7c49b2da |
---|
497 | ] |
---|
498 | [Rename test_package_initialization.py to (much shorter) test_import.py . |
---|
499 | Brian Warner <warner@lothar.com>**20110611190234 |
---|
500 | Ignore-this: 3eb3dbac73600eeff5cfa6b65d65822 |
---|
501 | |
---|
502 | The former name was making my 'ls' listings hard to read, by forcing them |
---|
503 | down to just two columns. |
---|
504 | ] |
---|
505 | [tests: fix tests to accomodate [20110611153758-92b7f-0ba5e4726fb6318dac28fb762a6512a003f4c430] |
---|
506 | zooko@zooko.com**20110611163741 |
---|
507 | Ignore-this: 64073a5f39e7937e8e5e1314c1a302d1 |
---|
508 | Apparently none of the two authors (stercor, terrell), three reviewers (warner, davidsarah, terrell), or one committer (me) actually ran the tests. This is presumably due to #20. |
---|
509 | fixes #1412 |
---|
510 | ] |
---|
511 | [wui: right-align the size column in the WUI |
---|
512 | zooko@zooko.com**20110611153758 |
---|
513 | Ignore-this: 492bdaf4373c96f59f90581c7daf7cd7 |
---|
514 | Thanks to Ted "stercor" Rolle Jr. and Terrell Russell. |
---|
515 | fixes #1412 |
---|
516 | ] |
---|
517 | [docs: three minor fixes |
---|
518 | zooko@zooko.com**20110610121656 |
---|
519 | Ignore-this: fec96579eb95aceb2ad5fc01a814c8a2 |
---|
520 | CREDITS for arc for stats tweak |
---|
521 | fix link to .zip file in quickstart.rst (thanks to ChosenOne for noticing) |
---|
522 | English usage tweak |
---|
523 | ] |
---|
524 | [docs/running.rst: fix stray HTML (not .rst) link noticed by ChosenOne. |
---|
525 | david-sarah@jacaranda.org**20110609223719 |
---|
526 | Ignore-this: fc50ac9c94792dcac6f1067df8ac0d4a |
---|
527 | ] |
---|
528 | [server.py: get_latencies now reports percentiles _only_ if there are sufficient observations for the interpretation of the percentile to be unambiguous. |
---|
529 | wilcoxjg@gmail.com**20110527120135 |
---|
530 | Ignore-this: 2e7029764bffc60e26f471d7c2b6611e |
---|
531 | interfaces.py: modified the return type of RIStatsProvider.get_stats to allow for None as a return value |
---|
532 | NEWS.rst, stats.py: documentation of change to get_latencies |
---|
533 | stats.rst: now documents percentile modification in get_latencies |
---|
534 | test_storage.py: test_latencies now expects None in output categories that contain too few samples for the associated percentile to be unambiguously reported. |
---|
535 | fixes #1392 |
---|
536 | ] |
---|
537 | [docs: revert link in relnotes.txt from NEWS.rst to NEWS, since the former did not exist at revision 5000. |
---|
538 | david-sarah@jacaranda.org**20110517011214 |
---|
539 | Ignore-this: 6a5be6e70241e3ec0575641f64343df7 |
---|
540 | ] |
---|
541 | [docs: convert NEWS to NEWS.rst and change all references to it. |
---|
542 | david-sarah@jacaranda.org**20110517010255 |
---|
543 | Ignore-this: a820b93ea10577c77e9c8206dbfe770d |
---|
544 | ] |
---|
545 | [docs: remove out-of-date docs/testgrid/introducer.furl and containing directory. fixes #1404 |
---|
546 | david-sarah@jacaranda.org**20110512140559 |
---|
547 | Ignore-this: 784548fc5367fac5450df1c46890876d |
---|
548 | ] |
---|
549 | [scripts/common.py: don't assume that the default alias is always 'tahoe' (it is, but the API of get_alias doesn't say so). refs #1342 |
---|
550 | david-sarah@jacaranda.org**20110130164923 |
---|
551 | Ignore-this: a271e77ce81d84bb4c43645b891d92eb |
---|
552 | ] |
---|
553 | [setup: don't catch all Exception from check_requirement(), but only PackagingError and ImportError |
---|
554 | zooko@zooko.com**20110128142006 |
---|
555 | Ignore-this: 57d4bc9298b711e4bc9dc832c75295de |
---|
556 | I noticed this because I had accidentally inserted a bug which caused AssertionError to be raised from check_requirement(). |
---|
557 | ] |
---|
558 | [M-x whitespace-cleanup |
---|
559 | zooko@zooko.com**20110510193653 |
---|
560 | Ignore-this: dea02f831298c0f65ad096960e7df5c7 |
---|
561 | ] |
---|
562 | [docs: fix typo in running.rst, thanks to arch_o_median |
---|
563 | zooko@zooko.com**20110510193633 |
---|
564 | Ignore-this: ca06de166a46abbc61140513918e79e8 |
---|
565 | ] |
---|
566 | [relnotes.txt: don't claim to work on Cygwin (which has been untested for some time). refs #1342 |
---|
567 | david-sarah@jacaranda.org**20110204204902 |
---|
568 | Ignore-this: 85ef118a48453d93fa4cddc32d65b25b |
---|
569 | ] |
---|
570 | [relnotes.txt: forseeable -> foreseeable. refs #1342 |
---|
571 | david-sarah@jacaranda.org**20110204204116 |
---|
572 | Ignore-this: 746debc4d82f4031ebf75ab4031b3a9 |
---|
573 | ] |
---|
574 | [replace remaining .html docs with .rst docs |
---|
575 | zooko@zooko.com**20110510191650 |
---|
576 | Ignore-this: d557d960a986d4ac8216d1677d236399 |
---|
577 | Remove install.html (long since deprecated). |
---|
578 | Also replace some obsolete references to install.html with references to quickstart.rst. |
---|
579 | Fix some broken internal references within docs/historical/historical_known_issues.txt. |
---|
580 | Thanks to Ravi Pinjala and Patrick McDonald. |
---|
581 | refs #1227 |
---|
582 | ] |
---|
583 | [docs: FTP-and-SFTP.rst: fix a minor error and update the information about which version of Twisted fixes #1297 |
---|
584 | zooko@zooko.com**20110428055232 |
---|
585 | Ignore-this: b63cfb4ebdbe32fb3b5f885255db4d39 |
---|
586 | ] |
---|
587 | [munin tahoe_files plugin: fix incorrect file count |
---|
588 | francois@ctrlaltdel.ch**20110428055312 |
---|
589 | Ignore-this: 334ba49a0bbd93b4a7b06a25697aba34 |
---|
590 | fixes #1391 |
---|
591 | ] |
---|
592 | [corrected "k must never be smaller than N" to "k must never be greater than N" |
---|
593 | secorp@allmydata.org**20110425010308 |
---|
594 | Ignore-this: 233129505d6c70860087f22541805eac |
---|
595 | ] |
---|
596 | [Fix a test failure in test_package_initialization on Python 2.4.x due to exceptions being stringified differently than in later versions of Python. refs #1389 |
---|
597 | david-sarah@jacaranda.org**20110411190738 |
---|
598 | Ignore-this: 7847d26bc117c328c679f08a7baee519 |
---|
599 | ] |
---|
600 | [tests: add test for including the ImportError message and traceback entry in the summary of errors from importing dependencies. refs #1389 |
---|
601 | david-sarah@jacaranda.org**20110410155844 |
---|
602 | Ignore-this: fbecdbeb0d06a0f875fe8d4030aabafa |
---|
603 | ] |
---|
604 | [allmydata/__init__.py: preserve the message and last traceback entry (file, line number, function, and source line) of ImportErrors in the package versions string. fixes #1389 |
---|
605 | david-sarah@jacaranda.org**20110410155705 |
---|
606 | Ignore-this: 2f87b8b327906cf8bfca9440a0904900 |
---|
607 | ] |
---|
608 | [remove unused variable detected by pyflakes |
---|
609 | zooko@zooko.com**20110407172231 |
---|
610 | Ignore-this: 7344652d5e0720af822070d91f03daf9 |
---|
611 | ] |
---|
612 | [allmydata/__init__.py: Nicer reporting of unparseable version numbers in dependencies. fixes #1388 |
---|
613 | david-sarah@jacaranda.org**20110401202750 |
---|
614 | Ignore-this: 9c6bd599259d2405e1caadbb3e0d8c7f |
---|
615 | ] |
---|
616 | [update FTP-and-SFTP.rst: the necessary patch is included in Twisted-10.1 |
---|
617 | Brian Warner <warner@lothar.com>**20110325232511 |
---|
618 | Ignore-this: d5307faa6900f143193bfbe14e0f01a |
---|
619 | ] |
---|
620 | [control.py: remove all uses of s.get_serverid() |
---|
621 | warner@lothar.com**20110227011203 |
---|
622 | Ignore-this: f80a787953bd7fa3d40e828bde00e855 |
---|
623 | ] |
---|
624 | [web: remove some uses of s.get_serverid(), not all |
---|
625 | warner@lothar.com**20110227011159 |
---|
626 | Ignore-this: a9347d9cf6436537a47edc6efde9f8be |
---|
627 | ] |
---|
628 | [immutable/downloader/fetcher.py: remove all get_serverid() calls |
---|
629 | warner@lothar.com**20110227011156 |
---|
630 | Ignore-this: fb5ef018ade1749348b546ec24f7f09a |
---|
631 | ] |
---|
632 | [immutable/downloader/fetcher.py: fix diversity bug in server-response handling |
---|
633 | warner@lothar.com**20110227011153 |
---|
634 | Ignore-this: bcd62232c9159371ae8a16ff63d22c1b |
---|
635 | |
---|
636 | When blocks terminate (either COMPLETE or CORRUPT/DEAD/BADSEGNUM), the |
---|
637 | _shares_from_server dict was being popped incorrectly (using shnum as the |
---|
638 | index instead of serverid). I'm still thinking through the consequences of |
---|
639 | this bug. It was probably benign and really hard to detect. I think it would |
---|
640 | cause us to incorrectly believe that we're pulling too many shares from a |
---|
641 | server, and thus prefer a different server rather than asking for a second |
---|
642 | share from the first server. The diversity code is intended to spread out the |
---|
643 | number of shares simultaneously being requested from each server, but with |
---|
644 | this bug, it might be spreading out the total number of shares requested at |
---|
645 | all, not just simultaneously. (note that SegmentFetcher is scoped to a single |
---|
646 | segment, so the effect doesn't last very long). |
---|
647 | ] |
---|
648 | [immutable/downloader/share.py: reduce get_serverid(), one left, update ext deps |
---|
649 | warner@lothar.com**20110227011150 |
---|
650 | Ignore-this: d8d56dd8e7b280792b40105e13664554 |
---|
651 | |
---|
652 | test_download.py: create+check MyShare instances better, make sure they share |
---|
653 | Server objects, now that finder.py cares |
---|
654 | ] |
---|
655 | [immutable/downloader/finder.py: reduce use of get_serverid(), one left |
---|
656 | warner@lothar.com**20110227011146 |
---|
657 | Ignore-this: 5785be173b491ae8a78faf5142892020 |
---|
658 | ] |
---|
659 | [immutable/offloaded.py: reduce use of get_serverid() a bit more |
---|
660 | warner@lothar.com**20110227011142 |
---|
661 | Ignore-this: b48acc1b2ae1b311da7f3ba4ffba38f |
---|
662 | ] |
---|
663 | [immutable/upload.py: reduce use of get_serverid() |
---|
664 | warner@lothar.com**20110227011138 |
---|
665 | Ignore-this: ffdd7ff32bca890782119a6e9f1495f6 |
---|
666 | ] |
---|
667 | [immutable/checker.py: remove some uses of s.get_serverid(), not all |
---|
668 | warner@lothar.com**20110227011134 |
---|
669 | Ignore-this: e480a37efa9e94e8016d826c492f626e |
---|
670 | ] |
---|
671 | [add remaining get_* methods to storage_client.Server, NoNetworkServer, and |
---|
672 | warner@lothar.com**20110227011132 |
---|
673 | Ignore-this: 6078279ddf42b179996a4b53bee8c421 |
---|
674 | MockIServer stubs |
---|
675 | ] |
---|
676 | [upload.py: rearrange _make_trackers a bit, no behavior changes |
---|
677 | warner@lothar.com**20110227011128 |
---|
678 | Ignore-this: 296d4819e2af452b107177aef6ebb40f |
---|
679 | ] |
---|
680 | [happinessutil.py: finally rename merge_peers to merge_servers |
---|
681 | warner@lothar.com**20110227011124 |
---|
682 | Ignore-this: c8cd381fea1dd888899cb71e4f86de6e |
---|
683 | ] |
---|
684 | [test_upload.py: factor out FakeServerTracker |
---|
685 | warner@lothar.com**20110227011120 |
---|
686 | Ignore-this: 6c182cba90e908221099472cc159325b |
---|
687 | ] |
---|
688 | [test_upload.py: server-vs-tracker cleanup |
---|
689 | warner@lothar.com**20110227011115 |
---|
690 | Ignore-this: 2915133be1a3ba456e8603885437e03 |
---|
691 | ] |
---|
692 | [happinessutil.py: server-vs-tracker cleanup |
---|
693 | warner@lothar.com**20110227011111 |
---|
694 | Ignore-this: b856c84033562d7d718cae7cb01085a9 |
---|
695 | ] |
---|
696 | [upload.py: more tracker-vs-server cleanup |
---|
697 | warner@lothar.com**20110227011107 |
---|
698 | Ignore-this: bb75ed2afef55e47c085b35def2de315 |
---|
699 | ] |
---|
700 | [upload.py: fix var names to avoid confusion between 'trackers' and 'servers' |
---|
701 | warner@lothar.com**20110227011103 |
---|
702 | Ignore-this: 5d5e3415b7d2732d92f42413c25d205d |
---|
703 | ] |
---|
704 | [refactor: s/peer/server/ in immutable/upload, happinessutil.py, test_upload |
---|
705 | warner@lothar.com**20110227011100 |
---|
706 | Ignore-this: 7ea858755cbe5896ac212a925840fe68 |
---|
707 | |
---|
708 | No behavioral changes, just updating variable/method names and log messages. |
---|
709 | The effects outside these three files should be minimal: some exception |
---|
710 | messages changed (to say "server" instead of "peer"), and some internal class |
---|
711 | names were changed. A few things still use "peer" to minimize external |
---|
712 | changes, like UploadResults.timings["peer_selection"] and |
---|
713 | happinessutil.merge_peers, which can be changed later. |
---|
714 | ] |
---|
715 | [storage_client.py: clean up test_add_server/test_add_descriptor, remove .test_servers |
---|
716 | warner@lothar.com**20110227011056 |
---|
717 | Ignore-this: efad933e78179d3d5fdcd6d1ef2b19cc |
---|
718 | ] |
---|
719 | [test_client.py, upload.py:: remove KiB/MiB/etc constants, and other dead code |
---|
720 | warner@lothar.com**20110227011051 |
---|
721 | Ignore-this: dc83c5794c2afc4f81e592f689c0dc2d |
---|
722 | ] |
---|
723 | [test: increase timeout on a network test because Francois's ARM machine hit that timeout |
---|
724 | zooko@zooko.com**20110317165909 |
---|
725 | Ignore-this: 380c345cdcbd196268ca5b65664ac85b |
---|
726 | I'm skeptical that the test was proceeding correctly but ran out of time. It seems more likely that it had gotten hung. But if we raise the timeout to an even more extravagant number then we can be even more certain that the test was never going to finish. |
---|
727 | ] |
---|
728 | [docs/configuration.rst: add a "Frontend Configuration" section |
---|
729 | Brian Warner <warner@lothar.com>**20110222014323 |
---|
730 | Ignore-this: 657018aa501fe4f0efef9851628444ca |
---|
731 | |
---|
732 | this points to docs/frontends/*.rst, which were previously underlinked |
---|
733 | ] |
---|
734 | [web/filenode.py: avoid calling req.finish() on closed HTTP connections. Closes #1366 |
---|
735 | "Brian Warner <warner@lothar.com>"**20110221061544 |
---|
736 | Ignore-this: 799d4de19933f2309b3c0c19a63bb888 |
---|
737 | ] |
---|
738 | [Add unit tests for cross_check_pkg_resources_versus_import, and a regression test for ref #1355. This requires a little refactoring to make it testable. |
---|
739 | david-sarah@jacaranda.org**20110221015817 |
---|
740 | Ignore-this: 51d181698f8c20d3aca58b057e9c475a |
---|
741 | ] |
---|
742 | [allmydata/__init__.py: .name was used in place of the correct .__name__ when printing an exception. Also, robustify string formatting by using %r instead of %s in some places. fixes #1355. |
---|
743 | david-sarah@jacaranda.org**20110221020125 |
---|
744 | Ignore-this: b0744ed58f161bf188e037bad077fc48 |
---|
745 | ] |
---|
746 | [Refactor StorageFarmBroker handling of servers |
---|
747 | Brian Warner <warner@lothar.com>**20110221015804 |
---|
748 | Ignore-this: 842144ed92f5717699b8f580eab32a51 |
---|
749 | |
---|
750 | Pass around IServer instance instead of (peerid, rref) tuple. Replace |
---|
751 | "descriptor" with "server". Other replacements: |
---|
752 | |
---|
753 | get_all_servers -> get_connected_servers/get_known_servers |
---|
754 | get_servers_for_index -> get_servers_for_psi (now returns IServers) |
---|
755 | |
---|
756 | This change still needs to be pushed further down: lots of code is now |
---|
757 | getting the IServer and then distributing (peerid, rref) internally. |
---|
758 | Instead, it ought to distribute the IServer internally and delay |
---|
759 | extracting a serverid or rref until the last moment. |
---|
760 | |
---|
761 | no_network.py was updated to retain parallelism. |
---|
762 | ] |
---|
763 | [TAG allmydata-tahoe-1.8.2 |
---|
764 | warner@lothar.com**20110131020101] |
---|
765 | Patch bundle hash: |
---|
766 | efe0c98a1d9821c80fc1daf621ba59a567412256 |
---|