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::
        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
 
 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);
                        }
                        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;
                        fclose(f);
                }
                return;