Merge lp:~mterry/duplicity/giobackend-display-name-0.7 into lp:~duplicity-team/duplicity/0.8-series

Proposed by Michael Terry
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
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.

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/user-visible name that we want to work with anyway.

(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.

To post a comment you must log in.

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

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
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

Subscribers

People subscribed via source and target branches