<feed xmlns='http://www.w3.org/2005/Atom'>
<title>git, branch v2.19.0-rc2</title>
<subtitle>Fork of git SCM with my patches.</subtitle>
<id>http://git.kilabit.info/git/atom?h=v2.19.0-rc2</id>
<link rel='self' href='http://git.kilabit.info/git/atom?h=v2.19.0-rc2'/>
<link rel='alternate' type='text/html' href='http://git.kilabit.info/git/'/>
<updated>2018-09-04T21:33:27Z</updated>
<entry>
<title>Git 2.19-rc2</title>
<updated>2018-09-04T21:33:27Z</updated>
<author>
<name>Junio C Hamano</name>
<email>gitster@pobox.com</email>
</author>
<published>2018-09-04T21:33:27Z</published>
<link rel='alternate' type='text/html' href='http://git.kilabit.info/git/commit/?id=c05048d43925ab8edcb36663752c2b4541911231'/>
<id>urn:sha1:c05048d43925ab8edcb36663752c2b4541911231</id>
<content type='text'>
Signed-off-by: Junio C Hamano &lt;gitster@pobox.com&gt;
</content>
</entry>
<entry>
<title>Merge branch 'es/chain-lint-more'</title>
<updated>2018-09-04T21:31:40Z</updated>
<author>
<name>Junio C Hamano</name>
<email>gitster@pobox.com</email>
</author>
<published>2018-09-04T21:31:40Z</published>
<link rel='alternate' type='text/html' href='http://git.kilabit.info/git/commit/?id=e9983f8965c0875cc6727e9644c84ff1dfc99372'/>
<id>urn:sha1:e9983f8965c0875cc6727e9644c84ff1dfc99372</id>
<content type='text'>
The test linter code has learned that the end of here-doc mark
"EOF" can be quoted in a double-quote pair, not just in a
single-quote pair.

* es/chain-lint-more:
  chainlint: match "quoted" here-doc tags
</content>
</entry>
<entry>
<title>Merge branch 'ab/portable-more'</title>
<updated>2018-09-04T21:31:40Z</updated>
<author>
<name>Junio C Hamano</name>
<email>gitster@pobox.com</email>
</author>
<published>2018-09-04T21:31:40Z</published>
<link rel='alternate' type='text/html' href='http://git.kilabit.info/git/commit/?id=28d294a5ea27fef18a987f8b526f5e1e72ede674'/>
<id>urn:sha1:28d294a5ea27fef18a987f8b526f5e1e72ede674</id>
<content type='text'>
Portability fix.

* ab/portable-more:
  tests: fix non-portable iconv invocation
  tests: fix non-portable "${var:-"str"}" construct
  tests: fix and add lint for non-portable grep --file
  tests: fix version-specific portability issue in Perl JSON
  tests: use shorter labels in chainlint.sed for AIX sed
  tests: fix comment syntax in chainlint.sed for AIX sed
  tests: fix and add lint for non-portable seq
  tests: fix and add lint for non-portable head -c N
</content>
</entry>
<entry>
<title>Merge branch 'es/freebsd-iconv-portability'</title>
<updated>2018-09-04T21:31:39Z</updated>
<author>
<name>Junio C Hamano</name>
<email>gitster@pobox.com</email>
</author>
<published>2018-09-04T21:31:39Z</published>
<link rel='alternate' type='text/html' href='http://git.kilabit.info/git/commit/?id=b571c25e33cc8d7ac1cae66e34ce60fa7a0a3b0a'/>
<id>urn:sha1:b571c25e33cc8d7ac1cae66e34ce60fa7a0a3b0a</id>
<content type='text'>
Build fix.

* es/freebsd-iconv-portability:
  config.mak.uname: resolve FreeBSD iconv-related compilation warning
</content>
</entry>
<entry>
<title>Merge branch 'ds/commit-graph-lockfile-fix'</title>
<updated>2018-09-04T21:31:39Z</updated>
<author>
<name>Junio C Hamano</name>
<email>gitster@pobox.com</email>
</author>
<published>2018-09-04T21:31:39Z</published>
<link rel='alternate' type='text/html' href='http://git.kilabit.info/git/commit/?id=0a866db570e520ce7b08d1eceefdeaa9d63b6704'/>
<id>urn:sha1:0a866db570e520ce7b08d1eceefdeaa9d63b6704</id>
<content type='text'>
"git merge-base" in 2.19-rc1 has performance regression when the
(experimental) commit-graph feature is in use, which has been
mitigated.

* ds/commit-graph-lockfile-fix:
  commit: don't use generation numbers if not needed
