Derrick Stolee f0d9cc4196 revision.c: begin refactoring --topo-order logic
When running 'git rev-list --topo-order' and its kin, the topo_order
setting in struct rev_info implies the limited setting. This means
that the following things happen during prepare_revision_walk():

* revs->limited implies we run limit_list() to walk the entire
  reachable set. There are some short-cuts here, such as if we
  perform a range query like 'git rev-list COMPARE..HEAD' and we
  can stop limit_list() when all queued commits are uninteresting.

* revs->topo_order implies we run sort_in_topological_order(). See
  the implementation of that method in commit.c. It implies that
  the full set of commits to order is in the given commit_list.

These two methods imply that a 'git rev-list --topo-order HEAD'
command must walk the entire reachable set of commits _twice_ before
returning a single result.

If we have a commit-graph file with generation numbers computed, then
there is a better way. This patch introduces some necessary logic
redirection when we are in this situation.

In v2.18.0, the commit-graph file contains zero-valued bytes in the
positions where the generation number is stored in v2.19.0 and later.
Thus, we use generation_numbers_enabled() to check if the commit-graph
is available and has non-zero generation numbers.

When setting revs->limited only because revs->topo_order is true,
only do so if generation numbers are not available. There is no
reason to use the new logic as it will behave similarly when all
generation numbers are INFINITY or ZERO.

In prepare_revision_walk(), if we have revs->topo_order but not
revs->limited, then we trigger the new logic. It breaks the logic
into three pieces, to fit with the existing framework:

1. init_topo_walk() fills a new struct topo_walk_info in the rev_info
   struct. We use the presence of this struct as a signal to use the
   new methods during our walk. In this patch, this method simply
   calls limit_list() and sort_in_topological_order(). In the future,
   this method will set up a new data structure to perform that logic
   in-line.

2. next_topo_commit() provides get_revision_1() with the next topo-
   ordered commit in the list. Currently, this simply pops the commit
   from revs->commits.

3. expand_topo_walk() provides get_revision_1() with a way to signal
   walking beyond the latest commit. Currently, this calls
   add_parents_to_list() exactly like the old logic.

While this commit presents method redirection for performing the
exact same logic as before, it allows the next commit to focus only
on the new logic.

Signed-off-by: Derrick Stolee <dstolee@microsoft.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2018-11-02 12:14:22 +09:00
2018-08-02 13:54:58 -07:00
2018-11-02 12:14:22 +09:00
2018-08-20 12:41:32 -07:00
2018-08-20 11:33:53 -07:00
2018-08-20 11:33:53 -07:00
2018-08-13 14:14:43 -07:00
2018-08-20 12:41:32 -07:00
2018-08-20 12:41:32 -07:00
2018-07-26 10:12:51 -07:00
2018-08-29 11:32:49 -07:00
2018-08-29 11:32:49 -07:00
2018-09-17 13:53:57 -07:00
2018-09-17 13:53:57 -07:00
2018-03-30 12:49:57 -07:00
2018-03-30 12:49:57 -07:00
2018-09-17 13:53:52 -07:00
2018-09-17 13:53:57 -07:00
2018-09-17 13:53:54 -07:00
2018-05-08 15:59:17 +09:00
2018-08-20 12:41:32 -07:00
2018-08-29 11:32:49 -07:00
2018-08-20 11:33:53 -07:00
2018-08-20 12:41:32 -07:00
2018-08-16 10:51:17 -07:00
2018-09-17 13:53:57 -07:00
2018-09-17 13:53:57 -07:00
2018-09-17 13:53:54 -07:00
2018-08-20 12:41:32 -07:00
2018-09-17 13:53:57 -07:00
2018-05-08 15:59:17 +09:00
2018-09-17 13:53:57 -07:00
2018-08-02 15:30:43 -07:00
2018-08-02 15:30:42 -07:00
2018-05-08 15:59:34 +09:00
2018-08-20 11:33:50 -07:00
2018-08-01 13:37:18 -07:00
2018-09-17 14:16:29 -07:00
2018-08-20 11:33:50 -07:00
2018-08-02 15:30:44 -07:00
2018-08-02 15:30:44 -07:00
2018-07-16 14:27:39 -07:00
2018-09-17 13:53:57 -07:00
2018-08-29 11:32:49 -07:00
2018-05-30 21:51:28 +09:00
2018-09-17 13:53:57 -07:00
2018-08-29 13:05:35 -07:00
2018-09-17 13:53:57 -07:00
2018-08-02 15:30:45 -07:00
2018-08-20 15:31:40 -07:00
2018-08-20 15:31:40 -07:00
2018-09-17 13:53:57 -07:00
2018-08-29 11:32:49 -07:00
2018-08-20 15:31:40 -07:00
2018-08-29 11:32:49 -07:00
2018-09-17 13:53:52 -07:00
2018-09-17 13:53:57 -07:00
2018-09-17 13:53:55 -07:00
2018-09-17 13:53:57 -07:00
2018-08-20 15:31:40 -07:00
2018-06-01 15:06:37 +09:00
2018-07-18 12:20:28 -07:00
2018-09-17 13:53:54 -07:00
2018-11-02 12:14:21 +09:00
2018-11-02 12:14:21 +09:00
2018-09-17 13:53:57 -07:00
2018-09-17 13:53:54 -07:00
2018-08-15 15:08:23 -07:00
2018-08-29 11:32:49 -07:00
2018-09-17 14:16:29 -07:00
2018-08-20 11:33:50 -07:00
2018-09-17 13:53:57 -07:00
2018-09-17 13:53:52 -07:00
2018-08-15 15:08:23 -07:00
2018-09-17 13:53:51 -07:00
2018-09-17 13:53:57 -07:00
2018-09-17 13:53:54 -07:00
2018-03-15 12:01:08 -07:00
2018-08-20 15:31:40 -07:00
2018-09-17 13:53:57 -07:00
2018-07-20 15:38:54 -07:00
2018-06-01 15:06:37 +09:00
2018-08-15 15:08:25 -07:00
2018-09-17 13:53:57 -07:00
2018-09-17 13:53:54 -07:00
2018-08-29 11:32:49 -07:00
2018-08-02 15:30:39 -07:00
2018-09-17 13:53:57 -07:00
2018-09-17 13:53:52 -07:00
2018-08-15 11:52:09 -07:00
2018-05-30 21:51:28 +09:00
2018-08-15 15:08:25 -07:00
2018-08-20 12:41:32 -07:00
2018-07-18 12:20:28 -07:00
2018-08-29 11:32:49 -07: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 606 MiB
Languages
C 50.5%
Shell 38.8%
Perl 4.4%
Tcl 3.2%
Python 0.8%
Other 2.1%