All of lore.kernel.org
 help / color / mirror / Atom feed
From: Jonas Fonseca <fonseca@diku.dk>
To: git@vger.kernel.org
Subject: [REGRESSION] Interrupted clone/fetch leaves .lock files around
Date: Tue, 6 Jun 2006 20:51:48 +0200	[thread overview]
Message-ID: <20060606185148.GA15521@diku.dk> (raw)

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

             reply	other threads:[~2006-06-06 18:52 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2006-06-06 18:51 Jonas Fonseca [this message]
2006-06-06 19:02 ` [REGRESSION] Interrupted clone/fetch leaves .lock files around Jonas Fonseca
2006-06-06 19:09 ` Junio C Hamano
2006-06-06 21:58   ` Junio C Hamano

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20060606185148.GA15521@diku.dk \
    --to=fonseca@diku.dk \
    --cc=git@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.