summary | shortlog | log | commit | commitdiff | tree
raw | patch | inline | side by side (parent: 2ff8166)
raw | patch | inline | side by side (parent: 2ff8166)
author | Junio C Hamano <junkio@cox.net> | |
Mon, 18 Dec 2006 09:36:16 +0000 (01:36 -0800) | ||
committer | Junio 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>
to by reflog entries.
Signed-off-by: Junio C Hamano <junkio@cox.net>
builtin-prune.c | patch | blob | history | |
fsck-objects.c | patch | blob | history |
diff --git a/builtin-prune.c b/builtin-prune.c
index 8591d28b8e91c94636e9bf8b7e8ff5abcc0705e9..00a53b36479a25a51734fa359ebf2f649795437b 100644 (file)
--- a/builtin-prune.c
+++ b/builtin-prune.c
}
}
+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;
}
diff --git a/fsck-objects.c b/fsck-objects.c
index 409aea02b4f8570dbaf0a8425eb29e5d45515367..1cc3b399bcf2b8ef875ded8dfcff5aef0f345811 100644 (file)
--- a/fsck-objects.c
+++ b/fsck-objects.c
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;
}