threads / patch / 10244

patchgit-gc: by default use safer "-A" option to repack when not --prune'ing

Subject: [PATCH] git-gc: by default use safer "-A" option to repack when not --prune'ing

## tl;dr

6 messages between Oct 10, 2007 and Oct 11, 2007. Diffs are folded; open one to read it.

replies: 5people: 2as markdown or json

Brandon Casey· Oct 10, 2007, 23:49 UTC · lore

This makes use of repack's new "-A" option which does not drop packed unreachable objects. This makes git-gc safe to call at any time, particularly when a repository is referenced as an alternate by another repository.

git-gc --prune will use the "-a" option to repack instead of "-A", so that packed unreachable objects will be removed.

Signed-off-by: Brandon Casey <casey@nrlssc.navy.mil>
---
 builtin-gc.c |   20 ++++++++++++--------
 1 files changed, 12 insertions(+), 8 deletions(-)
Show changes to builtin-gc.c +12 −8
diff --git a/builtin-gc.c b/builtin-gc.c
index 23ad2b6..779245b 100644
--- a/builtin-gc.c
+++ b/builtin-gc.c
@@ -26,7 +26,7 @@ static int gc_auto_pack_limit = 20;
 #define MAX_ADD 10
 static const char *argv_pack_refs[] = {"pack-refs", "--all", "--prune", NULL};
 static const char *argv_reflog[] = {"reflog", "expire", "--all", NULL};
-static const char *argv_repack[MAX_ADD] = {"repack", "-a", "-d", "-l", NULL};
+static const char *argv_repack[MAX_ADD] = {"repack", "-d", "-l", NULL};
 static const char *argv_prune[] = {"prune", NULL};
 static const char *argv_rerere[] = {"rerere", "gc", NULL};
 
@@ -143,8 +143,6 @@ static int too_many_packs(void)
 
 static int need_to_gc(void)
 {
-	int ac = 0;
-
 	/*
 	 * Setting gc.auto and gc.autopacklimit to 0 or negative can
 	 * disable the automatic gc.
@@ -158,14 +156,10 @@ static int need_to_gc(void)
 	 * 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";
+		append_option(argv_repack, "-A", MAX_ADD);
 	else if (!too_many_loose_objects())
 		return 0;
-	argv_repack[ac++] = "-d";
-	argv_repack[ac++] = "-l";
-	argv_repack[ac++] = NULL;
 	return 1;
 }
 
@@ -211,6 +205,16 @@ int cmd_gc(int argc, const char **argv, const char *prefix)
 		prune = 0;
 		if (!need_to_gc())
 			return 0;
+	} else {
+		/*
+		 * Use safer (for shared repos) "-A" option to
+		 * repack when not pruning. Auto-gc makes its
+                 * own decision.
+		 */
+		if (prune)
+			append_option(argv_repack, "-a", MAX_ADD);
+		else
+			append_option(argv_repack, "-A", MAX_ADD);
 	}
 
 	if (pack_refs && run_command_v_opt(argv_pack_refs, RUN_GIT_CMD))
-- 
1.5.3.4.207.g00000
Johannes Schindelin· Oct 11, 2007, 00:12 UTC · re: Brandon Casey · lore

Re: [PATCH] git-gc: by default use safer "-A" option to repack when not --prune'ing

