diff options
author | Máximo Cuadros <mcuadros@gmail.com> | 2016-08-19 17:42:13 +0200 |
---|---|---|
committer | Máximo Cuadros <mcuadros@gmail.com> | 2016-08-19 17:42:13 +0200 |
commit | 1d56b98d9b02e20f7feea542c75746eab34fad63 (patch) | |
tree | 006e8c3ac5e40353032109a5259bb28c37751996 /core/reference.go | |
parent | b1d116c59f7656dc8d5ff7294ba8f8a82c51bfd1 (diff) | |
download | go-git-1d56b98d9b02e20f7feea542c75746eab34fad63.tar.gz |
Remote.Fetch base on RefSpec, improvement of the responsabilities separation
Diffstat (limited to 'core/reference.go')
-rw-r--r-- | core/reference.go | 114 |
1 files changed, 3 insertions, 111 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)]) - -} |