60 lines
1.7 KiB
Go
60 lines
1.7 KiB
Go
//go:build integration
|
|
|
|
package buildstep
|
|
|
|
import (
|
|
"context"
|
|
"os"
|
|
"os/exec"
|
|
"path/filepath"
|
|
"strings"
|
|
"testing"
|
|
|
|
"git.novox.be/novox/mesh-sdk/go/forgekey"
|
|
)
|
|
|
|
func gitIn(t *testing.T, dir string, args ...string) string {
|
|
t.Helper()
|
|
cmd := exec.Command("git", append([]string{"-C", dir, "-c", "user.name=t", "-c", "user.email=t@example.invalid"}, args...)...)
|
|
out, err := cmd.CombinedOutput()
|
|
if err != nil {
|
|
t.Fatalf("git %v: %v\n%s", args, err, out)
|
|
}
|
|
return strings.TrimSpace(string(out))
|
|
}
|
|
|
|
// 1474/AC5: a local bare repository with a commit only under refs/pull/1/head (a file:// remote, allowed by the
|
|
// test-only option): the workspace's HEAD is the commit. The forge itself is proven live after the build
|
|
// modules' delivery (ADR 0466 §5).
|
|
func TestFetchCommitFromAPullRefOnly(t *testing.T) {
|
|
root := t.TempDir()
|
|
bare := filepath.Join(root, "r.git")
|
|
work := filepath.Join(root, "work")
|
|
for _, d := range []string{bare, work} {
|
|
if err := os.MkdirAll(d, 0o755); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
}
|
|
gitIn(t, bare, "init", "-q", "--bare")
|
|
gitIn(t, work, "init", "-q")
|
|
if err := os.WriteFile(filepath.Join(work, "f"), []byte("x"), 0o644); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
gitIn(t, work, "add", "f")
|
|
gitIn(t, work, "commit", "-q", "-m", "pull request head")
|
|
commit := gitIn(t, work, "rev-parse", "HEAD")
|
|
gitIn(t, work, "push", "-q", bare, "HEAD:refs/pull/1/head")
|
|
|
|
ws := filepath.Join(root, "ws")
|
|
if err := os.MkdirAll(ws, 0o755); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
err := FetchCommit(context.Background(), forgekey.ExecRunner, ws, "file://"+bare, commit, "refs/pull/1/head", AllowFileRemote())
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if head := gitIn(t, ws, "rev-parse", "HEAD"); head != commit {
|
|
t.Errorf("HEAD = %s, want %s", head, commit)
|
|
}
|
|
}
|