Merge lp:~mterry/deja-dup/tempdir-archive-dir into lp:deja-dup/26

Proposed by Michael Terry
Status: Superseded
Proposed branch: lp:~mterry/deja-dup/tempdir-archive-dir
Merge into: lp:deja-dup/26
Diff against target: 257 lines (+100/-48)
7 files modified
common/CommonUtils.vala (+46/-5)
tests/mock/duplicity (+2/-1)
tests/runner.vala (+1/-2)
tests/unit/unit-tests.vala (+33/-0)
tools/duplicity/DuplicityInstance.vala (+4/-6)
tools/duplicity/DuplicityJob.vala (+11/-17)
tools/duplicity/DuplicityPlugin.vala (+3/-17)
To merge this branch: bzr merge lp:~mterry/deja-dup/tempdir-archive-dir
Reviewer Review Type Date Requested Status
Robert Bruce Park Pending
Review via email: mp+155322@code.launchpad.net

This proposal has been superseded by a proposal from 2013-03-25.

Description of the change

A little while back, for 25.5, I added code to tell duplicity to use a tempdir that is on the same partition as the source files, so that a user with /tmp as a tmpfs partition wouldn't fill it up.

However, there is one code path where we end up using /tmp anyway, that I didn't notice. If we are testing a restore in "nag mode", which is where we don't use any cached information (we re-download all the metadata and ask for the password again, hence the "nag"), we were making a call to g_dir_make_tmp. This uses /tmp, and we were filling /tmp up with our downloaded metadata.

So the solution is to use g_mkdtemp, which lets us specify a tempdir, and we'll re-use the one we create for passing to duplicity.

There's a bit of cleanup in the tests/ directory to match this new usage and to better test it.

To post a comment you must log in.
1446. By Michael Terry

use duplicity-XXXXXX instead of deja-dup-XXXXXX so that we will clean the folder automatically

