Merge branch 'ab/grep-preparatory-cleanup' into sb/submodule-blanket-recursive
authorJunio C Hamano <gitster@pobox.com>
Tue, 30 May 2017 05:27:37 +0000 (14:27 +0900)
committerJunio C Hamano <gitster@pobox.com>
Tue, 30 May 2017 05:28:41 +0000 (14:28 +0900)
* ab/grep-preparatory-cleanup: (31 commits)
grep: assert that threading is enabled when calling grep_{lock,unlock}
grep: given --threads with NO_PTHREADS=YesPlease, warn
pack-objects: fix buggy warning about threads
pack-objects & index-pack: add test for --threads warning
test-lib: add a PTHREADS prerequisite
grep: move is_fixed() earlier to avoid forward declaration
grep: change internal *pcre* variable & function names to be *pcre1*
grep: change the internal PCRE macro names to be PCRE1
grep: factor test for \0 in grep patterns into a function
grep: remove redundant regflags assignments
grep: catch a missing enum in switch statement
perf: add a comparison test of log --grep regex engines with -F
perf: add a comparison test of log --grep regex engines
perf: add a comparison test of grep regex engines with -F
perf: add a comparison test of grep regex engines
perf: emit progress output when unpacking & building
perf: add a GIT_PERF_MAKE_COMMAND for when *_MAKE_OPTS won't do
grep: add tests to fix blind spots with \0 patterns
grep: prepare for testing binary regexes containing rx metacharacters
grep: add a test helper function for less verbose -f \0 tests
...

1  2 
builtin/pack-objects.c
revision.c
t/t4202-log.sh
t/test-lib.sh
diff --combined builtin/pack-objects.c
index 9b4ba8a80d7f0ac160467138507358f164b7af3e,f1baf05dfe31dc9bbb91c1b6ff44c123fa1b3d38..efa21a15dd939075af0525dcd7e6646ac453999a
@@@ -44,7 -44,7 +44,7 @@@ static uint32_t nr_result, nr_written
  static int non_empty;
  static int reuse_delta = 1, reuse_object = 1;
  static int keep_unreachable, unpack_unreachable, include_tag;
 -static unsigned long unpack_unreachable_expiration;
 +static timestamp_t unpack_unreachable_expiration;
  static int pack_loose_unreachable;
  static int local;
  static int have_non_local_packs;
@@@ -2472,8 -2472,10 +2472,10 @@@ static int git_pack_config(const char *
                        die("invalid number of threads specified (%d)",
                            delta_search_threads);
  #ifdef NO_PTHREADS
-               if (delta_search_threads != 1)
+               if (delta_search_threads != 1) {
                        warning("no threads support, ignoring %s", k);
+                       delta_search_threads = 0;
+               }
  #endif
                return 0;
        }
