Skip to content
This repository was archived by the owner on Sep 11, 2020. It is now read-only.

Commit 7d26957

Browse files
committed
Add doc.go for commitgraph packages
Signed-off-by: Filip Navara <filip.navara@gmail.com>
1 parent 940460f commit 7d26957

File tree

4 files changed

+113
-0
lines changed

4 files changed

+113
-0
lines changed

plumbing/format/commitgraph/doc.go

Lines changed: 103 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,103 @@
1+
// Package commitgraph implements encoding and decoding of commit-graph files.
2+
//
3+
// Git commit graph format
4+
// =======================
5+
//
6+
// The Git commit graph stores a list of commit OIDs and some associated
7+
// metadata, including:
8+
//
9+
// - The generation number of the commit. Commits with no parents have
10+
// generation number 1; commits with parents have generation number
11+
// one more than the maximum generation number of its parents. We
12+
// reserve zero as special, and can be used to mark a generation
13+
// number invalid or as "not computed".
14+
//
15+
// - The root tree OID.
16+
//
17+
// - The commit date.
18+
//
19+
// - The parents of the commit, stored using positional references within
20+
// the graph file.
21+
//
22+
// These positional references are stored as unsigned 32-bit integers
23+
// corresponding to the array position within the list of commit OIDs. Due
24+
// to some special constants we use to track parents, we can store at most
25+
// (1 << 30) + (1 << 29) + (1 << 28) - 1 (around 1.8 billion) commits.
26+
//
27+
// == Commit graph files have the following format:
28+
//
29+
// In order to allow extensions that add extra data to the graph, we organize
30+
// the body into "chunks" and provide a binary lookup table at the beginning
31+
// of the body. The header includes certain values, such as number of chunks
32+
// and hash type.
33+
//
34+
// All 4-byte numbers are in network order.
35+
//
36+
// HEADER:
37+
//
38+
// 4-byte signature:
39+
// The signature is: {'C', 'G', 'P', 'H'}
40+
//
41+
// 1-byte version number:
42+
// Currently, the only valid version is 1.
43+
//
44+
// 1-byte Hash Version (1 = SHA-1)
45+
// We infer the hash length (H) from this value.
46+
//
47+
// 1-byte number (C) of "chunks"
48+
//
49+
// 1-byte (reserved for later use)
50+
// Current clients should ignore this value.
51+
//
52+
// CHUNK LOOKUP:
53+
//
54+
// (C + 1) * 12 bytes listing the table of contents for the chunks:
55+
// First 4 bytes describe the chunk id. Value 0 is a terminating label.
56+
// Other 8 bytes provide the byte-offset in current file for chunk to
57+
// start. (Chunks are ordered contiguously in the file, so you can infer
58+
// the length using the next chunk position if necessary.) Each chunk
59+
// ID appears at most once.
60+
//
61+
// The remaining data in the body is described one chunk at a time, and
62+
// these chunks may be given in any order. Chunks are required unless
63+
// otherwise specified.
64+
//
65+
// CHUNK DATA:
66+
//
67+
// OID Fanout (ID: {'O', 'I', 'D', 'F'}) (256 * 4 bytes)
68+
// The ith entry, F[i], stores the number of OIDs with first
69+
// byte at most i. Thus F[255] stores the total
70+
// number of commits (N).
71+
//
72+
// OID Lookup (ID: {'O', 'I', 'D', 'L'}) (N * H bytes)
73+
// The OIDs for all commits in the graph, sorted in ascending order.
74+
//
75+
// Commit Data (ID: {'C', 'D', 'A', 'T' }) (N * (H + 16) bytes)
76+
// * The first H bytes are for the OID of the root tree.
77+
// * The next 8 bytes are for the positions of the first two parents
78+
// of the ith commit. Stores value 0x7000000 if no parent in that
79+
// position. If there are more than two parents, the second value
80+
// has its most-significant bit on and the other bits store an array
81+
// position into the Extra Edge List chunk.
82+
// * The next 8 bytes store the generation number of the commit and
83+
// the commit time in seconds since EPOCH. The generation number
84+
// uses the higher 30 bits of the first 4 bytes, while the commit
85+
// time uses the 32 bits of the second 4 bytes, along with the lowest
86+
// 2 bits of the lowest byte, storing the 33rd and 34th bit of the
87+
// commit time.
88+
//
89+
// Extra Edge List (ID: {'E', 'D', 'G', 'E'}) [Optional]
90+
// This list of 4-byte values store the second through nth parents for
91+
// all octopus merges. The second parent value in the commit data stores
92+
// an array position within this list along with the most-significant bit
93+
// on. Starting at that array position, iterate through this list of commit
94+
// positions for the parents until reaching a value with the most-significant
95+
// bit on. The other bits correspond to the position of the last parent.
96+
//
97+
// TRAILER:
98+
//
99+
// H-byte HASH-checksum of all of the above.
100+
//
101+
// Source:
102+
// https://raw.githubusercontent.com/git/git/master/Documentation/technical/commit-graph-format.txt
103+
package commitgraph

plumbing/format/commitgraph/encoder.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ func NewEncoder(w io.Writer) *Encoder {
2222
return &Encoder{mw, h}
2323
}
2424

25+
// Encode writes an index into the commit-graph file
2526
func (e *Encoder) Encode(idx Index) error {
2627
var err error
2728

plumbing/format/commitgraph/memory.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@ import (
44
"gopkg.in/src-d/go-git.v4/plumbing"
55
)
66

7+
// MemoryIndex provides a way to build the commit-graph in memory
8+
// for later encoding to file.
79
type MemoryIndex struct {
810
commitData []*CommitData
911
indexMap map[plumbing.Hash]int

plumbing/object/commitgraph/doc.go

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
// Package commitgraph provides an interface for efficient traversal over Git
2+
// commit graph either through the regular object storage, or optionally with
3+
// the index stored in commit-graph file (Git 2.18+).
4+
//
5+
// The API and functionality of this package are considered EXPERIMENTAL and is
6+
// not considered stable nor production ready.
7+
package commitgraph

0 commit comments

Comments
 (0)