Merge lp:~mbp/duplicity/433970-non-ssl into lp:~duplicity-team/duplicity/0.7-series
- 433970-non-ssl
- Merge into 0.7-series
Proposed by
Martin Pool
Status: | Rejected |
---|---|
Rejected by: | Kenneth Loafman |
Proposed branch: | lp:~mbp/duplicity/433970-non-ssl |
Merge into: | lp:~duplicity-team/duplicity/0.7-series |
Diff against target: |
923 lines (+362/-16) (has conflicts) 7 files modified
CHANGELOG (+19/-0) dist/setup.py (+1/-1) duplicity.1 (+15/-1) duplicity/backends/botobackend.py (+19/-13) duplicity/commandline.py (+20/-1) duplicity/globals.py (+4/-0) po/duplicity.pot (+284/-0) Text conflict in CHANGELOG Text conflict in duplicity/commandline.py Text conflict in po/duplicity.pot |
To merge this branch: | bzr merge lp:~mbp/duplicity/433970-non-ssl |
Related bugs: |
Reviewer | Review Type | Date Requested | Status |
---|---|---|---|
duplicity-team | Pending | ||
Review via email: mp+38303@code.launchpad.net |
Commit message
Description of the change
Hi, this fixes bug 433970 by adding an --s3-unencrypte
I have tried to add it tastefully with the existing options.
I haven't added a test; if you like to have tests for this kind of thing and can point me to a good example I would be happy to try.
I think the warning in the manpage about this is accurate.
Thanks!
To post a comment you must log in.
Revision history for this message
Martin Pool (mbp) wrote : | # |
Unmerged revisions
Preview Diff
[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1 | === modified file 'CHANGELOG' |
2 | --- CHANGELOG 2010-08-26 14:55:22 +0000 |
3 | +++ CHANGELOG 2010-10-13 07:44:44 +0000 |
4 | @@ -1,3 +1,4 @@ |
5 | +<<<<<<< TREE |
6 | New in v0.7.00 (2010/08/??) |
7 | --------------------------- |
8 | 422477 [PATCH] IMAP Backend Error in delete() |
9 | @@ -9,6 +10,24 @@ |
10 | |
11 | New in v0.6.09 (2010/05/??) |
12 | ---------------------------- |
13 | +======= |
14 | +New in v0.6.10 (2010/09/19) |
15 | +---------------------------- |
16 | +Bugs closed in this release: |
17 | +542482 Offer command to remove old incremental backups from target |
18 | +578663 Use log codes for common backend errors |
19 | +589495 duplicity --short-filenames crashes with TypeError |
20 | +612714 NameError: global name 'parsed_url' is not defined |
21 | +613448 ftpbackend fails if target directory doesn't exist |
22 | +615449 Command-line verbosity parsing crash |
23 | + |
24 | + |
25 | +New in v0.6.09 (2010/07/25) |
26 | +---------------------------- |
27 | +Bugs closed in this release: |
28 | +502609 Unknown error while uploading duplicity-full-signatures |
29 | +539393 Duplicity returns 1 when continuing an interrupted backup |
30 | +>>>>>>> MERGE-SOURCE |
31 | 550455 duplicity doesn't handle with large files well |
32 | 579958 Assertion error "time not moving forward at appropriate pace" |
33 | 576564 username not url decoded in backend (at least rsync) |
34 | |
35 | === modified file 'dist/setup.py' |
36 | --- dist/setup.py 2010-07-22 19:15:11 +0000 |
37 | +++ dist/setup.py 2010-10-13 07:44:44 +0000 |
38 | @@ -26,7 +26,7 @@ |
39 | version_string = "$version" |
40 | |
41 | if sys.version_info[:2] < (2,3): |
42 | - print "Sorry, duplicity requires version 2.3 or later of python" |
43 | + print "Sorry, duplicity requires version 2.4 or later of python" |
44 | sys.exit(1) |
45 | |
46 | incdir_list = libdir_list = None |
47 | |
48 | === modified file 'duplicity.1' |
49 | --- duplicity.1 2010-08-26 14:55:22 +0000 |
50 | +++ duplicity.1 2010-10-13 07:44:44 +0000 |
51 | @@ -555,12 +555,26 @@ |
52 | section. |
53 | |
54 | .TP |
55 | +.BI "--s3-unencrypted-connection" |
56 | +Don't use SSL for connections to S3. |
57 | + |
58 | +This may be much faster, at some cost to confidentiality. |
59 | + |
60 | +With this option, anyone who can observe traffic between your computer and S3 |
61 | +will be able to tell: that you are using Duplicity, the name of the bucket, |
62 | +your AWS Access Key ID, the increment dates and the amount of data in each |
63 | +increment. |
64 | + |
65 | +This option affects only the connection, not the GPG encryption of the backup |
66 | +increment files. Unless that is disabled, an observer will not be able to see |
67 | +the file names or contents. |
68 | + |
69 | +.TP |
70 | .BI "--s3-use-new-style" |
71 | When operating on Amazon S3 buckets, use new-style subdomain bucket |
72 | addressing. This is now the preferred method to access Amazon S3, but |
73 | is not backwards compatible if your bucket name contains upper-case |
74 | characters or other characters that are not valid in a hostname. |
75 | - |
76 | .TP |
77 | .BI "--scp-command " command |
78 | This option only matters when using the ssh/scp backend. The |
79 | |
80 | === modified file 'duplicity/backends/botobackend.py' |
81 | --- duplicity/backends/botobackend.py 2010-08-26 14:55:22 +0000 |
82 | +++ duplicity/backends/botobackend.py 2010-10-13 07:44:44 +0000 |
83 | @@ -48,7 +48,7 @@ |
84 | # //MyBucket/ and //MyBucket are equivalent. |
85 | # //MyBucket//My///My/Prefix/ and //MyBucket/My/Prefix are equivalent. |
86 | self.url_parts = filter(lambda x: x != '', parsed_url.path.split('/')) |
87 | - |
88 | + |
89 | if self.url_parts: |
90 | self.bucket_name = self.url_parts.pop(0) |
91 | else: |
92 | @@ -66,12 +66,13 @@ |
93 | self.key_prefix = '' |
94 | |
95 | self.straight_url = duplicity.backend.strip_auth_from_url(parsed_url) |
96 | + self.parsed_url = parsed_url |
97 | self.resetConnection() |
98 | |
99 | def resetConnection(self): |
100 | self.bucket = None |
101 | self.conn = None |
102 | - |
103 | + |
104 | try: |
105 | from boto.s3.connection import S3Connection |
106 | from boto.s3.key import Key |
107 | @@ -132,10 +133,12 @@ |
108 | log.ErrorCode.boto_lib_too_old) |
109 | if self.scheme == 's3+http': |
110 | # Use the default Amazon S3 host. |
111 | - self.conn = S3Connection() |
112 | + self.conn = S3Connection(is_secure=(not globals.s3_unencrypted_connection)) |
113 | else: |
114 | assert self.scheme == 's3' |
115 | - self.conn = S3Connection(host=parsed_url.hostname) |
116 | + self.conn = S3Connection( |
117 | + host=self.parsed_url.hostname, |
118 | + is_secure=(not globals.s3_unencrypted_connection)) |
119 | |
120 | if hasattr(self.conn, 'calling_format'): |
121 | if calling_format is None: |
122 | @@ -152,7 +155,7 @@ |
123 | raise BackendException('Boto requires a bucket name.') |
124 | |
125 | self.bucket = self.conn.lookup(self.bucket_name) |
126 | - |
127 | + |
128 | def put(self, source_path, remote_filename=None): |
129 | #Network glitch may prevent first few attempts of creating/looking up a bucket |
130 | for n in range(1, globals.num_retries+1): |
131 | @@ -160,7 +163,7 @@ |
132 | break |
133 | if n > 1: |
134 | time.sleep(30) |
135 | - try: |
136 | + try: |
137 | if globals.s3_european_buckets: |
138 | if not globals.s3_use_new_style: |
139 | log.FatalError("European bucket creation was requested, but not new-style " |
140 | @@ -168,7 +171,7 @@ |
141 | log.ErrorCode.s3_bucket_not_style) |
142 | from boto.s3.connection import Location #@UnresolvedImport |
143 | self.bucket = self.conn.create_bucket(self.bucket_name, location = Location.EU) |
144 | - else: |
145 | + else: |
146 | self.bucket = self.conn.create_bucket(self.bucket_name) |
147 | except Exception, e: |
148 | log.Warn("Failed to create bucket (attempt #%d) '%s' failed (reason: %s: %s)" |
149 | @@ -176,7 +179,7 @@ |
150 | e.__class__.__name__, |
151 | str(e))) |
152 | self.resetConnection() |
153 | - |
154 | + |
155 | if not remote_filename: |
156 | remote_filename = source_path.get_filename() |
157 | key = self.key_class(self.bucket) |
158 | @@ -185,12 +188,15 @@ |
159 | if n > 1: |
160 | # sleep before retry (new connection to a **hopeful** new host, so no need to wait so long) |
161 | time.sleep(10) |
162 | - |
163 | - log.Info("Uploading %s/%s to %s Storage" % (self.straight_url, remote_filename, |
164 | - 'REDUCED_REDUNDANCY' if globals.s3_use_rrs else 'STANDARD')) |
165 | + |
166 | + if globals.s3_use_rrs: |
167 | + storage_class = 'REDUCED_REDUNDANCY' |
168 | + else: |
169 | + storage_class = 'STANDARD' |
170 | + log.Info("Uploading %s/%s to %s Storage" % (self.straight_url, remote_filename, storage_class)) |
171 | try: |
172 | - key.set_contents_from_filename(source_path.name, {'Content-Type': 'application/octet-stream', |
173 | - 'x-amz-storage-class': 'REDUCED_REDUNDANCY' if globals.s3_use_rrs else 'STANDARD'}) |
174 | + key.set_contents_from_filename(source_path.name, {'Content-Type': 'application/octet-stream', |
175 | + 'x-amz-storage-class': storage_class}) |
176 | key.close() |
177 | self.resetConnection() |
178 | return |
179 | |
180 | === modified file 'duplicity/commandline.py' |
181 | --- duplicity/commandline.py 2010-08-26 14:55:22 +0000 |
182 | +++ duplicity/commandline.py 2010-10-13 07:44:44 +0000 |
183 | @@ -315,11 +315,16 @@ |
184 | # likely that you are able to restore data under problematic |
185 | # circumstances. the default should absolutely always be False unless |
186 | # you know what you are doing. |
187 | +<<<<<<< TREE |
188 | parser.add_option("--ignore-errors", action="callback", |
189 | +======= |
190 | + parser.add_option("--ignore-errors", action="callback", |
191 | + dest="ignore_errors", |
192 | +>>>>>>> MERGE-SOURCE |
193 | callback=lambda o, s, v, p: (log.Warn( |
194 | _("Running in 'ignore errors' mode due to %s; please " |
195 | "re-consider if this was not intended") % s), |
196 | - setattr(p.values, o.dest, True))) |
197 | + setattr(p.values, "ignore errors", True))) |
198 | |
199 | # Whether to use the full email address as the user name when |
200 | # logging into an imap server. If false just the user name |
201 | @@ -371,7 +376,12 @@ |
202 | parser.add_option("--num-retries", type="int", metavar=_("number")) |
203 | |
204 | # Whether the old filename format is in effect. |
205 | +<<<<<<< TREE |
206 | parser.add_option("--old-filenames", action="callback", |
207 | +======= |
208 | + parser.add_option("--old-filenames", action="callback", |
209 | + dest="old_filenames", |
210 | +>>>>>>> MERGE-SOURCE |
211 | callback=lambda o, s, v, p: (setattr(p.values, o.dest, True), |
212 | old_fn_deprecation(s))) |
213 | |
214 | @@ -397,6 +407,10 @@ |
215 | # that are otherwise not expressable in a valid hostname. |
216 | parser.add_option("--s3-use-new-style", action="store_true") |
217 | |
218 | + # Whether to use plain HTTP (without SSL) to send data to S3 |
219 | + # See <https://bugs.launchpad.net/duplicity/+bug/433970>. |
220 | + parser.add_option("--s3-unencrypted-connection", action="store_true") |
221 | + |
222 | # scp command to use |
223 | # TRANSL: noun |
224 | parser.add_option("--scp-command", metavar=_("command")) |
225 | @@ -406,7 +420,12 @@ |
226 | parser.add_option("--sftp-command", metavar=_("command")) |
227 | |
228 | # If set, use short (< 30 char) filenames for all the remote files. |
229 | +<<<<<<< TREE |
230 | parser.add_option("--short-filenames", action="callback", |
231 | +======= |
232 | + parser.add_option("--short-filenames", action="callback", |
233 | + dest="short_filenames", |
234 | +>>>>>>> MERGE-SOURCE |
235 | callback=lambda o, s, v, p: (setattr(p.values, o.dest, True), |
236 | old_fn_deprecation(s))) |
237 | |
238 | |
239 | === modified file 'duplicity/globals.py' |
240 | --- duplicity/globals.py 2010-08-26 14:55:22 +0000 |
241 | +++ duplicity/globals.py 2010-10-13 07:44:44 +0000 |
242 | @@ -151,6 +151,10 @@ |
243 | # support european for now). |
244 | s3_european_buckets = False |
245 | |
246 | +# Whether to use plain HTTP (without SSL) to send data to S3 |
247 | +# See <https://bugs.launchpad.net/duplicity/+bug/433970>. |
248 | +s3_unencrypted_connection = False |
249 | + |
250 | # Whether to use S3 Reduced Redudancy Storage |
251 | s3_use_rrs = False |
252 | |
253 | |
254 | === modified file 'po/duplicity.pot' |
255 | --- po/duplicity.pot 2010-08-26 14:55:22 +0000 |
256 | +++ po/duplicity.pot 2010-10-13 07:44:44 +0000 |
257 | @@ -8,7 +8,11 @@ |
258 | msgstr "" |
259 | "Project-Id-Version: PACKAGE VERSION\n" |
260 | "Report-Msgid-Bugs-To: Kenneth Loafman <kenneth@loafman.com>\n" |
261 | +<<<<<<< TREE |
262 | "POT-Creation-Date: 2010-08-26 09:41-0500\n" |
263 | +======= |
264 | +"POT-Creation-Date: 2010-09-19 11:18-0500\n" |
265 | +>>>>>>> MERGE-SOURCE |
266 | "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" |
267 | "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" |
268 | "Language-Team: LANGUAGE <LL@li.org>\n" |
269 | @@ -17,211 +21,375 @@ |
270 | "Content-Transfer-Encoding: 8bit\n" |
271 | "Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n" |
272 | |
273 | +<<<<<<< TREE |
274 | #: ../duplicity-bin:193 |
275 | +======= |
276 | +#: ../duplicity-bin:191 |
277 | +>>>>>>> MERGE-SOURCE |
278 | #, python-format |
279 | msgid "" |
280 | "Unable to locate last file %s and block %d in backup set.\n" |
281 | "Attempting restart on the next file %s." |
282 | msgstr "" |
283 | |
284 | +<<<<<<< TREE |
285 | #: ../duplicity-bin:199 |
286 | +======= |
287 | +#: ../duplicity-bin:197 |
288 | +>>>>>>> MERGE-SOURCE |
289 | #, python-format |
290 | msgid "" |
291 | "Unable to locate last file %s and block %d in backup set.\n" |
292 | "There are no more files to be backed up." |
293 | msgstr "" |
294 | |
295 | +<<<<<<< TREE |
296 | #: ../duplicity-bin:462 |
297 | +======= |
298 | +#: ../duplicity-bin:443 |
299 | +>>>>>>> MERGE-SOURCE |
300 | msgid "" |
301 | "Fatal Error: Unable to start incremental backup. Old signatures not found " |
302 | "and incremental specified" |
303 | msgstr "" |
304 | |
305 | +<<<<<<< TREE |
306 | #: ../duplicity-bin:466 |
307 | +======= |
308 | +#: ../duplicity-bin:447 |
309 | +>>>>>>> MERGE-SOURCE |
310 | msgid "No signatures found, switching to full backup." |
311 | msgstr "" |
312 | |
313 | +<<<<<<< TREE |
314 | #: ../duplicity-bin:480 |
315 | +======= |
316 | +#: ../duplicity-bin:461 |
317 | +>>>>>>> MERGE-SOURCE |
318 | msgid "Backup Statistics" |
319 | msgstr "" |
320 | |
321 | +<<<<<<< TREE |
322 | #: ../duplicity-bin:560 |
323 | +======= |
324 | +#: ../duplicity-bin:541 |
325 | +>>>>>>> MERGE-SOURCE |
326 | #, python-format |
327 | msgid "%s not found in archive, no files restored." |
328 | msgstr "" |
329 | |
330 | +<<<<<<< TREE |
331 | #: ../duplicity-bin:564 |
332 | +======= |
333 | +#: ../duplicity-bin:545 |
334 | +>>>>>>> MERGE-SOURCE |
335 | msgid "No files found in archive - nothing restored." |
336 | msgstr "" |
337 | |
338 | +<<<<<<< TREE |
339 | #: ../duplicity-bin:597 |
340 | +======= |
341 | +#: ../duplicity-bin:578 |
342 | +>>>>>>> MERGE-SOURCE |
343 | #, python-format |
344 | msgid "Processed volume %d of %d" |
345 | msgstr "" |
346 | |
347 | +<<<<<<< TREE |
348 | #: ../duplicity-bin:637 |
349 | +======= |
350 | +#: ../duplicity-bin:618 |
351 | +>>>>>>> MERGE-SOURCE |
352 | #, python-format |
353 | msgid "Invalid data - %s hash mismatch:" |
354 | msgstr "" |
355 | |
356 | +<<<<<<< TREE |
357 | #: ../duplicity-bin:638 |
358 | +======= |
359 | +#: ../duplicity-bin:619 |
360 | +>>>>>>> MERGE-SOURCE |
361 | #, python-format |
362 | msgid "Calculated hash: %s" |
363 | msgstr "" |
364 | |
365 | +<<<<<<< TREE |
366 | #: ../duplicity-bin:639 |
367 | +======= |
368 | +#: ../duplicity-bin:620 |
369 | +>>>>>>> MERGE-SOURCE |
370 | #, python-format |
371 | msgid "Manifest hash: %s" |
372 | msgstr "" |
373 | |
374 | +<<<<<<< TREE |
375 | #: ../duplicity-bin:656 |
376 | +======= |
377 | +#: ../duplicity-bin:637 |
378 | +>>>>>>> MERGE-SOURCE |
379 | #, python-format |
380 | msgid "Volume was signed by key %s, not %s" |
381 | msgstr "" |
382 | |
383 | +<<<<<<< TREE |
384 | #: ../duplicity-bin:686 |
385 | +======= |
386 | +#: ../duplicity-bin:667 |
387 | +>>>>>>> MERGE-SOURCE |
388 | #, python-format |
389 | msgid "Verify complete: %s, %s." |
390 | msgstr "" |
391 | |
392 | +<<<<<<< TREE |
393 | #: ../duplicity-bin:687 |
394 | +======= |
395 | +#: ../duplicity-bin:668 |
396 | +>>>>>>> MERGE-SOURCE |
397 | #, python-format |
398 | msgid "%d file compared" |
399 | msgid_plural "%d files compared" |
400 | msgstr[0] "" |
401 | msgstr[1] "" |
402 | |
403 | +<<<<<<< TREE |
404 | #: ../duplicity-bin:689 |
405 | +======= |
406 | +#: ../duplicity-bin:670 |
407 | +>>>>>>> MERGE-SOURCE |
408 | #, python-format |
409 | msgid "%d difference found" |
410 | msgid_plural "%d differences found" |
411 | msgstr[0] "" |
412 | msgstr[1] "" |
413 | |
414 | +<<<<<<< TREE |
415 | #: ../duplicity-bin:708 |
416 | +======= |
417 | +#: ../duplicity-bin:689 |
418 | +>>>>>>> MERGE-SOURCE |
419 | msgid "No extraneous files found, nothing deleted in cleanup." |
420 | msgstr "" |
421 | |
422 | +<<<<<<< TREE |
423 | #: ../duplicity-bin:713 |
424 | +======= |
425 | +#: ../duplicity-bin:694 |
426 | +>>>>>>> MERGE-SOURCE |
427 | msgid "Deleting this file from backend:" |
428 | msgid_plural "Deleting these files from backend:" |
429 | msgstr[0] "" |
430 | msgstr[1] "" |
431 | |
432 | +<<<<<<< TREE |
433 | #: ../duplicity-bin:722 |
434 | +======= |
435 | +#: ../duplicity-bin:703 |
436 | +>>>>>>> MERGE-SOURCE |
437 | msgid "Found the following file to delete:" |
438 | msgid_plural "Found the following files to delete:" |
439 | msgstr[0] "" |
440 | msgstr[1] "" |
441 | |
442 | +<<<<<<< TREE |
443 | #: ../duplicity-bin:726 |
444 | +======= |
445 | +#: ../duplicity-bin:707 |
446 | +>>>>>>> MERGE-SOURCE |
447 | msgid "Run duplicity again with the --force option to actually delete." |
448 | msgstr "" |
449 | |
450 | +<<<<<<< TREE |
451 | #: ../duplicity-bin:765 |
452 | +======= |
453 | +#: ../duplicity-bin:746 |
454 | +>>>>>>> MERGE-SOURCE |
455 | msgid "There are backup set(s) at time(s):" |
456 | msgstr "" |
457 | |
458 | +<<<<<<< TREE |
459 | #: ../duplicity-bin:767 |
460 | +======= |
461 | +#: ../duplicity-bin:748 |
462 | +>>>>>>> MERGE-SOURCE |
463 | msgid "Which can't be deleted because newer sets depend on them." |
464 | msgstr "" |
465 | |
466 | +<<<<<<< TREE |
467 | #: ../duplicity-bin:771 |
468 | +======= |
469 | +#: ../duplicity-bin:752 |
470 | +>>>>>>> MERGE-SOURCE |
471 | msgid "" |
472 | "Current active backup chain is older than specified time. However, it will " |
473 | "not be deleted. To remove all your backups, manually purge the repository." |
474 | msgstr "" |
475 | |
476 | +<<<<<<< TREE |
477 | #: ../duplicity-bin:777 |
478 | +======= |
479 | +#: ../duplicity-bin:758 |
480 | +>>>>>>> MERGE-SOURCE |
481 | msgid "No old backup sets found, nothing deleted." |
482 | msgstr "" |
483 | |
484 | +<<<<<<< TREE |
485 | #: ../duplicity-bin:780 |
486 | +======= |
487 | +#: ../duplicity-bin:761 |
488 | +>>>>>>> MERGE-SOURCE |
489 | msgid "Deleting backup set at time:" |
490 | msgid_plural "Deleting backup sets at times:" |
491 | msgstr[0] "" |
492 | msgstr[1] "" |
493 | |
494 | +<<<<<<< TREE |
495 | #: ../duplicity-bin:797 |
496 | +======= |
497 | +#: ../duplicity-bin:778 |
498 | +>>>>>>> MERGE-SOURCE |
499 | msgid "Found old backup set at the following time:" |
500 | msgid_plural "Found old backup sets at the following times:" |
501 | msgstr[0] "" |
502 | msgstr[1] "" |
503 | |
504 | +<<<<<<< TREE |
505 | #: ../duplicity-bin:801 |
506 | +======= |
507 | +#: ../duplicity-bin:782 |
508 | +>>>>>>> MERGE-SOURCE |
509 | msgid "Rerun command with --force option to actually delete." |
510 | msgstr "" |
511 | |
512 | +<<<<<<< TREE |
513 | #: ../duplicity-bin:888 |
514 | +======= |
515 | +#: ../duplicity-bin:865 |
516 | +>>>>>>> MERGE-SOURCE |
517 | #, python-format |
518 | msgid "Deleting local %s (not authoritative at backend)." |
519 | msgstr "" |
520 | |
521 | +<<<<<<< TREE |
522 | #: ../duplicity-bin:913 ../duplicity/dup_temp.py:239 |
523 | +======= |
524 | +#: ../duplicity-bin:890 ../duplicity/dup_temp.py:239 |
525 | +>>>>>>> MERGE-SOURCE |
526 | #, python-format |
527 | msgid "Failed to read %s: %s" |
528 | msgstr "" |
529 | |
530 | +<<<<<<< TREE |
531 | #: ../duplicity-bin:924 |
532 | +======= |
533 | +#: ../duplicity-bin:901 |
534 | +>>>>>>> MERGE-SOURCE |
535 | #, python-format |
536 | msgid "Copying %s to local cache." |
537 | msgstr "" |
538 | |
539 | +<<<<<<< TREE |
540 | #: ../duplicity-bin:965 |
541 | +======= |
542 | +#: ../duplicity-bin:942 |
543 | +>>>>>>> MERGE-SOURCE |
544 | msgid "Local and Remote metadata are synchronized, no sync needed." |
545 | msgstr "" |
546 | |
547 | +<<<<<<< TREE |
548 | #: ../duplicity-bin:970 |
549 | +======= |
550 | +#: ../duplicity-bin:947 |
551 | +>>>>>>> MERGE-SOURCE |
552 | msgid "Synchronizing remote metadata to local cache..." |
553 | msgstr "" |
554 | |
555 | +<<<<<<< TREE |
556 | #: ../duplicity-bin:979 |
557 | +======= |
558 | +#: ../duplicity-bin:956 |
559 | +>>>>>>> MERGE-SOURCE |
560 | msgid "Sync would copy the following from remote to local:" |
561 | msgstr "" |
562 | |
563 | +<<<<<<< TREE |
564 | #: ../duplicity-bin:982 |
565 | +======= |
566 | +#: ../duplicity-bin:959 |
567 | +>>>>>>> MERGE-SOURCE |
568 | msgid "Sync would remove the following spurious local files:" |
569 | msgstr "" |
570 | |
571 | +<<<<<<< TREE |
572 | #: ../duplicity-bin:1025 |
573 | +======= |
574 | +#: ../duplicity-bin:1002 |
575 | +>>>>>>> MERGE-SOURCE |
576 | msgid "Unable to get free space on temp." |
577 | msgstr "" |
578 | |
579 | +<<<<<<< TREE |
580 | #: ../duplicity-bin:1033 |
581 | +======= |
582 | +#: ../duplicity-bin:1010 |
583 | +>>>>>>> MERGE-SOURCE |
584 | #, python-format |
585 | msgid "Temp space has %d available, backup needs approx %d." |
586 | msgstr "" |
587 | |
588 | +<<<<<<< TREE |
589 | #: ../duplicity-bin:1036 |
590 | +======= |
591 | +#: ../duplicity-bin:1013 |
592 | +>>>>>>> MERGE-SOURCE |
593 | #, python-format |
594 | msgid "Temp has %d available, backup will use approx %d." |
595 | msgstr "" |
596 | |
597 | +<<<<<<< TREE |
598 | #: ../duplicity-bin:1044 |
599 | +======= |
600 | +#: ../duplicity-bin:1021 |
601 | +>>>>>>> MERGE-SOURCE |
602 | msgid "Unable to get max open files." |
603 | msgstr "" |
604 | |
605 | +<<<<<<< TREE |
606 | #: ../duplicity-bin:1048 |
607 | +======= |
608 | +#: ../duplicity-bin:1025 |
609 | +>>>>>>> MERGE-SOURCE |
610 | #, python-format |
611 | msgid "" |
612 | "Max open files of %s is too low, should be >= 1024.\n" |
613 | "Use 'ulimit -n 1024' or higher to correct.\n" |
614 | msgstr "" |
615 | |
616 | +<<<<<<< TREE |
617 | #: ../duplicity-bin:1094 |
618 | +======= |
619 | +#: ../duplicity-bin:1071 |
620 | +>>>>>>> MERGE-SOURCE |
621 | msgid "" |
622 | "RESTART: The first volume failed to upload before termination.\n" |
623 | " Restart is impossible...starting backup from beginning." |
624 | msgstr "" |
625 | |
626 | +<<<<<<< TREE |
627 | #: ../duplicity-bin:1100 |
628 | +======= |
629 | +#: ../duplicity-bin:1077 |
630 | +>>>>>>> MERGE-SOURCE |
631 | #, python-format |
632 | msgid "" |
633 | "RESTART: Volumes %d to %d failed to upload before termination.\n" |
634 | " Restarting backup at volume %d." |
635 | msgstr "" |
636 | |
637 | +<<<<<<< TREE |
638 | #: ../duplicity-bin:1108 |
639 | +======= |
640 | +#: ../duplicity-bin:1085 |
641 | +>>>>>>> MERGE-SOURCE |
642 | #, python-format |
643 | msgid "" |
644 | "RESTART: Impossible backup state: manifest has %d vols, remote has %d vols.\n" |
645 | @@ -230,39 +398,71 @@ |
646 | " backup then restart the backup from the beginning." |
647 | msgstr "" |
648 | |
649 | +<<<<<<< TREE |
650 | #: ../duplicity-bin:1189 |
651 | +======= |
652 | +#: ../duplicity-bin:1166 |
653 | +>>>>>>> MERGE-SOURCE |
654 | #, python-format |
655 | msgid "Last %s backup left a partial set, restarting." |
656 | msgstr "" |
657 | |
658 | +<<<<<<< TREE |
659 | #: ../duplicity-bin:1193 |
660 | +======= |
661 | +#: ../duplicity-bin:1170 |
662 | +>>>>>>> MERGE-SOURCE |
663 | #, python-format |
664 | msgid "Cleaning up previous partial %s backup set, restarting." |
665 | msgstr "" |
666 | |
667 | +<<<<<<< TREE |
668 | #: ../duplicity-bin:1204 |
669 | +======= |
670 | +#: ../duplicity-bin:1181 |
671 | +>>>>>>> MERGE-SOURCE |
672 | msgid "Last full backup date:" |
673 | msgstr "" |
674 | |
675 | +<<<<<<< TREE |
676 | #: ../duplicity-bin:1206 |
677 | +======= |
678 | +#: ../duplicity-bin:1183 |
679 | +>>>>>>> MERGE-SOURCE |
680 | msgid "Last full backup date: none" |
681 | msgstr "" |
682 | |
683 | +<<<<<<< TREE |
684 | #: ../duplicity-bin:1208 |
685 | +======= |
686 | +#: ../duplicity-bin:1185 |
687 | +>>>>>>> MERGE-SOURCE |
688 | msgid "Last full backup is too old, forcing full backup" |
689 | msgstr "" |
690 | |
691 | +<<<<<<< TREE |
692 | #: ../duplicity-bin:1282 |
693 | +======= |
694 | +#: ../duplicity-bin:1259 |
695 | +>>>>>>> MERGE-SOURCE |
696 | #, python-format |
697 | msgid "GPG error detail: %s" |
698 | msgstr "" |
699 | |
700 | +<<<<<<< TREE |
701 | #: ../duplicity-bin:1291 |
702 | +======= |
703 | +#: ../duplicity-bin:1268 |
704 | +>>>>>>> MERGE-SOURCE |
705 | #, python-format |
706 | msgid "User error detail: %s" |
707 | msgstr "" |
708 | |
709 | +<<<<<<< TREE |
710 | #: ../duplicity-bin:1300 |
711 | +======= |
712 | +#: ../duplicity-bin:1277 |
713 | +>>>>>>> MERGE-SOURCE |
714 | #, python-format |
715 | msgid "Backend error detail: %s" |
716 | msgstr "" |
717 | @@ -329,6 +529,7 @@ |
718 | msgstr[0] "" |
719 | msgstr[1] "" |
720 | |
721 | +<<<<<<< TREE |
722 | #: ../duplicity/backend.py:415 ../duplicity/backend.py:432 |
723 | #, python-format |
724 | msgid "Reading results of '%s'" |
725 | @@ -342,6 +543,14 @@ |
726 | msgstr "" |
727 | |
728 | #: ../duplicity/collections.py:203 |
729 | +======= |
730 | +#: ../duplicity/backend.py:415 ../duplicity/backend.py:432 |
731 | +#, python-format |
732 | +msgid "Reading results of '%s'" |
733 | +msgstr "" |
734 | + |
735 | +#: ../duplicity/collections.py:181 |
736 | +>>>>>>> MERGE-SOURCE |
737 | msgid "Fatal Error: No manifests found for most recent backup" |
738 | msgstr "" |
739 | |
740 | @@ -559,7 +768,11 @@ |
741 | "starting at time %s." |
742 | msgstr "" |
743 | |
744 | +<<<<<<< TREE |
745 | #: ../duplicity/commandline.py:70 |
746 | +======= |
747 | +#: ../duplicity/commandline.py:67 |
748 | +>>>>>>> MERGE-SOURCE |
749 | #, python-format |
750 | msgid "" |
751 | "Warning: Option %s is pending deprecation and will be removed in a future " |
752 | @@ -567,27 +780,46 @@ |
753 | "Use of default filenames is strongly suggested." |
754 | msgstr "" |
755 | |
756 | +<<<<<<< TREE |
757 | #: ../duplicity/commandline.py:185 |
758 | +======= |
759 | +#: ../duplicity/commandline.py:182 |
760 | +>>>>>>> MERGE-SOURCE |
761 | msgid "Unable to load gio module" |
762 | msgstr "" |
763 | |
764 | +<<<<<<< TREE |
765 | #: ../duplicity/commandline.py:207 |
766 | +======= |
767 | +#: ../duplicity/commandline.py:204 |
768 | +>>>>>>> MERGE-SOURCE |
769 | #, python-format |
770 | msgid "Error opening file %s" |
771 | msgstr "" |
772 | |
773 | #. Used in usage help to represent a Unix-style path name. Example: |
774 | #. --archive-dir <path> |
775 | +<<<<<<< TREE |
776 | #: ../duplicity/commandline.py:228 ../duplicity/commandline.py:236 |
777 | #: ../duplicity/commandline.py:296 ../duplicity/commandline.py:426 |
778 | #: ../duplicity/commandline.py:641 |
779 | +======= |
780 | +#: ../duplicity/commandline.py:225 ../duplicity/commandline.py:233 |
781 | +#: ../duplicity/commandline.py:293 ../duplicity/commandline.py:426 |
782 | +#: ../duplicity/commandline.py:641 |
783 | +>>>>>>> MERGE-SOURCE |
784 | msgid "path" |
785 | msgstr "" |
786 | |
787 | #. Used in usage help to represent an ID for a GnuPG key. Example: |
788 | #. --encrypt-key <gpg_key_id> |
789 | +<<<<<<< TREE |
790 | #: ../duplicity/commandline.py:248 ../duplicity/commandline.py:415 |
791 | #: ../duplicity/commandline.py:614 |
792 | +======= |
793 | +#: ../duplicity/commandline.py:245 ../duplicity/commandline.py:415 |
794 | +#: ../duplicity/commandline.py:614 |
795 | +>>>>>>> MERGE-SOURCE |
796 | msgid "gpg-key-id" |
797 | msgstr "" |
798 | |
799 | @@ -595,42 +827,72 @@ |
800 | #. matching one or more files, as described in the documentation. |
801 | #. Example: |
802 | #. --exclude <shell_pattern> |
803 | +<<<<<<< TREE |
804 | #: ../duplicity/commandline.py:256 ../duplicity/commandline.py:335 |
805 | #: ../duplicity/commandline.py:664 |
806 | +======= |
807 | +#: ../duplicity/commandline.py:253 ../duplicity/commandline.py:333 |
808 | +#: ../duplicity/commandline.py:664 |
809 | +>>>>>>> MERGE-SOURCE |
810 | msgid "shell_pattern" |
811 | msgstr "" |
812 | |
813 | #. Used in usage help to represent the name of a file. Example: |
814 | #. --log-file <filename> |
815 | +<<<<<<< TREE |
816 | #: ../duplicity/commandline.py:262 ../duplicity/commandline.py:269 |
817 | #: ../duplicity/commandline.py:274 ../duplicity/commandline.py:337 |
818 | #: ../duplicity/commandline.py:339 ../duplicity/commandline.py:350 |
819 | #: ../duplicity/commandline.py:610 |
820 | +======= |
821 | +#: ../duplicity/commandline.py:259 ../duplicity/commandline.py:266 |
822 | +#: ../duplicity/commandline.py:271 ../duplicity/commandline.py:335 |
823 | +#: ../duplicity/commandline.py:337 ../duplicity/commandline.py:348 |
824 | +#: ../duplicity/commandline.py:610 |
825 | +>>>>>>> MERGE-SOURCE |
826 | msgid "filename" |
827 | msgstr "" |
828 | |
829 | #. Used in usage help to represent a regular expression (regexp). |
830 | +<<<<<<< TREE |
831 | #: ../duplicity/commandline.py:281 ../duplicity/commandline.py:341 |
832 | +======= |
833 | +#: ../duplicity/commandline.py:278 ../duplicity/commandline.py:339 |
834 | +>>>>>>> MERGE-SOURCE |
835 | msgid "regular_expression" |
836 | msgstr "" |
837 | |
838 | #. Used in usage help to represent a time spec for a previous |
839 | #. point in time, as described in the documentation. Example: |
840 | #. duplicity remove-older-than time [options] target_url |
841 | +<<<<<<< TREE |
842 | #: ../duplicity/commandline.py:308 ../duplicity/commandline.py:386 |
843 | #: ../duplicity/commandline.py:696 |
844 | +======= |
845 | +#: ../duplicity/commandline.py:305 ../duplicity/commandline.py:385 |
846 | +#: ../duplicity/commandline.py:696 |
847 | +>>>>>>> MERGE-SOURCE |
848 | msgid "time" |
849 | msgstr "" |
850 | |
851 | #. Used in usage help. (Should be consistent with the "Options:" |
852 | #. header.) Example: |
853 | #. duplicity [full|incremental] [options] source_dir target_url |
854 | +<<<<<<< TREE |
855 | #: ../duplicity/commandline.py:312 ../duplicity/commandline.py:423 |
856 | #: ../duplicity/commandline.py:629 |
857 | +======= |
858 | +#: ../duplicity/commandline.py:309 ../duplicity/commandline.py:423 |
859 | +#: ../duplicity/commandline.py:629 |
860 | +>>>>>>> MERGE-SOURCE |
861 | msgid "options" |
862 | msgstr "" |
863 | |
864 | +<<<<<<< TREE |
865 | #: ../duplicity/commandline.py:320 |
866 | +======= |
867 | +#: ../duplicity/commandline.py:318 |
868 | +>>>>>>> MERGE-SOURCE |
869 | #, python-format |
870 | msgid "" |
871 | "Running in 'ignore errors' mode due to %s; please re-consider if this was " |
872 | @@ -638,30 +900,52 @@ |
873 | msgstr "" |
874 | |
875 | #. Used in usage help to represent an imap mailbox |
876 | +<<<<<<< TREE |
877 | #: ../duplicity/commandline.py:333 |
878 | +======= |
879 | +#: ../duplicity/commandline.py:331 |
880 | +>>>>>>> MERGE-SOURCE |
881 | msgid "imap_mailbox" |
882 | msgstr "" |
883 | |
884 | +<<<<<<< TREE |
885 | #: ../duplicity/commandline.py:344 |
886 | +======= |
887 | +#: ../duplicity/commandline.py:342 |
888 | +>>>>>>> MERGE-SOURCE |
889 | msgid "file_descriptor" |
890 | msgstr "" |
891 | |
892 | #. Used in usage help (noun) |
893 | +<<<<<<< TREE |
894 | #: ../duplicity/commandline.py:355 |
895 | +======= |
896 | +#: ../duplicity/commandline.py:353 |
897 | +>>>>>>> MERGE-SOURCE |
898 | msgid "backup name" |
899 | msgstr "" |
900 | |
901 | #. Used in usage help to represent a desired number of |
902 | #. something. Example: |
903 | #. --num-retries <number> |
904 | +<<<<<<< TREE |
905 | #: ../duplicity/commandline.py:371 ../duplicity/commandline.py:456 |
906 | #: ../duplicity/commandline.py:624 |
907 | +======= |
908 | +#: ../duplicity/commandline.py:369 ../duplicity/commandline.py:456 |
909 | +#: ../duplicity/commandline.py:624 |
910 | +>>>>>>> MERGE-SOURCE |
911 | msgid "number" |
912 | msgstr "" |
913 | |
914 | #. noun |
915 | +<<<<<<< TREE |
916 | #: ../duplicity/commandline.py:402 ../duplicity/commandline.py:406 |
917 | #: ../duplicity/commandline.py:595 |
918 | +======= |
919 | +#: ../duplicity/commandline.py:401 ../duplicity/commandline.py:405 |
920 | +#: ../duplicity/commandline.py:595 |
921 | +>>>>>>> MERGE-SOURCE |
922 | msgid "command" |
923 | msgstr "" |
924 |
Rejected in favor of https:/ /code.edge. launchpad. net/~mbp/ duplicity/ 433970- non-ssl/ +merge/ 38367 into 0.6.