Merge lp:~mterry/deja-dup/warn-on-bad-read into lp:deja-dup/22

Proposed by Michael Terry
Status: Merged
Merged at revision: 1274
Proposed branch: lp:~mterry/deja-dup/warn-on-bad-read
Merge into: lp:deja-dup/22
Diff against target: 1252 lines (+337/-209)
11 files modified
common/Duplicity.vala (+41/-9)
common/Operation.vala (+8/-8)
common/OperationBackup.vala (+2/-2)
common/OperationRestore.vala (+2/-2)
deja-dup/AssistantBackup.vala (+5/-1)
deja-dup/AssistantOperation.vala (+40/-22)
deja-dup/AssistantRestore.vala (+1/-1)
deja-dup/AssistantRestoreMissing.vala (+4/-4)
deja-dup/StatusIcon.vala (+10/-3)
po/deja-dup.pot (+182/-156)
tests/common/common.vala (+42/-1)
To merge this branch: bzr merge lp:~mterry/deja-dup/warn-on-bad-read
Reviewer Review Type Date Requested Status
Ken VanDine Approve
Review via email: mp+86823@code.launchpad.net

Description of the change

Tell user if we couldn't read a file during the backup.

To post a comment you must log in.
Revision history for this message
Ken VanDine (ken-vandine) wrote :

Sorry for the delay in reviewing this, I think it looks good however the tests have a conflict now with the latest trunk. Can you update this branch to merge cleanly and let me give it another once over?

review: Needs Fixing
lp:~mterry/deja-dup/warn-on-bad-read updated
1267. By Michael Terry

merge from trunk

Revision history for this message
Michael Terry (mterry) wrote :

Try now.

lp:~mterry/deja-dup/warn-on-bad-read updated
1268. By Michael Terry

merge from trunk

Revision history for this message
Ken VanDine (ken-vandine) wrote :

