Handle absent Project.Path attributes.
Change-Id: I1ae28e7cfbb1eb6574b43e1812684ff2ee82564a
diff --git a/cmd/slothfs-deref-repo/main.go b/cmd/slothfs-deref-repo/main.go
index ee2432d..74140d2 100644
--- a/cmd/slothfs-deref-repo/main.go
+++ b/cmd/slothfs-deref-repo/main.go
@@ -41,7 +41,7 @@
mf.Filter()
for i, p := range mf.Project {
- repoPath := filepath.Join(top, p.Path, ".git")
+ repoPath := filepath.Join(top, p.GetPath(), ".git")
repo, err := git.OpenRepository(repoPath)
if err != nil {
continue
diff --git a/fs/manifestfs.go b/fs/manifestfs.go
index b5b6ebc..3f60986 100644
--- a/fs/manifestfs.go
+++ b/fs/manifestfs.go
@@ -108,10 +108,10 @@
clonablePaths := map[string]bool{}
revmap := map[string]*manifest.Project{}
for i, p := range r.options.Manifest.Project {
- revmap[p.Path] = &r.options.Manifest.Project[i]
+ revmap[p.GetPath()] = &r.options.Manifest.Project[i]
if p.CloneDepth == "" {
- clonablePaths[p.Path] = true
+ clonablePaths[p.GetPath()] = true
}
}
@@ -162,7 +162,7 @@
// have directories to attach the copy/link nodes to.
for _, p := range r.options.Manifest.Project {
for _, cp := range p.Copyfile {
- srcNode, left := fsConn.Node(r.Inode(), filepath.Join(p.Path, cp.Src))
+ srcNode, left := fsConn.Node(r.Inode(), filepath.Join(p.GetPath(), cp.Src))
if len(left) > 0 {
return fmt.Errorf("Copyfile(%s): source %s does not exist", p.Name, cp.Src)
}
@@ -189,7 +189,7 @@
return fmt.Errorf("Linkfile(%s): directory for dest %s does not exist.", p.Name, lf.Dest)
}
- src := filepath.Join(p.Path, lf.Src)
+ src := filepath.Join(p.GetPath(), lf.Src)
rel, err := filepath.Rel(filepath.Dir(lf.Dest), src)
if err != nil {
return err
@@ -226,7 +226,7 @@
go func(p manifest.Project) {
revID, err := git.NewOid(p.Revision)
if err != nil {
- out <- resultT{p.Path, nil, err}
+ out <- resultT{p.GetPath(), nil, err}
return
}
@@ -251,7 +251,7 @@
}
}
- out <- resultT{p.Path, tree, err}
+ out <- resultT{p.GetPath(), tree, err}
}(p)
}
diff --git a/manifest/parser.go b/manifest/parser.go
index 55c8f4f..a3a4aed 100644
--- a/manifest/parser.go
+++ b/manifest/parser.go
@@ -79,6 +79,7 @@
}
return Parse(content)
}
+
func (mf *Manifest) ProjectRevision(p *Project) string {
if p.Revision != "" {
return p.Revision
diff --git a/manifest/parser_test.go b/manifest/parser_test.go
index 0228487..c778b74 100644
--- a/manifest/parser_test.go
+++ b/manifest/parser_test.go
@@ -19,6 +19,10 @@
"testing"
)
+func newString(s string) *string {
+ return &s
+}
+
var aospManifest = `<?xml version="1.0" encoding="UTF-8"?>
<manifest>
<remote name="aosp"
@@ -55,7 +59,7 @@
},
Project: []Project{
{
- Path: "build",
+ Path: newString("build"),
Name: "platform/build",
GroupsString: "pdk,tradefed",
Groups: map[string]bool{
@@ -70,7 +74,7 @@
},
},
{
- Path: "build/soong",
+ Path: newString("build/soong"),
Name: "platform/build/soong",
GroupsString: "pdk,tradefed",
Groups: map[string]bool{
diff --git a/manifest/types.go b/manifest/types.go
index ea11d5e..91796a7 100644
--- a/manifest/types.go
+++ b/manifest/types.go
@@ -31,7 +31,7 @@
// Project represents a single git repository that should be stitched
// into the checkout.
type Project struct {
- Path string `xml:"path,attr"`
+ Path *string `xml:"path,attr"`
Name string `xml:"name,attr"`
Remote string `xml:"remote,attr,omitempty"`
Copyfile []Copyfile `xml:"copyfile,omitempty"`
@@ -53,6 +53,14 @@
CloneURL string `xml:"clone-url,attr,omitempty"`
}
+// GetPath provides the path where to place the repository.
+func (p *Project) GetPath() string {
+ if p.Path != nil {
+ return *p.Path
+ }
+ return p.Name
+}
+
// Remote describes a host where a set of projects is hosted.
type Remote struct {
Alias string `xml:"alias,attr"`
diff --git a/populate/e2e_test.go b/populate/e2e_test.go
index 6bbcddc..5ced2a3 100644
--- a/populate/e2e_test.go
+++ b/populate/e2e_test.go
@@ -163,7 +163,7 @@
if err := fixture.addWorkspace("m", &manifest.Manifest{
Project: []manifest.Project{{
Name: "platform/project",
- Path: "p",
+ Path: newString("p"),
Revision: ids[0],
Copyfile: []manifest.Copyfile{
{Src: "a", Dest: "bla"},
@@ -214,7 +214,7 @@
if err := fixture.addWorkspace(fmt.Sprintf("m%d", i), &manifest.Manifest{
Project: []manifest.Project{{
Name: "platform/project",
- Path: "p",
+ Path: newString("p"),
Revision: ids[0],
}}}); err != nil {
t.Fatalf("addWorkspace(%d): %v", i, err)
@@ -300,7 +300,7 @@
if err := fixture.addWorkspace(fmt.Sprintf("m%d", i), &manifest.Manifest{
Project: []manifest.Project{{
Name: "platform/project",
- Path: "p",
+ Path: newString("p"),
Revision: ids[i],
}}}); err != nil {
t.Fatalf("addWorkspace(%d): %v", i, err)
@@ -408,7 +408,7 @@
if err := fixture.addWorkspace("m1", &manifest.Manifest{
Project: []manifest.Project{{
Name: "platform/project",
- Path: "project",
+ Path: newString("project"),
Revision: ids[0],
}}}); err != nil {
t.Fatalf("addWorkspace(m1): %v", err)
@@ -418,11 +418,11 @@
Project: []manifest.Project{
{
Name: "platform/project",
- Path: "project",
+ Path: newString("project"),
Revision: ids[1],
}, {
Name: "platform/sub",
- Path: "sub",
+ Path: newString("sub"),
Revision: ids[2],
}},
}); err != nil {
diff --git a/populate/repotree.go b/populate/repotree.go
index 6ebce37..ede6d6b 100644
--- a/populate/repotree.go
+++ b/populate/repotree.go
@@ -78,7 +78,7 @@
var byDepth [][]*manifest.Project
for i, p := range mf.Project {
- l := len(strings.Split(p.Path, "/"))
+ l := len(strings.Split(p.GetPath(), "/"))
for len(byDepth) <= l {
byDepth = append(byDepth, nil)
}
@@ -94,9 +94,9 @@
for _, projs := range byDepth {
for _, p := range projs {
childTree := makeRepoTree()
- treesByPath[p.Path] = childTree
+ treesByPath[p.GetPath()] = childTree
- parent, key := root.findParentRepo(p.Path)
+ parent, key := root.findParentRepo(p.GetPath())
parent.children[key] = childTree
}
}