Skip to content
This repository has been archived by the owner on Sep 9, 2020. It is now read-only.

Commit

Permalink
Simple approach to finding project root dir (#6)
Browse files Browse the repository at this point in the history
  • Loading branch information
sdboyer committed Oct 18, 2016
2 parents 2f506ee + ce9692f commit 9683423
Show file tree
Hide file tree
Showing 4 changed files with 84 additions and 0 deletions.
Empty file.
Empty file.
42 changes: 42 additions & 0 deletions main.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,12 @@ import (
"flag"
"fmt"
"os"
"path/filepath"
)

const ManifestName = "manifest.json"
const LockName = "lock.json"

func main() {
flag.Parse()

Expand Down Expand Up @@ -186,3 +190,41 @@ var getCmd = &command{
-vendor (?) get to workspace or vendor directory
`,
}

func findProjectRootFromWD() (string, error) {
path, err := os.Getwd()
if err != nil {
return "", fmt.Errorf("could not get working directory: %s", err)
}
return findProjectRoot(path)
}

func findProjectRoot(from string) (string, error) {
var f func(string) (string, error)
f = func(dir string) (string, error) {

fullpath := filepath.Join(dir, ManifestName)

if _, err := os.Stat(fullpath); err == nil {
return dir, nil
} else if !os.IsNotExist(err) {
// Some err other than non-existence - return that out
return "", err
}

base := filepath.Dir(dir)
if base == dir {
return "", fmt.Errorf("cannot resolve parent of %s", base)
}

return f(base)
}

path, err := f(from)
if err != nil {
return "", fmt.Errorf("error while searching for manifest: %s", err)
} else if path == "" {
return "", fmt.Errorf("could not find manifest in any parent of %s", from)
}
return path, nil
}
42 changes: 42 additions & 0 deletions main_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
package main

import (
"os"
"path/filepath"
"testing"
)

func TestFindRoot(t *testing.T) {
wd, err := os.Getwd()
if err != nil {
t.Fatal(err)
}

expect := filepath.Join(wd, "_testdata", "rootfind")

got1, err := findProjectRoot(expect)
if err != nil {
t.Errorf("Unexpected error while finding root: %s", err)
} else if expect != got1 {
t.Errorf("findProjectRoot directly on root dir should have found %s, got %s", expect, got1)
}

got2, err := findProjectRoot(filepath.Join(expect, "subdir"))
if err != nil {
t.Errorf("Unexpected error while finding root: %s", err)
} else if expect != got2 {
t.Errorf("findProjectRoot on subdir should have found %s, got %s", expect, got2)
}

got3, err := findProjectRoot(filepath.Join(expect, "nonexistent"))
if err != nil {
t.Errorf("Unexpected error while finding root: %s", err)
} else if expect != got3 {
t.Errorf("findProjectRoot on nonexistent subdir should still work and give %s, got %s", expect, got3)
}

got4, err := findProjectRoot(filepath.Join(expect, ManifestName))
if err == nil {
t.Errorf("Should have err'd when trying subdir of file, but returned %s", got4)
}
}

0 comments on commit 9683423

Please sign in to comment.