Tests pass now and it looks good.

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'common/Duplicity.vala'
2--- common/Duplicity.vala 2011-12-28 06:20:36 +0000
3+++ common/Duplicity.vala 2012-01-09 09:28:24 +0000
4@@ -30,7 +30,7 @@
5 * vala withot the need of manually running duplicity command.
6 */
7
8- public signal void done(bool success, bool cancelled);
9+ public signal void done(bool success, bool cancelled, string? detail);
10 public signal void raise_error(string errstr, string? detail);
11 public signal void action_desc_changed(string action);
12 public signal void action_file_changed(File file, bool actual);
13@@ -108,6 +108,8 @@
14 bool has_checked_contents = false;
15 bool has_non_home_contents = false;
16 List<File> homes = new List<File>();
17+
18+ List<File> read_error_files = null;
19
20 bool checked_collection_info = false;
21 bool got_collection_info = false;
22@@ -169,7 +171,7 @@
23 }
24 catch (Error e) {
25 raise_error(e.message, null);
26- done(false, false);
27+ done(false, false, null);
28 return;
29 }
30 this.backend = backend;
31@@ -187,7 +189,7 @@
32 delete_age = settings.get_int(DELETE_AFTER_KEY);
33
34 if (!restart())
35- done(false, false);
36+ done(false, false, null);
37
38 if (!backend.is_native()) {
39 Network.get().notify["connected"].connect(network_changed);
40@@ -384,6 +386,7 @@
41 bool restart()
42 {
43 state = State.NORMAL;
44+ read_error_files = null;
45
46 if (mode == Operation.Mode.INVALID)
47 return false;
48@@ -515,7 +518,7 @@
49
50 if (!has_progress_total) {
51 if (!restart())
52- done(false, false);
53+ done(false, false, null);
54 return;
55 }
56
57@@ -551,7 +554,7 @@
58 }
59
60 if (!restart())
61- done(false, false);
62+ done(false, false, null);
63 }
64
65 bool cleanup() {
66@@ -596,6 +599,8 @@
67
68 void handle_done(DuplicityInstance? inst, bool success, bool cancelled)
69 {
70+ string detail = null;
71+
72 if (can_ignore_error())
73 success = true;
74
75@@ -667,6 +672,17 @@
76 }
77 }
78 else if (mode == Operation.Mode.BACKUP) {
79+ if (read_error_files != null) {
80+ // OK, we succeeded yay! But some files didn't make it into the backup
81+ // because we couldn't read them. So tell the user so they don't think
82+ // everything is hunky dory.
83+ detail = _("Could not back up the following files. Please make sure you are able to open them.");
84+ detail += "\n";
85+ foreach (File f in read_error_files) {
86+ detail += "\n%s".printf(f.get_parse_name());
87+ }
88+ }
89+
90 mode = Operation.Mode.INVALID; // mark 'done' so when we delete, we don't restart
91 if (delete_files_if_needed())
92 return;
93@@ -682,9 +698,9 @@
94
95 if (!success && !cancelled && !error_issued)
96 show_error(_("Failed with an unknown error."));
97-
98+
99 inst = null;
100- done(success, cancelled);
101+ done(success, cancelled, detail);
102 }
103
104 string saved_status;
105@@ -803,6 +819,7 @@
106 protected static const int WARNING_UNMATCHED_SIG = 4;
107 protected static const int WARNING_INCOMPLETE_BACKUP = 5;
108 protected static const int WARNING_ORPHANED_BACKUP = 6;
109+ protected static const int WARNING_CANNOT_READ = 10;
110 protected static const int DEBUG_GENERIC = 1;
111
112 void delete_cache()
113@@ -1265,7 +1282,22 @@
114 // in ourselves, we may never get to it.
115 if (mode == Operation.Mode.BACKUP && !this.cleaned_up_once)
116 cleanup(); // stops current backup, cleans up, then resumes
117- break;
118+ break;
119+
120+ case WARNING_CANNOT_READ:
121+ // A file couldn't be backed up! We should note the name and present
122+ // the user with a list at the end.
123+ if (firstline.length > 2) {
124+ // Only add it if it's a child of one of our includes. Sometimes
125+ // Duplicity likes to talk to us about folders like /lost+found and
126+ // such that we don't care about.
127+ var error_file = make_file_obj(firstline[2]);
128+ foreach (File f in includes) {
129+ if (error_file.equal(f) || error_file.has_prefix(f))
130+ read_error_files.append(error_file);
131+ }
132+ }
133+ break;
134 }
135 }
136 }
137@@ -1406,7 +1438,7 @@
138 }
139 catch (Error e) {
140 show_error(e.message);
141- done(false, false);
142+ done(false, false, null);
143 }
144 }
145 }
146
147=== modified file 'common/Operation.vala'
148--- common/Operation.vala 2011-11-06 01:16:05 +0000
149+++ common/Operation.vala 2012-01-09 09:28:24 +0000
150@@ -32,7 +32,7 @@
151 * but it is provided to provide easier development and an abstraction layer
152 * in case Deja Dup project ever replaces its backend.
153 */
154- public signal void done(bool success, bool cancelled);
155+ public signal void done(bool success, bool cancelled, string? detail);
156 public signal void raise_error(string errstr, string? detail);
157 public signal void action_desc_changed(string action);
158 public signal void action_file_changed(File file, bool actual);
159@@ -115,7 +115,7 @@
160 }
161 catch (Error e) {
162 raise_error(e.message, null);
163- done(false, false);
164+ done(false, false, null);
165 return;
166 }
167
168@@ -179,7 +179,7 @@
169 /*
170 * Connect Deja Dup to signals
171 */
172- dup.done.connect((d, o, c) => {operation_finished(d, o, c);});
173+ dup.done.connect((d, o, c, detail) => {operation_finished(d, o, c, detail);});
174 dup.raise_error.connect((d, s, detail) => {raise_error(s, detail);});
175 dup.action_desc_changed.connect((d, s) => {action_desc_changed(s);});
176 dup.action_file_changed.connect((d, f, b) => {action_file_changed(f, b);});
177@@ -214,7 +214,7 @@
178 }
179 catch (Error e) {
180 raise_error(e.message, null);
181- operation_finished(dup, false, false);
182+ operation_finished(dup, false, false, null);
183 }
184 }
185
186@@ -230,7 +230,7 @@
187 if (!success) {
188 if (error != null)
189 raise_error(error, null);
190- operation_finished(dup, false, false);
191+ operation_finished(dup, false, false, null);
192 return;
193 }
194
195@@ -242,18 +242,18 @@
196 }
197 catch (Error e) {
198 raise_error(e.message, null);
199- operation_finished(dup, false, false);
200+ operation_finished(dup, false, false, null);
201 return;
202 }
203 }
204
205- internal async virtual void operation_finished(Duplicity dup, bool success, bool cancelled)
206+ internal async virtual void operation_finished(Duplicity dup, bool success, bool cancelled, string? detail)
207 {
208 finished = true;
209
210 unclaim_bus();
211
212- done(success, cancelled);
213+ done(success, cancelled, detail);
214 }
215
216 protected virtual List<string>? make_argv() throws Error
217
218=== modified file 'common/OperationBackup.vala'
219--- common/OperationBackup.vala 2011-11-06 01:16:05 +0000
220+++ common/OperationBackup.vala 2012-01-09 09:28:24 +0000
221@@ -27,13 +27,13 @@
222 Object(xid: xid, mode: Mode.BACKUP);
223 }
224
225- internal async override void operation_finished(Duplicity dup, bool success, bool cancelled)
226+ internal async override void operation_finished(Duplicity dup, bool success, bool cancelled, string? detail)
227 {
228 /* If successfully completed, update time of last backup and run base operation_finished */
229 if (success)
230 DejaDup.update_last_run_timestamp(DejaDup.TimestampType.BACKUP);
231
232- base.operation_finished(dup, success, cancelled);
233+ base.operation_finished(dup, success, cancelled, detail);
234 }
235
236 protected override List<string>? make_argv() throws Error
237
238=== modified file 'common/OperationRestore.vala'
239--- common/OperationRestore.vala 2011-11-06 01:16:05 +0000
240+++ common/OperationRestore.vala 2012-01-09 09:28:24 +0000
241@@ -70,12 +70,12 @@
242 return argv;
243 }
244
245- internal async override void operation_finished(Duplicity dup, bool success, bool cancelled)
246+ internal async override void operation_finished(Duplicity dup, bool success, bool cancelled, string? detail)
247 {
248 if (success)
249 DejaDup.update_last_run_timestamp(DejaDup.TimestampType.RESTORE);
250
251- base.operation_finished(dup, success, cancelled);
252+ base.operation_finished(dup, success, cancelled, detail);
253 }
254 }
255
256
257=== modified file 'deja-dup/AssistantBackup.vala'
258--- deja-dup/AssistantBackup.vala 2011-09-15 15:34:42 +0000
259+++ deja-dup/AssistantBackup.vala 2012-01-09 09:28:24 +0000
260@@ -90,7 +90,11 @@
261 set_page_title(page, _("Backup Failed"));
262 }
263 else {
264- Idle.add(() => {do_close(); return false;});
265+ set_page_title(page, _("Backup Finished"));
266+
267+ // If we don't have a special message to show the user, just bail.
268+ if (!detail_widget.get_visible())
269+ Idle.add(() => {do_close(); return false;});
270 }
271 }
272 else if (page == progress_page) {
273
274=== modified file 'deja-dup/AssistantOperation.vala'
275--- deja-dup/AssistantOperation.vala 2011-10-20 16:09:37 +0000
276+++ deja-dup/AssistantOperation.vala 2012-01-09 09:28:24 +0000
277@@ -68,8 +68,8 @@
278 protected Gtk.Widget progress_page {get; private set;}
279
280 protected Gtk.Label summary_label;
281- Gtk.Widget error_widget;
282- Gtk.TextView error_text_view;
283+ protected Gtk.Widget detail_widget;
284+ Gtk.TextView detail_text_view;
285 protected Gtk.Widget summary_page {get; private set;}
286
287 protected Gdk.Pixbuf op_icon {get; private set;}
288@@ -266,22 +266,24 @@
289
290 return page;
291 }
292-
293+
294+ void show_detail(string detail)
295+ {
296+ page_box.set_size_request(300, 200);
297+ detail_widget.no_show_all = false;
298+ detail_widget.show_all();
299+ detail_text_view.buffer.set_text(detail, -1);
300+ }
301+
302 public virtual void show_error(string error, string? detail)
303 {
304 error_occurred = true;
305
306 summary_label.label = error;
307- summary_label.wrap = true;
308 summary_label.selectable = true;
309- summary_label.max_width_chars = 25;
310
311- if (detail != null) {
312- page_box.set_size_request(300, 200);
313- error_widget.no_show_all = false;
314- error_widget.show_all();
315- error_text_view.buffer.set_text(detail, -1);
316- }
317+ if (detail != null)
318+ show_detail(detail);
319
320 go_to_page(summary_page);
321 set_header_icon(Gtk.Stock.DIALOG_ERROR);
322@@ -408,23 +410,25 @@
323 {
324 summary_label = new Gtk.Label("");
325 summary_label.set("xalign", 0.0f);
326+ summary_label.wrap = true;
327+ summary_label.max_width_chars = 25;
328
329- error_text_view = new Gtk.TextView();
330- error_text_view.editable = false;
331- error_text_view.wrap_mode = Gtk.WrapMode.WORD;
332- error_text_view.height_request = 150;
333+ detail_text_view = new Gtk.TextView();
334+ detail_text_view.editable = false;
335+ detail_text_view.wrap_mode = Gtk.WrapMode.WORD;
336+ detail_text_view.height_request = 150;
337
338 var scroll = new Gtk.ScrolledWindow(null, null);
339- scroll.add(error_text_view);
340+ scroll.add(detail_text_view);
341 scroll.no_show_all = true; // only will be shown if an error occurs
342- error_widget = scroll;
343+ detail_widget = scroll;
344
345 var page = new Gtk.Box(Gtk.Orientation.VERTICAL, 6);
346 page.set("child", summary_label,
347- "child", error_widget,
348+ "child", detail_widget,
349 "border-width", 12);
350 page.child_set(summary_label, "expand", false);
351- page.child_set(error_widget, "expand", true);
352+ page.child_set(detail_widget, "expand", true);
353
354 return page;
355 }
356@@ -472,10 +476,10 @@
357 summary_page = page;
358 }
359
360- protected virtual void apply_finished(DejaDup.Operation op, bool success, bool cancelled)
361+ protected virtual void apply_finished(DejaDup.Operation op, bool success, bool cancelled, string? detail)
362 {
363 if (status_icon != null) {
364- status_icon.done(success, cancelled);
365+ status_icon.done(success, cancelled, detail);
366 status_icon = null;
367 }
368 this.op = null;
369@@ -489,6 +493,20 @@
370 else {
371 if (success) {
372 succeeded = true;
373+
374+ if (detail != null) {
375+ // Expect one paragraph followed by a blank line. The first paragraph
376+ // is an explanation before the full detail content. So split it out
377+ // into a proper label to look nice.
378+ var halves = detail.split("\n\n", 2);
379+ if (halves.length == 1) // no full detail content
380+ summary_label.label = detail;
381+ else if (halves.length == 2) {
382+ summary_label.label = halves[0];
383+ show_detail(halves[1]);
384+ }
385+ }
386+
387 go_to_page(summary_page);
388 }
389 else // show error
390@@ -579,7 +597,7 @@
391 {
392 hide();
393 if (status_icon != null) {
394- status_icon.done(false, true);
395+ status_icon.done(false, true, null);
396 status_icon = null; // hide immediately to seem responsive
397 }
398 }
399
400=== modified file 'deja-dup/AssistantRestore.vala'
401--- deja-dup/AssistantRestore.vala 2011-10-20 18:03:00 +0000
402+++ deja-dup/AssistantRestore.vala 2012-01-09 09:28:24 +0000
403@@ -362,7 +362,7 @@
404 show_error(_("No backups to restore"), null);
405 }
406
407- protected virtual void query_finished(DejaDup.Operation op, bool success, bool cancelled)
408+ protected virtual void query_finished(DejaDup.Operation op, bool success, bool cancelled, string? detail)
409 {
410 this.op_state = op.get_state();
411 this.query_op = null;
412
413=== modified file 'deja-dup/AssistantRestoreMissing.vala'
414--- deja-dup/AssistantRestoreMissing.vala 2011-10-07 14:43:17 +0000
415+++ deja-dup/AssistantRestoreMissing.vala 2012-01-09 09:28:24 +0000
416@@ -326,7 +326,7 @@
417
418 // Don't start if queue is empty.
419 if (backups_queue.get_length() == 0) {
420- query_files_finished(query_op_files, true, false);
421+ query_files_finished(query_op_files, true, false, null);
422 return;
423 }
424
425@@ -385,7 +385,7 @@
426 query_op_files.start();
427 }
428
429- protected override void query_finished(DejaDup.Operation op, bool success, bool cancelled)
430+ protected override void query_finished(DejaDup.Operation op, bool success, bool cancelled, string? detail)
431 {
432 query_op = null;
433 op_state = this.op.get_state();
434@@ -410,7 +410,7 @@
435 base.do_cancel();
436 }
437
438- protected override void apply_finished(DejaDup.Operation op, bool success, bool cancelled)
439+ protected override void apply_finished(DejaDup.Operation op, bool success, bool cancelled, string? detail)
440 {
441 /*
442 * Ran after assistant finishes applying restore operation.
443@@ -444,7 +444,7 @@
444 }
445 }
446
447- protected void query_files_finished(DejaDup.Operation? op, bool success, bool cancelled)
448+ protected void query_files_finished(DejaDup.Operation? op, bool success, bool cancelled, string? detail)
449 {
450 query_op_files = null;
451 this.op = null;
452
453=== modified file 'deja-dup/StatusIcon.vala'
454--- deja-dup/StatusIcon.vala 2011-10-10 02:27:25 +0000
455+++ deja-dup/StatusIcon.vala 2012-01-09 09:28:24 +0000
456@@ -109,7 +109,7 @@
457 update_progress();
458 }
459
460- public virtual void done(bool success, bool cancelled)
461+ public virtual void done(bool success, bool cancelled, string? detail)
462 {
463 if (note != null) {
464 try {
465@@ -122,9 +122,16 @@
466 }
467
468 if (success && !cancelled && op.mode == DejaDup.Operation.Mode.BACKUP) {
469+ string msg = _("Backup completed");
470+
471+ string more = null;
472+ if (detail != null) {
473+ msg = _("Backup finished");
474+ more = _("Not all files were successfully backed up. See dialog for more details.");
475+ }
476+
477 Notify.init(_("Backup"));
478- note = new Notify.Notification(_("Backup completed"), null,
479- "deja-dup");
480+ note = new Notify.Notification(msg, more, "deja-dup");
481 try {
482 note.show();
483 }
484
485=== modified file 'po/deja-dup.pot'
486--- po/deja-dup.pot 2011-10-31 13:15:46 +0000
487+++ po/deja-dup.pot 2012-01-09 09:28:24 +0000
488@@ -8,7 +8,7 @@
489 msgstr ""
490 "Project-Id-Version: PACKAGE VERSION\n"
491 "Report-Msgid-Bugs-To: mike@mterry.name\n"
492-"POT-Creation-Date: 2011-10-28 12:39-0400\n"
493+"POT-Creation-Date: 2012-01-04 16:22-0500\n"
494 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
495 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
496 "Language-Team: LANGUAGE <LL@li.org>\n"
497@@ -19,10 +19,10 @@
498 "Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n"
499
500 #. Translators: "Backup" is a noun
501-#: ../data/deja-dup.desktop.in.h:1 ../data/deja-dup-ccpanel.desktop.in.h:2
502-#: ../data/deja-dup-preferences.desktop.in.in.h:2 ../deja-dup/Prompt.vala:93
503-#: ../deja-dup/Prompt.vala:127 ../deja-dup/StatusIcon.vala:125
504-#: ../deja-dup/StatusIcon.vala:224 ../monitor/monitor.vala:115
505+#: ../data/deja-dup.desktop.in.h:1 ../data/deja-dup-ccpanel.desktop.in.h:1
506+#: ../data/deja-dup-preferences.desktop.in.in.h:1 ../deja-dup/Prompt.vala:93
507+#: ../deja-dup/Prompt.vala:127 ../deja-dup/StatusIcon.vala:133
508+#: ../deja-dup/StatusIcon.vala:231 ../monitor/monitor.vala:115
509 #: ../preferences/preferences-main.vala:52
510 #: ../preferences/preferences-main.vala:66
511 msgid "Backup"
512@@ -39,20 +39,20 @@
513 msgid "Déjà Dup Backup Tool"
514 msgstr ""
515
516-#: ../data/deja-dup-ccpanel.desktop.in.h:1
517-#: ../data/deja-dup-preferences.desktop.in.in.h:1
518-msgid "Back Up Now"
519-msgstr ""
520-
521-#: ../data/deja-dup-ccpanel.desktop.in.h:3
522-#: ../data/deja-dup-preferences.desktop.in.in.h:3
523+#: ../data/deja-dup-ccpanel.desktop.in.h:2
524+#: ../data/deja-dup-preferences.desktop.in.in.h:2
525 msgid "Change your backup settings"
526 msgstr ""
527
528 #. These keywords are used when searching for applications in dashes, etc.
529+#: ../data/deja-dup-ccpanel.desktop.in.h:4
530+#: ../data/deja-dup-preferences.desktop.in.in.h:4
531+msgid "déjà;deja;dup;"
532+msgstr ""
533+
534 #: ../data/deja-dup-ccpanel.desktop.in.h:5
535 #: ../data/deja-dup-preferences.desktop.in.in.h:5
536-msgid "déjà;deja;dup;"
537+msgid "Back Up Now"
538 msgstr ""
539
540 #. Translators: Monitor in this sense means something akin to 'watcher', not
541@@ -67,251 +67,251 @@
542 msgstr ""
543
544 #: ../data/org.gnome.DejaDup.gschema.xml.in.h:1
545-msgid "Amazon S3 Access Key ID"
546+#: ../preferences/Preferences.vala:160
547+msgid "Folders to back up"
548 msgstr ""
549
550 #: ../data/org.gnome.DejaDup.gschema.xml.in.h:2
551 msgid ""
552-"An optional folder name to store files in. This folder will be created in "
553-"the chosen bucket."
554+"This list of directories will be backed up. Reserved values $HOME, $DESKTOP, "
555+"$DOCUMENTS, $DOWNLOAD, $MUSIC, $PICTURES, $PUBLIC_SHARE, $TEMPLATES, $TRASH, "
556+"and $VIDEO are recognized as the user’s special directories. Relative "
557+"entries are relative to the user’s home directory."
558 msgstr ""
559
560 #: ../data/org.gnome.DejaDup.gschema.xml.in.h:3
561-#: ../deja-dup/AssistantRestore.vala:221 ../preferences/Preferences.vala:151
562-msgid "Backup location"
563+#: ../preferences/Preferences.vala:168
564+msgid "Folders to ignore"
565 msgstr ""
566
567 #: ../data/org.gnome.DejaDup.gschema.xml.in.h:4
568-msgid "Folder type"
569+msgid ""
570+"This list of directories will not be backed up. Reserved values $HOME, "
571+"$DESKTOP, $DOCUMENTS, $DOWNLOAD, $MUSIC, $PICTURES, $PUBLIC_SHARE, "
572+"$TEMPLATES, $TRASH, and $VIDEO are recognized as the user’s special "
573+"directories. Relative entries are relative to the user’s home directory."
574 msgstr ""
575
576 #: ../data/org.gnome.DejaDup.gschema.xml.in.h:5
577-#: ../preferences/Preferences.vala:160
578-msgid "Folders to back up"
579+msgid "Whether the welcome screen has been dismissed"
580 msgstr ""
581
582 #: ../data/org.gnome.DejaDup.gschema.xml.in.h:6
583-#: ../preferences/Preferences.vala:168
584-msgid "Folders to ignore"
585+msgid "Whether to request the root password"
586 msgstr ""
587
588 #: ../data/org.gnome.DejaDup.gschema.xml.in.h:7
589-msgid "Full name of the external volume"
590+msgid ""
591+"Whether to request the root password when backing up from or restoring to "
592+"system folders."
593 msgstr ""
594
595 #: ../data/org.gnome.DejaDup.gschema.xml.in.h:8
596-msgid "How long to keep backup files"
597+msgid "The last time Déjà Dup was run"
598 msgstr ""
599
600 #: ../data/org.gnome.DejaDup.gschema.xml.in.h:9
601-msgid "How often to periodically back up"
602+msgid ""
603+"The last time Déjà Dup was successfully run. This time should be in ISO 8601 "
604+"format."
605 msgstr ""
606
607 #: ../data/org.gnome.DejaDup.gschema.xml.in.h:10
608-msgid "Icon of the external volume"
609+msgid "The last time Déjà Dup backed up"
610 msgstr ""
611
612 #: ../data/org.gnome.DejaDup.gschema.xml.in.h:11
613 msgid ""
614-"If the backup location is on an external volume, this is its unique "
615-"filesystem identifier."
616+"The last time Déjà Dup successfully completed a backup. This time should be "
617+"in ISO 8601 format."
618 msgstr ""
619
620 #: ../data/org.gnome.DejaDup.gschema.xml.in.h:12
621-msgid ""
622-"If the backup location is on an external volume, this is the path of the "
623-"folder on that volume."
624+msgid "The last time Déjà Dup restored"
625 msgstr ""
626
627 #: ../data/org.gnome.DejaDup.gschema.xml.in.h:13
628 msgid ""
629-"If the backup location is on an external volume, this is the volume’s icon."
630+"The last time Déjà Dup successfully completed a restore. This time should be "
631+"in ISO 8601 format."
632 msgstr ""
633
634 #: ../data/org.gnome.DejaDup.gschema.xml.in.h:14
635-msgid ""
636-"If the backup location is on an external volume, this is the volume’s longer "
637-"descriptive name."
638+msgid "Whether to periodically back up"
639 msgstr ""
640
641 #: ../data/org.gnome.DejaDup.gschema.xml.in.h:15
642-msgid ""
643-"If the backup location is on an external volume, this is the volume’s "
644-"shorter name."
645+msgid "Whether to automatically back up on a regular schedule."
646 msgstr ""
647
648 #: ../data/org.gnome.DejaDup.gschema.xml.in.h:16
649-msgid "Location in which to hold the backup files."
650+msgid "How often to periodically back up"
651 msgstr ""
652
653 #: ../data/org.gnome.DejaDup.gschema.xml.in.h:17
654-msgid "Obsolete"
655+msgid "The number of days between backups."
656 msgstr ""
657
658 #: ../data/org.gnome.DejaDup.gschema.xml.in.h:18
659-msgid "Relative path under the external volume"
660+msgid ""
661+"The first time Déjà Dup checked whether it should prompt about backing up"
662 msgstr ""
663
664 #: ../data/org.gnome.DejaDup.gschema.xml.in.h:19
665-msgid "Short name of the external volume"
666+msgid ""
667+"When a user logs in, the Déjà Dup monitor checks whether it should prompt "
668+"about backing up. This is used to increase discoverability for users that "
669+"don’t know about backups. This time should be either ‘disabled’ to turn off "
670+"this check or in ISO 8601 format."
671 msgstr ""
672
673 #: ../data/org.gnome.DejaDup.gschema.xml.in.h:20
674-msgid "The Amazon S3 bucket name to use"
675-msgstr ""
676-
677-#. Left this way for historical reasons, should be '$HOSTNAME'. See convert_s3_folder_to_hostname()
678+msgid "How long to keep backup files"
679+msgstr ""
680+
681+#: ../data/org.gnome.DejaDup.gschema.xml.in.h:21
682+msgid ""
683+"The number of days to keep backup files on the backup location. A value of 0 "
684+"means forever. This is a minimum number of days; the files may be kept "
685+"longer."
686+msgstr ""
687+
688 #: ../data/org.gnome.DejaDup.gschema.xml.in.h:22
689-msgid "The Amazon S3 folder"
690+msgid "Type of location to store backup"
691 msgstr ""
692
693 #: ../data/org.gnome.DejaDup.gschema.xml.in.h:23
694-msgid "The Rackspace Cloud Files container"
695+msgid ""
696+"The type of backup location. If ‘auto’, a default will be chosen based on "
697+"what is available."
698 msgstr ""
699
700 #: ../data/org.gnome.DejaDup.gschema.xml.in.h:24
701-msgid "The Ubuntu One folder"
702+msgid "Amazon S3 Access Key ID"
703 msgstr ""
704
705 #: ../data/org.gnome.DejaDup.gschema.xml.in.h:25
706-msgid ""
707-"The first time Déjà Dup checked whether it should prompt about backing up"
708+msgid "Your Amazon S3 Access Key Identifier. This acts as your S3 username."
709 msgstr ""
710
711 #: ../data/org.gnome.DejaDup.gschema.xml.in.h:26
712-msgid ""
713-"The folder name to store files in. If ‘$HOSTNAME’, it will default to a "
714-"folder based on the name of the computer."
715+msgid "The Amazon S3 bucket name to use"
716 msgstr ""
717
718 #: ../data/org.gnome.DejaDup.gschema.xml.in.h:27
719-msgid "The last time Déjà Dup backed up"
720-msgstr ""
721-
722-#: ../data/org.gnome.DejaDup.gschema.xml.in.h:28
723-msgid "The last time Déjà Dup restored"
724-msgstr ""
725-
726+msgid ""
727+"Which Amazon S3 bucket to store files in. This does not need to exist "
728+"already. Only legal hostname strings are valid."
729+msgstr ""
730+
731+#. Left this way for historical reasons, should be '$HOSTNAME'. See convert_s3_folder_to_hostname()
732 #: ../data/org.gnome.DejaDup.gschema.xml.in.h:29
733-msgid ""
734-"The last time Déjà Dup successfully completed a backup. This time should be "
735-"in ISO 8601 format."
736+msgid "The Amazon S3 folder"
737 msgstr ""
738
739 #: ../data/org.gnome.DejaDup.gschema.xml.in.h:30
740 msgid ""
741-"The last time Déjà Dup successfully completed a restore. This time should be "
742-"in ISO 8601 format."
743+"An optional folder name to store files in. This folder will be created in "
744+"the chosen bucket."
745 msgstr ""
746
747 #: ../data/org.gnome.DejaDup.gschema.xml.in.h:31
748-msgid "The last time Déjà Dup was run"
749+msgid "The Rackspace Cloud Files container"
750 msgstr ""
751
752 #: ../data/org.gnome.DejaDup.gschema.xml.in.h:32
753 msgid ""
754-"The last time Déjà Dup was successfully run. This time should be in ISO 8601 "
755-"format."
756+"Which Rackspace Cloud Files container to store files in. This does not need "
757+"to exist already. Only legal hostname strings are valid."
758 msgstr ""
759
760 #: ../data/org.gnome.DejaDup.gschema.xml.in.h:33
761-msgid "The number of days between backups."
762+msgid "Your Rackspace username"
763 msgstr ""
764
765 #: ../data/org.gnome.DejaDup.gschema.xml.in.h:34
766-msgid ""
767-"The number of days to keep backup files on the backup location. A value of 0 "
768-"means forever. This is a minimum number of days; the files may be kept "
769-"longer."
770+msgid "This is your username for the Rackspace Cloud Files service."
771 msgstr ""
772
773 #: ../data/org.gnome.DejaDup.gschema.xml.in.h:35
774-msgid ""
775-"The type of backup location. If ‘auto’, a default will be chosen based on "
776-"what is available."
777+msgid "The Ubuntu One folder"
778 msgstr ""
779
780 #: ../data/org.gnome.DejaDup.gschema.xml.in.h:36
781-msgid "This is your username for the Rackspace Cloud Files service."
782+msgid ""
783+"The folder name to store files in. If ‘$HOSTNAME’, it will default to a "
784+"folder based on the name of the computer."
785 msgstr ""
786
787 #: ../data/org.gnome.DejaDup.gschema.xml.in.h:37
788-msgid ""
789-"This list of directories will be backed up. Reserved values $HOME, $DESKTOP, "
790-"$DOCUMENTS, $DOWNLOAD, $MUSIC, $PICTURES, $PUBLIC_SHARE, $TEMPLATES, $TRASH, "
791-"and $VIDEO are recognized as the user’s special directories. Relative "
792-"entries are relative to the user’s home directory."
793+#: ../deja-dup/AssistantRestore.vala:221 ../preferences/Preferences.vala:151
794+msgid "Backup location"
795 msgstr ""
796
797 #: ../data/org.gnome.DejaDup.gschema.xml.in.h:38
798-msgid ""
799-"This list of directories will not be backed up. Reserved values $HOME, "
800-"$DESKTOP, $DOCUMENTS, $DOWNLOAD, $MUSIC, $PICTURES, $PUBLIC_SHARE, "
801-"$TEMPLATES, $TRASH, and $VIDEO are recognized as the user’s special "
802-"directories. Relative entries are relative to the user’s home directory."
803+msgid "Location in which to hold the backup files."
804 msgstr ""
805
806 #: ../data/org.gnome.DejaDup.gschema.xml.in.h:39
807-msgid "Type of location to store backup"
808+msgid "Folder type"
809 msgstr ""
810
811 #: ../data/org.gnome.DejaDup.gschema.xml.in.h:40
812-msgid "Unique ID of the external volume"
813+msgid ""
814+"Whether the backup location is a mounted external volume or a normal folder."
815 msgstr ""
816
817 #: ../data/org.gnome.DejaDup.gschema.xml.in.h:41
818-msgid ""
819-"When a user logs in, the Déjà Dup monitor checks whether it should prompt "
820-"about backing up. This is used to increase discoverability for users that "
821-"don’t know about backups. This time should be either ‘disabled’ to turn off "
822-"this check or in ISO 8601 format."
823+msgid "Relative path under the external volume"
824 msgstr ""
825
826 #: ../data/org.gnome.DejaDup.gschema.xml.in.h:42
827 msgid ""
828-"Whether the backup location is a mounted external volume or a normal folder."
829+"If the backup location is on an external volume, this is the path of the "
830+"folder on that volume."
831 msgstr ""
832
833 #: ../data/org.gnome.DejaDup.gschema.xml.in.h:43
834-msgid "Whether the welcome screen has been dismissed"
835+msgid "Unique ID of the external volume"
836 msgstr ""
837
838 #: ../data/org.gnome.DejaDup.gschema.xml.in.h:44
839-msgid "Whether to automatically back up on a regular schedule."
840+msgid ""
841+"If the backup location is on an external volume, this is its unique "
842+"filesystem identifier."
843 msgstr ""
844
845 #: ../data/org.gnome.DejaDup.gschema.xml.in.h:45
846-msgid "Whether to periodically back up"
847+msgid "Full name of the external volume"
848 msgstr ""
849
850 #: ../data/org.gnome.DejaDup.gschema.xml.in.h:46
851-msgid "Whether to request the root password"
852+msgid ""
853+"If the backup location is on an external volume, this is the volume’s longer "
854+"descriptive name."
855 msgstr ""
856
857 #: ../data/org.gnome.DejaDup.gschema.xml.in.h:47
858-msgid ""
859-"Whether to request the root password when backing up from or restoring to "
860-"system folders."
861+msgid "Short name of the external volume"
862 msgstr ""
863
864 #: ../data/org.gnome.DejaDup.gschema.xml.in.h:48
865 msgid ""
866-"Which Amazon S3 bucket to store files in. This does not need to exist "
867-"already. Only legal hostname strings are valid."
868+"If the backup location is on an external volume, this is the volume’s "
869+"shorter name."
870 msgstr ""
871
872 #: ../data/org.gnome.DejaDup.gschema.xml.in.h:49
873-msgid ""
874-"Which Rackspace Cloud Files container to store files in. This does not need "
875-"to exist already. Only legal hostname strings are valid."
876+msgid "Icon of the external volume"
877 msgstr ""
878
879 #: ../data/org.gnome.DejaDup.gschema.xml.in.h:50
880-msgid "Your Amazon S3 Access Key Identifier. This acts as your S3 username."
881+msgid ""
882+"If the backup location is on an external volume, this is the volume’s icon."
883 msgstr ""
884
885 #: ../data/org.gnome.DejaDup.gschema.xml.in.h:51
886-msgid "Your Rackspace username"
887+msgid "Obsolete"
888 msgstr ""
889
890 #: ../data/ui/restore-missing.ui.h:1
891@@ -515,41 +515,50 @@
892 "only found version %d.%d.%.2d"
893 msgstr ""
894
895-#: ../common/Duplicity.vala:132 ../common/Duplicity.vala:186
896+#: ../common/Duplicity.vala:135 ../common/Duplicity.vala:198
897 msgid "Paused (no network)"
898 msgstr ""
899
900-#: ../common/Duplicity.vala:392 ../common/Duplicity.vala:399
901-#: ../common/Duplicity.vala:418 ../common/Duplicity.vala:423
902+#: ../common/Duplicity.vala:405 ../common/Duplicity.vala:412
903+#: ../common/Duplicity.vala:431 ../common/Duplicity.vala:436
904 #: ../common/Operation.vala:79 ../common/Operation.vala:111
905 msgid "Preparing…"
906 msgstr ""
907
908 #. Was not even a file path (maybe something goofy like computer://)
909-#: ../common/Duplicity.vala:450
910+#: ../common/Duplicity.vala:463
911 #, c-format
912 msgid "Could not restore ‘%s’: Not a valid file location"
913 msgstr ""
914
915 #. Tiny backup location. Suggest they get a larger one.
916-#: ../common/Duplicity.vala:516
917+#: ../common/Duplicity.vala:529
918 msgid "Backup location is too small. Try using one with more space."
919 msgstr ""
920
921-#: ../common/Duplicity.vala:538
922+#: ../common/Duplicity.vala:551
923 msgid "Backup location does not have enough free space."
924 msgstr ""
925
926-#: ../common/Duplicity.vala:557 ../common/Duplicity.vala:571
927+#: ../common/Duplicity.vala:570 ../common/Duplicity.vala:584
928 msgid "Cleaning up…"
929 msgstr ""
930
931-#: ../common/Duplicity.vala:673 ../common/Duplicity.vala:1062
932-#: ../deja-dup/AssistantOperation.vala:519
933+#. OK, we succeeded yay! But some files didn't make it into the backup
934+#. because we couldn't read them. So tell the user so they don't think
935+#. everything is hunky dory.
936+#: ../common/Duplicity.vala:679
937+msgid ""
938+"Could not back up the following files. Please make sure you are able to "
939+"open them."
940+msgstr ""
941+
942+#: ../common/Duplicity.vala:700 ../common/Duplicity.vala:1089
943+#: ../deja-dup/AssistantOperation.vala:537
944 msgid "Failed with an unknown error."
945 msgstr ""
946
947-#: ../common/Duplicity.vala:901
948+#: ../common/Duplicity.vala:929
949 #, c-format
950 msgid "Could not restore ‘%s’: File not found in backup"
951 msgstr ""
952@@ -557,16 +566,16 @@
953 #. notify upper layers, if they want to do anything
954 #. Duplicity tried to ask the user what the encryption password is.
955 #. notify upper layers, if they want to do anything
956-#: ../common/Duplicity.vala:907 ../common/Duplicity.vala:1009
957-#: ../common/Duplicity.vala:1013
958+#: ../common/Duplicity.vala:935 ../common/Duplicity.vala:1037
959+#: ../common/Duplicity.vala:1041
960 msgid "Bad encryption password."
961 msgstr ""
962
963-#: ../common/Duplicity.vala:912
964+#: ../common/Duplicity.vala:940
965 msgid "Computer name changed"
966 msgstr ""
967
968-#: ../common/Duplicity.vala:912
969+#: ../common/Duplicity.vala:940
970 #, c-format
971 msgid ""
972 "The existing backup is of a computer named %s, but the current computer’s "
973@@ -574,67 +583,67 @@
974 "location."
975 msgstr ""
976
977-#: ../common/Duplicity.vala:947
978+#: ../common/Duplicity.vala:975
979 #, c-format
980 msgid "Permission denied when trying to create ‘%s’."
981 msgstr ""
982
983 #. assume error is on backend side
984-#: ../common/Duplicity.vala:951 ../common/Duplicity.vala:955
985+#: ../common/Duplicity.vala:979 ../common/Duplicity.vala:983
986 #, c-format
987 msgid "Permission denied when trying to read ‘%s’."
988 msgstr ""
989
990-#: ../common/Duplicity.vala:959
991+#: ../common/Duplicity.vala:987
992 #, c-format
993 msgid "Permission denied when trying to delete ‘%s’."
994 msgstr ""
995
996-#: ../common/Duplicity.vala:966
997+#: ../common/Duplicity.vala:994
998 #, c-format
999 msgid "Backup location ‘%s’ does not exist."
1000 msgstr ""
1001
1002-#: ../common/Duplicity.vala:972 ../common/Duplicity.vala:1032
1003+#: ../common/Duplicity.vala:1000 ../common/Duplicity.vala:1060
1004 msgid "No space left."
1005 msgstr ""
1006
1007-#: ../common/Duplicity.vala:986
1008+#: ../common/Duplicity.vala:1014
1009 msgid "Invalid ID."
1010 msgstr ""
1011
1012-#: ../common/Duplicity.vala:988
1013+#: ../common/Duplicity.vala:1016
1014 msgid "Invalid secret key."
1015 msgstr ""
1016
1017-#: ../common/Duplicity.vala:990
1018+#: ../common/Duplicity.vala:1018
1019 msgid "Your Amazon Web Services account is not signed up for the S3 service."
1020 msgstr ""
1021
1022-#: ../common/Duplicity.vala:1003
1023+#: ../common/Duplicity.vala:1031
1024 msgid "S3 bucket name is not available."
1025 msgstr ""
1026
1027-#: ../common/Duplicity.vala:1017
1028+#: ../common/Duplicity.vala:1045
1029 #, c-format
1030 msgid "Error reading file ‘%s’."
1031 msgstr ""
1032
1033-#: ../common/Duplicity.vala:1019
1034+#: ../common/Duplicity.vala:1047
1035 #, c-format
1036 msgid "Error writing file ‘%s’."
1037 msgstr ""
1038
1039-#: ../common/Duplicity.vala:1034
1040+#: ../common/Duplicity.vala:1062
1041 #, c-format
1042 msgid "No space left in ‘%s’."
1043 msgstr ""
1044
1045-#: ../common/Duplicity.vala:1042
1046+#: ../common/Duplicity.vala:1070
1047 msgid "No backup files found"
1048 msgstr ""
1049
1050-#: ../common/Duplicity.vala:1093
1051+#: ../common/Duplicity.vala:1120
1052 msgid "Uploading…"
1053 msgstr ""
1054
1055@@ -692,7 +701,11 @@
1056 msgid "Backup Failed"
1057 msgstr ""
1058
1059-#: ../deja-dup/AssistantBackup.vala:97
1060+#: ../deja-dup/AssistantBackup.vala:93
1061+msgid "Backup Finished"
1062+msgstr ""
1063+
1064+#: ../deja-dup/AssistantBackup.vala:101
1065 msgid "Backing Up…"
1066 msgstr ""
1067
1068@@ -704,51 +717,51 @@
1069 msgid "_Details"
1070 msgstr ""
1071
1072-#: ../deja-dup/AssistantOperation.vala:302
1073+#: ../deja-dup/AssistantOperation.vala:304
1074 msgid "_Allow restoring without a password"
1075 msgstr ""
1076
1077-#: ../deja-dup/AssistantOperation.vala:308
1078+#: ../deja-dup/AssistantOperation.vala:310
1079 msgid "_Password-protect your backup"
1080 msgstr ""
1081
1082-#: ../deja-dup/AssistantOperation.vala:322
1083+#: ../deja-dup/AssistantOperation.vala:324
1084 #, c-format
1085 msgid ""
1086 "You will need your password to restore your files. You might want to write "
1087 "it down."
1088 msgstr ""
1089
1090-#: ../deja-dup/AssistantOperation.vala:337
1091+#: ../deja-dup/AssistantOperation.vala:339
1092 msgid "E_ncryption password"
1093 msgstr ""
1094
1095-#: ../deja-dup/AssistantOperation.vala:354
1096+#: ../deja-dup/AssistantOperation.vala:356
1097 msgid "Confir_m password"
1098 msgstr ""
1099
1100-#: ../deja-dup/AssistantOperation.vala:367
1101+#: ../deja-dup/AssistantOperation.vala:369
1102 msgid "_Show password"
1103 msgstr ""
1104
1105-#: ../deja-dup/AssistantOperation.vala:376
1106+#: ../deja-dup/AssistantOperation.vala:378
1107 #: ../deja-dup/MountOperationAssistant.vala:40
1108 msgid "_Remember password"
1109 msgstr ""
1110
1111-#: ../deja-dup/AssistantOperation.vala:443
1112+#: ../deja-dup/AssistantOperation.vala:447
1113 msgid "Summary"
1114 msgstr ""
1115
1116-#: ../deja-dup/AssistantOperation.vala:712
1117+#: ../deja-dup/AssistantOperation.vala:730
1118 msgid "Require Password?"
1119 msgstr ""
1120
1121-#: ../deja-dup/AssistantOperation.vala:714
1122+#: ../deja-dup/AssistantOperation.vala:732
1123 msgid "Encryption Password Needed"
1124 msgstr ""
1125
1126-#: ../deja-dup/AssistantOperation.vala:760
1127+#: ../deja-dup/AssistantOperation.vala:778
1128 msgid "Backup encryption password"
1129 msgstr ""
1130
1131@@ -1025,24 +1038,33 @@
1132 msgid "_Skip Backup"
1133 msgstr ""
1134
1135-#: ../deja-dup/StatusIcon.vala:126
1136+#: ../deja-dup/StatusIcon.vala:125
1137 msgid "Backup completed"
1138 msgstr ""
1139
1140-#: ../deja-dup/StatusIcon.vala:225
1141+#: ../deja-dup/StatusIcon.vala:129
1142+msgid "Backup finished"
1143+msgstr ""
1144+
1145+#: ../deja-dup/StatusIcon.vala:130
1146+msgid ""
1147+"Not all files were successfully backed up. See dialog for more details."
1148+msgstr ""
1149+
1150+#: ../deja-dup/StatusIcon.vala:232
1151 msgid "Starting scheduled backup"
1152 msgstr ""
1153
1154-#: ../deja-dup/StatusIcon.vala:227
1155+#: ../deja-dup/StatusIcon.vala:234
1156 msgid "Show Progress"
1157 msgstr ""
1158
1159-#: ../deja-dup/StatusIcon.vala:265
1160+#: ../deja-dup/StatusIcon.vala:272
1161 #, c-format
1162 msgid "%.1f%% complete"
1163 msgstr ""
1164
1165-#: ../deja-dup/StatusIcon.vala:278
1166+#: ../deja-dup/StatusIcon.vala:285
1167 msgid "Show _Progress"
1168 msgstr ""
1169
1170@@ -1114,6 +1136,10 @@
1171 msgid "Schedule"
1172 msgstr ""
1173
1174+#: ../preferences/Preferences.vala:365
1175+msgid "Categories"
1176+msgstr ""
1177+
1178 #: ../widgets/ConfigDelete.vala:43
1179 msgid "At least a month"
1180 msgstr ""
1181
1182=== modified file 'tests/common/common.vala'
1183--- tests/common/common.vala 2012-01-06 02:47:04 +0000
1184+++ tests/common/common.vala 2012-01-09 09:28:24 +0000
1185@@ -207,11 +207,14 @@
1186 {
1187 var loop = new MainLoop(null);
1188 var op = new DejaDup.OperationBackup();
1189- op.done.connect((op, s, c) => {
1190+ op.done.connect((op, s, c, d) => {
1191+ Test.message("Done: %d, %d, %s", (int)s, (int)c, d);
1192 if (success != s)
1193 warning("Success didn't match; expected %d, got %d", (int) success, (int) s);
1194 if (cancelled != c)
1195 warning("Cancel didn't match; expected %d, got %d", (int) cancelled, (int) c);
1196+ if (detail != d)
1197+ warning("Detail didn't match; expected %s, got %s", detail, d);
1198 loop.quit();
1199 });
1200
1201@@ -420,6 +423,43 @@
1202 br.run();
1203 }
1204
1205+void read_error()
1206+{
1207+ Test.bug("907846");
1208+ var user = Environment.get_user_name();
1209+ set_script("""
1210+ARGS: collection-status %s
1211+
1212+=== deja-dup ===
1213+ARGS: %s
1214+
1215+WARNING 10 '/blarg'
1216+
1217+WARNING 10 '/home/%s/1'
1218+
1219+WARNING 10 '/home/%s/2'
1220+
1221+=== deja-dup ===
1222+ARGS: %s
1223+
1224+WARNING 10 '/blarg'
1225+
1226+WARNING 10 '/home/%s/1'
1227+
1228+WARNING 10 '/home/%s/2'
1229+
1230+""".printf(default_args(),
1231+ default_args(Mode.DRY), user, user,
1232+ default_args(Mode.BACKUP), user, user));
1233+
1234+ var br = new BackupRunner();
1235+ br.detail = """Could not back up the following files. Please make sure you are able to open them.
1236+
1237+/home/%s/1
1238+/home/%s/2""".printf(user, user);
1239+ br.run();
1240+}
1241+
1242 int main(string[] args)
1243 {
1244 Test.init(ref args);
1245@@ -445,6 +485,7 @@
1246 backup.add(make_backup_case("cancel_noop", cancel_noop));
1247 backup.add(make_backup_case("cancel", cancel));
1248 backup.add(make_backup_case("stop", stop));
1249+ backup.add(make_backup_case("read_error", read_error));
1250 TestSuite.get_root().add_suite(backup);
1251
1252 var rv = Test.run();

Subscribers

People subscribed via source and target branches