I have now patched Git to hide my local tags from git describe.
I am intentionally not sending this to the git mailing list
because I'm not sure I can satisfy their Signed-Off-By
requirements right away.  The "Modified on" comments are for
GPLv2 clause 2. a).


Add describe.ignoretags config variable

In my elinks.git repository, I have many annotated tags that do not
correspond to ELinks releases.  For example, a tag called
email/elinks-users/2007-07-30 refers to a commit that I posted as
a patch to elinks-users on 2007-07-30; the tag object contains the
Message-ID and some other email headers.  These tags were affecting
the result of "git describe" called by a Makefile.  Now I can
prevent that by setting describe.ignoretags in elinks.git/config.

In Git 1.5.5 and later, it was already possible to limit the set
of tags considered, with git describe --match=PATTERN.  To match
"elinks-0.11.4" and "elinks-0.12pre1", we could use
--match="elinks-*".  However, the naming scheme has been changed
in the past (from e.g. REL_0_10_6) and may be changed again in the
future.  Besides, ignoring the email tags is what I want for
interactive use of git describe as well.

There are no new tests in this commit.

---
commit c97654d02a95e6701481204121a4f4c59e8f3088
tree 9abf39a8d8dca5308ae77923702606bf630778b1
parent 71b9979bc74b66c1cf961d5c74de5c0b3cbf00a4
author Kalle Olavi Niemitalo <[EMAIL PROTECTED]> Sun, 10 Aug 2008 17:56:45 +0300
committer Kalle Olavi Niemitalo <[EMAIL PROTECTED]> Sun, 10 Aug 2008 17:56:45 
+0300

 Documentation/config.txt       |   11 +++++++++++
 Documentation/git-describe.txt |    5 ++++-
 builtin-describe.c             |   29 ++++++++++++++++++++++++++++-
 3 files changed, 43 insertions(+), 2 deletions(-)

diff --git a/Documentation/config.txt b/Documentation/config.txt
index b8ec01c..c9270b5 100644
--- a/Documentation/config.txt
+++ b/Documentation/config.txt
@@ -1,3 +1,5 @@
+// Modified on 2008-08-10 by Kalle Olavi Niemitalo
+
 CONFIGURATION FILE
 ------------------
 
@@ -557,6 +559,15 @@ color.ui::
        terminal. When more specific variables of color.* are set, they always
        take precedence over this setting. Defaults to false.
 
+describe.excludetags::
+       Makes 'git-describe' ignore tags that match a pattern.  Some
+       programs call 'git-describe' at build time and display the
+       result as a version number; if you have made some annotated
+       tags for your local use, set this option to prevent them from
+       affecting the displayed version number.  The value should be a
+       pattern of tag names, e.g. `local/*`.  You can set this option
+       multiple times.
+
 diff.autorefreshindex::
        When using 'git-diff' to compare with work tree
        files, do not consider stat-only change as changed.
diff --git a/Documentation/git-describe.txt b/Documentation/git-describe.txt
index c4dbc2a..33a923e 100644
--- a/Documentation/git-describe.txt
+++ b/Documentation/git-describe.txt
@@ -68,7 +68,9 @@ OPTIONS
 
 --match <pattern>::
        Only consider tags matching the given pattern (can be used to avoid
-       leaking private tags made from the repository).
+       leaking private tags made from the repository).  Alternatively,
+       you could set the describe.excludetags configuration variable;
+       see linkgit:git-config[1] for details.
 
 --always::
        Show uniquely abbreviated commit object as fallback.
@@ -138,6 +140,7 @@ Author
 Written by Linus Torvalds <[EMAIL PROTECTED]>, but somewhat
 butchered by Junio C Hamano <[EMAIL PROTECTED]>.  Later significantly
 updated by Shawn Pearce <[EMAIL PROTECTED]>.
+Modified on 2008-08-10 by Kalle Olavi Niemitalo.
 
 Documentation
 --------------
diff --git a/builtin-describe.c b/builtin-describe.c
index ec404c8..4367ab9 100644
--- a/builtin-describe.c
+++ b/builtin-describe.c
@@ -1,3 +1,5 @@
+/* Modified on 2008-08-10 by Kalle Olavi Niemitalo */
+
 #include "cache.h"
 #include "commit.h"
 #include "tag.h"
@@ -5,6 +7,7 @@
 #include "builtin.h"
 #include "exec_cmd.h"
 #include "parse-options.h"
+#include "string-list.h"
 
 #define SEEN           (1u<<0)
 #define MAX_TAGS       (FLAG_BITS - 1)
@@ -22,6 +25,28 @@ static int abbrev = DEFAULT_ABBREV;
 static int max_candidates = 10;
 static const char *pattern;
 static int always;
+static struct string_list exclude_patterns = { .strdup_strings = 1 };
+
+static int git_describe_config(const char *var, const char *value, void *cb)
+{
+       if (!strcmp(var, "describe.excludetags")) {
+               if (!value)
+                       return config_error_nonbool(var);
+               string_list_append(value, &exclude_patterns);
+               return 0;
+       }
+       return git_default_config(var, value, cb);
+}
+
+static int matches_any_exclude_pattern(const char *tagname)
+{
+       unsigned int i;
+
+       for (i = 0; i < exclude_patterns.nr; i++)
+               if (!fnmatch(exclude_patterns.items[i].string, tagname, 0))
+                       return 1;
+       return 0;
+}
 
 struct commit_name {
        struct tag *tag;
@@ -85,7 +110,8 @@ static int get_name(const char *path, const unsigned char 
*sha1, int flag, void
                else
                        prio = 1;
 
-               if (pattern && fnmatch(pattern, path + 10, 0))
+               if ((pattern && fnmatch(pattern, path + 10, 0))
+                   || matches_any_exclude_pattern(path + 10))
                        prio = 0;
        }
        else
@@ -324,6 +350,7 @@ int cmd_describe(int argc, const char **argv, const char 
*prefix)
                OPT_END(),
        };
 
+       git_config(git_describe_config, NULL);
        argc = parse_options(argc, argv, options, describe_usage, 0);
        if (max_candidates < 0)
                max_candidates = 0;

Attachment: pgpkxYMTDLQWW.pgp
Description: PGP signature

_______________________________________________
elinks-dev mailing list
elinks-dev@linuxfromscratch.org
http://linuxfromscratch.org/mailman/listinfo/elinks-dev

Reply via email to