Skip to content

Commit

Permalink
Don't crash during repack of a reflog with pruned commits.
Browse files Browse the repository at this point in the history
If the user has been using reflog for a long time (e.g. since its
introduction) then it is very likely that an existing branch's
reflog may still mention commits which have long since been pruned
out of the repository.

Rather than aborting with a very useless error message during
git-repack, pack as many valid commits as we can get from the
reflog and let the user know that the branch's reflog contains
already pruned commits.  A future 'git reflog expire' (or whatever
it finally winds up being called) can then be performed to expunge
those reflog entries.

Signed-off-by: Shawn O. Pearce <spearce@spearce.org>
Signed-off-by: Junio C Hamano <junkio@cox.net>
  • Loading branch information
Shawn O. Pearce authored and Junio C Hamano committed Dec 22, 2006
1 parent 90cee09 commit 71b03b4
Showing 1 changed file with 20 additions and 10 deletions.
30 changes: 20 additions & 10 deletions revision.c
Original file line number Diff line number Diff line change
Expand Up @@ -466,6 +466,7 @@ static void limit_list(struct rev_info *revs)

struct all_refs_cb {
int all_flags;
int warned_bad_reflog;
struct rev_info *all_revs;
const char *name_for_errormsg;
};
Expand All @@ -487,25 +488,34 @@ static void handle_all(struct rev_info *revs, unsigned flags)
for_each_ref(handle_one_ref, &cb);
}

static int handle_one_reflog_ent(unsigned char *osha1, unsigned char *nsha1, char *detail, void *cb_data)
static void handle_one_reflog_commit(unsigned char *sha1, void *cb_data)
{
struct all_refs_cb *cb = cb_data;
struct object *object;

if (!is_null_sha1(osha1)) {
object = get_reference(cb->all_revs, cb->name_for_errormsg,
osha1, cb->all_flags);
add_pending_object(cb->all_revs, object, "");
if (!is_null_sha1(sha1)) {
struct object *o = parse_object(sha1);
if (o) {
o->flags |= cb->all_flags;
add_pending_object(cb->all_revs, o, "");
}
else if (!cb->warned_bad_reflog) {
warn("reflog of '%s' references pruned commits",
cb->name_for_errormsg);
cb->warned_bad_reflog = 1;
}
}
object = get_reference(cb->all_revs, cb->name_for_errormsg,
nsha1, cb->all_flags);
add_pending_object(cb->all_revs, object, "");
}

static int handle_one_reflog_ent(unsigned char *osha1, unsigned char *nsha1, char *detail, void *cb_data)
{
handle_one_reflog_commit(osha1, cb_data);
handle_one_reflog_commit(nsha1, cb_data);
return 0;
}

static int handle_one_reflog(const char *path, const unsigned char *sha1, int flag, void *cb_data)
{
struct all_refs_cb *cb = cb_data;
cb->warned_bad_reflog = 0;
cb->name_for_errormsg = path;
for_each_reflog_ent(path, handle_one_reflog_ent, cb_data);
return 0;
Expand Down

0 comments on commit 71b03b4

Please sign in to comment.