fork of go-git with some jj specific features
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

at v5.11.0 202 lines 6.7 kB view raw
1package config 2 3import ( 4 "testing" 5 6 "github.com/go-git/go-git/v5/plumbing" 7 . "gopkg.in/check.v1" 8) 9 10type RefSpecSuite struct{} 11 12var _ = Suite(&RefSpecSuite{}) 13 14func Test(t *testing.T) { TestingT(t) } 15 16func (s *RefSpecSuite) TestRefSpecIsValid(c *C) { 17 spec := RefSpec("+refs/heads/*:refs/remotes/origin/*") 18 c.Assert(spec.Validate(), Equals, nil) 19 20 spec = RefSpec("refs/heads/*:refs/remotes/origin/") 21 c.Assert(spec.Validate(), Equals, ErrRefSpecMalformedWildcard) 22 23 spec = RefSpec("refs/heads/master:refs/remotes/origin/master") 24 c.Assert(spec.Validate(), Equals, nil) 25 26 spec = RefSpec(":refs/heads/master") 27 c.Assert(spec.Validate(), Equals, nil) 28 29 spec = RefSpec(":refs/heads/*") 30 c.Assert(spec.Validate(), Equals, ErrRefSpecMalformedWildcard) 31 32 spec = RefSpec(":*") 33 c.Assert(spec.Validate(), Equals, ErrRefSpecMalformedWildcard) 34 35 spec = RefSpec("refs/heads/*") 36 c.Assert(spec.Validate(), Equals, ErrRefSpecMalformedSeparator) 37 38 spec = RefSpec("refs/heads:") 39 c.Assert(spec.Validate(), Equals, ErrRefSpecMalformedSeparator) 40 41 spec = RefSpec("12039e008f9a4e3394f3f94f8ea897785cb09448:refs/heads/foo") 42 c.Assert(spec.Validate(), Equals, nil) 43 44 spec = RefSpec("12039e008f9a4e3394f3f94f8ea897785cb09448:refs/heads/*") 45 c.Assert(spec.Validate(), Equals, ErrRefSpecMalformedWildcard) 46} 47 48func (s *RefSpecSuite) TestRefSpecIsForceUpdate(c *C) { 49 spec := RefSpec("+refs/heads/*:refs/remotes/origin/*") 50 c.Assert(spec.IsForceUpdate(), Equals, true) 51 52 spec = RefSpec("refs/heads/*:refs/remotes/origin/*") 53 c.Assert(spec.IsForceUpdate(), Equals, false) 54} 55 56func (s *RefSpecSuite) TestRefSpecIsDelete(c *C) { 57 spec := RefSpec(":refs/heads/master") 58 c.Assert(spec.IsDelete(), Equals, true) 59 60 spec = RefSpec("+refs/heads/*:refs/remotes/origin/*") 61 c.Assert(spec.IsDelete(), Equals, false) 62 63 spec = RefSpec("refs/heads/*:refs/remotes/origin/*") 64 c.Assert(spec.IsDelete(), Equals, false) 65} 66 67func (s *RefSpecSuite) TestRefSpecIsExactSHA1(c *C) { 68 spec := RefSpec("foo:refs/heads/master") 69 c.Assert(spec.IsExactSHA1(), Equals, false) 70 71 spec = RefSpec("12039e008f9a4e3394f3f94f8ea897785cb09448:refs/heads/foo") 72 c.Assert(spec.IsExactSHA1(), Equals, true) 73} 74 75func (s *RefSpecSuite) TestRefSpecSrc(c *C) { 76 spec := RefSpec("refs/heads/*:refs/remotes/origin/*") 77 c.Assert(spec.Src(), Equals, "refs/heads/*") 78 79 spec = RefSpec("+refs/heads/*:refs/remotes/origin/*") 80 c.Assert(spec.Src(), Equals, "refs/heads/*") 81 82 spec = RefSpec(":refs/heads/master") 83 c.Assert(spec.Src(), Equals, "") 84 85 spec = RefSpec("refs/heads/love+hate:refs/heads/love+hate") 86 c.Assert(spec.Src(), Equals, "refs/heads/love+hate") 87 88 spec = RefSpec("+refs/heads/love+hate:refs/heads/love+hate") 89 c.Assert(spec.Src(), Equals, "refs/heads/love+hate") 90} 91 92func (s *RefSpecSuite) TestRefSpecMatch(c *C) { 93 spec := RefSpec("refs/heads/master:refs/remotes/origin/master") 94 c.Assert(spec.Match(plumbing.ReferenceName("refs/heads/foo")), Equals, false) 95 c.Assert(spec.Match(plumbing.ReferenceName("refs/heads/master")), Equals, true) 96 97 spec = RefSpec("+refs/heads/master:refs/remotes/origin/master") 98 c.Assert(spec.Match(plumbing.ReferenceName("refs/heads/foo")), Equals, false) 99 c.Assert(spec.Match(plumbing.ReferenceName("refs/heads/master")), Equals, true) 100 101 spec = RefSpec(":refs/heads/master") 102 c.Assert(spec.Match(plumbing.ReferenceName("")), Equals, true) 103 c.Assert(spec.Match(plumbing.ReferenceName("refs/heads/master")), Equals, false) 104 105 spec = RefSpec("refs/heads/love+hate:heads/love+hate") 106 c.Assert(spec.Match(plumbing.ReferenceName("refs/heads/love+hate")), Equals, true) 107 108 spec = RefSpec("+refs/heads/love+hate:heads/love+hate") 109 c.Assert(spec.Match(plumbing.ReferenceName("refs/heads/love+hate")), Equals, true) 110} 111 112func (s *RefSpecSuite) TestRefSpecMatchGlob(c *C) { 113 tests := map[string]map[string]bool{ 114 "refs/heads/*:refs/remotes/origin/*": { 115 "refs/tag/foo": false, 116 "refs/heads/foo": true, 117 }, 118 "refs/heads/*bc:refs/remotes/origin/*bc": { 119 "refs/heads/abc": true, 120 "refs/heads/bc": true, 121 "refs/heads/abx": false, 122 }, 123 "refs/heads/a*c:refs/remotes/origin/a*c": { 124 "refs/heads/abc": true, 125 "refs/heads/ac": true, 126 "refs/heads/abx": false, 127 }, 128 "refs/heads/ab*:refs/remotes/origin/ab*": { 129 "refs/heads/abc": true, 130 "refs/heads/ab": true, 131 "refs/heads/xbc": false, 132 }, 133 } 134 135 for specStr, data := range tests { 136 spec := RefSpec(specStr) 137 for ref, matches := range data { 138 c.Assert(spec.Match(plumbing.ReferenceName(ref)), 139 Equals, 140 matches, 141 Commentf("while matching spec %q against ref %q", specStr, ref), 142 ) 143 } 144 } 145} 146 147func (s *RefSpecSuite) TestRefSpecDst(c *C) { 148 spec := RefSpec("refs/heads/master:refs/remotes/origin/master") 149 c.Assert( 150 spec.Dst(plumbing.ReferenceName("refs/heads/master")).String(), Equals, 151 "refs/remotes/origin/master", 152 ) 153} 154 155func (s *RefSpecSuite) TestRefSpecDstBlob(c *C) { 156 ref := "refs/heads/abc" 157 tests := map[string]string{ 158 "refs/heads/*:refs/remotes/origin/*": "refs/remotes/origin/abc", 159 "refs/heads/*bc:refs/remotes/origin/*": "refs/remotes/origin/a", 160 "refs/heads/*bc:refs/remotes/origin/*bc": "refs/remotes/origin/abc", 161 "refs/heads/a*c:refs/remotes/origin/*": "refs/remotes/origin/b", 162 "refs/heads/a*c:refs/remotes/origin/a*c": "refs/remotes/origin/abc", 163 "refs/heads/ab*:refs/remotes/origin/*": "refs/remotes/origin/c", 164 "refs/heads/ab*:refs/remotes/origin/ab*": "refs/remotes/origin/abc", 165 "refs/heads/*abc:refs/remotes/origin/*abc": "refs/remotes/origin/abc", 166 "refs/heads/abc*:refs/remotes/origin/abc*": "refs/remotes/origin/abc", 167 // for these two cases, git specifically logs: 168 // error: * Ignoring funny ref 'refs/remotes/origin/' locally 169 // and ignores the ref; go-git does not currently do this validation, 170 // but probably should. 171 // "refs/heads/*abc:refs/remotes/origin/*": "", 172 // "refs/heads/abc*:refs/remotes/origin/*": "", 173 } 174 175 for specStr, dst := range tests { 176 spec := RefSpec(specStr) 177 c.Assert(spec.Dst(plumbing.ReferenceName(ref)).String(), 178 Equals, 179 dst, 180 Commentf("while getting dst from spec %q with ref %q", specStr, ref), 181 ) 182 } 183} 184 185func (s *RefSpecSuite) TestRefSpecReverse(c *C) { 186 spec := RefSpec("refs/heads/*:refs/remotes/origin/*") 187 c.Assert( 188 spec.Reverse(), Equals, 189 RefSpec("refs/remotes/origin/*:refs/heads/*"), 190 ) 191} 192 193func (s *RefSpecSuite) TestMatchAny(c *C) { 194 specs := []RefSpec{ 195 "refs/heads/bar:refs/remotes/origin/foo", 196 "refs/heads/foo:refs/remotes/origin/bar", 197 } 198 199 c.Assert(MatchAny(specs, plumbing.ReferenceName("refs/heads/foo")), Equals, true) 200 c.Assert(MatchAny(specs, plumbing.ReferenceName("refs/heads/bar")), Equals, true) 201 c.Assert(MatchAny(specs, plumbing.ReferenceName("refs/heads/master")), Equals, false) 202}