Re: [PATCH v2] builtin/describe: introduce --broken flag

2017-03-22 Thread Jakub Narębski
W dniu 21.03.2017 o 23:57, Stefan Beller pisze:

> --- a/Documentation/git-describe.txt
> +++ b/Documentation/git-describe.txt
> @@ -30,9 +30,14 @@ OPTIONS
>   Commit-ish object names to describe.  Defaults to HEAD if omitted.
>  
>  --dirty[=]::
> - Describe the working tree.
> - It means describe HEAD and appends  (`-dirty` by
> - default) if the working tree is dirty.
> +--broken[=]::
> + Describe the state of the working tree.  When the working
> + tree matches HEAD, the output is the same as "git describe
> + HEAD".  If the working tree has local modification "-dirty"
> + is appended to it.  If a repository is corrupt and Git
> + cannot determine if there is local modification, Git will
> + error out, unless `--broken' is given, which appends
> + the suffix "-broken" instead.

The common description reads better... but unfortunately it lost
information about the optional parameter, namely .  The
'-dirty' is just the default for , and '-broken' is
the default for .

Maybe /the suffix "-broken"/ suffix ('-broken' by default)/
and similarly for "-dirty"?

Best,
-- 
Jakub Narębski



Re: [PATCH v2] builtin/describe: introduce --broken flag

2017-03-22 Thread Junio C Hamano
Stefan Beller  writes:

> git-describe tells you the version number you're at, or errors out, e.g.
> when you run it outside of a repository, which may happen when downloading
> a tar ball instead of using git to obtain the source code.
>
> To keep this property of only erroring out, when not in a repository,
> severe (submodule) errors must be downgraded to reporting them gently
> instead of having git-describe error out completely.
>
> To achieve that a flag '--broken' is introduced, which is in the same
> vein as '--dirty' but uses an actual child process to check for dirtiness.
> When that child dies unexpectedly, we'll append '-broken' instead of
> '-dirty'.
>
> Signed-off-by: Stefan Beller 
> ---
>  Documentation/git-describe.txt | 11 +++---
>  builtin/describe.c | 47 
> ++
>  t/t6120-describe.sh| 20 ++
>  3 files changed, 66 insertions(+), 12 deletions(-)

I admit that my suggestion to use pushv() was done without trying it
out myself, but I do agree that the result looks better, especially
because the "dirty" (not "broken") side does not even have to use a
separate argv_array to prepare the command line in the first place
(which I failed to spot exactly because I didn't try it myself ;-).

We probably _could_ use cp.argv to point at the diff_index_args()
without doing pushv(), and that would save a bit of
allocation, but it would not matter in practice as this is not a
performance critical codepath.

Thanks.
> diff --git a/t/t6120-describe.sh b/t/t6120-describe.sh
> index 167491fd5b..16952e44fc 100755
> --- a/t/t6120-describe.sh
> +++ b/t/t6120-describe.sh
> @@ -233,4 +233,24 @@ test_expect_success 'describe --contains and --no-match' 
> '
>   test_cmp expect actual
>  '
>  
> +test_expect_success 'setup and absorb a submodule' '
> + test_create_repo sub1 &&
> + test_commit -C sub1 initial &&
> + git submodule add ./sub1 &&
> + git submodule absorbgitdirs &&
> + git commit -a -m "add submodule" &&
> + git describe --dirty >expect &&
> + git describe --broken >out &&
> + test_cmp expect out
> +'
> +
> +test_expect_success 'describe chokes on severly broken submodules' '
> + mv .git/modules/sub1/ .git/modules/sub_moved &&
> + test_must_fail git describe --dirty
> +'
> +test_expect_success 'describe ignoring a borken submodule' '
> + git describe --broken >out &&
> + grep broken out
> +'
> +
>  test_done


[PATCH v2] builtin/describe: introduce --broken flag

2017-03-21 Thread Stefan Beller
git-describe tells you the version number you're at, or errors out, e.g.
when you run it outside of a repository, which may happen when downloading
a tar ball instead of using git to obtain the source code.

To keep this property of only erroring out, when not in a repository,
severe (submodule) errors must be downgraded to reporting them gently
instead of having git-describe error out completely.

To achieve that a flag '--broken' is introduced, which is in the same
vein as '--dirty' but uses an actual child process to check for dirtiness.
When that child dies unexpectedly, we'll append '-broken' instead of
'-dirty'.

Signed-off-by: Stefan Beller 
---
 Documentation/git-describe.txt | 11 +++---
 builtin/describe.c | 47 ++
 t/t6120-describe.sh| 20 ++
 3 files changed, 66 insertions(+), 12 deletions(-)

diff --git a/Documentation/git-describe.txt b/Documentation/git-describe.txt
index 8755f3af7b..26f19d3b07 100644
--- a/Documentation/git-describe.txt
+++ b/Documentation/git-describe.txt
@@ -30,9 +30,14 @@ OPTIONS
Commit-ish object names to describe.  Defaults to HEAD if omitted.
 
 --dirty[=]::
-   Describe the working tree.
-   It means describe HEAD and appends  (`-dirty` by
-   default) if the working tree is dirty.
+--broken[=]::
+   Describe the state of the working tree.  When the working
+   tree matches HEAD, the output is the same as "git describe
+   HEAD".  If the working tree has local modification "-dirty"
+   is appended to it.  If a repository is corrupt and Git
+   cannot determine if there is local modification, Git will
+   error out, unless `--broken' is given, which appends
+   the suffix "-broken" instead.
 
 --all::
