summaryrefslogtreecommitdiff
path: root/fsck-cache.c
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@g5.osdl.org>2005-07-27 23:08:43 (GMT)
committerJunio C Hamano <junkio@cox.net>2005-07-28 01:57:14 (GMT)
commit64071805eda2b57d2b77943bb3f9865d90562ecf (patch)
treef716258e3fd266b5c917765ba56ae1a6a5a6a8f0 /fsck-cache.c
parent4e81304afc529c0caca7c012a155be4e342b52d4 (diff)
downloadgit-64071805eda2b57d2b77943bb3f9865d90562ecf.zip
git-64071805eda2b57d2b77943bb3f9865d90562ecf.tar.gz
git-64071805eda2b57d2b77943bb3f9865d90562ecf.tar.bz2
git-fsck-cache: be stricter about "tree" objects
In particular, warn about things like zero-padding of the mode bits, which is a big no-no, since it makes otherwise identical trees have different representations (and thus different SHA1 numbers). Also make the warnings more regular. Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Diffstat (limited to 'fsck-cache.c')
-rw-r--r--fsck-cache.c47
1 files changed, 35 insertions, 12 deletions
diff --git a/fsck-cache.c b/fsck-cache.c
index c660391..6115514 100644
--- a/fsck-cache.c
+++ b/fsck-cache.c
@@ -109,13 +109,19 @@ static int verify_ordered(struct tree_entry_list *a, struct tree_entry_list *b)
static int fsck_tree(struct tree *item)
{
+ int retval;
int has_full_path = 0;
+ int has_zero_pad = 0;
+ int has_bad_modes = 0;
+ int has_dup_entries = 0;
+ int not_properly_sorted = 0;
struct tree_entry_list *entry, *last;
last = NULL;
for (entry = item->entries; entry; entry = entry->next) {
if (strchr(entry->name, '/'))
has_full_path = 1;
+ has_zero_pad |= entry->zeropad;
switch (entry->mode) {
/*
@@ -135,22 +141,17 @@ static int fsck_tree(struct tree *item)
if (!check_strict)
break;
default:
- printf("tree %s has entry %o %s\n",
- sha1_to_hex(item->object.sha1),
- entry->mode, entry->name);
+ has_bad_modes = 1;
}
if (last) {
switch (verify_ordered(last, entry)) {
case TREE_UNORDERED:
- fprintf(stderr, "tree %s not ordered\n",
- sha1_to_hex(item->object.sha1));
- return -1;
+ not_properly_sorted = 1;
+ break;
case TREE_HAS_DUPS:
- fprintf(stderr, "tree %s has duplicate entries for '%s'\n",
- sha1_to_hex(item->object.sha1),
- entry->name);
- return -1;
+ has_dup_entries = 1;
+ break;
default:
break;
}
@@ -159,13 +160,35 @@ static int fsck_tree(struct tree *item)
last = entry;
}
+ retval = 0;
if (has_full_path) {
fprintf(stderr, "warning: git-fsck-cache: tree %s "
"has full pathnames in it\n",
sha1_to_hex(item->object.sha1));
}
-
- return 0;
+ if (has_zero_pad) {
+ fprintf(stderr, "warning: git-fsck-cache: tree %s "
+ "has zero-padded file modes in it\n",
+ sha1_to_hex(item->object.sha1));
+ }
+ if (has_bad_modes) {
+ fprintf(stderr, "warning: git-fsck-cache: tree %s "
+ "has bad file modes in it\n",
+ sha1_to_hex(item->object.sha1));
+ }
+ if (has_dup_entries) {
+ fprintf(stderr, "error: git-fsck-cache: tree %s "
+ "has duplicate file entries\n",
+ sha1_to_hex(item->object.sha1));
+ retval = -1;
+ }
+ if (not_properly_sorted) {
+ fprintf(stderr, "error: git-fsck-cache: tree %s "
+ "is not properly sorted\n",
+ sha1_to_hex(item->object.sha1));
+ retval = -1;
+ }
+ return retval;
}
static int fsck_commit(struct commit *commit)