X-Git-Url: https://asedeno.scripts.mit.edu/gitweb/?a=blobdiff_plain;f=builtin-fsck.c;h=8d12287f037c499acad26ea81acab73490c38d5c;hb=e301bfeea19e284344868840793c58d2e7529c74;hp=944a496650b6e13d2684bb221ee8bc7aadd78d6f;hpb=68fb4650497d6acbf6d407513cd2e2d960442e3b;p=git.git diff --git a/builtin-fsck.c b/builtin-fsck.c index 944a49665..8d12287f0 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,31 @@ 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); + if (obj->type == OBJ_BLOB) { + enum object_type type; + unsigned long size; + char *buf = read_sha1_file(obj->sha1, + &type, &size); + if (buf) { + fwrite(buf, size, 1, f); + free(buf); + } + } else + fprintf(f, "%s\n", sha1_to_hex(obj->sha1)); + fclose(f); + } return; } @@ -643,7 +670,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 +712,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); }