diff --git a/src/core/opamFilename.mli b/src/core/opamFilename.mli index 2bb25c45a53..4cecf13e236 100644 --- a/src/core/opamFilename.mli +++ b/src/core/opamFilename.mli @@ -105,7 +105,8 @@ val with_tmp_dir: (Dir.t -> 'a) -> 'a (** Provide an automatically cleaned up temp directory to a job *) val with_tmp_dir_job: (Dir.t -> 'a OpamProcess.job) -> 'a OpamProcess.job -(** Raw function to create a temporary directory. No automatic cleanup *) +(** Raw function to create a temporary directory. + If it exists, cleaned automatically at exit. *) val mk_tmp_dir: unit -> Dir.t (** Create a new Dir.t and resolve symlinks *) diff --git a/src/core/opamSystem.ml b/src/core/opamSystem.ml index b6128cd91a5..d90abb8d763 100644 --- a/src/core/opamSystem.ml +++ b/src/core/opamSystem.ml @@ -89,12 +89,29 @@ let temp_name ?dir ?(prefix="opam") () = in tmpdir / (temp_basename prefix) +let temp_dir_cleaner = + let to_clean = ref OpamStd.String.Set.empty in + OpamStd.Sys.at_exit + (fun () -> + OpamStd.String.Set.iter (fun d -> + try + if Sys.file_exists d then + Unix.rmdir d; + (* Only log the item if unlink succeeded *) + log ~level:4 "temp_dir_cleaner: rm: %s" d + with Unix.Unix_error _ -> ()) + !to_clean); + fun tmp_dir -> + to_clean := OpamStd.String.Set.add tmp_dir !to_clean + let rec mk_temp_dir ?prefix () = let s = temp_name ?prefix () in if Sys.file_exists s then mk_temp_dir ?prefix () else - real_path s + let dir = real_path s in + temp_dir_cleaner dir; + dir let rec mk_unique_dir ~dir ?(prefix="opam") () = let s = dir / Printf.sprintf "%s-%06x" prefix (Random.int 0xFFFFFF) in diff --git a/src/core/opamSystem.mli b/src/core/opamSystem.mli index ffea8684af7..9c979235fda 100644 --- a/src/core/opamSystem.mli +++ b/src/core/opamSystem.mli @@ -56,8 +56,9 @@ val verbose_for_base_commands: unit -> bool (** {2 Filesystem management} *) -(** Returns a directory name, in the temporary directory, composed by {i opam} - (if [prefix] is not set), pid, and random number. *) +(** As [mk_temp] command, returns a directory name, in the temporary directory, + composed by {i opam} (if [prefix] is not set), pid, and random number. + Cleaned at exit. *) val mk_temp_dir: ?prefix:string -> unit -> string (** Returns a directory name, in the [~dir], composed by {i opam} diff --git a/tests/reftests/action-disk.test b/tests/reftests/action-disk.test index f450137322d..9e4386f06c7 100644 --- a/tests/reftests/action-disk.test +++ b/tests/reftests/action-disk.test @@ -205,6 +205,9 @@ SYSTEM LOCK ${BASEDIR}/OPAM/install-from-repo/.opam-swi SYSTEM rm ${BASEDIR}/OPAM/install-from-repo/.opam-switch/backup/state-today.export SYSTEM LOCK ${BASEDIR}/OPAM/repo/lock (none => none) SYSTEM LOCK ${BASEDIR}/OPAM/config.lock (none => none) +SYSTEM temp_dir_cleaner: rm: ${OPAMTMP} +SYSTEM temp_dir_cleaner: rm: ${OPAMTMP} +SYSTEM temp_dir_cleaner: rm: ${OPAMTMP} ### opam reinstall main-repo.1 | sed-cmd tar cp touch mkdir | "${PRE_MD5}..?${MD5}" -> pre/hash | unordered FILE(config) Read ${BASEDIR}/OPAM/config in 0.000s SYSTEM LOCK ${BASEDIR}/OPAM/lock (none => read) @@ -290,6 +293,7 @@ SYSTEM LOCK ${BASEDIR}/OPAM/install-from-repo/.opam-swi SYSTEM rm ${BASEDIR}/OPAM/install-from-repo/.opam-switch/backup/state-today.export SYSTEM LOCK ${BASEDIR}/OPAM/repo/lock (none => none) SYSTEM LOCK ${BASEDIR}/OPAM/config.lock (none => none) +SYSTEM temp_dir_cleaner: rm: ${OPAMTMP} ### opam upgrade main-repo | sed-cmd tar touch mkdir cp | "${PRE_MD5}..?${MD5}" -> pre/hash | unordered FILE(config) Read ${BASEDIR}/OPAM/config in 0.000s SYSTEM LOCK ${BASEDIR}/OPAM/lock (none => read) @@ -341,6 +345,8 @@ Processing 2/4: [main-repo: touch build-file] -> compiled main-repo.2 SYSTEM rmdir ${BASEDIR}/OPAM/install-from-repo/.opam-switch/remove/main-repo.1 SYSTEM copydir ${BASEDIR}/OPAM/install-from-repo/.opam-switch/sources/main-repo.1 -> ${BASEDIR}/OPAM/install-from-repo/.opam-switch/remove/main-repo.1 +SYSTEM temp_dir_cleaner: rm: ${OPAMTMP} +SYSTEM temp_dir_cleaner: rm: ${OPAMTMP} SYSTEM mkdir ${BASEDIR}/OPAM/install-from-repo/.opam-switch/remove/main-repo.1 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 Processing 3/4: [main-repo: touch removal-file] @@ -457,6 +463,7 @@ SYSTEM LOCK ${BASEDIR}/OPAM/install-from-repo/.opam-swi SYSTEM rm ${BASEDIR}/OPAM/install-from-repo/.opam-switch/backup/state-today.export SYSTEM LOCK ${BASEDIR}/OPAM/repo/lock (none => none) SYSTEM LOCK ${BASEDIR}/OPAM/config.lock (none => none) +SYSTEM temp_dir_cleaner: rm: ${OPAMTMP} ### :II: Pin ### :II:1: path pin ### @@ -554,7 +561,12 @@ SYSTEM LOCK ${BASEDIR}/OPAM/install-from-path-pin-all/. SYSTEM rm ${BASEDIR}/OPAM/install-from-path-pin-all/.opam-switch/backup/state-today.export SYSTEM LOCK ${BASEDIR}/OPAM/repo/lock (none => none) SYSTEM LOCK ${BASEDIR}/OPAM/config.lock (none => none) +SYSTEM temp_dir_cleaner: rm: ${OPAMTMP} +SYSTEM temp_dir_cleaner: rm: ${OPAMTMP} ### opam install main-ppin | grep -v '^- ./$' | sed-cmd rsync cp touch mkdir | unordered +SYSTEM temp_dir_cleaner: rm: ${OPAMTMP} +SYSTEM temp_dir_cleaner: rm: ${OPAMTMP} +SYSTEM temp_dir_cleaner: rm: ${OPAMTMP} FILE(config) Read ${BASEDIR}/OPAM/config in 0.000s SYSTEM LOCK ${BASEDIR}/OPAM/lock (none => read) FILE(config) Read ${BASEDIR}/OPAM/config in 0.000s @@ -633,6 +645,9 @@ SYSTEM rm ${BASEDIR}/OPAM/install-from-path-pin-all/.op SYSTEM LOCK ${BASEDIR}/OPAM/repo/lock (none => none) SYSTEM LOCK ${BASEDIR}/OPAM/config.lock (none => none) ### opam reinstall main-ppin | grep -v '^- ./$' | sed-cmd rsync cp touch mkdir | unordered +SYSTEM temp_dir_cleaner: rm: ${OPAMTMP} +SYSTEM temp_dir_cleaner: rm: ${OPAMTMP} +SYSTEM temp_dir_cleaner: rm: ${OPAMTMP} FILE(config) Read ${BASEDIR}/OPAM/config in 0.000s SYSTEM LOCK ${BASEDIR}/OPAM/lock (none => read) FILE(config) Read ${BASEDIR}/OPAM/config in 0.000s @@ -731,6 +746,8 @@ SYSTEM rm ${BASEDIR}/OPAM/install-from-path-pin-all/.op SYSTEM LOCK ${BASEDIR}/OPAM/repo/lock (none => none) SYSTEM LOCK ${BASEDIR}/OPAM/config.lock (none => none) ### opam remove main-ppin | grep -v '^- ./$' | sed-cmd rsync touch | unordered +SYSTEM temp_dir_cleaner: rm: ${OPAMTMP} +SYSTEM temp_dir_cleaner: rm: ${OPAMTMP} FILE(config) Read ${BASEDIR}/OPAM/config in 0.000s SYSTEM LOCK ${BASEDIR}/OPAM/lock (none => read) FILE(config) Read ${BASEDIR}/OPAM/config in 0.000s @@ -914,7 +931,12 @@ SYSTEM LOCK ${BASEDIR}/OPAM/install-from-path-pin-all/. SYSTEM rm ${BASEDIR}/OPAM/install-from-path-pin-all/.opam-switch/backup/state-today.export SYSTEM LOCK ${BASEDIR}/OPAM/repo/lock (none => none) SYSTEM LOCK ${BASEDIR}/OPAM/config.lock (none => none) +SYSTEM temp_dir_cleaner: rm: ${OPAMTMP} +SYSTEM temp_dir_cleaner: rm: ${OPAMTMP} ### opam reinstall ./main-ppin | grep -v '^- ./$' | sed-cmd rsync cp touch mkdir | unordered +SYSTEM temp_dir_cleaner: rm: ${OPAMTMP} +SYSTEM temp_dir_cleaner: rm: ${OPAMTMP} +SYSTEM temp_dir_cleaner: rm: ${OPAMTMP} FILE(config) Read ${BASEDIR}/OPAM/config in 0.000s SYSTEM LOCK ${BASEDIR}/OPAM/lock (none => read) FILE(config) Read ${BASEDIR}/OPAM/config in 0.000s @@ -1012,6 +1034,8 @@ SYSTEM rm ${BASEDIR}/OPAM/install-from-path-pin-all/.op SYSTEM LOCK ${BASEDIR}/OPAM/repo/lock (none => none) SYSTEM LOCK ${BASEDIR}/OPAM/config.lock (none => none) ### opam unpin main-ppin -y | grep -v '^- ./$' | sed-cmd rsync touch | unordered +SYSTEM temp_dir_cleaner: rm: ${OPAMTMP} +SYSTEM temp_dir_cleaner: rm: ${OPAMTMP} FILE(config) Read ${BASEDIR}/OPAM/config in 0.000s SYSTEM LOCK ${BASEDIR}/OPAM/lock (none => read) FILE(config) Read ${BASEDIR}/OPAM/config in 0.000s @@ -1199,7 +1223,12 @@ SYSTEM LOCK ${BASEDIR}/OPAM/install-from-git-pin-all/.o SYSTEM rm ${BASEDIR}/OPAM/install-from-git-pin-all/.opam-switch/backup/state-today.export SYSTEM LOCK ${BASEDIR}/OPAM/repo/lock (none => none) SYSTEM LOCK ${BASEDIR}/OPAM/config.lock (none => none) +SYSTEM temp_dir_cleaner: rm: ${OPAMTMP} +SYSTEM temp_dir_cleaner: rm: ${OPAMTMP} ### opam install main-gpin | sed-cmd git cp touch mkdir | grep -v "(mkdir|copy|copydir|rm) .*\\.git." | unordered +SYSTEM temp_dir_cleaner: rm: ${OPAMTMP} +SYSTEM temp_dir_cleaner: rm: ${OPAMTMP} +SYSTEM temp_dir_cleaner: rm: ${OPAMTMP} FILE(config) Read ${BASEDIR}/OPAM/config in 0.000s SYSTEM LOCK ${BASEDIR}/OPAM/lock (none => read) FILE(config) Read ${BASEDIR}/OPAM/config in 0.000s @@ -1282,6 +1311,9 @@ SYSTEM rm ${BASEDIR}/OPAM/install-from-git-pin-all/.opa SYSTEM LOCK ${BASEDIR}/OPAM/repo/lock (none => none) SYSTEM LOCK ${BASEDIR}/OPAM/config.lock (none => none) ### opam reinstall main-gpin | sed-cmd git cp touch mkdir | grep -v "(mkdir|copy|copydir|rm) .*\\.git." | unordered +SYSTEM temp_dir_cleaner: rm: ${OPAMTMP} +SYSTEM temp_dir_cleaner: rm: ${OPAMTMP} +SYSTEM temp_dir_cleaner: rm: ${OPAMTMP} FILE(config) Read ${BASEDIR}/OPAM/config in 0.000s SYSTEM LOCK ${BASEDIR}/OPAM/lock (none => read) FILE(config) Read ${BASEDIR}/OPAM/config in 0.000s @@ -1391,6 +1423,8 @@ SYSTEM rm ${BASEDIR}/OPAM/install-from-git-pin-all/.opa SYSTEM LOCK ${BASEDIR}/OPAM/repo/lock (none => none) SYSTEM LOCK ${BASEDIR}/OPAM/config.lock (none => none) ### opam remove main-gpin | sed-cmd git touch | grep -v "(mkdir|copy|copydir|rm) .*\\.git." | unordered +SYSTEM temp_dir_cleaner: rm: ${OPAMTMP} +SYSTEM temp_dir_cleaner: rm: ${OPAMTMP} FILE(config) Read ${BASEDIR}/OPAM/config in 0.000s SYSTEM LOCK ${BASEDIR}/OPAM/lock (none => read) FILE(config) Read ${BASEDIR}/OPAM/config in 0.000s @@ -1587,7 +1621,12 @@ SYSTEM LOCK ${BASEDIR}/OPAM/install-from-git-pin-all/.o SYSTEM rm ${BASEDIR}/OPAM/install-from-git-pin-all/.opam-switch/backup/state-today.export SYSTEM LOCK ${BASEDIR}/OPAM/repo/lock (none => none) SYSTEM LOCK ${BASEDIR}/OPAM/config.lock (none => none) +SYSTEM temp_dir_cleaner: rm: ${OPAMTMP} +SYSTEM temp_dir_cleaner: rm: ${OPAMTMP} ### opam reinstall ./main-gpin | sed-cmd git cp touch mkdir | grep -v "(mkdir|copy|copydir|rm) .*\\.git." | unordered +SYSTEM temp_dir_cleaner: rm: ${OPAMTMP} +SYSTEM temp_dir_cleaner: rm: ${OPAMTMP} +SYSTEM temp_dir_cleaner: rm: ${OPAMTMP} FILE(config) Read ${BASEDIR}/OPAM/config in 0.000s SYSTEM LOCK ${BASEDIR}/OPAM/lock (none => read) FILE(config) Read ${BASEDIR}/OPAM/config in 0.000s @@ -1696,6 +1735,8 @@ SYSTEM rm ${BASEDIR}/OPAM/install-from-git-pin-all/.opa SYSTEM LOCK ${BASEDIR}/OPAM/repo/lock (none => none) SYSTEM LOCK ${BASEDIR}/OPAM/config.lock (none => none) ### opam unpin main-gpin -y | sed-cmd git touch | grep -v "(mkdir|copy|copydir|rm) .*\\.git." | grep -v "HEAD is now" | unordered +SYSTEM temp_dir_cleaner: rm: ${OPAMTMP} +SYSTEM temp_dir_cleaner: rm: ${OPAMTMP} FILE(config) Read ${BASEDIR}/OPAM/config in 0.000s SYSTEM LOCK ${BASEDIR}/OPAM/lock (none => read) FILE(config) Read ${BASEDIR}/OPAM/config in 0.000s @@ -1917,7 +1958,9 @@ SYSTEM LOCK ${BASEDIR}/OPAM/install-from-version-pin/.o SYSTEM rm ${BASEDIR}/OPAM/install-from-version-pin/.opam-switch/backup/state-today.export SYSTEM LOCK ${BASEDIR}/OPAM/repo/lock (none => none) SYSTEM LOCK ${BASEDIR}/OPAM/config.lock (none => none) +SYSTEM temp_dir_cleaner: rm: ${OPAMTMP} ### opam reinstall main-repo | grep -v '^- ./$' | sed-cmd tar rsync cp touch mkdir | "${PRE_MD5}..?${MD5}" -> pre/hash | unordered +SYSTEM temp_dir_cleaner: rm: ${OPAMTMP} FILE(config) Read ${BASEDIR}/OPAM/config in 0.000s SYSTEM LOCK ${BASEDIR}/OPAM/lock (none => read) FILE(config) Read ${BASEDIR}/OPAM/config in 0.000s @@ -2003,6 +2046,7 @@ SYSTEM rm ${BASEDIR}/OPAM/install-from-version-pin/.opa SYSTEM LOCK ${BASEDIR}/OPAM/repo/lock (none => none) SYSTEM LOCK ${BASEDIR}/OPAM/config.lock (none => none) ### opam remove main-repo | grep -v '^- ./$' | sed-cmd tar rsync touch | "${PRE_MD5}..?${MD5}" -> pre/hash | unordered +SYSTEM temp_dir_cleaner: rm: ${OPAMTMP} FILE(config) Read ${BASEDIR}/OPAM/config in 0.000s SYSTEM LOCK ${BASEDIR}/OPAM/lock (none => read) FILE(config) Read ${BASEDIR}/OPAM/config in 0.000s @@ -2193,6 +2237,7 @@ SYSTEM LOCK ${BASEDIR}/OPAM/config.lock (write => none) SYSTEM LOCK ${BASEDIR}/OPAM/package-switch/.opam-switch/lock (write => none) SYSTEM LOCK ${BASEDIR}/OPAM/repo/lock (none => none) SYSTEM LOCK ${BASEDIR}/OPAM/config.lock (none => none) +SYSTEM temp_dir_cleaner: rm: ${OPAMTMP} ### :III:3: from local, empty ### opam switch create ./void | unordered FILE(config) Read ${BASEDIR}/OPAM/config in 0.000s @@ -2350,6 +2395,8 @@ SYSTEM LOCK ${BASEDIR}/OPAM/config.lock (write => none) SYSTEM LOCK ${BASEDIR}/main-ppin/_opam/.opam-switch/lock (write => none) SYSTEM LOCK ${BASEDIR}/OPAM/repo/lock (none => none) SYSTEM LOCK ${BASEDIR}/OPAM/config.lock (none => none) +SYSTEM temp_dir_cleaner: rm: ${OPAMTMP} +SYSTEM temp_dir_cleaner: rm: ${OPAMTMP} ### :IV: Switch deletion ### :IV:1: local ### opam switch remove ./main-ppin | unordered diff --git a/tests/reftests/run.ml b/tests/reftests/run.ml index f1f818bb6e5..d13ac94be8a 100644 --- a/tests/reftests/run.ml +++ b/tests/reftests/run.ml @@ -573,6 +573,7 @@ let common_filters ?opam dir = alt (dir_to_regex tmpdir); rep (set "/\\"); str "opam-"; + opt @@ str "pin-cache-"; rep1 (alt [xdigit; char '-'])], Sed "${OPAMTMP}"; seq [