diff options
author | CHEIKH Chawki <chawki.cheikh008@gmail.com> | 2018-12-04 16:14:23 +0100 |
---|---|---|
committer | CHEIKH Chawki <chawki.cheikh008@gmail.com> | 2018-12-06 13:57:59 +0100 |
commit | fa5143c722dab749de9305dbaa85d618b5758440 (patch) | |
tree | c78e3eeca5c85b70a25f21b7be546f13ec91cba1 | |
parent | 4aee93d5ce6cf77e314e93074b9da1dcff8979e9 (diff) |
Solve hg "abandoned transaction" issue
-rw-r--r-- | src/libexpr/primops/fetchMercurial.cc | 17 |
1 files changed, 16 insertions, 1 deletions
diff --git a/src/libexpr/primops/fetchMercurial.cc b/src/libexpr/primops/fetchMercurial.cc index 97cda2458..66f49f374 100644 --- a/src/libexpr/primops/fetchMercurial.cc +++ b/src/libexpr/primops/fetchMercurial.cc @@ -93,7 +93,22 @@ HgInfo exportMercurial(ref<Store> store, const std::string & uri, Activity act(*logger, lvlTalkative, actUnknown, fmt("fetching Mercurial repository '%s'", uri)); if (pathExists(cacheDir)) { - runProgram("hg", true, { "pull", "-R", cacheDir, "--", uri }); + try { + runProgram("hg", true, { "pull", "-R", cacheDir, "--", uri }); + } + catch (ExecError & e){ + string transJournal = cacheDir + "/.hg/store/journal"; + /* hg throws "abandoned transaction" error only if this file exists */ + if (pathExists(transJournal)) + { + runProgram("hg", true, { "recover", "-R", cacheDir }); + runProgram("hg", true, { "pull", "-R", cacheDir, "--", uri }); + } + else + { + throw ExecError(e.status, fmt("program hg '%1%' ", statusToString(e.status))); + } + } } else { createDirs(dirOf(cacheDir)); runProgram("hg", true, { "clone", "--noupdate", "--", uri, cacheDir }); |