blob: 7b6e3b2bb7db369e9ef6109efcd36c37deddcd8b [file] [log] [blame]
// Copyright 2019 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
package internal
import (
"path"
"strings"
"time"
"golang.org/x/mod/module"
"golang.org/x/pkgsite/internal/licenses"
"golang.org/x/pkgsite/internal/source"
"golang.org/x/pkgsite/internal/stdlib"
)
const (
// LatestVersion signifies the latest available version in requests to the
// proxy client.
LatestVersion = "latest"
// MasterVersion signifies the version at master.
MasterVersion = "master"
// UnknownModulePath signifies that the module path for a given package
// path is ambiguous or not known. This is because requests to the
// frontend can come in the form of <import-path>[@<version>], and it is
// not clear which part of the import-path is the module path.
UnknownModulePath = "unknownModulePath"
)
// ModuleInfo holds metadata associated with a module.
type ModuleInfo struct {
ModulePath string
Version string
CommitTime time.Time
IsRedistributable bool
HasGoMod bool // whether the module zip has a go.mod file
SourceInfo *source.Info
}
// VersionMap holds metadata associated with module queries for a version.
type VersionMap struct {
ModulePath string
RequestedVersion string
ResolvedVersion string
GoModPath string
Status int
Error string
UpdatedAt time.Time
}
// SeriesPath returns the series path for the module.
//
// A series is a group of modules that share the same base path and are assumed
// to be major-version variants.
//
// The series path is the module path without the version. For most modules,
// this will be the module path for all module versions with major version 0 or
// 1. For gopkg.in modules, the series path does not correspond to any module
// version.
//
// Examples:
// The module paths "a/b" and "a/b/v2" both have series path "a/b".
// The module paths "gopkg.in/yaml.v1" and "gopkg.in/yaml.v2" both have series
// path "gopkg.in/yaml".
func (v *ModuleInfo) SeriesPath() string {
return SeriesPathForModule(v.ModulePath)
}
// SeriesPathForModule returns the series path for the provided modulePath.
func SeriesPathForModule(modulePath string) string {
seriesPath, _, _ := module.SplitPathVersion(modulePath)
return seriesPath
}
// Suffix returns the suffix of the fullPath. It assumes that basePath is a
// prefix of fullPath. If fullPath and basePath are the same, the empty string
// is returned.
func Suffix(fullPath, basePath string) string {
return strings.TrimPrefix(strings.TrimPrefix(fullPath, basePath), "/")
}
// V1Path returns the path for version 1 of the package whose import path
// is fullPath. If modulePath is the standard library, then V1Path returns
// fullPath.
func V1Path(fullPath, modulePath string) string {
if modulePath == stdlib.ModulePath {
return fullPath
}
return path.Join(SeriesPathForModule(modulePath), Suffix(fullPath, modulePath))
}
// A Module is a specific, reproducible build of a module.
type Module struct {
ModuleInfo
// Licenses holds all licenses within this module version, including those
// that may be contained in nested subdirectories.
Licenses []*licenses.License
Units []*Unit
LegacyPackages []*LegacyPackage
}
// Packages returns all of the units for a module that are packages.
func (m *Module) Packages() []*Unit {
var pkgs []*Unit
for _, u := range m.Units {
if u.IsPackage() {
pkgs = append(pkgs, u)
}
}
return pkgs
}
// IndexVersion holds the version information returned by the module index.
type IndexVersion struct {
Path string
Version string
Timestamp time.Time
}
// ModuleVersionState holds a worker module version state.
type ModuleVersionState struct {
ModulePath string
Version string
// IndexTimestamp is the timestamp received from the Index for this version,
// which should correspond to the time this version was committed to the
// Index.
IndexTimestamp time.Time
// CreatedAt is the time this version was originally inserted into the
// module version state table.
CreatedAt time.Time
// Status is the most recent HTTP status code received from the Fetch service
// for this version, or nil if no request to the fetch service has been made.
Status int
// Error is the most recent HTTP response body received from the Fetch
// service, for a response with an unsuccessful status code. It is used for
// debugging only, and has no semantic significance.
Error string
// TryCount is the number of times a fetch of this version has been
// attempted.
TryCount int
// LastProcessedAt is the last time this version was updated with a result
// from the fetch service.
LastProcessedAt *time.Time
// NextProcessedAfter is the next time a fetch for this version should be
// attempted.
NextProcessedAfter time.Time
// AppVersion is the value of the GAE_VERSION environment variable, which is
// set by app engine. It is a timestamp in the format 20190709t112655 that
// is close to, but not the same as, the deployment time. For example, the
// deployment time for the above timestamp might be Jul 9, 2019, 11:29:59 AM.
AppVersion string
// GoModPath is the path declared in the go.mod file.
GoModPath string
// NumPackages it the number of packages that were processed as part of the
// module (regardless of whether the processing was successful).
NumPackages *int
}
// PackageVersionState holds a worker package version state. It is associated
// with a given module version state.
type PackageVersionState struct {
PackagePath string
ModulePath string
Version string
Status int
Error string
}
// SearchResult represents a single search result from SearchDocuments.
type SearchResult struct {
Name string
PackagePath string
ModulePath string
Version string
Synopsis string
Licenses []string
CommitTime time.Time
// Score is used to sort items in an array of SearchResult.
Score float64
// NumImportedBy is the number of packages that import PackagePath.
NumImportedBy uint64
// NumResults is the total number of packages that were returned for this
// search.
NumResults uint64
// Approximate reports whether NumResults is an approximate count. NumResults
// can be approximate if search scanned only a subset of documents, and
// result count is estimated using the hyperloglog algorithm.
Approximate bool
}