fsck --lost-found: write blob's contents, not their SHA-1
authorJohannes Schindelin <Johannes.Schindelin@gmx.de>
Sun, 22 Jul 2007 20:20:26 +0000 (21:20 +0100)
committerJunio C Hamano <gitster@pobox.com>
Sun, 22 Jul 2007 22:59:27 +0000 (15:59 -0700)
When looking for a lost blob, it is much nicer to be able to grep
through .git/lost-found/other/* than to write an inefficient loop
over the file names.  So write the contents of the dangling blobs,
not their object names.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Documentation/git-fsck.txt
builtin-fsck.c

index 1a432f231970e4eb06ee9bad0cc7a4b550d17762..45c0bee50a15e21516a7b288b546b3a40c48028e 100644 (file)
@@ -65,8 +65,10 @@ index file and all SHA1 references in .git/refs/* as heads.
        Be chatty.
 
 --lost-found::
-       Write dangling refs into .git/lost-found/commit/ or
-       .git/lost-found/other/, depending on type.
+       Write dangling objects into .git/lost-found/commit/ or
+       .git/lost-found/other/, depending on type.  If the object is
+       a blob, the contents are written into the file, rather than
+       its object name.
 
 It tests SHA1 and general object sanity, and it does full tracking of
 the resulting reachability and everything else. It prints out any
index 350ec5e1445a3743a4b9a5039d16d9dba505cf4e..8d12287f037c499acad26ea81acab73490c38d5c 100644 (file)
@@ -152,7 +152,17 @@ static void check_unreachable_object(struct object *obj)
                        }
                        if (!(f = fopen(filename, "w")))
                                die("Could not open %s", filename);
-                       fprintf(f, "%s\n", sha1_to_hex(obj->sha1));
+                       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;