diff --git a/go/libraries/doltcore/env/actions/remotes.go b/go/libraries/doltcore/env/actions/remotes.go index 4720e8feb0..3fa96ad2e2 100644 --- a/go/libraries/doltcore/env/actions/remotes.go +++ b/go/libraries/doltcore/env/actions/remotes.go @@ -137,7 +137,7 @@ func push(ctx context.Context, rsr env.RepoStateReader, tmpDir string, src, dest switch opts.SrcRef.GetType() { case ref.BranchRefType: if opts.SrcRef == ref.EmptyBranchRef { - return deleteRemoteBranch(ctx, opts.DestRef, opts.RemoteRef, src, dest, *remote) + return deleteRemoteBranch(ctx, opts.DestRef, opts.RemoteRef, src, dest, *remote, opts.Mode.Force) } else { return PushToRemoteBranch(ctx, rsr, tmpDir, opts.Mode, opts.SrcRef, opts.DestRef, opts.RemoteRef, src, dest, *remote, progStarter, progStopper) } @@ -192,8 +192,8 @@ func PushTag(ctx context.Context, tempTableDir string, destRef ref.TagRef, srcDB return destDB.SetHead(ctx, destRef, addr) } -func deleteRemoteBranch(ctx context.Context, toDelete, remoteRef ref.DoltRef, localDB, remoteDB *doltdb.DoltDB, remote env.Remote) error { - err := DeleteRemoteBranch(ctx, toDelete.(ref.BranchRef), remoteRef.(ref.RemoteRef), localDB, remoteDB) +func deleteRemoteBranch(ctx context.Context, toDelete, remoteRef ref.DoltRef, localDB, remoteDB *doltdb.DoltDB, remote env.Remote, force bool) error { + err := DeleteRemoteBranch(ctx, toDelete.(ref.BranchRef), remoteRef.(ref.RemoteRef), localDB, remoteDB, force) if err != nil { return fmt.Errorf("%w; '%s' from remote '%s'; %s", ErrFailedToDeleteRemote, toDelete.String(), remote.Name, err) @@ -262,19 +262,24 @@ func pushTagToRemote(ctx context.Context, tempTableDir string, srcRef, destRef r // DeleteRemoteBranch validates targetRef is a branch on the remote database, and then deletes it, then deletes the // remote tracking branch from the local database. -func DeleteRemoteBranch(ctx context.Context, targetRef ref.BranchRef, remoteRef ref.RemoteRef, localDB, remoteDB *doltdb.DoltDB) error { +func DeleteRemoteBranch(ctx context.Context, targetRef ref.BranchRef, remoteRef ref.RemoteRef, localDB, remoteDB *doltdb.DoltDB, force bool) error { hasRef, err := remoteDB.HasRef(ctx, targetRef) if err != nil { return err } - wsRef, err := ref.WorkingSetRefForHead(targetRef) - if err != nil { - return err + wsRefStr := "" + if !force { + wsRef, err := ref.WorkingSetRefForHead(targetRef) + if err != nil { + return err + } + wsRefStr = wsRef.String() } + if hasRef { - err = remoteDB.DeleteBranchWithWorkspaceCheck(ctx, targetRef, nil, wsRef.String()) + err = remoteDB.DeleteBranchWithWorkspaceCheck(ctx, targetRef, nil, wsRefStr) } if err != nil { diff --git a/integration-tests/bats/sql-server-remotesrv.bats b/integration-tests/bats/sql-server-remotesrv.bats index 6889d42ff6..dfdf66295b 100644 --- a/integration-tests/bats/sql-server-remotesrv.bats +++ b/integration-tests/bats/sql-server-remotesrv.bats @@ -577,9 +577,8 @@ GRANT CLONE_ADMIN ON *.* TO clone_admin_user@'localhost'; dolt sql -q 'insert into names (name) values ("abe"), ("betsy"), ("calvin");' dolt add names dolt commit -m 'initial names.' - dolt checkout -b new_branch HEAD - dolt sql -q 'insert into names (name) values ("zeek");' # dirty the workspace - dolt checkout main + dolt branch new_branch HEAD + dolt --use-db=remote/new_branch sql -q 'insert into names (name) values ("zeek");' # dirty the workspace APIPORT=$(definePORT) export DOLT_REMOTE_PASSWORD="rootpass" @@ -594,8 +593,7 @@ GRANT CLONE_ADMIN ON *.* TO clone_admin_user@'localhost'; [[ "$status" -ne 0 ]] || false [[ "$output" =~ "target has uncommitted changes. --force required to overwrite" ]] || false - run dolt push origin --force --user $SQL_USER :new_branch - [[ "$status" -eq 0 ]] || false + dolt push origin --force --user $SQL_USER :new_branch # TODO - verify output. Currently we always print "new branch" # To https://doltremoteapi.dolthub.com/dolthub/macneale-remote-test