summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLuke Shumaker <lukeshu@parabola.nu>2021-05-01 15:31:15 -0600
committerLuke Shumaker <lukeshu@parabola.nu>2021-05-01 15:42:56 -0600
commitdce5c4442fdc6b11f3377e8d79b0cf507e99d925 (patch)
treea65d1f7fe4a64b174aeef74d20d70d1046b700bd
parent11ecb691f395289f2908b6f3ebdff294e3b6133d (diff)
improve
-rw-r--r--fi-prune-empty2/main.go1
-rw-r--r--fi-prune-empty2/prune.go40
-rw-r--r--fi-prune-empty2/stream.go24
-rw-r--r--go.mod2
-rw-r--r--go.sum4
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=