Files
wehub-resource-sync 5357c39144
Fuzzer / Run Fuzzer (push) Has been cancelled
Race tests / Go race tests (ubuntu-22.04) (push) Has been cancelled
chore: import upstream snapshot with attribution
2026-07-13 13:01:40 +08:00

92 lines
2.5 KiB
Go

// Copyright 2019 Dolthub, Inc.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package ref
import (
"path"
"strings"
"github.com/dolthub/dolt/go/libraries/utils/strhelp"
)
// RemoteRef is a reference to a reference that tracks a branch on a remote
type RemoteRef struct {
remote string
branch string
}
// GetType returns RemoteRefType
func (rr RemoteRef) GetType() RefType {
return RemoteRefType
}
// GetPath returns the remote name separated by the branch e.g. origin/main
func (rr RemoteRef) GetPath() string {
return path.Join(rr.remote, rr.branch)
}
// String returns the fully qualified reference e.g. refs/remotes/origin/main
func (rr RemoteRef) String() string {
return String(rr)
}
// GetRemote returns the name of the remote that this reference is referring to.
func (rr RemoteRef) GetRemote() string {
return rr.remote
}
// GetBranch returns the name of a remote branch
func (rr RemoteRef) GetBranch() string {
return rr.branch
}
// NewRemoteRef creates a remote ref from an origin name and a path
func NewRemoteRef(remote, branch string) RemoteRef {
return RemoteRef{remote, branch}
}
// NewRemoteRefFromPathStr creates a DoltRef from a string in the format origin/main, or remotes/origin/main, or
// refs/remotes/origin/main
func NewRemoteRefFromPathStr(remoteAndPath string) (DoltRef, error) {
if IsRef(remoteAndPath) {
prefix := PrefixForType(RemoteRefType)
if strings.HasPrefix(remoteAndPath, prefix) {
remoteAndPath = remoteAndPath[len(prefix):]
} else {
panic(remoteAndPath + " is a ref that is not of type " + prefix)
}
} else if strings.HasPrefix(remoteAndPath, remotesPrefix) {
remoteAndPath = remoteAndPath[len(remotesPrefix):]
}
remote, ok := strhelp.NthToken(remoteAndPath, '/', 0)
if !ok {
return nil, ErrInvalidRefSpec
}
if len(remote)+1 > len(remoteAndPath) {
return nil, ErrInvalidRefSpec
}
branch := remoteAndPath[len(remote)+1:]
if remote == "" || branch == "" {
return nil, ErrInvalidRefSpec
}
return RemoteRef{remote, branch}, nil
}