Fast implementation of Git in pure Go
codeberg.org/lindenii/furgit
git
go
1package commitquery
2
3// beginMarkPhase starts one tracked mark-mutation phase.
4func (query *query) beginMarkPhase() {
5 for _, idx := range query.touched {
6 query.nodes[idx].marks = 0
7 }
8
9 query.markPhase++
10 if query.markPhase == 0 {
11 query.markPhase++
12 for i := range query.nodes {
13 query.nodes[i].touchedPhase = 0
14 }
15 }
16
17 query.touched = query.touched[:0]
18}
19
20// clearTouchedMarks clears the provided bits from all nodes touched in the
21// current mark phase.
22func (query *query) clearTouchedMarks(bits markBits) {
23 for _, idx := range query.touched {
24 query.nodes[idx].marks &^= bits
25 }
26}
27
28// trackTouched records one node in the current mark phase.
29func (query *query) trackTouched(idx nodeIndex) {
30 if query.nodes[idx].touchedPhase == query.markPhase {
31 return
32 }
33
34 query.nodes[idx].touchedPhase = query.markPhase
35 query.touched = append(query.touched, idx)
36}