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

Proposed by Michael Terry
Status: Merged
Merged at revision: not available
Proposed branch: lp:~mterry/duplicity/list-old-chains
Merge into: lp:~duplicity-team/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 Pending
Review via email: mp+13871@code.launchpad.net
To post a comment you must log in.
Revision history for this message
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
=== modified file 'duplicity-bin'
--- duplicity-bin 2009-10-09 13:47:41 +0000
+++ duplicity-bin 2009-10-23 20:45:20 +0000
@@ -444,7 +444,7 @@
444 bytes_written += man_outfp.to_remote()444 bytes_written += man_outfp.to_remote()
445 man_outfp.to_final()445 man_outfp.to_final()
446446
447 col_stats.set_values(sig_chain_warning=None).cleanup_signatures()447 col_stats.set_values(sig_chain_warning=None)
448448
449 print_statistics(diffdir.stats, bytes_written)449 print_statistics(diffdir.stats, bytes_written)
450450
@@ -528,11 +528,8 @@
528 @rtype: void528 @rtype: void
529 @return: void529 @return: void
530 """530 """
531 sig_chain = check_sig_chain(col_stats)531 time = globals.restore_time or dup_time.curtime
532 if not sig_chain:532 sig_chain = col_stats.get_signature_chain_at_time(time)
533 log.FatalError(_("No signature data found, unable to list files."),
534 log.ErrorCode.no_sigs)
535 time = globals.restore_time # if None, will use latest
536 path_iter = diffdir.get_combined_path_iter(sig_chain.get_fileobjs(time))533 path_iter = diffdir.get_combined_path_iter(sig_chain.get_fileobjs(time))
537 for path in path_iter:534 for path in path_iter:
538 if path.difftype != "deleted":535 if path.difftype != "deleted":
@@ -704,7 +701,7 @@
704 @rtype: void701 @rtype: void
705 @return: void702 @return: void
706 """703 """
707 ext_local, ext_remote = col_stats.get_extraneous()704 ext_local, ext_remote = col_stats.get_extraneous(globals.extra_clean)
708 extraneous = ext_local + ext_remote705 extraneous = ext_local + ext_remote
709 if not extraneous:706 if not extraneous:
710 log.Warn(_("No extraneous files found, nothing deleted in cleanup."))707 log.Warn(_("No extraneous files found, nothing deleted in cleanup."))
@@ -789,7 +786,7 @@
789 setlist.reverse() # save oldest for last786 setlist.reverse() # save oldest for last
790 for set in setlist:787 for set in setlist:
791 set.delete()788 set.delete()
792 col_stats.set_values(sig_chain_warning=None).cleanup_signatures()789 col_stats.set_values(sig_chain_warning=None)
793 else:790 else:
794 log.Notice(gettext.ngettext("Found old backup set at the following time:",791 log.Notice(gettext.ngettext("Found old backup set at the following time:",
795 "Found old backup sets at the following times:",792 "Found old backup sets at the following times:",
796793
=== modified file 'duplicity.1'
--- duplicity.1 2009-07-21 20:46:04 +0000
+++ duplicity.1 2009-10-23 20:45:20 +0000
@@ -342,6 +342,14 @@
342section for more information.342section for more information.
343343
344.TP344.TP
345.B --extra-clean
346When cleaning up, be more aggressive about saving space. For example, this
347may delete signature files for old backup chains.
348See the
349.B cleanup
350argument for more information.
351
352.TP
345.BI "--file-to-restore " path353.BI "--file-to-restore " path
346This option may be given in restore mode, causing only354This option may be given in restore mode, causing only
347.I path355.I path
348356
=== modified file 'duplicity/collections.py'
--- duplicity/collections.py 2009-10-06 13:48:25 +0000
+++ duplicity/collections.py 2009-10-23 20:45:20 +0000
@@ -584,7 +584,7 @@
584 # These should be sorted by end_time584 # These should be sorted by end_time
585 self.all_backup_chains = None585 self.all_backup_chains = None
586 self.other_backup_chains = None586 self.other_backup_chains = None
587 self.other_sig_chains = None587 self.all_sig_chains = None
588588
589 # Other misc paths and sets which shouldn't be there589 # Other misc paths and sets which shouldn't be there
590 self.local_orphaned_sig_names = []590 self.local_orphaned_sig_names = []
@@ -604,6 +604,7 @@
604 "archive-dir %s" % (self.archive_dir,)]604 "archive-dir %s" % (self.archive_dir,)]
605605
606 for i in range(len(self.other_backup_chains)):606 for i in range(len(self.other_backup_chains)):
607 # A bit of a misnomer. Chain might have a sig.
607 l.append("chain-no-sig %d" % (i,))608 l.append("chain-no-sig %d" % (i,))
608 l += self.other_backup_chains[i].to_log_info(' ')609 l += self.other_backup_chains[i].to_log_info(' ')
609610
@@ -627,18 +628,18 @@
627 _("Archive dir: %s") % (self.archive_dir.name,)]628 _("Archive dir: %s") % (self.archive_dir.name,)]
628629
629 l.append("\n" +630 l.append("\n" +
630 gettext.ngettext("Found %d backup chain without signatures.",631 gettext.ngettext("Found %d secondary backup chain.",
631 "Found %d backup chains without signatures.",632 "Found %d secondary backup chains.",
632 len(self.other_backup_chains))633 len(self.other_backup_chains))
633 % len(self.other_backup_chains))634 % len(self.other_backup_chains))
634 for i in range(len(self.other_backup_chains)):635 for i in range(len(self.other_backup_chains)):
635 l.append(_("Signature-less chain %d of %d:") %636 l.append(_("Secondary chain %d of %d:") %
636 (i+1, len(self.other_backup_chains)))637 (i+1, len(self.other_backup_chains)))
637 l.append(str(self.other_backup_chains[i]))638 l.append(str(self.other_backup_chains[i]))
638 l.append("")639 l.append("")
639640
640 if self.matched_chain_pair:641 if self.matched_chain_pair:
641 l.append("\n" + _("Found a complete backup chain with matching "642 l.append("\n" + _("Found primary backup chain with matching "
642 "signature chain:"))643 "signature chain:"))
643 l.append(str(self.matched_chain_pair[1]))644 l.append(str(self.matched_chain_pair[1]))
644 else:645 else:
@@ -719,12 +720,12 @@
719 latest backup chain, use the local sig chain (it does not need720 latest backup chain, use the local sig chain (it does not need
720 to be downloaded).721 to be downloaded).
721 """722 """
722 self.other_sig_chains = sig_chains723 sig_chains = sig_chains and self.get_sorted_chains(sig_chains)
724 self.all_sig_chains = sig_chains
723 self.other_backup_chains = backup_chains[:]725 self.other_backup_chains = backup_chains[:]
724 self.matched_chain_pair = None726 self.matched_chain_pair = None
725 if sig_chains and backup_chains:727 if sig_chains and backup_chains:
726 latest_backup_chain = backup_chains[-1]728 latest_backup_chain = backup_chains[-1]
727 sig_chains = self.get_sorted_chains(sig_chains)
728 for i in range(len(sig_chains)-1, -1, -1):729 for i in range(len(sig_chains)-1, -1, -1):
729 if sig_chains[i].end_time == latest_backup_chain.end_time:730 if sig_chains[i].end_time == latest_backup_chain.end_time:
730 pass731 pass
@@ -743,19 +744,9 @@
743 if self.matched_chain_pair == None:744 if self.matched_chain_pair == None:
744 self.matched_chain_pair = (sig_chains[i], latest_backup_chain)745 self.matched_chain_pair = (sig_chains[i], latest_backup_chain)
745746
746 del sig_chains[i]
747 break747 break
748748
749 if self.matched_chain_pair:749 if self.matched_chain_pair:
750 # if we have local and remote sig chains, remove both from the other_sig_chains list
751 matched_sig_chain = self.matched_chain_pair[0]
752 if len(self.other_sig_chains) > 1:
753 for sig_chain in self.other_sig_chains[1:]:
754 if (sig_chain.islocal() != matched_sig_chain.islocal() and
755 sig_chain.start_time == matched_sig_chain.start_time and
756 sig_chain.end_time == matched_sig_chain.end_time):
757 self.other_sig_chains.remove(sig_chain)
758 self.other_sig_chains.remove(matched_sig_chain)
759 self.other_backup_chains.remove(self.matched_chain_pair[1])750 self.other_backup_chains.remove(self.matched_chain_pair[1])
760751
761 def warn(self, sig_chain_warning):752 def warn(self, sig_chain_warning):
@@ -782,18 +773,9 @@
782 + "\n" + "\n".join(self.remote_orphaned_sig_names),773 + "\n" + "\n".join(self.remote_orphaned_sig_names),
783 log.WarningCode.orphaned_sig)774 log.WarningCode.orphaned_sig)
784775
785 if self.other_sig_chains and sig_chain_warning:776 if self.all_sig_chains and sig_chain_warning and not self.matched_chain_pair:
786 if self.matched_chain_pair:777 log.Warn(_("Warning, found signatures but no corresponding "
787 log.Warn(gettext.ngettext("Warning, found an unnecessary "778 "backup files"), log.WarningCode.unmatched_sig)
788 "signature chain",
789 "Warning, found unnecessary "
790 "signature chains",
791 len(self.other_sig_chains))
792 + "\n" + "\n".join([f.fullsig for f in self.other_sig_chains]),
793 log.WarningCode.unnecessary_sig)
794 else:
795 log.Warn(_("Warning, found signatures but no corresponding "
796 "backup files"), log.WarningCode.unmatched_sig)
797779
798 if self.incomplete_backup_sets:780 if self.incomplete_backup_sets:
799 log.Warn(_("Warning, found incomplete backup sets, probably left "781 log.Warn(_("Warning, found incomplete backup sets, probably left "
@@ -995,13 +977,34 @@
995 else:977 else:
996 return self.all_backup_chains[0] # no chains are old enough978 return self.all_backup_chains[0] # no chains are old enough
997979
998 def cleanup_signatures(self):980 def get_signature_chain_at_time(self, time):
999 """981 """
1000 Delete unnecessary older signatures982 Return signature chain covering specified time
1001 """983
1002 map(SignatureChain.delete, self.other_sig_chains)984 Tries to find the signature chain covering the given time. If
1003985 there is none, return the earliest chain before, and failing
1004 def get_extraneous(self):986 that, the earliest chain.
987 """
988 if not self.all_sig_chains:
989 raise CollectionsError("No signature chains found")
990
991 covering_chains = filter(lambda c: c.start_time <= time <= c.end_time,
992 self.all_sig_chains)
993 if covering_chains:
994 return covering_chains[-1] # prefer local if multiple sig chains
995
996 old_chains = filter(lambda c: c.end_time < time,
997 self.all_sig_chains)
998 if old_chains:
999 return old_chains[-1]
1000 else:
1001 # no chains are old enough, give oldest and warn user
1002 oldest = self.all_sig_chains[0]
1003 if time < oldest.start_time:
1004 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))
1005 return oldest
1006
1007 def get_extraneous(self, extra_clean):
1005 """1008 """
1006 Return list of the names of extraneous duplicity files1009 Return list of the names of extraneous duplicity files
10071010
@@ -1012,14 +1015,23 @@
1012 assert self.values_set1015 assert self.values_set
1013 local_filenames = []1016 local_filenames = []
1014 remote_filenames = []1017 remote_filenames = []
1015 ext_containers = (self.other_sig_chains, self.orphaned_backup_sets,1018 ext_containers = self.orphaned_backup_sets + self.incomplete_backup_sets
1016 self.incomplete_backup_sets)1019 if extra_clean:
1017 for set_or_chain_list in ext_containers:1020 old_sig_chains = self.all_sig_chains[:]
1018 for set_or_chain in set_or_chain_list:1021 if self.matched_chain_pair:
1019 if set_or_chain.backend:1022 matched_sig_chain = self.matched_chain_pair[0]
1020 remote_filenames.extend(set_or_chain.get_filenames())1023 for sig_chain in self.all_sig_chains:
1021 else:1024 print sig_chain.start_time, matched_sig_chain.start_time,
1022 local_filenames.extend(set_or_chain.get_filenames())1025 print sig_chain.end_time, matched_sig_chain.end_time
1026 if (sig_chain.start_time == matched_sig_chain.start_time and
1027 sig_chain.end_time == matched_sig_chain.end_time):
1028 old_sig_chains.remove(sig_chain)
1029 ext_containers += old_sig_chains
1030 for set_or_chain in ext_containers:
1031 if set_or_chain.backend:
1032 remote_filenames.extend(set_or_chain.get_filenames())
1033 else:
1034 local_filenames.extend(set_or_chain.get_filenames())
1023 local_filenames += self.local_orphaned_sig_names1035 local_filenames += self.local_orphaned_sig_names
1024 remote_filenames += self.remote_orphaned_sig_names1036 remote_filenames += self.remote_orphaned_sig_names
1025 return local_filenames, remote_filenames1037 return local_filenames, remote_filenames
10261038
=== modified file 'duplicity/commandline.py'
--- duplicity/commandline.py 2009-09-18 14:16:34 +0000
+++ duplicity/commandline.py 2009-10-23 20:45:20 +0000
@@ -78,6 +78,7 @@
78 "exclude-filelist-stdin",78 "exclude-filelist-stdin",
79 "exclude-other-filesystems",79 "exclude-other-filesystems",
80 "exclude-regexp=",80 "exclude-regexp=",
81 "extra-clean",
81 "fail-on-volume=",82 "fail-on-volume=",
82 "file-to-restore=",83 "file-to-restore=",
83 "force",84 "force",
@@ -271,6 +272,8 @@
271 elif opt == "--exclude-filelist-stdin":272 elif opt == "--exclude-filelist-stdin":
272 select_opts.append(("--exclude-filelist", "standard input"))273 select_opts.append(("--exclude-filelist", "standard input"))
273 select_files.append(sys.stdin)274 select_files.append(sys.stdin)
275 elif opt == "--extra-clean":
276 globals.extra_clean = True
274 elif opt == "--fail-on-volume":277 elif opt == "--fail-on-volume":
275 globals.fail_on_volume = get_int(arg, opt)278 globals.fail_on_volume = get_int(arg, opt)
276 elif opt == "--full-if-older-than":279 elif opt == "--full-if-older-than":
@@ -641,6 +644,7 @@
641 --exclude-globbing-filelist <%(filename)s>644 --exclude-globbing-filelist <%(filename)s>
642 --exclude-other-filesystems645 --exclude-other-filesystems
643 --exclude-regexp <regexp>646 --exclude-regexp <regexp>
647 --extra-clean
644 --file-to-restore <%(path)s>648 --file-to-restore <%(path)s>
645 --full-if-older-than <%(time)s>649 --full-if-older-than <%(time)s>
646 --force650 --force
647651
=== modified file 'duplicity/globals.py'
--- duplicity/globals.py 2009-09-18 14:16:34 +0000
+++ duplicity/globals.py 2009-10-23 20:45:20 +0000
@@ -182,3 +182,6 @@
182182
183# if True the par2 recovery files will be created.183# if True the par2 recovery files will be created.
184par2 = False184par2 = False
185
186# If we should be particularly aggressive when cleaning up
187extra_clean = False
185188
=== modified file 'duplicity/log.py'
--- duplicity/log.py 2009-09-20 18:43:02 +0000
+++ duplicity/log.py 2009-10-23 20:45:20 +0000
@@ -128,6 +128,7 @@
128 cannot_iterate = 8128 cannot_iterate = 8
129 cannot_stat = 9129 cannot_stat = 9
130 cannot_read = 10130 cannot_read = 10
131 no_sig_for_time = 11
131132
132def Warn(s, code=WarningCode.generic, extra=None):133def Warn(s, code=WarningCode.generic, extra=None):
133 """Shortcut used for warning messages (verbosity 2)"""134 """Shortcut used for warning messages (verbosity 2)"""
134135
=== modified file 'po/duplicity.pot'
--- po/duplicity.pot 2009-09-15 11:34:45 +0000
+++ po/duplicity.pot 2009-10-23 20:45:20 +0000
@@ -8,7 +8,7 @@
8msgstr ""8msgstr ""
9"Project-Id-Version: PACKAGE VERSION\n"9"Project-Id-Version: PACKAGE VERSION\n"
10"Report-Msgid-Bugs-To: Kenneth Loafman <kenneth@loafman.com>\n"10"Report-Msgid-Bugs-To: Kenneth Loafman <kenneth@loafman.com>\n"
11"POT-Creation-Date: 2009-09-15 06:29-0500\n"11"POT-Creation-Date: 2009-10-23 16:29-0400\n"
12"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"12"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
13"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"13"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
14"Language-Team: LANGUAGE <LL@li.org>\n"14"Language-Team: LANGUAGE <LL@li.org>\n"
@@ -17,215 +17,211 @@
17"Content-Transfer-Encoding: 8bit\n"17"Content-Transfer-Encoding: 8bit\n"
18"Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n"18"Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n"
1919
20#: ../duplicity-bin:19120#: ../duplicity-bin:192
21#, python-format21#, python-format
22msgid ""22msgid ""
23"Unable to locate last file %s and block %d in backup set.\n"23"Unable to locate last file %s and block %d in backup set.\n"
24"Attempting restart on the next file %s."24"Attempting restart on the next file %s."
25msgstr ""25msgstr ""
2626
27#: ../duplicity-bin:19727#: ../duplicity-bin:198
28#, python-format28#, python-format
29msgid ""29msgid ""
30"Unable to locate last file %s and block %d in backup set.\n"30"Unable to locate last file %s and block %d in backup set.\n"
31"There are no more files to be backed up."31"There are no more files to be backed up."
32msgstr ""32msgstr ""
3333
34#: ../duplicity-bin:44334#: ../duplicity-bin:461
35msgid ""35msgid ""
36"Fatal Error: Unable to start incremental backup. Old signatures not found "36"Fatal Error: Unable to start incremental backup. Old signatures not found "
37"and incremental specified"37"and incremental specified"
38msgstr ""38msgstr ""
3939
40#: ../duplicity-bin:44740#: ../duplicity-bin:465
41msgid "No signatures found, switching to full backup."41msgid "No signatures found, switching to full backup."
42msgstr ""42msgstr ""
4343
44#: ../duplicity-bin:46144#: ../duplicity-bin:479
45msgid "Backup Statistics"45msgid "Backup Statistics"
46msgstr ""46msgstr ""
4747
48#: ../duplicity-bin:51548#: ../duplicity-bin:559
49msgid "No signature data found, unable to list files."
50msgstr ""
51
52#: ../duplicity-bin:544
53#, python-format49#, python-format
54msgid "%s not found in archive, no files restored."50msgid "%s not found in archive, no files restored."
55msgstr ""51msgstr ""
5652
57#: ../duplicity-bin:54853#: ../duplicity-bin:563
58msgid "No files found in archive - nothing restored."54msgid "No files found in archive - nothing restored."
59msgstr ""55msgstr ""
6056
61#: ../duplicity-bin:58157#: ../duplicity-bin:596
62#, python-format58#, python-format
63msgid "Processed volume %d of %d"59msgid "Processed volume %d of %d"
64msgstr ""60msgstr ""
6561
66#: ../duplicity-bin:62162#: ../duplicity-bin:636
67#, python-format63#, python-format
68msgid "Invalid data - %s hash mismatch:"64msgid "Invalid data - %s hash mismatch:"
69msgstr ""65msgstr ""
7066
71#: ../duplicity-bin:62267#: ../duplicity-bin:637
72#, python-format68#, python-format
73msgid "Calculated hash: %s"69msgid "Calculated hash: %s"
74msgstr ""70msgstr ""
7571
76#: ../duplicity-bin:62372#: ../duplicity-bin:638
77#, python-format73#, python-format
78msgid "Manifest hash: %s"74msgid "Manifest hash: %s"
79msgstr ""75msgstr ""
8076
81#: ../duplicity-bin:64077#: ../duplicity-bin:655
82#, python-format78#, python-format
83msgid "Volume was signed by key %s, not %s"79msgid "Volume was signed by key %s, not %s"
84msgstr ""80msgstr ""
8581
86#: ../duplicity-bin:67082#: ../duplicity-bin:685
87#, python-format83#, python-format
88msgid "Verify complete: %s, %s."84msgid "Verify complete: %s, %s."
89msgstr ""85msgstr ""
9086
91#: ../duplicity-bin:67187#: ../duplicity-bin:686
92#, python-format88#, python-format
93msgid "%d file compared"89msgid "%d file compared"
94msgid_plural "%d files compared"90msgid_plural "%d files compared"
95msgstr[0] ""91msgstr[0] ""
96msgstr[1] ""92msgstr[1] ""
9793
98#: ../duplicity-bin:67394#: ../duplicity-bin:688
99#, python-format95#, python-format
100msgid "%d difference found"96msgid "%d difference found"
101msgid_plural "%d differences found"97msgid_plural "%d differences found"
102msgstr[0] ""98msgstr[0] ""
103msgstr[1] ""99msgstr[1] ""
104100
105#: ../duplicity-bin:692101#: ../duplicity-bin:707
106msgid "No extraneous files found, nothing deleted in cleanup."102msgid "No extraneous files found, nothing deleted in cleanup."
107msgstr ""103msgstr ""
108104
109#: ../duplicity-bin:697105#: ../duplicity-bin:712
110msgid "Deleting this file from backend:"106msgid "Deleting this file from backend:"
111msgid_plural "Deleting these files from backend:"107msgid_plural "Deleting these files from backend:"
112msgstr[0] ""108msgstr[0] ""
113msgstr[1] ""109msgstr[1] ""
114110
115#: ../duplicity-bin:706111#: ../duplicity-bin:721
116msgid "Found the following file to delete:"112msgid "Found the following file to delete:"
117msgid_plural "Found the following files to delete:"113msgid_plural "Found the following files to delete:"
118msgstr[0] ""114msgstr[0] ""
119msgstr[1] ""115msgstr[1] ""
120116
121#: ../duplicity-bin:710117#: ../duplicity-bin:725
122msgid "Run duplicity again with the --force option to actually delete."118msgid "Run duplicity again with the --force option to actually delete."
123msgstr ""119msgstr ""
124120
125#: ../duplicity-bin:749121#: ../duplicity-bin:764
126msgid "There are backup set(s) at time(s):"122msgid "There are backup set(s) at time(s):"
127msgstr ""123msgstr ""
128124
129#: ../duplicity-bin:751125#: ../duplicity-bin:766
130msgid "Which can't be deleted because newer sets depend on them."126msgid "Which can't be deleted because newer sets depend on them."
131msgstr ""127msgstr ""
132128
133#: ../duplicity-bin:755129#: ../duplicity-bin:770
134msgid ""130msgid ""
135"Current active backup chain is older than specified time. However, it will "131"Current active backup chain is older than specified time. However, it will "
136"not be deleted. To remove all your backups, manually purge the repository."132"not be deleted. To remove all your backups, manually purge the repository."
137msgstr ""133msgstr ""
138134
139#: ../duplicity-bin:761135#: ../duplicity-bin:776
140msgid "No old backup sets found, nothing deleted."136msgid "No old backup sets found, nothing deleted."
141msgstr ""137msgstr ""
142138
143#: ../duplicity-bin:764139#: ../duplicity-bin:779
144msgid "Deleting backup set at time:"140msgid "Deleting backup set at time:"
145msgid_plural "Deleting backup sets at times:"141msgid_plural "Deleting backup sets at times:"
146msgstr[0] ""142msgstr[0] ""
147msgstr[1] ""143msgstr[1] ""
148144
149#: ../duplicity-bin:776145#: ../duplicity-bin:791
150msgid "Found old backup set at the following time:"146msgid "Found old backup set at the following time:"
151msgid_plural "Found old backup sets at the following times:"147msgid_plural "Found old backup sets at the following times:"
152msgstr[0] ""148msgstr[0] ""
153msgstr[1] ""149msgstr[1] ""
154150
155#: ../duplicity-bin:780151#: ../duplicity-bin:795
156msgid "Rerun command with --force option to actually delete."152msgid "Rerun command with --force option to actually delete."
157msgstr ""153msgstr ""
158154
159#: ../duplicity-bin:863155#: ../duplicity-bin:882
160#, python-format156#, python-format
161msgid "Deleting local %s (not authoritative at backend)."157msgid "Deleting local %s (not authoritative at backend)."
162msgstr ""158msgstr ""
163159
164#: ../duplicity-bin:888 ../duplicity/dup_temp.py:239160#: ../duplicity-bin:907 ../duplicity/dup_temp.py:254
165#, python-format161#, python-format
166msgid "Failed to read %s: %s"162msgid "Failed to read %s: %s"
167msgstr ""163msgstr ""
168164
169#: ../duplicity-bin:899165#: ../duplicity-bin:918
170#, python-format166#, python-format
171msgid "Copying %s to local cache."167msgid "Copying %s to local cache."
172msgstr ""168msgstr ""
173169
174#: ../duplicity-bin:943170#: ../duplicity-bin:959
175msgid "Local and Remote metadata are synchronized, no sync needed."171msgid "Local and Remote metadata are synchronized, no sync needed."
176msgstr ""172msgstr ""
177173
178#: ../duplicity-bin:948174#: ../duplicity-bin:964
179msgid "Synchronizing remote metadata to local cache..."175msgid "Synchronizing remote metadata to local cache..."
180msgstr ""176msgstr ""
181177
182#: ../duplicity-bin:955178#: ../duplicity-bin:973
183msgid "Sync would copy the following from remote to local:"179msgid "Sync would copy the following from remote to local:"
184msgstr ""180msgstr ""
185181
186#: ../duplicity-bin:958182#: ../duplicity-bin:976
187msgid "Sync would remove the following spurious local files:"183msgid "Sync would remove the following spurious local files:"
188msgstr ""184msgstr ""
189185
190#: ../duplicity-bin:1001186#: ../duplicity-bin:1019
191msgid "Unable to get free space on temp."187msgid "Unable to get free space on temp."
192msgstr ""188msgstr ""
193189
194#: ../duplicity-bin:1009190#: ../duplicity-bin:1027
195#, python-format191#, python-format
196msgid "Temp space has %d available, backup needs approx %d."192msgid "Temp space has %d available, backup needs approx %d."
197msgstr ""193msgstr ""
198194
199#: ../duplicity-bin:1012195#: ../duplicity-bin:1030
200#, python-format196#, python-format
201msgid "Temp has %d available, backup will use approx %d."197msgid "Temp has %d available, backup will use approx %d."
202msgstr ""198msgstr ""
203199
204#: ../duplicity-bin:1020200#: ../duplicity-bin:1038
205msgid "Unable to get max open files."201msgid "Unable to get max open files."
206msgstr ""202msgstr ""
207203
208#: ../duplicity-bin:1024204#: ../duplicity-bin:1042
209#, python-format205#, python-format
210msgid ""206msgid ""
211"Max open files of %s is too low, should be >= 1024.\n"207"Max open files of %s is too low, should be >= 1024.\n"
212"Use 'ulimit -n 1024' or higher to correct.\n"208"Use 'ulimit -n 1024' or higher to correct.\n"
213msgstr ""209msgstr ""
214210
215#: ../duplicity-bin:1070211#: ../duplicity-bin:1088
216msgid ""212msgid ""
217"RESTART: The first volume failed to upload before termination.\n"213"RESTART: The first volume failed to upload before termination.\n"
218" Restart is impossible...starting backup from beginning."214" Restart is impossible...starting backup from beginning."
219msgstr ""215msgstr ""
220216
221#: ../duplicity-bin:1076217#: ../duplicity-bin:1094
222#, python-format218#, python-format
223msgid ""219msgid ""
224"RESTART: Volumes %d to %d failed to upload before termination.\n"220"RESTART: Volumes %d to %d failed to upload before termination.\n"
225" Restarting backup at volume %d."221" Restarting backup at volume %d."
226msgstr ""222msgstr ""
227223
228#: ../duplicity-bin:1084224#: ../duplicity-bin:1102
229#, python-format225#, python-format
230msgid ""226msgid ""
231"RESTART: Impossible backup state: manifest has %d vols, remote has %d vols.\n"227"RESTART: Impossible backup state: manifest has %d vols, remote has %d vols.\n"
@@ -234,39 +230,39 @@
234" backup then restart the backup from the beginning."230" backup then restart the backup from the beginning."
235msgstr ""231msgstr ""
236232
237#: ../duplicity-bin:1162233#: ../duplicity-bin:1180
238#, python-format234#, python-format
239msgid "Last %s backup left a partial set, restarting."235msgid "Last %s backup left a partial set, restarting."
240msgstr ""236msgstr ""
241237
242#: ../duplicity-bin:1166238#: ../duplicity-bin:1184
243#, python-format239#, python-format
244msgid "Cleaning up previous partial %s backup set, restarting."240msgid "Cleaning up previous partial %s backup set, restarting."
245msgstr ""241msgstr ""
246242
247#: ../duplicity-bin:1177243#: ../duplicity-bin:1195
248msgid "Last full backup date:"244msgid "Last full backup date:"
249msgstr ""245msgstr ""
250246
251#: ../duplicity-bin:1179247#: ../duplicity-bin:1197
252msgid "Last full backup date: none"248msgid "Last full backup date: none"
253msgstr ""249msgstr ""
254250
255#: ../duplicity-bin:1181251#: ../duplicity-bin:1199
256msgid "Last full backup is too old, forcing full backup"252msgid "Last full backup is too old, forcing full backup"
257msgstr ""253msgstr ""
258254
259#: ../duplicity-bin:1255255#: ../duplicity-bin:1275
260#, python-format256#, python-format
261msgid "GPG error detail: %s"257msgid "GPG error detail: %s"
262msgstr ""258msgstr ""
263259
264#: ../duplicity-bin:1264260#: ../duplicity-bin:1284
265#, python-format261#, python-format
266msgid "User error detail: %s"262msgid "User error detail: %s"
267msgstr ""263msgstr ""
268264
269#: ../duplicity-bin:1273265#: ../duplicity-bin:1293
270#, python-format266#, python-format
271msgid "Backend error detail: %s"267msgid "Backend error detail: %s"
272msgstr ""268msgstr ""
@@ -338,122 +334,129 @@
338msgid "Reading results of '%s'"334msgid "Reading results of '%s'"
339msgstr ""335msgstr ""
340336
341#: ../duplicity/collections.py:176337#: ../duplicity/collections.py:98
338msgid ""
339"Fatal Error: There are remote par2 files but par2 executable is not "
340"available.\n"
341"Either install par2 or pass --force option to force the operation."
342msgstr ""
343
344#: ../duplicity/collections.py:198
342msgid "Fatal Error: No manifests found for most recent backup"345msgid "Fatal Error: No manifests found for most recent backup"
343msgstr ""346msgstr ""
344347
345#: ../duplicity/collections.py:185348#: ../duplicity/collections.py:207
346msgid ""349msgid ""
347"Fatal Error: Remote manifest does not match local one. Either the remote "350"Fatal Error: Remote manifest does not match local one. Either the remote "
348"backup set or the local archive directory has been corrupted."351"backup set or the local archive directory has been corrupted."
349msgstr ""352msgstr ""
350353
351#: ../duplicity/collections.py:193354#: ../duplicity/collections.py:215
352msgid "Fatal Error: Neither remote nor local manifest is readable."355msgid "Fatal Error: Neither remote nor local manifest is readable."
353msgstr ""356msgstr ""
354357
355#: ../duplicity/collections.py:299358#: ../duplicity/collections.py:321
356msgid "Preferring Backupset over previous one!"359msgid "Preferring Backupset over previous one!"
357msgstr ""360msgstr ""
358361
359#: ../duplicity/collections.py:302362#: ../duplicity/collections.py:324
360#, python-format363#, python-format
361msgid "Ignoring incremental Backupset (start_time: %s; needed: %s)"364msgid "Ignoring incremental Backupset (start_time: %s; needed: %s)"
362msgstr ""365msgstr ""
363366
364#: ../duplicity/collections.py:307367#: ../duplicity/collections.py:329
365#, python-format368#, python-format
366msgid "Added incremental Backupset (start_time: %s / end_time: %s)"369msgid "Added incremental Backupset (start_time: %s / end_time: %s)"
367msgstr ""370msgstr ""
368371
369#: ../duplicity/collections.py:373372#: ../duplicity/collections.py:395
370msgid "Chain start time: "373msgid "Chain start time: "
371msgstr ""374msgstr ""
372375
373#: ../duplicity/collections.py:374376#: ../duplicity/collections.py:396
374msgid "Chain end time: "377msgid "Chain end time: "
375msgstr ""378msgstr ""
376379
377#: ../duplicity/collections.py:375380#: ../duplicity/collections.py:397
378#, python-format381#, python-format
379msgid "Number of contained backup sets: %d"382msgid "Number of contained backup sets: %d"
380msgstr ""383msgstr ""
381384
382#: ../duplicity/collections.py:377385#: ../duplicity/collections.py:399
383#, python-format386#, python-format
384msgid "Total number of contained volumes: %d"387msgid "Total number of contained volumes: %d"
385msgstr ""388msgstr ""
386389
387#: ../duplicity/collections.py:379390#: ../duplicity/collections.py:401
388msgid "Type of backup set:"391msgid "Type of backup set:"
389msgstr ""392msgstr ""
390393
391#: ../duplicity/collections.py:379394#: ../duplicity/collections.py:401
392msgid "Time:"395msgid "Time:"
393msgstr ""396msgstr ""
394397
395#: ../duplicity/collections.py:379398#: ../duplicity/collections.py:401
396msgid "Num volumes:"399msgid "Num volumes:"
397msgstr ""400msgstr ""
398401
399#: ../duplicity/collections.py:383402#: ../duplicity/collections.py:405
400msgid "Full"403msgid "Full"
401msgstr ""404msgstr ""
402405
403#: ../duplicity/collections.py:386406#: ../duplicity/collections.py:408
404msgid "Incremental"407msgid "Incremental"
405msgstr ""408msgstr ""
406409
407#: ../duplicity/collections.py:446410#: ../duplicity/collections.py:468
408msgid "local"411msgid "local"
409msgstr ""412msgstr ""
410413
411#: ../duplicity/collections.py:448414#: ../duplicity/collections.py:470
412msgid "remote"415msgid "remote"
413msgstr ""416msgstr ""
414417
415#: ../duplicity/collections.py:600418#: ../duplicity/collections.py:624
416msgid "Collection Status"419msgid "Collection Status"
417msgstr ""420msgstr ""
418421
419#: ../duplicity/collections.py:602422#: ../duplicity/collections.py:626
420#, python-format423#, python-format
421msgid "Connecting with backend: %s"424msgid "Connecting with backend: %s"
422msgstr ""425msgstr ""
423426
424#: ../duplicity/collections.py:604427#: ../duplicity/collections.py:628
425#, python-format428#, python-format
426msgid "Archive dir: %s"429msgid "Archive dir: %s"
427msgstr ""430msgstr ""
428431
429#: ../duplicity/collections.py:607432#: ../duplicity/collections.py:631
430#, python-format433#, python-format
431msgid "Found %d backup chain without signatures."434msgid "Found %d secondary backup chain."
432msgid_plural "Found %d backup chains without signatures."435msgid_plural "Found %d secondary backup chains."
433msgstr[0] ""436msgstr[0] ""
434msgstr[1] ""437msgstr[1] ""
435438
436#: ../duplicity/collections.py:612439#: ../duplicity/collections.py:636
437#, python-format440#, python-format
438msgid "Signature-less chain %d of %d:"441msgid "Secondary chain %d of %d:"
439msgstr ""442msgstr ""
440443
441#: ../duplicity/collections.py:618444#: ../duplicity/collections.py:642
442msgid "Found a complete backup chain with matching signature chain:"445msgid "Found primary backup chain with matching signature chain:"
443msgstr ""446msgstr ""
444447
445#: ../duplicity/collections.py:622448#: ../duplicity/collections.py:646
446msgid "No backup chains with active signatures found"449msgid "No backup chains with active signatures found"
447msgstr ""450msgstr ""
448451
449#: ../duplicity/collections.py:625452#: ../duplicity/collections.py:649
450#, python-format453#, python-format
451msgid "Also found %d backup set not part of any chain,"454msgid "Also found %d backup set not part of any chain,"
452msgid_plural "Also found %d backup sets not part of any chain,"455msgid_plural "Also found %d backup sets not part of any chain,"
453msgstr[0] ""456msgstr[0] ""
454msgstr[1] ""457msgstr[1] ""
455458
456#: ../duplicity/collections.py:629459#: ../duplicity/collections.py:653
457#, python-format460#, python-format
458msgid "and %d incomplete backup set."461msgid "and %d incomplete backup set."
459msgid_plural "and %d incomplete backup sets."462msgid_plural "and %d incomplete backup sets."
@@ -461,101 +464,102 @@
461msgstr[1] ""464msgstr[1] ""
462465
463#. "cleanup" is a hard-coded command, so do not translate it466#. "cleanup" is a hard-coded command, so do not translate it
464#: ../duplicity/collections.py:634467#: ../duplicity/collections.py:658
465msgid "These may be deleted by running duplicity with the \"cleanup\" command."468msgid "These may be deleted by running duplicity with the \"cleanup\" command."
466msgstr ""469msgstr ""
467470
468#: ../duplicity/collections.py:637471#: ../duplicity/collections.py:661
469msgid "No orphaned or incomplete backup sets found."472msgid "No orphaned or incomplete backup sets found."
470msgstr ""473msgstr ""
471474
472#: ../duplicity/collections.py:653475#: ../duplicity/collections.py:677
473#, python-format476#, python-format
474msgid "%d file exists on backend"477msgid "%d file exists on backend"
475msgid_plural "%d files exist on backend"478msgid_plural "%d files exist on backend"
476msgstr[0] ""479msgstr[0] ""
477msgstr[1] ""480msgstr[1] ""
478481
479#: ../duplicity/collections.py:660482#: ../duplicity/collections.py:684
480#, python-format483#, python-format
481msgid "%d file exists in cache"484msgid "%d file exists in cache"
482msgid_plural "%d files exist in cache"485msgid_plural "%d files exist in cache"
483msgstr[0] ""486msgstr[0] ""
484msgstr[1] ""487msgstr[1] ""
485488
486#: ../duplicity/collections.py:712489#: ../duplicity/collections.py:736
487msgid "Warning, discarding last backup set, because of missing signature file."490msgid "Warning, discarding last backup set, because of missing signature file."
488msgstr ""491msgstr ""
489492
490#: ../duplicity/collections.py:745493#: ../duplicity/collections.py:759
491msgid "Warning, found the following local orphaned signature file:"494msgid "Warning, found the following local orphaned signature file:"
492msgid_plural "Warning, found the following local orphaned signature files:"495msgid_plural "Warning, found the following local orphaned signature files:"
493msgstr[0] ""496msgstr[0] ""
494msgstr[1] ""497msgstr[1] ""
495498
496#: ../duplicity/collections.py:754499#: ../duplicity/collections.py:768
497msgid "Warning, found the following remote orphaned signature file:"500msgid "Warning, found the following remote orphaned signature file:"
498msgid_plural "Warning, found the following remote orphaned signature files:"501msgid_plural "Warning, found the following remote orphaned signature files:"
499msgstr[0] ""502msgstr[0] ""
500msgstr[1] ""503msgstr[1] ""
501504
502#: ../duplicity/collections.py:764505#: ../duplicity/collections.py:777
503msgid "Warning, found an unnecessary signature chain"
504msgid_plural "Warning, found unnecessary signature chains"
505msgstr[0] ""
506msgstr[1] ""
507
508#: ../duplicity/collections.py:772
509msgid "Warning, found signatures but no corresponding backup files"506msgid "Warning, found signatures but no corresponding backup files"
510msgstr ""507msgstr ""
511508
512#: ../duplicity/collections.py:776509#: ../duplicity/collections.py:781
513msgid ""510msgid ""
514"Warning, found incomplete backup sets, probably left from aborted session"511"Warning, found incomplete backup sets, probably left from aborted session"
515msgstr ""512msgstr ""
516513
517#: ../duplicity/collections.py:780514#: ../duplicity/collections.py:785
518msgid "Warning, found the following orphaned backup file:"515msgid "Warning, found the following orphaned backup file:"
519msgid_plural "Warning, found the following orphaned backup files:"516msgid_plural "Warning, found the following orphaned backup files:"
520msgstr[0] ""517msgstr[0] ""
521msgstr[1] ""518msgstr[1] ""
522519
523#: ../duplicity/collections.py:798520#: ../duplicity/collections.py:803
524#, python-format521#, python-format
525msgid "Extracting backup chains from list of files: %s"522msgid "Extracting backup chains from list of files: %s"
526msgstr ""523msgstr ""
527524
528#: ../duplicity/collections.py:808525#: ../duplicity/collections.py:818
529#, python-format526#, python-format
530msgid "File %s is part of known set"527msgid "File %s is part of known set"
531msgstr ""528msgstr ""
532529
533#: ../duplicity/collections.py:811530#: ../duplicity/collections.py:821
534#, python-format531#, python-format
535msgid "File %s is not part of a known set; creating new set"532msgid "File %s is not part of a known set; creating new set"
536msgstr ""533msgstr ""
537534
538#: ../duplicity/collections.py:816535#: ../duplicity/collections.py:826
539#, python-format536#, python-format
540msgid "Ignoring file (rejected by backup set) '%s'"537msgid "Ignoring file (rejected by backup set) '%s'"
541msgstr ""538msgstr ""
542539
543#: ../duplicity/collections.py:829540#: ../duplicity/collections.py:839
544#, python-format541#, python-format
545msgid "Found backup chain %s"542msgid "Found backup chain %s"
546msgstr ""543msgstr ""
547544
548#: ../duplicity/collections.py:834545#: ../duplicity/collections.py:844
549#, python-format546#, python-format
550msgid "Added set %s to pre-existing chain %s"547msgid "Added set %s to pre-existing chain %s"
551msgstr ""548msgstr ""
552549
553#: ../duplicity/collections.py:838550#: ../duplicity/collections.py:848
554#, python-format551#, python-format
555msgid "Found orphaned set %s"552msgid "Found orphaned set %s"
556msgstr ""553msgstr ""
557554
558#: ../duplicity/commandline.py:125555#: ../duplicity/collections.py:1004
556#, python-format
557msgid ""
558"No signature chain for the requested time. Using oldest available chain, "
559"starting at time %s."
560msgstr ""
561
562#: ../duplicity/commandline.py:129
559#, python-format563#, python-format
560msgid ""564msgid ""
561"Warning: Option %s is pending deprecation and will be removed in a future "565"Warning: Option %s is pending deprecation and will be removed in a future "
@@ -563,164 +567,164 @@
563"Use of default filenames is strongly suggested."567"Use of default filenames is strongly suggested."
564msgstr ""568msgstr ""
565569
566#: ../duplicity/commandline.py:176570#: ../duplicity/commandline.py:180
567#, python-format571#, python-format
568msgid "Error opening file %s"572msgid "Error opening file %s"
569msgstr ""573msgstr ""
570574
571#: ../duplicity/commandline.py:288575#: ../duplicity/commandline.py:294
572msgid "Unable to load gio module"576msgid "Unable to load gio module"
573msgstr ""577msgstr ""
574578
575#: ../duplicity/commandline.py:383579#: ../duplicity/commandline.py:389
576msgid ""580msgid ""
577"running in 'ignore errors' mode due to --ignore-errors; please re-consider "581"running in 'ignore errors' mode due to --ignore-errors; please re-consider "
578"if this was not intended"582"if this was not intended"
579msgstr ""583msgstr ""
580584
581#: ../duplicity/commandline.py:423585#: ../duplicity/commandline.py:435
582#, python-format586#, python-format
583msgid "Using archive dir: %s"587msgid "Using archive dir: %s"
584msgstr ""588msgstr ""
585589
586#: ../duplicity/commandline.py:424590#: ../duplicity/commandline.py:436
587#, python-format591#, python-format
588msgid "Using backup name: %s"592msgid "Using backup name: %s"
589msgstr ""593msgstr ""
590594
591#: ../duplicity/commandline.py:431595#: ../duplicity/commandline.py:443
592#, python-format596#, python-format
593msgid "Command line error: %s"597msgid "Command line error: %s"
594msgstr ""598msgstr ""
595599
596#: ../duplicity/commandline.py:432600#: ../duplicity/commandline.py:444
597msgid "Enter 'duplicity --help' for help screen."601msgid "Enter 'duplicity --help' for help screen."
598msgstr ""602msgstr ""
599603
600#. Used in usage help to represent a Unix-style path name. Example:604#. Used in usage help to represent a Unix-style path name. Example:
601#. rsync://user[:password]@other_host[:port]//absolute_path605#. rsync://user[:password]@other_host[:port]//absolute_path
602#: ../duplicity/commandline.py:445606#: ../duplicity/commandline.py:457
603msgid "absolute_path"607msgid "absolute_path"
604msgstr ""608msgstr ""
605609
606#. Used in usage help. Example:610#. Used in usage help. Example:
607#. tahoe://alias/some_dir611#. tahoe://alias/some_dir
608#: ../duplicity/commandline.py:449612#: ../duplicity/commandline.py:461
609msgid "alias"613msgid "alias"
610msgstr ""614msgstr ""
611615
612#. Used in usage help (noun)616#. Used in usage help (noun)
613#: ../duplicity/commandline.py:452617#: ../duplicity/commandline.py:464
614msgid "backup name"618msgid "backup name"
615msgstr ""619msgstr ""
616620
617#. Used in help to represent a "bucket name" for Amazon Web621#. Used in help to represent a "bucket name" for Amazon Web
618#. Services' Simple Storage Service (S3). Example:622#. Services' Simple Storage Service (S3). Example:
619#. s3://other.host/bucket_name[/prefix]623#. s3://other.host/bucket_name[/prefix]
620#: ../duplicity/commandline.py:457624#: ../duplicity/commandline.py:469
621msgid "bucket_name"625msgid "bucket_name"
622msgstr ""626msgstr ""
623627
624#. abbreviation for "character" (noun)628#. abbreviation for "character" (noun)
625#: ../duplicity/commandline.py:460629#: ../duplicity/commandline.py:472
626msgid "char"630msgid "char"
627msgstr ""631msgstr ""
628632
629#. noun633#. noun
630#: ../duplicity/commandline.py:463634#: ../duplicity/commandline.py:475
631msgid "command"635msgid "command"
632msgstr ""636msgstr ""
633637
634#. Used in usage help to represent the name of a container in638#. Used in usage help to represent the name of a container in
635#. Amazon Web Services' Cloudfront. Example:639#. Amazon Web Services' Cloudfront. Example:
636#. cf+http://container_name640#. cf+http://container_name
637#: ../duplicity/commandline.py:468641#: ../duplicity/commandline.py:480
638msgid "container_name"642msgid "container_name"
639msgstr ""643msgstr ""
640644
641#. noun645#. noun
642#: ../duplicity/commandline.py:471646#: ../duplicity/commandline.py:483
643msgid "count"647msgid "count"
644msgstr ""648msgstr ""
645649
646#. Used in usage help to represent the name of a file directory650#. Used in usage help to represent the name of a file directory
647#: ../duplicity/commandline.py:474651#: ../duplicity/commandline.py:486
648msgid "directory"652msgid "directory"
649msgstr ""653msgstr ""
650654
651#. Used in usage help to represent the name of a file. Example:655#. Used in usage help to represent the name of a file. Example:
652#. --log-file <filename>656#. --log-file <filename>
653#: ../duplicity/commandline.py:478657#: ../duplicity/commandline.py:490
654msgid "filename"658msgid "filename"
655msgstr ""659msgstr ""
656660
657#. Used in usage help to represent an ID for a GnuPG key. Example:661#. Used in usage help to represent an ID for a GnuPG key. Example:
658#. --encrypt-key <gpg_key_id>662#. --encrypt-key <gpg_key_id>
659#: ../duplicity/commandline.py:482663#: ../duplicity/commandline.py:494
660msgid "gpg-key-id"664msgid "gpg-key-id"
661msgstr ""665msgstr ""
662666
663#. Used in usage help, e.g. to represent the name of a code667#. Used in usage help, e.g. to represent the name of a code
664#. module. Example:668#. module. Example:
665#. rsync://user[:password]@other.host[:port]::/module/some_dir669#. rsync://user[:password]@other.host[:port]::/module/some_dir
666#: ../duplicity/commandline.py:487670#: ../duplicity/commandline.py:499
667msgid "module"671msgid "module"
668msgstr ""672msgstr ""
669673
670#. Used in usage help to represent a desired number of674#. Used in usage help to represent a desired number of
671#. something. Example:675#. something. Example:
672#. --num-retries <number>676#. --num-retries <number>
673#: ../duplicity/commandline.py:492677#: ../duplicity/commandline.py:504
674msgid "number"678msgid "number"
675msgstr ""679msgstr ""
676680
677#. Used in usage help. (Should be consistent with the "Options:"681#. Used in usage help. (Should be consistent with the "Options:"
678#. header.) Example:682#. header.) Example:
679#. duplicity [full|incremental] [options] source_dir target_url683#. duplicity [full|incremental] [options] source_dir target_url
680#: ../duplicity/commandline.py:497684#: ../duplicity/commandline.py:509
681msgid "options"685msgid "options"
682msgstr ""686msgstr ""
683687
684#. Used in usage help to represent an internet hostname. Example:688#. Used in usage help to represent an internet hostname. Example:
685#. ftp://user[:password]@other.host[:port]/some_dir689#. ftp://user[:password]@other.host[:port]/some_dir
686#: ../duplicity/commandline.py:501690#: ../duplicity/commandline.py:513
687msgid "other.host"691msgid "other.host"
688msgstr ""692msgstr ""
689693
690#. Used in usage help. Example:694#. Used in usage help. Example:
691#. ftp://user[:password]@other.host[:port]/some_dir695#. ftp://user[:password]@other.host[:port]/some_dir
692#: ../duplicity/commandline.py:505696#: ../duplicity/commandline.py:517
693msgid "password"697msgid "password"
694msgstr ""698msgstr ""
695699
696#. Used in usage help to represent a Unix-style path name. Example:700#. Used in usage help to represent a Unix-style path name. Example:
697#. --archive-dir <path>701#. --archive-dir <path>
698#: ../duplicity/commandline.py:509702#: ../duplicity/commandline.py:521
699msgid "path"703msgid "path"
700msgstr ""704msgstr ""
701705
702#. Used in usage help to represent a TCP port number. Example:706#. Used in usage help to represent a TCP port number. Example:
703#. ftp://user[:password]@other.host[:port]/some_dir707#. ftp://user[:password]@other.host[:port]/some_dir
704#: ../duplicity/commandline.py:513708#: ../duplicity/commandline.py:525
705msgid "port"709msgid "port"
706msgstr ""710msgstr ""
707711
708#. Used in usage help. This represents a string to be used as a712#. Used in usage help. This represents a string to be used as a
709#. prefix to names for backup files created by Duplicity. Example:713#. prefix to names for backup files created by Duplicity. Example:
710#. s3://other.host/bucket_name[/prefix]714#. s3://other.host/bucket_name[/prefix]
711#: ../duplicity/commandline.py:518715#: ../duplicity/commandline.py:530
712msgid "prefix"716msgid "prefix"
713msgstr ""717msgstr ""
714718
715#. Used in usage help to represent a Unix-style path name. Example:719#. Used in usage help to represent a Unix-style path name. Example:
716#. rsync://user[:password]@other.host[:port]/relative_path720#. rsync://user[:password]@other.host[:port]/relative_path
717#: ../duplicity/commandline.py:522721#: ../duplicity/commandline.py:534
718msgid "relative_path"722msgid "relative_path"
719msgstr ""723msgstr ""
720724
721#. Used in usage help. Example:725#. Used in usage help. Example:
722#. --timeout <seconds>726#. --timeout <seconds>
723#: ../duplicity/commandline.py:526727#: ../duplicity/commandline.py:538
724msgid "seconds"728msgid "seconds"
725msgstr ""729msgstr ""
726730
@@ -728,14 +732,14 @@
728#. matching one or more files, as described in the documentation.732#. matching one or more files, as described in the documentation.
729#. Example:733#. Example:
730#. --exclude <shell_pattern>734#. --exclude <shell_pattern>
731#: ../duplicity/commandline.py:532735#: ../duplicity/commandline.py:544
732msgid "shell_pattern"736msgid "shell_pattern"
733msgstr ""737msgstr ""
734738
735#. Used in usage help to represent the name of a single file739#. Used in usage help to represent the name of a single file
736#. directory or a Unix-style path to a directory. Example:740#. directory or a Unix-style path to a directory. Example:
737#. file:///some_dir741#. file:///some_dir
738#: ../duplicity/commandline.py:537742#: ../duplicity/commandline.py:549
739msgid "some_dir"743msgid "some_dir"
740msgstr ""744msgstr ""
741745
@@ -743,14 +747,14 @@
743#. directory or a Unix-style path to a directory where files will be747#. directory or a Unix-style path to a directory where files will be
744#. coming FROM. Example:748#. coming FROM. Example:
745#. duplicity [full|incremental] [options] source_dir target_url749#. duplicity [full|incremental] [options] source_dir target_url
746#: ../duplicity/commandline.py:543750#: ../duplicity/commandline.py:555
747msgid "source_dir"751msgid "source_dir"
748msgstr ""752msgstr ""
749753
750#. Used in usage help to represent a URL files will be coming754#. Used in usage help to represent a URL files will be coming
751#. FROM. Example:755#. FROM. Example:
752#. duplicity [restore] [options] source_url target_dir756#. duplicity [restore] [options] source_url target_dir
753#: ../duplicity/commandline.py:548757#: ../duplicity/commandline.py:560
754msgid "source_url"758msgid "source_url"
755msgstr ""759msgstr ""
756760
@@ -758,60 +762,60 @@
758#. directory or a Unix-style path to a directory. where files will be762#. directory or a Unix-style path to a directory. where files will be
759#. going TO. Example:763#. going TO. Example:
760#. duplicity [restore] [options] source_url target_dir764#. duplicity [restore] [options] source_url target_dir
761#: ../duplicity/commandline.py:554765#: ../duplicity/commandline.py:566
762msgid "target_dir"766msgid "target_dir"
763msgstr ""767msgstr ""
764768
765#. Used in usage help to represent a URL files will be going TO.769#. Used in usage help to represent a URL files will be going TO.
766#. Example:770#. Example:
767#. duplicity [full|incremental] [options] source_dir target_url771#. duplicity [full|incremental] [options] source_dir target_url
768#: ../duplicity/commandline.py:559772#: ../duplicity/commandline.py:571
769msgid "target_url"773msgid "target_url"
770msgstr ""774msgstr ""
771775
772#. Used in usage help to represent a time spec for a previous776#. Used in usage help to represent a time spec for a previous
773#. point in time, as described in the documentation. Example:777#. point in time, as described in the documentation. Example:
774#. duplicity remove-older-than time [options] target_url778#. duplicity remove-older-than time [options] target_url
775#: ../duplicity/commandline.py:564779#: ../duplicity/commandline.py:576
776msgid "time"780msgid "time"
777msgstr ""781msgstr ""
778782
779#. Used in usage help to represent a user name (i.e. login).783#. Used in usage help to represent a user name (i.e. login).
780#. Example:784#. Example:
781#. ftp://user[:password]@other.host[:port]/some_dir785#. ftp://user[:password]@other.host[:port]/some_dir
782#: ../duplicity/commandline.py:569786#: ../duplicity/commandline.py:581
783msgid "user"787msgid "user"
784msgstr ""788msgstr ""
785789
786#: ../duplicity/commandline.py:571790#: ../duplicity/commandline.py:583
787#, python-format791#, python-format
788msgid "duplicity version %s running on %s."792msgid "duplicity version %s running on %s."
789msgstr ""793msgstr ""
790794
791#. Header in usage help795#. Header in usage help
792#: ../duplicity/commandline.py:575796#: ../duplicity/commandline.py:587
793msgid "Usage:"797msgid "Usage:"
794msgstr ""798msgstr ""
795799
796#. Header in usage help800#. Header in usage help
797#: ../duplicity/commandline.py:588801#: ../duplicity/commandline.py:600
798msgid "Backends and their URL formats:"802msgid "Backends and their URL formats:"
799msgstr ""803msgstr ""
800804
801#. Header in usage help805#. Header in usage help
802#: ../duplicity/commandline.py:608806#: ../duplicity/commandline.py:620
803msgid "Commands:"807msgid "Commands:"
804msgstr ""808msgstr ""
805809
806#. Header in usage help810#. Header in usage help
807#: ../duplicity/commandline.py:622811#: ../duplicity/commandline.py:634
808msgid "Options:"812msgid "Options:"
809msgstr ""813msgstr ""
810814
811#. In this portion of the usage instructions, "[ewnid]" indicates which815#. In this portion of the usage instructions, "[ewnid]" indicates which
812#. characters are permitted (e, w, n, i, or d); the brackets imply their own816#. characters are permitted (e, w, n, i, or d); the brackets imply their own
813#. meaning in regex; i.e., only one of the characters is allowed in an instance.817#. meaning in regex; i.e., only one of the characters is allowed in an instance.
814#: ../duplicity/commandline.py:676818#: ../duplicity/commandline.py:689
815msgid ""819msgid ""
816" Verbosity must be one of: digit [0-9], character [ewnid],\n"820" Verbosity must be one of: digit [0-9], character [ewnid],\n"
817" or word ['error', 'warning', 'notice', 'info', 'debug'].\n"821" or word ['error', 'warning', 'notice', 'info', 'debug'].\n"
@@ -819,36 +823,36 @@
819" that verbosity level is set at 2 (Warning) or higher.\n"823" that verbosity level is set at 2 (Warning) or higher.\n"
820msgstr ""824msgstr ""
821825
822#: ../duplicity/commandline.py:702826#: ../duplicity/commandline.py:715
823#, python-format827#, python-format
824msgid "Specified archive directory '%s' does not exist, or is not a directory"828msgid "Specified archive directory '%s' does not exist, or is not a directory"
825msgstr ""829msgstr ""
826830
827#: ../duplicity/commandline.py:711831#: ../duplicity/commandline.py:724
828#, python-format832#, python-format
829msgid ""833msgid ""
830"Sign key should be an 8 character hex string, like 'AA0E73D2'.\n"834"Sign key should be an 8 character hex string, like 'AA0E73D2'.\n"
831"Received '%s' instead."835"Received '%s' instead."
832msgstr ""836msgstr ""
833837
834#: ../duplicity/commandline.py:769838#: ../duplicity/commandline.py:782
835#, python-format839#, python-format
836msgid ""840msgid ""
837"Restore destination directory %s already exists.\n"841"Restore destination directory %s already exists.\n"
838"Will not overwrite."842"Will not overwrite."
839msgstr ""843msgstr ""
840844
841#: ../duplicity/commandline.py:774845#: ../duplicity/commandline.py:787
842#, python-format846#, python-format
843msgid "Verify directory %s does not exist"847msgid "Verify directory %s does not exist"
844msgstr ""848msgstr ""
845849
846#: ../duplicity/commandline.py:780850#: ../duplicity/commandline.py:793
847#, python-format851#, python-format
848msgid "Backup source directory %s does not exist."852msgid "Backup source directory %s does not exist."
849msgstr ""853msgstr ""
850854
851#: ../duplicity/commandline.py:855855#: ../duplicity/commandline.py:868
852#, python-format856#, python-format
853msgid ""857msgid ""
854"Bad URL '%s'.\n"858"Bad URL '%s'.\n"
@@ -856,36 +860,36 @@
856"\"file:///usr/local\". See the man page for more information."860"\"file:///usr/local\". See the man page for more information."
857msgstr ""861msgstr ""
858862
859#: ../duplicity/commandline.py:880863#: ../duplicity/commandline.py:893
860msgid "Main action: "864msgid "Main action: "
861msgstr ""865msgstr ""
862866
863#: ../duplicity/diffdir.py:105867#: ../duplicity/diffdir.py:104
864#, python-format868#, python-format
865msgid "Error %s getting delta for %s"869msgid "Error %s getting delta for %s"
866msgstr ""870msgstr ""
867871
868#: ../duplicity/diffdir.py:119872#: ../duplicity/diffdir.py:118
869#, python-format873#, python-format
870msgid "Getting delta of %s and %s"874msgid "Getting delta of %s and %s"
871msgstr ""875msgstr ""
872876
873#: ../duplicity/diffdir.py:164877#: ../duplicity/diffdir.py:163
874#, python-format878#, python-format
875msgid "A %s"879msgid "A %s"
876msgstr ""880msgstr ""
877881
878#: ../duplicity/diffdir.py:171882#: ../duplicity/diffdir.py:170
879#, python-format883#, python-format
880msgid "M %s"884msgid "M %s"
881msgstr ""885msgstr ""
882886
883#: ../duplicity/diffdir.py:193887#: ../duplicity/diffdir.py:192
884#, python-format888#, python-format
885msgid "Comparing %s and %s"889msgid "Comparing %s and %s"
886msgstr ""890msgstr ""
887891
888#: ../duplicity/diffdir.py:199892#: ../duplicity/diffdir.py:198
889#, python-format893#, python-format
890msgid "D %s"894msgid "D %s"
891msgstr ""895msgstr ""
@@ -913,22 +917,22 @@
913"the day)."917"the day)."
914msgstr ""918msgstr ""
915919
916#: ../duplicity/lazy.py:326920#: ../duplicity/lazy.py:325
917#, python-format921#, python-format
918msgid "Warning: oldindex %s >= newindex %s"922msgid "Warning: oldindex %s >= newindex %s"
919msgstr ""923msgstr ""
920924
921#: ../duplicity/lazy.py:401925#: ../duplicity/lazy.py:400
922#, python-format926#, python-format
923msgid "Error '%s' processing %s"927msgid "Error '%s' processing %s"
924msgstr ""928msgstr ""
925929
926#: ../duplicity/lazy.py:409930#: ../duplicity/lazy.py:408
927#, python-format931#, python-format
928msgid "Skipping %s because of previous error"932msgid "Skipping %s because of previous error"
929msgstr ""933msgstr ""
930934
931#: ../duplicity/manifest.py:86935#: ../duplicity/manifest.py:87
932#, python-format936#, python-format
933msgid ""937msgid ""
934"Fatal Error: Backup source host has changed.\n"938"Fatal Error: Backup source host has changed.\n"
@@ -936,7 +940,7 @@
936"Previous hostname: %s"940"Previous hostname: %s"
937msgstr ""941msgstr ""
938942
939#: ../duplicity/manifest.py:91943#: ../duplicity/manifest.py:94
940#, python-format944#, python-format
941msgid ""945msgid ""
942"Fatal Error: Backup source directory has changed.\n"946"Fatal Error: Backup source directory has changed.\n"
@@ -944,7 +948,7 @@
944"Previous directory: %s"948"Previous directory: %s"
945msgstr ""949msgstr ""
946950
947#: ../duplicity/manifest.py:98951#: ../duplicity/manifest.py:103
948msgid ""952msgid ""
949"Aborting because you may have accidentally tried to backup two different "953"Aborting because you may have accidentally tried to backup two different "
950"data sets to the same remote location, or using the same archive directory. "954"data sets to the same remote location, or using the same archive directory. "
@@ -952,39 +956,39 @@
952"seeing this message"956"seeing this message"
953msgstr ""957msgstr ""
954958
955#: ../duplicity/manifest.py:193959#: ../duplicity/manifest.py:198
956msgid "Manifests not equal because different volume numbers"960msgid "Manifests not equal because different volume numbers"
957msgstr ""961msgstr ""
958962
959#: ../duplicity/manifest.py:198963#: ../duplicity/manifest.py:203
960msgid "Manifests not equal because volume lists differ"964msgid "Manifests not equal because volume lists differ"
961msgstr ""965msgstr ""
962966
963#: ../duplicity/manifest.py:203967#: ../duplicity/manifest.py:208
964msgid "Manifests not equal because hosts or directories differ"968msgid "Manifests not equal because hosts or directories differ"
965msgstr ""969msgstr ""
966970
967#: ../duplicity/manifest.py:350971#: ../duplicity/manifest.py:355
968msgid "Warning, found extra Volume identifier"972msgid "Warning, found extra Volume identifier"
969msgstr ""973msgstr ""
970974
971#: ../duplicity/manifest.py:376975#: ../duplicity/manifest.py:381
972msgid "Other is not VolumeInfo"976msgid "Other is not VolumeInfo"
973msgstr ""977msgstr ""
974978
975#: ../duplicity/manifest.py:379979#: ../duplicity/manifest.py:384
976msgid "Volume numbers don't match"980msgid "Volume numbers don't match"
977msgstr ""981msgstr ""
978982
979#: ../duplicity/manifest.py:382983#: ../duplicity/manifest.py:387
980msgid "start_indicies don't match"984msgid "start_indicies don't match"
981msgstr ""985msgstr ""
982986
983#: ../duplicity/manifest.py:385987#: ../duplicity/manifest.py:390
984msgid "end_index don't match"988msgid "end_index don't match"
985msgstr ""989msgstr ""
986990
987#: ../duplicity/manifest.py:392991#: ../duplicity/manifest.py:397
988msgid "Hashes don't match"992msgid "Hashes don't match"
989msgstr ""993msgstr ""
990994
@@ -1000,12 +1004,12 @@
1000"Renaming %s to %s"1004"Renaming %s to %s"
1001msgstr ""1005msgstr ""
10021006
1003#: ../duplicity/patchdir.py:72 ../duplicity/patchdir.py:771007#: ../duplicity/patchdir.py:71 ../duplicity/patchdir.py:76
1004#, python-format1008#, python-format
1005msgid "Patching %s"1009msgid "Patching %s"
1006msgstr ""1010msgstr ""
10071011
1008#: ../duplicity/patchdir.py:5651012#: ../duplicity/patchdir.py:564
1009#, python-format1013#, python-format
1010msgid "Writing %s of type %s"1014msgid "Writing %s of type %s"
1011msgstr ""1015msgstr ""
@@ -1084,33 +1088,33 @@
1084msgid "Error listing directory %s"1088msgid "Error listing directory %s"
1085msgstr ""1089msgstr ""
10861090
1087#: ../duplicity/selection.py:1201091#: ../duplicity/selection.py:118
1088#, python-format1092#, python-format
1089msgid "Skipping socket %s"1093msgid "Skipping socket %s"
1090msgstr ""1094msgstr ""
10911095
1092#: ../duplicity/selection.py:1241096#: ../duplicity/selection.py:122
1093#, python-format1097#, python-format
1094msgid "Error initializing file %s"1098msgid "Error initializing file %s"
1095msgstr ""1099msgstr ""
10961100
1097#: ../duplicity/selection.py:128 ../duplicity/selection.py:1491101#: ../duplicity/selection.py:126 ../duplicity/selection.py:147
1098#, python-format1102#, python-format
1099msgid "Error accessing possibly locked file %s"1103msgid "Error accessing possibly locked file %s"
1100msgstr ""1104msgstr ""
11011105
1102#: ../duplicity/selection.py:1641106#: ../duplicity/selection.py:162
1103#, python-format1107#, python-format
1104msgid "Warning: base %s doesn't exist, continuing"1108msgid "Warning: base %s doesn't exist, continuing"
1105msgstr ""1109msgstr ""
11061110
1107#: ../duplicity/selection.py:167 ../duplicity/selection.py:1851111#: ../duplicity/selection.py:165 ../duplicity/selection.py:183
1108#: ../duplicity/selection.py:1881112#: ../duplicity/selection.py:186
1109#, python-format1113#, python-format
1110msgid "Selecting %s"1114msgid "Selecting %s"
1111msgstr ""1115msgstr ""
11121116
1113#: ../duplicity/selection.py:2691117#: ../duplicity/selection.py:267
1114#, python-format1118#, python-format
1115msgid ""1119msgid ""
1116"Fatal Error: The file specification\n"1120"Fatal Error: The file specification\n"
@@ -1121,14 +1125,14 @@
1121"pattern (such as '**') which matches the base directory."1125"pattern (such as '**') which matches the base directory."
1122msgstr ""1126msgstr ""
11231127
1124#: ../duplicity/selection.py:2771128#: ../duplicity/selection.py:275
1125#, python-format1129#, python-format
1126msgid ""1130msgid ""
1127"Fatal Error while processing expression\n"1131"Fatal Error while processing expression\n"
1128"%s"1132"%s"
1129msgstr ""1133msgstr ""
11301134
1131#: ../duplicity/selection.py:2871135#: ../duplicity/selection.py:285
1132#, python-format1136#, python-format
1133msgid ""1137msgid ""
1134"Last selection expression:\n"1138"Last selection expression:\n"
@@ -1138,43 +1142,43 @@
1138"probably isn't what you meant."1142"probably isn't what you meant."
1139msgstr ""1143msgstr ""
11401144
1141#: ../duplicity/selection.py:3121145#: ../duplicity/selection.py:310
1142#, python-format1146#, python-format
1143msgid "Reading filelist %s"1147msgid "Reading filelist %s"
1144msgstr ""1148msgstr ""
11451149
1146#: ../duplicity/selection.py:3151150#: ../duplicity/selection.py:313
1147#, python-format1151#, python-format
1148msgid "Sorting filelist %s"1152msgid "Sorting filelist %s"
1149msgstr ""1153msgstr ""
11501154
1151#: ../duplicity/selection.py:3421155#: ../duplicity/selection.py:340
1152#, python-format1156#, python-format
1153msgid ""1157msgid ""
1154"Warning: file specification '%s' in filelist %s\n"1158"Warning: file specification '%s' in filelist %s\n"
1155"doesn't start with correct prefix %s. Ignoring."1159"doesn't start with correct prefix %s. Ignoring."
1156msgstr ""1160msgstr ""
11571161
1158#: ../duplicity/selection.py:3461162#: ../duplicity/selection.py:344
1159msgid "Future prefix errors will not be logged."1163msgid "Future prefix errors will not be logged."
1160msgstr ""1164msgstr ""
11611165
1162#: ../duplicity/selection.py:3621166#: ../duplicity/selection.py:360
1163#, python-format1167#, python-format
1164msgid "Error closing filelist %s"1168msgid "Error closing filelist %s"
1165msgstr ""1169msgstr ""
11661170
1167#: ../duplicity/selection.py:4291171#: ../duplicity/selection.py:427
1168#, python-format1172#, python-format
1169msgid "Reading globbing filelist %s"1173msgid "Reading globbing filelist %s"
1170msgstr ""1174msgstr ""
11711175
1172#: ../duplicity/selection.py:4621176#: ../duplicity/selection.py:460
1173#, python-format1177#, python-format
1174msgid "Error compiling regular expression %s"1178msgid "Error compiling regular expression %s"
1175msgstr ""1179msgstr ""
11761180
1177#: ../duplicity/selection.py:4781181#: ../duplicity/selection.py:476
1178msgid ""1182msgid ""
1179"Warning: exclude-device-files is not the first selector.\n"1183"Warning: exclude-device-files is not the first selector.\n"
1180"This may not be what you intended"1184"This may not be what you intended"

Subscribers

People subscribed via source and target branches