8
#include "cache-tree.h"
11
#define REACHABLE 0x0001
16
static int show_unreachable;
17
static int check_full;
18
static int check_strict;
19
static int keep_cache_objects;
20
static unsigned char head_sha1[20];
21
static int errors_found;
22
#define ERROR_OBJECT 01
23
#define ERROR_REACHABLE 02
25
#ifdef NO_D_INO_IN_DIRENT
27
#define DIRENT_SORT_HINT(de) 0
30
#define DIRENT_SORT_HINT(de) ((de)->d_ino)
33
static void objreport(struct object *obj, const char *severity,
34
const char *err, va_list params)
36
fprintf(stderr, "%s in %s %s: ",
37
severity, typename(obj->type), sha1_to_hex(obj->sha1));
38
vfprintf(stderr, err, params);
42
static int objerror(struct object *obj, const char *err, ...)
45
va_start(params, err);
46
errors_found |= ERROR_OBJECT;
47
objreport(obj, "error", err, params);
52
static int objwarning(struct object *obj, const char *err, ...)
55
va_start(params, err);
56
objreport(obj, "warning", err, params);
62
* Check a single reachable object
64
static void check_reachable_object(struct object *obj)
66
const struct object_refs *refs;
69
* We obviously want the object to be parsed,
70
* except if it was in a pack-file and we didn't
74
if (has_sha1_pack(obj->sha1, NULL))
75
return; /* it is in pack - forget about it */
76
printf("missing %s %s\n", typename(obj->type), sha1_to_hex(obj->sha1));
77
errors_found |= ERROR_REACHABLE;
82
* Check that everything that we try to reference is also good.
84
refs = lookup_object_refs(obj);
87
for (j = 0; j < refs->count; j++) {
88
struct object *ref = refs->ref[j];
90
(has_sha1_file(ref->sha1)))
92
printf("broken link from %7s %s\n",
93
typename(obj->type), sha1_to_hex(obj->sha1));
94
printf(" to %7s %s\n",
95
typename(ref->type), sha1_to_hex(ref->sha1));
96
errors_found |= ERROR_REACHABLE;
102
* Check a single unreachable object
104
static void check_unreachable_object(struct object *obj)
107
* Missing unreachable object? Ignore it. It's not like
108
* we miss it (since it can't be reached), nor do we want
109
* to complain about it being unreachable (since it does
116
* Unreachable object that exists? Show it if asked to,
117
* since this is something that is prunable.
119
if (show_unreachable) {
120
printf("unreachable %s %s\n", typename(obj->type), sha1_to_hex(obj->sha1));
125
* "!used" means that nothing at all points to it, including
126
* other unreachable objects. In other words, it's the "tip"
127
* of some set of unreachable objects, usually a commit that
130
* Such starting points are more interesting than some random
131
* set of unreachable objects, so we show them even if the user
132
* hasn't asked for _all_ unreachable objects. If you have
133
* deleted a branch by mistake, this is a prime candidate to
134
* start looking at, for example.
137
printf("dangling %s %s\n", typename(obj->type),
138
sha1_to_hex(obj->sha1));
143
* Otherwise? It's there, it's unreachable, and some other unreachable
144
* object points to it. Ignore it - it's not interesting, and we showed
145
* all the interesting cases above.
149
static void check_object(struct object *obj)
151
if (obj->flags & REACHABLE)
152
check_reachable_object(obj);
154
check_unreachable_object(obj);
157
static void check_connectivity(void)
161
/* Look up all the requirements, warn about missing objects.. */
162
max = get_max_object_index();
163
for (i = 0; i < max; i++) {
164
struct object *obj = get_indexed_object(i);
172
* The entries in a tree are ordered in the _path_ order,
173
* which means that a directory entry is ordered by adding
174
* a slash to the end of it.
176
* So a directory called "a" is ordered _after_ a file
177
* called "a.c", because "a/" sorts after "a.c".
179
#define TREE_UNORDERED (-1)
180
#define TREE_HAS_DUPS (-2)
182
static int verify_ordered(unsigned mode1, const char *name1, unsigned mode2, const char *name2)
184
int len1 = strlen(name1);
185
int len2 = strlen(name2);
186
int len = len1 < len2 ? len1 : len2;
187
unsigned char c1, c2;
190
cmp = memcmp(name1, name2, len);
194
return TREE_UNORDERED;
197
* Ok, the first <len> characters are the same.
198
* Now we need to order the next one, but turn
199
* a '\0' into a '/' for a directory entry.
205
* git-write-tree used to write out a nonsense tree that has
206
* entries with the same name, one blob and one tree. Make
207
* sure we do not have duplicate entries.
209
return TREE_HAS_DUPS;
210
if (!c1 && S_ISDIR(mode1))
212
if (!c2 && S_ISDIR(mode2))
214
return c1 < c2 ? 0 : TREE_UNORDERED;
217
static int fsck_tree(struct tree *item)
220
int has_full_path = 0;
221
int has_zero_pad = 0;
222
int has_bad_modes = 0;
223
int has_dup_entries = 0;
224
int not_properly_sorted = 0;
225
struct tree_desc desc;
228
const unsigned char *o_sha1;
230
init_tree_desc(&desc, item->buffer, item->size);
238
const unsigned char *sha1;
240
sha1 = tree_entry_extract(&desc, &name, &mode);
242
if (strchr(name, '/'))
244
has_zero_pad |= *(char *)desc.buffer == '0';
245
update_tree_entry(&desc);
257
* This is nonstandard, but we had a few of these
258
* early on when we honored the full set of mode
269
switch (verify_ordered(o_mode, o_name, mode, name)) {
271
not_properly_sorted = 1;
290
objwarning(&item->object, "contains full pathnames");
293
objwarning(&item->object, "contains zero-padded file modes");
296
objwarning(&item->object, "contains bad file modes");
298
if (has_dup_entries) {
299
retval = objerror(&item->object, "contains duplicate file entries");
301
if (not_properly_sorted) {
302
retval = objerror(&item->object, "not properly sorted");
307
static int fsck_commit(struct commit *commit)
309
char *buffer = commit->buffer;
310
unsigned char tree_sha1[20], sha1[20];
312
if (memcmp(buffer, "tree ", 5))
313
return objerror(&commit->object, "invalid format - expected 'tree' line");
314
if (get_sha1_hex(buffer+5, tree_sha1) || buffer[45] != '\n')
315
return objerror(&commit->object, "invalid 'tree' line format - bad sha1");
317
while (!memcmp(buffer, "parent ", 7)) {
318
if (get_sha1_hex(buffer+7, sha1) || buffer[47] != '\n')
319
return objerror(&commit->object, "invalid 'parent' line format - bad sha1");
322
if (memcmp(buffer, "author ", 7))
323
return objerror(&commit->object, "invalid format - expected 'author' line");
324
free(commit->buffer);
325
commit->buffer = NULL;
327
return objerror(&commit->object, "could not load commit's tree %s", tree_sha1);
328
if (!commit->parents && show_root)
329
printf("root %s\n", sha1_to_hex(commit->object.sha1));
331
printf("bad commit date in %s\n",
332
sha1_to_hex(commit->object.sha1));
336
static int fsck_tag(struct tag *tag)
338
struct object *tagged = tag->tagged;
341
return objerror(&tag->object, "could not load tagged object");
346
printf("tagged %s %s", typename(tagged->type), sha1_to_hex(tagged->sha1));
347
printf(" (%s) in %s\n", tag->tag, sha1_to_hex(tag->object.sha1));
351
static int fsck_sha1(unsigned char *sha1)
353
struct object *obj = parse_object(sha1);
355
errors_found |= ERROR_OBJECT;
356
return error("%s: object corrupt or missing",
359
if (obj->flags & SEEN)
362
if (obj->type == OBJ_BLOB)
364
if (obj->type == OBJ_TREE)
365
return fsck_tree((struct tree *) obj);
366
if (obj->type == OBJ_COMMIT)
367
return fsck_commit((struct commit *) obj);
368
if (obj->type == OBJ_TAG)
369
return fsck_tag((struct tag *) obj);
371
/* By now, parse_object() would've returned NULL instead. */
372
return objerror(obj, "unknown type '%d' (internal fsck error)",
377
* This is the sorting chunk size: make it reasonably
378
* big so that we can sort well..
380
#define MAX_SHA1_ENTRIES (1024)
384
unsigned char sha1[20];
389
struct sha1_entry *entry[MAX_SHA1_ENTRIES];
392
static int ino_compare(const void *_a, const void *_b)
394
const struct sha1_entry *a = _a, *b = _b;
395
unsigned long ino1 = a->ino, ino2 = b->ino;
396
return ino1 < ino2 ? -1 : ino1 > ino2 ? 1 : 0;
399
static void fsck_sha1_list(void)
401
int i, nr = sha1_list.nr;
404
qsort(sha1_list.entry, nr,
405
sizeof(struct sha1_entry *), ino_compare);
406
for (i = 0; i < nr; i++) {
407
struct sha1_entry *entry = sha1_list.entry[i];
408
unsigned char *sha1 = entry->sha1;
410
sha1_list.entry[i] = NULL;
417
static void add_sha1_list(unsigned char *sha1, unsigned long ino)
419
struct sha1_entry *entry = xmalloc(sizeof(*entry));
423
hashcpy(entry->sha1, sha1);
425
if (nr == MAX_SHA1_ENTRIES) {
429
sha1_list.entry[nr] = entry;
433
static void fsck_dir(int i, char *path)
435
DIR *dir = opendir(path);
441
while ((de = readdir(dir)) != NULL) {
443
unsigned char sha1[20];
444
int len = strlen(de->d_name);
448
if (de->d_name[1] != '.')
451
if (de->d_name[0] != '.')
455
sprintf(name, "%02x", i);
456
memcpy(name+2, de->d_name, len+1);
457
if (get_sha1_hex(name, sha1) < 0)
459
add_sha1_list(sha1, DIRENT_SORT_HINT(de));
462
fprintf(stderr, "bad sha1 file: %s/%s\n", path, de->d_name);
467
static int default_refs;
469
static int fsck_handle_reflog_ent(unsigned char *osha1, unsigned char *nsha1,
470
const char *email, unsigned long timestamp, int tz,
471
const char *message, void *cb_data)
475
if (!is_null_sha1(osha1)) {
476
obj = lookup_object(osha1);
479
mark_reachable(obj, REACHABLE);
482
obj = lookup_object(nsha1);
485
mark_reachable(obj, REACHABLE);
490
static int fsck_handle_reflog(const char *logname, const unsigned char *sha1, int flag, void *cb_data)
492
for_each_reflog_ent(logname, fsck_handle_reflog_ent, NULL);
496
static int fsck_handle_ref(const char *refname, const unsigned char *sha1, int flag, void *cb_data)
500
obj = lookup_object(sha1);
502
if (has_sha1_file(sha1)) {
504
return 0; /* it is in a pack */
506
error("%s: invalid sha1 pointer %s", refname, sha1_to_hex(sha1));
507
/* We'll continue with the rest despite the error.. */
512
mark_reachable(obj, REACHABLE);
517
static void get_default_heads(void)
519
for_each_ref(fsck_handle_ref, NULL);
520
for_each_reflog(fsck_handle_reflog, NULL);
523
* Not having any default heads isn't really fatal, but
524
* it does mean that "--unreachable" no longer makes any
525
* sense (since in this case everything will obviously
526
* be unreachable by definition.
528
* Showing dangling objects is valid, though (as those
529
* dangling objects are likely lost heads).
531
* So we just print a warning about it, and clear the
532
* "show_unreachable" flag.
535
fprintf(stderr, "notice: No default references\n");
536
show_unreachable = 0;
540
static void fsck_object_dir(const char *path)
543
for (i = 0; i < 256; i++) {
544
static char dir[4096];
545
sprintf(dir, "%s/%02x", path, i);
551
static int fsck_head_link(void)
553
unsigned char sha1[20];
555
int null_is_error = 0;
556
const char *head_points_at = resolve_ref("HEAD", sha1, 0, &flag);
559
return error("Invalid HEAD");
560
if (!strcmp(head_points_at, "HEAD"))
563
else if (prefixcmp(head_points_at, "refs/heads/"))
564
return error("HEAD points to something strange (%s)",
566
if (is_null_sha1(sha1)) {
568
return error("HEAD: detached HEAD points at nothing");
569
fprintf(stderr, "notice: HEAD points to an unborn branch (%s)\n",
570
head_points_at + 11);
575
static int fsck_cache_tree(struct cache_tree *it)
580
if (0 <= it->entry_count) {
581
struct object *obj = parse_object(it->sha1);
583
error("%s: invalid sha1 pointer in cache-tree",
584
sha1_to_hex(it->sha1));
587
mark_reachable(obj, REACHABLE);
589
if (obj->type != OBJ_TREE)
590
err |= objerror(obj, "non-tree in cache-tree");
592
for (i = 0; i < it->subtree_nr; i++)
593
err |= fsck_cache_tree(it->down[i]->cache_tree);
597
static const char fsck_usage[] =
598
"git-fsck [--tags] [--root] [[--unreachable] [--cache] [--full] "
599
"[--strict] <head-sha1>*]";
601
int cmd_fsck(int argc, char **argv, const char *prefix)
605
track_object_refs = 1;
608
for (i = 1; i < argc; i++) {
609
const char *arg = argv[i];
611
if (!strcmp(arg, "--unreachable")) {
612
show_unreachable = 1;
615
if (!strcmp(arg, "--tags")) {
619
if (!strcmp(arg, "--root")) {
623
if (!strcmp(arg, "--cache")) {
624
keep_cache_objects = 1;
627
if (!strcmp(arg, "--full")) {
631
if (!strcmp(arg, "--strict")) {
640
fsck_object_dir(get_object_directory());
642
struct alternate_object_database *alt;
643
struct packed_git *p;
645
for (alt = alt_odb_list; alt; alt = alt->next) {
646
char namebuf[PATH_MAX];
647
int namelen = alt->name - alt->base;
648
memcpy(namebuf, alt->base, namelen);
649
namebuf[namelen - 1] = 0;
650
fsck_object_dir(namebuf);
652
prepare_packed_git();
653
for (p = packed_git; p; p = p->next)
654
/* verify gives error messages itself */
657
for (p = packed_git; p; p = p->next) {
658
uint32_t i, num = num_packed_objects(p);
659
for (i = 0; i < num; i++) {
660
unsigned char sha1[20];
661
nth_packed_object_sha1(p, i, sha1);
668
for (i = 1; i < argc; i++) {
669
const char *arg = argv[i];
674
if (!get_sha1(arg, head_sha1)) {
675
struct object *obj = lookup_object(head_sha1);
677
/* Error is printed by lookup_object(). */
682
mark_reachable(obj, REACHABLE);
686
error("invalid parameter: expected sha1, got '%s'", arg);
690
* If we've not been given any explicit head information, do the
691
* default ones from .git/refs. We also consider the index file
692
* in this case (ie this implies --cache).
696
keep_cache_objects = 1;
699
if (keep_cache_objects) {
702
for (i = 0; i < active_nr; i++) {
703
struct blob *blob = lookup_blob(active_cache[i]->sha1);
709
mark_reachable(obj, REACHABLE);
711
if (active_cache_tree)
712
fsck_cache_tree(active_cache_tree);
715
check_connectivity();