Re: [PATCH] perf: work around the tested repo having an index.lock

2017-06-04 Thread Christian Couder
On Mon, Jun 5, 2017 at 4:02 AM, Junio C Hamano  wrote:
> Christian Couder  writes:
>
>> On Sun, Jun 4, 2017 at 2:00 AM, Junio C Hamano  wrote:
>>> Ævar Arnfjörð Bjarmason  writes:
>>>
> My feeling exactly.  Diagnosing and failing upfront saying "well you
> made a copy but it is not suitable for testing" sounds more sensible
> at lesat to me.

 This change makes the repo suitable for testing when it wasn't before.
>>>
>>> Perhaps "not suitable" was a bit too vague.
>>>
>>> The copy you made is not in a consistent state that is good for
>>> testing.  This change may declare that it is now in a consistent
>>> state, but removal of a single *.lock file does not make it so.  We
>>> do not know what other transient inconsistency the resulting copy
>>> has; it is inherent to git-unaware copy---that is why we discouraged
>>> and removed rsync transport after all.
>>
>> If we don't like git-unaware copies, maybe we should go back to the
>> reasons why we are making one here.
>
> We do need git-unaware bit-for-bit copy for testing, because you may
> want to see the effect of unreachable objects, for example.

I think there might be different kind of people interested in performance tests.

Users with existing repositories might want to see how the different
Git versions perform on their real life repos.
Developers might want to test Git on different repos with different
characteristics.

For example some developers might want to test on repos with and
without a lot of unreachable objects, to make sure that the latest
changes they made improve perf in both cases. While some users might
only be interested in testing on their actual repositories to see how
the latest Git versions improve things (or not) in practice.

In this example the needs of developers would perhaps be better suited
if they could control the amount of unreachable objects in the tests,
while the needs of the users would be better suited if the tests just
used actual repos as is.

So I wonder what changes would be needed to the perf framework and the
perf tests to accomodate both of these kinds of needs.



> It's just that git-unaware copies, because it cannot be an atomic
> snapshot, can introduce inconsistencies the original repository did
> not have, rendering the result ineffective.


Re: [PATCH] test-lib: add ability to cap the runtime of tests

