vcs

Imports

Imports #

"encoding/xml"
"fmt"
"io"
"strings"
"bytes"
"errors"
"fmt"
"internal/godebug"
"internal/lazyregexp"
"internal/singleflight"
"io/fs"
"log"
urlpkg "net/url"
"os"
"os/exec"
"path/filepath"
"regexp"
"strconv"
"strings"
"sync"
"time"
"cmd/go/internal/base"
"cmd/go/internal/cfg"
"cmd/go/internal/search"
"cmd/go/internal/str"
"cmd/go/internal/web"
"cmd/internal/pathcache"
"golang.org/x/mod/module"

Constants & Variables

IgnoreMod const #

const IgnoreMod ModuleMode = iota

PreferMod const #

const PreferMod

VCSTestHosts var #

VCSTestHosts is the set of hosts supported by the vcs-test server.

var VCSTestHosts []string

VCSTestIsLocalHost var #

VCSTestIsLocalHost reports whether the given URL refers to a local (loopback) host, such as "localhost" or "127.0.0.1:8080".

var VCSTestIsLocalHost func(*urlpkg.URL) bool

VCSTestRepoURL var #

VCSTestRepoURL is the URL of the HTTP server that serves the repos for vcs-test.golang.org. In tests, this is set to the URL of an httptest.Server hosting a cmd/go/internal/vcweb.Server.

var VCSTestRepoURL string

allowmultiplevcs var #

var allowmultiplevcs = *ast.CallExpr

defaultGOVCS var #

defaultGOVCS is the default setting for GOVCS. Setting GOVCS adds entries ahead of these but does not remove them. (They are appended to the parsed GOVCS setting.) The rationale behind allowing only Git and Mercurial is that these two systems have had the most attention to issues of being run as clients of untrusted servers. In contrast, Bazaar, Fossil, and Subversion have primarily been used in trusted, authenticated environments and are not as well scrutinized as attack surfaces. See golang.org/issue/41730 for details.

var defaultGOVCS = govcsConfig{...}

defaultSecureScheme var #

var defaultSecureScheme = map[string]bool{...}

errFossilInfo var #

var errFossilInfo = *ast.CallExpr

errUnknownSite var #

var errUnknownSite = *ast.CallExpr

fetchCache var #

var fetchCache = map[string]fetchResult{...}

fetchCacheMu var #

var fetchCacheMu sync.Mutex

fetchGroup var #

var fetchGroup singleflight.Group

fossilRepoName const #

fossilRepoName is the name go get associates with a fossil repository. In the real world the file can be named anything.

const fossilRepoName = ".fossil"

govcs var #

var govcs govcsConfig

govcsErr var #

var govcsErr error

govcsOnce var #

var govcsOnce sync.Once

scpSyntaxRe var #

scpSyntaxRe matches the SCP-like addresses used by Git to access repositories by SSH.

var scpSyntaxRe = *ast.CallExpr

vcsBzr var #

vcsBzr describes how to use Bazaar.

var vcsBzr = *ast.UnaryExpr

vcsFossil var #

vcsFossil describes how to use Fossil (fossil-scm.org)

var vcsFossil = *ast.UnaryExpr

vcsGit var #

vcsGit describes how to use Git.

var vcsGit = *ast.UnaryExpr

vcsHg var #

vcsHg describes how to use Mercurial.

var vcsHg = *ast.UnaryExpr

vcsList var #

vcsList lists the known version control systems

var vcsList = []*Cmd{...}

vcsMod var #

vcsMod is a stub for the "mod" scheme. It's returned by repoRootForImportPathDynamic, but is otherwise not treated as a VCS command.

var vcsMod = *ast.UnaryExpr

vcsPaths var #

vcsPaths defines the meaning of import paths referring to commonly-used VCS hosting sites (github.com/user/dir) and import paths referring to a fully-qualified importPath containing a VCS type (foo.com/repo.git/dir)

var vcsPaths = []*vcsPath{...}

vcsPathsAfterDynamic var #

vcsPathsAfterDynamic gives additional vcsPaths entries to try after the dynamic HTML check. This gives those sites a chance to introduce tags as part of a graceful transition away from the hard-coded logic.

var vcsPathsAfterDynamic = []*vcsPath{...}

vcsSvn var #

vcsSvn describes how to use Subversion.

var vcsSvn = *ast.UnaryExpr

Type Aliases

ModuleMode type #

ModuleMode specifies whether to prefer modules when looking up code sources.

type ModuleMode int

govcsConfig type #

A govcsConfig is a full GOVCS configuration.

type govcsConfig []govcsRule

Structs

Cmd struct #

A Cmd describes how to use a version control system like Mercurial, Git, or Subversion.

type Cmd struct {
Name string
Cmd string
Env []string
RootNames []rootName
CreateCmd []string
DownloadCmd []string
TagCmd []tagCmd
TagLookupCmd []tagCmd
TagSyncCmd []string
TagSyncDefault []string
Scheme []string
PingCmd string
RemoteRepo func(v *Cmd, rootDir string) (remoteRepo string, err error)
ResolveRepo func(v *Cmd, rootDir string, remoteRepo string) (realRepo string, err error)
Status func(v *Cmd, rootDir string) (Status, error)
}

