Skip to content

Commit 2b1c257

Browse files
committed
system: force cleaning all temporary directory created
1 parent 1d724ef commit 2b1c257

File tree

4 files changed

+71
-3
lines changed

4 files changed

+71
-3
lines changed

src/core/opamFilename.mli

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,8 @@ val with_tmp_dir: (Dir.t -> 'a) -> 'a
105105
(** Provide an automatically cleaned up temp directory to a job *)
106106
val with_tmp_dir_job: (Dir.t -> 'a OpamProcess.job) -> 'a OpamProcess.job
107107

108-
(** Raw function to create a temporary directory. No automatic cleanup *)
108+
(** Raw function to create a temporary directory.
109+
If it exists, cleaned automatically at exit. *)
109110
val mk_tmp_dir: unit -> Dir.t
110111

111112
(** Create a new Dir.t and resolve symlinks *)

src/core/opamSystem.ml

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -89,12 +89,32 @@ let temp_name ?dir ?(prefix="opam") () =
8989
in
9090
tmpdir / (temp_basename prefix)
9191

92+
let tmp_files_cleaner =
93+
let to_clean = ref OpamStd.String.Set.empty in
94+
OpamStd.Sys.at_exit
95+
(fun () ->
96+
OpamStd.String.Set.iter (fun f ->
97+
try
98+
if Sys.file_exists f then
99+
if Sys.is_directory f then
100+
Unix.rmdir f
101+
else
102+
Unix.unlink f;
103+
(* Only log the item if unlink succeeded *)
104+
log ~level:4 "tmp_files_cleaner: rm: %s" f
105+
with Unix.Unix_error _ -> ())
106+
!to_clean);
107+
fun tmp_file ->
108+
to_clean := OpamStd.String.Set.add tmp_file !to_clean
109+
92110
let rec mk_temp_dir ?prefix () =
93111
let s = temp_name ?prefix () in
94112
if Sys.file_exists s then
95113
mk_temp_dir ?prefix ()
96114
else
97-
real_path s
115+
let dir = real_path s in
116+
tmp_files_cleaner dir;
117+
dir
98118

99119
let rec mk_unique_dir ~dir ?(prefix="opam") () =
100120
let s = dir / Printf.sprintf "%s-%06x" prefix (Random.int 0xFFFFFF) in

src/core/opamSystem.mli

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ val verbose_for_base_commands: unit -> bool
5757
(** {2 Filesystem management} *)
5858

5959
(** Returns a directory name, in the temporary directory, composed by {i opam}
60-
(if [prefix] is not set), pid, and random number. *)
60+
(if [prefix] is not set), pid, and random number. Cleaned at exit. *)
6161
val mk_temp_dir: ?prefix:string -> unit -> string
6262

6363
(** Returns a directory name, in the [~dir], composed by {i opam}

tests/reftests/action-disk.test

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -205,6 +205,9 @@ SYSTEM LOCK ${BASEDIR}/OPAM/install-from-repo/.opam-swi
205205
SYSTEM rm ${BASEDIR}/OPAM/install-from-repo/.opam-switch/backup/state-today.export
206206
SYSTEM LOCK ${BASEDIR}/OPAM/repo/lock (none => none)
207207
SYSTEM LOCK ${BASEDIR}/OPAM/config.lock (none => none)
208+
SYSTEM tmp_files_cleaner: rm: ${OPAMTMP}
209+
SYSTEM tmp_files_cleaner: rm: ${OPAMTMP}
210+
SYSTEM tmp_files_cleaner: rm: ${OPAMTMP}
208211
### opam reinstall main-repo.1 | sed-cmd tar cp touch mkdir | "${PRE_MD5}..?${MD5}" -> pre/hash | unordered
209212
FILE(config) Read ${BASEDIR}/OPAM/config in 0.000s
210213
SYSTEM LOCK ${BASEDIR}/OPAM/lock (none => read)
@@ -290,6 +293,7 @@ SYSTEM LOCK ${BASEDIR}/OPAM/install-from-repo/.opam-swi
290293
SYSTEM rm ${BASEDIR}/OPAM/install-from-repo/.opam-switch/backup/state-today.export
291294
SYSTEM LOCK ${BASEDIR}/OPAM/repo/lock (none => none)
292295
SYSTEM LOCK ${BASEDIR}/OPAM/config.lock (none => none)
296+
SYSTEM tmp_files_cleaner: rm: ${OPAMTMP}
293297
### opam upgrade main-repo | sed-cmd tar touch mkdir cp | "${PRE_MD5}..?${MD5}" -> pre/hash | unordered
294298
FILE(config) Read ${BASEDIR}/OPAM/config in 0.000s
295299
SYSTEM LOCK ${BASEDIR}/OPAM/lock (none => read)
@@ -341,6 +345,8 @@ Processing 2/4: [main-repo: touch build-file]
341345
-> compiled main-repo.2
342346
SYSTEM rmdir ${BASEDIR}/OPAM/install-from-repo/.opam-switch/remove/main-repo.1
343347
SYSTEM copydir ${BASEDIR}/OPAM/install-from-repo/.opam-switch/sources/main-repo.1 -> ${BASEDIR}/OPAM/install-from-repo/.opam-switch/remove/main-repo.1
348+
SYSTEM tmp_files_cleaner: rm: ${OPAMTMP}
349+
SYSTEM tmp_files_cleaner: rm: ${OPAMTMP}
344350
SYSTEM mkdir ${BASEDIR}/OPAM/install-from-repo/.opam-switch/remove/main-repo.1
345351
SYSTEM copy ${BASEDIR}/OPAM/install-from-repo/.opam-switch/sources/main-repo.1/content -> ${BASEDIR}/OPAM/install-from-repo/.opam-switch/remove/main-repo.1/content
346352
Processing 3/4: [main-repo: touch removal-file]
@@ -457,6 +463,7 @@ SYSTEM LOCK ${BASEDIR}/OPAM/install-from-repo/.opam-swi
457463
SYSTEM rm ${BASEDIR}/OPAM/install-from-repo/.opam-switch/backup/state-today.export
458464
SYSTEM LOCK ${BASEDIR}/OPAM/repo/lock (none => none)
459465
SYSTEM LOCK ${BASEDIR}/OPAM/config.lock (none => none)
466+
SYSTEM tmp_files_cleaner: rm: ${OPAMTMP}
460467
### :II: Pin
461468
### :II:1: path pin
462469
### <pin:main-ppin/main-ppin.opam>
@@ -554,7 +561,12 @@ SYSTEM LOCK ${BASEDIR}/OPAM/install-from-path-pin-all/.
554561
SYSTEM rm ${BASEDIR}/OPAM/install-from-path-pin-all/.opam-switch/backup/state-today.export
555562
SYSTEM LOCK ${BASEDIR}/OPAM/repo/lock (none => none)
556563
SYSTEM LOCK ${BASEDIR}/OPAM/config.lock (none => none)
564+
SYSTEM tmp_files_cleaner: rm: ${OPAMTMP}
565+
SYSTEM tmp_files_cleaner: rm: ${OPAMTMP}
557566
### opam install main-ppin | grep -v '^- ./$' | sed-cmd rsync cp touch mkdir | unordered
567+
SYSTEM tmp_files_cleaner: rm: ${OPAMTMP}
568+
SYSTEM tmp_files_cleaner: rm: ${OPAMTMP}
569+
SYSTEM tmp_files_cleaner: rm: ${OPAMTMP}
558570
FILE(config) Read ${BASEDIR}/OPAM/config in 0.000s
559571
SYSTEM LOCK ${BASEDIR}/OPAM/lock (none => read)
560572
FILE(config) Read ${BASEDIR}/OPAM/config in 0.000s
@@ -633,6 +645,9 @@ SYSTEM rm ${BASEDIR}/OPAM/install-from-path-pin-all/.op
633645
SYSTEM LOCK ${BASEDIR}/OPAM/repo/lock (none => none)
634646
SYSTEM LOCK ${BASEDIR}/OPAM/config.lock (none => none)
635647
### opam reinstall main-ppin | grep -v '^- ./$' | sed-cmd rsync cp touch mkdir | unordered
648+
SYSTEM tmp_files_cleaner: rm: ${OPAMTMP}
649+
SYSTEM tmp_files_cleaner: rm: ${OPAMTMP}
650+
SYSTEM tmp_files_cleaner: rm: ${OPAMTMP}
636651
FILE(config) Read ${BASEDIR}/OPAM/config in 0.000s
637652
SYSTEM LOCK ${BASEDIR}/OPAM/lock (none => read)
638653
FILE(config) Read ${BASEDIR}/OPAM/config in 0.000s
@@ -731,6 +746,8 @@ SYSTEM rm ${BASEDIR}/OPAM/install-from-path-pin-all/.op
731746
SYSTEM LOCK ${BASEDIR}/OPAM/repo/lock (none => none)
732747
SYSTEM LOCK ${BASEDIR}/OPAM/config.lock (none => none)
733748
### opam remove main-ppin | grep -v '^- ./$' | sed-cmd rsync touch | unordered
749+
SYSTEM tmp_files_cleaner: rm: ${OPAMTMP}
750+
SYSTEM tmp_files_cleaner: rm: ${OPAMTMP}
734751
FILE(config) Read ${BASEDIR}/OPAM/config in 0.000s
735752
SYSTEM LOCK ${BASEDIR}/OPAM/lock (none => read)
736753
FILE(config) Read ${BASEDIR}/OPAM/config in 0.000s
@@ -914,7 +931,12 @@ SYSTEM LOCK ${BASEDIR}/OPAM/install-from-path-pin-all/.
914931
SYSTEM rm ${BASEDIR}/OPAM/install-from-path-pin-all/.opam-switch/backup/state-today.export
915932
SYSTEM LOCK ${BASEDIR}/OPAM/repo/lock (none => none)
916933
SYSTEM LOCK ${BASEDIR}/OPAM/config.lock (none => none)
934+
SYSTEM tmp_files_cleaner: rm: ${OPAMTMP}
935+
SYSTEM tmp_files_cleaner: rm: ${OPAMTMP}
917936
### opam reinstall ./main-ppin | grep -v '^- ./$' | sed-cmd rsync cp touch mkdir | unordered
937+
SYSTEM tmp_files_cleaner: rm: ${OPAMTMP}
938+
SYSTEM tmp_files_cleaner: rm: ${OPAMTMP}
939+
SYSTEM tmp_files_cleaner: rm: ${OPAMTMP}
918940
FILE(config) Read ${BASEDIR}/OPAM/config in 0.000s
919941
SYSTEM LOCK ${BASEDIR}/OPAM/lock (none => read)
920942
FILE(config) Read ${BASEDIR}/OPAM/config in 0.000s
@@ -1012,6 +1034,8 @@ SYSTEM rm ${BASEDIR}/OPAM/install-from-path-pin-all/.op
10121034
SYSTEM LOCK ${BASEDIR}/OPAM/repo/lock (none => none)
10131035
SYSTEM LOCK ${BASEDIR}/OPAM/config.lock (none => none)
10141036
### opam unpin main-ppin -y | grep -v '^- ./$' | sed-cmd rsync touch | unordered
1037+
SYSTEM tmp_files_cleaner: rm: ${OPAMTMP}
1038+
SYSTEM tmp_files_cleaner: rm: ${OPAMTMP}
10151039
FILE(config) Read ${BASEDIR}/OPAM/config in 0.000s
10161040
SYSTEM LOCK ${BASEDIR}/OPAM/lock (none => read)
10171041
FILE(config) Read ${BASEDIR}/OPAM/config in 0.000s
@@ -1199,7 +1223,12 @@ SYSTEM LOCK ${BASEDIR}/OPAM/install-from-git-pin-all/.o
11991223
SYSTEM rm ${BASEDIR}/OPAM/install-from-git-pin-all/.opam-switch/backup/state-today.export
12001224
SYSTEM LOCK ${BASEDIR}/OPAM/repo/lock (none => none)
12011225
SYSTEM LOCK ${BASEDIR}/OPAM/config.lock (none => none)
1226+
SYSTEM tmp_files_cleaner: rm: ${OPAMTMP}
1227+
SYSTEM tmp_files_cleaner: rm: ${OPAMTMP}
12021228
### opam install main-gpin | sed-cmd git cp touch mkdir | grep -v "(mkdir|copy|copydir|rm) .*\\.git." | unordered
1229+
SYSTEM tmp_files_cleaner: rm: ${OPAMTMP}
1230+
SYSTEM tmp_files_cleaner: rm: ${OPAMTMP}
1231+
SYSTEM tmp_files_cleaner: rm: ${OPAMTMP}
12031232
FILE(config) Read ${BASEDIR}/OPAM/config in 0.000s
12041233
SYSTEM LOCK ${BASEDIR}/OPAM/lock (none => read)
12051234
FILE(config) Read ${BASEDIR}/OPAM/config in 0.000s
@@ -1282,6 +1311,9 @@ SYSTEM rm ${BASEDIR}/OPAM/install-from-git-pin-all/.opa
12821311
SYSTEM LOCK ${BASEDIR}/OPAM/repo/lock (none => none)
12831312
SYSTEM LOCK ${BASEDIR}/OPAM/config.lock (none => none)
12841313
### opam reinstall main-gpin | sed-cmd git cp touch mkdir | grep -v "(mkdir|copy|copydir|rm) .*\\.git." | unordered
1314+
SYSTEM tmp_files_cleaner: rm: ${OPAMTMP}
1315+
SYSTEM tmp_files_cleaner: rm: ${OPAMTMP}
1316+
SYSTEM tmp_files_cleaner: rm: ${OPAMTMP}
12851317
FILE(config) Read ${BASEDIR}/OPAM/config in 0.000s
12861318
SYSTEM LOCK ${BASEDIR}/OPAM/lock (none => read)
12871319
FILE(config) Read ${BASEDIR}/OPAM/config in 0.000s
@@ -1391,6 +1423,8 @@ SYSTEM rm ${BASEDIR}/OPAM/install-from-git-pin-all/.opa
13911423
SYSTEM LOCK ${BASEDIR}/OPAM/repo/lock (none => none)
13921424
SYSTEM LOCK ${BASEDIR}/OPAM/config.lock (none => none)
13931425
### opam remove main-gpin | sed-cmd git touch | grep -v "(mkdir|copy|copydir|rm) .*\\.git." | unordered
1426+
SYSTEM tmp_files_cleaner: rm: ${OPAMTMP}
1427+
SYSTEM tmp_files_cleaner: rm: ${OPAMTMP}
13941428
FILE(config) Read ${BASEDIR}/OPAM/config in 0.000s
13951429
SYSTEM LOCK ${BASEDIR}/OPAM/lock (none => read)
13961430
FILE(config) Read ${BASEDIR}/OPAM/config in 0.000s
@@ -1587,7 +1621,12 @@ SYSTEM LOCK ${BASEDIR}/OPAM/install-from-git-pin-all/.o
15871621
SYSTEM rm ${BASEDIR}/OPAM/install-from-git-pin-all/.opam-switch/backup/state-today.export
15881622
SYSTEM LOCK ${BASEDIR}/OPAM/repo/lock (none => none)
15891623
SYSTEM LOCK ${BASEDIR}/OPAM/config.lock (none => none)
1624+
SYSTEM tmp_files_cleaner: rm: ${OPAMTMP}
1625+
SYSTEM tmp_files_cleaner: rm: ${OPAMTMP}
15901626
### opam reinstall ./main-gpin | sed-cmd git cp touch mkdir | grep -v "(mkdir|copy|copydir|rm) .*\\.git." | unordered
1627+
SYSTEM tmp_files_cleaner: rm: ${OPAMTMP}
1628+
SYSTEM tmp_files_cleaner: rm: ${OPAMTMP}
1629+
SYSTEM tmp_files_cleaner: rm: ${OPAMTMP}
15911630
FILE(config) Read ${BASEDIR}/OPAM/config in 0.000s
15921631
SYSTEM LOCK ${BASEDIR}/OPAM/lock (none => read)
15931632
FILE(config) Read ${BASEDIR}/OPAM/config in 0.000s
@@ -1696,6 +1735,8 @@ SYSTEM rm ${BASEDIR}/OPAM/install-from-git-pin-all/.opa
16961735
SYSTEM LOCK ${BASEDIR}/OPAM/repo/lock (none => none)
16971736
SYSTEM LOCK ${BASEDIR}/OPAM/config.lock (none => none)
16981737
### opam unpin main-gpin -y | sed-cmd git touch | grep -v "(mkdir|copy|copydir|rm) .*\\.git." | grep -v "HEAD is now" | unordered
1738+
SYSTEM tmp_files_cleaner: rm: ${OPAMTMP}
1739+
SYSTEM tmp_files_cleaner: rm: ${OPAMTMP}
16991740
FILE(config) Read ${BASEDIR}/OPAM/config in 0.000s
17001741
SYSTEM LOCK ${BASEDIR}/OPAM/lock (none => read)
17011742
FILE(config) Read ${BASEDIR}/OPAM/config in 0.000s
@@ -1917,7 +1958,9 @@ SYSTEM LOCK ${BASEDIR}/OPAM/install-from-version-pin/.o
19171958
SYSTEM rm ${BASEDIR}/OPAM/install-from-version-pin/.opam-switch/backup/state-today.export
19181959
SYSTEM LOCK ${BASEDIR}/OPAM/repo/lock (none => none)
19191960
SYSTEM LOCK ${BASEDIR}/OPAM/config.lock (none => none)
1961+
SYSTEM tmp_files_cleaner: rm: ${OPAMTMP}
19201962
### opam reinstall main-repo | grep -v '^- ./$' | sed-cmd tar rsync cp touch mkdir | "${PRE_MD5}..?${MD5}" -> pre/hash | unordered
1963+
SYSTEM tmp_files_cleaner: rm: ${OPAMTMP}
19211964
FILE(config) Read ${BASEDIR}/OPAM/config in 0.000s
19221965
SYSTEM LOCK ${BASEDIR}/OPAM/lock (none => read)
19231966
FILE(config) Read ${BASEDIR}/OPAM/config in 0.000s
@@ -2003,6 +2046,7 @@ SYSTEM rm ${BASEDIR}/OPAM/install-from-version-pin/.opa
20032046
SYSTEM LOCK ${BASEDIR}/OPAM/repo/lock (none => none)
20042047
SYSTEM LOCK ${BASEDIR}/OPAM/config.lock (none => none)
20052048
### opam remove main-repo | grep -v '^- ./$' | sed-cmd tar rsync touch | "${PRE_MD5}..?${MD5}" -> pre/hash | unordered
2049+
SYSTEM tmp_files_cleaner: rm: ${OPAMTMP}
20062050
FILE(config) Read ${BASEDIR}/OPAM/config in 0.000s
20072051
SYSTEM LOCK ${BASEDIR}/OPAM/lock (none => read)
20082052
FILE(config) Read ${BASEDIR}/OPAM/config in 0.000s
@@ -2193,6 +2237,7 @@ SYSTEM LOCK ${BASEDIR}/OPAM/config.lock (write => none)
21932237
SYSTEM LOCK ${BASEDIR}/OPAM/package-switch/.opam-switch/lock (write => none)
21942238
SYSTEM LOCK ${BASEDIR}/OPAM/repo/lock (none => none)
21952239
SYSTEM LOCK ${BASEDIR}/OPAM/config.lock (none => none)
2240+
SYSTEM tmp_files_cleaner: rm: ${OPAMTMP}
21962241
### :III:3: from local, empty
21972242
### opam switch create ./void | unordered
21982243
FILE(config) Read ${BASEDIR}/OPAM/config in 0.000s
@@ -2350,6 +2395,8 @@ SYSTEM LOCK ${BASEDIR}/OPAM/config.lock (write => none)
23502395
SYSTEM LOCK ${BASEDIR}/main-ppin/_opam/.opam-switch/lock (write => none)
23512396
SYSTEM LOCK ${BASEDIR}/OPAM/repo/lock (none => none)
23522397
SYSTEM LOCK ${BASEDIR}/OPAM/config.lock (none => none)
2398+
SYSTEM tmp_files_cleaner: rm: ${OPAMTMP}
2399+
SYSTEM tmp_files_cleaner: rm: ${OPAMTMP}
23532400
### :IV: Switch deletion
23542401
### :IV:1: local
23552402
### opam switch remove ./main-ppin | unordered

0 commit comments

Comments
 (0)