Merge branch 'jc/ref-excludes'
authorJunio C Hamano <gitster@pobox.com>
Thu, 5 Dec 2013 20:59:09 +0000 (12:59 -0800)
committerJunio C Hamano <gitster@pobox.com>
Thu, 5 Dec 2013 20:59:09 +0000 (12:59 -0800)
People often wished a way to tell "git log --branches" (and "git
log --remotes --not --branches") to exclude some local branches
from the expansion of "--branches" (similarly for "--tags", "--all"
and "--glob=<pattern>"). Now they have one.

* jc/ref-excludes:
rev-parse: introduce --exclude=<glob> to tame wildcards
rev-list --exclude: export add/clear-ref-exclusion and ref-excluded API
rev-list --exclude: tests
document --exclude option
revision: introduce --exclude=<glob> to tame wildcards

1  2 
Documentation/git-rev-parse.txt
Documentation/rev-list-options.txt
builtin/rev-parse.c
revision.c
revision.h
index a436b24cc4068419280e80e0513dec40c383c0c0,4cba660bc85f1be9e8758ea29d0add20aa671e05..0d2cdcde556662d9d858dc282a9fced469814337
@@@ -177,20 -155,32 +177,34 @@@ shown.  If the pattern does not contai
        character (`?`, `*`, or `[`), it is turned into a prefix
        match by appending `/*`.
  
 ---show-toplevel::
 -      Show the absolute path of the top-level directory.
+ --exclude=<glob-pattern>::
+       Do not include refs matching '<glob-pattern>' that the next `--all`,
+       `--branches`, `--tags`, `--remotes`, or `--glob` would otherwise
+       consider. Repetitions of this option accumulate exclusion patterns
+       up to the next `--all`, `--branches`, `--tags`, `--remotes`, or
+       `--glob` option (other options or arguments do not clear
+       accumlated patterns).
+ +
+ The patterns given should not begin with `refs/heads`, `refs/tags`, or
+ `refs/remotes` when applied to `--branches`, `--tags`, or `--remotes`,
+ respectively, and they must begin with `refs/` when applied to `--glob`
+ or `--all`. If a trailing '/{asterisk}' is intended, it must be given
+ explicitly.
 +--disambiguate=<prefix>::
 +      Show every object whose name begins with the given prefix.
 +      The <prefix> must be at least 4 hexadecimal digits long to
 +      avoid listing each and every object in the repository by
 +      mistake.
  
 ---show-prefix::
 -      When the command is invoked from a subdirectory, show the
 -      path of the current directory relative to the top-level
 -      directory.
 +Options for Files
 +~~~~~~~~~~~~~~~~~
  
 ---show-cdup::
 -      When the command is invoked from a subdirectory, show the
 -      path of the top-level directory relative to the current
 -      directory (typically a sequence of "../", or an empty string).
 +--local-env-vars::
 +      List the GIT_* environment variables that are local to the
 +      repository (e.g. GIT_DIR or GIT_WORK_TREE, but not GIT_EDITOR).
 +      Only the names of the variables are listed, not their value,
 +      even if they are set.
  
  --git-dir::
        Show `$GIT_DIR` if defined. Otherwise show the path to
index 2991d70a4a24d10c7f121b766d5f52545414b591,7de3ad5427a971f36fa0f4c78dbf70d9a072672b..03533af7152e8b137cd3d885de3ec273b91d4791
@@@ -153,7 -174,23 +153,22 @@@ parents) and `--max-parents=-1` (negati
        is automatically prepended if missing. If pattern lacks '?', '{asterisk}',
        or '[', '/{asterisk}' at the end is implied.
  
+ --exclude=<glob-pattern>::
+       Do not include refs matching '<glob-pattern>' that the next `--all`,
+       `--branches`, `--tags`, `--remotes`, or `--glob` would otherwise
+       consider. Repetitions of this option accumulate exclusion patterns
+       up to the next `--all`, `--branches`, `--tags`, `--remotes`, or
+       `--glob` option (other options or arguments do not clear
+       accumlated patterns).
+ +
+ The patterns given should not begin with `refs/heads`, `refs/tags`, or
+ `refs/remotes` when applied to `--branches`, `--tags`, or `--remotes`,
+ respectively, and they must begin with `refs/` when applied to `--glob`
+ or `--all`. If a trailing '/{asterisk}' is intended, it must be given
+ explicitly.
  --ignore-missing::
 -
        Upon seeing an invalid object name in the input, pretend as if
        the bad input was not given.
  
index 3e8c4cce060ed4d4bc4ea881f45546d6cffc725c,f52f8048bb7522792312e036a0ed6e92a48c0880..1d9ecafd417cf763d0c33438b74cec28c463ed74
@@@ -30,7 -32,7 +32,8 @@@ static int abbrev_ref
  static int abbrev_ref_strict;
  static int output_sq;
  
 +static int stuck_long;
+ static struct string_list *ref_excludes;
  
  /*
   * Some arguments are relevant "revision" arguments,
@@@ -651,14 -671,13 +662,19 @@@ int cmd_rev_parse(int argc, const char 
                        }
                        if (!strcmp(arg, "--remotes")) {
                                for_each_remote_ref(show_reference, NULL);
+                               clear_ref_exclusion(&ref_excludes);
+                               continue;
+                       }
+                       if (!prefixcmp(arg, "--exclude=")) {
+                               add_ref_exclusion(&ref_excludes, arg + 10);
                                continue;
                        }
 +                      if (!strcmp(arg, "--local-env-vars")) {
 +                              int i;
 +                              for (i = 0; local_repo_env[i]; i++)
 +                                      printf("%s\n", local_repo_env[i]);
 +                              continue;
 +                      }
                        if (!strcmp(arg, "--show-toplevel")) {
                                const char *work_tree = get_git_work_tree();
                                if (work_tree)
diff --cc revision.c
Simple merge
diff --cc revision.h
index 89132df2fa481ce6cdd142fa31f5b2cfd2f43219,c67c46d716dc99a6236b43f15cf8ea2e64772b7b..88967d6a24df852453f93cb7bc466386347b0c45
@@@ -189,11 -190,13 +192,16 @@@ struct rev_info 
  
        /* line level range that we are chasing */
        struct decoration line_log_data;
 +
 +      /* copies of the parent lists, for --full-diff display */
 +      struct saved_parents *saved_parents_slab;
  };
  
+ extern int ref_excluded(struct string_list *, const char *path);
+ void clear_ref_exclusion(struct string_list **);
+ void add_ref_exclusion(struct string_list **, const char *exclude);
  #define REV_TREE_SAME         0
  #define REV_TREE_NEW          1       /* Only new files */
  #define REV_TREE_OLD          2       /* Only files removed */