</content>
</entry>
<entry>
<title>Merge branch 'en/directory-renames-nothanks'</title>
<updated>2018-09-04T21:31:38Z</updated>
<author>
<name>Junio C Hamano</name>
<email>gitster@pobox.com</email>
</author>
<published>2018-09-04T21:31:38Z</published>
<link rel='alternate' type='text/html' href='http://git.kilabit.info/git/commit/?id=ca676b9bd354e846ac207e7879760719826517ce'/>
<id>urn:sha1:ca676b9bd354e846ac207e7879760719826517ce</id>
<content type='text'>
Recent addition of "directory rename" heuristics to the
merge-recursive backend makes the command susceptible to false
positives and false negatives.  In the context of "git am -3",
which does not know about surrounding unmodified paths and thus
cannot inform the merge machinery about the full trees involved,
this risk is particularly severe.  As such, the heuristic is
disabled for "git am -3" to keep the machinery "more stupid but
predictable".

* en/directory-renames-nothanks:
  am: avoid directory rename detection when calling recursive merge machinery
  merge-recursive: add ability to turn off directory rename detection
  t3401: add another directory rename testcase for rebase and am
</content>
</entry>
<entry>
<title>Merge branch 'pw/rebase-i-author-script-fix'</title>
<updated>2018-09-04T21:31:38Z</updated>
<author>
<name>Junio C Hamano</name>
<email>gitster@pobox.com</email>
</author>
<published>2018-09-04T21:31:38Z</published>
<link rel='alternate' type='text/html' href='http://git.kilabit.info/git/commit/?id=064e0b2d4ca76b0c438545a4d2170e589327e31f'/>
<id>urn:sha1:064e0b2d4ca76b0c438545a4d2170e589327e31f</id>
<content type='text'>
Recent "git rebase -i" update started to write bogusly formatted
author-script, with a matching broken reading code.  These are
fixed.

* pw/rebase-i-author-script-fix:
  sequencer: fix quoting in write_author_script
  sequencer: handle errors from read_author_ident()
</content>
</entry>
<entry>
<title>config.mak.uname: resolve FreeBSD iconv-related compilation warning</title>
<updated>2018-08-31T19:05:24Z</updated>
<author>
<name>Eric Sunshine</name>
<email>sunshine@sunshineco.com</email>
</author>
<published>2018-08-31T08:33:42Z</published>
<link rel='alternate' type='text/html' href='http://git.kilabit.info/git/commit/?id=6c6ce21baa9b50d394bb8ed9878944504ffd57d8'/>
<id>urn:sha1:6c6ce21baa9b50d394bb8ed9878944504ffd57d8</id>
<content type='text'>
OLD_ICONV has long been needed by FreeBSD so config.mak.uname defines
it unconditionally. However, recent versions do not need it, and its
presence results in compilation warnings. Resolve this issue by defining
OLD_ICONV only for older FreeBSD versions.

Specifically, revision r281550[1], which is part of FreeBSD 11, removed
the need for OLD_ICONV, and r282275[2] back-ported that change to 10.2.
Versions prior to 10.2 do need it.

[1] https://github.com/freebsd/freebsd/commit/b0813ee288f64f677a2cebf7815754b027a8215b
[2] https://github.com/freebsd/freebsd/commit/b709ec868adb5170d09bc5a66b18d0e0d5987ab6

[es: commit message; tweak version check to distinguish 10.x versions]

Signed-off-by: Jonathan Nieder &lt;jrnieder@gmail.com&gt;
Signed-off-by: Eric Sunshine &lt;sunshine@sunshineco.com&gt;
Reviewed-by: Jonathan Nieder &lt;jrnieder@gmail.com&gt;
Signed-off-by: Junio C Hamano &lt;gitster@pobox.com&gt;
</content>
</entry>
<entry>
<title>commit: don't use generation numbers if not needed</title>
<updated>2018-08-30T18:17:57Z</updated>
<author>
<name>Derrick Stolee</name>
<email>dstolee@microsoft.com</email>
</author>
<published>2018-08-30T12:58:09Z</published>
<link rel='alternate' type='text/html' href='http://git.kilabit.info/git/commit/?id=091f4cf3586957c3fd99d4c4c59c569d009137ad'/>
<id>urn:sha1:091f4cf3586957c3fd99d4c4c59c569d009137ad</id>
<content type='text'>
In 3afc679b "commit: use generations in paint_down_to_common()",
the queue in paint_down_to_common() was changed to use a priority
order based on generation number before commit date. This served
two purposes:

 1. When generation numbers are present, the walk guarantees
    correct topological relationships, regardless of clock skew in
    commit dates.

 2. It enables short-circuiting the walk when the min_generation
    parameter is added in d7c1ec3e "commit: add short-circuit to
    paint_down_to_common()". This short-circuit helps commands
    like 'git branch --contains' from needing to walk to a merge
    base when we know the result is false.

The commit message for 3afc679b includes the following sentence:

    This change does not affect the number of commits that are
    walked during the execution of paint_down_to_common(), only
    the order that those commits are inspected.

