github.com/driusan/dgit@v0.0.0-20221118233547-f39f0c15edbb/git/commit_test.go (about)

     1  package git
     2  
     3  import (
     4  	"io/ioutil"
     5  	"os"
     6  	"testing"
     7  )
     8  
     9  // TestSimpleCommits tests that an initial commit works,
    10  // and that a second commit using it as a parent works.
    11  // It also tests that the second commit can be done while
    12  // in a detached head mode.
    13  func TestSimpleCommits(t *testing.T) {
    14  	dir, err := ioutil.TempDir("", "gitcommit")
    15  	if err != nil {
    16  		t.Fatal(err)
    17  	}
    18  	defer os.RemoveAll(dir)
    19  
    20  	// Init a repo to test an initial commit in.
    21  	c, err := Init(nil, InitOptions{Quiet: true}, dir)
    22  	if err != nil {
    23  		t.Fatal(err)
    24  	}
    25  	if err := os.Chdir(dir); err != nil {
    26  		t.Fatal(err)
    27  	}
    28  	if err := ioutil.WriteFile(dir+"/foo.txt", []byte("foo\n"), 0644); err != nil {
    29  		t.Fatal(err)
    30  	}
    31  	if _, err := Add(c, AddOptions{}, []File{"foo.txt"}); err != nil {
    32  		t.Fatal(err)
    33  	}
    34  
    35  	// Set the environment variables used by CommitTree to a known value,
    36  	// to ensure repeatable tests.
    37  	if err := os.Setenv("GIT_COMMITTER_NAME", "John Smith"); err != nil {
    38  		t.Fatal(err)
    39  	}
    40  	if err := os.Setenv("GIT_COMMITTER_EMAIL", "test@example.com"); err != nil {
    41  		t.Fatal(err)
    42  	}
    43  	if err := os.Setenv("GIT_AUTHOR_NAME", "John Smith"); err != nil {
    44  		t.Fatal(err)
    45  	}
    46  	if err := os.Setenv("GIT_AUTHOR_EMAIL", "test@example.com"); err != nil {
    47  		t.Fatal(err)
    48  	}
    49  	if err := os.Setenv("GIT_COMMITTER_DATE", "Mon, 02 Jan 2006 15:04:05 -0700"); err != nil {
    50  		t.Fatal(err)
    51  	}
    52  	if err := os.Setenv("GIT_AUTHOR_DATE", "Mon, 02 Jan 2006 15:04:05 -0700"); err != nil {
    53  		t.Fatal(err)
    54  	}
    55  
    56  	initialCmt, err := Commit(c, CommitOptions{}, "Initial commit", nil)
    57  	if err != nil {
    58  		t.Fatal(err)
    59  	}
    60  
    61  	expected, err := CommitIDFromString("dace19089043791b92c4421453e314274a6abcda")
    62  	if err != nil {
    63  		t.Fatal(err)
    64  	}
    65  	if initialCmt != expected {
    66  		t.Errorf("Unexpected hash for expected commit. got %v want %v", initialCmt, expected)
    67  	}
    68  	if err := os.Setenv("GIT_AUTHOR_DATE", "Mon, 02 Jan 2007 15:54:05 -0700"); err != nil {
    69  		t.Fatal(err)
    70  	}
    71  	if err := os.Setenv("GIT_COMMITTER_DATE", "Mon, 02 Jan 2007 15:54:05 -0700"); err != nil {
    72  		t.Fatal(err)
    73  	}
    74  	if err := ioutil.WriteFile(dir+"/foo.txt", []byte("bar\n"), 0644); err != nil {
    75  		t.Fatal(err)
    76  	}
    77  	if _, err := Add(c, AddOptions{}, []File{"foo.txt"}); err != nil {
    78  		t.Fatal(err)
    79  	}
    80  	cid, err := Commit(c, CommitOptions{}, "Changed foo to bar", nil)
    81  	if err != nil {
    82  		t.Fatal(err)
    83  	}
    84  	expected, err = CommitIDFromString("6060b31388226cc5e3f14166dbe061f68ff180f2")
    85  	if err != nil {
    86  		t.Fatal(err)
    87  	}
    88  	if cid != expected {
    89  		t.Errorf("Unexpected hash for second commit. got %v want %v", cid, expected)
    90  	}
    91  
    92  	// Now go back to the first commit in a detached head state, and try
    93  	// again.
    94  
    95  	if err := CheckoutCommit(c, CheckoutOptions{}, initialCmt); err != nil {
    96  		t.Fatal(err)
    97  	}
    98  	if err := ioutil.WriteFile(dir+"/foo.txt", []byte("bar\n"), 0644); err != nil {
    99  		t.Fatal(err)
   100  	}
   101  	if _, err := Add(c, AddOptions{}, []File{"foo.txt"}); err != nil {
   102  		t.Fatal(err)
   103  	}
   104  	cid, err = Commit(c, CommitOptions{}, "Changed foo to bar\n", nil)
   105  	if err != nil {
   106  		t.Fatal("Commit with detached head error:", err)
   107  	}
   108  	if cid != expected {
   109  		t.Errorf("Unexpected hash for second commit while in detached head mode. got %v want %v", cid, expected)
   110  	}
   111  	content, err := ioutil.ReadFile(c.GitDir.File("HEAD").String())
   112  	if err != nil {
   113  		t.Fatal(err)
   114  	}
   115  	if string(content) != cid.String() {
   116  		t.Errorf("Commit lied about updating the HEAD reference")
   117  	}
   118  }
   119  
   120  // TestUnmergedCommit tests that Commit() produces an
   121  // error when there are merge entries in the index.
   122  func TestUnmergedCommit(t *testing.T) {
   123  	gitdir, err := ioutil.TempDir("", "gitcommitunmerged")
   124  	if err != nil {
   125  		t.Fatal(err)
   126  	}
   127  	defer os.RemoveAll(gitdir)
   128  
   129  	c, err := Init(nil, InitOptions{Quiet: true}, gitdir)
   130  	if err != nil {
   131  		t.Fatal(err)
   132  	}
   133  	if err := os.Chdir(gitdir); err != nil {
   134  		t.Fatal(err)
   135  	}
   136  	idx := NewIndex()
   137  	idx.Objects = []*IndexEntry{
   138  		&IndexEntry{
   139  			PathName: IndexPath("foo"),
   140  			FixedIndexEntry: FixedIndexEntry{
   141  				Mode:  ModeBlob,
   142  				Fsize: 4,
   143  				Sha1:  hashString("bar\n"),
   144  				// 3 == len(filename)
   145  				Flags: uint16(Stage1)<<12 | 3,
   146  			},
   147  		},
   148  		&IndexEntry{
   149  			PathName: IndexPath("foo"),
   150  			FixedIndexEntry: FixedIndexEntry{
   151  				Mode:  ModeBlob,
   152  				Fsize: 4,
   153  				Sha1:  hashString("baz\n"),
   154  				// 3 == len(filename)
   155  				Flags: uint16(Stage2)<<12 | 3,
   156  			},
   157  		},
   158  	}
   159  	// Make sure "bar\n" and "baz\n" exist, so we're testing the right
   160  	// thing
   161  	if _, err := c.WriteObject("blob", []byte("bar\n")); err != nil {
   162  		t.Fatal(err)
   163  	}
   164  	if _, err := c.WriteObject("blob", []byte("baz\n")); err != nil {
   165  		t.Fatal(err)
   166  	}
   167  
   168  	// Write the index
   169  	f, err := c.GitDir.Create("index")
   170  	if err != nil {
   171  		t.Fatal(err)
   172  	}
   173  	defer f.Close()
   174  	if err := idx.WriteIndex(f); err != nil {
   175  		t.Fatal(err)
   176  	}
   177  	// Sanity check: make sure the index got written.
   178  	if files, err := LsFiles(c, LsFilesOptions{Stage: true, Cached: true}, nil); len(files) != 2 || err != nil {
   179  		t.Fatal("Did not correctly write index", len(files), err, c)
   180  	}
   181  
   182  	// Finally, do the test..
   183  	_, err = Commit(c, CommitOptions{}, "I am a test", nil)
   184  	if err == nil {
   185  		t.Error("Was able to commit an index with unresolved conflicts.")
   186  	}
   187  }
   188  
   189  // TestSimpleCommits tests that an initial commit works,
   190  // and that a second commit using it as a parent works.
   191  // It also tests that the second commit can be done while
   192  // in a detached head mode.
   193  func TestCommitAmend(t *testing.T) {
   194  	dir, err := ioutil.TempDir("", "gitcommitamend")
   195  	if err != nil {
   196  		t.Fatal(err)
   197  	}
   198  	defer os.RemoveAll(dir)
   199  
   200  	// Init a repo to test an initial commit in.
   201  	c, err := Init(nil, InitOptions{Quiet: true}, dir)
   202  	if err != nil {
   203  		t.Fatal(err)
   204  	}
   205  	if err := os.Chdir(dir); err != nil {
   206  		t.Fatal(err)
   207  	}
   208  	if err := ioutil.WriteFile(dir+"/foo.txt", []byte("foo\n"), 0644); err != nil {
   209  		t.Fatal(err)
   210  	}
   211  	if _, err := Add(c, AddOptions{}, []File{"foo.txt"}); err != nil {
   212  		t.Fatal(err)
   213  	}
   214  
   215  	// Set the environment variables used by CommitTree to a known value,
   216  	// to ensure repeatable tests.
   217  	if err := os.Setenv("GIT_COMMITTER_NAME", "John Smith"); err != nil {
   218  		t.Fatal(err)
   219  	}
   220  	if err := os.Setenv("GIT_COMMITTER_EMAIL", "test@example.com"); err != nil {
   221  		t.Fatal(err)
   222  	}
   223  	if err := os.Setenv("GIT_AUTHOR_NAME", "John Smith"); err != nil {
   224  		t.Fatal(err)
   225  	}
   226  	if err := os.Setenv("GIT_AUTHOR_EMAIL", "test@example.com"); err != nil {
   227  		t.Fatal(err)
   228  	}
   229  	if err := os.Setenv("GIT_COMMITTER_DATE", "Mon, 02 Jan 2006 15:04:05 -0700"); err != nil {
   230  		t.Fatal(err)
   231  	}
   232  	if err := os.Setenv("GIT_AUTHOR_DATE", "Mon, 02 Jan 2006 15:04:05 -0700"); err != nil {
   233  		t.Fatal(err)
   234  	}
   235  
   236  	initialCmt, err := Commit(c, CommitOptions{}, "Initial commit", nil)
   237  	if err != nil {
   238  		t.Fatal(err)
   239  	}
   240  	expected, err := CommitIDFromString("dace19089043791b92c4421453e314274a6abcda")
   241  	if err != nil {
   242  		t.Fatal(err)
   243  	}
   244  
   245  	if initialCmt != expected {
   246  		t.Errorf("Unexpected hash for expected commit. got %v want %v", initialCmt, expected)
   247  	}
   248  
   249  	// Pretend time passed and the author changed. The author date shouldn't
   250  	// be honoured (without --reset-author), it should come from the initial
   251  	// commit. The committer date should be honoured.
   252  	if err := os.Setenv("GIT_AUTHOR_NAME", "Joan Smith"); err != nil {
   253  		t.Fatal(err)
   254  	}
   255  	if err := os.Setenv("GIT_AUTHOR_EMAIL", "tester@example.com"); err != nil {
   256  		t.Fatal(err)
   257  	}
   258  
   259  	if err := os.Setenv("GIT_AUTHOR_DATE", "Mon, 02 Jan 2007 15:54:05 -0700"); err != nil {
   260  		t.Fatal(err)
   261  	}
   262  	if err := os.Setenv("GIT_COMMITTER_DATE", "Mon, 02 Jan 2007 15:54:05 -0700"); err != nil {
   263  		t.Fatal(err)
   264  	}
   265  	if err := ioutil.WriteFile(dir+"/foo.txt", []byte("bar\n"), 0644); err != nil {
   266  		t.Fatal(err)
   267  	}
   268  	if _, err := Add(c, AddOptions{}, []File{"foo.txt"}); err != nil {
   269  		t.Fatal(err)
   270  	}
   271  	cid, err := Commit(c, CommitOptions{Amend: true}, "Changed foo to bar", nil)
   272  	if err != nil {
   273  		t.Fatal(err)
   274  	}
   275  	expected, err = CommitIDFromString("ef1985dcfdec1e1b3225d6536e1662d28adecf2f")
   276  	if err != nil {
   277  		t.Fatal(err)
   278  	}
   279  	if cid != expected {
   280  		t.Errorf("Unexpected hash for amended commit. got %v want %v", cid, expected)
   281  	}
   282  	cid, err = Commit(c, CommitOptions{Amend: true, ResetAuthor: true}, "Changed foo to bar", nil)
   283  	if err != nil {
   284  		t.Fatal(err)
   285  	}
   286  	expected, err = CommitIDFromString("bde182793e07d43a99565fd102a74437d5762ede")
   287  	if err != nil {
   288  		t.Fatal(err)
   289  	}
   290  	if cid != expected {
   291  		t.Errorf("Unexpected hash for amended commit. got %v want %v", cid, expected)
   292  	}
   293  
   294  	if err := ioutil.WriteFile(dir+"/foo.txt", []byte("foo\n"), 0644); err != nil {
   295  		t.Fatal(err)
   296  	}
   297  	if _, err := Add(c, AddOptions{}, []File{"foo.txt"}); err != nil {
   298  		t.Fatal(err)
   299  	}
   300  
   301  	cid, err = Commit(c, CommitOptions{}, "Back to the footure", nil)
   302  	if err != nil {
   303  		t.Fatal(err)
   304  	}
   305  	expected, err = CommitIDFromString("6da09b27e260087d6559268fda99369fe6104ced")
   306  	if err != nil {
   307  		t.Fatal(err)
   308  	}
   309  	if cid != expected {
   310  		t.Errorf("Unexpected hash for amended commit. got %v want %v", cid, expected)
   311  	}
   312  	if err := ioutil.WriteFile(dir+"/foo.txt", []byte("baz\n"), 0644); err != nil {
   313  		t.Fatal(err)
   314  	}
   315  	if _, err := Add(c, AddOptions{}, []File{"foo.txt"}); err != nil {
   316  		t.Fatal(err)
   317  	}
   318  
   319  	cid, err = Commit(c, CommitOptions{Amend: true}, "Remove bad pun.", nil)
   320  	if err != nil {
   321  		t.Fatal(err)
   322  	}
   323  	expected, err = CommitIDFromString("eb36fff82a7c1cee518fa0f73548f3d9a873220b")
   324  	if err != nil {
   325  		t.Fatal(err)
   326  	}
   327  	if cid != expected {
   328  		t.Errorf("Unexpected hash for amended commit. got %v want %v", cid, expected)
   329  	}
   330  
   331  	if err := os.Setenv("GIT_AUTHOR_NAME", "Foobar"); err != nil {
   332  		t.Fatal(err)
   333  	}
   334  	cid, err = Commit(c, CommitOptions{Amend: true, ResetAuthor: true}, "Remove bad pun.", nil)
   335  	if err != nil {
   336  		t.Fatal(err)
   337  	}
   338  	expected, err = CommitIDFromString("51fb69956f6ea3a8500109a5f1b282ba548cdbf0")
   339  	if err != nil {
   340  		t.Fatal(err)
   341  	}
   342  	if cid != expected {
   343  		t.Errorf("Unexpected hash for amended commit. got %v want %v", cid, expected)
   344  	}
   345  
   346  	// FIXME: Add tests for when the tree doesn't get modified and --allow-empty
   347  	// isn't set, also add tests for merge commit amends
   348  }