package getmodules import ( "context" ) // PackageFetcher is a low-level utility for fetching remote module packages // into local filesystem directories in preparation for use by higher-level // module installer functionality implemented elsewhere. // // A PackageFetcher works only with entire module packages and never with // the individual modules within a package. // // A particular PackageFetcher instance remembers the target directory of // any successfully-installed package so that it can optimize future calls // that have the same package address by copying the local directory tree, // rather than fetching the package from its origin repeatedly. There is // no way to reset this cache, so a particular PackageFetcher instance should // live only for the duration of a single initialization process. type PackageFetcher struct { getter reusingGetter } func NewPackageFetcher() *PackageFetcher { return &PackageFetcher{ getter: reusingGetter{}, } } // FetchPackage downloads or otherwise retrieves the filesystem inside the // package at the given address into the given local installation directory. // // packageAddr must be formatted as if it were the result of an // addrs.ModulePackage.String() call. It's only defined as a raw string here // because the getmodules package can't import the addrs package due to // that creating a package dependency cycle. // // PackageFetcher only works with entire packages. If the caller is processing // a module source address which includes a subdirectory portion then the // caller must resolve that itself, possibly with the help of the // getmodules.SplitPackageSubdir and getmodules.ExpandSubdirGlobs functions. func (f *PackageFetcher) FetchPackage(ctx context.Context, instDir string, packageAddr string) error { return f.getter.getWithGoGetter(ctx, instDir, packageAddr) }