Skip to content

Commit

Permalink
allow for undeltified objects not to be reused
Browse files Browse the repository at this point in the history
Currently non deltified object data is always reused when possible.
This means that any change to core.compression has no effect on those
objects as they don't get recompressed when repacking them.

Let's add a --no-reuse-object flag to git-repack in order to force
recompression of all objects when desired.

Signed-off-by: Nicolas Pitre <nico@cam.org>
Signed-off-by: Junio C Hamano <junkio@cox.net>
  • Loading branch information
Nicolas Pitre authored and Junio C Hamano committed May 10, 2007
1 parent 843142a commit fa736f7
Show file tree
Hide file tree
Showing 2 changed files with 21 additions and 8 deletions.
7 changes: 7 additions & 0 deletions Documentation/git-pack-objects.txt
Original file line number Diff line number Diff line change
Expand Up @@ -127,6 +127,13 @@ base-name::
This flag tells the command not to reuse existing deltas
but compute them from scratch.

--no-reuse-object::
This flag tells the command not to reuse existing object data at all,
including non deltified object, forcing recompression of everything.
This implies --no-reuse-delta. Useful only in the obscur case where
wholesale enforcement of a different compression level on the
packed data is desired.

--delta-base-offset::
A packed archive can express base object of a delta as
either 20-byte object name or as an offset in the
Expand Down
22 changes: 14 additions & 8 deletions builtin-pack-objects.c
Original file line number Diff line number Diff line change
Expand Up @@ -17,9 +17,9 @@
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]*] [--reflog] [--stdout | base-name] \n\
[<ref-list | <object-list]";
[--no-reuse-delta] [--no-reuse-object] [--delta-base-offset] \n\
[--non-empty] [--revs [--unpacked | --all]*] [--reflog] \n\
[--stdout | base-name] [<ref-list | <object-list]";

struct object_entry {
unsigned char sha1[20];
Expand Down Expand Up @@ -55,7 +55,7 @@ static struct object_entry *objects;
static uint32_t nr_objects, nr_alloc, nr_result;

static int non_empty;
static int no_reuse_delta;
static int no_reuse_delta, no_reuse_object;
static int local;
static int incremental;
static int allow_ofs_delta;
Expand Down Expand Up @@ -412,7 +412,9 @@ static unsigned long write_object(struct sha1file *f,
crc32_begin(f);

obj_type = entry->type;
if (! entry->in_pack)
if (no_reuse_object)
to_reuse = 0; /* explicit */
else if (!entry->in_pack)
to_reuse = 0; /* can't reuse what we don't have */
else if (obj_type == OBJ_REF_DELTA || obj_type == OBJ_OFS_DELTA)
to_reuse = 1; /* check_object() decided it for us */
Expand All @@ -425,7 +427,7 @@ static unsigned long write_object(struct sha1file *f,
* and we do not need to deltify it.
*/

if (!entry->in_pack && !entry->delta) {
if (!no_reuse_object && !entry->in_pack && !entry->delta) {
unsigned char *map;
unsigned long mapsize;
map = map_sha1_file(entry->sha1, &mapsize);
Expand Down Expand Up @@ -1125,8 +1127,8 @@ static void check_object(struct object_entry *entry)
buf = use_pack(p, &w_curs, entry->in_pack_offset, &avail);

/*
* We want in_pack_type even if we do not reuse delta.
* There is no point not reusing non-delta representations.
* We want in_pack_type even if we do not reuse delta
* since non-delta representations could still be reused.
*/
used = unpack_object_header_gently(buf, avail,
&entry->in_pack_type,
Expand Down Expand Up @@ -1655,6 +1657,10 @@ int cmd_pack_objects(int argc, const char **argv, const char *prefix)
no_reuse_delta = 1;
continue;
}
if (!strcmp("--no-reuse-object", arg)) {
no_reuse_object = no_reuse_delta = 1;
continue;
}
if (!strcmp("--delta-base-offset", arg)) {
allow_ofs_delta = 1;
continue;
Expand Down

0 comments on commit fa736f7

Please sign in to comment.