aboutsummaryrefslogtreecommitdiffstats
path: root/core
diff options
context:
space:
mode:
Diffstat (limited to 'core')
-rw-r--r--core/reference.go114
-rw-r--r--core/reference_test.go62
2 files changed, 5 insertions, 171 deletions
diff --git a/core/reference.go b/core/reference.go
index 5258146..1325c7e 100644
--- a/core/reference.go
+++ b/core/reference.go
@@ -34,16 +34,12 @@ const (
// ReferenceName reference name's
type ReferenceName string
-// AsRemote returns a new remote reference name using current one as base
-func (r ReferenceName) AsRemote(remote string) ReferenceName {
- return ReferenceName(refRemotePrefix + remote + "/" + r.alias())
-}
-
func (r ReferenceName) String() string {
return string(r)
}
-func (r ReferenceName) alias() string {
+// Short returns the short name of a ReferenceName
+func (r ReferenceName) Short() string {
parts := strings.Split(string(r), "/")
return parts[len(parts)-1]
}
@@ -114,7 +110,7 @@ func (r *Reference) Target() ReferenceName {
// IsBranch check if a reference is a branch
func (r *Reference) IsBranch() bool {
- return strings.HasPrefix(string(r.n), refHeadPrefix) || r.n == HEAD
+ return strings.HasPrefix(string(r.n), refHeadPrefix)
}
// IsNote check if a reference is a note
@@ -225,107 +221,3 @@ func resolveReference(s ReferenceStorage, r *Reference, recursion int) (*Referen
recursion++
return resolveReference(s, t, recursion)
}
-
-const (
- refSpecWildcard = "*"
- refSpecForce = "+"
- refSpecSeparator = ":"
-)
-
-// RefSpec is a mapping from local branches to remote references
-// The format of the refspec is an optional +, followed by <src>:<dst>, where
-// <src> is the pattern for references on the remote side and <dst> is where
-// those references will be written locally. The + tells Git to update the
-// reference even if it isn’t a fast-forward.
-// eg.: "+refs/heads/*:refs/remotes/origin/*"
-//
-// https://git-scm.com/book/es/v2/Git-Internals-The-Refspec
-type RefSpec string
-
-// IsValid validates the RefSpec
-func (s RefSpec) IsValid() bool {
- spec := string(s)
- if strings.Count(spec, refSpecSeparator) != 1 {
- return false
- }
-
- sep := strings.Index(spec, refSpecSeparator)
- if sep == len(spec) {
- return false
- }
-
- ws := strings.Count(spec[0:sep], refSpecWildcard)
- wd := strings.Count(spec[sep+1:len(spec)], refSpecWildcard)
- return ws == wd && ws < 2 && wd < 2
-}
-
-// IsForceUpdate returns if update is allowed in non fast-forward merges
-func (s RefSpec) IsForceUpdate() bool {
- if s[0] == refSpecForce[0] {
- return true
- }
-
- return false
-}
-
-// Src return the src side
-func (s RefSpec) Src() string {
- spec := string(s)
- start := strings.Index(spec, refSpecForce) + 1
- end := strings.Index(spec, refSpecSeparator)
-
- return spec[start:end]
-}
-
-// Match match the given ReferenceName against the source
-func (s RefSpec) Match(n ReferenceName) bool {
- if !s.isGlob() {
- return s.matchExact(n)
- }
-
- return s.matchGlob(n)
-}
-
-func (s RefSpec) isGlob() bool {
- return strings.Index(string(s), refSpecWildcard) != -1
-}
-
-func (s RefSpec) matchExact(n ReferenceName) bool {
- return s.Src() == n.String()
-}
-
-func (s RefSpec) matchGlob(n ReferenceName) bool {
- src := s.Src()
- name := n.String()
- wildcard := strings.Index(src, refSpecWildcard)
-
- var prefix, suffix string
- prefix = src[0:wildcard]
- if len(src) < wildcard {
- suffix = src[wildcard+1 : len(suffix)]
- }
-
- return len(name) > len(prefix)+len(suffix) &&
- strings.HasPrefix(name, prefix) &&
- strings.HasSuffix(name, suffix)
-}
-
-// Dst returns the destination for the given remote reference
-func (s RefSpec) Dst(n ReferenceName) ReferenceName {
- spec := string(s)
- start := strings.Index(spec, refSpecSeparator) + 1
- dst := spec[start:len(spec)]
- src := s.Src()
-
- if !s.isGlob() {
- return ReferenceName(dst)
- }
-
- name := n.String()
- ws := strings.Index(src, refSpecWildcard)
- wd := strings.Index(dst, refSpecWildcard)
- match := name[ws : len(name)-(len(src)-(ws+1))]
-
- return ReferenceName(dst[0:wd] + match + dst[wd+1:len(dst)])
-
-}
diff --git a/core/reference_test.go b/core/reference_test.go
index 3d5a9b2..b14f24c 100644
--- a/core/reference_test.go
+++ b/core/reference_test.go
@@ -14,11 +14,8 @@ const (
ExampleReferenceName ReferenceName = "refs/heads/v4"
)
-func (s *ReferenceSuite) TestReferenceNameAsRemote(c *C) {
- c.Assert(
- ExampleReferenceName.AsRemote("foo").String(),
- Equals, "refs/remotes/foo/v4",
- )
+func (s *ReferenceSuite) TestReferenceNameShort(c *C) {
+ c.Assert(ExampleReferenceName.Short(), Equals, "v4")
}
func (s *ReferenceSuite) TestNewReferenceFromStrings(c *C) {
@@ -121,58 +118,3 @@ func (s *ReferenceSuite) TestReferenceSliceIterForEachStop(c *C) {
c.Assert(count, Equals, 1)
}
-
-func (s *ReferenceSuite) TestRefSpecIsValid(c *C) {
- spec := RefSpec("+refs/heads/*:refs/remotes/origin/*")
- c.Assert(spec.IsValid(), Equals, true)
-
- spec = RefSpec("refs/heads/*:refs/remotes/origin/")
- c.Assert(spec.IsValid(), Equals, false)
-
- spec = RefSpec("refs/heads/master:refs/remotes/origin/master")
- c.Assert(spec.IsValid(), Equals, true)
-
- spec = RefSpec("refs/heads/*")
- c.Assert(spec.IsValid(), Equals, false)
-}
-
-func (s *ReferenceSuite) TestRefSpecIsForceUpdate(c *C) {
- spec := RefSpec("+refs/heads/*:refs/remotes/origin/*")
- c.Assert(spec.IsForceUpdate(), Equals, true)
-
- spec = RefSpec("refs/heads/*:refs/remotes/origin/*")
- c.Assert(spec.IsForceUpdate(), Equals, false)
-}
-
-func (s *ReferenceSuite) TestRefSpecSrc(c *C) {
- spec := RefSpec("refs/heads/*:refs/remotes/origin/*")
- c.Assert(spec.Src(), Equals, "refs/heads/*")
-}
-
-func (s *ReferenceSuite) TestRefSpecMatch(c *C) {
- spec := RefSpec("refs/heads/master:refs/remotes/origin/master")
- c.Assert(spec.Match(ReferenceName("refs/heads/foo")), Equals, false)
- c.Assert(spec.Match(ReferenceName("refs/heads/master")), Equals, true)
-}
-
-func (s *ReferenceSuite) TestRefSpecMatchBlob(c *C) {
- spec := RefSpec("refs/heads/*:refs/remotes/origin/*")
- c.Assert(spec.Match(ReferenceName("refs/tag/foo")), Equals, false)
- c.Assert(spec.Match(ReferenceName("refs/heads/foo")), Equals, true)
-}
-
-func (s *ReferenceSuite) TestRefSpecDst(c *C) {
- spec := RefSpec("refs/heads/master:refs/remotes/origin/master")
- c.Assert(
- spec.Dst(ReferenceName("refs/heads/master")).String(), Equals,
- "refs/remotes/origin/master",
- )
-}
-
-func (s *ReferenceSuite) TestRefSpecDstBlob(c *C) {
- spec := RefSpec("refs/heads/*:refs/remotes/origin/*")
- c.Assert(
- spec.Dst(ReferenceName("refs/heads/foo")).String(), Equals,
- "refs/remotes/origin/foo",
- )
-}