mirror of
https://github.com/x-motemen/ghq.git
synced 2026-09-10 07:26:27 -04:00
138 lines
2.2 KiB
Go
138 lines
2.2 KiB
Go
package main
|
|
|
|
import (
|
|
"fmt"
|
|
"io"
|
|
"net/url"
|
|
"os"
|
|
"testing"
|
|
)
|
|
|
|
func mustParseURL(urlString string) *url.URL {
|
|
u, err := url.Parse(urlString)
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
return u
|
|
}
|
|
|
|
func captureReader(block func()) (*os.File, *os.File, error) {
|
|
rOut, wOut, err := os.Pipe()
|
|
if err != nil {
|
|
return nil, nil, err
|
|
}
|
|
defer wOut.Close()
|
|
|
|
rErr, wErr, err := os.Pipe()
|
|
if err != nil {
|
|
return nil, nil, err
|
|
}
|
|
defer wErr.Close()
|
|
|
|
var stdout, stderr *os.File
|
|
os.Stdout, stdout = wOut, os.Stdout
|
|
os.Stderr, stderr = wErr, os.Stderr
|
|
|
|
defer func() {
|
|
os.Stdout = stdout
|
|
os.Stderr = stderr
|
|
}()
|
|
|
|
block()
|
|
|
|
wOut.Close()
|
|
wErr.Close()
|
|
|
|
return rOut, rErr, nil
|
|
}
|
|
|
|
func capture(block func()) (string, string, error) {
|
|
rOut, rErr, err := captureReader(block)
|
|
if err != nil {
|
|
return "", "", err
|
|
}
|
|
defer rOut.Close()
|
|
defer rErr.Close()
|
|
|
|
bufOut, err := io.ReadAll(rOut)
|
|
if err != nil {
|
|
return "", "", err
|
|
}
|
|
|
|
bufErr, err := io.ReadAll(rErr)
|
|
if err != nil {
|
|
return "", "", err
|
|
}
|
|
|
|
return string(bufOut), string(bufErr), nil
|
|
}
|
|
|
|
func captureWithInput(in []string, block func()) (string, string, error) {
|
|
rIn, wIn, err := os.Pipe()
|
|
if err != nil {
|
|
return "", "", err
|
|
}
|
|
defer rIn.Close()
|
|
|
|
var stdin *os.File
|
|
os.Stdin, stdin = rIn, os.Stdin
|
|
|
|
defer func() { os.Stdin = stdin }()
|
|
|
|
for _, line := range in {
|
|
fmt.Fprintln(wIn, line)
|
|
}
|
|
wIn.Close()
|
|
return capture(block)
|
|
}
|
|
|
|
func newTempDir(t *testing.T) string {
|
|
tmpdir, err := os.MkdirTemp("", "ghq-test")
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
t.Cleanup(func() { os.RemoveAll(tmpdir) })
|
|
|
|
// Resolve /var/folders/.../T/... to /private/var/... in OSX
|
|
wd, err := os.Getwd()
|
|
if err != nil {
|
|
t.Fatalf("os.Getwd(): %s", err)
|
|
}
|
|
|
|
defer func() {
|
|
err := os.Chdir(wd)
|
|
if err != nil {
|
|
t.Fatalf("os.Chdir(): %s", err)
|
|
}
|
|
}()
|
|
|
|
err = os.Chdir(tmpdir)
|
|
if err != nil {
|
|
t.Fatalf("os.Chdir(): %s", err)
|
|
}
|
|
|
|
tmpdir, err = os.Getwd()
|
|
if err != nil {
|
|
t.Fatalf("os.Getwd(): %s", err)
|
|
}
|
|
|
|
s, err := toFullPath(tmpdir)
|
|
if err != nil {
|
|
t.Fatalf("toFullPath(%q): %s", tmpdir, err)
|
|
}
|
|
return s
|
|
}
|
|
|
|
func setEnv(t *testing.T, key, val string) {
|
|
orig, ok := os.LookupEnv(key)
|
|
os.Setenv(key, val)
|
|
|
|
t.Cleanup(func() {
|
|
if ok {
|
|
os.Setenv(key, orig)
|
|
} else {
|
|
os.Unsetenv(key)
|
|
}
|
|
})
|
|
}
|