mirror of
https://github.com/dolthub/dolt.git
synced 2026-01-31 03:18:43 -06:00
save active merge commit during GC
This commit is contained in:
@@ -17,6 +17,8 @@ package commands
|
||||
import (
|
||||
"context"
|
||||
|
||||
"github.com/dolthub/dolt/go/store/hash"
|
||||
|
||||
"github.com/dolthub/dolt/go/cmd/dolt/cli"
|
||||
"github.com/dolthub/dolt/go/cmd/dolt/errhand"
|
||||
eventsapi "github.com/dolthub/dolt/go/gen/proto/dolt/services/eventsapi/v1alpha1"
|
||||
@@ -114,11 +116,21 @@ func (cmd GarbageCollectionCmd) Exec(ctx context.Context, commandStr string, arg
|
||||
return HandleVErrAndExitCode(verr, usage)
|
||||
}
|
||||
|
||||
w := dEnv.RepoState.WorkingHash()
|
||||
s := dEnv.RepoState.StagedHash()
|
||||
keepers := []hash.Hash{
|
||||
dEnv.RepoState.WorkingHash(),
|
||||
dEnv.RepoState.StagedHash(),
|
||||
}
|
||||
|
||||
err = dEnv.DoltDB.GC(ctx, w, s)
|
||||
if dEnv.IsMergeActive() {
|
||||
m, err := env.ResolveMergeCommitHash(ctx, dEnv.RepoStateReader(), dEnv.DoltDB)
|
||||
if err != nil {
|
||||
verr = errhand.BuildDError("an error occurred while saving an active merge commit").AddCause(err).Build()
|
||||
return HandleVErrAndExitCode(verr, usage)
|
||||
}
|
||||
keepers = append(keepers, m)
|
||||
}
|
||||
|
||||
err = dEnv.DoltDB.GC(ctx, keepers...)
|
||||
if err != nil {
|
||||
verr = errhand.BuildDError("an error occurred during garbage collection").AddCause(err).Build()
|
||||
}
|
||||
|
||||
14
go/libraries/doltcore/env/repo_state.go
vendored
14
go/libraries/doltcore/env/repo_state.go
vendored
@@ -340,6 +340,20 @@ func MergeWouldStompChanges(ctx context.Context, mergeCommit *doltdb.Commit, dbD
|
||||
return stompedTables, headWorkingDiffs, nil
|
||||
}
|
||||
|
||||
func ResolveMergeCommitHash(ctx context.Context, rsr RepoStateReader, ddb *doltdb.DoltDB) (h hash.Hash, err error) {
|
||||
spec, err := doltdb.NewCommitSpec(rsr.GetMergeCommit())
|
||||
if err != nil {
|
||||
return h, err
|
||||
}
|
||||
|
||||
cm, err := ddb.Resolve(ctx, spec, nil)
|
||||
if err != nil {
|
||||
return h, err
|
||||
}
|
||||
|
||||
return cm.HashOf()
|
||||
}
|
||||
|
||||
func mapTableHashes(ctx context.Context, root *doltdb.RootValue) (map[string]hash.Hash, error) {
|
||||
names, err := root.GetTableNames(ctx)
|
||||
|
||||
|
||||
@@ -19,6 +19,8 @@ import (
|
||||
"errors"
|
||||
"sync/atomic"
|
||||
|
||||
"github.com/dolthub/dolt/go/store/hash"
|
||||
|
||||
"github.com/dolthub/dolt/go/libraries/doltcore/doltdb"
|
||||
"github.com/dolthub/dolt/go/libraries/doltcore/env"
|
||||
"github.com/dolthub/dolt/go/libraries/doltcore/row"
|
||||
@@ -278,20 +280,31 @@ func (te *tableEditorWriteCloser) GC(ctx context.Context) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
w := te.dEnv.RepoState.WorkingHash()
|
||||
s := te.dEnv.RepoState.StagedHash()
|
||||
|
||||
inProgresRoot, err := te.sess.Flush(ctx)
|
||||
inProgressRoot, err := te.sess.Flush(ctx)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
i, err := te.dEnv.DoltDB.WriteRootValue(ctx, inProgresRoot)
|
||||
inProgressHash, err := te.dEnv.DoltDB.WriteRootValue(ctx, inProgressRoot)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return te.dEnv.DoltDB.GC(ctx, w, s, i)
|
||||
keepers := []hash.Hash{
|
||||
te.dEnv.RepoState.WorkingHash(),
|
||||
te.dEnv.RepoState.StagedHash(),
|
||||
inProgressHash,
|
||||
}
|
||||
|
||||
if te.dEnv.IsMergeActive() {
|
||||
m, err := env.ResolveMergeCommitHash(ctx, te.dEnv.RepoStateReader(), te.dEnv.DoltDB)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
keepers = append(keepers, m)
|
||||
}
|
||||
|
||||
return te.dEnv.DoltDB.GC(ctx, keepers...)
|
||||
}
|
||||
|
||||
// Close implements TableWriteCloser
|
||||
|
||||
Reference in New Issue
Block a user