X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=builtin-fsck.c;h=350ec5e1445a3743a4b9a5039d16d9dba505cf4e;hb=ec96e0f6a4244e3bccc745eeb4cb6daa80a347e4;hp=bacae5dfa6e09602db59df256e5496f9f14e0d89;hpb=20f1eb6b46645115695329a371d412eb3e714865;p=git.git diff --git a/builtin-fsck.c b/builtin-fsck.c index bacae5dfa..350ec5e14 100644 --- a/builtin-fsck.c +++ b/builtin-fsck.c @@ -1,3 +1,4 @@ +#include "builtin.h" #include "cache.h" #include "commit.h" #include "tree.h" @@ -20,6 +21,7 @@ static int check_strict; static int keep_cache_objects; static unsigned char head_sha1[20]; static int errors_found; +static int write_lost_and_found; static int verbose; #define ERROR_OBJECT 01 #define ERROR_REACHABLE 02 @@ -138,6 +140,21 @@ static void check_unreachable_object(struct object *obj) if (!obj->used) { printf("dangling %s %s\n", typename(obj->type), sha1_to_hex(obj->sha1)); + if (write_lost_and_found) { + char *filename = git_path("lost-found/%s/%s", + obj->type == OBJ_COMMIT ? "commit" : "other", + sha1_to_hex(obj->sha1)); + FILE *f; + + if (safe_create_leading_directories(filename)) { + error("Could not create lost-found"); + return; + } + if (!(f = fopen(filename, "w"))) + die("Could not open %s", filename); + fprintf(f, "%s\n", sha1_to_hex(obj->sha1)); + fclose(f); + } return; } @@ -351,7 +368,7 @@ static int fsck_commit(struct commit *commit) if (!commit->parents && show_root) printf("root %s\n", sha1_to_hex(commit->object.sha1)); if (!commit->date) - printf("bad commit date in %s\n", + printf("bad commit date in %s\n", sha1_to_hex(commit->object.sha1)); return 0; } @@ -643,7 +660,7 @@ static const char fsck_usage[] = "git-fsck [--tags] [--root] [[--unreachable] [--cache] [--full] " "[--strict] [--verbose] *]"; -int cmd_fsck(int argc, char **argv, const char *prefix) +int cmd_fsck(int argc, const char **argv, const char *prefix) { int i, heads; @@ -685,6 +702,12 @@ int cmd_fsck(int argc, char **argv, const char *prefix) verbose = 1; continue; } + if (!strcmp(arg, "--lost-found")) { + check_full = 1; + include_reflogs = 0; + write_lost_and_found = 1; + continue; + } if (*arg == '-') usage(fsck_usage); } @@ -719,7 +742,7 @@ int cmd_fsck(int argc, char **argv, const char *prefix) heads = 0; for (i = 1; i < argc; i++) { - const char *arg = argv[i]; + const char *arg = argv[i]; if (*arg == '-') continue;