aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJunio C Hamano <junkio@cox.net>2005-05-07 14:43:32 -0700
committerJunio C Hamano <junkio@cox.net>2005-05-07 14:43:32 -0700
commita4f35a2dc0f98f4cac906f9a748857f61bb3b84c (patch)
tree3e776ff0ab82e58abbc43fc9b8434177552c58bc
parent29c2cce41bc623e0a0d770a2634bf6c544345ea7 (diff)
downloadgit-a4f35a2dc0f98f4cac906f9a748857f61bb3b84c.tar.gz
git-a4f35a2dc0f98f4cac906f9a748857f61bb3b84c.tar.xz
Notice tree objects with duplicate entries.
This is a follow-up fix to the earlier "Notice index that has path and path/file and refuse to write such a tree" patch. With this fix, git-fsck-cache complains if a tree object stores more than one entries with the same name. Signed-off-by: Junio C Hamano <junkio@cox.net>
-rw-r--r--fsck-cache.c24
1 files changed, 21 insertions, 3 deletions
diff --git a/fsck-cache.c b/fsck-cache.c
index d59d57ea7..a00702b79 100644
--- a/fsck-cache.c
+++ b/fsck-cache.c
@@ -62,6 +62,9 @@ static void check_connectivity(void)
* So a directory called "a" is ordered _after_ a file
* called "a.c", because "a/" sorts after "a.c".
*/
+#define TREE_UNORDERED (-1)
+#define TREE_HAS_DUPS (-2)
+
static int verify_ordered(struct tree_entry_list *a, struct tree_entry_list *b)
{
int len1 = strlen(a->name);
@@ -74,7 +77,7 @@ static int verify_ordered(struct tree_entry_list *a, struct tree_entry_list *b)
if (cmp < 0)
return 0;
if (cmp > 0)
- return -1;
+ return TREE_UNORDERED;
/*
* Ok, the first <len> characters are the same.
@@ -83,11 +86,18 @@ static int verify_ordered(struct tree_entry_list *a, struct tree_entry_list *b)
*/
c1 = a->name[len];
c2 = b->name[len];
+ if (!c1 && !c2)
+ /*
+ * git-write-tree used to write out a nonsense tree that has
+ * entries with the same name, one blob and one tree. Make
+ * sure we do not have duplicate entries.
+ */
+ return TREE_HAS_DUPS;
if (!c1 && a->directory)
c1 = '/';
if (!c2 && b->directory)
c2 = '/';
- return c1 < c2 ? 0 : -1;
+ return c1 < c2 ? 0 : TREE_UNORDERED;
}
static int fsck_tree(struct tree *item)
@@ -123,10 +133,18 @@ static int fsck_tree(struct tree *item)
}
if (last) {
- if (verify_ordered(last, entry) < 0) {
+ switch (verify_ordered(last, entry)) {
+ case TREE_UNORDERED:
fprintf(stderr, "tree %s not ordered\n",
sha1_to_hex(item->object.sha1));
return -1;
+ case TREE_HAS_DUPS:
+ fprintf(stderr, "tree %s has duplicate entries for '%s'\n",
+ sha1_to_hex(item->object.sha1),
+ entry->name);
+ return -1;
+ default:
+ break;
}
}