// 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 }