Hi,
On Wed, 10 Oct 2007, Brandon Casey wrote:
Show 23 quoted lines
>  static int need_to_gc(void)
>  {
> -	int ac = 0;
> -
>  	/*
>  	 * Setting gc.auto and gc.autopacklimit to 0 or negative can
>  	 * disable the automatic gc.
> @@ -158,14 +156,10 @@ static int need_to_gc(void)
>  	 * 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";
> +		append_option(argv_repack, "-A", MAX_ADD);
>  	else if (!too_many_loose_objects())
>  		return 0;
> -	argv_repack[ac++] = "-d";
> -	argv_repack[ac++] = "-l";
> -	argv_repack[ac++] = NULL;
>  	return 1;
>  }
>  
This is a nice cleanup, but it does not belong in this patch.
Show 17 quoted lines
> @@ -211,6 +205,16 @@ int cmd_gc(int argc, const char **argv, const char *prefix)
>  		prune = 0;
>  		if (!need_to_gc())
>  			return 0;
> +	} else {
> +		/*
> +		 * Use safer (for shared repos) "-A" option to
> +		 * repack when not pruning. Auto-gc makes its
> +                 * own decision.
> +		 */
> +		if (prune)
> +			append_option(argv_repack, "-a", MAX_ADD);
> +		else
> +			append_option(argv_repack, "-A", MAX_ADD);
>  	}
>  
>  	if (pack_refs && run_command_v_opt(argv_pack_refs, RUN_GIT_CMD))

To use the append_option() function, you need to make sure that the argv has enough space, so I suggest adding another NULL to argv_repack[]. This is enough, since you only ever add one option. But you should mention it somewhere, probably above the definition of argv_repack[].

Other than that: I think your patch makes tons of sense; much better than what I tried to cobble together with the cyclic alternates detection.

Ciao, Dscho

Brandon Casey· Oct 11, 2007, 00:26 UTC · re: Johannes Schindelin · lore

Re: [PATCH] git-gc: by default use safer "-A" option to repack when not --prune'ing

On Thu, 11 Oct 2007, Johannes Schindelin wrote:
> Hi,
>
> On Wed, 10 Oct 2007, Brandon Casey wrote:
<snip>
> This is a nice cleanup, but it does not belong in this patch.
I was thinking the same thing right after I sent it off.
Show 23 quoted lines
>
>> @@ -211,6 +205,16 @@ int cmd_gc(int argc, const char **argv, const char *prefix)
>>  		prune = 0;
>>  		if (!need_to_gc())
>>  			return 0;
>> +	} else {
>> +		/*
>> +		 * Use safer (for shared repos) "-A" option to
>> +		 * repack when not pruning. Auto-gc makes its
>> +                 * own decision.
>> +		 */
>> +		if (prune)
>> +			append_option(argv_repack, "-a", MAX_ADD);
>> +		else
>> +			append_option(argv_repack, "-A", MAX_ADD);
>>  	}
>>
>>  	if (pack_refs && run_command_v_opt(argv_pack_refs, RUN_GIT_CMD))
>
> To use the append_option() function, you need to make sure that the argv
> has enough space, so I suggest adding another NULL to argv_repack[].  This
> is enough, since you only ever add one option.  But you should mention it
> somewhere, probably above the definition of argv_repack[].
Shouldn't argv_repack have space for MAX_ADD (10) items?

append_option() is already used with argv_repack when --aggressive is used.

> Other than that: I think your patch makes tons of sense; much better than
> what I tried to cobble together with the cyclic alternates detection.
Thanks.
-brandon
Johannes Schindelin· Oct 11, 2007, 00:49 UTC · re: Brandon Casey · lore

Re: [PATCH] git-gc: by default use safer "-A" option to repack when not --prune'ing

Hi,
On Wed, 10 Oct 2007, Brandon Casey wrote:
Show 28 quoted lines
> On Thu, 11 Oct 2007, Johannes Schindelin wrote:
> 
> > > @@ -211,6 +205,16 @@ int cmd_gc(int argc, const char **argv, const char
> > > *prefix)
> > >  		prune = 0;
> > >  		if (!need_to_gc())
> > >  			return 0;
> > > +	} else {
> > > +		/*
> > > +		 * Use safer (for shared repos) "-A" option to
> > > +		 * repack when not pruning. Auto-gc makes its
> > > +                 * own decision.
> > > +		 */
> > > +		if (prune)
> > > +			append_option(argv_repack, "-a", MAX_ADD);
> > > +		else
> > > +			append_option(argv_repack, "-A", MAX_ADD);
> > >  	}
> > > 
> > >  	if (pack_refs && run_command_v_opt(argv_pack_refs, RUN_GIT_CMD))
> > 
> > To use the append_option() function, you need to make sure that the 
> > argv has enough space, so I suggest adding another NULL to 
> > argv_repack[].  This is enough, since you only ever add one option.  
> > But you should mention it somewhere, probably above the definition of 
> > argv_repack[].
> 
> Shouldn't argv_repack have space for MAX_ADD (10) items?
Ouch... I overlooked that.  So please strike this objection.

