summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJunio C Hamano <junkio@cox.net>2006-02-22 19:16:38 (GMT)
committerJunio C Hamano <junkio@cox.net>2006-02-22 19:16:38 (GMT)
commit26125f6b9be8dac31f56bf3da60dfa0df6dc0b59 (patch)
tree1c7ae888daf8cc03e743e55008ea5ffa009704bb
parentaa064743fa69e2806d5e0af1fab103baa6fa57cd (diff)
downloadgit-26125f6b9be8dac31f56bf3da60dfa0df6dc0b59.zip
git-26125f6b9be8dac31f56bf3da60dfa0df6dc0b59.tar.gz
git-26125f6b9be8dac31f56bf3da60dfa0df6dc0b59.tar.bz2
detect broken alternates.
The real problem triggered an earlier fix was that an alternate entry was pointing at a removed directory. Complaining on object/pack directory that cannot be opendir-ed produces noise in an ancient repository that does not have object/pack directory and has never been packed. Detect the real user error and report it. Also if opendir failed for other reasons (e.g. no read permissions), report that as well. Spotted by Andrew Vasquez <andrew.vasquez@qlogic.com>. Signed-off-by: Junio C Hamano <junkio@cox.net>
-rw-r--r--sha1_file.c19
1 files changed, 16 insertions, 3 deletions
diff --git a/sha1_file.c b/sha1_file.c
index f08b1d6..c08da35 100644
--- a/sha1_file.c
+++ b/sha1_file.c
@@ -247,6 +247,7 @@ static void link_alt_odb_entries(const char *alt, const char *ep, int sep,
for ( ; cp < ep && *cp != sep; cp++)
;
if (last != cp) {
+ struct stat st;
struct alternate_object_database *alt;
/* 43 = 40-byte + 2 '/' + terminating NUL */
int pfxlen = cp - last;
@@ -269,9 +270,19 @@ static void link_alt_odb_entries(const char *alt, const char *ep, int sep,
}
else
memcpy(ent->base, last, pfxlen);
+
ent->name = ent->base + pfxlen + 1;
- ent->base[pfxlen] = ent->base[pfxlen + 3] = '/';
- ent->base[entlen-1] = 0;
+ ent->base[pfxlen + 3] = '/';
+ ent->base[pfxlen] = ent->base[entlen-1] = 0;
+
+ /* Detect cases where alternate disappeared */
+ if (stat(ent->base, &st) || !S_ISDIR(st.st_mode)) {
+ error("object directory %s does not exist; "
+ "check .git/objects/info/alternates.",
+ ent->base);
+ goto bad;
+ }
+ ent->base[pfxlen] = '/';
/* Prevent the common mistake of listing the same
* thing twice, or object directory itself.
@@ -552,7 +563,9 @@ static void prepare_packed_git_one(char *objdir, int local)
len = strlen(path);
dir = opendir(path);
if (!dir) {
- fprintf(stderr, "unable to open object pack directory: %s: %s\n", path, strerror(errno));
+ if (errno != ENOENT)
+ error("unable to open object pack directory: %s: %s\n",
+ path, strerror(errno));
return;
}
path[len++] = '/';