Derrick Stolee 6cc017431c commit-reach: use can_all_from_reach
The is_descendant_of method previously used in_merge_bases() to check if
the commit can reach any of the commits in the provided list. This had
two performance problems:

1. The performance is quadratic in worst-case.

2. A single in_merge_bases() call requires walking beyond the target
   commit in order to find the full set of boundary commits that may be
   merge-bases.

The can_all_from_reach method avoids this quadratic behavior and can
limit the search beyond the target commits using generation numbers. It
requires a small prototype adjustment to stop using commit-date as a
cutoff, as that optimization is no longer appropriate here.

Since in_merge_bases() uses paint_down_to_common(), is_descendant_of()
naturally found cutoffs to avoid walking the entire commit graph. Since
we want to always return the correct result, we cannot use the
min_commit_date cutoff in can_all_from_reach. We then rely on generation
numbers to provide the cutoff.

Since not all repos will have a commit-graph file, nor will we always
have generation numbers computed for a commit-graph file, create a new
method, generation_numbers_enabled(), that checks for a commit-graph
file and sees if the first commit in the file has a non-zero generation
number. In the case that we do not have generation numbers, use the old
logic for is_descendant_of().

Performance was meausured on a copy of the Linux repository using the
'test-tool reach is_descendant_of' command using this input:

A:v4.9
X:v4.10
X:v4.11
X:v4.12
X:v4.13
X:v4.14
X:v4.15
X:v4.16
X:v4.17
X.v3.0

Note that this input is tailored to demonstrate the quadratic nature of
the previous method, as it will compute merge-bases for v4.9 versus all
of the later versions before checking against v4.1.

Before: 0.26 s
 After: 0.21 s

Since we previously used the is_descendant_of method in the ref_newer
method, we also measured performance there using
'test-tool reach ref_newer' with this input:

A:v4.9
B:v3.19

Before: 0.10 s
 After: 0.08 s

By adding a new commit with parent v3.19, we test the non-reachable case
of ref_newer:

Before: 0.09 s
 After: 0.08 s

Signed-off-by: Derrick Stolee <dstolee@microsoft.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2018-07-20 15:38:56 -07:00
2018-05-30 14:04:08 +09:00
2018-06-19 02:19:42 +09:00
2018-07-20 15:38:56 -07:00
2018-06-25 13:22:39 -07:00
2018-06-25 13:22:38 -07:00
2018-05-29 12:42:30 +09:00
2018-07-20 15:38:54 -07:00
2017-11-15 12:14:28 +09:00
2017-12-27 11:16:25 -08:00
2018-06-25 13:22:37 -07:00
2018-03-30 12:49:57 -07:00
2018-03-30 12:49:57 -07:00
2018-05-30 14:04:07 +09:00
2018-07-20 15:38:54 -07:00
2018-05-08 15:59:17 +09:00
2018-06-01 15:06:37 +09:00
2018-03-15 12:01:09 -07:00
2018-02-13 13:39:04 -08:00
2018-05-08 15:59:22 +09:00
2017-12-08 09:16:27 -08:00
2017-12-08 09:16:27 -08:00
2018-05-30 14:04:10 +09:00
2018-05-08 15:59:34 +09:00
2018-05-08 15:59:17 +09:00
2018-05-08 15:59:16 +09:00
2018-05-21 23:55:12 -04:00
2018-05-08 15:59:34 +09:00
2018-06-18 10:18:41 -07:00
2018-06-25 13:22:27 -07:00
2018-05-29 14:51:28 +09:00
2018-06-01 15:06:37 +09:00
2018-04-11 13:09:55 +09:00
2018-05-30 21:51:28 +09:00
2017-12-27 12:28:06 -08:00
2017-11-22 14:11:56 +09:00
2018-05-30 14:04:07 +09:00
2018-02-02 11:28:41 -08:00
2018-06-01 15:06:37 +09:00
2018-05-30 14:04:07 +09:00
2017-12-12 10:41:15 -08:00
2017-12-19 11:33:55 -08:00
2018-01-16 12:16:54 -08:00
2018-05-08 15:59:21 +09:00
2018-06-28 12:53:29 -07:00
2018-06-25 13:22:27 -07:00
2018-03-15 12:01:08 -07:00
2018-07-20 15:38:54 -07:00
2018-06-01 15:06:37 +09:00
2018-04-24 11:12:32 +09:00
2018-05-30 14:04:07 +09:00
2018-05-30 14:04:10 +09:00
2018-03-30 12:49:57 -07:00
2018-03-30 12:49:57 -07:00
2018-05-30 21:51:28 +09:00
2018-05-29 17:10:05 +09:00
2018-05-29 17:10:05 +09:00

Git - fast, scalable, distributed revision control system

Git is a fast, scalable, distributed revision control system with an unusually rich command set that provides both high-level operations and full access to internals.

Git is an Open Source project covered by the GNU General Public License version 2 (some parts of it are under different licenses, compatible with the GPLv2). It was originally written by Linus Torvalds with help of a group of hackers around the net.

Please read the file INSTALL for installation instructions.

Many Git online resources are accessible from https://git-scm.com/ including full documentation and Git related tools.

See Documentation/gittutorial.txt to get started, then see Documentation/giteveryday.txt for a useful minimum set of commands, and Documentation/git-.txt for documentation of each command. If git has been correctly installed, then the tutorial can also be read with man gittutorial or git help tutorial, and the documentation of each command with man git-<commandname> or git help <commandname>.

CVS users may also want to read Documentation/gitcvs-migration.txt (man gitcvs-migration or git help cvs-migration if git is installed).

The user discussion and development of Git take place on the Git mailing list -- everyone is welcome to post bug reports, feature requests, comments and patches to git@vger.kernel.org (read Documentation/SubmittingPatches for instructions on patch submission). To subscribe to the list, send an email with just "subscribe git" in the body to majordomo@vger.kernel.org. The mailing list archives are available at https://public-inbox.org/git/, http://marc.info/?l=git and other archival sites.

Issues which are security relevant should be disclosed privately to the Git Security mailing list git-security@googlegroups.com.

The maintainer frequently sends the "What's cooking" reports that list the current status of various development topics to the mailing list. The discussion following them give a good reference for project status, development direction and remaining tasks.

The name "git" was given by Linus Torvalds when he wrote the very first version. He described the tool as "the stupid content tracker" and the name as (depending on your mood):

  • random three-letter combination that is pronounceable, and not actually used by any common UNIX command. The fact that it is a mispronunciation of "get" may or may not be relevant.
  • stupid. contemptible and despicable. simple. Take your pick from the dictionary of slang.
  • "global information tracker": you're in a good mood, and it actually works for you. Angels sing, and a light suddenly fills the room.
  • "goddamn idiotic truckload of sh*t": when it breaks
Description
No description provided
Readme 610 MiB
Languages
C 50.4%
Shell 38.8%
Perl 4.4%
Tcl 3.1%
Python 0.8%
Other 2.3%