From: Junio C Hamano <hidden> Date: 2016-06-15 22:42:59
Johannes Schindelin [off-list ref] writes:
And instead of die()ing, I'd rather do something like
return (pack_refs || run_command_v_opt(argv_pack_refs, RUN_GIT_CMD) &&
run_command_v_opt(argv_reflog_expire, RUN_GIT_CMD) &&
run_command_v_opt(argv_repack, RUN_GIT_CMD) &&
(prune || run_command_v_opt(argv_prune, RUN_GIT_CMD) &&
run_command_v_opt(argv_rerere, RUN_GIT_CMD);
Gaaaaaaaah.
That may be valid C, but please do that as a sequence of
separate statements.
if (we are told to pack-refs)
if (try to pack refs and find error)
goto failure;
if (try to reflog expire and find error)
goto failure;
...
return Ok;
failure:
return Error;
From: Johannes Schindelin <hidden> Date: 2016-06-15 22:42:59
Hi,
On Sun, 11 Mar 2007, Junio C Hamano wrote:
Johannes Schindelin [off-list ref] writes:
quoted
And instead of die()ing, I'd rather do something like
return (pack_refs || run_command_v_opt(argv_pack_refs, RUN_GIT_CMD) &&
run_command_v_opt(argv_reflog_expire, RUN_GIT_CMD) &&
run_command_v_opt(argv_repack, RUN_GIT_CMD) &&
(prune || run_command_v_opt(argv_prune, RUN_GIT_CMD) &&
run_command_v_opt(argv_rerere, RUN_GIT_CMD);
Gaaaaaaaah.
That may be valid C,
Actually, it is not. As usual, I fscked up: run_command_v_opt() is
supposed to return 0 on _success_, so all the "&&" should be "||", and all
the "||" should be "&&".
if (we are told to pack-refs)
if (try to pack refs and find error)
goto failure;
I find this not very elegant. Instead, I'd do
if (do_pack_refs && run_comand_v_opt(argv_pack_refs, RUN_GIT_CMD))
return error("Could not run pack-refs.");
It does not only avoid the evil goto, but uses the screen estate for some
nice error messages so that the user is not left out in the cold when
something is wrong.
Ciao,
Dscho
Gaaah. How about some curly braces around the then part of that
first if?
Actually, we typically just write this more like:
static int gc_config(const char *var, const char *value)
{
if (!strcmp(var, "gc.packrefs")) {
if (!strcmp(value, "notbare"))
pack_refs = -1;
else
pack_refs = git_config_bool(var, value);
}
return git_default_config(var, value);
}
if (pack_refs < 0)
pack_refs = !is_bare_repository();
The is_bare_repository function guesses until the configuration
is done parsing; once the configuration has been parsed it has a
definate answer one way or the other. So what I'm suggesting you
do here is set pack_refs = -1 to mean use the is_bare_repository
setting, otherwise it stays what it was set to.
+ if (pack_refs)
+ if (run_command_v_opt(argv_pack_refs, RUN_GIT_CMD))
+ goto failure;
....
+ if (prune)
+ if (run_command_v_opt(argv_prune, RUN_GIT_CMD))
+ goto failure;
Gaah. Tabs-vs-spaces, not to mention that these aren't even lining
up the same way. I too prefer what Dsco suggested already:
if (prune && run_command_v_opt(argv_prune, RUN_GIT_CMD))
return error("failed to run %s", argv_prune[0]);
--
Shawn.
From: James Bowes <hidden> Date: 2016-06-15 22:42:59
Signed-off-by: James Bowes <redacted>
---
Take 3. The changes are pretty much all of Shawn's suggestions. If a command
fails this code just returns -1, rather than calling error(), so that two
duplicate error messages aren't printed out.
-James
Makefile | 3 +-
builtin-gc.c | 76 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
builtin.h | 1 +
git-gc.sh | 37 ----------------------------
git.c | 1 +
5 files changed, 80 insertions(+), 38 deletions(-)
create mode 100644 builtin-gc.c
delete mode 100755 git-gc.sh
From: Johannes Schindelin <hidden> Date: 2016-06-15 22:42:59
Hi,
On Tue, 13 Mar 2007, James Bowes wrote:
Take 3. The changes are pretty much all of Shawn's suggestions. If a
command fails this code just returns -1, rather than calling error(), so
that two duplicate error messages aren't printed out.
If you say "return error(...);", there is _no_ way that multiple error
messages are printed out.
If you say "return -1;", however, the user is likely to _never_ know that
git-gc failed. (I, for one, do not check $? after running a program which
does not say _anything_.)
Ciao,
Dscho
From: Brian Gernhardt <hidden> Date: 2016-06-15 22:42:59
On Mar 13, 2007, at 9:05 PM, Johannes Schindelin wrote:
If you say "return error(...);", there is _no_ way that multiple error
messages are printed out.
Except that cmd_gc() is littered with run_command* calls, which fork
off a subprocess to do the heavy lifting. So if git-repack fails an
error will be printed by that process, making the error() call
redundant. (If I'm understanding things correctly.)
~~ Brian
From: James Bowes <hidden> Date: 2016-06-15 22:42:59
Signed-off-by: James Bowes <redacted>
---
On 3/13/07, Johannes Schindelin [off-list ref] wrote:
If you say "return error(...);", there is _no_ way that multiple error
messages are printed out.
Yeah, I wasn't testing well enough. If you pass the name of a non-existant
command to run_command, then it will print out a message about not being able
to exec. That's not going to help when the command runs but does something bad.
So here's the patch with error().
-James
Makefile | 3 +-
builtin-gc.c | 78 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
builtin.h | 1 +
git-gc.sh | 37 ---------------------------
git.c | 1 +
5 files changed, 82 insertions(+), 38 deletions(-)
create mode 100644 builtin-gc.c
delete mode 100755 git-gc.sh
@@ -0,0 +1,78 @@+/*+*gitgcbuiltincommand+*+*Cleanupunreachablefilesandoptimizetherepository.+*+*Copyright(c)2007JamesBowes+*+*Basedongit-gc.sh,whichis+*+*Copyright(c)2006ShawnO.Pearce+*/++#include"cache.h"+#include"run-command.h"++#define FAILED_RUN "failed to run %s"++staticconstcharbuiltin_gc_usage[]="git-gc [--prune]";++staticintpack_refs=-1;++staticconstchar*argv_pack_refs[]={"pack-refs","--prune",NULL};+staticconstchar*argv_reflog[]={"reflog","expire","--all",NULL};+staticconstchar*argv_repack[]={"repack","-a","-d","-l",NULL};+staticconstchar*argv_prune[]={"prune",NULL};+staticconstchar*argv_rerere[]={"rerere","gc",NULL};++staticintgc_config(constchar*var,constchar*value)+{+if(!strcmp(var,"gc.packrefs")){+if(!strcmp(value,"notbare"))+pack_refs=-1;+else+pack_refs=git_config_bool(var,value);+return0;+}+returngit_default_config(var,value);+}++intcmd_gc(intargc,constchar**argv,constchar*prefix)+{+inti;+intprune=0;++git_config(gc_config);++if(pack_refs<0)+pack_refs=!is_bare_repository();++for(i=1;i<argc;i++){+constchar*arg=argv[i];+if(!strcmp(arg,"--prune")){+prune=1;+continue;+}+/* perhaps other parameters later... */+break;+}+if(i!=argc)+usage(builtin_gc_usage);++if(pack_refs&&run_command_v_opt(argv_pack_refs,RUN_GIT_CMD))+returnerror(FAILED_RUN,argv_pack_refs[0]);++if(run_command_v_opt(argv_reflog,RUN_GIT_CMD))+returnerror(FAILED_RUN,argv_reflog[0]);++if(run_command_v_opt(argv_repack,RUN_GIT_CMD))+returnerror(FAILED_RUN,argv_repack[0]);++if(prune&&run_command_v_opt(argv_prune,RUN_GIT_CMD))+returnerror(FAILED_RUN,argv_prune[0]);++if(run_command_v_opt(argv_rerere,RUN_GIT_CMD))+returnerror(FAILED_RUN,argv_rerere[0]);++return0;+}