Merge lp:~mterry/duplicity/list-old-chains into lp:~duplicity-team/duplicity/0.7-series
- list-old-chains
- Merge into 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 |
Related bugs: |
Reviewer | Review Type | Date Requested | Status |
---|---|---|---|
duplicity-team | Pending | ||
Review via email: mp+13871@code.launchpad.net |
Commit message
Description of the change
To post a comment you must log in.
Revision history for this message
Michael Terry (mterry) wrote : | # |
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" |
See my comment on the list-old-chains-0.6 merge request for details.