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 }