2017-06-04 Thread Christian Couder
On Mon, Jun 5, 2017 at 3:55 AM, Junio C Hamano  wrote:
> Ævar Arnfjörð Bjarmason  writes:
>
>> Realistically I'm going to submit this patch, I'm not going to take
>> the much bigger project of refactoring the entire test suite so that
>> no test runs under N second, and of course any such refactoring can
>> only aim for a fixed instead of dynamic N.
>
> I do not expect any single person to tackle the splitting.  I just
> wished that a patch inspired by this patch (or better yet, a new
> version of this patch) made the tail end of "make test" output to
> read like this:
>
>...
>[18:32:44] t9400-git-cvsserver-server.sh .. ok18331 ms
>[18:32:49] t9402-git-cvsserver-refs.sh  ok22902 ms
>[18:32:49] t9200-git-cvsexportcommit.sh ... ok25163 ms
>[18:32:51]
>All tests successful.
>Files=785, Tests=16928, 122 wallclock secs ( ...
>Result: PASS
>
>* The following tests took longer than 15 seconds to run.  We
>  may want to look into splitting them into smaller files.
>
>t3404-rebase-interactive.sh ...19 secs
>t9001-send-email.sh ...22 secs
>t9402-git-cvsserver-refs.sh ...22 secs
>t9200-git-cvsexportcommit.sh ..25 secs
>
> when the hidden feature is _not_ used, so that wider set of people
> will be forced to see that some tests take inordinate amount of
> time, and entice at least some of them to look into it.

I wonder if splitting tests would make a good GSoC microproject for next year.


What's cooking in git.git (Jun 2017, #03; Mon, 5)

2017-06-04 Thread Junio C Hamano
Here are the topics that have been cooking.  Commits prefixed with
'-' are only in 'pu' (proposed updates) while commits prefixed with
'+' are in 'next'.  The ones marked with '.' do not appear in any of
the integration branches, but I am still holding onto them.

With many fixes accumulated since v2.13.0, the first maintenance
release v2.13.1 has been tagged.  Thanks for all the help.  I'll be
mostly offline in the later part of this week, so please expect slow
response.

You can find the changes described here in the integration branches
of the repositories listed at

http://git-blame.blogspot.com/p/git-public-repositories.html

--
[Graduated to "master"]

* ab/c-translators-comment-style (2017-05-31) 1 commit
  (merged to 'next' on 2017-06-01 at df7fb9199a)
 + C style: use standard style for "TRANSLATORS" comments

 Update the C style recommendation for notes for translators, as
 recent versions of gettext tools can work with our style of
 multi-line comments.


* ab/sha1dc-maint (2017-05-22) 1 commit
  (merged to 'next' on 2017-05-30 at 9eb40bf912)
 + sha1dc: update from upstream
 (this branch is used by ab/sha1dc.)

 The "collision detecting" SHA-1 implementation shipped with 2.13
 was quite broken on some big-endian platforms and/or platforms that
 do not like unaligned fetches.  Update to the upstream code which
 has already fixed these issues.


* ab/t3070-test-dedup (2017-05-29) 1 commit
  (merged to 'next' on 2017-05-30 at 71eadec33b)
 + wildmatch test: remove redundant duplicate test

 Test cleanup.


* ad/pull-remote-doc (2017-06-02) 1 commit
  (merged to 'next' on 2017-06-02 at 32915e88db)
 + docs: fix formatting and grammar

 Docfix.


* ah/doc-filter-branch-export-env (2017-05-29) 1 commit
  (merged to 'next' on 2017-05-30 at a62168bf77)
 + doc: filter-branch does not require re-export of vars

 Docfix.


* ah/doc-rev-parse-short-default (2017-06-01) 1 commit
  (merged to 'next' on 2017-06-01 at f64fcc2a26)
 + doc: rewrite description for rev-parse --short

 Doc update.


* jh/close-index-before-stat (2017-04-28) 1 commit
  (merged to 'next' on 2017-05-16 at 0c0372eb02)
 + read-cache: close index.lock in do_write_index

 Originally merged to 'next' on 2017-04-30

 The timestamp of the index file is now taken after the file is
 closed, to help Windows, on which a stale timestamp is reported by
 fstat() on a file that is opened for writing and data was written
 but not yet closed.


* jk/connect-symref-info-leak-fix (2017-05-26) 1 commit
  (merged to 'next' on 2017-05-30 at d8b75d2dd9)
 + connect.c: fix leak in parse_one_symref_info()

 Leakfix.


* jk/drop-free-refspecs (2017-06-01) 1 commit
  (merged to 'next' on 2017-06-01 at 8f455319fc)
 + remote: drop free_refspecs() function

 Code clean-up.


* jk/unbreak-am-h (2017-05-30) 1 commit
  (merged to 'next' on 2017-06-01 at ee2233d409)
 + am: handle "-h" argument earlier
 (this branch is used by jk/consistent-h.)

 "git am -h" triggered a BUG().


* jk/url-insteadof-config (2017-06-01) 1 commit
  (merged to 'next' on 2017-06-01 at e7ea6032c2)
 + docs/config: mention protocol implications of url.insteadOf

 The interaction of "url.*.insteadOf" and custom URL scheme's
 whitelisting is now documented better.


* js/blame-lib (2017-05-25) 29 commits
  (merged to 'next' on 2017-05-30 at b4678b36a7)
 + blame: move entry prepend to libgit
 + blame: move scoreboard setup to libgit
 + blame: move scoreboard-related methods to libgit
 + blame: move fake-commit-related methods to libgit
 + blame: move origin-related methods to libgit
 + blame: move core structures to header
 + blame: create entry prepend function
 + blame: create scoreboard setup function
 + blame: create scoreboard init function
 + blame: rework methods that determine 'final' commit
 + blame: wrap blame_sort and compare_blame_final
 + blame: move progress updates to a scoreboard callback
 + blame: make sanity_check use a callback in scoreboard
 + blame: move no_whole_file_rename flag to scoreboard
 + blame: move xdl_opts flags to scoreboard
 + blame: move show_root flag to scoreboard
 + blame: move reverse flag to scoreboard
 + blame: move contents_from to scoreboard
 + blame: move copy/move thresholds to scoreboard
 + blame: move stat counters to scoreboard
 + blame: rename nth_line function
 + blame: rename ent_score function
 + blame: rename coalesce function
 + blame: rename origin-related functions
 + blame: rename scoreboard structure to blame_scoreboard
 + blame: rename origin structure to blame_origin
 + blame: remove unused parameters
 + blame: move textconv_object with related functions
 + blame: remove unneeded dependency on blob.h

 The internal logic used in "git blame" has been libified to make it
 easier to use by cgit.


* mb/diff-default-to-indent-heuristics (2017-05-09) 4 commits
  (merged to 'next' on 2017-05-29 at 7645575e21)
 + add--interactive: drop diff.indentHeuristic handling
 + diff: enable indent heuristic b

Re: [PATCH 1/2] add setup step to filter-branch

2017-06-04 Thread Junio C Hamano
Andreas Heiduk  writes:

> A specific `--setup` step in `git filter-branch` makes it much easier
> to define the initial values of variables used in the real filters.
> Also sourcing/defining utility functions here instead of
> `--env-filter` improves performance and minimizes clogging the output
> in case of errors.
>
> Signed-off-by: Andreas Heiduk 
> ---

I was placed on To: line, but I do not have a strong opinion on this
change, either for or against.

"filter-branch" program itself may probably already be hard to port
to C, but I need to point out that this makes it even harder than it
currently is [*1*], and it is likely that it has to stay implemented
in shell forever, though.  I do not mind that future myself, but
those on platforms with weaker implementation of shells might.

[Footnote]

 *1* The issue is *not* that these individual filter commands expect
  written as a shell scriptlet; it is that these
 scriptlets expect to be evaled inside a single shell process,
 making an update to a shell variable in one command visible to
 the next command that runs.


>  Documentation/git-filter-branch.txt | 16 +++-
>  git-filter-branch.sh| 18 +-
>  2 files changed, 24 insertions(+), 10 deletions(-)
>
> diff --git a/Documentation/git-filter-branch.txt 
> b/Documentation/git-filter-branch.txt
> index 6e4bb0220..45c849d8c 100644
> --- a/Documentation/git-filter-branch.txt
> +++ b/Documentation/git-filter-branch.txt
> @@ -8,11 +8,11 @@ git-filter-branch - Rewrite branches
>  SYNOPSIS
>  
>  [verse]
> -'git filter-branch' [--env-filter ] [--tree-filter ]
> - [--index-filter ] [--parent-filter ]
> - [--msg-filter ] [--commit-filter ]
> - [--tag-name-filter ] [--subdirectory-filter ]
> - [--prune-empty]
> +'git filter-branch' [--setup ] [--env-filter ]
> + [--tree-filter ] [--index-filter ]
> + [--parent-filter ] [--msg-filter ]
> + [--commit-filter ] [--tag-name-filter ]
> + [--subdirectory-filter ] [--prune-empty]
>   [--original ] [-d ] [-f | --force]
>   [--] [...]
>  
> @@ -82,6 +82,12 @@ multiple commits.
>  OPTIONS
>  ---
>  
> +--setup ::
> + This is not a real filter executed for each commit but a one
> + time setup just before the loop. Therefore no commit-specific
> + variables are defined yet.  Functions or variables defined here
> + can be used or modified in the following filter steps.
> +
>  --env-filter ::
>   This filter may be used if you only need to modify the environment
>   in which the commit will be performed.  Specifically, you might
> diff --git a/git-filter-branch.sh b/git-filter-branch.sh
> index aafaf708d..2758ae5eb 100755
> --- a/git-filter-branch.sh
> +++ b/git-filter-branch.sh
> @@ -81,11 +81,12 @@ set_ident () {
>   finish_ident COMMITTER
>  }
>  
> -USAGE="[--env-filter ] [--tree-filter ]
> - [--index-filter ] [--parent-filter ]
> - [--msg-filter ] [--commit-filter ]
> - [--tag-name-filter ] [--subdirectory-filter ]
> - [--original ] [-d ] [-f | --force]
> +USAGE="[--setup ] [--env-filter ]
> + [--tree-filter ] [--index-filter ]
> + [--parent-filter ] [--msg-filter ]
> + [--commit-filter ] [--tag-name-filter ]
> + [--subdirectory-filter ] [--original ]
> + [-d ] [-f | --force]
>   [...]"
>  
>  OPTIONS_SPEC=
> @@ -96,6 +97,7 @@ if [ "$(is_bare_repository)" = false ]; then
>  fi
>  
>  tempdir=.git-rewrite
> +filter_setup=
>  filter_env=
>  filter_tree=
>  filter_index=
> @@ -148,6 +150,9 @@ do
>   -d)
>   tempdir="$OPTARG"
>   ;;
> + --setup)
> + filter_setup="$OPTARG"
> + ;;
>   --env-filter)
>   filter_env="$OPTARG"
>   ;;
> @@ -317,6 +322,9 @@ else
>   need_index=
>  fi
>  
> +eval "$filter_setup" < /dev/null ||
> + die "filter setup failed: $filter_setup"
> +
>  while read commit parents; do
>   git_filter_branch__commit_count=$(($git_filter_branch__commit_count+1))


Re: [PATCH] perf: work around the tested repo having an index.lock

2017-06-04 Thread Junio C Hamano
Jeff King  writes:

> I don't really mind addressing this one case that much. I'm not sure
> that we want to accrue a pile of band-aids here that causes a
> maintenance burden and doesn't really solve the problem completely. One
> way to do that is to say no to the first band-aid. 

Yup, that was where my objection came from.

> But we could also
> apply it and see what happens. At the very worst it's a few extra lines
> of code, and we can start to get worried on the second or third
> band-aid.

That's OK as well.  But we should resolve now that we will rip all
of them out once we start seeing the second or third band-aid.  I
really do not want to see the "accring a pile of band aids" in our
future.


Re: [PATCH] perf: work around the tested repo having an index.lock

2017-06-04 Thread Junio C Hamano
Christian Couder  writes:

