SZEDER Gábor 49f7a2fde9 name-rev: eliminate recursion in name_rev()
The name_rev() function calls itself recursively for each interesting
parent of the commit it got as parameter, and, consequently, it can
segfault when processing a deep history if it exhausts the available
stack space.  E.g. running 'git name-rev --all' and 'git name-rev
HEAD~100000' in the gcc, gecko-dev, llvm, and WebKit repositories
results in segfaults on my machine ('ulimit -s' reports 8192kB of
stack size limit), and nowadays the former segfaults in the Linux repo
as well (it reached the necessasry depth sometime between v5.3-rc4 and
-rc5).

Eliminate the recursion by inserting the interesting parents into a
LIFO 'prio_queue' [1] and iterating until the queue becomes empty.

Note that the parent commits must be added in reverse order to the
LIFO 'prio_queue', so their relative order is preserved during
processing, i.e. the first parent should come out first from the
queue, because otherwise performance greatly suffers on mergy
histories [2].

The stacksize-limited test 'name-rev works in a deep repo' in
't6120-describe.sh' demonstrated this issue and expected failure.  Now
the recursion is gone, so flip it to expect success.  Also gone are
the dmesg entries logging the segfault of that segfaulting 'git
name-rev' process on every execution of the test suite.

Note that this slightly changes the order of lines in the output of
'git name-rev --all', usually swapping two lines every 35 lines in
git.git or every 150 lines in linux.git.  This shouldn't matter in
practice, because the output has always been unordered anyway.

This patch is best viewed with '--ignore-all-space'.

[1] Early versions of this patch used a 'commit_list', resulting in
    ~15% performance penalty for 'git name-rev --all' in 'linux.git',
    presumably because of the memory allocation and release for each
    insertion and removal. Using a LIFO 'prio_queue' has basically no
    effect on performance.

[2] We prefer shorter names, i.e. 'v0.1~234' is preferred over
    'v0.1^2~5', meaning that usually following the first parent of a
    merge results in the best name for its ancestors.  So when later
    we follow the remaining parent(s) of a merge, and reach an already
    named commit, then we usually find that we can't give that commit
    a better name, and thus we don't have to visit any of its
    ancestors again.

    OTOH, if we were to follow the Nth parent of the merge first, then
    the name of all its ancestors would include a corresponding '^N'.
    Those are not the best names for those commits, so when later we
    reach an already named commit following the first parent of that
    merge, then we would have to update the name of that commit and
    the names of all of its ancestors as well.  Consequently, we would
    have to visit many commits several times, resulting in a
    significant slowdown.

Signed-off-by: SZEDER Gábor <szeder.dev@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2019-12-09 13:33:01 -08:00
2019-10-24 13:34:03 +09:00
2019-05-14 16:45:01 +09:00
2019-09-28 14:04:16 +09:00
2019-10-15 13:48:02 +09:00
2018-09-12 15:15:34 -07:00
2019-08-19 15:04:58 -07:00
2019-10-15 13:48:02 +09:00
2019-07-19 11:30:20 -07:00
2019-07-09 15:25:44 -07:00
2019-07-09 15:25:44 -07:00
2019-07-25 13:59:20 -07:00
2019-08-19 15:04:58 -07:00
2019-10-15 13:48:00 +09:00
2019-10-07 11:32:58 +09:00
2019-10-15 13:48:02 +09:00
2019-10-11 14:24:46 +09:00
2019-09-12 11:03:51 -07:00
2019-07-09 15:25:43 -07:00
2019-05-05 15:20:10 +09:00
2019-10-15 13:48:02 +09:00
2019-08-19 15:04:57 -07:00
2019-10-15 13:48:02 +09:00
2019-07-19 11:30:20 -07:00
2019-07-25 13:59:20 -07:00
2019-11-04 13:33:06 +09:00
2019-08-30 10:22:42 -07:00
2019-09-30 13:19:24 +09:00
2019-08-15 12:37:10 -07:00
2019-04-22 11:14:43 +09:00
2018-08-29 13:05:35 -07:00
2019-10-15 13:48:02 +09:00
2019-01-14 12:13:04 -08:00
2019-08-19 15:05:00 -07:00
2019-07-19 11:30:20 -07:00
2019-07-19 11:30:20 -07:00
2019-05-05 15:20:10 +09:00
2019-10-15 13:48:02 +09:00
2019-02-06 22:05:23 -08:00
2019-02-05 14:26:09 -08:00
2018-11-02 12:14:21 +09:00
2019-09-17 09:39:16 -07:00
2019-10-15 13:48:02 +09:00
2019-10-15 13:48:02 +09:00
2019-10-12 21:29:30 +05:30
2019-10-15 13:48:02 +09:00
2018-08-15 15:08:23 -07:00
2019-04-01 11:57:39 +09:00
2019-08-22 12:41:04 -07:00
2019-08-19 15:04:59 -07:00
2019-10-15 13:48:02 +09:00
2019-10-15 13:48:02 +09:00
2019-05-05 15:20:10 +09:00
2019-09-30 13:19:26 +09:00
2019-10-11 14:24:46 +09:00
2019-10-11 14:24:48 +09:00
2019-02-05 14:26:11 -08:00
2018-12-09 12:37:32 +09:00
2019-09-05 14:10:18 -07:00
2019-09-05 14:10:18 -07:00
2019-05-13 23:50:35 +09:00
2019-08-13 12:21:33 -07:00
2019-05-05 15:20:10 +09:00
2019-09-03 15:10:53 -07:00
2019-10-12 10:57:39 +09:00
2019-10-09 14:01:00 +09:00
2018-10-19 13:34:02 +09:00
2019-10-11 14:24:46 +09:00

Build Status

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-<commandname>.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 279 MiB
Languages
C 50.5%
Shell 38.7%
Perl 4.5%
Tcl 3.2%
Python 0.8%
Other 2.1%