ImportMismatchError struct #

An ImportMismatchError is returned where metaImport/s are present but none match our import path.

type ImportMismatchError struct {
importPath string
mismatches []string
}

RepoRoot struct #

RepoRoot describes the repository root for a tree of source code.

type RepoRoot struct {
Repo string
Root string
IsCustom bool
VCS *Cmd
}

Status struct #

Status is the current state of a local repository.

type Status struct {
Revision string
CommitTime time.Time
Uncommitted bool
}

fetchResult struct #

type fetchResult struct {
url *urlpkg.URL
imports []metaImport
err error
}

govcsRule struct #

A govcsRule is a single GOVCS rule like private:hg|svn.

type govcsRule struct {
pattern string
allowed []string
}

importError struct #

importError is a copy of load.importError, made to avoid a dependency cycle on cmd/go/internal/load. It just needs to satisfy load.ImportPathError.

type importError struct {
importPath string
err error
}

metaImport struct #

metaImport represents the parsed tags from HTML files.

type metaImport struct {
Prefix string
VCS string
RepoRoot string
}

rootName struct #

type rootName struct {
filename string
isDir bool
}

tagCmd struct #

A tagCmd describes a command to list available tags that can be passed to tagSyncCmd.

type tagCmd struct {
cmd string
pattern string
}

vcsNotFoundError struct #

type vcsNotFoundError struct {
dir string
}

vcsPath struct #

A vcsPath describes how to convert an import path into a version control system and repository name.

type vcsPath struct {
pathPrefix string
regexp *lazyregexp.Regexp
repo string
vcs string
check func(match map[string]string) error
schemelessRepo bool
}

Functions

Create method #

Create creates a new copy of repo in dir. The parent of dir must exist; dir must not.

func (v *Cmd) Create(dir string, repo string) error

Download method #

Download downloads any new changes for the repo in dir.

func (v *Cmd) Download(dir string) error

Error method #

func (e *vcsNotFoundError) Error() string

Error method #

func (e *importError) Error() string

Error method #

func (m ImportMismatchError) Error() string

FromDir function #

FromDir inspects dir and its parents to determine the version control system and code repository to use. If no repository is found, FromDir returns an error equivalent to os.ErrNotExist.

func FromDir(dir string, srcRoot string) (repoDir string, vcsCmd *Cmd, err error)

ImportPath method #

func (e *importError) ImportPath() string

Is method #

func (e *vcsNotFoundError) Is(err error) bool

IsSecure method #

func (v *Cmd) IsSecure(repo string) bool

Ping method #

Ping pings to determine scheme to use.

func (v *Cmd) Ping(scheme string, repo string) error

RepoRootForImportPath function #

RepoRootForImportPath analyzes importPath to determine the version control system, and code repository to use.

func RepoRootForImportPath(importPath string, mod ModuleMode, security web.SecurityMode) (*RepoRoot, error)

String method #

func (v *Cmd) String() string

TagSync method #

TagSync syncs the repo in dir to the named tag, which either is a tag returned by tags or is v.tagDefault.

func (v *Cmd) TagSync(dir string, tag string) error

Tags method #

Tags returns the list of available tags for the repo in dir.

func (v *Cmd) Tags(dir string) ([]string, error)

Unwrap method #

func (e *importError) Unwrap() error

allow method #

func (c *govcsConfig) allow(path string, private bool, vcs string) bool

attrValue function #

attrValue returns the attribute value for the case-insensitive key `name`, or the empty string if nothing is found.

func attrValue(attrs []xml.Attr, name string) string

bzrRemoteRepo function #

func bzrRemoteRepo(vcsBzr *Cmd, rootDir string) (remoteRepo string, err error)

bzrResolveRepo function #

func bzrResolveRepo(vcsBzr *Cmd, rootDir string, remoteRepo string) (realRepo string, err error)

bzrStatus function #

func bzrStatus(vcsBzr *Cmd, rootDir string) (Status, error)

charsetReader function #

charsetReader returns a reader that converts from the given charset to UTF-8. Currently it only supports UTF-8 and ASCII. Otherwise, it returns a meaningful error which is printed by go get, so the user can find why the package wasn't downloaded if the encoding is not supported. Note that, in order to reduce potential errors, ASCII is treated as UTF-8 (i.e. characters greater than 0x7f are not rejected).

func charsetReader(charset string, input io.Reader) (io.Reader, error)

checkGOVCS function #

checkGOVCS checks whether the policy defined by the environment variable GOVCS allows the given vcs command to be used with the given repository root path. Note that root may not be a real package or module path; it's the same as the root path in the go-import meta tag.

func checkGOVCS(vcs *Cmd, root string) error

expand function #

expand rewrites s to replace {k} with match[k] for each key k in match.

func expand(match map[string]string, s string) string

fossilRemoteRepo function #

func fossilRemoteRepo(vcsFossil *Cmd, rootDir string) (remoteRepo string, err error)

fossilStatus function #

func fossilStatus(vcsFossil *Cmd, rootDir string) (Status, error)

