← Back to team overview

deja-dup-team team mailing list archive

[Merge] lp:~mterry/deja-dup/more-idle into lp:deja-dup

 

Michael Terry has proposed merging lp:~mterry/deja-dup/more-idle into lp:deja-dup.

Requested reviews:
  Robert Bruce Park (robru)

For more details, see:
https://code.launchpad.net/~mterry/deja-dup/more-idle/+merge/154722

Newer versions of Linux support more aggressively idle states for processes.

In particular, non-root users can call "ionice -c3" in linux 2.6.25 and up.  And "chrt --idle 0" is available in linux 2.6.23 and up.

So, we might as well use them, to reduce the strain of a backup on the system.  Ideally the user never notices.
-- 
https://code.launchpad.net/~mterry/deja-dup/more-idle/+merge/154722
Your team Déjà Dup Developers is subscribed to branch lp:deja-dup.
=== modified file 'NEWS'
--- NEWS	2013-02-04 20:39:45 +0000
+++ NEWS	2013-03-21 15:06:23 +0000
@@ -1,3 +1,11 @@
+Déjà Dup 26.0 (GNOME 3.8.0)
+---------------------------
+Bug Fixes:
+ • Only use the GNOME Shell interface when actually in GNOME Shell, not something that is merely similar, like the Cinnamon shell
+ • Spread default backup time around a bit, from always starting at midnight UTC to starting between 2 and 4 AM local time
+Translations:
+ • Updated Ukrainian translation
+
 Déjà Dup 25.5 (GNOME 3.7.5)
 ---------------------------
 Features:

=== modified file 'common/CommonUtils.vala'
--- common/CommonUtils.vala	2013-03-14 20:40:57 +0000
+++ common/CommonUtils.vala	2013-03-21 15:06:23 +0000
@@ -72,20 +72,61 @@
   settings.apply();
 }
 
