Skip to content

Commit 5e974ab

Browse files
committed
446 mob start --discard-uncommitted-changes
1 parent c17f133 commit 5e974ab

File tree

4 files changed

+86
-8
lines changed

4 files changed

+86
-8
lines changed

configuration/configuration.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ type Configuration struct {
2828
NotifyCommand string // override with MOB_NOTIFY_COMMAND
2929
NotifyMessage string // override with MOB_NOTIFY_MESSAGE
3030
NextStay bool // override with MOB_NEXT_STAY
31+
StartDiscardUncommittedChanges bool
3132
StartIncludeUncommittedChanges bool
3233
StartCreate bool // override with MOB_START_CREATE variable
3334
StartJoin bool
@@ -118,6 +119,8 @@ func ParseArgs(args []string, configuration Configuration) (command string, para
118119
for i := 1; i < len(args); i++ {
119120
arg := args[i]
120121
switch arg {
122+
case "--discard-uncommitted-changes", "-d":
123+
newConfiguration.StartDiscardUncommittedChanges = true
121124
case "--include-uncommitted-changes", "-i":
122125
newConfiguration.StartIncludeUncommittedChanges = true
123126
case "--debug":
@@ -193,6 +196,7 @@ func GetDefaultConfiguration() Configuration {
193196
NotifyMessage: "mob next",
194197
NextStay: true,
195198
RequireCommitMessage: false,
199+
StartDiscardUncommittedChanges: false,
196200
StartIncludeUncommittedChanges: false,
197201
StartCreate: false,
198202
WipBranchQualifier: "",

configuration/configuration_test.go

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,46 @@ func TestParseArgsStartRoom(t *testing.T) {
103103
test.Equals(t, "testroom", configuration.TimerRoom)
104104
}
105105

106+
func TestParseArgsIncludeUncommitedChanges(t *testing.T) {
107+
configuration := GetDefaultConfiguration()
108+
109+
command, parameters, configuration := ParseArgs([]string{"mob", "start", "--include-uncommitted-changes"}, configuration)
110+
111+
test.Equals(t, "start", command)
112+
test.Equals(t, 0, len(parameters))
113+
test.Equals(t, true, configuration.StartIncludeUncommittedChanges)
114+
}
115+
116+
func TestParseArgsIncludeUncommitedChangesShort(t *testing.T) {
117+
configuration := GetDefaultConfiguration()
118+
119+
command, parameters, configuration := ParseArgs([]string{"mob", "start", "-i"}, configuration)
120+
121+
test.Equals(t, "start", command)
122+
test.Equals(t, 0, len(parameters))
123+
test.Equals(t, true, configuration.StartIncludeUncommittedChanges)
124+
}
125+
126+
func TestParseArgsDiscardUncommitedChanges(t *testing.T) {
127+
configuration := GetDefaultConfiguration()
128+
129+
command, parameters, configuration := ParseArgs([]string{"mob", "start", "--discard-uncommitted-changes"}, configuration)
130+
131+
test.Equals(t, "start", command)
132+
test.Equals(t, 0, len(parameters))
133+
test.Equals(t, true, configuration.StartDiscardUncommittedChanges)
134+
}
135+
136+
func TestParseArgsDiscardUncommitedChangesShort(t *testing.T) {
137+
configuration := GetDefaultConfiguration()
138+
139+
command, parameters, configuration := ParseArgs([]string{"mob", "start", "-d"}, configuration)
140+
141+
test.Equals(t, "start", command)
142+
test.Equals(t, 0, len(parameters))
143+
test.Equals(t, true, configuration.StartDiscardUncommittedChanges)
144+
}
145+
106146
func TestParseArgsTimerRoom(t *testing.T) {
107147
configuration := GetDefaultConfiguration()
108148
test.Equals(t, configuration.WipBranchQualifier, "")

mob.go

Lines changed: 23 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -527,7 +527,7 @@ func deleteRemoteWipBranch(configuration config.Configuration) {
527527

528528
func start(configuration config.Configuration) error {
529529
uncommittedChanges := hasUncommittedChanges()
530-
if uncommittedChanges && !configuration.StartIncludeUncommittedChanges {
530+
if uncommittedChanges && !configuration.StartIncludeUncommittedChanges && !configuration.StartDiscardUncommittedChanges {
531531
say.Info("cannot start; clean working tree required")
532532
sayUnstagedChangesInfo()
533533
sayUntrackedFilesInfo()
@@ -557,13 +557,22 @@ func start(configuration config.Configuration) error {
557557
return errors.New("cannot start; unpushed changes on base branch must be pushed upstream")
558558
}
559559

560-
if uncommittedChanges && silentgit("ls-tree", "-r", "HEAD", "--full-name", "--name-only", ".") == "" {
560+
if uncommittedChanges && configuration.StartIncludeUncommittedChanges && configuration.StartDiscardUncommittedChanges {
561+
errorMessage := "The options '--include-uncommitted-changes' (-i) and '--discard-uncommitted-changes' (-d) cannot be used together as they are mutually exclusive. Please choose either to include or discard uncommitted changes, but not both."
562+
say.Error(errorMessage)
563+
return errors.New(errorMessage)
564+
}
565+
if uncommittedChanges && configuration.StartDiscardUncommittedChanges {
566+
git("reset", "--hard")
567+
}
568+
569+
if uncommittedChanges && configuration.StartIncludeUncommittedChanges && silentgit("ls-tree", "-r", "HEAD", "--full-name", "--name-only", ".") == "" {
561570
say.Error("cannot start; current working dir is an uncommitted subdir")
562571
say.Fix("to fix this, go to the parent directory and try again", "cd ..")
563572
return errors.New("cannot start; current working dir is an uncommitted subdir")
564573
}
565574

566-
if uncommittedChanges {
575+
if uncommittedChanges && configuration.StartIncludeUncommittedChanges {
567576
git("stash", "push", "--include-untracked", "--message", configuration.StashName)
568577
say.Info("uncommitted changes were stashed. If an error occurs later on, you can recover them with 'git stash pop'.")
569578
}
@@ -595,16 +604,22 @@ func start(configuration config.Configuration) error {
595604
}
596605

597606
func sayFixUncommittedChanges(configuration config.Configuration) {
598-
var instruction string
607+
var instructionInclude string
608+
var instructionDiscard string
599609
if configuration.StartCreate {
600-
instruction = "To start, including uncommitted changes and create the remote branch, use"
610+
instructionInclude = "To start, including uncommitted changes and create the remote branch, use"
611+
instructionDiscard = "To start, discarding uncommitted changes and create the remote branch, use"
601612
} else {
602-
instruction = "To start, including uncommitted changes, use"
613+
instructionInclude = "To start, including uncommitted changes, use"
614+
instructionDiscard = "To start, discarding uncommitted changes, use"
603615
}
604616

605-
fixCommand := configuration.CliName + " start" + createFix(configuration) + branchFix(configuration) + " --include-uncommitted-changes"
617+
fixCommandStart := configuration.CliName + " start" + createFix(configuration) + branchFix(configuration)
618+
fixCommandInclude := fixCommandStart + " --include-uncommitted-changes"
619+
fixCommandDiscard := fixCommandStart + " --discard-uncommitted-changes"
606620

607-
say.Fix(instruction, fixCommand)
621+
say.Fix(instructionInclude, fixCommandInclude)
622+
say.Fix(instructionDiscard, fixCommandDiscard)
608623
}
609624

610625
func createFix(configuration config.Configuration) string {

mob_test.go

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -540,6 +540,7 @@ func TestStartUnstagedChanges(t *testing.T) {
540540
assertOnBranch(t, "master")
541541
assertNoMobSessionBranches(t, configuration, "mob-session")
542542
assertOutputContains(t, output, "mob start --include-uncommitted-changes")
543+
assertOutputContains(t, output, "mob start --discard-uncommitted-changes")
543544
}
544545

545546
func TestStartIncludeUnstagedChanges(t *testing.T) {
@@ -553,6 +554,18 @@ func TestStartIncludeUnstagedChanges(t *testing.T) {
553554
assertMobSessionBranches(t, configuration, "mob-session")
554555
}
555556

557+
func TestStartDiscardUnstagedChanges(t *testing.T) {
558+
_, configuration := setup(t)
559+
configuration.StartDiscardUncommittedChanges = true
560+
createFile(t, "test.txt", "contentIrrelevant")
561+
562+
start(configuration)
563+
564+
assertOnBranch(t, "mob-session")
565+
assertMobSessionBranches(t, configuration, "mob-session")
566+
assertCleanGitStatus(t)
567+
}
568+
556569
func TestStartIncludeUnstagedChangesInNewWorkingDirectory(t *testing.T) {
557570
output, configuration := setup(t)
558571
configuration.StartIncludeUncommittedChanges = true
@@ -625,6 +638,7 @@ func TestStartOnUnpushedFeatureBranchWithUncommitedChanges(t *testing.T) {
625638

626639
assertOnBranch(t, "feature1")
627640
assertOutputContains(t, output, "mob start --include-uncommitted-changes")
641+
assertOutputContains(t, output, "mob start --discard-uncommitted-changes")
628642
}
629643

630644
func TestStartCreateOnUnpushedFeatureBranch(t *testing.T) {
@@ -660,6 +674,7 @@ func TestStartCreateOnUnpushedFeatureBranchWithUncommitedChanges(t *testing.T) {
660674

661675
assertOutputContains(t, output, "To start, including uncommitted changes and create the remote branch, use")
662676
assertOutputContains(t, output, "mob start --create --include-uncommitted-changes")
677+
assertOutputContains(t, output, "mob start --create --discard-uncommitted-changes")
663678
}
664679

665680
func TestStartCreateIncludeUncommitedChangesOnUnpushedFeatureBranchWithUncommitedChanges(t *testing.T) {
@@ -1521,6 +1536,7 @@ func TestStartBranchWithUncommitedChangesFixWithBranch(t *testing.T) {
15211536
runMob(t, tempDir+"/local", "start", "-b", "green")
15221537

15231538
assertOutputContains(t, output, "mob start --branch green --include-uncommitted-changes")
1539+
assertOutputContains(t, output, "mob start --branch green --discard-uncommitted-changes")
15241540
resetExit()
15251541
}
15261542

@@ -1534,6 +1550,7 @@ func TestStartBranchEnvWithUncommitedChangesFixWithoutBranch(t *testing.T) {
15341550
runMob(t, tempDir+"/local", "start")
15351551

15361552
assertOutputContains(t, output, "mob start --include-uncommitted-changes")
1553+
assertOutputContains(t, output, "mob start --discard-uncommitted-changes")
15371554
resetExit()
15381555
}
15391556

@@ -1548,6 +1565,7 @@ func TestStartCreateBranchWithUncommitedChangesFixWithBranch(t *testing.T) {
15481565
runMob(t, tempDir+"/local", "start", "--create", "-b", "green")
15491566

15501567
assertOutputContains(t, output, "mob start --create --branch green --include-uncommitted-changes")
1568+
assertOutputContains(t, output, "mob start --create --branch green --discard-uncommitted-changes")
15511569
resetExit()
15521570
}
15531571

@@ -1563,6 +1581,7 @@ func TestStartCreateBranchEnvWithUncommitedChangesFixWithoutBranch(t *testing.T)
15631581

15641582
os.Unsetenv("MOB_WIP_BRANCH_QUALIFIER")
15651583
assertOutputContains(t, output, "mob start --create --include-uncommitted-changes")
1584+
assertOutputContains(t, output, "mob start --create --discard-uncommitted-changes")
15661585
resetExit()
15671586
}
15681587

0 commit comments

Comments
 (0)