Merge branch 'js/grep-patterntype-config'
authorJunio C Hamano <gitster@pobox.com>
Mon, 27 Aug 2012 18:55:09 +0000 (11:55 -0700)
committerJunio C Hamano <gitster@pobox.com>
Mon, 27 Aug 2012 18:55:09 +0000 (11:55 -0700)
"grep" learned to use a non-standard pattern type by default if a
configuration variable tells it to.

* js/grep-patterntype-config:
grep: add a grep.patternType configuration setting

1  2 
Documentation/config.txt
t/t7810-grep.sh
diff --combined Documentation/config.txt
index a95e5a4ac9a7e35623ada63d7919b193d7f86a6e,df82d41ae5ec3e12b00dbb28d9a84dad9137af60..6416cae51158a1a960f91a0673c89f67e105f0cc
@@@ -159,10 -159,9 +159,10 @@@ advice.*:
                specified a refspec that isn't your current branch) and
                it resulted in a non-fast-forward error.
        statusHints::
 -              Directions on how to stage/unstage/add shown in the
 -              output of linkgit:git-status[1] and the template shown
 -              when writing commit messages.
 +              Show directions on how to proceed from the current
 +              state in the output of linkgit:git-status[1] and in
 +              the template shown when writing commit messages in
 +              linkgit:git-commit[1].
        commitBeforeMerge::
                Advice shown when linkgit:git-merge[1] refuses to
                merge to avoid overwriting local changes.
@@@ -214,15 -213,6 +214,15 @@@ The default is false, except linkgit:gi
  will probe and set core.ignorecase true if appropriate when the repository
  is created.
  
 +core.precomposeunicode::
 +      This option is only used by Mac OS implementation of git.
 +      When core.precomposeunicode=true, git reverts the unicode decomposition
 +      of filenames done by Mac OS. This is useful when sharing a repository
 +      between Mac OS and Linux or Windows.
 +      (Git for Windows 1.7.10 or higher is needed, or git under cygwin 1.7).
 +      When false, file names are handled fully transparent by git,
 +      which is backward compatible with older versions of git.
 +
  core.trustctime::
        If false, the ctime differences between the index and the
        working tree are ignored; useful when the inode change time
@@@ -496,9 -486,7 +496,9 @@@ core.excludesfile:
        '.git/info/exclude', git looks into this file for patterns
        of files which are not meant to be tracked.  "`~/`" is expanded
        to the value of `$HOME` and "`~user/`" to the specified user's
 -      home directory.  See linkgit:gitignore[5].
 +      home directory. Its default value is $XDG_CONFIG_HOME/git/ignore.
 +      If $XDG_CONFIG_HOME is either not set or empty, $HOME/.config/git/ignore
 +      is used instead. See linkgit:gitignore[5].
  
  core.askpass::
        Some commands (e.g. svn and http interfaces) that interactively
@@@ -513,9 -501,7 +513,9 @@@ core.attributesfile:
        In addition to '.gitattributes' (per-directory) and
        '.git/info/attributes', git looks into this file for attributes
        (see linkgit:gitattributes[5]). Path expansions are made the same
 -      way as for `core.excludesfile`.
 +      way as for `core.excludesfile`. Its default value is
 +      $XDG_CONFIG_HOME/git/attributes. If $XDG_CONFIG_HOME is either not
 +      set or empty, $HOME/.config/git/attributes is used instead.
  
  core.editor::
        Commands such as `commit` and `tag` that lets you edit
@@@ -897,7 -883,7 +897,7 @@@ column.ui:
        make equal size columns
  --
  +
 -      This option defaults to 'never'.
 +This option defaults to 'never'.
  
  column.branch::
        Specify whether to output branch listing in `git branch` in columns.
@@@ -1210,8 -1196,16 +1210,16 @@@ gitweb.snapshot:
  grep.lineNumber::
        If set to true, enable '-n' option by default.
  
+ grep.patternType::
+       Set the default matching behavior. Using a value of 'basic', 'extended',
+       'fixed', or 'perl' will enable the '--basic-regexp', '--extended-regexp',
+       '--fixed-strings', or '--perl-regexp' option accordingly, while the
+       value 'default' will return to the default matching behavior.
  grep.extendedRegexp::
-       If set to true, enable '--extended-regexp' option by default.
+       If set to true, enable '--extended-regexp' option by default. This
+       option is ignored when the 'grep.patternType' option is set to a value
+       other than 'default'.
  
  gpg.program::
        Use this custom program instead of "gpg" found on $PATH when
@@@ -1737,7 -1731,6 +1745,7 @@@ push.default:
        no refspec is implied by any of the options given on the command
        line. Possible values are:
  +
 +--
  * `nothing` - do not push anything.
  * `matching` - push all branches having the same name in both ends.
    This is for those who prepare all the branches into a publishable
    option and is well-suited for beginners. It will become the default
    in Git 2.0.
  * `current` - push the current branch to a branch of the same name.
 -  +
 -  The `simple`, `current` and `upstream` modes are for those who want to
 -  push out a single branch after finishing work, even when the other
 -  branches are not yet ready to be pushed out. If you are working with
 -  other people to push into the same shared repository, you would want
 -  to use one of these.
 +--
 ++
 +The `simple`, `current` and `upstream` modes are for those who want to
 +push out a single branch after finishing work, even when the other
 +branches are not yet ready to be pushed out. If you are working with
 +other people to push into the same shared repository, you would want
 +to use one of these.
  
  rebase.stat::
        Whether to show a diffstat of what changed upstream since the last