Instead of using only the annotated tags, use any ref
diff --git a/builtin/describe.c b/builtin/describe.c
index 76c18059bf..45adbf67d5 100644
--- a/builtin/describe.c
+++ b/builtin/describe.c
@@ -9,6 +9,7 @@
 #include "diff.h"
 #include "hashmap.h"
 #include "argv-array.h"
+#include "run-command.h"
 
 #define SEEN   (1u << 0)
 #define MAX_TAGS   (FLAG_BITS - 1)
@@ -31,7 +32,7 @@ static int have_util;
 static struct string_list patterns = STRING_LIST_INIT_NODUP;
 static struct string_list exclude_patterns = STRING_LIST_INIT_NODUP;
 static int always;
-static const char *dirty;
+static const char *suffix, *dirty, *broken;
 
 /* diff-index command arguments to check if working tree is dirty. */
 static const char *diff_index_args[] = {
@@ -292,8 +293,8 @@ static void describe(const char *arg, int last_one)
display_name(n);
if (longformat)
show_suffix(0, n->tag ? >tag->tagged->oid : );
-   if (dirty)
-   printf("%s", dirty);
+   if (suffix)
+   printf("%s", suffix);
printf("\n");
return;
}
@@ -369,8 +370,8 @@ static void describe(const char *arg, int last_one)
struct object_id *oid = >object.oid;
if (always) {
printf("%s", find_unique_abbrev(oid->hash, abbrev));
-   if (dirty)
-   printf("%s", dirty);
+   if (suffix)
+   printf("%s", suffix);
printf("\n");
return;
}
@@ -413,8 +414,8 @@ static void describe(const char *arg, int last_one)
display_name(all_matches[0].name);
if (abbrev)
show_suffix(all_matches[0].depth, >object.oid);
-   if (dirty)
-   printf("%s", dirty);
+   if (suffix)
+   printf("%s", suffix);
printf("\n");
 
if (!last_one)
@@ -445,6 +446,9 @@ int cmd_describe(int argc, const char **argv, const char 
*prefix)
{OPTION_STRING, 0, "dirty",  , N_("mark"),
N_("append  on dirty working tree (default: 
\"-dirty\")"),
PARSE_OPT_OPTARG, NULL, (intptr_t) "-dirty"},
+   {OPTION_STRING, 0, "broken",  , N_("mark"),
+   N_("append  on broken working tree (default: 
\"-broken\")"),
+   PARSE_OPT_OPTARG, NULL, (intptr_t) "-broken"},
OPT_END(),
};
 
@@ -493,7 +497,28 @@ int cmd_describe(int argc, const char **argv, const char 
*prefix)
die(_("No names found, cannot describe anything."));
 
if (argc == 0) {
-   if (dirty) {
+   if (broken) {
+   struct child_process cp = CHILD_PROCESS_INIT;
+   argv_array_pushv(, diff_index_args);
+   cp.git_cmd = 1;
+   cp.no_stdin = 1;
+   cp.no_stdout = 1;
+
+   if (!dirty)
+   dirty = "-dirty";