Johan Herland 23123aecf8 Teach the notes lookup code to parse notes trees with various fanout schemes
The semantics used when parsing notes trees (with regards to fanout subtrees)
follow Dscho's proposal fairly closely:
- No concatenation/merging of notes is performed. If there are several notes
  objects referencing a given commit, only one of those objects are used.
- If a notes object for a given commit is present in the "root" notes tree,
  no subtrees are consulted; the object in the root tree is used directly.
- If there are more than one subtree that prefix-matches the given commit,
  only the subtree with the longest matching prefix is consulted. This
  means that if the given commit is e.g. "deadbeef", and the notes tree have
  subtrees "de" and "dead", then the following paths in the notes tree are
  searched: "deadbeef", "dead/beef". Note that "de/adbeef" is NOT searched.
- Fanout directories (subtrees) must references a whole number of bytes
  from the SHA1 sum they subdivide. E.g. subtrees "dead" and "de" are
  acceptable; "d" and "dea" are not.
- Multiple levels of fanout are allowed. All the above rules apply
  recursively. E.g. "de/adbeef" is preferred over "de/adbe/ef", etc.

This patch changes the in-memory datastructure for holding parsed notes:
Instead of holding all note (and subtree) entries in a hash table, a
simple 16-tree structure is used instead. The tree structure consists of
16-arrays as internal nodes, and note/subtree entries as leaf nodes. The
tree is traversed by indexing subsequent nibbles of the search key until
a leaf node is encountered. If a subtree entry is encountered while
searching for a note, the subtree is unpacked into the 16-tree structure,
and the search continues into that subtree.

The new algorithm performs significantly better in the cases where only
a fraction of the notes need to be looked up (this is assumed to be the
common case for notes lookup). The new code even performs marginally
better in the worst case (where _all_ the notes are looked up).

In addition to this, comes the massive performance win associated with
organizing the notes tree according to some fanout scheme. Even a simple
2/38 fanout scheme is dramatically quicker to traverse (going from tens of
seconds to sub-second runtimes).

As for memory usage, the new code is marginally better than the old code in
the worst case, but in the case of looking up only some notes from a notes
tree with proper fanout, the new code uses only a small fraction of the
memory needed to hold the entire notes tree.

However, there is one casualty of this patch. The old notes lookup code was
able to parse notes that were associated with non-SHA1s (e.g. refs). The new
code requires the referenced object to be named by a SHA1 sum. Still, this
is not considered a major setback, since the notes infrastructure was not
originally intended to annotate objects outside the Git object database.

Cc: Johannes Schindelin <johannes.schindelin@gmx.de>
Signed-off-by: Johan Herland <johan@herland.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2009-10-19 19:00:24 -07:00
2009-10-09 00:02:23 -07:00
2009-05-01 22:11:57 -07:00
2009-08-31 22:09:53 -07:00
2009-10-19 18:59:42 -07:00
2009-09-14 02:23:36 -07:00
2008-07-19 11:17:43 -07:00
2009-06-30 16:12:24 -07:00
2009-04-17 21:05:49 -07:00
2009-06-18 09:22:46 -07:00
2008-08-28 20:50:10 -07:00
2009-03-14 13:36:34 -07:00
2009-08-21 18:47:53 -07:00
2009-09-13 01:30:53 -07:00
2009-08-05 12:39:33 -07:00
2009-10-04 14:48:51 -07:00
2009-08-07 22:35:17 -07:00
2009-10-19 18:59:42 -07:00
2009-02-13 17:27:58 -08:00
2009-07-22 21:56:46 -07:00
2009-10-19 18:59:42 -07:00
2009-10-19 18:59:42 -07:00
2009-09-13 01:32:26 -07:00
2008-10-10 08:39:20 -07:00
2009-05-01 16:07:29 -07:00
2009-07-06 09:39:46 -07:00
2009-10-03 06:04:38 -04:00
2009-05-20 00:02:24 -07:00
2009-06-18 09:22:46 -07:00
2009-08-28 19:38:19 -07:00
2008-11-02 16:36:40 -08:00
2009-10-19 18:59:42 -07:00
2009-04-22 19:02:12 -07:00
2008-07-13 14:12:48 -07:00
2009-10-10 00:05:19 -07:00
2009-09-13 01:31:55 -07:00
2008-09-25 08:00:28 -07:00
2009-07-02 21:36:42 -07:00
2009-09-13 01:30:53 -07:00
2009-09-18 20:00:42 -07:00
2008-09-07 23:52:16 -07:00
2009-08-05 18:37:12 -07:00
2009-09-14 14:48:27 -07:00
2009-04-22 19:02:12 -07:00
2009-10-19 18:59:42 -07:00
2008-10-25 12:09:31 -07:00
2009-08-21 18:47:53 -07:00
2009-09-18 20:00:42 -07:00
2009-08-21 18:47:53 -07:00
2009-09-16 14:53:26 -07:00
2009-06-20 21:47:27 -07:00
2009-02-14 21:27:35 -08:00
2009-09-18 20:00:42 -07:00
2009-08-21 18:47:53 -07:00
2008-07-21 19:11:50 -07:00
2008-03-02 15:11:07 -08:00
2009-01-17 18:30:41 -08:00
2009-08-30 22:04:46 -07:00
2009-09-20 12:13:47 -07:00
2009-09-13 01:31:55 -07:00
2009-04-20 13:44:14 -07:00
2009-07-18 16:57:47 -07:00
2009-10-01 04:12:21 -04:00
2009-02-04 16:30:43 -08:00
2009-07-22 21:57:41 -07:00

////////////////////////////////////////////////////////////////

	GIT - the stupid content tracker

////////////////////////////////////////////////////////////////

"git" can mean anything, 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

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.
It was originally written by Linus Torvalds with help of a group of
hackers around the net. It is currently maintained by Junio C Hamano.

Please read the file INSTALL for installation instructions.

See Documentation/gittutorial.txt to get started, then see
Documentation/everyday.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).

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

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. 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
http://marc.theaimsgroup.com/?l=git and other archival sites.

The messages titled "A note from the maintainer", "What's in
git.git (stable)" and "What's cooking in git.git (topics)" and
the discussion following them on the mailing list give a good
reference for project status, development direction and
remaining tasks.
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%