aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCHEIKH Chawki <chawki.cheikh008@gmail.com>2018-12-04 16:14:23 +0100
committerCHEIKH Chawki <chawki.cheikh008@gmail.com>2018-12-06 13:57:59 +0100
commitfa5143c722dab749de9305dbaa85d618b5758440 (patch)
treec78e3eeca5c85b70a25f21b7be546f13ec91cba1
parent4aee93d5ce6cf77e314e93074b9da1dcff8979e9 (diff)
Solve hg "abandoned transaction" issue
-rw-r--r--src/libexpr/primops/fetchMercurial.cc17
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 });