diff --combined t/t7810-grep.sh
index 523d04123d02cabb8703f91e9bec194c7d737f00,006fecbe38ae6ea4c0933807e9a87d79e61b3d57..35d357d4c8bdc0ef313a2fc269a9ca81b22489f1
                git -c grep.extendedRegexp=true grep "a+b*c" ab >actual &&
                test_cmp expected actual
        '
+       test_expect_success "grep $L with grep.patterntype=basic" '
+               echo "ab:a+bc" >expected &&
+               git -c grep.patterntype=basic grep "a+b*c" ab >actual &&
+               test_cmp expected actual
+       '
+       test_expect_success "grep $L with grep.patterntype=extended" '
+               echo "ab:abc" >expected &&
+               git -c grep.patterntype=extended grep "a+b*c" ab >actual &&
+               test_cmp expected actual
+       '
+       test_expect_success "grep $L with grep.patterntype=fixed" '
+               echo "ab:a+b*c" >expected &&
+               git -c grep.patterntype=fixed grep "a+b*c" ab >actual &&
+               test_cmp expected actual
+       '
+       test_expect_success LIBPCRE "grep $L with grep.patterntype=perl" '
+               echo "ab:a+b*c" >expected &&
+               git -c grep.patterntype=perl grep "a\x{2b}b\x{2a}c" ab >actual &&
+               test_cmp expected actual
+       '
+       test_expect_success "grep $L with grep.patternType=default and grep.extendedRegexp=true" '
+               echo "ab:abc" >expected &&
+               git \
+                       -c grep.patternType=default \
+                       -c grep.extendedRegexp=true \
+                       grep "a+b*c" ab >actual &&
+               test_cmp expected actual
+       '
+       test_expect_success "grep $L with grep.extendedRegexp=true and grep.patternType=default" '
+               echo "ab:abc" >expected &&
+               git \
+                       -c grep.extendedRegexp=true \
+                       -c grep.patternType=default \
+                       grep "a+b*c" ab >actual &&
+               test_cmp expected actual
+       '
+       test_expect_success 'grep $L with grep.patternType=extended and grep.extendedRegexp=false' '
+               echo "ab:abc" >expected &&
+               git \
+                       -c grep.patternType=extended \
+                       -c grep.extendedRegexp=false \
+                       grep "a+b*c" ab >actual &&
+               test_cmp expected actual
+       '
+       test_expect_success 'grep $L with grep.patternType=basic and grep.extendedRegexp=true' '
+               echo "ab:a+bc" >expected &&
+               git \
+                       -c grep.patternType=basic \
+                       -c grep.extendedRegexp=true \
+                       grep "a+b*c" ab >actual &&
+               test_cmp expected actual
+       '
+       test_expect_success 'grep $L with grep.extendedRegexp=false and grep.patternType=extended' '
+               echo "ab:abc" >expected &&
+               git \
+                       -c grep.extendedRegexp=false \
+                       -c grep.patternType=extended \
+                       grep "a+b*c" ab >actual &&
+               test_cmp expected actual
+       '
+       test_expect_success 'grep $L with grep.extendedRegexp=true and grep.patternType=basic' '
+               echo "ab:a+bc" >expected &&
+               git \
+                       -c grep.extendedRegexp=true \
+                       -c grep.patternType=basic \
+                       grep "a+b*c" ab >actual &&
+               test_cmp expected actual
+       '
  done
  
  cat >expected <<EOF
@@@ -399,6 -477,17 +477,6 @@@ test_expect_success 'grep -q, silently 
        test_cmp empty actual
  '
  
 -# Create 1024 file names that sort between "y" and "z" to make sure
 -# the two files are handled by different calls to an external grep.
 -# This depends on MAXARGS in builtin-grep.c being 1024 or less.
 -c32="0 1 2 3 4 5 6 7 8 9 a b c d e f g h i j k l m n o p q r s t u v"
 -test_expect_success 'grep -C1, hunk mark between files' '
 -      for a in $c32; do for b in $c32; do : >y-$a$b; done; done &&
 -      git add y-?? &&
 -      git grep -C1 "^[yz]" >actual &&
 -      test_cmp expected actual
 -'
 -
  test_expect_success 'grep -C1 hunk mark between files' '
        git grep -C1 "^[yz]" >actual &&
        test_cmp expected actual
@@@ -761,44 -850,147 +839,147 @@@ test_expect_success 'grep -G invalidpat
        test_must_fail git grep -G "a["
  '
  
