const MaxZipFile … const MaxGoMod … const MaxLICENSE … type File … type CheckedFiles … // Err returns an error if [CheckedFiles] does not describe a valid module zip // file. [CheckedFiles.SizeError] is returned if that field is set. // A [FileErrorList] is returned // if there are one or more invalid files. Other errors may be returned in the // future. func (cf CheckedFiles) Err() error { … } type FileErrorList … func (el FileErrorList) Error() string { … } type FileError … func (e FileError) Error() string { … } func (e FileError) Unwrap() error { … } var errPathNotClean … var errPathNotRelative … var errGoModCase … var errGoModSize … var errLICENSESize … var errVCS … var errVendored … var errSubmoduleFile … var errSubmoduleDir … var errHgArchivalTxt … var errSymlink … var errNotRegular … // CheckFiles reports whether a list of files satisfy the name and size // constraints listed in the package documentation. The returned CheckedFiles // record contains lists of valid, invalid, and omitted files. Every file in // the given list will be included in exactly one of those lists. // // CheckFiles returns an error if the returned CheckedFiles does not describe // a valid module zip file (according to CheckedFiles.Err). The returned // CheckedFiles is still populated when an error is returned. // // Note that CheckFiles will not open any files, so Create may still fail when // CheckFiles is successful due to I/O errors and reported size differences. func CheckFiles(files []File) (CheckedFiles, error) { … } // checkFiles implements CheckFiles and also returns lists of valid files and // their sizes, corresponding to cf.Valid. It omits files in submodules, files // in vendored packages, symlinked files, and various other unwanted files. // // The lists returned are used in Create to avoid repeated calls to File.Lstat. func checkFiles(files []File) (cf CheckedFiles, validFiles []File, validSizes []int64) { … } // CheckDir reports whether the files in dir satisfy the name and size // constraints listed in the package documentation. The returned [CheckedFiles] // record contains lists of valid, invalid, and omitted files. If a directory is // omitted (for example, a nested module or vendor directory), it will appear in // the omitted list, but its files won't be listed. // // CheckDir returns an error if it encounters an I/O error or if the returned // [CheckedFiles] does not describe a valid module zip file (according to // [CheckedFiles.Err]). The returned [CheckedFiles] is still populated when such // an error is returned. // // Note that CheckDir will not open any files, so [CreateFromDir] may still fail // when CheckDir is successful due to I/O errors. func CheckDir(dir string) (CheckedFiles, error) { … } // CheckZip reports whether the files contained in a zip file satisfy the name // and size constraints listed in the package documentation. // // CheckZip returns an error if the returned [CheckedFiles] does not describe // a valid module zip file (according to [CheckedFiles.Err]). The returned // CheckedFiles is still populated when an error is returned. CheckZip will // also return an error if the module path or version is malformed or if it // encounters an error reading the zip file. // // Note that CheckZip does not read individual files, so [Unzip] may still fail // when CheckZip is successful due to I/O errors. func CheckZip(m module.Version, zipFile string) (CheckedFiles, error) { … } // checkZip implements checkZip and also returns the *zip.Reader. This is // used in Unzip to avoid redundant I/O. func checkZip(m module.Version, f *os.File) (*zip.Reader, CheckedFiles, error) { … } // Create builds a zip archive for module m from an abstract list of files // and writes it to w. // // Create verifies the restrictions described in the package documentation // and should not produce an archive that [Unzip] cannot extract. Create does not // include files in the output archive if they don't belong in the module zip. // In particular, Create will not include files in modules found in // subdirectories, most files in vendor directories, or irregular files (such // as symbolic links) in the output archive. func Create(w io.Writer, m module.Version, files []File) (err error) { … } // CreateFromDir creates a module zip file for module m from the contents of // a directory, dir. The zip content is written to w. // // CreateFromDir verifies the restrictions described in the package // documentation and should not produce an archive that [Unzip] cannot extract. // CreateFromDir does not include files in the output archive if they don't // belong in the module zip. In particular, CreateFromDir will not include // files in modules found in subdirectories, most files in vendor directories, // or irregular files (such as symbolic links) in the output archive. // Additionally, unlike [Create], CreateFromDir will not include directories // named ".bzr", ".git", ".hg", or ".svn". func CreateFromDir(w io.Writer, m module.Version, dir string) (err error) { … } // CreateFromVCS creates a module zip file for module m from the contents of a // VCS repository stored locally. The zip content is written to w. // // repoRoot must be an absolute path to the base of the repository, such as // "/Users/some-user/some-repo". // // revision is the revision of the repository to create the zip from. Examples // include HEAD or SHA sums for git repositories. // // subdir must be the relative path from the base of the repository, such as // "sub/dir". To create a zip from the base of the repository, pass an empty // string. // // If CreateFromVCS returns [UnrecognizedVCSError], consider falling back to // [CreateFromDir]. func CreateFromVCS(w io.Writer, m module.Version, repoRoot, revision, subdir string) (err error) { … } type UnrecognizedVCSError … func (e *UnrecognizedVCSError) Error() string { … } // filesInGitRepo filters out any files that are git ignored in the directory. func filesInGitRepo(dir, rev, subdir string) ([]File, error) { … } // isGitRepo reports whether the given directory is a git repo. func isGitRepo(dir string) bool { … } type dirFile … func (f dirFile) Path() string { … } func (f dirFile) Lstat() (os.FileInfo, error) { … } func (f dirFile) Open() (io.ReadCloser, error) { … } type zipFile … func (f zipFile) Path() string { … } func (f zipFile) Lstat() (os.FileInfo, error) { … } func (f zipFile) Open() (io.ReadCloser, error) { … } type dataFile … func (f dataFile) Path() string { … } func (f dataFile) Lstat() (os.FileInfo, error) { … } func (f dataFile) Open() (io.ReadCloser, error) { … } type dataFileInfo … func (fi dataFileInfo) Name() string { … } func (fi dataFileInfo) Size() int64 { … } func (fi dataFileInfo) Mode() os.FileMode { … } func (fi dataFileInfo) ModTime() time.Time { … } func (fi dataFileInfo) IsDir() bool { … } func (fi dataFileInfo) Sys() interface{ … } // isVendoredPackage attempts to report whether the given filename is contained // in a package whose import path contains (but does not end with) the component // "vendor". // // Unfortunately, isVendoredPackage reports false positives for files in any // non-top-level package whose import path ends in "vendor". func isVendoredPackage(name string) bool { … } // Unzip extracts the contents of a module zip file to a directory. // // Unzip checks all restrictions listed in the package documentation and returns // an error if the zip archive is not valid. In some cases, files may be written // to dir before an error is returned (for example, if a file's uncompressed // size does not match its declared size). // // dir may or may not exist: Unzip will create it and any missing parent // directories if it doesn't exist. If dir exists, it must be empty. func Unzip(dir string, m module.Version, zipFile string) (err error) { … } type collisionChecker … type pathInfo … func (cc collisionChecker) check(p string, isDir bool) error { … } // listFilesInDir walks the directory tree rooted at dir and returns a list of // files, as well as a list of directories and files that were skipped (for // example, nested modules and symbolic links). func listFilesInDir(dir string) (files []File, omitted []FileError, err error) { … } type zipError … func (e *zipError) Error() string { … } func (e *zipError) Unwrap() error { … } // strToFold returns a string with the property that // // strings.EqualFold(s, t) iff strToFold(s) == strToFold(t) // // This lets us test a large set of strings for fold-equivalent // duplicates without making a quadratic number of calls // to EqualFold. Note that strings.ToUpper and strings.ToLower // do not have the desired property in some corner cases. func strToFold(s string) string { … }