package git import ( "os" "path/filepath" "strings" "testing" ) func TestLogCommitAtShowPatch(t *testing.T) { path := filepath.Join(t.TempDir(), "demo.git") if err := InitBare(path, "main"); err != nil { t.Fatalf("InitBare: %v", err) } seedBare(t, path) work := filepath.Join(t.TempDir(), "work2") runGit(t, "", "clone", "-q", path, work) if err := os.WriteFile(filepath.Join(work, "new.txt"), []byte("new\n"), 0o644); err != nil { t.Fatalf("write: %v", err) } runGit(t, work, "add", ".") runGit(t, work, "-c", "user.email=t@t", "-c", "user.name=t", "commit", "-qm", "second") runGit(t, work, "push", "-q", "origin", "main") logs, err := Log(path, "main", 50) if err != nil { t.Fatalf("Log: %v", err) } if len(logs) != 2 { t.Fatalf("log length = %d, want 2: %+v", len(logs), logs) } if logs[0].Subject != "second" || logs[1].Subject != "seed" { t.Errorf("subjects = %q, %q, want second, seed", logs[0].Subject, logs[1].Subject) } if logs[0].Author != "t" || !strings.Contains(logs[0].Date, "T") { t.Errorf("first commit author/date = %q %q", logs[0].Author, logs[0].Date) } // Log lists rows only; parents come from CommitAt. head, err := CommitAt(path, logs[0].SHA) if err != nil { t.Fatalf("CommitAt head: %v", err) } if len(head.Parents) != 1 || head.Parents[0] != logs[1].SHA { t.Errorf("head parents = %v, want [%s]", head.Parents, logs[1].SHA) } root, err := CommitAt(path, logs[1].SHA[:8]) if err != nil { t.Fatalf("CommitAt short sha: %v", err) } if root.Subject != "seed" || len(root.Parents) != 0 { t.Errorf("root commit = %+v, want seed with no parents", root) } patch, err := ShowPatch(path, logs[0].SHA, 1<<20) if err != nil { t.Fatalf("ShowPatch: %v", err) } if !strings.Contains(string(patch), "+++ b/new.txt") { t.Errorf("patch lacks new file diff: %q", patch) } if _, err := Log(path, "nosuchref", 10); err == nil { t.Error("Log on missing ref = nil error, want error") } }