@@@ -2675,7 -2677,7 +2677,7 @@@ static int has_sha1_pack_kept_or_nonloc
  static struct oid_array recent_objects;
  
  static int loosened_object_can_be_discarded(const struct object_id *oid,
 -                                          unsigned long mtime)
 +                                          timestamp_t mtime)
  {
        if (!unpack_unreachable_expiration)
                return 0;
diff --combined revision.c
index 8a8c1789c7bc275db852b6e89a1d3acef3417371,c96265d89dea5f1df6094621e68a164239e4f9f6..4883cdd2d018b1dc3767ec30a14eac7d6ff84353
@@@ -884,7 -884,7 +884,7 @@@ static void cherry_pick_list(struct com
  /* How many extra uninteresting commits we want to see.. */
  #define SLOP 5
  
 -static int still_interesting(struct commit_list *src, unsigned long date, int slop,
 +static int still_interesting(struct commit_list *src, timestamp_t date, int slop,
                             struct commit **interesting_cache)
  {
        /*
@@@ -1018,7 -1018,7 +1018,7 @@@ static void limit_left_right(struct com
  static int limit_list(struct rev_info *revs)
  {
        int slop = SLOP;
 -      unsigned long date = ~0ul;
 +      timestamp_t date = TIME_MAX;
        struct commit_list *list = revs->commits;
        struct commit_list *newlist = NULL;
        struct commit_list **p = &newlist;
@@@ -1215,7 -1215,7 +1215,7 @@@ static void handle_one_reflog_commit(st
  }
  
  static int handle_one_reflog_ent(struct object_id *ooid, struct object_id *noid,
 -              const char *email, unsigned long timestamp, int tz,
 +              const char *email, timestamp_t timestamp, int tz,
                const char *message, void *cb_data)
  {
        handle_one_reflog_commit(ooid, cb_data);
@@@ -1991,6 -1991,7 +1991,7 @@@ static int handle_revision_opt(struct r
        } else if (!strcmp(arg, "--extended-regexp") || !strcmp(arg, "-E")) {
                revs->grep_filter.pattern_type_option = GREP_PATTERN_TYPE_ERE;
        } else if (!strcmp(arg, "--regexp-ignore-case") || !strcmp(arg, "-i")) {
+               revs->grep_filter.ignore_case = 1;
                revs->grep_filter.regflags |= REG_ICASE;
                DIFF_OPT_SET(&revs->diffopt, PICKAXE_IGNORE_CASE);
        } else if (!strcmp(arg, "--fixed-strings") || !strcmp(arg, "-F")) {
diff --combined t/t4202-log.sh
index 1c7d6729c699dc8c8784d19659551df24530bd05,dbed3efeeeeee6ecb4c6cbe7848c18bd684bb2e1..c44c4337f8fc5c5c1631cbbfe2b5528b88834b87
@@@ -231,14 -231,47 +231,47 @@@ secon
  initial
  EOF
  test_expect_success 'log --invert-grep --grep' '
-       git log --pretty="tformat:%s" --invert-grep --grep=th --grep=Sec >actual &&
-       test_cmp expect actual
+       # Fixed
+       git -c grep.patternType=fixed log --pretty="tformat:%s" --invert-grep --grep=th --grep=Sec >actual &&
+       test_cmp expect actual &&
+       # POSIX basic
+       git -c grep.patternType=basic log --pretty="tformat:%s" --invert-grep --grep=t[h] --grep=S[e]c >actual &&
+       test_cmp expect actual &&
+       # POSIX extended
+       git -c grep.patternType=basic log --pretty="tformat:%s" --invert-grep --grep=t[h] --grep=S[e]c >actual &&
+       test_cmp expect actual &&
+       # PCRE
+       if test_have_prereq PCRE
+       then
+               git -c grep.patternType=perl log --pretty="tformat:%s" --invert-grep --grep=t[h] --grep=S[e]c >actual &&
+               test_cmp expect actual
+       fi
  '
  
  test_expect_success 'log --invert-grep --grep -i' '
        echo initial >expect &&
-       git log --pretty="tformat:%s" --invert-grep -i --grep=th --grep=Sec >actual &&
-       test_cmp expect actual
+       # Fixed
+       git -c grep.patternType=fixed log --pretty="tformat:%s" --invert-grep -i --grep=th --grep=Sec >actual &&
+       test_cmp expect actual &&
+       # POSIX basic
+       git -c grep.patternType=basic log --pretty="tformat:%s" --invert-grep -i --grep=t[h] --grep=S[e]c >actual &&
+       test_cmp expect actual &&
+       # POSIX extended
+       git -c grep.patternType=extended log --pretty="tformat:%s" --invert-grep -i --grep=t[h] --grep=S[e]c >actual &&
+       test_cmp expect actual &&
+       # PCRE
+       if test_have_prereq PCRE
+       then
+               git -c grep.patternType=perl log --pretty="tformat:%s" --invert-grep -i --grep=t[h] --grep=S[e]c >actual &&
+               test_cmp expect actual
+       fi
  '
  
  test_expect_success 'log --grep option parsing' '
@@@ -256,13 -289,53 +289,53 @@@ test_expect_success 'log -i --grep' 
  
  test_expect_success 'log --grep -i' '
        echo Second >expect &&
+       # Fixed
        git log -1 --pretty="tformat:%s" --grep=sec -i >actual &&
-       test_cmp expect actual
+       test_cmp expect actual &&
+       # POSIX basic
+       git -c grep.patternType=basic log -1 --pretty="tformat:%s" --grep=s[e]c -i >actual &&
+       test_cmp expect actual &&
+       # POSIX extended
+       git -c grep.patternType=extended log -1 --pretty="tformat:%s" --grep=s[e]c -i >actual &&
+       test_cmp expect actual &&
+       # PCRE
+       if test_have_prereq PCRE
+       then
+               git -c grep.patternType=perl log -1 --pretty="tformat:%s" --grep=s[e]c -i >actual &&
+               test_cmp expect actual
+       fi
  '
  
  test_expect_success 'log -F -E --grep=<ere> uses ere' '
        echo second >expect &&
-       git log -1 --pretty="tformat:%s" -F -E --grep=s.c.nd >actual &&
+       # basic would need \(s\) to do the same
+       git log -1 --pretty="tformat:%s" -F -E --grep="(s).c.nd" >actual &&
+       test_cmp expect actual
+ '
+ test_expect_success PCRE 'log -F -E --perl-regexp --grep=<pcre> uses PCRE' '
+       test_when_finished "rm -rf num_commits" &&
+       git init num_commits &&
+       (
+               cd num_commits &&
+               test_commit 1d &&
+               test_commit 2e
+       ) &&
+       # In PCRE \d in [\d] is like saying "0-9", and matches the 2
+       # in 2e...
+       echo 2e >expect &&
+       git -C num_commits log -1 --pretty="tformat:%s" -F -E --perl-regexp --grep="[\d]" >actual &&
+       test_cmp expect actual &&
+       # ...in POSIX basic and extended it is the same as [d],
+       # i.e. "d", which matches 1d, but does not match 2e.
+       echo 1d >expect &&
+       git -C num_commits log -1 --pretty="tformat:%s" -F -E --grep="[\d]" >actual &&
        test_cmp expect actual
  '
  
@@@ -280,6 -353,81 +353,81 @@@ test_expect_success 'log with grep.patt
        test_cmp expect actual
  '
  
+ test_expect_success 'log with various grep.patternType configurations & command-lines' '
+       git init pattern-type &&
+       (
+               cd pattern-type &&
+               test_commit 1 file A &&
+               # The tagname is overridden here because creating a
+               # tag called "(1|2)" as test_commit would otherwise
+               # implicitly do would fail on e.g. MINGW.
+               test_commit "(1|2)" file B 2 &&
+               echo "(1|2)" >expect.fixed &&
+               cp expect.fixed expect.basic &&
+               cp expect.fixed expect.extended &&
+               cp expect.fixed expect.perl &&
+               # A strcmp-like match with fixed.
+               git -c grep.patternType=fixed log --pretty=tformat:%s \
+                       --grep="(1|2)" >actual.fixed &&
+               # POSIX basic matches (, | and ) literally.
+               git -c grep.patternType=basic log --pretty=tformat:%s \
+                       --grep="(.|.)" >actual.basic &&
+               # POSIX extended needs to have | escaped to match it
+               # literally, whereas under basic this is the same as
+               # (|2), i.e. it would also match "1". This test checks
+               # for extended by asserting that it is not matching
+               # what basic would match.
+               git -c grep.patternType=extended log --pretty=tformat:%s \
+                       --grep="\|2" >actual.extended &&
+               if test_have_prereq PCRE
+               then
+                       # Only PCRE would match [\d]\| with only
+                       # "(1|2)" due to [\d]. POSIX basic would match
+                       # both it and "1" since similarly to the
+                       # extended match above it is the same as
+                       # \([\d]\|\). POSIX extended would
+                       # match neither.
+                       git -c grep.patternType=perl log --pretty=tformat:%s \
+                               --grep="[\d]\|" >actual.perl &&
+                       test_cmp expect.perl actual.perl
+               fi &&
+               test_cmp expect.fixed actual.fixed &&
+               test_cmp expect.basic actual.basic &&
+               test_cmp expect.extended actual.extended &&
+               git log --pretty=tformat:%s -F \
+                       --grep="(1|2)" >actual.fixed.short-arg &&
+               git log --pretty=tformat:%s -E \
+                       --grep="\|2" >actual.extended.short-arg &&
+               test_cmp expect.fixed actual.fixed.short-arg &&
+               test_cmp expect.extended actual.extended.short-arg &&
+               git log --pretty=tformat:%s --fixed-strings \
+                       --grep="(1|2)" >actual.fixed.long-arg &&
+               git log --pretty=tformat:%s --basic-regexp \
+                       --grep="(.|.)" >actual.basic.long-arg &&
+               git log --pretty=tformat:%s --extended-regexp \
+                       --grep="\|2" >actual.extended.long-arg &&
+               if test_have_prereq PCRE
+               then
+                       git log --pretty=tformat:%s --perl-regexp \
+                               --grep="[\d]\|" >actual.perl.long-arg &&
+                       test_cmp expect.perl actual.perl.long-arg
+               else
+                       test_must_fail git log --perl-regexp \
+                               --grep="[\d]\|"
+               fi &&
+               test_cmp expect.fixed actual.fixed.long-arg &&
+               test_cmp expect.basic actual.basic.long-arg &&
+               test_cmp expect.extended actual.extended.long-arg
+       )
+ '
  cat > expect <<EOF
  * Second
  * sixth
@@@ -577,18 -725,6 +725,18 @@@ test_expect_success 'log.decorate confi
  
  '
  
 +test_expect_success 'log.decorate config parsing' '
 +      git log --oneline --decorate=full >expect.full &&
 +      git log --oneline --decorate=short >expect.short &&
 +
 +      test_config log.decorate full &&
 +      test_config log.mailmap true &&
 +      git log --oneline >actual &&
 +      test_cmp expect.full actual &&
 +      git log --oneline --decorate=short >actual &&
 +      test_cmp expect.short actual
 +'
 +
  test_expect_success TTY 'log output on a TTY' '
        git log --oneline --decorate >expect.short &&
  
diff --combined t/test-lib.sh
index 26b3edfb2e4e725f589fc99986587aa3ecb48b75,ab92c0ebaa990bb7b7c561d1a9a66c505bf67d11..43529451f9ae6c7ec63a475b008722751e7c9c29
@@@ -761,15 -761,10 +761,15 @@@ test_done () 
                        say "1..$test_count$skip_all"
                fi
  
 -              test -d "$remove_trash" &&
 -              cd "$(dirname "$remove_trash")" &&
 -              rm -rf "$(basename "$remove_trash")"
 +              if test -z "$debug"
 +              then
 +                      test -d "$TRASH_DIRECTORY" ||
 +                      error "Tests passed but trash directory already removed before test cleanup; aborting"
  
 +                      cd "$TRASH_DIRECTORY/.." &&
 +                      rm -fr "$TRASH_DIRECTORY" ||
 +                      error "Tests passed but test cleanup failed; aborting"
 +              fi
                test_at_end_hook_
  
                exit 0 ;;
@@@ -924,6 -919,7 +924,6 @@@ case "$TRASH_DIRECTORY" i
  /*) ;; # absolute path is good
   *) TRASH_DIRECTORY="$TEST_OUTPUT_DIRECTORY/$TRASH_DIRECTORY" ;;
  esac
 -test ! -z "$debug" || remove_trash=$TRASH_DIRECTORY
  rm -fr "$TRASH_DIRECTORY" || {
        GIT_EXIT_OK=t
        echo >&5 "FATAL: Cannot prepare test area"
@@@ -1013,8 -1009,9 +1013,9 @@@ esa
  
  ( COLUMNS=1 && test $COLUMNS = 1 ) && test_set_prereq COLUMNS_CAN_BE_1
  test -z "$NO_PERL" && test_set_prereq PERL
+ test -z "$NO_PTHREADS" && test_set_prereq PTHREADS
  test -z "$NO_PYTHON" && test_set_prereq PYTHON
- test -n "$USE_LIBPCRE" && test_set_prereq LIBPCRE
+ test -n "$USE_LIBPCRE1" && test_set_prereq PCRE
  test -z "$NO_GETTEXT" && test_set_prereq GETTEXT
  
  # Can we rely on git's output in the C locale?
@@@ -1168,6 -1165,3 +1169,6 @@@ build_option () 
  test_lazy_prereq LONG_IS_64BIT '
        test 8 -le "$(build_option sizeof-long)"
  '
 +
 +test_lazy_prereq TIME_IS_64BIT 'test-date is64bit'
 +test_lazy_prereq TIME_T_IS_64BIT 'test-date time_t-is64bit'