Browse Source

Protect commits recorded in reflog from pruning.

This teaches fsck-objects and prune to protect objects referred
to by reflog entries.

Signed-off-by: Junio C Hamano <junkio@cox.net>
maint
Junio C Hamano 18 years ago
parent
commit
55dd55263b
  1. 16
      builtin-prune.c
  2. 22
      fsck-objects.c

16
builtin-prune.c

@ -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) static int add_one_ref(const char *path, const unsigned char *sha1, int flag, void *cb_data)
{ {
struct object *object = parse_object(sha1); struct object *object = parse_object(sha1);
if (!object) if (!object)
die("bad object ref: %s:%s", path, sha1_to_hex(sha1)); die("bad object ref: %s:%s", path, sha1_to_hex(sha1));
add_pending_object(&revs, object, ""); add_pending_object(&revs, object, "");

for_each_reflog_ent(path, add_one_reflog_ent, NULL);

return 0; return 0;
} }



22
fsck-objects.c

@ -399,6 +399,25 @@ static void fsck_dir(int i, char *path)


static int default_refs; 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) static int fsck_handle_ref(const char *refname, const unsigned char *sha1, int flag, void *cb_data)
{ {
struct object *obj; struct object *obj;
@ -416,6 +435,9 @@ static int fsck_handle_ref(const char *refname, const unsigned char *sha1, int f
default_refs++; default_refs++;
obj->used = 1; obj->used = 1;
mark_reachable(obj, REACHABLE); mark_reachable(obj, REACHABLE);

for_each_reflog_ent(refname, fsck_handle_reflog_ent, NULL);

return 0; return 0;
} }



Loading…
Cancel
Save