> On Sun, Jun 4, 2017 at 2:00 AM, Junio C Hamano  wrote:
>> Ævar Arnfjörð Bjarmason  writes:
>>
 My feeling exactly.  Diagnosing and failing upfront saying "well you
 made a copy but it is not suitable for testing" sounds more sensible
 at lesat to me.
>>>
>>> This change makes the repo suitable for testing when it wasn't before.
>>
>> Perhaps "not suitable" was a bit too vague.
>>
>> The copy you made is not in a consistent state that is good for
>> testing.  This change may declare that it is now in a consistent
>> state, but removal of a single *.lock file does not make it so.  We
>> do not know what other transient inconsistency the resulting copy
>> has; it is inherent to git-unaware copy---that is why we discouraged
>> and removed rsync transport after all.
>
> If we don't like git-unaware copies, maybe we should go back to the
> reasons why we are making one here.

We do need git-unaware bit-for-bit copy for testing, because you may
want to see the effect of unreachable objects, for example.  

It's just that git-unaware copies, because it cannot be an atomic
snapshot, can introduce inconsistencies the original repository did
not have, rendering the result ineffective.


Re: [PATCH] test-lib: add ability to cap the runtime of tests

2017-06-04 Thread Junio C Hamano
Ævar Arnfjörð Bjarmason  writes:

>> I certainly understand that but in the longer term, I'd prefer the
>> approach to call out an overly large test.  That will hopefully
>> motivate us to split it (or speed up the thing) to help folks on
>> many-core machines.
>
> The reason I didn't document this in t/README was because I thought it
> made sense to have this as a mostly hidden feature that end users
> wouldn't be tempted to fiddle with, but would be useful to someone
> doing git development.
>
> Realistically I'm going to submit this patch, I'm not going to take
> the much bigger project of refactoring the entire test suite so that
> no test runs under N second, and of course any such refactoring can
> only aim for a fixed instead of dynamic N.

