@@ -7,15 +7,16 @@ import (
77 "io/ioutil"
88 "os"
99 "path"
10+ "path/filepath"
1011 "syscall"
1112
1213 "github.com/mitchellh/go-homedir"
1314 "gopkg.in/yaml.v3"
1415)
1516
1617func ConfigDir () string {
17- dir , _ := homedir . Expand ( "~/.config/gh" )
18- return dir
18+ homeDir , _ := homeDirAutoMigrate ( )
19+ return homeDir
1920}
2021
2122func ConfigFile () string {
@@ -30,6 +31,62 @@ func ParseDefaultConfig() (Config, error) {
3031 return ParseConfig (ConfigFile ())
3132}
3233
34+ func HomeDirPath (subdir string ) (string , error ) {
35+ homeDir , err := os .UserHomeDir ()
36+ if err != nil {
37+ // TODO: remove go-homedir fallback in GitHub CLI v2
38+ if legacyDir , err := homedir .Dir (); err == nil {
39+ return filepath .Join (legacyDir , subdir ), nil
40+ }
41+ return "" , err
42+ }
43+
44+ newPath := filepath .Join (homeDir , subdir )
45+ if s , err := os .Stat (newPath ); err == nil && s .IsDir () {
46+ return newPath , nil
47+ }
48+
49+ // TODO: remove go-homedir fallback in GitHub CLI v2
50+ if legacyDir , err := homedir .Dir (); err == nil {
51+ legacyPath := filepath .Join (legacyDir , subdir )
52+ if s , err := os .Stat (legacyPath ); err == nil && s .IsDir () {
53+ return legacyPath , nil
54+ }
55+ }
56+
57+ return newPath , nil
58+ }
59+
60+ // Looks up the `~/.config/gh` directory with backwards-compatibility with go-homedir and auto-migration
61+ // when an old homedir location was found.
62+ func homeDirAutoMigrate () (string , error ) {
63+ homeDir , err := os .UserHomeDir ()
64+ if err != nil {
65+ // TODO: remove go-homedir fallback in GitHub CLI v2
66+ if legacyDir , err := homedir .Dir (); err == nil {
67+ return filepath .Join (legacyDir , ".config" , "gh" ), nil
68+ }
69+ return "" , err
70+ }
71+
72+ newPath := filepath .Join (homeDir , ".config" , "gh" )
73+ _ , newPathErr := os .Stat (newPath )
74+ if newPathErr == nil || ! os .IsNotExist (err ) {
75+ return newPath , newPathErr
76+ }
77+
78+ // TODO: remove go-homedir fallback in GitHub CLI v2
79+ if legacyDir , err := homedir .Dir (); err == nil {
80+ legacyPath := filepath .Join (legacyDir , ".config" , "gh" )
81+ if s , err := os .Stat (legacyPath ); err == nil && s .IsDir () {
82+ _ = os .MkdirAll (filepath .Dir (newPath ), 0755 )
83+ return newPath , os .Rename (legacyPath , newPath )
84+ }
85+ }
86+
87+ return newPath , nil
88+ }
89+
3390var ReadConfigFile = func (filename string ) ([]byte , error ) {
3491 f , err := os .Open (filename )
3592 if err != nil {
0 commit comments