Unmerged revisions

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'common/CommonUtils.vala'
2--- common/CommonUtils.vala 2013-03-14 20:40:57 +0000
3+++ common/CommonUtils.vala 2013-03-25 19:20:33 +0000
4@@ -72,20 +72,61 @@
5 settings.apply();
6 }
7
8+public bool parse_version(string version_string, out int major, out int minor,
9+ out int micro)
10+{
11+ major = 0;
12+ minor = 0;
13+ micro = 0;
14+
15+ var ver_tokens = version_string.split(".");
16+ if (ver_tokens == null || ver_tokens[0] == null)
17+ return false;
18+
19+ major = int.parse(ver_tokens[0]);
20+ // Don't error out if no minor or micro.
21+ if (ver_tokens[1] != null) {
22+ minor = int.parse(ver_tokens[1]);
23+ if (ver_tokens[2] != null)
24+ micro = int.parse(ver_tokens[2]);
25+ }
26+
27+ return true;
28+}
29+
30+public bool meets_version(int major, int minor, int micro,
31+ int req_major, int req_minor, int req_micro)
32+{
33+ return (major > req_major) ||
34+ (major == req_major && minor > req_minor) ||
35+ (major == req_major && minor == req_minor && micro >= req_micro);
36+}
37+
38 public void run_deja_dup(string args, AppLaunchContext? ctx = null,
39 List<File>? files = null)
40 {
41 var cmd = "deja-dup %s".printf(args);
42
43+ int major, minor, micro;
44+ var utsname = Posix.utsname();
45+ parse_version(utsname.release, out major, out minor, out micro);
46+
47 // Check for ionice to be a good disk citizen
48 if (Environment.find_program_in_path("ionice") != null) {
49- // lowest priority in best-effort class
50- // (can't use idle class as normal user on <2.6.25)
51- cmd = "ionice -c2 -n7 " + cmd;
52+ // In Linux 2.6.25 and up, even normal users can request idle class
53+ if (utsname.sysname == "Linux" && meets_version(major, minor, micro, 2, 6, 25))
54+ cmd = "ionice -c3 " + cmd; // idle class
55+ else
56+ cmd = "ionice -c2 -n7 " + cmd; // lowest priority in best-effort class
57 }
58
59- if (Environment.find_program_in_path("nice") != null)
60- cmd = "nice " + cmd;
61+ // chrt's idle class is more-idle than nice, so prefer it
62+ if (utsname.sysname == "Linux" &&
63+ meets_version(major, minor, micro, 2, 6, 23) &&
64+ Environment.find_program_in_path("chrt") != null)
65+ cmd = "chrt --idle 0 " + cmd;
66+ else if (Environment.find_program_in_path("nice") != null)
67+ cmd = "nice -n19 " + cmd;
68
69 var flags = AppInfoCreateFlags.SUPPORTS_STARTUP_NOTIFICATION |
70 AppInfoCreateFlags.SUPPORTS_URIS;
71
72=== modified file 'tests/mock/duplicity'
73--- tests/mock/duplicity 2012-10-30 00:19:38 +0000
74+++ tests/mock/duplicity 2013-03-25 19:20:33 +0000
75@@ -108,7 +108,8 @@
76 if split[1].find("/cache/") != -1:
77 print("TESTFAIL: expected random /tmp archive dir", file=logfd)
78 sys.exit(-1)
79- sys.argv[i] = "--archive-dir=?"
80+ # Chop off random string at end, for reproducable tests
81+ sys.argv[i] = sys.argv[i][:-6] + "?"
82
83 if expected_args != sys.argv[1:]:
84 print("TESTFAIL: expected\n%s\nvs\n%s" % (expected_args, sys.argv[1:]), file=logfd)
85
86=== modified file 'tests/runner.vala'
87--- tests/runner.vala 2013-02-04 20:39:45 +0000
88+++ tests/runner.vala 2013-03-25 19:20:33 +0000
89@@ -140,13 +140,12 @@
90 var backupdir = Path.build_filename(test_home, "backup");
91 var restoredir = Path.build_filename(test_home, "restore");
92
93- var archive = tmp_archive ? "?" : "%s/deja-dup".printf(cachedir);
94-
95 string enc_str = "";
96 if (!encrypted)
97 enc_str = "--no-encryption ";
98
99 var tempdir = Path.build_filename(test_home, "tmp");
100+ var archive = tmp_archive ? "%s/deja-dup-?".printf(tempdir) : "%s/deja-dup".printf(cachedir);
101
102 var end_str = "%s'--verbosity=9' '--gpg-options=--no-use-agent' '--archive-dir=%s' '--tempdir=%s' '%s'".printf(enc_str, archive, tempdir, make_fd_arg(as_root));
103
104
105=== modified file 'tests/unit/unit-tests.vala'
106--- tests/unit/unit-tests.vala 2012-12-04 16:08:06 +0000
107+++ tests/unit/unit-tests.vala 2013-03-25 19:20:33 +0000
108@@ -46,6 +46,38 @@
109 assert(DejaDup.parse_dir("file:VIDEOS").equal(File.parse_name("file:VIDEOS")));
110 }
111
112+void parse_one_version(string str, int maj, int min, int mic)
113+{
114+ int pmaj, pmin, pmic;
115+ assert(DejaDup.parse_version(str, out pmaj, out pmin, out pmic));
116+ assert(pmaj == maj);
117+ assert(pmin == min);
118+ assert(pmic == mic);
119+}
120+
121+void parse_bad_version(string str)
122+{
123+ int pmaj, pmin, pmic;
124+ assert(!DejaDup.parse_version(str, out pmaj, out pmin, out pmic));
125+ assert(pmaj == 0);
126+ assert(pmin == 0);
127+ assert(pmic == 0);
128+}
129+
130+void parse_version()
131+{
132+ parse_bad_version("");
133+ parse_one_version("a", 0, 0, 0);
134+ parse_one_version("1", 1, 0, 0);
135+ parse_one_version("1.2", 1, 2, 0);
136+ parse_one_version("1.2.3", 1, 2, 3);
137+ parse_one_version("1.2.3.4", 1, 2, 3);
138+ parse_one_version("1.2.3a4", 1, 2, 3);
139+ parse_one_version("1.2a3.4", 1, 2, 4);
140+ parse_one_version("1.2 3.4", 1, 2, 4);
141+ parse_one_version("1.2-3.4", 1, 2, 4);
142+}
143+
144 void setup()
145 {
146 }
147@@ -64,6 +96,7 @@
148
149 var unit = new TestSuite("unit");
150 unit.add(new TestCase("parse-dir", setup, parse_dir, teardown));
151+ unit.add(new TestCase("parse-version", setup, parse_version, teardown));
152 TestSuite.get_root().add_suite(unit);
153
154 return Test.run();
155
156=== modified file 'tools/duplicity/DuplicityInstance.vala'
157--- tools/duplicity/DuplicityInstance.vala 2013-01-24 14:31:08 +0000
158+++ tools/duplicity/DuplicityInstance.vala 2013-03-25 19:20:33 +0000
159@@ -93,12 +93,10 @@
160 // Cache signature files
161 var cache_dir = forced_cache_dir;
162 if (cache_dir == null)
163- cache_dir = Environment.get_user_cache_dir();
164- if (cache_dir != null) {
165- cache_dir = Path.build_filename(cache_dir, Config.PACKAGE);
166- if (DejaDup.ensure_directory_exists(cache_dir))
167- argv.append("--archive-dir=" + cache_dir);
168- }
169+ cache_dir = Path.build_filename(Environment.get_user_cache_dir(),
170+ Config.PACKAGE);
171+ if (cache_dir != null && DejaDup.ensure_directory_exists(cache_dir))
172+ argv.append("--archive-dir=" + cache_dir);
173
174 // Specify tempdir
175 var tempdir = yield DejaDup.get_tempdir();
176
177=== modified file 'tools/duplicity/DuplicityJob.vala'
178--- tools/duplicity/DuplicityJob.vala 2013-01-20 19:54:44 +0000
179+++ tools/duplicity/DuplicityJob.vala 2013-03-25 19:20:33 +0000
180@@ -110,9 +110,6 @@
181
182 ~DuplicityJob() {
183 DejaDup.Network.get().notify["connected"].disconnect(network_changed);
184-
185- if (forced_cache_dir != null)
186- new DejaDup.RecursiveDelete(File.new_for_path(forced_cache_dir)).start_async.begin();
187 }
188
189 public override void start()
190@@ -130,24 +127,21 @@
191 if (mode == DejaDup.ToolJob.Mode.BACKUP)
192 process_include_excludes();
193
194+ var settings = DejaDup.get_settings();
195+ delete_age = settings.get_int(DejaDup.DELETE_AFTER_KEY);
196+
197+ async_setup.begin();
198+ }
199+
200+ async void async_setup()
201+ {
202 /* Fake cache dir if we need to */
203 if ((flags & DejaDup.ToolJob.Flags.NO_CACHE) != 0) {
204- try {
205- forced_cache_dir = DirUtils.make_tmp("deja-dup-XXXXXX");
206- }
207- catch (Error e) {
208- warning("%s\n", e.message);
209- }
210+ var template = Path.build_filename(yield DejaDup.get_tempdir(), "deja-dup-XXXXXX");
211+ forced_cache_dir = DirUtils.mkdtemp(template);
212 }
213
214- var settings = DejaDup.get_settings();
215- delete_age = settings.get_int(DejaDup.DELETE_AFTER_KEY);
216-
217- get_envp.begin();
218- }
219-
220- async void get_envp()
221- {
222+ /* Get custom environment from backend, if needed */
223 try {
224 backend.envp_ready.connect(continue_with_envp);
225 yield backend.get_envp();
226
227=== modified file 'tools/duplicity/DuplicityPlugin.vala'
228--- tools/duplicity/DuplicityPlugin.vala 2013-01-23 22:04:16 +0000
229+++ tools/duplicity/DuplicityPlugin.vala 2013-03-25 19:20:33 +0000
230@@ -42,25 +42,11 @@
231
232 // First token is 'duplicity' and is ignorable. Second looks like '0.5.03'
233 var version_string = tokens[1].strip();
234- var ver_tokens = version_string.split(".");
235- if (ver_tokens == null || ver_tokens[0] == null)
236+ int major, minor, micro;
237+ if (!DejaDup.parse_version(version_string, out major, out minor, out micro))
238 throw new SpawnError.FAILED(_("Could not understand duplicity version ‘%s’.").printf(version_string));
239
240- int major = 0;
241- int minor = 0;
242- int micro = 0;
243- major = int.parse(ver_tokens[0]);
244- // Don't error out if no minor or micro. Duplicity might not have them?
245- if (ver_tokens[1] != null) {
246- minor = int.parse(ver_tokens[1]);
247- if (ver_tokens[2] != null)
248- micro = int.parse(ver_tokens[2]);
249- }
250-
251- var meets = (major > REQUIRED_MAJOR) ||
252- (major == REQUIRED_MAJOR && minor > REQUIRED_MINOR) ||
253- (major == REQUIRED_MAJOR && minor == REQUIRED_MINOR && micro >= REQUIRED_MICRO);
254- if (!meets)
255+ if (!DejaDup.meets_version(major, minor, micro, REQUIRED_MAJOR, REQUIRED_MINOR, REQUIRED_MICRO))
256 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));
257 }
258

Subscribers

People subscribed via source and target branches