Skip to content

Commit 1585d02

Browse files
committed
fixing auth issue
1 parent 669d19d commit 1585d02

9 files changed

Lines changed: 323 additions & 18 deletions

File tree

git-genius

-363 Bytes
Binary file not shown.

internal/github/token.go

Lines changed: 67 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,9 @@ import (
1010
const (
1111
geniusDirName = ".git-genius"
1212
tokenFileName = "token"
13+
userFileName = "username"
1314
EnvTokenName = "GIT_GENIUS_GITHUB_TOKEN"
15+
EnvUserName = "GIT_GENIUS_GITHUB_USERNAME"
1416
)
1517

1618
/*
@@ -20,13 +22,21 @@ getTokenPath:
2022
~/.git-genius/token
2123
*/
2224
func getTokenPath() (string, error) {
25+
return getStatePath(tokenFileName)
26+
}
27+
28+
func getUsernamePath() (string, error) {
29+
return getStatePath(userFileName)
30+
}
31+
32+
func getStatePath(name string) (string, error) {
2333
home, err := os.UserHomeDir()
2434
if err != nil {
2535
return "", err
2636
}
2737

2838
dir := filepath.Join(home, geniusDirName)
29-
return filepath.Join(dir, tokenFileName), nil
39+
return filepath.Join(dir, name), nil
3040
}
3141

3242
/* ================= TOKEN ================= */
@@ -39,6 +49,14 @@ func GetToken() string {
3949
return storedToken()
4050
}
4151

52+
func GetUsername() string {
53+
if user := strings.TrimSpace(os.Getenv(EnvUserName)); user != "" {
54+
return user
55+
}
56+
57+
return storedUsername()
58+
}
59+
4260
func TokenSource() string {
4361
if strings.TrimSpace(os.Getenv(EnvTokenName)) != "" {
4462
return "environment"
@@ -55,6 +73,10 @@ func HasStoredToken() bool {
5573
return storedToken() != ""
5674
}
5775

76+
func HasStoredUsername() bool {
77+
return storedUsername() != ""
78+
}
79+
5880
func storedToken() string {
5981
path, err := getTokenPath()
6082
if err != nil {
@@ -69,8 +91,27 @@ func storedToken() string {
6991
return strings.TrimSpace(string(data))
7092
}
7193

94+
func storedUsername() string {
95+
path, err := getUsernamePath()
96+
if err != nil {
97+
return ""
98+
}
99+
100+
data, err := os.ReadFile(path)
101+
if err != nil {
102+
return ""
103+
}
104+
105+
return strings.TrimSpace(string(data))
106+
}
107+
72108
func Save(token string) error {
109+
return SaveAuth(token, "")
110+
}
111+
112+
func SaveAuth(token, username string) error {
73113
token = strings.TrimSpace(token)
114+
username = strings.TrimSpace(username)
74115
if token == "" {
75116
return errors.New("empty token")
76117
}
@@ -88,13 +129,36 @@ func Save(token string) error {
88129
}
89130

90131
// Write token securely
91-
return os.WriteFile(path, []byte(token), 0600)
132+
if err := os.WriteFile(path, []byte(token), 0600); err != nil {
133+
return err
134+
}
135+
136+
if username == "" {
137+
if userPath, err := getUsernamePath(); err == nil {
138+
_ = os.Remove(userPath)
139+
}
140+
return nil
141+
}
142+
143+
userPath, err := getUsernamePath()
144+
if err != nil {
145+
return err
146+
}
147+
148+
return os.WriteFile(userPath, []byte(username), 0600)
92149
}
93150

94151
func Delete() error {
95152
path, err := getTokenPath()
96153
if err != nil {
97154
return err
98155
}
99-
return os.Remove(path)
156+
_ = os.Remove(path)
157+
158+
userPath, err := getUsernamePath()
159+
if err != nil {
160+
return nil
161+
}
162+
_ = os.Remove(userPath)
163+
return nil
100164
}

internal/github/token_test.go

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,3 +20,23 @@ func TestGetTokenPrefersEnvironment(t *testing.T) {
2020
t.Fatalf("expected stored token to remain available")
2121
}
2222
}
23+
24+
func TestSaveAuthPersistsUsernameAndEnvironmentWins(t *testing.T) {
25+
t.Setenv("HOME", t.TempDir())
26+
27+
if err := SaveAuth("file-token", "file-user"); err != nil {
28+
t.Fatalf("SaveAuth: %v", err)
29+
}
30+
31+
if got := GetUsername(); got != "file-user" {
32+
t.Fatalf("GetUsername() = %q, want file-user", got)
33+
}
34+
if !HasStoredUsername() {
35+
t.Fatalf("expected stored username to be available")
36+
}
37+
38+
t.Setenv(EnvUserName, "env-user")
39+
if got := GetUsername(); got != "env-user" {
40+
t.Fatalf("GetUsername() = %q, want env-user", got)
41+
}
42+
}

internal/gitops/git.go

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -145,7 +145,7 @@ func Push(msg string) bool {
145145
}
146146

147147
// ---------- PUSH ----------
148-
if err := system.RunGit("push", "-u", cfg.Remote, branch); err != nil {
148+
if err := system.RunGitWithRemote(cfg.Remote, "push", "-u", cfg.Remote, branch); err != nil {
149149
ui.Error("Push failed")
150150
if !system.HasGitCredentialHelper() {
151151
ui.Info("Run Tools -> Git Auth / Credential Helper to reduce repeated HTTPS auth prompts")
@@ -194,7 +194,7 @@ func Pull() bool {
194194
}
195195
}
196196

197-
if err := system.RunGit("pull", cfg.Remote, branch); err != nil {
197+
if err := system.RunGitWithRemote(cfg.Remote, "pull", cfg.Remote, branch); err != nil {
198198
ui.Error("Pull failed")
199199
ui.Info("Try Smart Pull or run Doctor for more guidance")
200200
return false
@@ -210,11 +210,19 @@ func Fetch() bool {
210210
return false
211211
}
212212

213-
if err := system.RunGit("fetch", "--all"); err != nil {
213+
remotes, err := system.RemoteNames()
214+
if err != nil {
214215
ui.Error("Fetch failed")
215216
return false
216217
}
217218

219+
for _, remote := range remotes {
220+
if err := system.RunGitWithRemote(remote, "fetch", remote); err != nil {
221+
ui.Error("Fetch failed")
222+
return false
223+
}
224+
}
225+
218226
ui.Success("Fetched all remotes")
219227
return true
220228
}

internal/gitops/smart_pull.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ func SmartPull() bool {
6262
return false
6363
}
6464

65-
if err := system.RunGit("pull", cfg.Remote, branch); err != nil {
65+
if err := system.RunGitWithRemote(cfg.Remote, "pull", cfg.Remote, branch); err != nil {
6666
ui.Error("Pull failed")
6767

6868
// Try restoring stash if pull failed

internal/setup/auth.go

Lines changed: 17 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package setup
22

33
import (
4+
"git-genius/internal/config"
45
"git-genius/internal/github"
56
"git-genius/internal/system"
67
"git-genius/internal/ui"
@@ -108,17 +109,24 @@ func preloadGitHubCredential() bool {
108109
return true
109110
}
110111

111-
client, err := github.NewClient()
112-
if err != nil {
113-
ui.Warn("Could not read GitHub token")
114-
ui.Info(err.Error())
115-
return true
112+
user := github.GetUsername()
113+
if user == "" {
114+
client, err := github.NewClient()
115+
if err == nil {
116+
if resolved, resolveErr := client.GetAuthenticatedUser(); resolveErr == nil {
117+
user = resolved
118+
_ = github.SaveAuth(token, user)
119+
}
120+
}
116121
}
117122

118-
user, err := client.GetAuthenticatedUser()
119-
if err != nil {
120-
ui.Warn("Could not resolve GitHub username from token")
121-
ui.Info(err.Error())
123+
if user == "" {
124+
user = config.Load().Owner
125+
}
126+
127+
if user == "" {
128+
ui.Warn("Could not resolve a GitHub username for credential preload")
129+
ui.Info("Re-run Setup with a validated token or export " + github.EnvUserName)
122130
return true
123131
}
124132

internal/setup/setup.go

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -276,6 +276,7 @@ func setupGitHubToken() bool {
276276
continue
277277
}
278278

279+
authUser := ""
279280
if user, err := github.ValidateToken(token); err != nil {
280281
ui.Warn("Could not validate GitHub token")
281282
ui.Info(err.Error())
@@ -286,10 +287,11 @@ func setupGitHubToken() bool {
286287
continue
287288
}
288289
} else {
290+
authUser = user
289291
ui.Success("GitHub authenticated as: " + user)
290292
}
291293

292-
if err := github.Save(token); err != nil {
294+
if err := github.SaveAuth(token, authUser); err != nil {
293295
ui.Error("Failed to save token")
294296
ui.Info(err.Error())
295297
return false
@@ -397,7 +399,7 @@ func offerFirstPush(cfg *config.Config) {
397399
return
398400
}
399401

400-
if err := system.RunGit("push", "-u", cfg.Remote, branch); err != nil {
402+
if err := system.RunGitWithRemote(cfg.Remote, "push", "-u", cfg.Remote, branch); err != nil {
401403
ui.Error("Push failed")
402404
ui.Info("Run Daily Git Operations -> Push after reviewing the remote and branch setup")
403405
return

0 commit comments

Comments
 (0)