This statement is incorrect. Because it changes the order in which
the commits are inspected, it changes the order they are added to
the queue, and hence can change the number of loops before the
queue_has_nonstale() method returns true.

This change makes a concrete difference depending on the topology
of the commit graph. For instance, computing the merge-base between
consecutive versions of the Linux kernel has no effect for versions
after v4.9, but 'git merge-base v4.8 v4.9' presents a performance
regression:

    v2.18.0: 0.122s
v2.19.0-rc1: 0.547s
       HEAD: 0.127s

To determine that this was simply an ordering issue, I inserted
a counter within the while loop of paint_down_to_common() and
found that the loop runs 167,468 times in v2.18.0 and 635,579
times in v2.19.0-rc1.

The topology of this case can be described in a simplified way
here:

  v4.9
   |  \
   |   \
  v4.8  \
   | \   \
   |  \   |
  ...  A  B
   |  /  /
   | /  /
   |/__/
   C

Here, the "..." means "a very long line of commits". By generation
number, A and B have generation one more than C. However, A and B
have commit date higher than most of the commits reachable from
v4.8. When the walk reaches v4.8, we realize that it has PARENT1
and PARENT2 flags, so everything it can reach is marked as STALE,
including A. B has only the PARENT1 flag, so is not STALE.

When paint_down_to_common() is run using
compare_commits_by_commit_date, A and B are removed from the queue
early and C is inserted into the queue. At this point, C and the
rest of the queue entries are marked as STALE. The loop then
terminates.

When paint_down_to_common() is run using
compare_commits_by_gen_then_commit_date, B is removed from the
queue only after the many commits reachable from v4.8 are explored.
This causes the loop to run longer. The reason for this regression
is simple: the queue order is intended to not explore a commit
until everything that _could_ reach that commit is explored. From
the information gathered by the original ordering, we have no
guarantee that there is not a commit D reachable from v4.8 that
can also reach B. We gained absolute correctness in exchange for
a performance regression.

The performance regression is probably the worse option, since
these incorrect results in paint_down_to_common() are rare. The
topology required for the performance regression are less rare,
but still require multiple merge commits where the parents differ
greatly in generation number. In our example above, the commit A
is as important as the commit B to demonstrate the problem, since
otherwise the commit C will sit in the queue as non-stale just as
long in both orders.

The solution provided uses the min_generation parameter to decide
if we should use generation numbers in our ordering. When
min_generation is equal to zero, it means that the caller has no
known cutoff for the walk, so we should rely on our commit-date
heuristic as before; this is the case with merge_bases_many().
When min_generation is non-zero, then the caller knows a valuable
cutoff for the short-circuit mechanism; this is the case with
remove_redundant() and in_merge_bases_many().

Signed-off-by: Derrick Stolee &lt;dstolee@microsoft.com&gt;
Signed-off-by: Junio C Hamano &lt;gitster@pobox.com&gt;
</content>
</entry>
<entry>
<title>am: avoid directory rename detection when calling recursive merge machinery</title>
<updated>2018-08-30T14:58:59Z</updated>
<author>
<name>Elijah Newren</name>
<email>newren@gmail.com</email>
</author>
<published>2018-08-29T07:06:13Z</published>
<link rel='alternate' type='text/html' href='http://git.kilabit.info/git/commit/?id=6aba117d5cf7128e7bc942888263552fe927e13f'/>
<id>urn:sha1:6aba117d5cf7128e7bc942888263552fe927e13f</id>
<content type='text'>
Let's say you have the following three trees, where Base is from one commit
behind either master or branch:

   Base  : bar_v1, foo/{file1, file2, file3}
   branch: bar_v2, foo/{file1, file2},       goo/file3
   master: bar_v3, foo/{file1, file2, file3}

Using git-am (or am-based rebase) to apply the changes from branch onto
master results in the following tree:

   Result: bar_merged, goo/{file1, file2, file3}

This is not what users want; they did not rename foo/ -&gt; goo/, they only
renamed one file within that directory.  The reason this happens is am
constructs fake trees (via build_fake_ancestor()) of the following form:

   Base_bfa  : bar_v1, foo/file3
   branch_bfa: bar_v2, goo/file3

Combining these two trees with master's tree:

   master: bar_v3, foo/{file1, file2, file3},

You can see that merge_recursive_generic() would see branch_bfa as renaming
foo/ -&gt; goo/, and master as just adding both foo/file1 and foo/file2.  As
such, it ends up with goo/{file1, file2, file3}

The core problem is that am does not have access to the original trees; it
can only construct trees using the blobs involved in the patch.  As such,
it is not safe to perform directory rename detection within am -3.

Signed-off-by: Elijah Newren &lt;newren@gmail.com&gt;
Signed-off-by: Junio C Hamano &lt;gitster@pobox.com&gt;
</content>
</entry>
</feed>
