From dce5c4442fdc6b11f3377e8d79b0cf507e99d925 Mon Sep 17 00:00:00 2001 From: Luke Shumaker Date: Sat, 1 May 2021 15:31:15 -0600 Subject: improve --- fi-prune-empty2/main.go | 1 + fi-prune-empty2/prune.go | 40 +++++++++++++++++++++++++++------------- fi-prune-empty2/stream.go | 24 +++++++++++++++++++++++- go.mod | 2 +- go.sum | 4 ++-- 5 files changed, 54 insertions(+), 17 deletions(-) diff --git a/fi-prune-empty2/main.go b/fi-prune-empty2/main.go index f09af64..0278a66 100644 --- a/fi-prune-empty2/main.go +++ b/fi-prune-empty2/main.go @@ -64,6 +64,7 @@ func main() { fmt.Println() fmt.Println("Requirements for the input stream:") fmt.Println(" - Every commit must have a 'mark' (this is the default from `git fast-export`)") + fmt.Println(" - Every tag must have a 'mark' (eg: `git fast-export --mark-tags`)") fmt.Println(" - Every commit must have an 'original-oid' (eg: `git fast-export --show-original-ids`)") fmt.Println(" if any of (note that several of these are the default):") fmt.Println(" --prune-empty=auto") diff --git a/fi-prune-empty2/prune.go b/fi-prune-empty2/prune.go index ff0119b..e3181b2 100644 --- a/fi-prune-empty2/prune.go +++ b/fi-prune-empty2/prune.go @@ -75,8 +75,8 @@ type Pruner struct { replace map[Mark]Mark - ancestors map[Mark]map[Mark]struct{} // all ancestors, not just immediate parents - tree map[Mark]Tree + parents map[Mark]map[Mark]struct{} + tree map[Mark]Tree newhash2mark map[Hash]Mark } @@ -94,8 +94,8 @@ func NewPruner( replace: make(map[Mark]Mark), - ancestors: make(map[Mark]map[Mark]struct{}), - tree: make(map[Mark]Tree), + parents: make(map[Mark]map[Mark]struct{}), + tree: make(map[Mark]Tree), newhash2mark: make(map[Hash]Mark), } @@ -156,14 +156,13 @@ func (p *Pruner) ProcessCommit(commit Commit) (*Commit, error) { return nil, nil } - ancestors := map[Mark]struct{}{} - for _, parent := range commit.Parents { - ancestors[parent] = struct{}{} - for ancestor := range p.ancestors[parent] { - ancestors[ancestor] = struct{}{} + p.parents[commit.Mark] = func() map[Mark]struct{} { + parents := make(map[Mark]struct{}, len(commit.Parents)) + for _, parent := range commit.Parents { + parents[parent] = struct{}{} } - } - p.ancestors[commit.Mark] = ancestors + return parents + }() p.tree[commit.Mark] = commit.Tree return &commit, nil @@ -241,8 +240,23 @@ func (p *Pruner) isEmpty(commit Commit) (bool, error) { } func (p *Pruner) isAncestor(ancestor, descendant Mark) bool { - _, ret := p.ancestors[descendant][ancestor] - return ret + isDescendentMemo := make(map[Mark]bool) + var isDescendent func(desc Mark) bool + isDescendent = func(desc Mark) bool { + if ret, ok := isDescendentMemo[desc]; ok { + return ret + } + ret := false + for descParent := range p.parents[desc] { + if descParent == ancestor || isDescendent(descParent) { + ret = true + break + } + } + isDescendentMemo[desc] = ret + return ret + } + return isDescendent(descendant) } // pruneParents prunes "duplicate" parents of a commit. It is diff --git a/fi-prune-empty2/stream.go b/fi-prune-empty2/stream.go index da4b7be..be36d54 100644 --- a/fi-prune-empty2/stream.go +++ b/fi-prune-empty2/stream.go @@ -357,7 +357,29 @@ func (h *Handler) CmdReset(cmd libfastimport.CmdReset) error { } func (h *Handler) CmdTag(cmd libfastimport.CmdTag) error { cmd.CommitIsh = h.driver.FixCommitIsh(cmd.CommitIsh) - return h.backend.Do(cmd) + + // emit the tag + if err := h.backend.Do(cmd); err != nil { + return err + } + + // tell the driver about the emitted tag + sha1, err := h.backend.GetMark(libfastimport.CmdGetMark{ + Mark: cmd.Mark, + }) + if err != nil { + return err + } + hash, err := AsHash(sha1) + if err != nil { + return err + } + h.driver.GotMark(Mark(cmd.Mark), hash) + + // remember the tag + h.refs[cmd.RefName] = Mark(cmd.Mark) + + return nil } func (h *Handler) CmdCatBlob(cmd libfastimport.CmdCatBlob) (sha1 string, data string, err error) { diff --git a/go.mod b/go.mod index 6472c43..393dffb 100644 --- a/go.mod +++ b/go.mod @@ -3,7 +3,7 @@ module git.parabola.nu/~lukeshu/fastimport-go-utils go 1.15 require ( - git.lukeshu.com/go/libfastimport v0.0.0-20210430013857-225cc75c0ab0 + git.lukeshu.com/go/libfastimport v0.0.0-20210501213144-c022dea68713 github.com/pkg/errors v0.9.1 github.com/spf13/pflag v1.0.5 golang.org/x/sync v0.0.0-20210220032951-036812b2e83c diff --git a/go.sum b/go.sum index 7c2935d..c576616 100644 --- a/go.sum +++ b/go.sum @@ -1,5 +1,5 @@ -git.lukeshu.com/go/libfastimport v0.0.0-20210430013857-225cc75c0ab0 h1:9AcUO9xEdDXWYZLWiPL5HVp8bBc3OgENRdCF4GCS1w4= -git.lukeshu.com/go/libfastimport v0.0.0-20210430013857-225cc75c0ab0/go.mod h1:S+paUkL2Xjs2Kjg+r+pIkbWDnYZDKuzkaQ4mJ5cKTgM= +git.lukeshu.com/go/libfastimport v0.0.0-20210501213144-c022dea68713 h1:kLaRwGQRmMBX5f9ArfQL6trCXgaO84N5YU8F13ISrdU= +git.lukeshu.com/go/libfastimport v0.0.0-20210501213144-c022dea68713/go.mod h1:S+paUkL2Xjs2Kjg+r+pIkbWDnYZDKuzkaQ4mJ5cKTgM= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= -- cgit v1.2.2