@@ -10,7 +10,9 @@ import (
1010const (
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*/
2224func 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+
4260func 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+
5880func 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+
72108func 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
94151func 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}
0 commit comments