1
0
forked from sm/vain

Prevent addition of duplicate path prefixes.

I think I understand this now; the failure comes from here:

https://golang.org/src/cmd/go/vcs.go#L818

and makes it so one can't both host:
- github.com/foo
- github.com/foo/bar

which would have to clone the latter inside of the former.

Fixes #1.
This commit is contained in:
Stephen McQuay 2016-02-13 10:44:41 -08:00
parent b0ebbf742b
commit 557717c138
3 changed files with 71 additions and 0 deletions

View File

@ -31,6 +31,10 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, req *http.Request) {
return return
} }
p.Path = fmt.Sprintf("%s/%s", s.hostname, strings.Trim(req.URL.Path, "/")) p.Path = fmt.Sprintf("%s/%s", s.hostname, strings.Trim(req.URL.Path, "/"))
if !Valid(p.Path, s.storage.All()) {
http.Error(w, fmt.Sprintf("invalid path; prefix already taken %q", req.URL.Path), http.StatusConflict)
return
}
s.storage.Add(p) s.storage.Add(p)
case "PATCH": case "PATCH":
default: default:

View File

@ -2,9 +2,19 @@ package vain
import ( import (
"errors" "errors"
"strings"
"sync" "sync"
) )
func Valid(p string, packages []Package) bool {
for _, pkg := range packages {
if strings.HasPrefix(pkg.Path, p) {
return false
}
}
return true
}
type MemStore struct { type MemStore struct {
l sync.RWMutex l sync.RWMutex
p map[string]Package p map[string]Package

View File

@ -35,3 +35,60 @@ func TestVcsStrings(t *testing.T) {
} }
} }
} }
func TestValid(t *testing.T) {
tests := []struct {
pkgs []Package
in string
want bool
}{
{
pkgs: []Package{},
in: "bobo",
want: true,
},
{
pkgs: []Package{
{Path: ""},
},
in: "bobo",
want: true,
},
{
pkgs: []Package{
{Path: "bobo"},
},
in: "bobo",
want: false,
},
{
pkgs: []Package{
{Path: "a/b/c"},
},
in: "a/b/c",
want: false,
},
{
pkgs: []Package{
{Path: "foo/bar"},
{Path: "foo/baz"},
},
in: "foo",
want: false,
},
{
pkgs: []Package{
{Path: "bilbo"},
{Path: "frodo"},
},
in: "foo/bar/baz",
want: true,
},
}
for _, test := range tests {
got := Valid(test.in, test.pkgs)
if got != test.want {
t.Errorf("Incorrect testing of %q against %#v; got %t, want %t", test.in, test.pkgs, got, test.want)
}
}
}