I do not expect any single person to tackle the splitting.  I just
wished that a patch inspired by this patch (or better yet, a new
version of this patch) made the tail end of "make test" output to
read like this:

   ...
   [18:32:44] t9400-git-cvsserver-server.sh .. ok18331 ms
   [18:32:49] t9402-git-cvsserver-refs.sh  ok22902 ms
   [18:32:49] t9200-git-cvsexportcommit.sh ... ok25163 ms
   [18:32:51]
   All tests successful.
   Files=785, Tests=16928, 122 wallclock secs ( ...
   Result: PASS

   * The following tests took longer than 15 seconds to run.  We
 may want to look into splitting them into smaller files.

   t3404-rebase-interactive.sh ...19 secs
   t9001-send-email.sh ...22 secs
   t9402-git-cvsserver-refs.sh ...22 secs
   t9200-git-cvsexportcommit.sh ..25 secs

when the hidden feature is _not_ used, so that wider set of people
will be forced to see that some tests take inordinate amount of
time, and entice at least some of them to look into it.

> Collecting the skipped ones is easy enough to do with a grep + for
> loop, so I don't think it's worth making the implementation more
> complex to occasionally answer the question of how many tests were
> skipped due to running into the timeout

"Easy enough" and "made to stand out so _NO_ effort is needed to
see" are very different things.

> Or you can just run in a mode where you stream out however many tests
> you're going to run as you go along, and then print "1..NUM_TESTS" at
> the end.
>
> We use the latter, so we can abort the entire test suite at any time
> with test_done, that's what this change does.

cf. bf4b7219 ("test-lib.sh: Add check for invalid use of 'skip_all'
facility", 2012-09-01)

>> Oh, by the way, is "date +%s" even portable?  I thought not.
>
> The lib-git-p4.sh lib says not, and shells out to python's time() is a
> workaround, I could replace this with perl -e 'print time', but
> thought it wasn't worth bothering with for an obscure optional feature
> like this.

Let's do the right thing, because doing so is easy.

I personally think that filter-branch being broken is not noticed
only because it is not very often used, as opposed to that we want
to encourage those who are following along with us, especially those
who are on minority platforms, to run our tests every day.  Let's
not spread sloppyness unnecessarily.


[ANNOUNCE] Git v2.13.1

2017-06-04 Thread Junio C Hamano
The latest maintenance release Git v2.13.1 is now available at
the usual places.

The tarballs are found at:

https://www.kernel.org/pub/software/scm/git/

The following public repositories all have a copy of the 'v2.13.1'
tag and the 'maint' branch that the tag points at:

  url = https://kernel.googlesource.com/pub/scm/git/git
  url = git://repo.or.cz/alt-git.git
  url = https://github.com/gitster/git



Git v2.13.1 Release Notes
=

Fixes since v2.13
-

 * The Web interface to gmane news archive is long gone, even though
   the articles are still accessible via NTTP.  Replace the links with
   ones to public-inbox.org.  Because their message identification is
   based on the actual message-id, it is likely that it will be easier
   to migrate away from it if/when necessary.

 * Update tests to pass under GETTEXT_POISON (a mechanism to ensure
   that output strings that should not be translated are not
   translated by mistake), and tell TravisCI to run them.

 * Setting "log.decorate=false" in the configuration file did not take
   effect in v2.13, which has been corrected.

 * An earlier update to test 7400 needed to be skipped on CYGWIN.

 * Git sometimes gives an advice in a rhetorical question that does
   not require an answer, which can confuse new users and non native
   speakers.  Attempt to rephrase them.

 * "git read-tree -m" (no tree-ish) gave a nonsense suggestion "use
   --empty if you want to clear the index".  With "-m", such a request
   will still fail anyway, as you'd need to name at least one tree-ish
   to be merged.

 * The codepath in "git am" that is used when running "git rebase"
   leaked memory held for the log message of the commits being rebased.

 * "pack-objects" can stream a slice of an existing packfile out when
   the pack bitmap can tell that the reachable objects are all needed
   in the output, without inspecting individual objects.  This
   strategy however would not work well when "--local" and other
   options are in use, and need to be disabled.

 * Clarify documentation for include.path and includeIf..path
   configuration variables.

 * Tag objects, which are not reachable from any ref, that point at
   missing objects were mishandled by "git gc" and friends (they
   should silently be ignored instead)

 * A few http:// links that are redirected to https:// in the
   documentation have been updated to https:// links.

 * Make sure our tests would pass when the sources are checked out
   with "platform native" line ending convention by default on
   Windows.  Some "text" files out tests use and the test scripts
   themselves that are meant to be run with /bin/sh, ought to be
   checked out with eol=LF even on Windows.

 * Fix memory leaks pointed out by Coverity (and people).

 * The receive-pack program now makes sure that the push certificate
   records the same set of push options used for pushing.

 * "git cherry-pick" and other uses of the sequencer machinery
   mishandled a trailer block whose last line is an incomplete line.
   This has been fixed so that an additional sign-off etc. are added
   after completing the existing incomplete line.

 * The shell completion script (in contrib/) learned "git stash" has
   a new "push" subcommand.

 * Travis CI gained a task to format the documentation with both
   AsciiDoc and AsciiDoctor.

 * Update the C style recommendation for notes for translators, as
   recent versions of gettext tools can work with our style of
   multi-line comments.

 * "git clone --config var=val" is a way to populate the
   per-repository configuration file of the new repository, but it did
   not work well when val is an empty string.  This has been fixed.

 * A few codepaths in "checkout" and "am" working on an unborn branch
   tried to access an uninitialized piece of memory.

 * "git for-each-ref --format=..." with %(HEAD) in the format used to
   resolve the HEAD symref as many times as it had processed refs,
   which was wasteful, and "git branch" shared the same problem.

 * "git interpret-trailers", when used as GIT_EDITOR for "git commit
   -v", looked for and appended to a trailer block at the very end,
   i.e. at the end of the "diff" output.  The command has been
   corrected to pay attention to the cut-mark line "commit -v" adds to
   the buffer---the real trailer block should appear just before it.

 * A test allowed both "git push" and "git receive-pack" on the other
   end write their traces into the same file.  This is OK on platforms
   that allows atomically appending to a file opened with O_APPEND,
   but on other platforms led to a mangled output, causing
   intermittent test failures.  This has been fixed by disabling
   traces from "receive-pack" in the test.

 * "foo\bar\baz" in "git fetch foo\bar\baz", even though there is no
   slashes in it, cannot be a nickname for a remote on Windows, as
   that is like

Re: [PATCH v4 0/8] PCRE v2, PCRE v1 JIT, log -P & fixes

2017-06-04 Thread Junio C Hamano
Ævar Arnfjörð Bjarmason  writes:

> On Fri, Jun 2, 2017 at 6:10 PM, Johannes Schindelin
>>
>> Will continue with testing Git for Windows using PCRE2 next week and keep
>> you posted,
>
> Thanks a lot for testing it. Great to hear that it (definitely almost) works!
>
> If the grep tests it's very likely that all of them will pass, the
> only tests I run when developing this series (outside of the full run
> for list submission) are t[0-9]*grep*.sh t[0-9]*log*.sh tests, since
> those are the only ones impacted by it.

'ab/pcre-v2' was marked for 'next' in "What's cookin" a few issues
ago, but I'll keep it in 'pu' to wait for the above---please give me
a go ahead when we all are happy with the topic.  I expect to be
offline in the later part of this week, by the way.

Thanks.


Re: New Order

2017-06-04 Thread Marco Plujm

Dear Sir,

Have a nice day!

We are interested in purchasing your products.Send your latest catalog and
also, inform me about the Minimum order quantity, Delivery time or FOB,
and payment terms warranty.

Thanks and Best Regards,
Mr.Marco Plujm.
Phone: (+1) 703-684-5885
Fax: (+1) 703-684-0644
Washington, DC 20052
United State



Re: Git Merge 2017 Videos

2017-06-04 Thread Philip Oakley

From: "Christian Couder" 

On Sun, Jun 4, 2017 at 7:36 PM, Kevin Daudt  wrote:

On Sun, Jun 04, 2017 at 11:24:17AM +0100, Philip Oakley wrote:
While looking at the recent .gitignore issue (the need to use `**`) I 
came

up against a comment in
https://public-inbox.org/git/cagz79kzqsaubfotjyqm+-+ljyyec2ykj5exuy5kderezfh0...@mail.gmail.com/
noting that the Git Merge 2017 videos were not available at that time.

Well, a search found them on Youtube on the GitHub channel :
https://www.youtube.com/results?search_query=git+merge+2017+videos

With a playlist : 
https://www.youtube.com/watch?v=tvymSWfvkjw&list=PL0lo9MOBetEGRAJzoTCdco_fOKDfhqaOY


Enjoy the viewing. The first few have been good.


Thanks for sharing this.


This was in the last edition of Git Rev News:
https://git.github.io/rev_news/2017/05/17/edition-27/


I'd completely missed that. It was in the Other News, various, section.

(as an aside, your email is the first I've noticed that I think got 
swallowed by my ISP's spam filter, though Eric's PublicInbox came to the 
rescue with it's mbox export!) 



Re: Git Merge 2017 Videos

2017-06-04 Thread Christian Couder
On Sun, Jun 4, 2017 at 7:36 PM, Kevin Daudt  wrote:
> On Sun, Jun 04, 2017 at 11:24:17AM +0100, Philip Oakley wrote:
>> While looking at the recent .gitignore issue (the need to use `**`) I came
>> up against a comment in
>> https://public-inbox.org/git/cagz79kzqsaubfotjyqm+-+ljyyec2ykj5exuy5kderezfh0...@mail.gmail.com/
>> noting that the Git Merge 2017 videos were not available at that time.
>>
>> Well, a search found them on Youtube on the GitHub channel :
>> https://www.youtube.com/results?search_query=git+merge+2017+videos
>>
>> With a playlist : 
>> https://www.youtube.com/watch?v=tvymSWfvkjw&list=PL0lo9MOBetEGRAJzoTCdco_fOKDfhqaOY
>>
>> Enjoy the viewing. The first few have been good.
>
> Thanks for sharing this.

This was in the last edition of Git Rev News:
https://git.github.io/rev_news/2017/05/17/edition-27/


Re: [PATCH] git-p4: remove obsolete version check

2017-06-04 Thread brian m. carlson
On Sat, Jun 03, 2017 at 06:55:22PM +0200, Ævar Arnfjörð Bjarmason wrote:
> On Sat, Jun 3, 2017 at 3:31 PM, Jakub Wilk  wrote:
> > The file is syntactically correct only in Python >= 2.6, so the
> > version check never does anything.
> 
> [CC-ing Eric who added that check]
> 
> Your commit message doesn't give an example of this, but with e.g.
> python 2.0 you get:
> 
>   File "git-p4.py", line 469
> yield pattern
> ^
> SyntaxError: invalid syntax
> 
> I checked the various other python files that had similar warnings,
> they all work correctly with python 2.0.

The yield syntax was in Python 2.3, so this isn't indicative of the
problem.  You'd actually need to test with 2.5 itself in order to know
what that version complains about.

> One workaround to keep this would be to make git-p4.py import some
> library to do all its work, and use some subset of python syntax to
> just load and defer to that library. That works for me when I change
> it like that locally. Alternatively, does Python have something like
> Perl's BEGIN {} blocks where you can execute code right there before
> the file has finished parsing?

TTBOMK, Python doesn't have such functionality.

> Or we could just remove this, just wanted to note the above since I
> dug into it, and the commit message light on details.

As a note, Python 2.6 has been around since at least 2009, so I think
it's fine to drop support for earlier versions at this point.  But I
agree an explanation in the commit message of what exactly makes it
syntactically invalid would be beneficial.
-- 
brian m. carlson / brian with sandals: Houston, Texas, US
https://www.crustytoothpaste.net/~bmc | My opinion only
OpenPGP: https://keybase.io/bk2204


signature.asc
Description: PGP signature


Re: [PATCH 0/6] Some more git config completions

2017-06-04 Thread SZEDER Gábor

> As an aside from this series, has anyone ever proposed some method of
> semi-automatically keeping this up-to-date?

For configuration variables, not that I know of.
For command line options, there was an attempt to enhance
parse-options to dump all command line options and use this in the
completion script on-demand to lazy-initialize command-specific
variables holding the list of options:

  
http://public-inbox.org/git/1334140165-24958-1-git-send-email-bebar...@gmail.com/T/#u

> Seems we're in a continual
> cycle of adding flags/config, forgetting to update this, then updating
> it. At least the command-line flags should be easy to parse out in
> some test, ditto config variables from config.txt maybe...

A couple of thoughts concerning configuration variables:

 - config.txt includes other files listing configuration variables,
   too.
 - There are many config variables with subsections, e.g.
   'branch..description'.  That '' is not good for
   completion, of course.
 - Some config variables are not listed with their full names, see
   'advice.*' (this is easy to fix).
 - Perhaps there are config variables that are only mentioned in the
   docs of the relevant command, but not in config.txt (or in the
   included files).
 - There are definitely config variables that are not mentioned in the
   docs at all, e.g. the 'bash.*' variables controlling __git_ps1().
 - The completion script is currently self-contained and ready to be
   used as-is.  I think that's quite nice.  This wouldn't be the case
   if we want to include an automatically generated list of config
   variables extracted from config.txt during the build process.



Re: Git Merge 2017 Videos

2017-06-04 Thread Kevin Daudt
On Sun, Jun 04, 2017 at 11:24:17AM +0100, Philip Oakley wrote:
> While looking at the recent .gitignore issue (the need to use `**`) I came
> up against a comment in
> https://public-inbox.org/git/cagz79kzqsaubfotjyqm+-+ljyyec2ykj5exuy5kderezfh0...@mail.gmail.com/
> noting that the Git Merge 2017 videos were not available at that time.
> 
> Well, a search found them on Youtube on the GitHub channel :
> https://www.youtube.com/results?search_query=git+merge+2017+videos
> 
> With a playlist : 
> https://www.youtube.com/watch?v=tvymSWfvkjw&list=PL0lo9MOBetEGRAJzoTCdco_fOKDfhqaOY
> 
> Enjoy the viewing. The first few have been good.
> 

Thanks for sharing this.


Re: [PATCH] submodule foreach: correct $sm_path in nested submodules from a dir

2017-06-04 Thread Ramsay Jones


On 03/06/17 15:07, Ramsay Jones wrote:
[snip]

>> diff --git a/Documentation/git-submodule.txt 
>> b/Documentation/git-submodule.txt
>> index 74bc6200d5..52e3ef1325 100644
>> --- a/Documentation/git-submodule.txt
>> +++ b/Documentation/git-submodule.txt
>> @@ -218,20 +218,24 @@ information too.
>>  
>>  foreach [--recursive] ::
>>  Evaluates an arbitrary shell command in each checked out submodule.
>> -The command has access to the variables $name, $path, $sha1 and
>> -$toplevel:
>> -$name is the name of the relevant submodule section in .gitmodules,
>> -$path is the name of the submodule directory relative to the
>> -superproject, $sha1 is the commit as recorded in the superproject,
>> -and $toplevel is the absolute path to the top-level of the superproject.
>> -Any submodules defined in the superproject but not checked out are
>> -ignored by this command. Unless given `--quiet`, foreach prints the name
>> -of each submodule before evaluating the command.
>> -If `--recursive` is given, submodules are traversed recursively (i.e.
>> -the given shell command is evaluated in nested submodules as well).
>> -A non-zero return from the command in any submodule causes
>> -the processing to terminate. This can be overridden by adding '|| :'
>> -to the end of the command.
>> +The command has access to the following variables:
>> ++
>> +* `$name` is the name of the relevant submodule section in .gitmodules,
>> +* `$sha1` is the commit as recorded in the superproject.
>> +* `$sm_path` is the path recorded in the superproject.
> 
> Just to be sure, the 'path recorded in the superproject' means the
> same thing as the 'name of the submodule directory relative to the
> superproject'. Yes?
> 
>> +* `$toplevel` is the absolute path to its superproject, such that
>> +  `$toplevel/$sm_path` is the absolute path of the submodule.
>> +* `$dpath` contains the relative path from the current working directory
>> +   to the submodules root directory.

BTW, I have not given any thought to what happens to these
variables/paths if you run '--recursive'. I assume the new
'recursed' submodule takes on the role of the 'superproject'
in the definitions above. Hmm, but what does $dpath show?
(having 'recursed', is the cwd now at the top level of the
'new' superproject?)

Hmm, you have changed several command to recurse into
submodule(s) (I haven't followed that effort closely), so
I suppose it should have some measure of consistency with
those commands. (whatever that means ;-)

ATB,
Ramsay Jones




Re: Git p4 sync changelist interval

2017-06-04 Thread Luke Diamand
On 4 June 2017 at 10:56, Андрей Ефанов <1134t...@gmail.com> wrote:
> Hello,
>
> My goal is to sync the repository from p4 using an interval of
> changelists so that the first changelist version of the repository
> would be considered as an initial commit.
> So I used the following command:
>
>  git p4 clone //depot@cl1,cl2
>
> And when it finished, the files, that were created before the cl1 were
> not in the HEAD.

Do you mean that if foo.c was created at cl1+1, that after doing the
clone, it wasn't there?

If so, that doesn't sound right to me.

I have just tried doing what I think you mean:

1. Create p4 depot
2. Add foo.c (at CL 2)
3. Add bar.c (at CL 3)
4. git-p4 clone //depot@2,3

I end up with both files.

>
> The problem, as I see it, is that before syncing changes in the given
> range, p4 task does not sync to cl1 version of the repo, and applies
> commits to the empty repository.
> Is it a bug or my misunderstanding of how git p4 should work?

Possibly I'm misunderstanding what you're doing! Can you give a
sequence of steps to show the problem?

Thanks!
Luke


Re: [GSoC][PATCH v6 2/2] submodule: port subcommand foreach from shell to C

2017-06-04 Thread Prathamesh Chavan
On Sat, Jun 3, 2017 at 7:43 AM, Stefan Beller  wrote:
> On Fri, Jun 2, 2017 at 4:24 AM, Prathamesh Chavan  wrote:
>> This aims to make git-submodule foreach a builtin. This is the very
>> first step taken in this direction. Hence, 'foreach' is ported to
>> submodule--helper, and submodule--helper is called from git-submodule.sh.
>> The code is split up to have one function to obtain all the list of
>> submodules. This function acts as the front-end of git-submodule foreach
>> subcommand. It calls the function for_each_submodule_list, which basically
>> loops through the list and calls function fn, which in this case is
>> runcommand_in_submodule. This third function is a calling function that
>> takes care of running the command in that submodule, and recursively
>> perform the same when --recursive is flagged.
>>
>> The first function module_foreach first parses the options present in
>> argv, and then with the help of module_list_compute, generates the list of
>> submodules present in the current working tree.
>>
>> The second function for_each_submodule_list traverses through the
>> list, and calls function fn (which in case of submodule subcommand
>> foreach is runcommand_in_submodule) is called for each entry.
>>
>> The third function runcommand_in_submodule, generates a submodule struct sub
>> for $name, value and then later prepends name=sub->name; and other
>> value assignment to the env argv_array structure of a child_process.
>> Also the  of submodule-foreach is push to args argv_array
>> structure and finally, using run_command the commands are executed
>> using a shell.
>>
>> The third function also takes care of the recursive flag, by creating
>> a separate child_process structure and prepending "--super-prefix 
>> displaypath",
>> to the args argv_array structure. Other required arguments and the
>> input  of submodule-foreach is also appended to this argv_array.
>>
>
> Is the commit message still accurate?
> You describe the changes between the versions below the --- line,
> that is not recorded in the permanent commit history.
>
> In the commit message is less important to write "what" is happening,
> because that can easily be read from the patch/commit itself, but rather
> "why" things happen, such as design choices, maybe:
>
> This aims to make git-submodule foreach a builtin. This is the very
> first step taken in this direction. Hence, 'foreach' is ported to
> submodule--helper, and submodule--helper is called from git-submodule.sh.
>
> We'll introduce 3 functions, one that is exposed to the command line
> and handles command line arguments, one to iterate over a set of
> submodules, and finally one to execute an arbitrary shell command
> in the submodule.
>
> Attention must be paid to the 'path' variable, see 64394e3ae9
> (git-submodule.sh: Don't use $path variable in eval_gettext string,
> 2012-04-17) details. The path varialbe is not exposed into the environment
> of the invoked shell, but we just give "path=%s;" as the first argument.
>
> We do not need to condition on the number of arguments as in 1c4fb136db
> (submodule foreach: skip eval for more than one argument, 2013-09-27)
> as we will run exactly one shell in the submodules directory.
>
> Sign-off-...
>
>>
>> Other than that, additionally the case of no. of arugments in 
>> being equal to 1 is also considered separetly.
>> THe reason of having this change in the shell script was given in the
>> commit 1c4fb136db.
>> According to my understanding, eval "$1" executes $1 in same shell,
>> whereas "$@" gets executed in a separate shell, which doesn't allow
>> "$@" to access the env variables $name, $path, etc.
>> Hence, to keep the ported function similar, this condition is also
>> added.
>
> This paragraph would be a good candidate for the commit message, too.
> However as we rewrite it in C, we will spawn exactly one shell no matter
> how many arguments we have (well for 0 we have no shell, but for 1 or more
> arguments we'll spawn exactly one shell?)
>

I was trying to explaing the condition of the code in git-submodule.sh,
before porting. To be more clear, I meant that when we run the command
eval "$1", it runs in the same shell in which the cmd_foreach has been running,
unlike in the case of "$@", in which case, the command in executed in a separate
shell.

>> +   } else if (prefix) {
>> +   struct strbuf sb = STRBUF_INIT;
>> +   char *displaypath = xstrdup(relative_path(path, prefix, 
>> &sb));
>> +   strbuf_release(&sb);
>> +   return displaypath;
>
> Note to self (or any other that is interested in long term clean code):
> I have seen this pattern a couple of times, a strbuf just to appease
> the argument list of relative_path.
> (init_submodule, prepare_to_clone_next_submodule,
> resolve_relative_path in submodule--helper
> cmd_rev_parse in builtin/rev-parse
> connect_work_tree_and_git

Git Merge 2017 Videos

2017-06-04 Thread Philip Oakley
While looking at the recent .gitignore issue (the need to use `**`) I came 
up against a comment in

https://public-inbox.org/git/cagz79kzqsaubfotjyqm+-+ljyyec2ykj5exuy5kderezfh0...@mail.gmail.com/
noting that the Git Merge 2017 videos were not available at that time.

Well, a search found them on Youtube on the GitHub channel : 
https://www.youtube.com/results?search_query=git+merge+2017+videos


With a playlist : 
https://www.youtube.com/watch?v=tvymSWfvkjw&list=PL0lo9MOBetEGRAJzoTCdco_fOKDfhqaOY


Enjoy the viewing. The first few have been good.

--
Philip 



Git p4 sync changelist interval

2017-06-04 Thread Андрей Ефанов
Hello,

My goal is to sync the repository from p4 using an interval of
changelists so that the first changelist version of the repository
would be considered as an initial commit.
So I used the following command:

 git p4 clone //depot@cl1,cl2

And when it finished, the files, that were created before the cl1 were
not in the HEAD.

The problem, as I see it, is that before syncing changes in the given
range, p4 task does not sync to cl1 version of the repo, and applies
commits to the empty repository.
Is it a bug or my misunderstanding of how git p4 should work?

Regards,
Andrew Yefanov


Re: [PATCH] perf: work around the tested repo having an index.lock

2017-06-04 Thread Jeff King
On Sun, Jun 04, 2017 at 11:04:50AM +0900, Junio C Hamano wrote:

> Jeff King  writes:
> 
> > But I think a more compelling case is that there may be an ongoing
> > operation in the original repo (e.g., say you are in the middle of
> > writing a commit message) when we do a blind copy of the filesystem
> > contents. You might racily pick up a lockfile.
> >
> > Should we find and delete all *.lock files in the copied directory? That
> > would get ref locks, etc. Half-formed object files are OK. Technically
> > if you want to get an uncorrupted repository you'd also want to copy
> > refs before objects (in case somebody makes a new object and updates a
> > ref while you're copying).
> 
> Or "git branch -m A B" is in progress.
> 
> I think it all depends on what your "threat" model is ;-).  Do we
> assume that many users are "time-sharing" a box and a repository?
> If not, i.e. if you are the sole user of a box and a repository on
> it, such a concurrent access to make the result of git-unaware copy
> problematic will not be in index.lock (after all you are now doing
> the perf thing, not editing a commit log message in the repository
> used for testing Git), but will be in ref locks (somebody else
> pushing into the repository you are *not* currently using from
> sideways).

I was specifically thinking of the case where you run "git commit -a",
it locks the index, and then while you are writing the commit message
you need to collect some more perf results. The default perf repo is the
current repository itself, so running any perf script will copy the
index.lock and probably cause the script to misbehave.

That doesn't seem like an implausible sequence of events (frankly, I'm
surprised I haven't hit it myself, as I often run perf scripts while
writing commit messages. I think I've been saved by generally using a
separate linux.git clone as my test repo).

So it may be reasonable to say that the index.lock is special. We hold
it for a long time (compared to reflocks, which do a quick compare-and-swap).
And then we can throw up our hands for any other races. People who run
"git prune" on their test repository running the perf scripts get what
they deserve. :)

-Peff


Re: [PATCH] perf: work around the tested repo having an index.lock

2017-06-04 Thread Jeff King
On Sun, Jun 04, 2017 at 09:00:28AM +0900, Junio C Hamano wrote:

> Ævar Arnfjörð Bjarmason  writes:
> 
> >> My feeling exactly.  Diagnosing and failing upfront saying "well you
> >> made a copy but it is not suitable for testing" sounds more sensible
> >> at lesat to me.
> >
> > This change makes the repo suitable for testing when it wasn't before.
> 
> Perhaps "not suitable" was a bit too vague.
> 
> The copy you made is not in a consistent state that is good for
> testing.  This change may declare that it is now in a consistent
> state, but removal of a single *.lock file does not make it so.  We
> do not know what other transient inconsistency the resulting copy
> has; it is inherent to git-unaware copy---that is why we discouraged
> and removed rsync transport after all.

Right. What I was getting at in my original message was that this is the
tip of the iceberg if we are worried about inconsistent states. And the
right solution is probably to say "you are on your own for making sure
the repo you point to is in a sane state". Because there are so many
cases to catch, and they're so rare, it's not worth trying to catch them
all.

I don't really mind addressing this one case that much. I'm not sure
that we want to accrue a pile of band-aids here that causes a
maintenance burden and doesn't really solve the problem completely. One
way to do that is to say no to the first band-aid. But we could also
apply it and see what happens. At the very worst it's a few extra lines
of code, and we can start to get worried on the second or third
band-aid.

-Peff


Re: [PATCH] perf: work around the tested repo having an index.lock

2017-06-04 Thread Jeff King
On Sun, Jun 04, 2017 at 09:55:15AM +0200, Ævar Arnfjörð Bjarmason wrote:

> > Is a local clone really much slower these days? Wouldn't it is use
> > hard links too?
> > By the way the many properties that are preserved might not be worth
> > preserving as they could make results depend a lot on the current
> > state of the original repo.
> 
> AFAICT from some quick testing it'll hardlink the objects/ dir, so
> e.g. you preserve the loose objects. Making the results depend on the
> state of the original repo is a feature, but perhaps it should be opt
> in. It's very useful to be able to take a repo that's accrued e.g. a
> month's worth of refs & loose objects and test that v.s. a fresh
> clone.
> 
> But there are other things that ever a hardlink local clone doesn't
> preserve which might be worth preserving...

Yes. Reflogs are one example. They aren't copied at all as part of a
clone, but they impact pruning and repacking.

-Peff


Re: [WIP/PATCH 7/6] perf: add a performance test for core.fsmonitor

2017-06-04 Thread Jeff King
On Sun, Jun 04, 2017 at 09:46:19AM +0200, Ævar Arnfjörð Bjarmason wrote:

> What I'm referring to is not a limitation of git (we'll always be able
> to turn off core.fsmonitor), but a limitation of the perf framework.
> There's no way to run a test like this:
> 
> ./run master next -- p*.sh
> 
> And have some information passed to the test to apply different
> runtime options to the test depending on master or next, or be to test
> master twice, once with the fsmonitor, once without, which this
> hypothetical feature would do:
> 
> ./run master:"GIT_PERF_7519_NO_FSMONITOR=Y" master -- p*.sh

Yeah, the perf framework was originally designed to find regressions
between versions of Git. It's really bad at comparing results between
any other dimensions. You can test different repository sizes by
tweaking the environment, but it can't aggregate or compare results
between those runs. Likewise, you can have two tests in a script which
time Git with and without certain options set, but there's no way to
compare the results of those tests.

It would be nice if the perf framework was aware of all of
these dimensions, stored each result as a tuple of all of the properties
(rather than just the version), and then let you group the results along
any dimension (I suspect there are cases where multi-dimensional
summaries would be useful, but that could come later).

For some dimensions you'd probably want support in the perf scripts
themselves to run a test with two variants. E.g., something like:

  test_perf_group 'fsmonitor' \
'false' 'git config core.fsmonitor false' \
 'true' 'git config core.fsmonitor true'
  test_perf 'status' 'git status'
  test_perf_group_end

where that would run the "git status" test for each of the named setups,
and store the timing results under "($VERSION, fsmonitor=false)", and so
on.

That's less flexible than specifying it to "./run" (which would let you
run just one tuple if you chose). But it also relieves the burden from
the user of figuring out which dimensions are interesting to tweak.

-Peff


Re: [PATCH] perf: work around the tested repo having an index.lock

2017-06-04 Thread Ævar Arnfjörð Bjarmason
On Sun, Jun 4, 2017 at 9:37 AM, Christian Couder
 wrote:
> On Sun, Jun 4, 2017 at 2:00 AM, Junio C Hamano  wrote:
>> Ævar Arnfjörð Bjarmason  writes:
>>
 My feeling exactly.  Diagnosing and failing upfront saying "well you
 made a copy but it is not suitable for testing" sounds more sensible
 at lesat to me.
>>>
>>> This change makes the repo suitable for testing when it wasn't before.
>>
>> Perhaps "not suitable" was a bit too vague.
>>
>> The copy you made is not in a consistent state that is good for
>> testing.  This change may declare that it is now in a consistent
>> state, but removal of a single *.lock file does not make it so.  We
>> do not know what other transient inconsistency the resulting copy
>> has; it is inherent to git-unaware copy---that is why we discouraged
>> and removed rsync transport after all.
>
> If we don't like git-unaware copies, maybe we should go back to the
> reasons why we are making one here.
> In 342e9ef2d9 (Introduce a performance testing framework, 2012-02-17),
> Thomas wrote:
>
> 3. Creating test repos from scratch in every test is extremely
>time-consuming, and shipping or downloading such large/weird repos
>is out of the question.
>
>We leave this decision to the user.  Two different sizes of test
>repos can be configured, and the scripts just copy one or more of
>those (using hardlinks for the object store).  By default it tries
>to use the build tree's git.git repository.
>
>This is fairly fast and versatile.  Using a copy instead of a clone
>preserves many properties that the user may want to test for, such
>as lots of loose objects, unpacked refs, etc.
>
> Is a local clone really much slower these days? Wouldn't it is use
> hard links too?
> By the way the many properties that are preserved might not be worth
> preserving as they could make results depend a lot on the current
> state of the original repo.

AFAICT from some quick testing it'll hardlink the objects/ dir, so
e.g. you preserve the loose objects. Making the results depend on the
state of the original repo is a feature, but perhaps it should be opt
in. It's very useful to be able to take a repo that's accrued e.g. a
month's worth of refs & loose objects and test that v.s. a fresh
clone.

But there are other things that ever a hardlink local clone doesn't
preserve which might be worth preserving...


Re: [WIP/PATCH 7/6] perf: add a performance test for core.fsmonitor

2017-06-04 Thread Ævar Arnfjörð Bjarmason
On Sun, Jun 4, 2017 at 3:59 AM, Junio C Hamano  wrote:
> Ævar Arnfjörð Bjarmason   writes:
>
>> This is WIP code for the reasons explained in the setup comments,
>> unfortunately the perf code doesn't easily allow you to run different
>> setup code for different versions you're testing. This test will stop
>> working if the fsmonitor is merged into the master branch.
>> ...
>> +
>> + # Relies on core.fsmonitor not being merged into master. Needs
>> + # better per-test ways to disable it if it gets merged.
>> + git config core.fsmonitor true &&
>
> Will stop working and relies on not merged can be read but I cannot
> read "why" explained, and I cannot quite guess what the reason is.
>
> If the code to read the configuration is not there, setting this
> would not have any effect.  If the code is there, setting this would
> have effect (either talking fsmonitor helps or it hurts).
>
> And I do not think we'd ever see a version of Git that always relies
> on talking to fsmonitor, i.e. "git config core.fsmonitor false" is not
> a way to disable it, so...
>
> Puzzled.

Sorry about the unclear brevity.

What I'm referring to is not a limitation of git (we'll always be able
to turn off core.fsmonitor), but a limitation of the perf framework.
There's no way to run a test like this:

./run master next -- p*.sh

And have some information passed to the test to apply different
runtime options to the test depending on master or next, or be to test
master twice, once with the fsmonitor, once without, which this
hypothetical feature would do:

./run master:"GIT_PERF_7519_NO_FSMONITOR=Y" master -- p*.sh

So right now the test works because there's no core.fsmonitor in
master, so turning it on all the time only impacts avar/fsmonitor, not
master.

I started trying to add this to the perf framework the other day but
ran out of time, the option should also be passed down early enough to
be intercepted by the GIT_PERF_MAKE_COMMAND, so you could do e.g.:

GIT_PERF_MAKE_COMMAND='make CFLAGS="$F"' \
./run v2.13.0:"F=-O0" v2.13.0:"F=-O1" v2.13.0:"F=-O2"
v2.13.0:"F=-O3" -- p*.sh

To test the same revision with different compilation flags.

A change like this would break the ability to enact certain perf
optimizations, right now we unpack the revision(s) you specify into
, and e.g. make use of the fact that that directory
is already unpacked so we don't need to unpack it again.

If there was no way to pass a flag to specific revisions being tested,
then perf could just optimize:

./run v2.12.0 v2.13.0 b06d364310 -- p*.sh

To skip the b06d364310 run entirely since it's the same as v2.13.0. I
think breaking this minor assumption in the framework is fine, but
it's worth noting that it's an assumption we couldn't make anymore.


Re: [PATCH] perf: work around the tested repo having an index.lock

2017-06-04 Thread Christian Couder
On Sun, Jun 4, 2017 at 2:00 AM, Junio C Hamano  wrote:
> Ævar Arnfjörð Bjarmason  writes:
>
>>> My feeling exactly.  Diagnosing and failing upfront saying "well you
>>> made a copy but it is not suitable for testing" sounds more sensible
>>> at lesat to me.
>>
>> This change makes the repo suitable for testing when it wasn't before.
>
> Perhaps "not suitable" was a bit too vague.
>
> The copy you made is not in a consistent state that is good for
> testing.  This change may declare that it is now in a consistent
> state, but removal of a single *.lock file does not make it so.  We
> do not know what other transient inconsistency the resulting copy
> has; it is inherent to git-unaware copy---that is why we discouraged
> and removed rsync transport after all.

If we don't like git-unaware copies, maybe we should go back to the
reasons why we are making one here.
In 342e9ef2d9 (Introduce a performance testing framework, 2012-02-17),
Thomas wrote:

3. Creating test repos from scratch in every test is extremely
   time-consuming, and shipping or downloading such large/weird repos
   is out of the question.

   We leave this decision to the user.  Two different sizes of test
   repos can be configured, and the scripts just copy one or more of
   those (using hardlinks for the object store).  By default it tries
   to use the build tree's git.git repository.

   This is fairly fast and versatile.  Using a copy instead of a clone
   preserves many properties that the user may want to test for, such
   as lots of loose objects, unpacked refs, etc.

Is a local clone really much slower these days? Wouldn't it is use
hard links too?
By the way the many properties that are preserved might not be worth
preserving as they could make results depend a lot on the current
state of the original repo.


Re: [PATCH] test-lib: add ability to cap the runtime of tests

2017-06-04 Thread Ævar Arnfjörð Bjarmason
On Sun, Jun 4, 2017 at 2:31 AM, Junio C Hamano  wrote:
> Ævar Arnfjörð Bjarmason   writes:
>
>> Speeding up the test suite by simply cataloging and skipping tests
>> that take longer than N seconds is a hassle to maintain, and entirely
>> skips some tests which would be nice to at least partially run,
>> e.g. instead of entirely skipping t3404-rebase-interactive.sh we can
>> run it for N seconds and get at least some "git rebase -i" test
>> coverage in a fast test run.
>
> I'd be more supportive to the former approach in the longer run for
> two reasons.
>
> Is it even safe to stop a test in the middle?  Won't we leave
> leftover server processes, for example?
>
> I see start_httpd at least sets up "trap" to call stop_httpd
> when the shell exits, so HTTP testing via lib-httpd.sh may be
> safe.  I do not know about other network-y tests, though.

When this flag is in effect and you run into the timeout the code is
semantically equivalent to not running subsequent test_expect_*
blocks, things like the trap in lib-httpd.sh will still run, so will
test_when_finished.

Unless we have some test killing a daemon in a test_expect_success
block later in the test this'll work as intended.

> Granted, when a test fails, we already have the same problem, but
> then we'd go in and investigate, and the first thing we notice would
> be that the old leftover server instance is holding onto the port to
> prevent the attempt to re-run the test from running, which then we'd
> kill.  But with this option, the user is not even made aware of
> tests being killed in the middle.
>
>> While running with a timeout of 10 seconds cuts the runtime in half,
>> over 92% of the tests are still run. The test coverage is higher than
>> that number indicates, just taking into account the many similar tests
>> t0027-auto-crlf.sh runs brings it up to 95%.
>
> I certainly understand that but in the longer term, I'd prefer the
> approach to call out an overly large test.  That will hopefully
> motivate us to split it (or speed up the thing) to help folks on
> many-core machines.

The reason I didn't document this in t/README was because I thought it
made sense to have this as a mostly hidden feature that end users
wouldn't be tempted to fiddle with, but would be useful to someone
doing git development.

Realistically I'm going to submit this patch, I'm not going to take
the much bigger project of refactoring the entire test suite so that
no test runs under N second, and of course any such refactoring can
only aim for a fixed instead of dynamic N.

The point of this change is that I can replace running e.g. "prove
t[0-9]*{grep,log}*.sh" with just running the full test suite every
time, since 30s is noticeably slow during regular hacking but once
it's down to 15s it's perceptively fast enough.

Reading between the lines in your reply, I think you're afraid that
regular users just testing git out will start using this, as opposed
to power user developers who understand the trade-offs. I think that's
mostly mitigated by not documenting it in t/README, but I could amend
the patch to add some scary commend to test-lib.sh as well.

> I am afraid that the proposed change will disincentivize that by
> sweeping the problematic ones under the rug.  Perhaps you can
> collect what tests are terminated in the middle because they run for
> too long and show the list of them at the end, or something?

This change incentivizes  me to be regularly running a larger % of the
full test suite.

Collecting the skipped ones is easy enough to do with a grep + for
loop, so I don't think it's worth making the implementation more
complex to occasionally answer the question of how many tests were
skipped due to running into the timeout:

$ rm .prove; for t in 20 10 5 1; do printf "%s\t" $t && (time
GIT_TEST_TIMEOUT=$t prove -j$(parallel --number-of-cores)
--state=slow,save -v t[0-9]*.sh) 2>&1 | grep -c "Exceeded
GIT_TEST_TIMEOUT"; done
rm: cannot remove ‘.prove’: No such file or directory
20  4
10  36
5   80
1   509

Of course that gives you "how many tests had skipped tests", now how
many test_expect_* blocks were skipped. An earlier WIP version of this
did the former, but e.g. running the rest of t0027-auto-crlf.sh took
many seconds just do spew out hundreds/thousands of lines in a shell
loop emitting "skip" lines, so I went with the to_skip=all
implementation.

> Also, I thought that it was a no-no to say "to_skil=all" with
> skipped-reason in the middle of a test when the test is run under
> prove?

TAP has two main modes of operation, you can either declare that
you're going to run N tests in advance and then you must run N, this
makes prove report progress on your tests as they run.

Or you can just run in a mode where you stream out however many tests
you're going to run as you go along, and then print "1..NUM_TESTS" at
the end.

We use the latter, so we can abort the entire test suite at any time
with test_done, that's what this change