@@ -337,6 +337,81 @@ func TestMainFnIncPatchDoesNotWriteOutputOnPushError(t *testing.T) {
337337 }
338338}
339339
340+ func TestMainFnIncPatchRefusesDirtyTree (t * testing.T ) {
341+ flag .Parse ()
342+ oldWD , err := os .Getwd ()
343+ if err != nil {
344+ t .Fatal (err )
345+ }
346+ defer func () { _ = os .Chdir (oldWD ) }()
347+
348+ origGit , origOut , origName := * flagGit , * flagOut , * flagName
349+ origDebug , origGoPackage := * flagDebug , * flagGoPackage
350+ origNoFetch , origNoNewline := * flagNoFetch , * flagNoNewline
351+ origIncPatch , origBranch := * flagIncPatch , * flagBranch
352+ origTestMode := testMode
353+ defer func () {
354+ * flagGit , * flagOut , * flagName = origGit , origOut , origName
355+ * flagDebug , * flagGoPackage = origDebug , origGoPackage
356+ * flagNoFetch , * flagNoNewline = origNoFetch , origNoNewline
357+ * flagIncPatch , * flagBranch = origIncPatch , origBranch
358+ testMode = origTestMode
359+ }()
360+
361+ base := t .TempDir ()
362+ origin := filepath .Join (base , "origin.git" )
363+ work := filepath .Join (base , "work" )
364+
365+ runGit (t , "" , "init" , "--bare" , "-q" , origin )
366+ runGit (t , "" , "clone" , "-q" , origin , work )
367+ runGit (t , work , "config" , "user.email" , "test@example.com" )
368+ runGit (t , work , "config" , "user.name" , "Test" )
369+ if err := os .WriteFile (filepath .Join (work , "a.txt" ), []byte ("a\n " ), 0o644 ); err != nil {
370+ t .Fatal (err )
371+ }
372+ runGit (t , work , "add" , "a.txt" )
373+ runGit (t , work , "commit" , "-q" , "-m" , "c1" )
374+ runGit (t , work , "tag" , "v1.0.0" )
375+ runGit (t , work , "push" , "-q" , "origin" , "HEAD" , "--tags" )
376+
377+ if err := os .WriteFile (filepath .Join (work , "a.txt" ), []byte ("a\n dirty\n " ), 0o644 ); err != nil {
378+ t .Fatal (err )
379+ }
380+
381+ if err := os .Chdir (work ); err != nil {
382+ t .Fatal (err )
383+ }
384+
385+ * flagGit = "git"
386+ * flagOut = "out.txt"
387+ * flagName = ""
388+ * flagDebug = false
389+ * flagGoPackage = false
390+ * flagNoFetch = true
391+ * flagNoNewline = false
392+ * flagIncPatch = true
393+ * flagBranch = false
394+ testMode = false
395+
396+ if code := mainfn (); code == 0 {
397+ t .Fatal ("mainfn unexpectedly succeeded on dirty tree" )
398+ }
399+
400+ if _ , err := os .Stat (filepath .Join (work , "out.txt" )); err == nil {
401+ t .Fatal ("unexpected output file out.txt" )
402+ } else if ! os .IsNotExist (err ) {
403+ t .Fatal (err )
404+ }
405+ localTags := runGit (t , work , "tag" , "--list" )
406+ if strings .Contains (localTags , "v1.0.1" ) {
407+ t .Fatalf ("unexpected local tag v1.0.1: %q" , localTags )
408+ }
409+ remoteTags := runGit (t , work , "ls-remote" , "--tags" , "origin" )
410+ if strings .Contains (remoteTags , "refs/tags/v1.0.1" ) {
411+ t .Fatalf ("unexpected remote tag v1.0.1: %q" , remoteTags )
412+ }
413+ }
414+
340415func TestMainFnIncPatchOverwritesExistingOutputFile (t * testing.T ) {
341416 flag .Parse ()
342417 oldWD , err := os .Getwd ()
0 commit comments