Skip to content

Commit 3794f64

Browse files
committed
Fix gh auth persistence inside sprite
1 parent 29e9036 commit 3794f64

3 files changed

Lines changed: 85 additions & 3 deletions

File tree

cmd/seven/integration_test.go

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -162,6 +162,67 @@ func TestIntegrationInitNormalizesForbiddenDirName(t *testing.T) {
162162
}
163163
}
164164

165+
func TestIntegrationGhAuthPersistsInSprite(t *testing.T) {
166+
if os.Getenv("SEVEN_INTEGRATION") != "1" {
167+
t.Skip("set SEVEN_INTEGRATION=1 to run integration tests")
168+
}
169+
170+
if _, err := exec.LookPath("sprite"); err != nil {
171+
t.Skip("sprite CLI not found in PATH")
172+
}
173+
if err := exec.Command("sprite", "list").Run(); err != nil {
174+
t.Skip("sprite list failed; ensure you are logged in")
175+
}
176+
if _, err := exec.LookPath("gh"); err != nil {
177+
t.Skip("gh CLI not found in PATH")
178+
}
179+
if _, err := exec.LookPath("git"); err != nil {
180+
t.Skip("git not available")
181+
}
182+
183+
tokenOut, err := exec.Command("gh", "auth", "token").CombinedOutput()
184+
if err != nil || strings.TrimSpace(string(tokenOut)) == "" {
185+
t.Skip("gh auth token not available on host")
186+
}
187+
188+
repo := t.TempDir()
189+
if err := initGitRepo(repo, "https://github.com/1to10partners/seven.git"); err != nil {
190+
t.Fatalf("git setup failed: %v", err)
191+
}
192+
193+
cmdInit := exec.Command(testSevenBin, "init", "--assume-logged-in")
194+
cmdInit.Dir = repo
195+
cmdInit.Stdout = os.Stdout
196+
cmdInit.Stderr = os.Stderr
197+
cmdInit.Env = os.Environ()
198+
if err := cmdInit.Run(); err != nil {
199+
t.Fatalf("seven init failed: %v", err)
200+
}
201+
202+
spriteFile := filepath.Join(repo, ".sprite")
203+
data, err := os.ReadFile(spriteFile)
204+
if err != nil {
205+
t.Fatalf("expected .sprite file: %v", err)
206+
}
207+
name := strings.TrimSpace(string(data))
208+
if name == "" {
209+
t.Fatalf(".sprite should contain a name")
210+
}
211+
212+
defer destroySprite(t, repo)
213+
214+
if err := exec.Command("sprite", "exec", "-s", name, "gh", "--version").Run(); err != nil {
215+
t.Skip("gh not available in sprite")
216+
}
217+
218+
auth := exec.Command("sprite", "exec", "-s", name, "gh", "auth", "status", "-h", "github.com")
219+
auth.Stdout = os.Stdout
220+
auth.Stderr = os.Stderr
221+
if err := auth.Run(); err != nil {
222+
t.Fatalf("expected gh auth status to succeed in sprite: %v", err)
223+
}
224+
}
225+
165226
func spriteListed(name string) bool {
166227
out, err := exec.Command("sprite", "list").CombinedOutput()
167228
if err != nil {

cmd/seven/main.go

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -642,10 +642,19 @@ func ensureGhAuthInSprite(spriteName, ghToken string, opts upOptions) error {
642642
if err := spriteExec(spriteName, env, opts.QuietExternal, "sh", "-lc", "command -v gh >/dev/null 2>&1"); err != nil {
643643
return fmt.Errorf("gh not found in sprite: %w", err)
644644
}
645-
if err := spriteExec(spriteName, env, opts.QuietExternal, "sh", "-lc", "printf '%s' \"$GH_TOKEN\" | gh auth login --with-token"); err != nil {
645+
loginCmd := "token=\"$GH_TOKEN\"; unset GH_TOKEN; printf '%s' \"$token\" | gh auth login --with-token -h github.com"
646+
if out, err := spriteExecOutput(spriteName, env, "sh", "-lc", loginCmd); err != nil {
647+
msg := strings.TrimSpace(out)
648+
if msg != "" {
649+
return fmt.Errorf("gh auth login failed: %w (%s)", err, msg)
650+
}
646651
return fmt.Errorf("gh auth login failed: %w", err)
647652
}
648-
if err := spriteExec(spriteName, env, opts.QuietExternal, "gh", "auth", "setup-git"); err != nil {
653+
if out, err := spriteExecOutput(spriteName, env, "gh", "auth", "setup-git"); err != nil {
654+
msg := strings.TrimSpace(out)
655+
if msg != "" {
656+
return fmt.Errorf("gh auth setup-git failed: %w (%s)", err, msg)
657+
}
649658
return fmt.Errorf("gh auth setup-git failed: %w", err)
650659
}
651660
return nil
@@ -729,6 +738,18 @@ func spriteExec(spriteName string, env []string, quiet bool, args ...string) err
729738
return runCmd(spriteBin(), nil, cmdArgs...)
730739
}
731740

741+
func spriteExecOutput(spriteName string, env []string, args ...string) (string, error) {
742+
if spriteName == "" {
743+
return "", errors.New("sprite name is empty")
744+
}
745+
cmdArgs := []string{"exec", "-s", spriteName}
746+
for _, kv := range env {
747+
cmdArgs = append(cmdArgs, "-env", kv)
748+
}
749+
cmdArgs = append(cmdArgs, args...)
750+
return runCmdOutput(spriteBin(), nil, cmdArgs...)
751+
}
752+
732753
func spriteBin() string {
733754
if spritePath == "" {
734755
return "sprite"

cmd/seven/main_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -295,7 +295,7 @@ exit 0
295295
t.Fatalf("expected sprite log: %v", err)
296296
}
297297
log := string(logData)
298-
if !strings.Contains(log, "gh auth login --with-token") {
298+
if !strings.Contains(log, "gh auth login --with-token -h github.com") {
299299
t.Fatalf("expected gh auth login in sprite, got: %s", log)
300300
}
301301
if !strings.Contains(log, "gh auth setup-git") {

0 commit comments

Comments
 (0)