93 lines
2.6 KiB
Go
93 lines
2.6 KiB
Go
|
// Copyright 2020-2021 Buf Technologies, 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 git
|
||
|
|
||
|
import (
|
||
|
"context"
|
||
|
|
||
|
"github.com/bufbuild/buf/internal/pkg/app"
|
||
|
"github.com/bufbuild/buf/internal/pkg/storage"
|
||
|
"github.com/bufbuild/buf/internal/pkg/storage/storageos"
|
||
|
"go.uber.org/zap"
|
||
|
)
|
||
|
|
||
|
// Name is a name identifiable by git.
|
||
|
type Name interface {
|
||
|
// If cloneBranch returns a non-empty string, any clones will be performed with --branch set to the value.
|
||
|
cloneBranch() string
|
||
|
// If checkout returns a non-empty string, a checkout of the value will be performed after cloning.
|
||
|
checkout() string
|
||
|
}
|
||
|
|
||
|
// NewBranchName returns a new Name for the branch.
|
||
|
func NewBranchName(branch string) Name {
|
||
|
return newBranch(branch)
|
||
|
}
|
||
|
|
||
|
// NewTagName returns a new Name for the tag.
|
||
|
func NewTagName(tag string) Name {
|
||
|
return newBranch(tag)
|
||
|
}
|
||
|
|
||
|
// NewRefName returns a new Name for the ref.
|
||
|
func NewRefName(ref string) Name {
|
||
|
return newRef(ref)
|
||
|
}
|
||
|
|
||
|
// NewRefNameWithBranch returns a new Name for the ref while setting branch as the clone target.
|
||
|
func NewRefNameWithBranch(ref string, branch string) Name {
|
||
|
return newRefWithBranch(ref, branch)
|
||
|
}
|
||
|
|
||
|
// Cloner clones git repositories to buckets.
|
||
|
type Cloner interface {
|
||
|
// CloneToBucket clones the repository to the bucket.
|
||
|
//
|
||
|
// The url must contain the scheme, including file:// if necessary.
|
||
|
// depth must be > 0.
|
||
|
CloneToBucket(
|
||
|
ctx context.Context,
|
||
|
envContainer app.EnvContainer,
|
||
|
url string,
|
||
|
depth uint32,
|
||
|
writeBucket storage.WriteBucket,
|
||
|
options CloneToBucketOptions,
|
||
|
) error
|
||
|
}
|
||
|
|
||
|
// CloneToBucketOptions are options for Clone.
|
||
|
type CloneToBucketOptions struct {
|
||
|
Mapper storage.Mapper
|
||
|
Name Name
|
||
|
RecurseSubmodules bool
|
||
|
}
|
||
|
|
||
|
// NewCloner returns a new Cloner.
|
||
|
func NewCloner(
|
||
|
logger *zap.Logger,
|
||
|
storageosProvider storageos.Provider,
|
||
|
options ClonerOptions,
|
||
|
) Cloner {
|
||
|
return newCloner(logger, storageosProvider, options)
|
||
|
}
|
||
|
|
||
|
// ClonerOptions are options for a new Cloner.
|
||
|
type ClonerOptions struct {
|
||
|
HTTPSUsernameEnvKey string
|
||
|
HTTPSPasswordEnvKey string
|
||
|
SSHKeyFileEnvKey string
|
||
|
SSHKnownHostsFilesEnvKey string
|
||
|
}
|