Protect commits recorded in reflog from pruning.
authorJunio C Hamano <junkio@cox.net>
Mon, 18 Dec 2006 09:36:16 +0000 (01:36 -0800)
committerJunio C Hamano <junkio@cox.net>
Thu, 21 Dec 2006 01:22:10 +0000 (17:22 -0800)
This teaches fsck-objects and prune to protect objects referred
to by reflog entries.

Signed-off-by: Junio C Hamano <junkio@cox.net>
builtin-prune.c
fsck-objects.c

index 8591d28b8e91c94636e9bf8b7e8ff5abcc0705e9..00a53b36479a25a51734fa359ebf2f649795437b 100644 (file)
@@ -181,12 +181,28 @@ static void walk_commit_list(struct rev_info *revs)
        }
 }
 
+static int add_one_reflog_ent(unsigned char *osha1, unsigned char *nsha1, char *datail, void *cb_data)
+{
+       struct object *object;
+
+       object = parse_object(osha1);
+       if (object)
+               add_pending_object(&revs, object, "");
+       object = parse_object(nsha1);
+       if (object)
+               add_pending_object(&revs, object, "");
+       return 0;
+}
+
 static int add_one_ref(const char *path, const unsigned char *sha1, int flag, void *cb_data)
 {
        struct object *object = parse_object(sha1);
        if (!object)
                die("bad object ref: %s:%s", path, sha1_to_hex(sha1));
        add_pending_object(&revs, object, "");
+
+       for_each_reflog_ent(path, add_one_reflog_ent, NULL);
+
        return 0;
 }
 
index 409aea02b4f8570dbaf0a8425eb29e5d45515367..1cc3b399bcf2b8ef875ded8dfcff5aef0f345811 100644 (file)
@@ -399,6 +399,25 @@ static void fsck_dir(int i, char *path)
 
 static int default_refs;
 
+static int fsck_handle_reflog_ent(unsigned char *osha1, unsigned char *nsha1, char *datail, void *cb_data)
+{
+       struct object *obj;
+
+       if (!is_null_sha1(osha1)) {
+               obj = lookup_object(osha1);
+               if (obj) {
+                       obj->used = 1;
+                       mark_reachable(obj, REACHABLE);
+               }
+       }
+       obj = lookup_object(nsha1);
+       if (obj) {
+               obj->used = 1;
+               mark_reachable(obj, REACHABLE);
+       }
+       return 0;
+}
+
 static int fsck_handle_ref(const char *refname, const unsigned char *sha1, int flag, void *cb_data)
 {
        struct object *obj;
@@ -416,6 +435,9 @@ static int fsck_handle_ref(const char *refname, const unsigned char *sha1, int f
        default_refs++;
        obj->used = 1;
        mark_reachable(obj, REACHABLE);
+
+       for_each_reflog_ent(refname, fsck_handle_reflog_ent, NULL);
+
        return 0;
 }