Merge lp:~mterry/duplicity/list-old-chains into lp:duplicity/0.7-series

Proposed by Michael Terry on 2009-10-23
Status: Merged
Merged at revision: not available
Proposed branch: lp:~mterry/duplicity/list-old-chains
Merge into: lp:duplicity/0.7-series
Diff against target: 1503 lines
7 files modified
duplicity-bin (+5/-8)
duplicity.1 (+8/-0)
duplicity/collections.py (+56/-44)
duplicity/commandline.py (+4/-0)
duplicity/globals.py (+3/-0)
duplicity/log.py (+1/-0)
po/duplicity.pot (+205/-201)
To merge this branch: bzr merge lp:~mterry/duplicity/list-old-chains
Reviewer Review Type Date Requested Status
duplicity-team 2009-10-23 Pending
Review via email: mp+13871@code.launchpad.net
To post a comment you must log in.
Michael Terry (mterry) wrote :

See my comment on the list-old-chains-0.6 merge request for details.

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'duplicity-bin'
2--- duplicity-bin 2009-10-09 13:47:41 +0000
3+++ duplicity-bin 2009-10-23 20:45:20 +0000
4@@ -444,7 +444,7 @@
5 bytes_written += man_outfp.to_remote()
6 man_outfp.to_final()
7
8- col_stats.set_values(sig_chain_warning=None).cleanup_signatures()
9+ col_stats.set_values(sig_chain_warning=None)
10
11 print_statistics(diffdir.stats, bytes_written)
12
13@@ -528,11 +528,8 @@
14 @rtype: void
15 @return: void
16 """
17- sig_chain = check_sig_chain(col_stats)
18- if not sig_chain:
19- log.FatalError(_("No signature data found, unable to list files."),
20- log.ErrorCode.no_sigs)
21- time = globals.restore_time # if None, will use latest
22+ time = globals.restore_time or dup_time.curtime
23+ sig_chain = col_stats.get_signature_chain_at_time(time)
24 path_iter = diffdir.get_combined_path_iter(sig_chain.get_fileobjs(time))
25 for path in path_iter:
26 if path.difftype != "deleted":
27@@ -704,7 +701,7 @@
28 @rtype: void
29 @return: void
30 """
31- ext_local, ext_remote = col_stats.get_extraneous()
32+ ext_local, ext_remote = col_stats.get_extraneous(globals.extra_clean)
33 extraneous = ext_local + ext_remote
34 if not extraneous:
35 log.Warn(_("No extraneous files found, nothing deleted in cleanup."))
36@@ -789,7 +786,7 @@
37 setlist.reverse() # save oldest for last
38 for set in setlist:
39 set.delete()
40- col_stats.set_values(sig_chain_warning=None).cleanup_signatures()
41+ col_stats.set_values(sig_chain_warning=None)
42 else:
43 log.Notice(gettext.ngettext("Found old backup set at the following time:",
44 "Found old backup sets at the following times:",
45
46=== modified file 'duplicity.1'
47--- duplicity.1 2009-07-21 20:46:04 +0000
48+++ duplicity.1 2009-10-23 20:45:20 +0000
49@@ -342,6 +342,14 @@
50 section for more information.
51
52 .TP
53+.B --extra-clean
54+When cleaning up, be more aggressive about saving space. For example, this
55+may delete signature files for old backup chains.
56+See the
57+.B cleanup
58+argument for more information.
59+
60+.TP
61 .BI "--file-to-restore " path
62 This option may be given in restore mode, causing only
63 .I path
64
65=== modified file 'duplicity/collections.py'
66--- duplicity/collections.py 2009-10-06 13:48:25 +0000
67+++ duplicity/collections.py 2009-10-23 20:45:20 +0000
68@@ -584,7 +584,7 @@
69 # These should be sorted by end_time
70 self.all_backup_chains = None
71 self.other_backup_chains = None
72- self.other_sig_chains = None
73+ self.all_sig_chains = None
74
75 # Other misc paths and sets which shouldn't be there
76 self.local_orphaned_sig_names = []
77@@ -604,6 +604,7 @@
78 "archive-dir %s" % (self.archive_dir,)]
79
80 for i in range(len(self.other_backup_chains)):
81+ # A bit of a misnomer. Chain might have a sig.
82 l.append("chain-no-sig %d" % (i,))
83 l += self.other_backup_chains[i].to_log_info(' ')
84
85@@ -627,18 +628,18 @@
86 _("Archive dir: %s") % (self.archive_dir.name,)]
87
88 l.append("\n" +
89- gettext.ngettext("Found %d backup chain without signatures.",
90- "Found %d backup chains without signatures.",
91+ gettext.ngettext("Found %d secondary backup chain.",
92+ "Found %d secondary backup chains.",
93 len(self.other_backup_chains))
94 % len(self.other_backup_chains))
95 for i in range(len(self.other_backup_chains)):
96- l.append(_("Signature-less chain %d of %d:") %
97+ l.append(_("Secondary chain %d of %d:") %
98 (i+1, len(self.other_backup_chains)))
99 l.append(str(self.other_backup_chains[i]))
100 l.append("")
101
102 if self.matched_chain_pair:
103- l.append("\n" + _("Found a complete backup chain with matching "
104+ l.append("\n" + _("Found primary backup chain with matching "
105 "signature chain:"))
106 l.append(str(self.matched_chain_pair[1]))
107 else:
108@@ -719,12 +720,12 @@
109 latest backup chain, use the local sig chain (it does not need
110 to be downloaded).
111 """
112- self.other_sig_chains = sig_chains
113+ sig_chains = sig_chains and self.get_sorted_chains(sig_chains)
114+ self.all_sig_chains = sig_chains
115 self.other_backup_chains = backup_chains[:]
116 self.matched_chain_pair = None
117 if sig_chains and backup_chains:
118 latest_backup_chain = backup_chains[-1]
119- sig_chains = self.get_sorted_chains(sig_chains)
120 for i in range(len(sig_chains)-1, -1, -1):
121 if sig_chains[i].end_time == latest_backup_chain.end_time:
122 pass
123@@ -743,19 +744,9 @@
124 if self.matched_chain_pair == None:
125 self.matched_chain_pair = (sig_chains[i], latest_backup_chain)
126
127- del sig_chains[i]
128 break
129
130 if self.matched_chain_pair:
131- # if we have local and remote sig chains, remove both from the other_sig_chains list
132- matched_sig_chain = self.matched_chain_pair[0]
133- if len(self.other_sig_chains) > 1:
134- for sig_chain in self.other_sig_chains[1:]:
135- if (sig_chain.islocal() != matched_sig_chain.islocal() and
136- sig_chain.start_time == matched_sig_chain.start_time and
137- sig_chain.end_time == matched_sig_chain.end_time):
138- self.other_sig_chains.remove(sig_chain)
139- self.other_sig_chains.remove(matched_sig_chain)
140 self.other_backup_chains.remove(self.matched_chain_pair[1])
141
142 def warn(self, sig_chain_warning):
143@@ -782,18 +773,9 @@
144 + "\n" + "\n".join(self.remote_orphaned_sig_names),
145 log.WarningCode.orphaned_sig)
146
147- if self.other_sig_chains and sig_chain_warning:
148- if self.matched_chain_pair:
149- log.Warn(gettext.ngettext("Warning, found an unnecessary "
150- "signature chain",
151- "Warning, found unnecessary "
152- "signature chains",
153- len(self.other_sig_chains))
154- + "\n" + "\n".join([f.fullsig for f in self.other_sig_chains]),
155- log.WarningCode.unnecessary_sig)
156- else:
157- log.Warn(_("Warning, found signatures but no corresponding "
158- "backup files"), log.WarningCode.unmatched_sig)
159+ if self.all_sig_chains and sig_chain_warning and not self.matched_chain_pair:
160+ log.Warn(_("Warning, found signatures but no corresponding "
161+ "backup files"), log.WarningCode.unmatched_sig)
162
163 if self.incomplete_backup_sets:
164 log.Warn(_("Warning, found incomplete backup sets, probably left "
165@@ -995,13 +977,34 @@
166 else:
167 return self.all_backup_chains[0] # no chains are old enough
168
169- def cleanup_signatures(self):
170- """
171- Delete unnecessary older signatures
172- """
173- map(SignatureChain.delete, self.other_sig_chains)
174-
175- def get_extraneous(self):
176+ def get_signature_chain_at_time(self, time):
177+ """
178+ Return signature chain covering specified time
179+
180+ Tries to find the signature chain covering the given time. If
181+ there is none, return the earliest chain before, and failing
182+ that, the earliest chain.
183+ """
184+ if not self.all_sig_chains:
185+ raise CollectionsError("No signature chains found")
186+
187+ covering_chains = filter(lambda c: c.start_time <= time <= c.end_time,
188+ self.all_sig_chains)
189+ if covering_chains:
190+ return covering_chains[-1] # prefer local if multiple sig chains
191+
192+ old_chains = filter(lambda c: c.end_time < time,
193+ self.all_sig_chains)
194+ if old_chains:
195+ return old_chains[-1]
196+ else:
197+ # no chains are old enough, give oldest and warn user
198+ oldest = self.all_sig_chains[0]
199+ if time < oldest.start_time:
200+ log.Warn(_("No signature chain for the requested time. Using oldest available chain, starting at time %s.") % dup_time.timetopretty(oldest.start_time), log.WarningCode.no_sig_for_time, dup_time.timetostring(oldest.start_time))
201+ return oldest
202+
203+ def get_extraneous(self, extra_clean):
204 """
205 Return list of the names of extraneous duplicity files
206
207@@ -1012,14 +1015,23 @@
208 assert self.values_set
209 local_filenames = []
210 remote_filenames = []
211- ext_containers = (self.other_sig_chains, self.orphaned_backup_sets,
212- self.incomplete_backup_sets)
213- for set_or_chain_list in ext_containers:
214- for set_or_chain in set_or_chain_list:
215- if set_or_chain.backend:
216- remote_filenames.extend(set_or_chain.get_filenames())
217- else:
218- local_filenames.extend(set_or_chain.get_filenames())
219+ ext_containers = self.orphaned_backup_sets + self.incomplete_backup_sets
220+ if extra_clean:
221+ old_sig_chains = self.all_sig_chains[:]
222+ if self.matched_chain_pair:
223+ matched_sig_chain = self.matched_chain_pair[0]
224+ for sig_chain in self.all_sig_chains:
225+ print sig_chain.start_time, matched_sig_chain.start_time,
226+ print sig_chain.end_time, matched_sig_chain.end_time
227+ if (sig_chain.start_time == matched_sig_chain.start_time and
228+ sig_chain.end_time == matched_sig_chain.end_time):
229+ old_sig_chains.remove(sig_chain)
230+ ext_containers += old_sig_chains
231+ for set_or_chain in ext_containers:
232+ if set_or_chain.backend:
233+ remote_filenames.extend(set_or_chain.get_filenames())
234+ else:
235+ local_filenames.extend(set_or_chain.get_filenames())
236 local_filenames += self.local_orphaned_sig_names
237 remote_filenames += self.remote_orphaned_sig_names
238 return local_filenames, remote_filenames
239
240=== modified file 'duplicity/commandline.py'
241--- duplicity/commandline.py 2009-09-18 14:16:34 +0000
242+++ duplicity/commandline.py 2009-10-23 20:45:20 +0000
243@@ -78,6 +78,7 @@
244 "exclude-filelist-stdin",
245 "exclude-other-filesystems",
246 "exclude-regexp=",
247+ "extra-clean",
248 "fail-on-volume=",
249 "file-to-restore=",
250 "force",
251@@ -271,6 +272,8 @@
252 elif opt == "--exclude-filelist-stdin":
253 select_opts.append(("--exclude-filelist", "standard input"))
254 select_files.append(sys.stdin)
255+ elif opt == "--extra-clean":
256+ globals.extra_clean = True
257 elif opt == "--fail-on-volume":
258 globals.fail_on_volume = get_int(arg, opt)
259 elif opt == "--full-if-older-than":
260@@ -641,6 +644,7 @@
261 --exclude-globbing-filelist <%(filename)s>
262 --exclude-other-filesystems
263 --exclude-regexp <regexp>
264+ --extra-clean
265 --file-to-restore <%(path)s>
266 --full-if-older-than <%(time)s>
267 --force
268
269=== modified file 'duplicity/globals.py'
270--- duplicity/globals.py 2009-09-18 14:16:34 +0000
271+++ duplicity/globals.py 2009-10-23 20:45:20 +0000
272@@ -182,3 +182,6 @@
273
274 # if True the par2 recovery files will be created.
275 par2 = False
276+
277+# If we should be particularly aggressive when cleaning up
278+extra_clean = False
279
280=== modified file 'duplicity/log.py'
281--- duplicity/log.py 2009-09-20 18:43:02 +0000
282+++ duplicity/log.py 2009-10-23 20:45:20 +0000
283@@ -128,6 +128,7 @@
284 cannot_iterate = 8
285 cannot_stat = 9
286 cannot_read = 10
287+ no_sig_for_time = 11
288
289 def Warn(s, code=WarningCode.generic, extra=None):
290 """Shortcut used for warning messages (verbosity 2)"""
291
292=== modified file 'po/duplicity.pot'
293--- po/duplicity.pot 2009-09-15 11:34:45 +0000
294+++ po/duplicity.pot 2009-10-23 20:45:20 +0000
295@@ -8,7 +8,7 @@
296 msgstr ""
297 "Project-Id-Version: PACKAGE VERSION\n"
298 "Report-Msgid-Bugs-To: Kenneth Loafman <kenneth@loafman.com>\n"
299-"POT-Creation-Date: 2009-09-15 06:29-0500\n"
300+"POT-Creation-Date: 2009-10-23 16:29-0400\n"
301 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
302 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
303 "Language-Team: LANGUAGE <LL@li.org>\n"
304@@ -17,215 +17,211 @@
305 "Content-Transfer-Encoding: 8bit\n"
306 "Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n"
307
308-#: ../duplicity-bin:191
309+#: ../duplicity-bin:192
310 #, python-format
311 msgid ""
312 "Unable to locate last file %s and block %d in backup set.\n"
313 "Attempting restart on the next file %s."
314 msgstr ""
315
316-#: ../duplicity-bin:197
317+#: ../duplicity-bin:198
318 #, python-format
319 msgid ""
320 "Unable to locate last file %s and block %d in backup set.\n"
321 "There are no more files to be backed up."
322 msgstr ""
323
324-#: ../duplicity-bin:443
325+#: ../duplicity-bin:461
326 msgid ""
327 "Fatal Error: Unable to start incremental backup. Old signatures not found "
328 "and incremental specified"
329 msgstr ""
330
331-#: ../duplicity-bin:447
332+#: ../duplicity-bin:465
333 msgid "No signatures found, switching to full backup."
334 msgstr ""
335
336-#: ../duplicity-bin:461
337+#: ../duplicity-bin:479
338 msgid "Backup Statistics"
339 msgstr ""
340
341-#: ../duplicity-bin:515
342-msgid "No signature data found, unable to list files."
343-msgstr ""
344-
345-#: ../duplicity-bin:544
346+#: ../duplicity-bin:559
347 #, python-format
348 msgid "%s not found in archive, no files restored."
349 msgstr ""
350
351-#: ../duplicity-bin:548
352+#: ../duplicity-bin:563
353 msgid "No files found in archive - nothing restored."
354 msgstr ""
355
356-#: ../duplicity-bin:581
357+#: ../duplicity-bin:596
358 #, python-format
359 msgid "Processed volume %d of %d"
360 msgstr ""
361
362-#: ../duplicity-bin:621
363+#: ../duplicity-bin:636
364 #, python-format
365 msgid "Invalid data - %s hash mismatch:"
366 msgstr ""
367
368-#: ../duplicity-bin:622
369+#: ../duplicity-bin:637
370 #, python-format
371 msgid "Calculated hash: %s"
372 msgstr ""
373
374-#: ../duplicity-bin:623
375+#: ../duplicity-bin:638
376 #, python-format
377 msgid "Manifest hash: %s"
378 msgstr ""
379
380-#: ../duplicity-bin:640
381+#: ../duplicity-bin:655
382 #, python-format
383 msgid "Volume was signed by key %s, not %s"
384 msgstr ""
385
386-#: ../duplicity-bin:670
387+#: ../duplicity-bin:685
388 #, python-format
389 msgid "Verify complete: %s, %s."
390 msgstr ""
391
392-#: ../duplicity-bin:671
393+#: ../duplicity-bin:686
394 #, python-format
395 msgid "%d file compared"
396 msgid_plural "%d files compared"
397 msgstr[0] ""
398 msgstr[1] ""
399
400-#: ../duplicity-bin:673
401+#: ../duplicity-bin:688
402 #, python-format
403 msgid "%d difference found"
404 msgid_plural "%d differences found"
405 msgstr[0] ""
406 msgstr[1] ""
407
408-#: ../duplicity-bin:692
409+#: ../duplicity-bin:707
410 msgid "No extraneous files found, nothing deleted in cleanup."
411 msgstr ""
412
413-#: ../duplicity-bin:697
414+#: ../duplicity-bin:712
415 msgid "Deleting this file from backend:"
416 msgid_plural "Deleting these files from backend:"
417 msgstr[0] ""
418 msgstr[1] ""
419
420-#: ../duplicity-bin:706
421+#: ../duplicity-bin:721
422 msgid "Found the following file to delete:"
423 msgid_plural "Found the following files to delete:"
424 msgstr[0] ""
425 msgstr[1] ""
426
427-#: ../duplicity-bin:710
428+#: ../duplicity-bin:725
429 msgid "Run duplicity again with the --force option to actually delete."
430 msgstr ""
431
432-#: ../duplicity-bin:749
433+#: ../duplicity-bin:764
434 msgid "There are backup set(s) at time(s):"
435 msgstr ""
436
437-#: ../duplicity-bin:751
438+#: ../duplicity-bin:766
439 msgid "Which can't be deleted because newer sets depend on them."
440 msgstr ""
441
442-#: ../duplicity-bin:755
443+#: ../duplicity-bin:770
444 msgid ""
445 "Current active backup chain is older than specified time. However, it will "
446 "not be deleted. To remove all your backups, manually purge the repository."
447 msgstr ""
448
449-#: ../duplicity-bin:761
450+#: ../duplicity-bin:776
451 msgid "No old backup sets found, nothing deleted."
452 msgstr ""
453
454-#: ../duplicity-bin:764
455+#: ../duplicity-bin:779
456 msgid "Deleting backup set at time:"
457 msgid_plural "Deleting backup sets at times:"
458 msgstr[0] ""
459 msgstr[1] ""
460
461-#: ../duplicity-bin:776
462+#: ../duplicity-bin:791
463 msgid "Found old backup set at the following time:"
464 msgid_plural "Found old backup sets at the following times:"
465 msgstr[0] ""
466 msgstr[1] ""
467
468-#: ../duplicity-bin:780
469+#: ../duplicity-bin:795
470 msgid "Rerun command with --force option to actually delete."
471 msgstr ""
472
473-#: ../duplicity-bin:863
474+#: ../duplicity-bin:882
475 #, python-format
476 msgid "Deleting local %s (not authoritative at backend)."
477 msgstr ""
478
479-#: ../duplicity-bin:888 ../duplicity/dup_temp.py:239
480+#: ../duplicity-bin:907 ../duplicity/dup_temp.py:254
481 #, python-format
482 msgid "Failed to read %s: %s"
483 msgstr ""
484
485-#: ../duplicity-bin:899
486+#: ../duplicity-bin:918
487 #, python-format
488 msgid "Copying %s to local cache."
489 msgstr ""
490
491-#: ../duplicity-bin:943
492+#: ../duplicity-bin:959
493 msgid "Local and Remote metadata are synchronized, no sync needed."
494 msgstr ""
495
496-#: ../duplicity-bin:948
497+#: ../duplicity-bin:964
498 msgid "Synchronizing remote metadata to local cache..."
499 msgstr ""
500
501-#: ../duplicity-bin:955
502+#: ../duplicity-bin:973
503 msgid "Sync would copy the following from remote to local:"
504 msgstr ""
505
506-#: ../duplicity-bin:958
507+#: ../duplicity-bin:976
508 msgid "Sync would remove the following spurious local files:"
509 msgstr ""
510
511-#: ../duplicity-bin:1001
512+#: ../duplicity-bin:1019
513 msgid "Unable to get free space on temp."
514 msgstr ""
515
516-#: ../duplicity-bin:1009
517+#: ../duplicity-bin:1027
518 #, python-format
519 msgid "Temp space has %d available, backup needs approx %d."
520 msgstr ""
521
522-#: ../duplicity-bin:1012
523+#: ../duplicity-bin:1030
524 #, python-format
525 msgid "Temp has %d available, backup will use approx %d."
526 msgstr ""
527
528-#: ../duplicity-bin:1020
529+#: ../duplicity-bin:1038
530 msgid "Unable to get max open files."
531 msgstr ""
532
533-#: ../duplicity-bin:1024
534+#: ../duplicity-bin:1042
535 #, python-format
536 msgid ""
537 "Max open files of %s is too low, should be >= 1024.\n"
538 "Use 'ulimit -n 1024' or higher to correct.\n"
539 msgstr ""
540
541-#: ../duplicity-bin:1070
542+#: ../duplicity-bin:1088
543 msgid ""
544 "RESTART: The first volume failed to upload before termination.\n"
545 " Restart is impossible...starting backup from beginning."
546 msgstr ""
547
548-#: ../duplicity-bin:1076
549+#: ../duplicity-bin:1094
550 #, python-format
551 msgid ""
552 "RESTART: Volumes %d to %d failed to upload before termination.\n"
553 " Restarting backup at volume %d."
554 msgstr ""
555
556-#: ../duplicity-bin:1084
557+#: ../duplicity-bin:1102
558 #, python-format
559 msgid ""
560 "RESTART: Impossible backup state: manifest has %d vols, remote has %d vols.\n"
561@@ -234,39 +230,39 @@
562 " backup then restart the backup from the beginning."
563 msgstr ""
564
565-#: ../duplicity-bin:1162
566+#: ../duplicity-bin:1180
567 #, python-format
568 msgid "Last %s backup left a partial set, restarting."
569 msgstr ""
570
571-#: ../duplicity-bin:1166
572+#: ../duplicity-bin:1184
573 #, python-format
574 msgid "Cleaning up previous partial %s backup set, restarting."
575 msgstr ""
576
577-#: ../duplicity-bin:1177
578+#: ../duplicity-bin:1195
579 msgid "Last full backup date:"
580 msgstr ""
581
582-#: ../duplicity-bin:1179
583+#: ../duplicity-bin:1197
584 msgid "Last full backup date: none"
585 msgstr ""
586
587-#: ../duplicity-bin:1181
588+#: ../duplicity-bin:1199
589 msgid "Last full backup is too old, forcing full backup"
590 msgstr ""
591
592-#: ../duplicity-bin:1255
593+#: ../duplicity-bin:1275
594 #, python-format
595 msgid "GPG error detail: %s"
596 msgstr ""
597
598-#: ../duplicity-bin:1264
599+#: ../duplicity-bin:1284
600 #, python-format
601 msgid "User error detail: %s"
602 msgstr ""
603
604-#: ../duplicity-bin:1273
605+#: ../duplicity-bin:1293
606 #, python-format
607 msgid "Backend error detail: %s"
608 msgstr ""
609@@ -338,122 +334,129 @@
610 msgid "Reading results of '%s'"
611 msgstr ""
612
613-#: ../duplicity/collections.py:176
614+#: ../duplicity/collections.py:98
615+msgid ""
616+"Fatal Error: There are remote par2 files but par2 executable is not "
617+"available.\n"
618+"Either install par2 or pass --force option to force the operation."
619+msgstr ""
620+
621+#: ../duplicity/collections.py:198
622 msgid "Fatal Error: No manifests found for most recent backup"
623 msgstr ""
624
625-#: ../duplicity/collections.py:185
626+#: ../duplicity/collections.py:207
627 msgid ""
628 "Fatal Error: Remote manifest does not match local one. Either the remote "
629 "backup set or the local archive directory has been corrupted."
630 msgstr ""
631
632-#: ../duplicity/collections.py:193
633+#: ../duplicity/collections.py:215
634 msgid "Fatal Error: Neither remote nor local manifest is readable."
635 msgstr ""
636
637-#: ../duplicity/collections.py:299
638+#: ../duplicity/collections.py:321
639 msgid "Preferring Backupset over previous one!"
640 msgstr ""
641
642-#: ../duplicity/collections.py:302
643+#: ../duplicity/collections.py:324
644 #, python-format
645 msgid "Ignoring incremental Backupset (start_time: %s; needed: %s)"
646 msgstr ""
647
648-#: ../duplicity/collections.py:307
649+#: ../duplicity/collections.py:329
650 #, python-format
651 msgid "Added incremental Backupset (start_time: %s / end_time: %s)"
652 msgstr ""
653
654-#: ../duplicity/collections.py:373
655+#: ../duplicity/collections.py:395
656 msgid "Chain start time: "
657 msgstr ""
658
659-#: ../duplicity/collections.py:374
660+#: ../duplicity/collections.py:396
661 msgid "Chain end time: "
662 msgstr ""
663
664-#: ../duplicity/collections.py:375
665+#: ../duplicity/collections.py:397
666 #, python-format
667 msgid "Number of contained backup sets: %d"
668 msgstr ""
669
670-#: ../duplicity/collections.py:377
671+#: ../duplicity/collections.py:399
672 #, python-format
673 msgid "Total number of contained volumes: %d"
674 msgstr ""
675
676-#: ../duplicity/collections.py:379
677+#: ../duplicity/collections.py:401
678 msgid "Type of backup set:"
679 msgstr ""
680
681-#: ../duplicity/collections.py:379
682+#: ../duplicity/collections.py:401
683 msgid "Time:"
684 msgstr ""
685
686-#: ../duplicity/collections.py:379
687+#: ../duplicity/collections.py:401
688 msgid "Num volumes:"
689 msgstr ""
690
691-#: ../duplicity/collections.py:383
692+#: ../duplicity/collections.py:405
693 msgid "Full"
694 msgstr ""
695
696-#: ../duplicity/collections.py:386
697+#: ../duplicity/collections.py:408
698 msgid "Incremental"
699 msgstr ""
700
701-#: ../duplicity/collections.py:446
702+#: ../duplicity/collections.py:468
703 msgid "local"
704 msgstr ""
705
706-#: ../duplicity/collections.py:448
707+#: ../duplicity/collections.py:470
708 msgid "remote"
709 msgstr ""
710
711-#: ../duplicity/collections.py:600
712+#: ../duplicity/collections.py:624
713 msgid "Collection Status"
714 msgstr ""
715
716-#: ../duplicity/collections.py:602
717+#: ../duplicity/collections.py:626
718 #, python-format
719 msgid "Connecting with backend: %s"
720 msgstr ""
721
722-#: ../duplicity/collections.py:604
723+#: ../duplicity/collections.py:628
724 #, python-format
725 msgid "Archive dir: %s"
726 msgstr ""
727
728-#: ../duplicity/collections.py:607
729+#: ../duplicity/collections.py:631
730 #, python-format
731-msgid "Found %d backup chain without signatures."
732-msgid_plural "Found %d backup chains without signatures."
733+msgid "Found %d secondary backup chain."
734+msgid_plural "Found %d secondary backup chains."
735 msgstr[0] ""
736 msgstr[1] ""
737
738-#: ../duplicity/collections.py:612
739+#: ../duplicity/collections.py:636
740 #, python-format
741-msgid "Signature-less chain %d of %d:"
742-msgstr ""
743-
744-#: ../duplicity/collections.py:618
745-msgid "Found a complete backup chain with matching signature chain:"
746-msgstr ""
747-
748-#: ../duplicity/collections.py:622
749+msgid "Secondary chain %d of %d:"
750+msgstr ""
751+
752+#: ../duplicity/collections.py:642
753+msgid "Found primary backup chain with matching signature chain:"
754+msgstr ""
755+
756+#: ../duplicity/collections.py:646
757 msgid "No backup chains with active signatures found"
758 msgstr ""
759
760-#: ../duplicity/collections.py:625
761+#: ../duplicity/collections.py:649
762 #, python-format
763 msgid "Also found %d backup set not part of any chain,"
764 msgid_plural "Also found %d backup sets not part of any chain,"
765 msgstr[0] ""
766 msgstr[1] ""
767
768-#: ../duplicity/collections.py:629
769+#: ../duplicity/collections.py:653
770 #, python-format
771 msgid "and %d incomplete backup set."
772 msgid_plural "and %d incomplete backup sets."
773@@ -461,101 +464,102 @@
774 msgstr[1] ""
775
776 #. "cleanup" is a hard-coded command, so do not translate it
777-#: ../duplicity/collections.py:634
778+#: ../duplicity/collections.py:658
779 msgid "These may be deleted by running duplicity with the \"cleanup\" command."
780 msgstr ""
781
782-#: ../duplicity/collections.py:637
783+#: ../duplicity/collections.py:661
784 msgid "No orphaned or incomplete backup sets found."
785 msgstr ""
786
787-#: ../duplicity/collections.py:653
788+#: ../duplicity/collections.py:677
789 #, python-format
790 msgid "%d file exists on backend"
791 msgid_plural "%d files exist on backend"
792 msgstr[0] ""
793 msgstr[1] ""
794
795-#: ../duplicity/collections.py:660
796+#: ../duplicity/collections.py:684
797 #, python-format
798 msgid "%d file exists in cache"
799 msgid_plural "%d files exist in cache"
800 msgstr[0] ""
801 msgstr[1] ""
802
803-#: ../duplicity/collections.py:712
804+#: ../duplicity/collections.py:736
805 msgid "Warning, discarding last backup set, because of missing signature file."
806 msgstr ""
807
808-#: ../duplicity/collections.py:745
809+#: ../duplicity/collections.py:759
810 msgid "Warning, found the following local orphaned signature file:"
811 msgid_plural "Warning, found the following local orphaned signature files:"
812 msgstr[0] ""
813 msgstr[1] ""
814
815-#: ../duplicity/collections.py:754
816+#: ../duplicity/collections.py:768
817 msgid "Warning, found the following remote orphaned signature file:"
818 msgid_plural "Warning, found the following remote orphaned signature files:"
819 msgstr[0] ""
820 msgstr[1] ""
821
822-#: ../duplicity/collections.py:764
823-msgid "Warning, found an unnecessary signature chain"
824-msgid_plural "Warning, found unnecessary signature chains"
825-msgstr[0] ""
826-msgstr[1] ""
827-
828-#: ../duplicity/collections.py:772
829+#: ../duplicity/collections.py:777
830 msgid "Warning, found signatures but no corresponding backup files"
831 msgstr ""
832
833-#: ../duplicity/collections.py:776
834+#: ../duplicity/collections.py:781
835 msgid ""
836 "Warning, found incomplete backup sets, probably left from aborted session"
837 msgstr ""
838
839-#: ../duplicity/collections.py:780
840+#: ../duplicity/collections.py:785
841 msgid "Warning, found the following orphaned backup file:"
842 msgid_plural "Warning, found the following orphaned backup files:"
843 msgstr[0] ""
844 msgstr[1] ""
845
846-#: ../duplicity/collections.py:798
847+#: ../duplicity/collections.py:803
848 #, python-format
849 msgid "Extracting backup chains from list of files: %s"
850 msgstr ""
851
852-#: ../duplicity/collections.py:808
853+#: ../duplicity/collections.py:818
854 #, python-format
855 msgid "File %s is part of known set"
856 msgstr ""
857
858-#: ../duplicity/collections.py:811
859+#: ../duplicity/collections.py:821
860 #, python-format
861 msgid "File %s is not part of a known set; creating new set"
862 msgstr ""
863
864-#: ../duplicity/collections.py:816
865+#: ../duplicity/collections.py:826
866 #, python-format
867 msgid "Ignoring file (rejected by backup set) '%s'"
868 msgstr ""
869
870-#: ../duplicity/collections.py:829
871+#: ../duplicity/collections.py:839
872 #, python-format
873 msgid "Found backup chain %s"
874 msgstr ""
875
876-#: ../duplicity/collections.py:834
877+#: ../duplicity/collections.py:844
878 #, python-format
879 msgid "Added set %s to pre-existing chain %s"
880 msgstr ""
881
882-#: ../duplicity/collections.py:838
883+#: ../duplicity/collections.py:848
884 #, python-format
885 msgid "Found orphaned set %s"
886 msgstr ""
887
888-#: ../duplicity/commandline.py:125
889+#: ../duplicity/collections.py:1004
890+#, python-format
891+msgid ""
892+"No signature chain for the requested time. Using oldest available chain, "
893+"starting at time %s."
894+msgstr ""
895+
896+#: ../duplicity/commandline.py:129
897 #, python-format
898 msgid ""
899 "Warning: Option %s is pending deprecation and will be removed in a future "
900@@ -563,164 +567,164 @@
901 "Use of default filenames is strongly suggested."
902 msgstr ""
903
904-#: ../duplicity/commandline.py:176
905+#: ../duplicity/commandline.py:180
906 #, python-format
907 msgid "Error opening file %s"
908 msgstr ""
909
910-#: ../duplicity/commandline.py:288
911+#: ../duplicity/commandline.py:294
912 msgid "Unable to load gio module"
913 msgstr ""
914
915-#: ../duplicity/commandline.py:383
916+#: ../duplicity/commandline.py:389
917 msgid ""
918 "running in 'ignore errors' mode due to --ignore-errors; please re-consider "
919 "if this was not intended"
920 msgstr ""
921
922-#: ../duplicity/commandline.py:423
923+#: ../duplicity/commandline.py:435
924 #, python-format
925 msgid "Using archive dir: %s"
926 msgstr ""
927
928-#: ../duplicity/commandline.py:424
929+#: ../duplicity/commandline.py:436
930 #, python-format
931 msgid "Using backup name: %s"
932 msgstr ""
933
934-#: ../duplicity/commandline.py:431
935+#: ../duplicity/commandline.py:443
936 #, python-format
937 msgid "Command line error: %s"
938 msgstr ""
939
940-#: ../duplicity/commandline.py:432
941+#: ../duplicity/commandline.py:444
942 msgid "Enter 'duplicity --help' for help screen."
943 msgstr ""
944
945 #. Used in usage help to represent a Unix-style path name. Example:
946 #. rsync://user[:password]@other_host[:port]//absolute_path
947-#: ../duplicity/commandline.py:445
948+#: ../duplicity/commandline.py:457
949 msgid "absolute_path"
950 msgstr ""
951
952 #. Used in usage help. Example:
953 #. tahoe://alias/some_dir
954-#: ../duplicity/commandline.py:449
955+#: ../duplicity/commandline.py:461
956 msgid "alias"
957 msgstr ""
958
959 #. Used in usage help (noun)
960-#: ../duplicity/commandline.py:452
961+#: ../duplicity/commandline.py:464
962 msgid "backup name"
963 msgstr ""
964
965 #. Used in help to represent a "bucket name" for Amazon Web
966 #. Services' Simple Storage Service (S3). Example:
967 #. s3://other.host/bucket_name[/prefix]
968-#: ../duplicity/commandline.py:457
969+#: ../duplicity/commandline.py:469
970 msgid "bucket_name"
971 msgstr ""
972
973 #. abbreviation for "character" (noun)
974-#: ../duplicity/commandline.py:460
975+#: ../duplicity/commandline.py:472
976 msgid "char"
977 msgstr ""
978
979 #. noun
980-#: ../duplicity/commandline.py:463
981+#: ../duplicity/commandline.py:475
982 msgid "command"
983 msgstr ""
984
985 #. Used in usage help to represent the name of a container in
986 #. Amazon Web Services' Cloudfront. Example:
987 #. cf+http://container_name
988-#: ../duplicity/commandline.py:468
989+#: ../duplicity/commandline.py:480
990 msgid "container_name"
991 msgstr ""
992
993 #. noun
994-#: ../duplicity/commandline.py:471
995+#: ../duplicity/commandline.py:483
996 msgid "count"
997 msgstr ""
998
999 #. Used in usage help to represent the name of a file directory
1000-#: ../duplicity/commandline.py:474
1001+#: ../duplicity/commandline.py:486
1002 msgid "directory"
1003 msgstr ""
1004
1005 #. Used in usage help to represent the name of a file. Example:
1006 #. --log-file <filename>
1007-#: ../duplicity/commandline.py:478
1008+#: ../duplicity/commandline.py:490
1009 msgid "filename"
1010 msgstr ""
1011
1012 #. Used in usage help to represent an ID for a GnuPG key. Example:
1013 #. --encrypt-key <gpg_key_id>
1014-#: ../duplicity/commandline.py:482
1015+#: ../duplicity/commandline.py:494
1016 msgid "gpg-key-id"
1017 msgstr ""
1018
1019 #. Used in usage help, e.g. to represent the name of a code
1020 #. module. Example:
1021 #. rsync://user[:password]@other.host[:port]::/module/some_dir
1022-#: ../duplicity/commandline.py:487
1023+#: ../duplicity/commandline.py:499
1024 msgid "module"
1025 msgstr ""
1026
1027 #. Used in usage help to represent a desired number of
1028 #. something. Example:
1029 #. --num-retries <number>
1030-#: ../duplicity/commandline.py:492
1031+#: ../duplicity/commandline.py:504
1032 msgid "number"
1033 msgstr ""
1034
1035 #. Used in usage help. (Should be consistent with the "Options:"
1036 #. header.) Example:
1037 #. duplicity [full|incremental] [options] source_dir target_url
1038-#: ../duplicity/commandline.py:497
1039+#: ../duplicity/commandline.py:509
1040 msgid "options"
1041 msgstr ""
1042
1043 #. Used in usage help to represent an internet hostname. Example:
1044 #. ftp://user[:password]@other.host[:port]/some_dir
1045-#: ../duplicity/commandline.py:501
1046+#: ../duplicity/commandline.py:513
1047 msgid "other.host"
1048 msgstr ""
1049
1050 #. Used in usage help. Example:
1051 #. ftp://user[:password]@other.host[:port]/some_dir
1052-#: ../duplicity/commandline.py:505
1053+#: ../duplicity/commandline.py:517
1054 msgid "password"
1055 msgstr ""
1056
1057 #. Used in usage help to represent a Unix-style path name. Example:
1058 #. --archive-dir <path>
1059-#: ../duplicity/commandline.py:509
1060+#: ../duplicity/commandline.py:521
1061 msgid "path"
1062 msgstr ""
1063
1064 #. Used in usage help to represent a TCP port number. Example:
1065 #. ftp://user[:password]@other.host[:port]/some_dir
1066-#: ../duplicity/commandline.py:513
1067+#: ../duplicity/commandline.py:525
1068 msgid "port"
1069 msgstr ""
1070
1071 #. Used in usage help. This represents a string to be used as a
1072 #. prefix to names for backup files created by Duplicity. Example:
1073 #. s3://other.host/bucket_name[/prefix]
1074-#: ../duplicity/commandline.py:518
1075+#: ../duplicity/commandline.py:530
1076 msgid "prefix"
1077 msgstr ""
1078
1079 #. Used in usage help to represent a Unix-style path name. Example:
1080 #. rsync://user[:password]@other.host[:port]/relative_path
1081-#: ../duplicity/commandline.py:522
1082+#: ../duplicity/commandline.py:534
1083 msgid "relative_path"
1084 msgstr ""
1085
1086 #. Used in usage help. Example:
1087 #. --timeout <seconds>
1088-#: ../duplicity/commandline.py:526
1089+#: ../duplicity/commandline.py:538
1090 msgid "seconds"
1091 msgstr ""
1092
1093@@ -728,14 +732,14 @@
1094 #. matching one or more files, as described in the documentation.
1095 #. Example:
1096 #. --exclude <shell_pattern>
1097-#: ../duplicity/commandline.py:532
1098+#: ../duplicity/commandline.py:544
1099 msgid "shell_pattern"
1100 msgstr ""
1101
1102 #. Used in usage help to represent the name of a single file
1103 #. directory or a Unix-style path to a directory. Example:
1104 #. file:///some_dir
1105-#: ../duplicity/commandline.py:537
1106+#: ../duplicity/commandline.py:549
1107 msgid "some_dir"
1108 msgstr ""
1109
1110@@ -743,14 +747,14 @@
1111 #. directory or a Unix-style path to a directory where files will be
1112 #. coming FROM. Example:
1113 #. duplicity [full|incremental] [options] source_dir target_url
1114-#: ../duplicity/commandline.py:543
1115+#: ../duplicity/commandline.py:555
1116 msgid "source_dir"
1117 msgstr ""
1118
1119 #. Used in usage help to represent a URL files will be coming
1120 #. FROM. Example:
1121 #. duplicity [restore] [options] source_url target_dir
1122-#: ../duplicity/commandline.py:548
1123+#: ../duplicity/commandline.py:560
1124 msgid "source_url"
1125 msgstr ""
1126
1127@@ -758,60 +762,60 @@
1128 #. directory or a Unix-style path to a directory. where files will be
1129 #. going TO. Example:
1130 #. duplicity [restore] [options] source_url target_dir
1131-#: ../duplicity/commandline.py:554
1132+#: ../duplicity/commandline.py:566
1133 msgid "target_dir"
1134 msgstr ""
1135
1136 #. Used in usage help to represent a URL files will be going TO.
1137 #. Example:
1138 #. duplicity [full|incremental] [options] source_dir target_url
1139-#: ../duplicity/commandline.py:559
1140+#: ../duplicity/commandline.py:571
1141 msgid "target_url"
1142 msgstr ""
1143
1144 #. Used in usage help to represent a time spec for a previous
1145 #. point in time, as described in the documentation. Example:
1146 #. duplicity remove-older-than time [options] target_url
1147-#: ../duplicity/commandline.py:564
1148+#: ../duplicity/commandline.py:576
1149 msgid "time"
1150 msgstr ""
1151
1152 #. Used in usage help to represent a user name (i.e. login).
1153 #. Example:
1154 #. ftp://user[:password]@other.host[:port]/some_dir
1155-#: ../duplicity/commandline.py:569
1156+#: ../duplicity/commandline.py:581
1157 msgid "user"
1158 msgstr ""
1159
1160-#: ../duplicity/commandline.py:571
1161+#: ../duplicity/commandline.py:583
1162 #, python-format
1163 msgid "duplicity version %s running on %s."
1164 msgstr ""
1165
1166 #. Header in usage help
1167-#: ../duplicity/commandline.py:575
1168+#: ../duplicity/commandline.py:587
1169 msgid "Usage:"
1170 msgstr ""
1171
1172 #. Header in usage help
1173-#: ../duplicity/commandline.py:588
1174+#: ../duplicity/commandline.py:600
1175 msgid "Backends and their URL formats:"
1176 msgstr ""
1177
1178 #. Header in usage help
1179-#: ../duplicity/commandline.py:608
1180+#: ../duplicity/commandline.py:620
1181 msgid "Commands:"
1182 msgstr ""
1183
1184 #. Header in usage help
1185-#: ../duplicity/commandline.py:622
1186+#: ../duplicity/commandline.py:634
1187 msgid "Options:"
1188 msgstr ""
1189
1190 #. In this portion of the usage instructions, "[ewnid]" indicates which
1191 #. characters are permitted (e, w, n, i, or d); the brackets imply their own
1192 #. meaning in regex; i.e., only one of the characters is allowed in an instance.
1193-#: ../duplicity/commandline.py:676
1194+#: ../duplicity/commandline.py:689
1195 msgid ""
1196 " Verbosity must be one of: digit [0-9], character [ewnid],\n"
1197 " or word ['error', 'warning', 'notice', 'info', 'debug'].\n"
1198@@ -819,36 +823,36 @@
1199 " that verbosity level is set at 2 (Warning) or higher.\n"
1200 msgstr ""
1201
1202-#: ../duplicity/commandline.py:702
1203+#: ../duplicity/commandline.py:715
1204 #, python-format
1205 msgid "Specified archive directory '%s' does not exist, or is not a directory"
1206 msgstr ""
1207
1208-#: ../duplicity/commandline.py:711
1209+#: ../duplicity/commandline.py:724
1210 #, python-format
1211 msgid ""
1212 "Sign key should be an 8 character hex string, like 'AA0E73D2'.\n"
1213 "Received '%s' instead."
1214 msgstr ""
1215
1216-#: ../duplicity/commandline.py:769
1217+#: ../duplicity/commandline.py:782
1218 #, python-format
1219 msgid ""
1220 "Restore destination directory %s already exists.\n"
1221 "Will not overwrite."
1222 msgstr ""
1223
1224-#: ../duplicity/commandline.py:774
1225+#: ../duplicity/commandline.py:787
1226 #, python-format
1227 msgid "Verify directory %s does not exist"
1228 msgstr ""
1229
1230-#: ../duplicity/commandline.py:780
1231+#: ../duplicity/commandline.py:793
1232 #, python-format
1233 msgid "Backup source directory %s does not exist."
1234 msgstr ""
1235
1236-#: ../duplicity/commandline.py:855
1237+#: ../duplicity/commandline.py:868
1238 #, python-format
1239 msgid ""
1240 "Bad URL '%s'.\n"
1241@@ -856,36 +860,36 @@
1242 "\"file:///usr/local\". See the man page for more information."
1243 msgstr ""
1244
1245-#: ../duplicity/commandline.py:880
1246+#: ../duplicity/commandline.py:893
1247 msgid "Main action: "
1248 msgstr ""
1249
1250-#: ../duplicity/diffdir.py:105
1251+#: ../duplicity/diffdir.py:104
1252 #, python-format
1253 msgid "Error %s getting delta for %s"
1254 msgstr ""
1255
1256-#: ../duplicity/diffdir.py:119
1257+#: ../duplicity/diffdir.py:118
1258 #, python-format
1259 msgid "Getting delta of %s and %s"
1260 msgstr ""
1261
1262-#: ../duplicity/diffdir.py:164
1263+#: ../duplicity/diffdir.py:163
1264 #, python-format
1265 msgid "A %s"
1266 msgstr ""
1267
1268-#: ../duplicity/diffdir.py:171
1269+#: ../duplicity/diffdir.py:170
1270 #, python-format
1271 msgid "M %s"
1272 msgstr ""
1273
1274-#: ../duplicity/diffdir.py:193
1275+#: ../duplicity/diffdir.py:192
1276 #, python-format
1277 msgid "Comparing %s and %s"
1278 msgstr ""
1279
1280-#: ../duplicity/diffdir.py:199
1281+#: ../duplicity/diffdir.py:198
1282 #, python-format
1283 msgid "D %s"
1284 msgstr ""
1285@@ -913,22 +917,22 @@
1286 "the day)."
1287 msgstr ""
1288
1289-#: ../duplicity/lazy.py:326
1290+#: ../duplicity/lazy.py:325
1291 #, python-format
1292 msgid "Warning: oldindex %s >= newindex %s"
1293 msgstr ""
1294
1295-#: ../duplicity/lazy.py:401
1296+#: ../duplicity/lazy.py:400
1297 #, python-format
1298 msgid "Error '%s' processing %s"
1299 msgstr ""
1300
1301-#: ../duplicity/lazy.py:409
1302+#: ../duplicity/lazy.py:408
1303 #, python-format
1304 msgid "Skipping %s because of previous error"
1305 msgstr ""
1306
1307-#: ../duplicity/manifest.py:86
1308+#: ../duplicity/manifest.py:87
1309 #, python-format
1310 msgid ""
1311 "Fatal Error: Backup source host has changed.\n"
1312@@ -936,7 +940,7 @@
1313 "Previous hostname: %s"
1314 msgstr ""
1315
1316-#: ../duplicity/manifest.py:91
1317+#: ../duplicity/manifest.py:94
1318 #, python-format
1319 msgid ""
1320 "Fatal Error: Backup source directory has changed.\n"
1321@@ -944,7 +948,7 @@
1322 "Previous directory: %s"
1323 msgstr ""
1324
1325-#: ../duplicity/manifest.py:98
1326+#: ../duplicity/manifest.py:103
1327 msgid ""
1328 "Aborting because you may have accidentally tried to backup two different "
1329 "data sets to the same remote location, or using the same archive directory. "
1330@@ -952,39 +956,39 @@
1331 "seeing this message"
1332 msgstr ""
1333
1334-#: ../duplicity/manifest.py:193
1335+#: ../duplicity/manifest.py:198
1336 msgid "Manifests not equal because different volume numbers"
1337 msgstr ""
1338
1339-#: ../duplicity/manifest.py:198
1340+#: ../duplicity/manifest.py:203
1341 msgid "Manifests not equal because volume lists differ"
1342 msgstr ""
1343
1344-#: ../duplicity/manifest.py:203
1345+#: ../duplicity/manifest.py:208
1346 msgid "Manifests not equal because hosts or directories differ"
1347 msgstr ""
1348
1349-#: ../duplicity/manifest.py:350
1350+#: ../duplicity/manifest.py:355
1351 msgid "Warning, found extra Volume identifier"
1352 msgstr ""
1353
1354-#: ../duplicity/manifest.py:376
1355+#: ../duplicity/manifest.py:381
1356 msgid "Other is not VolumeInfo"
1357 msgstr ""
1358
1359-#: ../duplicity/manifest.py:379
1360+#: ../duplicity/manifest.py:384
1361 msgid "Volume numbers don't match"
1362 msgstr ""
1363
1364-#: ../duplicity/manifest.py:382
1365+#: ../duplicity/manifest.py:387
1366 msgid "start_indicies don't match"
1367 msgstr ""
1368
1369-#: ../duplicity/manifest.py:385
1370+#: ../duplicity/manifest.py:390
1371 msgid "end_index don't match"
1372 msgstr ""
1373
1374-#: ../duplicity/manifest.py:392
1375+#: ../duplicity/manifest.py:397
1376 msgid "Hashes don't match"
1377 msgstr ""
1378
1379@@ -1000,12 +1004,12 @@
1380 "Renaming %s to %s"
1381 msgstr ""
1382
1383-#: ../duplicity/patchdir.py:72 ../duplicity/patchdir.py:77
1384+#: ../duplicity/patchdir.py:71 ../duplicity/patchdir.py:76
1385 #, python-format
1386 msgid "Patching %s"
1387 msgstr ""
1388
1389-#: ../duplicity/patchdir.py:565
1390+#: ../duplicity/patchdir.py:564
1391 #, python-format
1392 msgid "Writing %s of type %s"
1393 msgstr ""
1394@@ -1084,33 +1088,33 @@
1395 msgid "Error listing directory %s"
1396 msgstr ""
1397
1398-#: ../duplicity/selection.py:120
1399+#: ../duplicity/selection.py:118
1400 #, python-format
1401 msgid "Skipping socket %s"
1402 msgstr ""
1403
1404-#: ../duplicity/selection.py:124
1405+#: ../duplicity/selection.py:122
1406 #, python-format
1407 msgid "Error initializing file %s"
1408 msgstr ""
1409
1410-#: ../duplicity/selection.py:128 ../duplicity/selection.py:149
1411+#: ../duplicity/selection.py:126 ../duplicity/selection.py:147
1412 #, python-format
1413 msgid "Error accessing possibly locked file %s"
1414 msgstr ""
1415
1416-#: ../duplicity/selection.py:164
1417+#: ../duplicity/selection.py:162
1418 #, python-format
1419 msgid "Warning: base %s doesn't exist, continuing"
1420 msgstr ""
1421
1422-#: ../duplicity/selection.py:167 ../duplicity/selection.py:185
1423-#: ../duplicity/selection.py:188
1424+#: ../duplicity/selection.py:165 ../duplicity/selection.py:183
1425+#: ../duplicity/selection.py:186
1426 #, python-format
1427 msgid "Selecting %s"
1428 msgstr ""
1429
1430-#: ../duplicity/selection.py:269
1431+#: ../duplicity/selection.py:267
1432 #, python-format
1433 msgid ""
1434 "Fatal Error: The file specification\n"
1435@@ -1121,14 +1125,14 @@
1436 "pattern (such as '**') which matches the base directory."
1437 msgstr ""
1438
1439-#: ../duplicity/selection.py:277
1440+#: ../duplicity/selection.py:275
1441 #, python-format
1442 msgid ""
1443 "Fatal Error while processing expression\n"
1444 "%s"
1445 msgstr ""
1446
1447-#: ../duplicity/selection.py:287
1448+#: ../duplicity/selection.py:285
1449 #, python-format
1450 msgid ""
1451 "Last selection expression:\n"
1452@@ -1138,43 +1142,43 @@
1453 "probably isn't what you meant."
1454 msgstr ""
1455
1456-#: ../duplicity/selection.py:312
1457+#: ../duplicity/selection.py:310
1458 #, python-format
1459 msgid "Reading filelist %s"
1460 msgstr ""
1461
1462-#: ../duplicity/selection.py:315
1463+#: ../duplicity/selection.py:313
1464 #, python-format
1465 msgid "Sorting filelist %s"
1466 msgstr ""
1467
1468-#: ../duplicity/selection.py:342
1469+#: ../duplicity/selection.py:340
1470 #, python-format
1471 msgid ""
1472 "Warning: file specification '%s' in filelist %s\n"
1473 "doesn't start with correct prefix %s. Ignoring."
1474 msgstr ""
1475
1476-#: ../duplicity/selection.py:346
1477+#: ../duplicity/selection.py:344
1478 msgid "Future prefix errors will not be logged."
1479 msgstr ""
1480
1481-#: ../duplicity/selection.py:362
1482+#: ../duplicity/selection.py:360
1483 #, python-format
1484 msgid "Error closing filelist %s"
1485 msgstr ""
1486
1487-#: ../duplicity/selection.py:429
1488+#: ../duplicity/selection.py:427
1489 #, python-format
1490 msgid "Reading globbing filelist %s"
1491 msgstr ""
1492
1493-#: ../duplicity/selection.py:462
1494+#: ../duplicity/selection.py:460
1495 #, python-format
1496 msgid "Error compiling regular expression %s"
1497 msgstr ""
1498
1499-#: ../duplicity/selection.py:478
1500+#: ../duplicity/selection.py:476
1501 msgid ""
1502 "Warning: exclude-device-files is not the first selector.\n"
1503 "This may not be what you intended"

Subscribers

People subscribed via source and target branches