Merge lp:~mterry/duplicity/giobackend-display-name-0.7 into lp:~duplicity-team/duplicity/0.8-series
- giobackend-display-name-0.7
- Merge into 0.8-series
Status: | Superseded |
---|---|
Proposed branch: | lp:~mterry/duplicity/giobackend-display-name-0.7 |
Merge into: | lp:~duplicity-team/duplicity/0.8-series |
Diff against target: |
1277 lines (+477/-47) (has conflicts) 7 files modified
CHANGELOG (+24/-0) Changelog.GNU (+22/-0) bin/duplicity (+11/-0) duplicity/backends/giobackend.py (+13/-4) duplicity/collections.py (+39/-0) po/duplicity.pot (+348/-43) testing/unit/test_collections.py (+20/-0) Text conflict in CHANGELOG Text conflict in Changelog.GNU Text conflict in bin/duplicity Text conflict in duplicity/collections.py Text conflict in po/duplicity.pot Text conflict in testing/unit/test_collections.py |
To merge this branch: | bzr merge lp:~mterry/duplicity/giobackend-display-name-0.7 |
Related bugs: |
Reviewer | Review Type | Date Requested | Status |
---|---|---|---|
duplicity-team | Pending | ||
Review via email: mp+328632@code.launchpad.net |
This proposal has been superseded by a proposal from 2017-08-05.
Commit message
Description of the change
I was doing some testing on the google-drive: GIO backend (this is not the gdoc: duplicity backend, but rather using GNOME's abstraction layer to talk to Google through the giobackend code) and noticed some problems.
(A) Getting a list of files was broken because this backend chooses to use internal IDs for all its filename. Only the display_name() call gets the real user-set filename. Which, OK. We can use that instead. This will work for google-drive: as well as all other backends, since that is the user-set/
(B) Getting files wasn't working because we had been passing NOFOLLOW_SYMLINKS. Apparently the google-drive: backend treats all internal files as symlinks to other internal files? Doesn't matter, we can avoid having to care about what a backup does in that regard by simply not passing that flag. It was a level of precaution that we don't really need. Normally, duplicity will always be dealing with real files. If it's trying to get a symlink, it's because the user manually created one. In which case, maybe we should follow it, since the user wants us to.
Together, these fixes let google-drive: work (and maybe other similarly bizarre GIO backends). I also tested on a couple other backends (SSH and local) and they worked fine still.
Unmerged revisions
- 1305. By Michael Terry
-
giobackend: handle a wider variety of gio backends by making less assumptions; in particular, this fixes the google-drive: backend
- 1304. By Kenneth Loafman
-
* Fixed encrypted remote manifest handling to merely put out a non-fatal
error message and continue if the private key is not available. - 1303. By Kenneth Loafman
-
* Comment out profiling code.
- 1302. By Kenneth Loafman
-
* Fixed slowness in 'collection-status' by basing the status on the
remote system only. The local cache is treated as empty. - 1301. By Kenneth Loafman
-
* Fix date of last change.
- 1300. By Kenneth Loafman
-
* Merged in lp:~dawgfoto/duplicity/skip_sync_collection_status
- collection-status should not sync metadata
- up-to-date local metadata is not needed as collection-status is
generated from remote file list
- syncing metadata might require to download several GBs
Preview Diff
1 | === modified file 'CHANGELOG' |
2 | --- CHANGELOG 2017-07-20 12:06:01 +0000 |
3 | +++ CHANGELOG 2017-08-05 22:24:26 +0000 |
4 | @@ -1,4 +1,28 @@ |
5 | +<<<<<<< TREE |
6 | New in v0.8.00 (2016/07/??) |
7 | +======= |
8 | +New in v0.7.14 (2017/07/??) |
9 | +--------------------------- |
10 | +* Merged in lp:~dawgfoto/duplicity/skip_sync_collection_status |
11 | + - collection-status should not sync metadata |
12 | + - up-to-date local metadata is not needed as collection-status is |
13 | + generated from remote file list |
14 | + - syncing metadata might require to download several GBs |
15 | +* Fixed slowness in 'collection-status' by basing the status on the |
16 | + remote system only. The local cache is treated as empty. |
17 | +* Fixed encrypted remote manifest handling to merely put out a non-fatal |
18 | + error message and continue if the private key is not available. |
19 | + |
20 | + |
21 | +New in v0.7.13.1 (2017/06/18) |
22 | +----------------------------- |
23 | +* Fixed problem in dist/makedist when building on Mac where AppleDouble |
24 | + files were being created in the tarball. See: |
25 | + https://superuser.com/questions/61185/why-do-i-get-files-like-foo-in-my-tarball-on-os-x |
26 | + |
27 | + |
28 | +New in v0.7.13 (2017/06/12) |
29 | +>>>>>>> MERGE-SOURCE |
30 | --------------------------- |
31 | * Merged in lp:~aaron-whitehouse/duplicity/remove-python26 |
32 | - Remove Python 2.6 support references and tests. |
33 | |
34 | === modified file 'Changelog.GNU' |
35 | --- Changelog.GNU 2017-07-20 12:06:01 +0000 |
36 | +++ Changelog.GNU 2017-08-05 22:24:26 +0000 |
37 | @@ -1,3 +1,4 @@ |
38 | +<<<<<<< TREE |
39 | 2017-07-20 Kenneth Loafman <kenneth@loafman.com> |
40 | |
41 | * Fixed encrypted remote manifest handling to merely put out a non-fatal |
42 | @@ -31,6 +32,27 @@ |
43 | - Also see https://code.launchpad.net/~dawgfoto/duplicity/replicate/+merge/322836. |
44 | |
45 | 2017-06-19 Kenneth Loafman <kenneth@loafman.com> |
46 | +======= |
47 | +2017-07-20 Kenneth Loafman <kenneth@loafman.com> |
48 | + |
49 | + * Fixed encrypted remote manifest handling to merely put out a non-fatal |
50 | + error message and continue if the private key is not available. |
51 | + |
52 | +2017-07-18 Kenneth Loafman <kenneth@loafman.com> |
53 | + |
54 | + * Fixed slowness in 'collection-status' by basing the status on the |
55 | + remote system only. The local cache is treated as empty. |
56 | + |
57 | +2017-07-11 Kenneth Loafman <kenneth@loafman.com> |
58 | + |
59 | + * Merged in lp:~dawgfoto/duplicity/skip_sync_collection_status |
60 | + - collection-status should not sync metadata |
61 | + - up-to-date local metadata is not needed as collection-status is |
62 | + generated from remote file list |
63 | + - syncing metadata might require to download several GBs |
64 | + |
65 | +2017-06-18 Kenneth Loafman <kenneth@loafman.com> |
66 | +>>>>>>> MERGE-SOURCE |
67 | |
68 | * Fixed problem in dist/makedist when building on Mac where AppleDouble |
69 | files were being created in the tarball. See: |
70 | |
71 | === modified file 'bin/duplicity' |
72 | --- bin/duplicity 2017-07-19 17:52:30 +0000 |
73 | +++ bin/duplicity 2017-08-05 22:24:26 +0000 |
74 | @@ -61,6 +61,7 @@ |
75 | from duplicity import tempdir |
76 | from duplicity import util |
77 | |
78 | + |
79 | if '--pydevd' in sys.argv or os.getenv('PYDEVD', None): |
80 | # The following is for starting remote debugging in Eclipse with Pydev. |
81 | # Adjust the path to your location and version of Eclipse and Pydev. |
82 | @@ -1520,8 +1521,13 @@ |
83 | |
84 | # get current collection status |
85 | col_stats = collections.CollectionsStatus(globals.backend, |
86 | +<<<<<<< TREE |
87 | globals.archive_dir_path, |
88 | action).set_values() |
89 | +======= |
90 | + globals.archive_dir, |
91 | + action).set_values() |
92 | +>>>>>>> MERGE-SOURCE |
93 | |
94 | while True: |
95 | # if we have to clean up the last partial, then col_stats are invalidated |
96 | @@ -1551,8 +1557,13 @@ |
97 | log.Notice(_("Cleaning up previous partial %s backup set, restarting." % action)) |
98 | last_backup.delete() |
99 | col_stats = collections.CollectionsStatus(globals.backend, |
100 | +<<<<<<< TREE |
101 | globals.archive_dir_path, |
102 | action).set_values() |
103 | +======= |
104 | + globals.archive_dir, |
105 | + action).set_values() |
106 | +>>>>>>> MERGE-SOURCE |
107 | continue |
108 | break |
109 | break |
110 | |
111 | === modified file 'duplicity/backends/giobackend.py' |
112 | --- duplicity/backends/giobackend.py 2017-02-20 00:05:17 +0000 |
113 | +++ duplicity/backends/giobackend.py 2017-08-05 22:24:26 +0000 |
114 | @@ -116,8 +116,11 @@ |
115 | |
116 | def __copy_file(self, source, target): |
117 | from gi.repository import Gio # @UnresolvedImport |
118 | + # Don't pass NOFOLLOW_SYMLINKS here. Some backends (e.g. google-drive:) |
119 | + # use symlinks internally for all files. In the normal course of |
120 | + # events, we never deal with symlinks anyway, just tarballs. |
121 | source.copy(target, |
122 | - Gio.FileCopyFlags.OVERWRITE | Gio.FileCopyFlags.NOFOLLOW_SYMLINKS, |
123 | + Gio.FileCopyFlags.OVERWRITE, |
124 | None, self.__copy_progress, None) |
125 | |
126 | def _error_code(self, operation, e): |
127 | @@ -150,12 +153,18 @@ |
128 | def _list(self): |
129 | from gi.repository import Gio # @UnresolvedImport |
130 | files = [] |
131 | - enum = self.remote_file.enumerate_children(Gio.FILE_ATTRIBUTE_STANDARD_NAME, |
132 | - Gio.FileQueryInfoFlags.NOFOLLOW_SYMLINKS, |
133 | + # We grab display name, rather than file name because some backends |
134 | + # (e.g. google-drive:) use filesystem-specific IDs as file names and |
135 | + # only expose the "normal" name as display names. We need the display |
136 | + # name, because we try to parse them. If the backend does this sort of |
137 | + # trickery, it will accept both versions of the filename, so we |
138 | + # shouldn't get into any trouble doing this. |
139 | + enum = self.remote_file.enumerate_children(Gio.FILE_ATTRIBUTE_STANDARD_DISPLAY_NAME, |
140 | + Gio.FileQueryInfoFlags.NONE, |
141 | None) |
142 | info = enum.next_file(None) |
143 | while info: |
144 | - files.append(info.get_name()) |
145 | + files.append(info.get_display_name()) |
146 | info = enum.next_file(None) |
147 | return files |
148 | |
149 | |
150 | === modified file 'duplicity/collections.py' |
151 | --- duplicity/collections.py 2017-07-20 12:06:01 +0000 |
152 | +++ duplicity/collections.py 2017-08-05 22:24:26 +0000 |
153 | @@ -143,11 +143,19 @@ |
154 | remote_filename) |
155 | self.remote_manifest_name = remote_filename |
156 | |
157 | +<<<<<<< TREE |
158 | if self.action not in ["collection-status", "replicate"]: |
159 | local_filename_list = globals.archive_dir_path.listdir() |
160 | else: |
161 | local_filename_list = [] |
162 | for local_filename in local_filename_list: |
163 | +======= |
164 | + if self.action not in ["collection-status"]: |
165 | + local_filename_list = globals.archive_dir.listdir() |
166 | + else: |
167 | + local_filename_list = [] |
168 | + for local_filename in local_filename_list: |
169 | +>>>>>>> MERGE-SOURCE |
170 | pr = file_naming.parse(local_filename) |
171 | if (pr and pr.manifest and pr.type == self.type and |
172 | pr.time == self.time and |
173 | @@ -170,11 +178,19 @@ |
174 | except Exception: |
175 | log.Debug(_("BackupSet.delete: missing %s") % [util.ufn(f) for f in rfn]) |
176 | pass |
177 | +<<<<<<< TREE |
178 | if self.action not in ["collection-status", "replicate"]: |
179 | local_filename_list = globals.archive_dir_path.listdir() |
180 | else: |
181 | local_filename_list = [] |
182 | for lfn in local_filename_list: |
183 | +======= |
184 | + if self.action not in ["collection-status"]: |
185 | + local_filename_list = globals.archive_dir.listdir() |
186 | + else: |
187 | + local_filename_list = [] |
188 | + for lfn in local_filename_list: |
189 | +>>>>>>> MERGE-SOURCE |
190 | pr = file_naming.parse(lfn) |
191 | if (pr and pr.time == self.time and |
192 | pr.start_time == self.start_time and |
193 | @@ -592,13 +608,22 @@ |
194 | """ |
195 | Hold information about available chains and sets |
196 | """ |
197 | +<<<<<<< TREE |
198 | def __init__(self, backend, archive_dir_path, action): |
199 | +======= |
200 | + def __init__(self, backend, archive_dir, action): |
201 | +>>>>>>> MERGE-SOURCE |
202 | """ |
203 | Make new object. Does not set values |
204 | """ |
205 | self.backend = backend |
206 | +<<<<<<< TREE |
207 | self.archive_dir_path = archive_dir_path |
208 | self.action = action |
209 | +======= |
210 | + self.archive_dir = archive_dir |
211 | + self.action = action |
212 | +>>>>>>> MERGE-SOURCE |
213 | |
214 | # Will hold (signature chain, backup chain) pair of active |
215 | # (most recent) chains |
216 | @@ -702,10 +727,17 @@ |
217 | len(backend_filename_list)) |
218 | |
219 | # get local filename list |
220 | +<<<<<<< TREE |
221 | if self.action not in ["collection-status", "replicate"]: |
222 | local_filename_list = self.archive_dir_path.listdir() |
223 | else: |
224 | local_filename_list = [] |
225 | +======= |
226 | + if self.action not in ["collection-status"]: |
227 | + local_filename_list = self.archive_dir.listdir() |
228 | + else: |
229 | + local_filename_list = [] |
230 | +>>>>>>> MERGE-SOURCE |
231 | log.Debug(ngettext("%d file exists in cache", |
232 | "%d files exist in cache", |
233 | len(local_filename_list)) % |
234 | @@ -902,10 +934,17 @@ |
235 | if filelist is not None: |
236 | return filelist |
237 | elif local: |
238 | +<<<<<<< TREE |
239 | if self.action not in ["collection-status", "replicate"]: |
240 | return self.archive_dir_path.listdir() |
241 | else: |
242 | return [] |
243 | +======= |
244 | + if self.action not in ["collection-status"]: |
245 | + return self.archive_dir.listdir() |
246 | + else: |
247 | + return [] |
248 | +>>>>>>> MERGE-SOURCE |
249 | else: |
250 | return self.backend.list() |
251 | |
252 | |
253 | === modified file 'po/duplicity.pot' |
254 | --- po/duplicity.pot 2017-07-20 12:06:01 +0000 |
255 | +++ po/duplicity.pot 2017-08-05 22:24:26 +0000 |
256 | @@ -8,7 +8,11 @@ |
257 | msgstr "" |
258 | "Project-Id-Version: PACKAGE VERSION\n" |
259 | "Report-Msgid-Bugs-To: Kenneth Loafman <kenneth@loafman.com>\n" |
260 | +<<<<<<< TREE |
261 | "POT-Creation-Date: 2017-07-20 06:56-0500\n" |
262 | +======= |
263 | +"POT-Creation-Date: 2017-07-20 06:47-0500\n" |
264 | +>>>>>>> MERGE-SOURCE |
265 | "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" |
266 | "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" |
267 | "Language-Team: LANGUAGE <LL@li.org>\n" |
268 | @@ -18,219 +22,220 @@ |
269 | "Content-Transfer-Encoding: 8bit\n" |
270 | "Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n" |
271 | |
272 | -#: ../bin/duplicity:132 |
273 | +#: ../bin/duplicity:133 |
274 | msgid "Reuse configured PASSPHRASE as SIGN_PASSPHRASE" |
275 | msgstr "" |
276 | |
277 | -#: ../bin/duplicity:139 |
278 | +#: ../bin/duplicity:140 |
279 | msgid "Reuse configured SIGN_PASSPHRASE as PASSPHRASE" |
280 | msgstr "" |
281 | |
282 | -#: ../bin/duplicity:178 |
283 | +#: ../bin/duplicity:179 |
284 | msgid "PASSPHRASE variable not set, asking user." |
285 | msgstr "" |
286 | |
287 | -#: ../bin/duplicity:193 |
288 | +#: ../bin/duplicity:194 |
289 | msgid "GnuPG passphrase for signing key:" |
290 | msgstr "" |
291 | |
292 | -#: ../bin/duplicity:198 |
293 | +#: ../bin/duplicity:199 |
294 | msgid "GnuPG passphrase:" |
295 | msgstr "" |
296 | |
297 | -#: ../bin/duplicity:203 |
298 | +#: ../bin/duplicity:204 |
299 | msgid "Retype passphrase for signing key to confirm: " |
300 | msgstr "" |
301 | |
302 | -#: ../bin/duplicity:205 |
303 | +#: ../bin/duplicity:206 |
304 | msgid "Retype passphrase to confirm: " |
305 | msgstr "" |
306 | |
307 | -#: ../bin/duplicity:208 |
308 | +#: ../bin/duplicity:209 |
309 | msgid "First and second passphrases do not match! Please try again." |
310 | msgstr "" |
311 | |
312 | -#: ../bin/duplicity:215 |
313 | +#: ../bin/duplicity:216 |
314 | msgid "" |
315 | "Cannot use empty passphrase with symmetric encryption! Please try again." |
316 | msgstr "" |
317 | |
318 | -#: ../bin/duplicity:272 |
319 | +#: ../bin/duplicity:273 |
320 | #, python-format |
321 | msgid "" |
322 | "File %s complete in backup set.\n" |
323 | "Continuing restart on file %s." |
324 | msgstr "" |
325 | |
326 | -#: ../bin/duplicity:281 |
327 | +#: ../bin/duplicity:282 |
328 | #, python-format |
329 | msgid "" |
330 | "File %s missing in backup set.\n" |
331 | "Continuing restart on file %s." |
332 | msgstr "" |
333 | |
334 | -#: ../bin/duplicity:330 |
335 | +#: ../bin/duplicity:331 |
336 | #, python-format |
337 | msgid "File %s was corrupted during upload." |
338 | msgstr "" |
339 | |
340 | -#: ../bin/duplicity:363 |
341 | +#: ../bin/duplicity:364 |
342 | msgid "" |
343 | "Restarting backup, but current encryption settings do not match original " |
344 | "settings" |
345 | msgstr "" |
346 | |
347 | -#: ../bin/duplicity:386 |
348 | +#: ../bin/duplicity:387 |
349 | #, python-format |
350 | msgid "Restarting after volume %s, file %s, block %s" |
351 | msgstr "" |
352 | |
353 | -#: ../bin/duplicity:456 |
354 | +#: ../bin/duplicity:457 |
355 | #, python-format |
356 | msgid "Processed volume %d" |
357 | msgstr "" |
358 | |
359 | -#: ../bin/duplicity:606 |
360 | +#: ../bin/duplicity:607 |
361 | msgid "" |
362 | "Fatal Error: Unable to start incremental backup. Old signatures not found " |
363 | "and incremental specified" |
364 | msgstr "" |
365 | |
366 | -#: ../bin/duplicity:610 |
367 | +#: ../bin/duplicity:611 |
368 | msgid "No signatures found, switching to full backup." |
369 | msgstr "" |
370 | |
371 | -#: ../bin/duplicity:624 |
372 | +#: ../bin/duplicity:625 |
373 | msgid "Backup Statistics" |
374 | msgstr "" |
375 | |
376 | -#: ../bin/duplicity:730 |
377 | +#: ../bin/duplicity:731 |
378 | #, python-format |
379 | msgid "%s not found in archive - no files restored." |
380 | msgstr "" |
381 | |
382 | -#: ../bin/duplicity:734 |
383 | +#: ../bin/duplicity:735 |
384 | msgid "No files found in archive - nothing restored." |
385 | msgstr "" |
386 | |
387 | -#: ../bin/duplicity:767 |
388 | +#: ../bin/duplicity:768 |
389 | #, python-format |
390 | msgid "Processed volume %d of %d" |
391 | msgstr "" |
392 | |
393 | -#: ../bin/duplicity:801 |
394 | +#: ../bin/duplicity:802 |
395 | #, python-format |
396 | msgid "Invalid data - %s hash mismatch for file:" |
397 | msgstr "" |
398 | |
399 | -#: ../bin/duplicity:804 |
400 | +#: ../bin/duplicity:805 |
401 | #, python-format |
402 | msgid "Calculated hash: %s" |
403 | msgstr "" |
404 | |
405 | -#: ../bin/duplicity:805 |
406 | +#: ../bin/duplicity:806 |
407 | #, python-format |
408 | msgid "Manifest hash: %s" |
409 | msgstr "" |
410 | |
411 | -#: ../bin/duplicity:844 |
412 | +#: ../bin/duplicity:845 |
413 | #, python-format |
414 | msgid "Volume was signed by key %s, not %s" |
415 | msgstr "" |
416 | |
417 | -#: ../bin/duplicity:876 |
418 | +#: ../bin/duplicity:877 |
419 | #, python-format |
420 | msgid "Verify complete: %s, %s." |
421 | msgstr "" |
422 | |
423 | -#: ../bin/duplicity:877 |
424 | +#: ../bin/duplicity:878 |
425 | #, python-format |
426 | msgid "%d file compared" |
427 | msgid_plural "%d files compared" |
428 | msgstr[0] "" |
429 | msgstr[1] "" |
430 | |
431 | -#: ../bin/duplicity:879 |
432 | +#: ../bin/duplicity:880 |
433 | #, python-format |
434 | msgid "%d difference found" |
435 | msgid_plural "%d differences found" |
436 | msgstr[0] "" |
437 | msgstr[1] "" |
438 | |
439 | -#: ../bin/duplicity:898 |
440 | +#: ../bin/duplicity:899 |
441 | msgid "No extraneous files found, nothing deleted in cleanup." |
442 | msgstr "" |
443 | |
444 | -#: ../bin/duplicity:903 |
445 | +#: ../bin/duplicity:904 |
446 | msgid "Deleting this file from backend:" |
447 | msgid_plural "Deleting these files from backend:" |
448 | msgstr[0] "" |
449 | msgstr[1] "" |
450 | |
451 | -#: ../bin/duplicity:914 |
452 | +#: ../bin/duplicity:915 |
453 | msgid "Found the following file to delete:" |
454 | msgid_plural "Found the following files to delete:" |
455 | msgstr[0] "" |
456 | msgstr[1] "" |
457 | |
458 | -#: ../bin/duplicity:917 |
459 | +#: ../bin/duplicity:918 |
460 | msgid "Run duplicity again with the --force option to actually delete." |
461 | msgstr "" |
462 | |
463 | -#: ../bin/duplicity:960 |
464 | +#: ../bin/duplicity:961 |
465 | msgid "There are backup set(s) at time(s):" |
466 | msgstr "" |
467 | |
468 | -#: ../bin/duplicity:962 |
469 | +#: ../bin/duplicity:963 |
470 | msgid "Which can't be deleted because newer sets depend on them." |
471 | msgstr "" |
472 | |
473 | -#: ../bin/duplicity:966 |
474 | +#: ../bin/duplicity:967 |
475 | msgid "" |
476 | "Current active backup chain is older than specified time. However, it will " |
477 | "not be deleted. To remove all your backups, manually purge the repository." |
478 | msgstr "" |
479 | |
480 | -#: ../bin/duplicity:972 |
481 | +#: ../bin/duplicity:973 |
482 | msgid "No old backup sets found, nothing deleted." |
483 | msgstr "" |
484 | |
485 | -#: ../bin/duplicity:975 |
486 | +#: ../bin/duplicity:976 |
487 | msgid "Deleting backup chain at time:" |
488 | msgid_plural "Deleting backup chains at times:" |
489 | msgstr[0] "" |
490 | msgstr[1] "" |
491 | |
492 | -#: ../bin/duplicity:987 |
493 | +#: ../bin/duplicity:988 |
494 | #, python-format |
495 | msgid "Deleting any incremental signature chain rooted at %s" |
496 | msgstr "" |
497 | |
498 | -#: ../bin/duplicity:989 |
499 | +#: ../bin/duplicity:990 |
500 | #, python-format |
501 | msgid "Deleting any incremental backup chain rooted at %s" |
502 | msgstr "" |
503 | |
504 | -#: ../bin/duplicity:992 |
505 | +#: ../bin/duplicity:993 |
506 | #, python-format |
507 | msgid "Deleting complete signature chain %s" |
508 | msgstr "" |
509 | |
510 | -#: ../bin/duplicity:994 |
511 | +#: ../bin/duplicity:995 |
512 | #, python-format |
513 | msgid "Deleting complete backup chain %s" |
514 | msgstr "" |
515 | |
516 | -#: ../bin/duplicity:1000 |
517 | +#: ../bin/duplicity:1001 |
518 | msgid "Found old backup chain at the following time:" |
519 | msgid_plural "Found old backup chains at the following times:" |
520 | msgstr[0] "" |
521 | msgstr[1] "" |
522 | |
523 | -#: ../bin/duplicity:1004 |
524 | +#: ../bin/duplicity:1005 |
525 | msgid "Rerun command with --force option to actually delete." |
526 | msgstr "" |
527 | |
528 | +<<<<<<< TREE |
529 | #: ../bin/duplicity:1027 |
530 | msgid "No old backup sets found." |
531 | msgstr "" |
532 | @@ -251,80 +256,143 @@ |
533 | msgstr "" |
534 | |
535 | #: ../bin/duplicity:1197 |
536 | +======= |
537 | +#: ../bin/duplicity:1082 |
538 | +>>>>>>> MERGE-SOURCE |
539 | #, python-format |
540 | msgid "Deleting local %s (not authoritative at backend)." |
541 | msgstr "" |
542 | |
543 | +<<<<<<< TREE |
544 | #: ../bin/duplicity:1202 |
545 | +======= |
546 | +#: ../bin/duplicity:1087 |
547 | +>>>>>>> MERGE-SOURCE |
548 | #, python-format |
549 | msgid "Unable to delete %s: %s" |
550 | msgstr "" |
551 | |
552 | +<<<<<<< TREE |
553 | #: ../bin/duplicity:1233 ../duplicity/dup_temp.py:266 |
554 | +======= |
555 | +#: ../bin/duplicity:1118 ../duplicity/dup_temp.py:266 |
556 | +>>>>>>> MERGE-SOURCE |
557 | #, python-format |
558 | msgid "Failed to read %s: %s" |
559 | msgstr "" |
560 | |
561 | +<<<<<<< TREE |
562 | #: ../bin/duplicity:1247 |
563 | +======= |
564 | +#: ../bin/duplicity:1132 |
565 | +>>>>>>> MERGE-SOURCE |
566 | #, python-format |
567 | msgid "Copying %s to local cache." |
568 | msgstr "" |
569 | |
570 | +<<<<<<< TREE |
571 | #: ../bin/duplicity:1295 |
572 | +======= |
573 | +#: ../bin/duplicity:1180 |
574 | +>>>>>>> MERGE-SOURCE |
575 | msgid "Local and Remote metadata are synchronized, no sync needed." |
576 | msgstr "" |
577 | |
578 | +<<<<<<< TREE |
579 | #: ../bin/duplicity:1300 |
580 | +======= |
581 | +#: ../bin/duplicity:1185 |
582 | +>>>>>>> MERGE-SOURCE |
583 | msgid "Synchronizing remote metadata to local cache..." |
584 | msgstr "" |
585 | |
586 | +<<<<<<< TREE |
587 | #: ../bin/duplicity:1312 |
588 | +======= |
589 | +#: ../bin/duplicity:1197 |
590 | +>>>>>>> MERGE-SOURCE |
591 | msgid "Sync would copy the following from remote to local:" |
592 | msgstr "" |
593 | |
594 | +<<<<<<< TREE |
595 | #: ../bin/duplicity:1315 |
596 | +======= |
597 | +#: ../bin/duplicity:1200 |
598 | +>>>>>>> MERGE-SOURCE |
599 | msgid "Sync would remove the following spurious local files:" |
600 | msgstr "" |
601 | |
602 | +<<<<<<< TREE |
603 | #: ../bin/duplicity:1358 |
604 | +======= |
605 | +#: ../bin/duplicity:1243 |
606 | +>>>>>>> MERGE-SOURCE |
607 | msgid "Unable to get free space on temp." |
608 | msgstr "" |
609 | |
610 | +<<<<<<< TREE |
611 | #: ../bin/duplicity:1366 |
612 | +======= |
613 | +#: ../bin/duplicity:1251 |
614 | +>>>>>>> MERGE-SOURCE |
615 | #, python-format |
616 | msgid "Temp space has %d available, backup needs approx %d." |
617 | msgstr "" |
618 | |
619 | +<<<<<<< TREE |
620 | #: ../bin/duplicity:1369 |
621 | +======= |
622 | +#: ../bin/duplicity:1254 |
623 | +>>>>>>> MERGE-SOURCE |
624 | #, python-format |
625 | msgid "Temp has %d available, backup will use approx %d." |
626 | msgstr "" |
627 | |
628 | +<<<<<<< TREE |
629 | #: ../bin/duplicity:1377 |
630 | +======= |
631 | +#: ../bin/duplicity:1262 |
632 | +>>>>>>> MERGE-SOURCE |
633 | msgid "Unable to get max open files." |
634 | msgstr "" |
635 | |
636 | +<<<<<<< TREE |
637 | #: ../bin/duplicity:1381 |
638 | +======= |
639 | +#: ../bin/duplicity:1266 |
640 | +>>>>>>> MERGE-SOURCE |
641 | #, python-format |
642 | msgid "" |
643 | "Max open files of %s is too low, should be >= 1024.\n" |
644 | "Use 'ulimit -n 1024' or higher to correct.\n" |
645 | msgstr "" |
646 | |
647 | +<<<<<<< TREE |
648 | #: ../bin/duplicity:1432 |
649 | +======= |
650 | +#: ../bin/duplicity:1317 |
651 | +>>>>>>> MERGE-SOURCE |
652 | msgid "" |
653 | "RESTART: The first volume failed to upload before termination.\n" |
654 | " Restart is impossible...starting backup from beginning." |
655 | msgstr "" |
656 | |
657 | +<<<<<<< TREE |
658 | #: ../bin/duplicity:1438 |
659 | +======= |
660 | +#: ../bin/duplicity:1323 |
661 | +>>>>>>> MERGE-SOURCE |
662 | #, python-format |
663 | msgid "" |
664 | "RESTART: Volumes %d to %d failed to upload before termination.\n" |
665 | " Restarting backup at volume %d." |
666 | msgstr "" |
667 | |
668 | +<<<<<<< TREE |
669 | #: ../bin/duplicity:1445 |
670 | +======= |
671 | +#: ../bin/duplicity:1330 |
672 | +>>>>>>> MERGE-SOURCE |
673 | #, python-format |
674 | msgid "" |
675 | "RESTART: Impossible backup state: manifest has %d vols, remote has %d vols.\n" |
676 | @@ -333,7 +401,11 @@ |
677 | " backup then restart the backup from the beginning." |
678 | msgstr "" |
679 | |
680 | +<<<<<<< TREE |
681 | #: ../bin/duplicity:1466 |
682 | +======= |
683 | +#: ../bin/duplicity:1351 |
684 | +>>>>>>> MERGE-SOURCE |
685 | msgid "" |
686 | "\n" |
687 | "PYTHONOPTIMIZE in the environment causes duplicity to fail to\n" |
688 | @@ -343,17 +415,29 @@ |
689 | "See https://bugs.launchpad.net/duplicity/+bug/931175\n" |
690 | msgstr "" |
691 | |
692 | +<<<<<<< TREE |
693 | #: ../bin/duplicity:1489 |
694 | +======= |
695 | +#: ../bin/duplicity:1374 |
696 | +>>>>>>> MERGE-SOURCE |
697 | #, python-format |
698 | msgid "Acquiring lockfile %s" |
699 | msgstr "" |
700 | |
701 | +<<<<<<< TREE |
702 | #: ../bin/duplicity:1547 |
703 | +======= |
704 | +#: ../bin/duplicity:1432 |
705 | +>>>>>>> MERGE-SOURCE |
706 | #, python-format |
707 | msgid "Last %s backup left a partial set, restarting." |
708 | msgstr "" |
709 | |
710 | +<<<<<<< TREE |
711 | #: ../bin/duplicity:1551 |
712 | +======= |
713 | +#: ../bin/duplicity:1436 |
714 | +>>>>>>> MERGE-SOURCE |
715 | #, python-format |
716 | msgid "Cleaning up previous partial %s backup set, restarting." |
717 | msgstr "" |
718 | @@ -376,21 +460,37 @@ |
719 | "encryption passphrase." |
720 | msgstr "" |
721 | |
722 | +<<<<<<< TREE |
723 | #: ../bin/duplicity:1684 |
724 | +======= |
725 | +#: ../bin/duplicity:1567 |
726 | +>>>>>>> MERGE-SOURCE |
727 | msgid "INT intercepted...exiting." |
728 | msgstr "" |
729 | |
730 | +<<<<<<< TREE |
731 | #: ../bin/duplicity:1692 |
732 | +======= |
733 | +#: ../bin/duplicity:1575 |
734 | +>>>>>>> MERGE-SOURCE |
735 | #, python-format |
736 | msgid "GPG error detail: %s" |
737 | msgstr "" |
738 | |
739 | +<<<<<<< TREE |
740 | #: ../bin/duplicity:1702 |
741 | +======= |
742 | +#: ../bin/duplicity:1585 |
743 | +>>>>>>> MERGE-SOURCE |
744 | #, python-format |
745 | msgid "User error detail: %s" |
746 | msgstr "" |
747 | |
748 | +<<<<<<< TREE |
749 | #: ../bin/duplicity:1712 |
750 | +======= |
751 | +#: ../bin/duplicity:1595 |
752 | +>>>>>>> MERGE-SOURCE |
753 | #, python-format |
754 | msgid "Backend error detail: %s" |
755 | msgstr "" |
756 | @@ -941,142 +1041,263 @@ |
757 | msgid "Writing %s of type %s" |
758 | msgstr "" |
759 | |
760 | +<<<<<<< TREE |
761 | #: ../duplicity/collections.py:171 ../duplicity/collections.py:185 |
762 | +======= |
763 | +#: ../duplicity/collections.py:165 ../duplicity/collections.py:179 |
764 | +>>>>>>> MERGE-SOURCE |
765 | #, python-format |
766 | msgid "BackupSet.delete: missing %s" |
767 | msgstr "" |
768 | |
769 | +<<<<<<< TREE |
770 | #: ../duplicity/collections.py:210 |
771 | +======= |
772 | +#: ../duplicity/collections.py:204 |
773 | +>>>>>>> MERGE-SOURCE |
774 | msgid "Fatal Error: No manifests found for most recent backup" |
775 | msgstr "" |
776 | |
777 | +<<<<<<< TREE |
778 | #: ../duplicity/collections.py:219 |
779 | +======= |
780 | +#: ../duplicity/collections.py:213 |
781 | +>>>>>>> MERGE-SOURCE |
782 | msgid "" |
783 | "Fatal Error: Remote manifest does not match local one. Either the remote " |
784 | "backup set or the local archive directory has been corrupted." |
785 | msgstr "" |
786 | |
787 | +<<<<<<< TREE |
788 | #: ../duplicity/collections.py:227 |
789 | +======= |
790 | +#: ../duplicity/collections.py:221 |
791 | +>>>>>>> MERGE-SOURCE |
792 | msgid "Fatal Error: Neither remote nor local manifest is readable." |
793 | msgstr "" |
794 | |
795 | +<<<<<<< TREE |
796 | #: ../duplicity/collections.py:238 |
797 | +======= |
798 | +#: ../duplicity/collections.py:232 |
799 | +>>>>>>> MERGE-SOURCE |
800 | #, python-format |
801 | msgid "Processing local manifest %s (%s)" |
802 | msgstr "" |
803 | |
804 | +<<<<<<< TREE |
805 | #: ../duplicity/collections.py:249 |
806 | #, python-format |
807 | msgid "Error processing remote manifest (%s): %s" |
808 | msgstr "" |
809 | |
810 | #: ../duplicity/collections.py:252 |
811 | +======= |
812 | +#: ../duplicity/collections.py:243 |
813 | +#, python-format |
814 | +msgid "Error processing remote manifest (%s): %s" |
815 | +msgstr "" |
816 | + |
817 | +#: ../duplicity/collections.py:246 |
818 | +>>>>>>> MERGE-SOURCE |
819 | #, python-format |
820 | msgid "Processing remote manifest %s (%s)" |
821 | msgstr "" |
822 | |
823 | +<<<<<<< TREE |
824 | #: ../duplicity/collections.py:337 |
825 | +======= |
826 | +#: ../duplicity/collections.py:331 |
827 | +>>>>>>> MERGE-SOURCE |
828 | msgid "Preferring Backupset over previous one!" |
829 | msgstr "" |
830 | |
831 | +<<<<<<< TREE |
832 | #: ../duplicity/collections.py:340 |
833 | +======= |
834 | +#: ../duplicity/collections.py:334 |
835 | +>>>>>>> MERGE-SOURCE |
836 | #, python-format |
837 | msgid "Ignoring incremental Backupset (start_time: %s; needed: %s)" |
838 | msgstr "" |
839 | |
840 | +<<<<<<< TREE |
841 | #: ../duplicity/collections.py:345 |
842 | +======= |
843 | +#: ../duplicity/collections.py:339 |
844 | +>>>>>>> MERGE-SOURCE |
845 | #, python-format |
846 | msgid "Added incremental Backupset (start_time: %s / end_time: %s)" |
847 | msgstr "" |
848 | |
849 | +<<<<<<< TREE |
850 | #: ../duplicity/collections.py:415 |
851 | +======= |
852 | +#: ../duplicity/collections.py:409 |
853 | +>>>>>>> MERGE-SOURCE |
854 | msgid "Chain start time: " |
855 | msgstr "" |
856 | |
857 | +<<<<<<< TREE |
858 | #: ../duplicity/collections.py:416 |
859 | +======= |
860 | +#: ../duplicity/collections.py:410 |
861 | +>>>>>>> MERGE-SOURCE |
862 | msgid "Chain end time: " |
863 | msgstr "" |
864 | |
865 | +<<<<<<< TREE |
866 | #: ../duplicity/collections.py:417 |
867 | +======= |
868 | +#: ../duplicity/collections.py:411 |
869 | +>>>>>>> MERGE-SOURCE |
870 | #, python-format |
871 | msgid "Number of contained backup sets: %d" |
872 | msgstr "" |
873 | |
874 | +<<<<<<< TREE |
875 | #: ../duplicity/collections.py:419 |
876 | +======= |
877 | +#: ../duplicity/collections.py:413 |
878 | +>>>>>>> MERGE-SOURCE |
879 | #, python-format |
880 | msgid "Total number of contained volumes: %d" |
881 | msgstr "" |
882 | |
883 | +<<<<<<< TREE |
884 | #: ../duplicity/collections.py:421 ../duplicity/collections.py:1225 |
885 | +======= |
886 | +#: ../duplicity/collections.py:415 ../duplicity/collections.py:1219 |
887 | +>>>>>>> MERGE-SOURCE |
888 | msgid "Type of backup set:" |
889 | msgstr "" |
890 | |
891 | +<<<<<<< TREE |
892 | #: ../duplicity/collections.py:421 ../duplicity/collections.py:1225 |
893 | +======= |
894 | +#: ../duplicity/collections.py:415 ../duplicity/collections.py:1219 |
895 | +>>>>>>> MERGE-SOURCE |
896 | msgid "Time:" |
897 | msgstr "" |
898 | |
899 | +<<<<<<< TREE |
900 | #: ../duplicity/collections.py:421 |
901 | +======= |
902 | +#: ../duplicity/collections.py:415 |
903 | +>>>>>>> MERGE-SOURCE |
904 | msgid "Num volumes:" |
905 | msgstr "" |
906 | |
907 | +<<<<<<< TREE |
908 | #: ../duplicity/collections.py:425 ../duplicity/collections.py:1231 |
909 | +======= |
910 | +#: ../duplicity/collections.py:419 ../duplicity/collections.py:1225 |
911 | +>>>>>>> MERGE-SOURCE |
912 | msgid "Full" |
913 | msgstr "" |
914 | |
915 | +<<<<<<< TREE |
916 | #: ../duplicity/collections.py:428 ../duplicity/collections.py:1233 |
917 | +======= |
918 | +#: ../duplicity/collections.py:422 ../duplicity/collections.py:1227 |
919 | +>>>>>>> MERGE-SOURCE |
920 | msgid "Incremental" |
921 | msgstr "" |
922 | |
923 | +<<<<<<< TREE |
924 | #: ../duplicity/collections.py:488 |
925 | +======= |
926 | +#: ../duplicity/collections.py:482 |
927 | +>>>>>>> MERGE-SOURCE |
928 | msgid "local" |
929 | msgstr "" |
930 | |
931 | +<<<<<<< TREE |
932 | #: ../duplicity/collections.py:490 |
933 | +======= |
934 | +#: ../duplicity/collections.py:484 |
935 | +>>>>>>> MERGE-SOURCE |
936 | msgid "remote" |
937 | msgstr "" |
938 | |
939 | +<<<<<<< TREE |
940 | #: ../duplicity/collections.py:646 |
941 | +======= |
942 | +#: ../duplicity/collections.py:640 |
943 | +>>>>>>> MERGE-SOURCE |
944 | msgid "Collection Status" |
945 | msgstr "" |
946 | |
947 | +<<<<<<< TREE |
948 | #: ../duplicity/collections.py:648 |
949 | +======= |
950 | +#: ../duplicity/collections.py:642 |
951 | +>>>>>>> MERGE-SOURCE |
952 | #, python-format |
953 | msgid "Connecting with backend: %s" |
954 | msgstr "" |
955 | |
956 | +<<<<<<< TREE |
957 | #: ../duplicity/collections.py:650 |
958 | +======= |
959 | +#: ../duplicity/collections.py:644 |
960 | +>>>>>>> MERGE-SOURCE |
961 | #, python-format |
962 | msgid "Archive dir: %s" |
963 | msgstr "" |
964 | |
965 | +<<<<<<< TREE |
966 | #: ../duplicity/collections.py:653 |
967 | +======= |
968 | +#: ../duplicity/collections.py:647 |
969 | +>>>>>>> MERGE-SOURCE |
970 | #, python-format |
971 | msgid "Found %d secondary backup chain." |
972 | msgid_plural "Found %d secondary backup chains." |
973 | msgstr[0] "" |
974 | msgstr[1] "" |
975 | |
976 | +<<<<<<< TREE |
977 | #: ../duplicity/collections.py:658 |
978 | +======= |
979 | +#: ../duplicity/collections.py:652 |
980 | +>>>>>>> MERGE-SOURCE |
981 | #, python-format |
982 | msgid "Secondary chain %d of %d:" |
983 | msgstr "" |
984 | |
985 | +<<<<<<< TREE |
986 | #: ../duplicity/collections.py:664 |
987 | +======= |
988 | +#: ../duplicity/collections.py:658 |
989 | +>>>>>>> MERGE-SOURCE |
990 | msgid "Found primary backup chain with matching signature chain:" |
991 | msgstr "" |
992 | |
993 | +<<<<<<< TREE |
994 | #: ../duplicity/collections.py:668 |
995 | +======= |
996 | +#: ../duplicity/collections.py:662 |
997 | +>>>>>>> MERGE-SOURCE |
998 | msgid "No backup chains with active signatures found" |
999 | msgstr "" |
1000 | |
1001 | +<<<<<<< TREE |
1002 | #: ../duplicity/collections.py:671 |
1003 | +======= |
1004 | +#: ../duplicity/collections.py:665 |
1005 | +>>>>>>> MERGE-SOURCE |
1006 | #, python-format |
1007 | msgid "Also found %d backup set not part of any chain," |
1008 | msgid_plural "Also found %d backup sets not part of any chain," |
1009 | msgstr[0] "" |
1010 | msgstr[1] "" |
1011 | |
1012 | +<<<<<<< TREE |
1013 | #: ../duplicity/collections.py:675 |
1014 | +======= |
1015 | +#: ../duplicity/collections.py:669 |
1016 | +>>>>>>> MERGE-SOURCE |
1017 | #, python-format |
1018 | msgid "and %d incomplete backup set." |
1019 | msgid_plural "and %d incomplete backup sets." |
1020 | @@ -1084,112 +1305,196 @@ |
1021 | msgstr[1] "" |
1022 | |
1023 | #. "cleanup" is a hard-coded command, so do not translate it |
1024 | +<<<<<<< TREE |
1025 | #: ../duplicity/collections.py:680 |
1026 | +======= |
1027 | +#: ../duplicity/collections.py:674 |
1028 | +>>>>>>> MERGE-SOURCE |
1029 | msgid "These may be deleted by running duplicity with the \"cleanup\" command." |
1030 | msgstr "" |
1031 | |
1032 | +<<<<<<< TREE |
1033 | #: ../duplicity/collections.py:683 |
1034 | +======= |
1035 | +#: ../duplicity/collections.py:677 |
1036 | +>>>>>>> MERGE-SOURCE |
1037 | msgid "No orphaned or incomplete backup sets found." |
1038 | msgstr "" |
1039 | |
1040 | +<<<<<<< TREE |
1041 | #: ../duplicity/collections.py:699 |
1042 | +======= |
1043 | +#: ../duplicity/collections.py:693 |
1044 | +>>>>>>> MERGE-SOURCE |
1045 | #, python-format |
1046 | msgid "%d file exists on backend" |
1047 | msgid_plural "%d files exist on backend" |
1048 | msgstr[0] "" |
1049 | msgstr[1] "" |
1050 | |
1051 | +<<<<<<< TREE |
1052 | #: ../duplicity/collections.py:709 |
1053 | +======= |
1054 | +#: ../duplicity/collections.py:703 |
1055 | +>>>>>>> MERGE-SOURCE |
1056 | #, python-format |
1057 | msgid "%d file exists in cache" |
1058 | msgid_plural "%d files exist in cache" |
1059 | msgstr[0] "" |
1060 | msgstr[1] "" |
1061 | |
1062 | +<<<<<<< TREE |
1063 | #: ../duplicity/collections.py:762 |
1064 | +======= |
1065 | +#: ../duplicity/collections.py:756 |
1066 | +>>>>>>> MERGE-SOURCE |
1067 | msgid "Warning, discarding last backup set, because of missing signature file." |
1068 | msgstr "" |
1069 | |
1070 | +<<<<<<< TREE |
1071 | #: ../duplicity/collections.py:785 |
1072 | +======= |
1073 | +#: ../duplicity/collections.py:779 |
1074 | +>>>>>>> MERGE-SOURCE |
1075 | msgid "Warning, found the following local orphaned signature file:" |
1076 | msgid_plural "Warning, found the following local orphaned signature files:" |
1077 | msgstr[0] "" |
1078 | msgstr[1] "" |
1079 | |
1080 | +<<<<<<< TREE |
1081 | #: ../duplicity/collections.py:794 |
1082 | +======= |
1083 | +#: ../duplicity/collections.py:788 |
1084 | +>>>>>>> MERGE-SOURCE |
1085 | msgid "Warning, found the following remote orphaned signature file:" |
1086 | msgid_plural "Warning, found the following remote orphaned signature files:" |
1087 | msgstr[0] "" |
1088 | msgstr[1] "" |
1089 | |
1090 | +<<<<<<< TREE |
1091 | #: ../duplicity/collections.py:803 |
1092 | +======= |
1093 | +#: ../duplicity/collections.py:797 |
1094 | +>>>>>>> MERGE-SOURCE |
1095 | msgid "Warning, found signatures but no corresponding backup files" |
1096 | msgstr "" |
1097 | |
1098 | +<<<<<<< TREE |
1099 | #: ../duplicity/collections.py:807 |
1100 | +======= |
1101 | +#: ../duplicity/collections.py:801 |
1102 | +>>>>>>> MERGE-SOURCE |
1103 | msgid "" |
1104 | "Warning, found incomplete backup sets, probably left from aborted session" |
1105 | msgstr "" |
1106 | |
1107 | +<<<<<<< TREE |
1108 | #: ../duplicity/collections.py:811 |
1109 | +======= |
1110 | +#: ../duplicity/collections.py:805 |
1111 | +>>>>>>> MERGE-SOURCE |
1112 | msgid "Warning, found the following orphaned backup file:" |
1113 | msgid_plural "Warning, found the following orphaned backup files:" |
1114 | msgstr[0] "" |
1115 | msgstr[1] "" |
1116 | |
1117 | +<<<<<<< TREE |
1118 | #: ../duplicity/collections.py:828 |
1119 | +======= |
1120 | +#: ../duplicity/collections.py:822 |
1121 | +>>>>>>> MERGE-SOURCE |
1122 | #, python-format |
1123 | msgid "Extracting backup chains from list of files: %s" |
1124 | msgstr "" |
1125 | |
1126 | +<<<<<<< TREE |
1127 | #: ../duplicity/collections.py:839 |
1128 | +======= |
1129 | +#: ../duplicity/collections.py:833 |
1130 | +>>>>>>> MERGE-SOURCE |
1131 | #, python-format |
1132 | msgid "File %s is part of known set" |
1133 | msgstr "" |
1134 | |
1135 | +<<<<<<< TREE |
1136 | #: ../duplicity/collections.py:842 |
1137 | +======= |
1138 | +#: ../duplicity/collections.py:836 |
1139 | +>>>>>>> MERGE-SOURCE |
1140 | #, python-format |
1141 | msgid "File %s is not part of a known set; creating new set" |
1142 | msgstr "" |
1143 | |
1144 | +<<<<<<< TREE |
1145 | #: ../duplicity/collections.py:847 |
1146 | +======= |
1147 | +#: ../duplicity/collections.py:841 |
1148 | +>>>>>>> MERGE-SOURCE |
1149 | #, python-format |
1150 | msgid "Ignoring file (rejected by backup set) '%s'" |
1151 | msgstr "" |
1152 | |
1153 | +<<<<<<< TREE |
1154 | #: ../duplicity/collections.py:863 |
1155 | +======= |
1156 | +#: ../duplicity/collections.py:857 |
1157 | +>>>>>>> MERGE-SOURCE |
1158 | #, python-format |
1159 | msgid "Found backup chain %s" |
1160 | msgstr "" |
1161 | |
1162 | +<<<<<<< TREE |
1163 | #: ../duplicity/collections.py:868 |
1164 | +======= |
1165 | +#: ../duplicity/collections.py:862 |
1166 | +>>>>>>> MERGE-SOURCE |
1167 | #, python-format |
1168 | msgid "Added set %s to pre-existing chain %s" |
1169 | msgstr "" |
1170 | |
1171 | +<<<<<<< TREE |
1172 | #: ../duplicity/collections.py:872 |
1173 | +======= |
1174 | +#: ../duplicity/collections.py:866 |
1175 | +>>>>>>> MERGE-SOURCE |
1176 | #, python-format |
1177 | msgid "Found orphaned set %s" |
1178 | msgstr "" |
1179 | |
1180 | +<<<<<<< TREE |
1181 | #: ../duplicity/collections.py:1026 |
1182 | +======= |
1183 | +#: ../duplicity/collections.py:1020 |
1184 | +>>>>>>> MERGE-SOURCE |
1185 | #, python-format |
1186 | msgid "" |
1187 | "No signature chain for the requested time. Using oldest available chain, " |
1188 | "starting at time %s." |
1189 | msgstr "" |
1190 | |
1191 | +<<<<<<< TREE |
1192 | #: ../duplicity/collections.py:1223 |
1193 | +======= |
1194 | +#: ../duplicity/collections.py:1217 |
1195 | +>>>>>>> MERGE-SOURCE |
1196 | #, python-format |
1197 | msgid "File: %s" |
1198 | msgstr "" |
1199 | |
1200 | +<<<<<<< TREE |
1201 | #: ../duplicity/collections.py:1224 |
1202 | +======= |
1203 | +#: ../duplicity/collections.py:1218 |
1204 | +>>>>>>> MERGE-SOURCE |
1205 | #, python-format |
1206 | msgid "Total number of backup: %d" |
1207 | msgstr "" |
1208 | |
1209 | +<<<<<<< TREE |
1210 | #: ../duplicity/collections.py:1225 |
1211 | +======= |
1212 | +#: ../duplicity/collections.py:1219 |
1213 | +>>>>>>> MERGE-SOURCE |
1214 | msgid "Type of file change:" |
1215 | msgstr "" |
1216 | |
1217 | |
1218 | === modified file 'testing/unit/test_collections.py' |
1219 | --- testing/unit/test_collections.py 2017-07-19 17:52:30 +0000 |
1220 | +++ testing/unit/test_collections.py 2017-08-05 22:24:26 +0000 |
1221 | @@ -98,7 +98,11 @@ |
1222 | def test_backup_chains(self): |
1223 | """Test basic backup chain construction""" |
1224 | random.shuffle(filename_list1) |
1225 | +<<<<<<< TREE |
1226 | cs = collections.CollectionsStatus(None, globals.archive_dir_path, "full") |
1227 | +======= |
1228 | + cs = collections.CollectionsStatus(None, globals.archive_dir, "full") |
1229 | +>>>>>>> MERGE-SOURCE |
1230 | chains, orphaned, incomplete = cs.get_backup_chains(filename_list1) # @UnusedVariable |
1231 | if len(chains) != 1 or len(orphaned) != 0: |
1232 | print(chains) |
1233 | @@ -119,7 +123,11 @@ |
1234 | assert cs.matched_chain_pair[0].end_time == 1029826800 |
1235 | assert len(cs.all_backup_chains) == 1, cs.all_backup_chains |
1236 | |
1237 | +<<<<<<< TREE |
1238 | cs = collections.CollectionsStatus(self.real_backend, globals.archive_dir_path, "full").set_values() |
1239 | +======= |
1240 | + cs = collections.CollectionsStatus(self.real_backend, globals.archive_dir, "full").set_values() |
1241 | +>>>>>>> MERGE-SOURCE |
1242 | check_cs(cs) |
1243 | assert cs.matched_chain_pair[0].islocal() |
1244 | |
1245 | @@ -132,13 +140,21 @@ |
1246 | |
1247 | def test_sig_chains(self): |
1248 | """Test making signature chains from filename list""" |
1249 | +<<<<<<< TREE |
1250 | cs = collections.CollectionsStatus(None, globals.archive_dir_path, "full") |
1251 | +======= |
1252 | + cs = collections.CollectionsStatus(None, globals.archive_dir, "full") |
1253 | +>>>>>>> MERGE-SOURCE |
1254 | chains, orphaned_paths = cs.get_signature_chains(local=1) |
1255 | self.sig_chains_helper(chains, orphaned_paths) |
1256 | |
1257 | def test_sig_chains2(self): |
1258 | """Test making signature chains from filename list on backend""" |
1259 | +<<<<<<< TREE |
1260 | cs = collections.CollectionsStatus(self.archive_dir_backend, globals.archive_dir_path, "full") |
1261 | +======= |
1262 | + cs = collections.CollectionsStatus(self.archive_dir_backend, globals.archive_dir, "full") |
1263 | +>>>>>>> MERGE-SOURCE |
1264 | chains, orphaned_paths = cs.get_signature_chains(local=None) |
1265 | self.sig_chains_helper(chains, orphaned_paths) |
1266 | |
1267 | @@ -195,7 +211,11 @@ |
1268 | p = self.output_dir.append(filename) |
1269 | p.touch() |
1270 | |
1271 | +<<<<<<< TREE |
1272 | cs = collections.CollectionsStatus(self.output_dir_backend, globals.archive_dir_path, "full") |
1273 | +======= |
1274 | + cs = collections.CollectionsStatus(self.output_dir_backend, globals.archive_dir, "full") |
1275 | +>>>>>>> MERGE-SOURCE |
1276 | cs.set_values() |
1277 | return cs |
1278 |