|
|
@@ -0,0 +1,194 @@ |
|
|
|
package main |
|
|
|
|
|
|
|
import ( |
|
|
|
"bytes" |
|
|
|
"fmt" |
|
|
|
. "gopkg.in/check.v1" |
|
|
|
"sort" |
|
|
|
) |
|
|
|
|
|
|
|
var _ = Suite(&RefsSuite{}) |
|
|
|
|
|
|
|
type RefsSuite struct{} |
|
|
|
|
|
|
|
type refsTest struct { |
|
|
|
summary string |
|
|
|
original string |
|
|
|
version string |
|
|
|
changed string |
|
|
|
versions []string |
|
|
|
} |
|
|
|
|
|
|
|
var refsTests = []refsTest{{ |
|
|
|
"Version v0 works even without any references", |
|
|
|
reflines( |
|
|
|
"hash1 HEAD", |
|
|
|
), |
|
|
|
"v0", |
|
|
|
reflines( |
|
|
|
"hash1 HEAD", |
|
|
|
), |
|
|
|
nil, |
|
|
|
}, { |
|
|
|
"Preserve original capabilities", |
|
|
|
reflines( |
|
|
|
"hash1 HEAD\x00caps", |
|
|
|
), |
|
|
|
"v0", |
|
|
|
reflines( |
|
|
|
"hash1 HEAD\x00caps", |
|
|
|
), |
|
|
|
nil, |
|
|
|
}, { |
|
|
|
"Matching major version branch", |
|
|
|
reflines( |
|
|
|
"00000000000000000000000000000000000hash1 HEAD", |
|
|
|
"00000000000000000000000000000000000hash2 refs/heads/v0", |
|
|
|
"00000000000000000000000000000000000hash3 refs/heads/v1", |
|
|
|
"00000000000000000000000000000000000hash4 refs/heads/v2", |
|
|
|
), |
|
|
|
"v1", |
|
|
|
reflines( |
|
|
|
"00000000000000000000000000000000000hash3 HEAD\x00symref=HEAD:refs/heads/v1", |
|
|
|
"00000000000000000000000000000000000hash3 refs/heads/master", |
|
|
|
"00000000000000000000000000000000000hash2 refs/heads/v0", |
|
|
|
"00000000000000000000000000000000000hash3 refs/heads/v1", |
|
|
|
"00000000000000000000000000000000000hash4 refs/heads/v2", |
|
|
|
), |
|
|
|
[]string{"v0", "v1", "v2"}, |
|
|
|
}, { |
|
|
|
"Matching minor version branch", |
|
|
|
reflines( |
|
|
|
"00000000000000000000000000000000000hash1 HEAD", |
|
|
|
"00000000000000000000000000000000000hash2 refs/heads/v1.1", |
|
|
|
"00000000000000000000000000000000000hash3 refs/heads/v1.3", |
|
|
|
"00000000000000000000000000000000000hash4 refs/heads/v1.2", |
|
|
|
), |
|
|
|
"v1", |
|
|
|
reflines( |
|
|
|
"00000000000000000000000000000000000hash3 HEAD\x00symref=HEAD:refs/heads/v1.3", |
|
|
|
"00000000000000000000000000000000000hash3 refs/heads/master", |
|
|
|
"00000000000000000000000000000000000hash2 refs/heads/v1.1", |
|
|
|
"00000000000000000000000000000000000hash3 refs/heads/v1.3", |
|
|
|
"00000000000000000000000000000000000hash4 refs/heads/v1.2", |
|
|
|
), |
|
|
|
[]string{"v1.1", "v1.2", "v1.3"}, |
|
|
|
}, { |
|
|
|
"Disable original symref capability", |
|
|
|
reflines( |
|
|
|
"00000000000000000000000000000000000hash1 HEAD\x00foo symref=bar baz", |
|
|
|
"00000000000000000000000000000000000hash2 refs/heads/v1", |
|
|
|
), |
|
|
|
"v1", |
|
|
|
reflines( |
|
|
|
"00000000000000000000000000000000000hash2 HEAD\x00symref=HEAD:refs/heads/v1 foo oldref=bar baz", |
|
|
|
"00000000000000000000000000000000000hash2 refs/heads/master", |
|
|
|
"00000000000000000000000000000000000hash2 refs/heads/v1", |
|
|
|
), |
|
|
|
[]string{"v1"}, |
|
|
|
}, { |
|
|
|
"Replace original master branch", |
|
|
|
reflines( |
|
|
|
"00000000000000000000000000000000000hash1 HEAD", |
|
|
|
"00000000000000000000000000000000000hash1 refs/heads/master", |
|
|
|
"00000000000000000000000000000000000hash2 refs/heads/v1", |
|
|
|
), |
|
|
|
"v1", |
|
|
|
reflines( |
|
|
|
"00000000000000000000000000000000000hash2 HEAD\x00symref=HEAD:refs/heads/v1", |
|
|
|
"00000000000000000000000000000000000hash2 refs/heads/master", |
|
|
|
"00000000000000000000000000000000000hash2 refs/heads/v1", |
|
|
|
), |
|
|
|
[]string{"v1"}, |
|
|
|
}, { |
|
|
|
"Matching tag", |
|
|
|
reflines( |
|
|
|
"00000000000000000000000000000000000hash1 HEAD", |
|
|
|
"00000000000000000000000000000000000hash2 refs/tags/v0", |
|
|
|
"00000000000000000000000000000000000hash3 refs/tags/v1", |
|
|
|
"00000000000000000000000000000000000hash4 refs/tags/v2", |
|
|
|
), |
|
|
|
"v1", |
|
|
|
reflines( |
|
|
|
"00000000000000000000000000000000000hash3 HEAD", |
|
|
|
"00000000000000000000000000000000000hash3 refs/heads/master", |
|
|
|
"00000000000000000000000000000000000hash2 refs/tags/v0", |
|
|
|
"00000000000000000000000000000000000hash3 refs/tags/v1", |
|
|
|
"00000000000000000000000000000000000hash4 refs/tags/v2", |
|
|
|
), |
|
|
|
[]string{"v0", "v1", "v2"}, |
|
|
|
}, { |
|
|
|
"Tag peeling", |
|
|
|
reflines( |
|
|
|
"00000000000000000000000000000000000hash1 HEAD", |
|
|
|
"00000000000000000000000000000000000hash2 refs/heads/master", |
|
|
|
"00000000000000000000000000000000000hash3 refs/tags/v1", |
|
|
|
"00000000000000000000000000000000000hash4 refs/tags/v1^{}", |
|
|
|
"00000000000000000000000000000000000hash5 refs/tags/v2", |
|
|
|
), |
|
|
|
"v1", |
|
|
|
reflines( |
|
|
|
"00000000000000000000000000000000000hash4 HEAD", |
|
|
|
"00000000000000000000000000000000000hash4 refs/heads/master", |
|
|
|
"00000000000000000000000000000000000hash3 refs/tags/v1", |
|
|
|
"00000000000000000000000000000000000hash4 refs/tags/v1^{}", |
|
|
|
"00000000000000000000000000000000000hash5 refs/tags/v2", |
|
|
|
), |
|
|
|
[]string{"v1", "v1", "v2"}, |
|
|
|
}, { |
|
|
|
"Matching unstable versions", |
|
|
|
reflines( |
|
|
|
"00000000000000000000000000000000000hash1 HEAD", |
|
|
|
"00000000000000000000000000000000000hash2 refs/heads/master", |
|
|
|
"00000000000000000000000000000000000hash3 refs/heads/v1", |
|
|
|
"00000000000000000000000000000000000hash4 refs/heads/v1.1-unstable", |
|
|
|
"00000000000000000000000000000000000hash5 refs/heads/v1.3-unstable", |
|
|
|
"00000000000000000000000000000000000hash6 refs/heads/v1.2-unstable", |
|
|
|
"00000000000000000000000000000000000hash7 refs/heads/v2", |
|
|
|
), |
|
|
|
"v1-unstable", |
|
|
|
reflines( |
|
|
|
"00000000000000000000000000000000000hash5 HEAD\x00symref=HEAD:refs/heads/v1.3-unstable", |
|
|
|
"00000000000000000000000000000000000hash5 refs/heads/master", |
|
|
|
"00000000000000000000000000000000000hash3 refs/heads/v1", |
|
|
|
"00000000000000000000000000000000000hash4 refs/heads/v1.1-unstable", |
|
|
|
"00000000000000000000000000000000000hash5 refs/heads/v1.3-unstable", |
|
|
|
"00000000000000000000000000000000000hash6 refs/heads/v1.2-unstable", |
|
|
|
"00000000000000000000000000000000000hash7 refs/heads/v2", |
|
|
|
), |
|
|
|
[]string{"v1", "v1.1-unstable", "v1.2-unstable", "v1.3-unstable", "v2"}, |
|
|
|
}} |
|
|
|
|
|
|
|
func reflines(lines ...string) string { |
|
|
|
var buf bytes.Buffer |
|
|
|
buf.WriteString("001e# service=git-upload-pack\n0000") |
|
|
|
for _, l := range lines { |
|
|
|
buf.WriteString(fmt.Sprintf("%04x%s\n", len(l)+5, l)) |
|
|
|
} |
|
|
|
buf.WriteString("0000") |
|
|
|
return buf.String() |
|
|
|
} |
|
|
|
|
|
|
|
func (s *RefsSuite) TestChangeRefs(c *C) { |
|
|
|
for _, test := range refsTests { |
|
|
|
c.Logf(test.summary) |
|
|
|
|
|
|
|
v, ok := parseVersion(test.version) |
|
|
|
if !ok { |
|
|
|
c.Fatalf("Test has an invalid version: %q", test.version) |
|
|
|
} |
|
|
|
|
|
|
|
changed, versions, err := changeRefs([]byte(test.original), v) |
|
|
|
c.Assert(err, IsNil) |
|
|
|
|
|
|
|
c.Assert(string(changed), Equals, test.changed) |
|
|
|
|
|
|
|
sort.Sort(versions) |
|
|
|
|
|
|
|
var vs []string |
|
|
|
for _, v := range versions { |
|
|
|
vs = append(vs, v.String()) |
|
|
|
} |
|
|
|
c.Assert(vs, DeepEquals, test.versions) |
|
|
|
} |
|
|
|
} |