Derrick Stolee <sto...@gmail.com> writes:

> +static int graph_write(int argc, const char **argv)
> +{
> + ...
> +     graph_name = write_commit_graph(opts.obj_dir);
> +
> +     if (graph_name) {
> +             printf("%s\n", graph_name);
> +             FREE_AND_NULL(graph_name);
> +     }
> +
> +     return 0;
> +}

After successfully writing a graph file out, write_commit_graph()
signals that fact by returning a non-NULL pointer, so that this
caller can report the filename to the end user.  This caller
protects itself from a NULL return, presumably because the callee
uses it to signal an error when writing the graph file out?  

Is it OK to lose that 1-bit of information, or should we have more like

        if (graph_name) {
                printf;
                return 0;
        } else {
                return -1;
        }

>  int cmd_commit_graph(int argc, const char **argv, const char *prefix)
>  {
>       static struct option builtin_commit_graph_options[] = {
> -             { OPTION_STRING, 'p', "object-dir", &opts.obj_dir,
> +             { OPTION_STRING, 'o', "object-dir", &opts.obj_dir,
>                       N_("dir"),
>                       N_("The object directory to store the graph") },
>               OPT_END(),

The same comment for a no-op patch from an earlier step applies
here, and we have another one that we saw above in graph_write().

> @@ -31,6 +67,11 @@ int cmd_commit_graph(int argc, const char **argv, const 
> char *prefix)
>                            builtin_commit_graph_usage,
>                            PARSE_OPT_STOP_AT_NON_OPTION);
>  
> +     if (argc > 0) {
> +             if (!strcmp(argv[0], "write"))
> +                     return graph_write(argc, argv);

And if we fix "graph_write" to report an error with negative return,
this needs to become something like

                return !!graph_write(argc, argv);

as we do not want to return a negative value to be passed via
run_builtin() to exit(3) in handle_builtin().

> diff --git a/t/t5318-commit-graph.sh b/t/t5318-commit-graph.sh
> new file mode 100755
> index 0000000..6a5e93c
> --- /dev/null
> +++ b/t/t5318-commit-graph.sh
> @@ -0,0 +1,119 @@
> +#!/bin/sh
> +
> +test_description='commit graph'
> +. ./test-lib.sh
> +
> +test_expect_success 'setup full repo' '
> +     rm -rf .git &&

I am perfectly OK with creating a separate subdirectory called
'full' in the trash directory given by the test framework, but
unless absolutely necessary I'd rather not to see "rm -rf", 
especially on ".git", in our test scripts.  People can screw up
doing various things (like copying and pasting).

> +     mkdir full &&
> +     cd full &&
> +     git init &&
> +     objdir=".git/objects"
> +'

And I absolutely do not want to see "cd full" that leaves and stays
in the subdirectory after this step is done.  

Imagine what happens if any earlier step fails before doing "cd
full", causing this "setup full" step to report failure, and then
the test goes on to the next step?  We will not be in "full" and
worse yet because we do not have "$TRASH_DIRECTORY/.git" (you
removed it), the "git commit-graph write --object-dir" command we
end up doing next will see the git source repository as the
repository it is working on.  Never risk trashing our source
repository with your test.  That is why we give you $TRASH_DIRECTORY
to play in.  Make use of it when you can.

I'd make this step just a single

        git init full

and then the next one

        git -C full commit-graph write --object-dir .

In later tests that have multi-step things, I'd instead make them

        (
                cd full &&
                ... whatever you do  &&
                ... in that separate  &&
                ... 'full' repository
        )

if I were writing this test *and* if I really wanted to do things
inside $TRASH_DIRECTORY/full/.git repository.  I am not convinced
yet about the latter.  I know that it will make certain things
simpler to use a separate /full hierarchy (e.g. cleaning up, having
another unrelated test repository, etc.) while making other things
more cumbersome (e.g. you need to be careful when you "cd" and the
easiest way to do so is to ( do things in a subshell )).  I just do
not know what the trade-off would look like in this particular case.

A simple rule of thumb I try to follow is not to change $(pwd) for
the process that runs these test_expect_success shell functions.

> +
> +test_expect_success 'write graph with no packs' '
> +     git commit-graph write --object-dir .
> +'
> +
> +test_expect_success 'create commits and repack' '
> +     for i in $(test_seq 3)
> +     do
> +             test_commit $i &&
> +             git branch commits/$i
> +     done &&
> +     git repack
> +'

Reply via email to