gitRemoteRepo function #

func gitRemoteRepo(vcsGit *Cmd, rootDir string) (remoteRepo string, err error)

gitStatus function #

func gitStatus(vcsGit *Cmd, rootDir string) (Status, error)

hgRemoteRepo function #

func hgRemoteRepo(vcsHg *Cmd, rootDir string) (remoteRepo string, err error)

hgStatus function #

func hgStatus(vcsHg *Cmd, rootDir string) (Status, error)

httpPrefix function #

func httpPrefix(s string) string

importErrorf function #

func importErrorf(path string, format string, args ...any) error

interceptVCSTest function #

func interceptVCSTest(repo string, vcs *Cmd, security web.SecurityMode) (repoURL string, ok bool)

isSecureScheme method #

func (v *Cmd) isSecureScheme(scheme string) bool

isVCSRoot function #

isVCSRoot identifies a VCS root by checking whether the directory contains any of the listed root names.

func isVCSRoot(dir string, rootNames []rootName) bool

launchpadVCS function #

launchpadVCS solves the ambiguity for "lp.net/project/foo". In this case, "foo" could be a series name registered in Launchpad with its own branch, and it could also be the name of a directory within the main project branch one level up.

func launchpadVCS(match map[string]string) error

matchGoImport function #

matchGoImport returns the metaImport from imports matching importPath. An error is returned if there are multiple matches. An ImportMismatchError is returned if none match.

func matchGoImport(imports []metaImport, importPath string) (metaImport, error)

metaImportsForPrefix function #

metaImportsForPrefix takes a package's root import path as declared in a tag and returns its HTML discovery URL and the parsed metaImport lines found on the page. The importPath is of the form "golang.org/x/tools". It is an error if no imports are found. url will still be valid if err != nil. The returned url will be of the form "https://golang.org/x/tools?go-get=1"

func metaImportsForPrefix(importPrefix string, mod ModuleMode, security web.SecurityMode) (*urlpkg.URL, []metaImport, error)

noVCSSuffix function #

noVCSSuffix checks that the repository name does not end in .foo for any version control system foo. The usual culprit is ".git".

func noVCSSuffix(match map[string]string) error

parseGOVCS function #

func parseGOVCS(s string) (govcsConfig, error)

parseMetaGoImports function #

parseMetaGoImports returns meta imports from the HTML in r. Parsing ends at the end of the section or the beginning of the .

func parseMetaGoImports(r io.Reader, mod ModuleMode) ([]metaImport, error)

parseRevTime function #

parseRevTime parses commit details in "revision:seconds" format.

func parseRevTime(out []byte) (string, time.Time, error)

repoRootForImportDynamic function #

repoRootForImportDynamic finds a *RepoRoot for a custom domain that's not statically known by repoRootFromVCSPaths. This handles custom import paths like "name.tld/pkg/foo" or just "name.tld".

func repoRootForImportDynamic(importPath string, mod ModuleMode, security web.SecurityMode) (*RepoRoot, error)

repoRootFromVCSPaths function #

repoRootFromVCSPaths attempts to map importPath to a repoRoot using the mappings defined in vcsPaths.

func repoRootFromVCSPaths(importPath string, security web.SecurityMode, vcsPaths []*vcsPath) (*RepoRoot, error)

run method #

run runs the command line cmd in the given directory. keyval is a list of key, value pairs. run expands instances of {key} in cmd into value, but only after splitting cmd into individual arguments. If an error occurs, run prints the command line and the command's combined stdout+stderr to standard error. Otherwise run discards the command's output.

func (v *Cmd) run(dir string, cmd string, keyval ...string) error

run1 method #

run1 is the generalized implementation of run and runOutput.

func (v *Cmd) run1(dir string, cmdline string, keyval []string, verbose bool) ([]byte, error)

runOutput method #

runOutput is like run but returns the output of the command.

func (v *Cmd) runOutput(dir string, cmd string, keyval ...string) ([]byte, error)

runOutputVerboseOnly method #

runOutputVerboseOnly is like runOutput but only generates error output to standard error in verbose mode.

func (v *Cmd) runOutputVerboseOnly(dir string, cmd string, keyval ...string) ([]byte, error)

runVerboseOnly method #

runVerboseOnly is like run but only generates error output to standard error in verbose mode.

func (v *Cmd) runVerboseOnly(dir string, cmd string, keyval ...string) error

svnRemoteRepo function #

func svnRemoteRepo(vcsSvn *Cmd, rootDir string) (remoteRepo string, err error)

urlForImportPath function #

urlForImportPath returns a partially-populated URL for the given Go import path. The URL leaves the Scheme field blank so that web.Get will try any scheme allowed by the selected security mode.

func urlForImportPath(importPath string) (*urlpkg.URL, error)

validateRepoRoot function #

validateRepoRoot returns an error if repoRoot does not seem to be a valid URL with scheme.

func validateRepoRoot(repoRoot string) error

vcsByCmd function #

vcsByCmd returns the version control system for the given command name (hg, git, svn, bzr).

func vcsByCmd(cmd string) *Cmd

Generated with Arrow