Re: [PATCH 8/8] git-gc --auto: run "repack -A -d -l" as necessary.
- From
Johannes Schindelin <johannes.schindelin@gmx.de>
- Date
- Sep 17, 2007, 09:53 UTC
- Message-ID
- <Pine.LNX.4.64.0709171044170.28586@racer.site>
- In-Reply-To
- <1190018716666-git-send-email-gitster@pobox.com>
Hi,
On Mon, 17 Sep 2007, Junio C Hamano wrote:
Show 11 quoted lines
> diff --git a/builtin-gc.c b/builtin-gc.c > index 34ce35b..a82f6be 100644 > --- a/builtin-gc.c > +++ b/builtin-gc.c > @@ -78,6 +83,9 @@ static int too_many_loose_objects(void) > int num_loose = 0; > int needed = 0; > > + if (gc_auto_threshold <= 0) > + return 0; > +
Heh, patch 6/8 explicitely moved this check out of the function.
Show 18 quoted lines
> @@ -100,21 +108,58 @@ static int too_many_loose_objects(void)
> return needed;
> }
>
> +static int too_many_packs(void)
> +{
> + struct packed_git *p;
> + int cnt;
> +
> + if (gc_auto_pack_limit <= 0)
> + return 0;
> +
> + for (cnt = 0, p = packed_git; p; p = p->next) {
> + char *suffix;
> + int keep;
> + if (!p->pack_local)
> + continue;
> + suffix = p->pack_name + strlen(p->pack_name) - 5;I suspect that you need something like
int len; len = strlen(p->pack_name); if (len < 5) continue;
before this.
Show 5 quoted lines
> + if (memcmp(suffix, ".pack", 6)) > + continue; > + memcpy(suffix, ".keep", 6); > + keep = access(p->pack_name, F_OK) && (errno == ENOENT); > + memcpy(suffix, ".pack", 6);
Heh. Took me some looking around to see why this is allowed...
Show 28 quoted lines
> static int need_to_gc(void)
> {
> int ac = 0;
>
> /*
> - * Setting gc.auto to 0 or negative can disable the
> - * automatic gc
> + * Setting gc.auto and gc.autopacklimit to 0 or negative can
> + * disable the automatic gc.
> */
> - if (gc_auto_threshold <= 0)
> - return 0;
> -
> - if (!too_many_loose_objects())
> + if (gc_auto_threshold <= 0 && gc_auto_pack_limit <= 0)
> return 0;
>
> + /*
> + * If there are too many loose objects, but not too many
> + * packs, we run "repack -d -l". If there are too many packs,
> + * we run "repack -A -d -l". Otherwise we tell the caller
> + * there is no need.
> + */
> argv_repack[ac++] = "repack";
> + if (too_many_packs())
> + argv_repack[ac++] = "-A";
> + if (!too_many_loose_objects() && ac == 1)
> + return 0;Why not
else if (!too_many_loose_objects()) return 0;
Hmm?
Ciao, Dscho