+public bool parse_version(string version_string, out int major, out int minor,
+                          out int micro)
+{
+  major = 0;
+  minor = 0;
+  micro = 0;
+
+  var ver_tokens = version_string.split(".");
+  if (ver_tokens == null || ver_tokens[0] == null)
+    return false;
+
+  major = int.parse(ver_tokens[0]);
+  // Don't error out if no minor or micro.
+  if (ver_tokens[1] != null) {
+    minor = int.parse(ver_tokens[1]);
+    if (ver_tokens[2] != null)
+      micro = int.parse(ver_tokens[2]);
+  }
+
+  return true;
+}
+
+public bool meets_version(int major, int minor, int micro,
+                          int req_major, int req_minor, int req_micro)
+{
+  return (major > req_major) ||
+         (major == req_major && minor > req_minor) ||
+         (major == req_major && minor == req_minor && micro >= req_micro);
+}
+
 public void run_deja_dup(string args, AppLaunchContext? ctx = null,
                          List<File>? files = null)
 {
   var cmd = "deja-dup %s".printf(args);
 
+  int major, minor, micro;
+  var utsname = Posix.utsname();
+  parse_version(utsname.release, out major, out minor, out micro);
+
   // Check for ionice to be a good disk citizen
   if (Environment.find_program_in_path("ionice") != null) {
-    // lowest priority in best-effort class
-    // (can't use idle class as normal user on <2.6.25)
-    cmd = "ionice -c2 -n7 " + cmd;
+    // In Linux 2.6.25 and up, even normal users can request idle class
+    if (utsname.sysname == "Linux" && meets_version(major, minor, micro, 2, 6, 25))
+      cmd = "ionice -c3 " + cmd; // idle class
+    else
+      cmd = "ionice -c2 -n7 " + cmd; // lowest priority in best-effort class
   }
 
-  if (Environment.find_program_in_path("nice") != null)
-    cmd = "nice " + cmd;
+  // chrt's idle class is more-idle than nice, so prefer it
+  if (utsname.sysname == "Linux" &&
+      meets_version(major, minor, micro, 2, 6, 23) &&
+      Environment.find_program_in_path("chrt") != null)
+    cmd = "chrt --idle 0 " + cmd;
+  else if (Environment.find_program_in_path("nice") != null)
+    cmd = "nice -n19 " + cmd;
 
   var flags = AppInfoCreateFlags.SUPPORTS_STARTUP_NOTIFICATION |
               AppInfoCreateFlags.SUPPORTS_URIS;

=== modified file 'po/uk.po'
--- po/uk.po	2013-02-04 19:03:33 +0000
+++ po/uk.po	2013-03-21 15:06:23 +0000
@@ -8,7 +8,7 @@
 "Project-Id-Version: deja-dup\n"
 "Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
 "POT-Creation-Date: 2013-01-23 17:07-0500\n"
-"PO-Revision-Date: 2013-01-09 09:06+0000\n"
+"PO-Revision-Date: 2013-02-08 06:19+0000\n"
 "Last-Translator: Сергій Найтінгейл <Unknown>\n"
 "Language-Team: Ukrainian <uk@xxxxxx>\n"
 "MIME-Version: 1.0\n"
@@ -16,8 +16,8 @@
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && "
 "n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
-"X-Launchpad-Export-Date: 2013-01-24 05:25+0000\n"
-"X-Generator: Launchpad (build 16445)\n"
+"X-Launchpad-Export-Date: 2013-02-09 05:21+0000\n"
+"X-Generator: Launchpad (build 16482)\n"
 
 #. Translators: "Backup" is a noun
 #: ../data/deja-dup.desktop.in.h:1 ../data/deja-dup-ccpanel.desktop.in.h:1
@@ -103,7 +103,7 @@
 
 #: ../data/org.gnome.DejaDup.gschema.xml.in.h:5
 msgid "Whether the welcome screen has been dismissed"
-msgstr ""
+msgstr "Чи було пропущено екран привітання"
 
 #: ../data/org.gnome.DejaDup.gschema.xml.in.h:6
 msgid "Whether to request the root password"
@@ -401,7 +401,7 @@
 
 #. Translators: %2$s is the name of a removable drive, %1$s is a folder
 #. on that removable drive.
-#: ../common/BackendFile.vala:135 ../common/CommonUtils.vala:421
+#: ../common/BackendFile.vala:135 ../common/CommonUtils.vala:424
 #, c-format
 msgid "%1$s on %2$s"
 msgstr "%1$s на %2$s"
@@ -422,7 +422,7 @@
 
 #: ../common/BackendFile.vala:385
 msgid "Waiting for a network connection…"
-msgstr ""
+msgstr "Очікування з’єднання з мережею..."
 
 #: ../common/BackendFile.vala:448
 #, c-format
@@ -537,24 +537,24 @@
 msgstr ""
 
 #. Translators: this is the home folder and %s is the user's username
-#: ../common/CommonUtils.vala:472
+#: ../common/CommonUtils.vala:475
 #, c-format
 msgid "Home (%s)"
 msgstr ""
 
 #. Translators: this is the home folder
-#: ../common/CommonUtils.vala:477
+#: ../common/CommonUtils.vala:480
 msgid "Home"
 msgstr ""
 
 #. Translators: this is the trash folder
-#: ../common/CommonUtils.vala:482
+#: ../common/CommonUtils.vala:485
 msgid "Trash"
 msgstr "Смітник"
 
 #: ../common/OperationBackup.vala:42 ../common/OperationVerify.vala:56
 msgid "Verifying backup…"
-msgstr ""
+msgstr "Перевірка резервних копій..."
 
 #: ../common/OperationRestore.vala:51
 msgid "Restoring files…"
@@ -590,9 +590,9 @@
 msgid "Preparing…"
 msgstr "Підготовка..."
 
-#: ../common/Operation.vala:295
+#: ../common/Operation.vala:296
 msgid "Another backup operation is already running"
-msgstr ""
+msgstr "Вже виконується інша операція резервування"
 
 #: ../deja-dup/AssistantBackup.vala:31
 msgctxt "back up is verb"
@@ -652,7 +652,7 @@
 
 #: ../deja-dup/AssistantOperation.vala:313
 msgid "_Password-protect your backup"
-msgstr ""
+msgstr "_Захистити резервну копію паролем"
 
 #: ../deja-dup/AssistantOperation.vala:327
 #, c-format
@@ -715,7 +715,7 @@
 
 #: ../deja-dup/AssistantOperation.vala:872
 msgid "Backup encryption password"
-msgstr ""
+msgstr "Пароль шифрування резервної копії"
 
 #: ../deja-dup/AssistantRestore.vala:68
 msgid "Restore"
@@ -731,7 +731,7 @@
 
 #: ../deja-dup/AssistantRestore.vala:124
 msgid "Restore From Where?"
-msgstr ""
+msgstr "Звідки відновити?"
 
 #: ../deja-dup/AssistantRestore.vala:146
 msgid "_Date"
@@ -767,7 +767,7 @@
 
 #: ../deja-dup/AssistantRestore.vala:271
 msgid "Restore From When?"
-msgstr ""
+msgstr "З якого часу відновити?"
 
 #: ../deja-dup/AssistantRestore.vala:279
 msgid "Restore to Where?"
@@ -934,7 +934,7 @@
 
 #: ../deja-dup/MountOperationAssistant.vala:36
 msgid "Connect to Server"
-msgstr ""
+msgstr "Встановити з'єднання з сервером"
 
 #: ../deja-dup/MountOperationAssistant.vala:37
 #: ../widgets/ConfigLocationDAV.vala:49 ../widgets/ConfigLocationFTP.vala:45
@@ -981,11 +981,11 @@
 
 #: ../deja-dup/Prompt.vala:48
 msgid "_Don't Show Again"
-msgstr ""
+msgstr "_Не показувати знову"
 
 #: ../deja-dup/Prompt.vala:50
 msgid "Don't Show Again"
-msgstr ""
+msgstr "Не показувати знову"
 
 #: ../deja-dup/Prompt.vala:56
 msgid "_Open Backup Settings"
@@ -1358,7 +1358,7 @@
 msgid "Remove"
 msgstr ""
 
-#: ../widgets/ConfigList.vala:275
+#: ../widgets/ConfigList.vala:272
 msgid "Choose folders"
 msgstr "Оберіть каталоги"
 
@@ -1380,14 +1380,14 @@
 
 #: ../widgets/ConfigLocation.vala:127
 msgid "Custom Location"
-msgstr "Влсане розташування"
+msgstr "Власне розташування"
 
 #. And a local folder option
 #: ../widgets/ConfigLocation.vala:133
 msgid "Local Folder"
 msgstr "Локальна тека"
 
-#: ../widgets/ConfigLocationCustom.vala:33
+#: ../widgets/ConfigLocationCustom.vala:34
 msgid "_URI"
 msgstr "_URI"
 

=== modified file 'tests/unit/unit-tests.vala'
--- tests/unit/unit-tests.vala	2012-12-04 16:08:06 +0000
+++ tests/unit/unit-tests.vala	2013-03-21 15:06:23 +0000
@@ -46,6 +46,38 @@
   assert(DejaDup.parse_dir("file:VIDEOS").equal(File.parse_name("file:VIDEOS")));
 }
 
