// DO NOT EDIT THIS FILE.
//go:generate gvt help documentation

/*
gvt, a simple go vendoring tool based on gb-vendor.

Usage:
        gvt command [arguments]

The commands are:

        fetch       fetch a remote dependency
        rebuild     rebuild dependencies from manifest
        update      update a local dependency
        list        list dependencies one per line
        delete      delete a local dependency

Use "gvt help [command]" for more information about a command.


Fetch a remote dependency

Usage:
        gvt fetch [-branch branch | -revision rev | -tag tag] [-precaire] [-no-recurse] importpath

fetch vendors an upstream import path.

The import path may include a url scheme. This may be useful when fetching dependencies
from private repositories that cannot be probed.

Flags:
	-branch branch
		fetch from the name branch. If not supplied the default upstream
		branch will be used.
	-no-recurse
		do not fetch recursively.
	-tag tag
		fetch the specified tag. If not supplied the default upstream
		branch will be used.
	-revision rev
		fetch the specific revision from the branch (if supplied). If no
		revision supplied, the latest available will be supplied.
	-precaire
		allow the use of insecure protocols.

Rebuild dependencies from manifest

Usage:
        gvt rebuild

rebuild fetches the dependencies listed in the manifest.

It's meant for workflows that don't include checking in to VCS the vendored
source, for example if .gitignore includes lines like

    vendor/**
    !vendor/manifest

Note that such a setup requires "gvt rebuild" to build the source, relies on
the availability of the dependencies repositories and breaks "go get".

Flags:
	-precaire
		allow the use of insecure protocols.
	-connections
		count of parallel download connections.

Update a local dependency

Usage:
        gvt update [-all] import

update will replaces the source with the latest available from the head of the master branch.

Updating from one copy of a dependency to another comes with several restrictions.
The first is you can only update to the head of the branch your dependency was vendored from, switching branches is not supported.
The second restriction is if you have used -tag or -revision while vendoring a dependency, your dependency is "headless"
(to borrow a term from git) and cannot be updated.

To update across branches, or from one tag/revision to another, you must first use delete to remove the dependency, then
fetch [-tag | -revision | -branch ] [-precaire] to replace it.

Flags:
	-all
		will update all dependencies in the manifest, otherwise only the dependency supplied.
	-precaire
		allow the use of insecure protocols.

List dependencies one per line

Usage:
        gvt list [-f format]

list formats the contents of the manifest file.

Flags:
	-f
		controls the template used for printing each manifest entry. If not supplied
		the default value is "{{.Importpath}}\t{{.Repository}}{{.Path}}\t{{.Branch}}\t{{.Revision}}"

Delete a local dependency

Usage:
        gvt delete [-all] importpath

delete removes a dependency from the vendor directory and the manifest

Flags:
	-all
		remove all dependencies

*/
package main
