Hi, It used to be possible to continue an interrupted clone when using cg-clone, by cding into the partial repo and run cg-fetch. However, it seems that the recent changes in the ref locking code ends up leaving .lock files around when interrupted. $ cg clone http://elinks.cz/elinks.git defaulting to local storage area Fetching head... Fetching objects... ... Getting pack c0e265dab40fa34912c3ee6e02ba29686ab84a7b which contains 16f85ec5043966c69e2142198c52e12494dcfc76 progress: 22 objects, 939754 bytes, now fetching c0e265dab40f... (657678 bytes) cg-clone: interrupted $ cd elinks $ cg fetch Recovering from a previously interrupted initial clone... Fetching head... Fetching objects... error: Couldn't open lock file .git/refs/heads/origin.lock: File exists error: Can't lock ref heads/origin progress: 0 objects, 0 bytes cg-fetch: objects fetch failed Below is my feeble attempt at a (tested) fix. diff --git a/fetch.c b/fetch.c index e040ef9..861dc60 100644 --- a/fetch.c +++ b/fetch.c @@ -1,3 +1,5 @@ +#include <signal.h> + #include "fetch.h" #include "cache.h" @@ -214,9 +216,19 @@ static int mark_complete(const char *pat return 0; } +static struct ref_lock *lock = NULL; + +static void remove_lockfile_on_signal(int signo) +{ + if (lock) + unlock_ref(lock); + lock = NULL; + signal(SIGINT, SIG_DFL); + raise(signo); +} + int pull(char *target) { - struct ref_lock *lock = NULL; unsigned char sha1[20]; char *msg; int ret; @@ -229,6 +241,7 @@ int pull(char *target) error("Can't lock ref %s", write_ref); return -1; } + signal(SIGINT, remove_lockfile_on_signal); } if (!get_recover) @@ -236,22 +249,11 @@ int pull(char *target) if (interpret_target(target, sha1)) { error("Could not interpret %s as something to pull", target); - if (lock) - unlock_ref(lock); - return -1; - } - if (process(lookup_unknown_object(sha1))) { - if (lock) - unlock_ref(lock); - return -1; - } - if (loop()) { - if (lock) - unlock_ref(lock); - return -1; - } - if (write_ref) { + } else if (process(lookup_unknown_object(sha1)) || loop()) { + ; /* unlock */ + + } else if (write_ref) { if (write_ref_log_details) { msg = xmalloc(strlen(write_ref_log_details) + 12); sprintf(msg, "fetch from %s", write_ref_log_details); @@ -261,6 +263,10 @@ int pull(char *target) if (msg) free(msg); return ret; + } else { + return 0; } - return 0; + + remove_lockfile_on_signal(0); + return -1; } -- Jonas Fonseca - : send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html