Thanks, Dscho

Brandon Casey· Oct 11, 2007, 00:59 UTC · re: Johannes Schindelin · lore

Re: [PATCH] git-gc: by default use safer "-A" option to repack when not --prune'ing

This makes use of repack's new "-A" option which does not drop packed unreachable objects. This makes git-gc safe to call at any time, particularly when a repository is referenced as an alternate by another repository.

git-gc --prune will use the "-a" option to repack instead of "-A", so that packed unreachable objects will be removed.

Signed-off-by: Brandon Casey <casey@nrlssc.navy.mil>
---
 builtin-gc.c |   12 +++++++++++-
 1 files changed, 11 insertions(+), 1 deletions(-)
Show changes to builtin-gc.c +11 −1
diff --git a/builtin-gc.c b/builtin-gc.c
index 23ad2b6..6323e0d 100644
--- a/builtin-gc.c
+++ b/builtin-gc.c
@@ -26,7 +26,7 @@ static int gc_auto_pack_limit = 20;
 #define MAX_ADD 10
 static const char *argv_pack_refs[] = {"pack-refs", "--all", "--prune", NULL};
 static const char *argv_reflog[] = {"reflog", "expire", "--all", NULL};
-static const char *argv_repack[MAX_ADD] = {"repack", "-a", "-d", "-l", NULL};
+static const char *argv_repack[MAX_ADD] = {"repack", "-d", "-l", NULL};
 static const char *argv_prune[] = {"prune", NULL};
 static const char *argv_rerere[] = {"rerere", "gc", NULL};
 
@@ -211,6 +211,16 @@ int cmd_gc(int argc, const char **argv, const char *prefix)
 		prune = 0;
 		if (!need_to_gc())
 			return 0;
+	} else {
+		/*
+		 * Use safer (for shared repos) "-A" option to
+		 * repack when not pruning. Auto-gc makes its
+		 * own decision.
+		 */
+		if (prune)
+			append_option(argv_repack, "-a", MAX_ADD);
+		else
+			append_option(argv_repack, "-A", MAX_ADD);
 	}
 
 	if (pack_refs && run_command_v_opt(argv_pack_refs, RUN_GIT_CMD))
-- 
1.5.3.4.208.g729c0
Brandon Casey· Oct 11, 2007, 01:00 UTC · re: Johannes Schindelin · lore

[PATCH] git-gc --auto: simplify "repack" command line building

Since "-a" is removed from the base repack command line, we can simplify how we add additional options to this command line when using --auto.

Signed-off-by: Brandon Casey <casey@nrlssc.navy.mil>
---
 builtin-gc.c |    8 +-------
 1 files changed, 1 insertions(+), 7 deletions(-)
Show changes to builtin-gc.c +1 −7
diff --git a/builtin-gc.c b/builtin-gc.c
index 6323e0d..956c32d 100644
--- a/builtin-gc.c
+++ b/builtin-gc.c
@@ -143,8 +143,6 @@ static int too_many_packs(void)
 
 static int need_to_gc(void)
 {
-	int ac = 0;
-
 	/*
 	 * Setting gc.auto and gc.autopacklimit to 0 or negative can
 	 * disable the automatic gc.
@@ -158,14 +156,10 @@ static int need_to_gc(void)
 	 * 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";
+		append_option(argv_repack, "-A", MAX_ADD);
 	else if (!too_many_loose_objects())
 		return 0;
-	argv_repack[ac++] = "-d";
-	argv_repack[ac++] = "-l";
-	argv_repack[ac++] = NULL;
 	return 1;
 }
 
-- 
1.5.3.4.208.g729c0

← back to recent threads