summaryrefslogtreecommitdiff
path: root/rebase_test.go
diff options
context:
space:
mode:
authorezwiebel <[email protected]>2016-08-07 14:40:59 +1000
committerezwiebel <[email protected]>2016-08-07 17:48:18 +1000
commitb1a9de8037e4260dcd840db38e2e16473cdddcb6 (patch)
treecaad921f66f29411400631b30ae530208788640a /rebase_test.go
parentf720800b507b72c0d64cdae70e2058bc620adc24 (diff)
Initial rebase wrapper version
Diffstat (limited to 'rebase_test.go')
-rw-r--r--rebase_test.go167
1 files changed, 167 insertions, 0 deletions
diff --git a/rebase_test.go b/rebase_test.go
new file mode 100644
index 0000000..d4b4251
--- /dev/null
+++ b/rebase_test.go
@@ -0,0 +1,167 @@
+package git
+
+import (
+ "testing"
+ "time"
+)
+
+func createBranch(repo *Repository, branch string) error {
+ head, err := repo.Head()
+ if err != nil {
+ return err
+ }
+ commit, err := repo.LookupCommit(head.Target())
+ if err != nil {
+ return err
+ }
+ _, err = repo.CreateBranch(branch, commit, false)
+ if err != nil {
+ return err
+ }
+
+ return nil
+}
+
+func signature() *Signature {
+ return &Signature{
+ Name: "Emile",
+ Email: "[email protected]",
+ When: time.Now(),
+ }
+}
+
+func commitSomething(repo *Repository, something string) (*Oid, error) {
+ head, err := repo.Head()
+ if err != nil {
+ return nil, err
+ }
+
+ headCommit, err := repo.LookupCommit(head.Target())
+ if err != nil {
+ return nil, err
+ }
+
+ index, err := NewIndex()
+ if err != nil {
+ return nil, err
+ }
+ defer index.Free()
+
+ blobOID, err := repo.CreateBlobFromBuffer([]byte("fou"))
+ if err != nil {
+ return nil, err
+ }
+
+ entry := &IndexEntry{
+ Mode: FilemodeBlob,
+ Id: blobOID,
+ Path: something,
+ }
+
+ if err := index.Add(entry); err != nil {
+ return nil, err
+ }
+
+ newTreeOID, err := index.WriteTreeTo(repo)
+ if err != nil {
+ return nil, err
+ }
+
+ newTree, err := repo.LookupTree(newTreeOID)
+ if err != nil {
+ return nil, err
+ }
+
+ if err != nil {
+ return nil, err
+ }
+ commit, err := repo.CreateCommit("HEAD", signature(), signature(), "Test rebase onto, Baby! "+something, newTree, headCommit)
+ if err != nil {
+ return nil, err
+ }
+
+ opts := &CheckoutOpts{
+ Strategy: CheckoutRemoveUntracked | CheckoutForce,
+ }
+ err = repo.CheckoutIndex(index, opts)
+ if err != nil {
+ return nil, err
+ }
+
+ return commit, nil
+}
+
+func entryExists(repo *Repository, file string) bool {
+ head, err := repo.Head()
+ if err != nil {
+ return false
+ }
+ headCommit, err := repo.LookupCommit(head.Target())
+ if err != nil {
+ return false
+ }
+ headTree, err := headCommit.Tree()
+ if err != nil {
+ return false
+ }
+ _, err = headTree.EntryByPath(file)
+
+ return err == nil
+}
+
+func TestRebaseOnto(t *testing.T) {
+ repo := createTestRepo(t)
+ defer cleanupTestRepo(t, repo)
+
+ fileInMaster := "something"
+ fileInEmile := "something else"
+
+ // Seed master
+ seedTestRepo(t, repo)
+
+ // Create a new branch from master
+ err := createBranch(repo, "emile")
+ checkFatal(t, err)
+
+ // Create a commit in master
+ _, err = commitSomething(repo, fileInMaster)
+ checkFatal(t, err)
+
+ // Switch to this emile
+ err = repo.SetHead("refs/heads/emile")
+ checkFatal(t, err)
+
+ // Check master commit is not in emile branch
+ if entryExists(repo, fileInMaster) {
+ t.Fatal("something entry should not exist in emile branch")
+ }
+
+ // Create a commit in emile
+ _, err = commitSomething(repo, fileInEmile)
+ checkFatal(t, err)
+
+ // Rebase onto master
+ master, err := repo.LookupBranch("master", BranchLocal)
+ branch, err := repo.AnnotatedCommitFromRef(master.Reference)
+ checkFatal(t, err)
+
+ rebase, err := repo.RebaseInit(nil, nil, branch, nil)
+ checkFatal(t, err)
+ defer rebase.Free()
+
+ operation, err := rebase.Next()
+ checkFatal(t, err)
+
+ commit, err := repo.LookupCommit(operation.ID)
+ checkFatal(t, err)
+
+ err = rebase.Commit(operation.ID, signature(), signature(), commit.Message())
+ checkFatal(t, err)
+
+ rebase.Finish()
+
+ // Check master commit is now also in emile branch
+ if !entryExists(repo, fileInMaster) {
+ t.Fatal("something entry should now exist in emile branch")
+ }
+}