From ae12e65703798bb26cd12ba8f2d0c3e0b46f7419 Mon Sep 17 00:00:00 2001 From: Katie McCulloch Date: Thu, 9 Apr 2020 15:53:24 -0700 Subject: [PATCH 1/6] bats/docs.bats: Add test coverage for dolt checkout branch, no conflicts, changes in working set --- bats/docs.bats | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/bats/docs.bats b/bats/docs.bats index 94ce0c062f..d30abaa265 100644 --- a/bats/docs.bats +++ b/bats/docs.bats @@ -479,7 +479,7 @@ SQL [[ "$output" =~ "This is a repository level README" ]] || false } - @test "dolt checkout should save docs to the file system, leaving any untacked files" { + @test "dolt checkout should save docs to the file system, leaving any untracked files" { dolt add LICENSE.md dolt commit -m "license commit" dolt checkout -b test-branch @@ -507,6 +507,28 @@ SQL [[ "$output" =~ "new-license" ]] || false } + @test "dolt checkout , assuming no conflicts, should preserve changes in the working set (on the filesystem)" { + dolt add LICENSE.md README.md + dolt commit -m "initial license and readme commit" + echo updated-readme > README.md + skip dolt checkout -b test-branch + run dolt status + [[ "$output" =~ "README.md" ]] || false + run cat README.md + [[ "$output" =~ "updated-readme" ]] || false + run cat LICENSE.md + [[ "$output" =~ "This is a repository level LICENSE" ]] || false + + dolt add README.md + dolt commit -m "commit of updated-readme" + echo "another new README!" > README.md + dolt checkout master + run dolt status + [[ "$output" =~ "README.md" ]] || false + run cat README.md + [[ "$output" =~ "another new README!" ]] || false + } + @test "dolt diff shows diffs between working root and file system docs" { # 2 added docs echo "testing readme" > README.md From 45975f00bed8fde05f6845baef1019adc1688c28 Mon Sep 17 00:00:00 2001 From: Katie McCulloch Date: Thu, 9 Apr 2020 15:57:51 -0700 Subject: [PATCH 2/6] libraries/doltcore/env/actions/branch.go: Add bug fix so we no longer overwrite working changes of docs on a successful checkout with no conflicts --- bats/docs.bats | 2 +- go/libraries/doltcore/env/actions/branch.go | 44 ++++++++++++++++++++- 2 files changed, 43 insertions(+), 3 deletions(-) diff --git a/bats/docs.bats b/bats/docs.bats index d30abaa265..4830655b10 100644 --- a/bats/docs.bats +++ b/bats/docs.bats @@ -511,7 +511,7 @@ SQL dolt add LICENSE.md README.md dolt commit -m "initial license and readme commit" echo updated-readme > README.md - skip dolt checkout -b test-branch + dolt checkout -b test-branch run dolt status [[ "$output" =~ "README.md" ]] || false run cat README.md diff --git a/go/libraries/doltcore/env/actions/branch.go b/go/libraries/doltcore/env/actions/branch.go index 5d15ed92cc..78d6cc49fe 100644 --- a/go/libraries/doltcore/env/actions/branch.go +++ b/go/libraries/doltcore/env/actions/branch.go @@ -19,7 +19,7 @@ import ( "errors" "github.com/liquidata-inc/dolt/go/libraries/doltcore/ref" - + "github.com/liquidata-inc/dolt/go/libraries/doltcore/diff" "github.com/liquidata-inc/dolt/go/libraries/doltcore/doltdb" "github.com/liquidata-inc/dolt/go/libraries/doltcore/env" "github.com/liquidata-inc/dolt/go/libraries/utils/set" @@ -246,6 +246,8 @@ func CheckoutBranch(ctx context.Context, dEnv *env.DoltEnv, brName string) error return err } + unstagedDocs, err := getUnstagedDocs(ctx, dEnv) + dEnv.RepoState.Head = ref.MarshalableRef{Ref: dref} dEnv.RepoState.Working = wrkHash.String() dEnv.RepoState.Staged = stgHash.String() @@ -256,9 +258,47 @@ func CheckoutBranch(ctx context.Context, dEnv *env.DoltEnv, brName string) error return err } - return SaveTrackedDocsFromWorking(ctx, dEnv) + return saveDocsOnCheckout(ctx, dEnv, unstagedDocs) } +func getUnstagedDocs(ctx context.Context, dEnv *env.DoltEnv) (env.Docs, error) { + _, unstagedDocDiffs, err := diff.GetDocDiffs(ctx, dEnv) + if err != nil { + return nil, err + } + unstagedDocs := env.Docs{} + for _, docName := range unstagedDocDiffs.Docs { + docDetail, err := dEnv.GetOneDocDetail(docName) + if err != nil { + return nil, err + } + unstagedDocs = append(unstagedDocs, docDetail) + } + return unstagedDocs, nil +} + + func saveDocsOnCheckout(ctx context.Context, dEnv *env.DoltEnv, docsToExclude env.Docs) error { + workingRoot, err := dEnv.WorkingRoot(ctx) + if err != nil { + return err + } + + var docsToSave env.Docs + if len(docsToExclude) > 0 { + for _, doc := range dEnv.Docs { + for _, excludedDoc := range docsToExclude { + if doc.DocPk != excludedDoc.DocPk { + docsToSave = append(docsToSave, doc) + } + } + } + } else { + docsToSave = dEnv.Docs + } + + return SaveTrackedDocs(ctx, dEnv, workingRoot, workingRoot, docsToSave) + } + var emptyHash = hash.Hash{} func tblHashesForCO(ctx context.Context, oldRoot, newRoot, changedRoot *doltdb.RootValue, conflicts *set.StrSet) (map[string]hash.Hash, error) { From 47e32be33e99f314a2fb3fa34717b59eb06069f0 Mon Sep 17 00:00:00 2001 From: Katie McCulloch Date: Thu, 9 Apr 2020 17:05:52 -0700 Subject: [PATCH 3/6] bats/remotes.bats: Add skipped test; working docs are stomped on pull --- bats/remotes.bats | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/bats/remotes.bats b/bats/remotes.bats index 13ba341e30..0853f11ba7 100644 --- a/bats/remotes.bats +++ b/bats/remotes.bats @@ -115,6 +115,7 @@ teardown() { dolt push test-remote master cd dolt-repo-clones/test-repo + echo "this text should remain after pull :p" > README.md run dolt pull [[ "$output" =~ "Updating" ]] || false run dolt log @@ -123,9 +124,9 @@ teardown() { run cat LICENSE.md [ "$status" -eq 0 ] [[ "$output" =~ "updated-license" ]] || false - run cat README.md + skip run cat README.md [ "$status" -eq 0 ] - [[ "$output" =~ "readme-text" ]] || false + [[ "$output" =~ "this text should remain after pull :p" ]] || false } @test "clone a remote" { From a061e11bd39ee2c42c04abca8ccb8bed7945e61d Mon Sep 17 00:00:00 2001 From: Katie McCulloch Date: Fri, 10 Apr 2020 12:17:34 -0700 Subject: [PATCH 4/6] libraries/doltcore/env/actions: Move GetUnstagedDocs and SaveDocsFromWOrkingExcludingFSChanges to actions/docs.go --- go/libraries/doltcore/env/actions/branch.go | 46 +++------------------ go/libraries/doltcore/env/actions/docs.go | 41 ++++++++++++++++++ 2 files changed, 46 insertions(+), 41 deletions(-) diff --git a/go/libraries/doltcore/env/actions/branch.go b/go/libraries/doltcore/env/actions/branch.go index 78d6cc49fe..d8492d20e1 100644 --- a/go/libraries/doltcore/env/actions/branch.go +++ b/go/libraries/doltcore/env/actions/branch.go @@ -19,7 +19,6 @@ import ( "errors" "github.com/liquidata-inc/dolt/go/libraries/doltcore/ref" - "github.com/liquidata-inc/dolt/go/libraries/doltcore/diff" "github.com/liquidata-inc/dolt/go/libraries/doltcore/doltdb" "github.com/liquidata-inc/dolt/go/libraries/doltcore/env" "github.com/liquidata-inc/dolt/go/libraries/utils/set" @@ -246,7 +245,10 @@ func CheckoutBranch(ctx context.Context, dEnv *env.DoltEnv, brName string) error return err } - unstagedDocs, err := getUnstagedDocs(ctx, dEnv) + unstagedDocs, err := GetUnstagedDocs(ctx, dEnv) + if err != nil { + return err + } dEnv.RepoState.Head = ref.MarshalableRef{Ref: dref} dEnv.RepoState.Working = wrkHash.String() @@ -258,47 +260,9 @@ func CheckoutBranch(ctx context.Context, dEnv *env.DoltEnv, brName string) error return err } - return saveDocsOnCheckout(ctx, dEnv, unstagedDocs) + return SaveDocsFromWorkingExcludingFSChanges(ctx, dEnv, unstagedDocs) } -func getUnstagedDocs(ctx context.Context, dEnv *env.DoltEnv) (env.Docs, error) { - _, unstagedDocDiffs, err := diff.GetDocDiffs(ctx, dEnv) - if err != nil { - return nil, err - } - unstagedDocs := env.Docs{} - for _, docName := range unstagedDocDiffs.Docs { - docDetail, err := dEnv.GetOneDocDetail(docName) - if err != nil { - return nil, err - } - unstagedDocs = append(unstagedDocs, docDetail) - } - return unstagedDocs, nil -} - - func saveDocsOnCheckout(ctx context.Context, dEnv *env.DoltEnv, docsToExclude env.Docs) error { - workingRoot, err := dEnv.WorkingRoot(ctx) - if err != nil { - return err - } - - var docsToSave env.Docs - if len(docsToExclude) > 0 { - for _, doc := range dEnv.Docs { - for _, excludedDoc := range docsToExclude { - if doc.DocPk != excludedDoc.DocPk { - docsToSave = append(docsToSave, doc) - } - } - } - } else { - docsToSave = dEnv.Docs - } - - return SaveTrackedDocs(ctx, dEnv, workingRoot, workingRoot, docsToSave) - } - var emptyHash = hash.Hash{} func tblHashesForCO(ctx context.Context, oldRoot, newRoot, changedRoot *doltdb.RootValue, conflicts *set.StrSet) (map[string]hash.Hash, error) { diff --git a/go/libraries/doltcore/env/actions/docs.go b/go/libraries/doltcore/env/actions/docs.go index a5ec046e2c..b92c49b1d3 100644 --- a/go/libraries/doltcore/env/actions/docs.go +++ b/go/libraries/doltcore/env/actions/docs.go @@ -140,3 +140,44 @@ func getUpdatedWorkingAndStagedWithDocs(ctx context.Context, dEnv *env.DoltEnv, return currRoot, stgRoot, nil } + +// GetUnstagedDocs retrieves the unstaged docs (docs from the filesystem). +func GetUnstagedDocs(ctx context.Context, dEnv *env.DoltEnv) (env.Docs, error) { + _, unstagedDocDiffs, err := diff.GetDocDiffs(ctx, dEnv) + if err != nil { + return nil, err + } + unstagedDocs := env.Docs{} + for _, docName := range unstagedDocDiffs.Docs { + docDetail, err := dEnv.GetOneDocDetail(docName) + if err != nil { + return nil, err + } + unstagedDocs = append(unstagedDocs, docDetail) + } + return unstagedDocs, nil +} + +// SaveDocsFromWorkingExcludingFSChanges saves docs from the working root to the filesystem, and does not overwrite changes to docs on the FS. +// Intended to be called after checking that no conflicts exist (during a checkout or merge, i.e.). +func SaveDocsFromWorkingExcludingFSChanges(ctx context.Context, dEnv *env.DoltEnv, docsToExclude env.Docs) error { + workingRoot, err := dEnv.WorkingRoot(ctx) + if err != nil { + return err + } + + var docsToSave env.Docs + if len(docsToExclude) > 0 { + for _, doc := range dEnv.Docs { + for _, excludedDoc := range docsToExclude { + if doc.DocPk != excludedDoc.DocPk { + docsToSave = append(docsToSave, doc) + } + } + } + } else { + docsToSave = dEnv.Docs + } + + return SaveTrackedDocs(ctx, dEnv, workingRoot, workingRoot, docsToSave) + } \ No newline at end of file From 059ff7dac13634b05e649454724a5bbb08a18dac Mon Sep 17 00:00:00 2001 From: Katie McCulloch Date: Fri, 10 Apr 2020 12:39:04 -0700 Subject: [PATCH 5/6] bats,cmd/dolt/commands/merge.go: Don't overwrite local changes on merge with no conflicts --- bats/remotes.bats | 2 +- go/cmd/dolt/commands/merge.go | 14 ++++++++++++-- 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/bats/remotes.bats b/bats/remotes.bats index 0853f11ba7..fdd0c876c6 100644 --- a/bats/remotes.bats +++ b/bats/remotes.bats @@ -124,7 +124,7 @@ teardown() { run cat LICENSE.md [ "$status" -eq 0 ] [[ "$output" =~ "updated-license" ]] || false - skip run cat README.md + run cat README.md [ "$status" -eq 0 ] [[ "$output" =~ "this text should remain after pull :p" ]] || false } diff --git a/go/cmd/dolt/commands/merge.go b/go/cmd/dolt/commands/merge.go index 58c0e791d5..ea449cf257 100644 --- a/go/cmd/dolt/commands/merge.go +++ b/go/cmd/dolt/commands/merge.go @@ -257,6 +257,11 @@ func executeFFMerge(ctx context.Context, dEnv *env.DoltEnv, cm2 *doltdb.Commit, } } + unstagedDocs, err :=actions.GetUnstagedDocs(ctx, dEnv) + if err != nil { + return errhand.BuildDError("error: unable to determine unstaged docs").AddCause(err).Build() + } + err = dEnv.DoltDB.FastForward(ctx, dEnv.RepoState.CWBHeadRef(), cm2) if err != nil { @@ -278,7 +283,7 @@ and take the hash for your current branch and use it for the value for "staged" AddCause(err).Build() } - err = actions.SaveTrackedDocsFromWorking(ctx, dEnv) + err = actions.SaveDocsFromWorkingExcludingFSChanges(ctx, dEnv, unstagedDocs) if err != nil { return errhand.BuildDError("error: failed to update docs to the new working root").AddCause(err).Build() } @@ -321,6 +326,11 @@ func executeMerge(ctx context.Context, dEnv *env.DoltEnv, cm1, cm2 *doltdb.Commi return errhand.BuildDError("Unable to update the repo state").AddCause(err).Build() } + unstagedDocs, err := actions.GetUnstagedDocs(ctx, dEnv) + if err != nil { + return errhand.BuildDError("error: failed to determine unstaged docs").AddCause(err).Build() + } + verr := UpdateWorkingWithVErr(dEnv, workingRoot) if verr == nil { @@ -329,7 +339,7 @@ func executeMerge(ctx context.Context, dEnv *env.DoltEnv, cm1, cm2 *doltdb.Commi if hasConflicts { cli.Println("Automatic merge failed; fix conflicts and then commit the result.") } else { - err = actions.SaveTrackedDocsFromWorking(ctx, dEnv) + err = actions.SaveDocsFromWorkingExcludingFSChanges(ctx, dEnv, unstagedDocs) if err != nil { return errhand.BuildDError("error: failed to update docs to the new working root").AddCause(err).Build() } From 613c988730da50eccb3c05733086baee2d54cf36 Mon Sep 17 00:00:00 2001 From: Katie McCulloch Date: Fri, 10 Apr 2020 12:40:31 -0700 Subject: [PATCH 6/6] go: ./format_repo --- go/cmd/dolt/commands/merge.go | 2 +- go/libraries/doltcore/env/actions/branch.go | 2 +- go/libraries/doltcore/env/actions/docs.go | 8 ++++---- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/go/cmd/dolt/commands/merge.go b/go/cmd/dolt/commands/merge.go index ea449cf257..14684590f0 100644 --- a/go/cmd/dolt/commands/merge.go +++ b/go/cmd/dolt/commands/merge.go @@ -257,7 +257,7 @@ func executeFFMerge(ctx context.Context, dEnv *env.DoltEnv, cm2 *doltdb.Commit, } } - unstagedDocs, err :=actions.GetUnstagedDocs(ctx, dEnv) + unstagedDocs, err := actions.GetUnstagedDocs(ctx, dEnv) if err != nil { return errhand.BuildDError("error: unable to determine unstaged docs").AddCause(err).Build() } diff --git a/go/libraries/doltcore/env/actions/branch.go b/go/libraries/doltcore/env/actions/branch.go index d8492d20e1..aeb4e981b0 100644 --- a/go/libraries/doltcore/env/actions/branch.go +++ b/go/libraries/doltcore/env/actions/branch.go @@ -18,9 +18,9 @@ import ( "context" "errors" - "github.com/liquidata-inc/dolt/go/libraries/doltcore/ref" "github.com/liquidata-inc/dolt/go/libraries/doltcore/doltdb" "github.com/liquidata-inc/dolt/go/libraries/doltcore/env" + "github.com/liquidata-inc/dolt/go/libraries/doltcore/ref" "github.com/liquidata-inc/dolt/go/libraries/utils/set" "github.com/liquidata-inc/dolt/go/store/hash" "github.com/liquidata-inc/dolt/go/store/types" diff --git a/go/libraries/doltcore/env/actions/docs.go b/go/libraries/doltcore/env/actions/docs.go index b92c49b1d3..cc1afd4842 100644 --- a/go/libraries/doltcore/env/actions/docs.go +++ b/go/libraries/doltcore/env/actions/docs.go @@ -153,7 +153,7 @@ func GetUnstagedDocs(ctx context.Context, dEnv *env.DoltEnv) (env.Docs, error) { if err != nil { return nil, err } - unstagedDocs = append(unstagedDocs, docDetail) + unstagedDocs = append(unstagedDocs, docDetail) } return unstagedDocs, nil } @@ -178,6 +178,6 @@ func SaveDocsFromWorkingExcludingFSChanges(ctx context.Context, dEnv *env.DoltEn } else { docsToSave = dEnv.Docs } - - return SaveTrackedDocs(ctx, dEnv, workingRoot, workingRoot, docsToSave) - } \ No newline at end of file + + return SaveTrackedDocs(ctx, dEnv, workingRoot, workingRoot, docsToSave) +}