Documentation
¶
Overview ¶
Package cliupdate lets the CLI find a newer release and replace its own executable with it, reusing selfupgrade's download, checksum and signature code.
Index ¶
- Constants
- Variables
- func Asset(base, goos, goarch string) string
- func DetectMethod(exePath string, lookupEnv func(string) (string, bool)) string
- func ExecutablePath() (string, error)
- func InstalledVersion(ctx context.Context, path string) (string, error)
- func ManagedPathHint(path string) string
- func MinorBehind(cli, server string) bool
- func Newer(current, latest string) bool
- func PackageManaged(method string) bool
- func RunUpgrade(ctx context.Context, argv []string, stdout, stderr io.Writer) error
- func UpgradeArgv(method, spec string) []string
- func UpgradeCommand(method, prog string) string
- type Hinter
- type Options
- type Result
- type Source
Constants ¶
const ( MethodBinary = "binary" MethodNPM = "npm" MethodPNPM = "pnpm" MethodYarn = "yarn" MethodNPX = "npx" MethodBrew = "brew" )
Install methods. Binary means a plain download the CLI may replace itself.
const ( ChannelStable = "stable" ChannelBeta = "beta" )
Channel names accepted by Source.Channel.
const ( ActionUpToDate = "up-to-date" ActionWouldApply = "would-update" ActionUpdated = "updated" )
Actions reported in Result.Action.
const EnvInstallMethod = "LEVELRAIL_CLI_INSTALL_METHOD"
EnvInstallMethod is set by the npm launcher so the binary knows a package manager owns it.
Variables ¶
var ErrManagedPath = errors.New("the running executable is managed by a package manager")
ErrManagedPath means a package manager owns the executable.
var ErrNotWritable = errors.New("cannot write next to the running executable")
ErrNotWritable means the executable's directory cannot take a staged file.
Functions ¶
func DetectMethod ¶
DetectMethod picks the install method from the launcher env var, then from where the executable lives. Unknown input falls back to a plain binary.
func ExecutablePath ¶
ExecutablePath returns the running binary with symlinks resolved, so the swap replaces the real file and never a link.
func InstalledVersion ¶
InstalledVersion asks the executable at path for its version after an upgrade.
func ManagedPathHint ¶
ManagedPathHint returns the right update command when path sits under a package manager's tree, or "" when the CLI is self-managed.
func MinorBehind ¶
MinorBehind reports whether server is at least one minor (or major) ahead of cli.
func Newer ¶
Newer reports whether latest is a higher release than current. A dev build or an unparsable version never reports newer.
func PackageManaged ¶
PackageManaged reports whether a JS package manager owns the install.
func RunUpgrade ¶
RunUpgrade runs the package manager upgrade with the user's terminal attached.
func UpgradeArgv ¶
UpgradeArgv returns the package manager invocation that upgrades the CLI to spec ("latest" or a version), or nil when the method has no such command.
func UpgradeCommand ¶
UpgradeCommand returns the right upgrade command for the method, or the CLI's own update command for a plain binary.
Types ¶
type Hinter ¶
type Hinter struct {
Source Source
Current string
// Dir is the CLI's config directory, where the check result is cached.
Dir string
// IntervalDays of 0 or less disables the hint.
IntervalDays int
// Method is the install method; empty means a plain binary.
Method string
Now func() time.Time
}
Hinter prints a one-line notice at most once per Interval days.
type Options ¶
type Options struct {
Source Source
// Current is the running version, Target an explicit tag ("" means latest).
Current string
Target string
DryRun bool
// Force skips the package-manager path refusal.
Force bool
// ExePath is the resolved path of the running executable.
ExePath string
// TUFCacheDir keeps Sigstore trust metadata between runs.
TUFCacheDir string
// Confirm runs after the plan is known and before any download; an error aborts.
Confirm func(current, target string) error
// Verify checks the signature over checksums.txt. Nil verifies in process,
// in require mode, so a release without a valid signature is never applied.
Verify func(ctx context.Context, checksumsPath, bundlePath string) (string, error)
}
Options configures one update run.
type Result ¶
type Result struct {
Action string `json:"action"`
Current string `json:"current"`
Target string `json:"target"`
Asset string `json:"asset"`
Path string `json:"path"`
Verification string `json:"verification,omitempty"`
Backup string `json:"backup,omitempty"`
}
Result describes what a run did or would do.
type Source ¶
type Source struct {
// Repo is "owner/name".
Repo string
// APIBase serves the releases listing, for example https://api.github.com.
APIBase string
// DownloadBase is the asset prefix, the tag is appended by the fetcher.
DownloadBase string
// Asset is the release asset for this OS and arch.
Asset string
// Channel is "stable" (stable only), "beta" (prereleases count too) or ""
// (stable, else the newest prerelease), the same rules as install-cli.sh.
Channel string
Client *http.Client
// AllowHTTP permits plain http bases, for tests against a local server.
AllowHTTP bool
}
Source says where releases are published and which asset belongs to this build.