Skip to content

Commit

Permalink
Teach git-repack to preserve objects referred to by reflog entries.
Browse files Browse the repository at this point in the history
This adds a new option --reflog to pack-objects and revision
machinery; do not bother documenting it for now, since this is
only useful for local repacking.

When the option is passed, objects reachable from reflog entries
are marked as interesting while computing the set of objects to
pack.

Signed-off-by: Junio C Hamano <junkio@cox.net>
  • Loading branch information
Junio C Hamano committed Dec 21, 2006
1 parent 55dd552 commit 6304929
Show file tree
Hide file tree
Showing 3 changed files with 52 additions and 9 deletions.
3 changes: 2 additions & 1 deletion builtin-pack-objects.c
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ static const char pack_usage[] = "\
git-pack-objects [{ -q | --progress | --all-progress }] \n\
[--local] [--incremental] [--window=N] [--depth=N] \n\
[--no-reuse-delta] [--delta-base-offset] [--non-empty] \n\
[--revs [--unpacked | --all]*] [--stdout | base-name] \n\
[--revs [--unpacked | --all]*] [--reflog] [--stdout | base-name] \n\
[<ref-list | <object-list]";

struct object_entry {
Expand Down Expand Up @@ -1575,6 +1575,7 @@ int cmd_pack_objects(int argc, const char **argv, const char *prefix)
}
if (!strcmp("--unpacked", arg) ||
!strncmp("--unpacked=", arg, 11) ||
!strcmp("--reflog", arg) ||
!strcmp("--all", arg)) {
use_internal_rev_list = 1;
if (ARRAY_SIZE(rp_av) - 1 <= rp_ac)
Expand Down
2 changes: 1 addition & 1 deletion git-repack.sh
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,7 @@ case ",$all_into_one," in
esac

args="$args $local $quiet $no_reuse_delta$extra"
name=$(git-pack-objects --non-empty --all $args </dev/null "$PACKTMP") ||
name=$(git-pack-objects --non-empty --all --reflog $args </dev/null "$PACKTMP") ||
exit 1
if [ -z "$name" ]; then
echo Nothing new to pack.
Expand Down
56 changes: 49 additions & 7 deletions revision.c
Original file line number Diff line number Diff line change
Expand Up @@ -464,21 +464,59 @@ static void limit_list(struct rev_info *revs)
revs->commits = newlist;
}

static int all_flags;
static struct rev_info *all_revs;
struct all_refs_cb {
int all_flags;
struct rev_info *all_revs;
const char *name_for_errormsg;
};

static int handle_one_ref(const char *path, const unsigned char *sha1, int flag, void *cb_data)
{
struct object *object = get_reference(all_revs, path, sha1, all_flags);
add_pending_object(all_revs, object, "");
struct all_refs_cb *cb = cb_data;
struct object *object = get_reference(cb->all_revs, path, sha1,
cb->all_flags);
add_pending_object(cb->all_revs, object, "");
return 0;
}

static void handle_all(struct rev_info *revs, unsigned flags)
{
all_revs = revs;
all_flags = flags;
for_each_ref(handle_one_ref, NULL);
struct all_refs_cb cb;
cb.all_revs = revs;
cb.all_flags = 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)
{
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, "");
}
object = get_reference(cb->all_revs, cb->name_for_errormsg,
nsha1, cb->all_flags);
add_pending_object(cb->all_revs, object, "");
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->name_for_errormsg = path;
for_each_reflog_ent(path, handle_one_reflog_ent, cb_data);
return 0;
}

static void handle_reflog(struct rev_info *revs, unsigned flags)
{
struct all_refs_cb cb;
cb.all_revs = revs;
cb.all_flags = flags;
for_each_ref(handle_one_reflog, &cb);
}

static int add_parents_only(struct rev_info *revs, const char *arg, int flags)
Expand Down Expand Up @@ -805,6 +843,10 @@ int setup_revisions(int argc, const char **argv, struct rev_info *revs, const ch
handle_all(revs, flags);
continue;
}
if (!strcmp(arg, "--reflog")) {
handle_reflog(revs, flags);
continue;
}
if (!strcmp(arg, "--not")) {
flags ^= UNINTERESTING;
continue;
Expand Down

0 comments on commit 6304929

Please sign in to comment.