Finished putting merge state into working set

This commit is contained in:
Zach Musgrave
2021-06-22 19:43:40 -07:00
parent e27f60d2c9
commit 21bc84fd89
10 changed files with 81 additions and 52 deletions

View File

@@ -114,7 +114,7 @@ func (cmd GarbageCollectionCmd) Exec(ctx context.Context, commandStr string, arg
return HandleVErrAndExitCode(verr, usage)
}
keepers, err := env.GetGCKeepers(ctx, dEnv.RepoStateReader(), dEnv.DoltDB)
keepers, err := env.GetGCKeepers(ctx, dEnv)
if err != nil {
verr = errhand.BuildDError("an error occurred while saving working set").AddCause(err).Build()
return HandleVErrAndExitCode(verr, usage)

View File

@@ -92,7 +92,13 @@ func (cmd MergeCmd) Exec(ctx context.Context, commandStr string, args []string,
var verr errhand.VerboseError
if apr.Contains(cli.AbortParam) {
if !dEnv.IsMergeActive() {
mergeActive, err := dEnv.IsMergeActive(ctx)
if err != nil {
cli.PrintErrln("fatal: %s", err.Error())
return 1
}
if !mergeActive {
cli.PrintErrln("fatal: There is no merge to abort")
return 1
}
@@ -110,6 +116,12 @@ func (cmd MergeCmd) Exec(ctx context.Context, commandStr string, args []string,
root, verr = GetWorkingWithVErr(dEnv)
if verr == nil {
mergeActive, err := dEnv.IsMergeActive(ctx)
if err != nil {
cli.PrintErrln("error: Merging is not possible because you have not committed an active merge: %s", err.Error())
return 1
}
if has, err := root.HasConflicts(ctx); err != nil {
verr = errhand.BuildDError("error: failed to get conflicts").AddCause(err).Build()
} else if has {
@@ -118,7 +130,7 @@ func (cmd MergeCmd) Exec(ctx context.Context, commandStr string, args []string,
cli.Println("hint: as appropriate to mark resolution and make a commit.")
cli.Println("fatal: Exiting because of an unresolved conflict.")
return 1
} else if dEnv.IsMergeActive() {
} else if mergeActive {
cli.Println("error: Merging is not possible because you have not committed an active merge.")
cli.Println("hint: add affected tables using 'dolt add <table>' and commit using 'dolt commit -m <msg>'")
cli.Println("fatal: Exiting because of active merge")

View File

@@ -84,7 +84,12 @@ func CommitStaged(ctx context.Context, workingRoot *doltdb.RootValue, dbData env
stagedTblNames = append(stagedTblNames, n)
}
if len(staged) == 0 && !rsr.IsMergeActive() && !props.AllowEmpty {
mergeActive, err := rsr.IsMergeActive(ctx)
if err != nil {
return "", err
}
if len(staged) == 0 && !mergeActive && !props.AllowEmpty {
_, notStagedDocs, err := diff.GetDocDiffs(ctx, ddb, workingRoot, rsr, drw)
if err != nil {
return "", err
@@ -92,8 +97,8 @@ func CommitStaged(ctx context.Context, workingRoot *doltdb.RootValue, dbData env
return "", NothingStaged{notStaged, notStagedDocs}
}
var mergeCmSpec []*doltdb.CommitSpec
if rsr.IsMergeActive() {
var mergeParentCommits []*doltdb.Commit
if mergeActive {
inConflict, err := workingRoot.TablesInConflict(ctx)
if err != nil {
return "", err
@@ -102,13 +107,12 @@ func CommitStaged(ctx context.Context, workingRoot *doltdb.RootValue, dbData env
return "", NewTblInConflictError(inConflict)
}
spec, err := doltdb.NewCommitSpec(rsr.GetMergeCommit())
commit, err := rsr.GetMergeCommit(ctx)
if err != nil {
panic("Corrupted repostate. Active merge state is not valid.")
return "", err
}
mergeCmSpec = []*doltdb.CommitSpec{spec}
mergeParentCommits = []*doltdb.Commit{commit}
}
srt, err := env.StagedRoot(ctx, ddb, rsr)
@@ -169,8 +173,7 @@ func CommitStaged(ctx context.Context, workingRoot *doltdb.RootValue, dbData env
}
// DoltDB resolves the current working branch head ref to provide a parent commit.
// Any commit specs in mergeCmSpec are also resolved and added.
c, err := ddb.CommitWithParentSpecs(ctx, h, rsr.CWBHeadRef(), mergeCmSpec, meta)
c, err := ddb.CommitWithParentCommits(ctx, h, rsr.CWBHeadRef(), mergeParentCommits, meta)
if err != nil {
return "", err

View File

@@ -443,16 +443,17 @@ func (r *repoStateReader) StagedHash() hash.Hash {
return hash.Parse(r.dEnv.RepoState.staged)
}
func (r *repoStateReader) IsMergeActive() bool {
return r.dEnv.RepoState.Merge != nil
func (r *repoStateReader) IsMergeActive(ctx context.Context) (bool, error) {
return r.dEnv.IsMergeActive(ctx)
}
func (r *repoStateReader) GetMergeCommit() string {
return r.dEnv.RepoState.Merge.Commit
}
func (r *repoStateReader) GetMergeCommit(ctx context.Context) (*doltdb.Commit, error) {
ws, err := r.dEnv.WorkingSet(ctx)
if err != nil {
return nil, err
}
func (r *repoStateReader) GetPreMergeWorking() string {
return r.dEnv.RepoState.Merge.PreMergeWorking
return ws.MergeState().Commit(), nil
}
func (dEnv *DoltEnv) RepoStateReader() RepoStateReader {
@@ -661,8 +662,13 @@ func (dEnv *DoltEnv) PutTableToWorking(ctx context.Context, sch schema.Schema, r
return dEnv.UpdateWorkingRoot(ctx, newRoot)
}
func (dEnv *DoltEnv) IsMergeActive() bool {
return dEnv.RepoState.Merge != nil
func (dEnv *DoltEnv) IsMergeActive(ctx context.Context) (bool, error) {
ws, err := dEnv.WorkingSet(ctx)
if err != nil {
return false, err
}
return ws.MergeActive(), nil
}
func (dEnv *DoltEnv) GetTablesWithConflicts(ctx context.Context) ([]string, error) {

View File

@@ -17,7 +17,6 @@ package env
import (
"context"
"encoding/json"
"fmt"
"github.com/dolthub/dolt/go/cmd/dolt/errhand"
"github.com/dolthub/dolt/go/libraries/doltcore/doltdb"
@@ -30,12 +29,12 @@ import (
type RepoStateReader interface {
CWBHeadRef() ref.DoltRef
CWBHeadSpec() *doltdb.CommitSpec
// TODO: rreplace with commit
CWBHeadHash(ctx context.Context) (hash.Hash, error)
WorkingRoot(ctx context.Context) (*doltdb.RootValue, error)
StagedRoot(ctx context.Context) (*doltdb.RootValue, error)
IsMergeActive() bool
GetMergeCommit() string
GetPreMergeWorking() string
IsMergeActive(ctx context.Context) (bool, error)
GetMergeCommit(ctx context.Context) (*doltdb.Commit, error)
}
type RepoStateWriter interface {
@@ -272,8 +271,8 @@ func MergeWouldStompChanges(ctx context.Context, workingRoot *doltdb.RootValue,
// GetGCKeepers queries |rsr| to find a list of values that need to be temporarily saved during GC.
// TODO: move this out of repo_state.go
func GetGCKeepers(ctx context.Context, rsr RepoStateReader, ddb *doltdb.DoltDB) ([]hash.Hash, error) {
workingRoot, err := rsr.WorkingRoot(ctx)
func GetGCKeepers(ctx context.Context, env *DoltEnv) ([]hash.Hash, error) {
workingRoot, err := env.WorkingRoot(ctx)
if err != nil {
return nil, err
}
@@ -283,7 +282,7 @@ func GetGCKeepers(ctx context.Context, rsr RepoStateReader, ddb *doltdb.DoltDB)
return nil, err
}
stagedRoot, err := rsr.StagedRoot(ctx)
stagedRoot, err := env.StagedRoot(ctx)
if err != nil {
return nil, err
}
@@ -298,32 +297,30 @@ func GetGCKeepers(ctx context.Context, rsr RepoStateReader, ddb *doltdb.DoltDB)
stagedHash,
}
if rsr.IsMergeActive() {
spec, err := doltdb.NewCommitSpec(rsr.GetMergeCommit())
if err != nil {
return nil, err
}
cm, err := ddb.Resolve(ctx, spec, nil)
mergeActive, err := env.IsMergeActive(ctx)
if err != nil {
return nil, err
}
if mergeActive {
ws, err := env.WorkingSet(ctx)
if err != nil {
return nil, err
}
cm := ws.MergeState().Commit()
ch, err := cm.HashOf()
if err != nil {
return nil, err
}
pmw := hash.Parse(rsr.GetPreMergeWorking())
val, err := ddb.ValueReadWriter().ReadValue(ctx, pmw)
pmw := ws.MergeState().PreMergeWorkingRoot()
pmwh, err := pmw.HashOf()
if err != nil {
return nil, err
}
if val == nil {
return nil, fmt.Errorf("MergeState.PreMergeWorking is a dangling hash")
}
keepers = append(keepers, ch, pmw)
keepers = append(keepers, ch, pmwh)
}
return keepers, nil

View File

@@ -299,7 +299,7 @@ func (te *tableEditorWriteCloser) GC(ctx context.Context) error {
return err
}
keepers, err := env.GetGCKeepers(ctx, te.dEnv.RepoStateReader(), te.dEnv.DoltDB)
keepers, err := env.GetGCKeepers(ctx, te.dEnv)
if err != nil {
return err
}

View File

@@ -80,9 +80,14 @@ func (d DoltCommitFunc) Eval(ctx *sql.Context, row sql.Row) (interface{}, error)
return nil, fmt.Errorf("Cannot commit an empty commit. See the --allow-empty if you want to.")
}
mergeActive, err := rsr.IsMergeActive(ctx)
if err != nil {
return nil, err
}
// Check if there are no changes in the working set but the -a flag is true.
// The -a flag is fine when a merge is active or there are staged changes as result of a merge or an add.
if allFlag && !hasWorkingSetChanges(rsr) && !allowEmpty && !rsr.IsMergeActive() && !hasStagedChanges {
if allFlag && !hasWorkingSetChanges(rsr) && !allowEmpty && !mergeActive && !hasStagedChanges {
return nil, fmt.Errorf("Cannot commit an empty commit. See the --allow-empty if you want to.")
}

View File

@@ -68,9 +68,10 @@ func (d DoltMergeFunc) Eval(ctx *sql.Context, row sql.Row) (interface{}, error)
}
if apr.Contains(cli.AbortParam) {
if !dbData.Rsr.IsMergeActive() {
return 1, fmt.Errorf("fatal: There is no merge to abort")
}
// TODO: fix me (get merge state from session)
// if !dbData.Rsr.IsMergeActive() {
// return 1, fmt.Errorf("fatal: There is no merge to abort")
// }
err = abortMerge(ctx, dbData)
@@ -103,9 +104,10 @@ func (d DoltMergeFunc) Eval(ctx *sql.Context, row sql.Row) (interface{}, error)
return 1, doltdb.ErrUnresolvedConflicts
}
if dbData.Rsr.IsMergeActive() {
return 1, doltdb.ErrMergeActive
}
// TODO: fix me (get merge state from session)
// if dbData.Rsr.IsMergeActive() {
// return 1, doltdb.ErrMergeActive
// }
head, hh, headRoot, err := getHead(ctx, sess, dbName)
if err != nil {

View File

@@ -73,15 +73,15 @@ func (s SessionRepoStateReader) StagedHash() hash.Hash {
panic("implement me")
}
func (s SessionRepoStateReader) IsMergeActive() bool {
func (s SessionRepoStateReader) IsMergeActive(ctx context.Context) (bool, error) {
panic("implement me")
}
func (s SessionRepoStateReader) GetMergeCommit() string {
func (s SessionRepoStateReader) GetMergeCommit(ctx context.Context) (*doltdb.Commit, error) {
panic("implement me")
}
func (s SessionRepoStateReader) GetPreMergeWorking() string {
func (s SessionRepoStateReader) GetPreMergeWorking(ctx context.Context) (*doltdb.RootValue, error) {
panic("implement me")
}

View File

@@ -87,6 +87,10 @@ func NewWorkingSet(_ context.Context, workingRef types.Ref, stagedRef, mergeStat
return types.NewStruct(workingRef.Format(), WorkingSetName, fields)
}
func NewMergeState(_ context.Context, preMergeWorking types.Ref, commit types.Struct) (types.Struct, error) {
return mergeStateTemplate.NewStruct(preMergeWorking.Format(), []types.Value{commit, preMergeWorking})
}
func IsWorkingSet(v types.Value) (bool, error) {
if s, ok := v.(types.Struct); !ok {
return false, nil