Merge lp:~mbp/duplicity/433970-non-ssl into lp:~duplicity-team/duplicity/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
Reviewer Review Type Date Requested Status
duplicity-team Pending
Review via email: mp+38303@code.launchpad.net

Description of the change

Hi, this fixes bug 433970 by adding an --s3-unencrypted-connection option. This makes backups and restores several times faster from Australia to the US, and cuts the amount of traffic substantially.

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

Subscribers

People subscribed via source and target branches