58 lines
1.2 KiB
Go
58 lines
1.2 KiB
Go
package charcontext
|
|
|
|
import (
|
|
"context"
|
|
"errors"
|
|
"os"
|
|
"path"
|
|
)
|
|
|
|
var ErrNoContextFound = errors.New("could not find project root")
|
|
|
|
const CharFileName = ".char.yml"
|
|
|
|
func FindLocalRoot(ctx context.Context) (string, error) {
|
|
curdir, err := os.Getwd()
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
|
|
return recursiveFindLocalRoot(ctx, curdir)
|
|
|
|
//output, err := exec.Command("git", "rev-parse", "--show-toplevel").CombinedOutput()
|
|
//if err != nil {
|
|
// return "", err
|
|
//}
|
|
//if len(output) == 0 {
|
|
// return "", errors.New("could not find absolute path")
|
|
//}
|
|
//if _, err := os.Stat(string(output)); errors.Is(err, os.ErrNotExist) {
|
|
// return "", fmt.Errorf("path does not exist %s", string(output))
|
|
//}
|
|
|
|
//return string(output), nil
|
|
}
|
|
|
|
func recursiveFindLocalRoot(ctx context.Context, localpath string) (string, error) {
|
|
entries, err := os.ReadDir(localpath)
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
|
|
for _, entry := range entries {
|
|
if entry.Name() == CharFileName {
|
|
return localpath, nil
|
|
}
|
|
}
|
|
|
|
if localpath == "/" {
|
|
return "", ErrNoContextFound
|
|
}
|
|
|
|
return recursiveFindLocalRoot(ctx, path.Dir(localpath))
|
|
}
|
|
|
|
func ChangeToPath(_ context.Context, path string) error {
|
|
return os.Chdir(path)
|
|
}
|