+ test_expect_success 'grep invalidpattern properly dies with grep.patternType=basic' '
+       test_must_fail git -c grep.patterntype=basic grep "a["
+ '
  test_expect_success 'grep -E invalidpattern properly dies ' '
        test_must_fail git grep -E "a["
  '
  
+ test_expect_success 'grep invalidpattern properly dies with grep.patternType=extended' '
+       test_must_fail git -c grep.patterntype=extended grep "a["
+ '
  test_expect_success LIBPCRE 'grep -P invalidpattern properly dies ' '
        test_must_fail git grep -P "a["
  '
  
+ test_expect_success LIBPCRE 'grep invalidpattern properly dies with grep.patternType=perl' '
+       test_must_fail git -c grep.patterntype=perl grep "a["
+ '
  test_expect_success 'grep -G -E -F pattern' '
        echo "ab:a+b*c" >expected &&
        git grep -G -E -F "a+b*c" ab >actual &&
        test_cmp expected actual
  '
  
+ test_expect_success 'grep pattern with grep.patternType=basic, =extended, =fixed' '
+       echo "ab:a+b*c" >expected &&
+       git \
+               -c grep.patterntype=basic \
+               -c grep.patterntype=extended \
+               -c grep.patterntype=fixed \
+               grep "a+b*c" ab >actual &&
+       test_cmp expected actual
+ '
  test_expect_success 'grep -E -F -G pattern' '
        echo "ab:a+bc" >expected &&
        git grep -E -F -G "a+b*c" ab >actual &&
        test_cmp expected actual
  '
  
+ test_expect_success 'grep pattern with grep.patternType=extended, =fixed, =basic' '
+       echo "ab:a+bc" >expected &&
+       git \
+               -c grep.patterntype=extended \
+               -c grep.patterntype=fixed \
+               -c grep.patterntype=basic \
+               grep "a+b*c" ab >actual &&
+       test_cmp expected actual
+ '
  test_expect_success 'grep -F -G -E pattern' '
        echo "ab:abc" >expected &&
        git grep -F -G -E "a+b*c" ab >actual &&
        test_cmp expected actual
  '
  
+ test_expect_success 'grep pattern with grep.patternType=fixed, =basic, =extended' '
+       echo "ab:abc" >expected &&
+       git \
+               -c grep.patterntype=fixed \
+               -c grep.patterntype=basic \
+               -c grep.patterntype=extended \
+               grep "a+b*c" ab >actual &&
+       test_cmp expected actual
+ '
  test_expect_success 'grep -G -F -P -E pattern' '
        >empty &&
        test_must_fail git grep -G -F -P -E "a\x{2b}b\x{2a}c" ab >actual &&
        test_cmp empty actual
  '
  
+ test_expect_success 'grep pattern with grep.patternType=fixed, =basic, =perl, =extended' '
+       >empty &&
+       test_must_fail git \
+               -c grep.patterntype=fixed \
+               -c grep.patterntype=basic \
+               -c grep.patterntype=perl \
+               -c grep.patterntype=extended \
+               grep "a\x{2b}b\x{2a}c" ab >actual &&
+       test_cmp empty actual
+ '
  test_expect_success LIBPCRE 'grep -G -F -E -P pattern' '
        echo "ab:a+b*c" >expected &&
        git grep -G -F -E -P "a\x{2b}b\x{2a}c" ab >actual &&
        test_cmp expected actual
  '
  
+ test_expect_success LIBPCRE 'grep pattern with grep.patternType=fixed, =basic, =extended, =perl' '
+       echo "ab:a+b*c" >expected &&
+       git \
+               -c grep.patterntype=fixed \
+               -c grep.patterntype=basic \
+               -c grep.patterntype=extended \
+               -c grep.patterntype=perl \
+               grep "a\x{2b}b\x{2a}c" ab >actual &&
+       test_cmp expected actual
+ '
+ test_expect_success LIBPCRE 'grep -P pattern with grep.patternType=fixed' '
+       echo "ab:a+b*c" >expected &&
+       git \
+               -c grep.patterntype=fixed \
+               grep -P "a\x{2b}b\x{2a}c" ab >actual &&
+       test_cmp expected actual
+ '
+ test_expect_success 'grep -F pattern with grep.patternType=basic' '
+       echo "ab:a+b*c" >expected &&
+       git \
+               -c grep.patterntype=basic \
+               grep -F "*c" ab >actual &&
+       test_cmp expected actual
+ '
+ test_expect_success 'grep -G pattern with grep.patternType=fixed' '
+       {
+               echo "ab:a+b*c"
+               echo "ab:a+bc"
+       } >expected &&
+       git \
+               -c grep.patterntype=fixed \
+               grep -G "a+b" ab >actual &&
+       test_cmp expected actual
+ '
+ test_expect_success 'grep -E pattern with grep.patternType=fixed' '
+       {
+               echo "ab:a+b*c"
+               echo "ab:a+bc"
+               echo "ab:abc"
+       } >expected &&
+       git \
+               -c grep.patterntype=fixed \
+               grep -E "a+" ab >actual &&
+       test_cmp expected actual
+ '
  test_config() {
        git config "$1" "$2" &&
        test_when_finished "git config --unset $1"