+void parse_one_version(string str, int maj, int min, int mic)
+{
+  int pmaj, pmin, pmic;
+  assert(DejaDup.parse_version(str, out pmaj, out pmin, out pmic));
+  assert(pmaj == maj);
+  assert(pmin == min);
+  assert(pmic == mic);
+}
+
+void parse_bad_version(string str)
+{
+  int pmaj, pmin, pmic;
+  assert(!DejaDup.parse_version(str, out pmaj, out pmin, out pmic));
+  assert(pmaj == 0);
+  assert(pmin == 0);
+  assert(pmic == 0);
+}
+
+void parse_version()
+{
+  parse_bad_version("");
+  parse_one_version("a", 0, 0, 0);
+  parse_one_version("1", 1, 0, 0);
+  parse_one_version("1.2", 1, 2, 0);
+  parse_one_version("1.2.3", 1, 2, 3);
+  parse_one_version("1.2.3.4", 1, 2, 3);
+  parse_one_version("1.2.3a4", 1, 2, 3);
+  parse_one_version("1.2a3.4", 1, 2, 4);
+  parse_one_version("1.2 3.4", 1, 2, 4);
+  parse_one_version("1.2-3.4", 1, 2, 4);
+}
+
 void setup()
 {
 }
@@ -64,6 +96,7 @@
 
   var unit = new TestSuite("unit");
   unit.add(new TestCase("parse-dir", setup, parse_dir, teardown));
+  unit.add(new TestCase("parse-version", setup, parse_version, teardown));
   TestSuite.get_root().add_suite(unit);
 
   return Test.run();

=== modified file 'tools/duplicity/DuplicityPlugin.vala'
--- tools/duplicity/DuplicityPlugin.vala	2013-01-23 22:04:16 +0000
+++ tools/duplicity/DuplicityPlugin.vala	2013-03-21 15:06:23 +0000
@@ -42,25 +42,11 @@
 
     // First token is 'duplicity' and is ignorable.  Second looks like '0.5.03'
     var version_string = tokens[1].strip();
-    var ver_tokens = version_string.split(".");
-    if (ver_tokens == null || ver_tokens[0] == null)
+    int major, minor, micro;
+    if (!DejaDup.parse_version(version_string, out major, out minor, out micro))
       throw new SpawnError.FAILED(_("Could not understand duplicity version ‘%s’.").printf(version_string));
 
-    int major = 0;
-    int minor = 0;
-    int micro = 0;
-    major = int.parse(ver_tokens[0]);
-    // Don't error out if no minor or micro.  Duplicity might not have them?
-    if (ver_tokens[1] != null) {
-      minor = int.parse(ver_tokens[1]);
-      if (ver_tokens[2] != null)
-        micro = int.parse(ver_tokens[2]);
-    }
-
-    var meets = (major > REQUIRED_MAJOR) ||
-                (major == REQUIRED_MAJOR && minor > REQUIRED_MINOR) ||
-                (major == REQUIRED_MAJOR && minor == REQUIRED_MINOR && micro >= REQUIRED_MICRO);
-    if (!meets)
+    if (!DejaDup.meets_version(major, minor, micro, REQUIRED_MAJOR, REQUIRED_MINOR, REQUIRED_MICRO))
       throw new SpawnError.FAILED(_("Déjà Dup Backup Tool requires at least version %d.%d.%.2d of duplicity, but only found version %d.%d.%.2d").printf(REQUIRED_MAJOR, REQUIRED_MINOR, REQUIRED_MICRO, major, minor, micro));
   }