archive: add available godoc link

Change-Id: I813aa09f8a65936796469fa637d0f23004d26098
Reviewed-on: https://go-review.googlesource.com/c/go/+/534757
Reviewed-by: Dmitri Shuralyov <dmitshur@google.com>
TryBot-Result: Gopher Robot <gobot@golang.org>
Auto-Submit: Ian Lance Taylor <iant@golang.org>
Reviewed-by: Joseph Tsai <joetsai@digital-static.net>
Reviewed-by: Ian Lance Taylor <iant@google.com>
Run-TryBot: shuang cui <imcusg@gmail.com>
This commit is contained in:
cui fliter 2023-10-12 12:18:18 +08:00 committed by Gopher Robot
parent 6dd7462a04
commit 22344034c5
8 changed files with 57 additions and 57 deletions

View File

@ -634,7 +634,7 @@ const (
c_ISSOCK = 0140000 // Socket c_ISSOCK = 0140000 // Socket
) )
// FileInfoHeader creates a partially-populated Header from fi. // FileInfoHeader creates a partially-populated [Header] from fi.
// If fi describes a symlink, FileInfoHeader records link as the link target. // If fi describes a symlink, FileInfoHeader records link as the link target.
// If fi describes a directory, a slash is appended to the name. // If fi describes a directory, a slash is appended to the name.
// //

View File

@ -33,7 +33,7 @@ import "strings"
// sub-second times | no | yes | no // sub-second times | no | yes | no
// sparse files | no | yes | yes // sparse files | no | yes | yes
// //
// The table's upper portion shows the Header fields, where each format reports // The table's upper portion shows the [Header] fields, where each format reports
// the maximum number of bytes allowed for each string field and // the maximum number of bytes allowed for each string field and
// the integer type used to store each numeric field // the integer type used to store each numeric field
// (where timestamps are stored as the number of seconds since the Unix epoch). // (where timestamps are stored as the number of seconds since the Unix epoch).

View File

@ -35,7 +35,7 @@ type fileReader interface {
WriteTo(io.Writer) (int64, error) WriteTo(io.Writer) (int64, error)
} }
// NewReader creates a new Reader reading from r. // NewReader creates a new [Reader] reading from r.
func NewReader(r io.Reader) *Reader { func NewReader(r io.Reader) *Reader {
return &Reader{r: r, curr: &regFileReader{r, 0}} return &Reader{r: r, curr: &regFileReader{r, 0}}
} }
@ -47,10 +47,10 @@ func NewReader(r io.Reader) *Reader {
// //
// If Next encounters a non-local name (as defined by [filepath.IsLocal]) // If Next encounters a non-local name (as defined by [filepath.IsLocal])
// and the GODEBUG environment variable contains `tarinsecurepath=0`, // and the GODEBUG environment variable contains `tarinsecurepath=0`,
// Next returns the header with an ErrInsecurePath error. // Next returns the header with an [ErrInsecurePath] error.
// A future version of Go may introduce this behavior by default. // A future version of Go may introduce this behavior by default.
// Programs that want to accept non-local names can ignore // Programs that want to accept non-local names can ignore
// the ErrInsecurePath error and use the returned header. // the [ErrInsecurePath] error and use the returned header.
func (tr *Reader) Next() (*Header, error) { func (tr *Reader) Next() (*Header, error) {
if tr.err != nil { if tr.err != nil {
return nil, tr.err return nil, tr.err
@ -623,14 +623,14 @@ func readGNUSparseMap0x1(paxHdrs map[string]string) (sparseDatas, error) {
// Read reads from the current file in the tar archive. // Read reads from the current file in the tar archive.
// It returns (0, io.EOF) when it reaches the end of that file, // It returns (0, io.EOF) when it reaches the end of that file,
// until Next is called to advance to the next file. // until [Next] is called to advance to the next file.
// //
// If the current file is sparse, then the regions marked as a hole // If the current file is sparse, then the regions marked as a hole
// are read back as NUL-bytes. // are read back as NUL-bytes.
// //
// Calling Read on special types like TypeLink, TypeSymlink, TypeChar, // Calling Read on special types like [TypeLink], [TypeSymlink], [TypeChar],
// TypeBlock, TypeDir, and TypeFifo returns (0, io.EOF) regardless of what // [TypeBlock], [TypeDir], and [TypeFifo] returns (0, [io.EOF]) regardless of what
// the Header.Size claims. // the [Header.Size] claims.
func (tr *Reader) Read(b []byte) (int, error) { func (tr *Reader) Read(b []byte) (int, error) {
if tr.err != nil { if tr.err != nil {
return 0, tr.err return 0, tr.err

View File

@ -16,7 +16,7 @@ import (
) )
// Writer provides sequential writing of a tar archive. // Writer provides sequential writing of a tar archive.
// Write.WriteHeader begins a new file with the provided Header, // [Writer.WriteHeader] begins a new file with the provided [Header],
// and then Writer can be treated as an io.Writer to supply that file's data. // and then Writer can be treated as an io.Writer to supply that file's data.
type Writer struct { type Writer struct {
w io.Writer w io.Writer
@ -46,7 +46,7 @@ type fileWriter interface {
// Flush finishes writing the current file's block padding. // Flush finishes writing the current file's block padding.
// The current file must be fully written before Flush can be called. // The current file must be fully written before Flush can be called.
// //
// This is unnecessary as the next call to WriteHeader or Close // This is unnecessary as the next call to [Writer.WriteHeader] or [Writer.Close]
// will implicitly flush out the file's padding. // will implicitly flush out the file's padding.
func (tw *Writer) Flush() error { func (tw *Writer) Flush() error {
if tw.err != nil { if tw.err != nil {
@ -464,12 +464,12 @@ func splitUSTARPath(name string) (prefix, suffix string, ok bool) {
} }
// Write writes to the current file in the tar archive. // Write writes to the current file in the tar archive.
// Write returns the error ErrWriteTooLong if more than // Write returns the error [ErrWriteTooLong] if more than
// Header.Size bytes are written after WriteHeader. // Header.Size bytes are written after [Writer.WriteHeader].
// //
// Calling Write on special types like TypeLink, TypeSymlink, TypeChar, // Calling Write on special types like [TypeLink], [TypeSymlink], [TypeChar],
// TypeBlock, TypeDir, and TypeFifo returns (0, ErrWriteTooLong) regardless // [TypeBlock], [TypeDir], and [TypeFifo] returns (0, [ErrWriteTooLong]) regardless
// of what the Header.Size claims. // of what the [Header.Size] claims.
func (tw *Writer) Write(b []byte) (int, error) { func (tw *Writer) Write(b []byte) (int, error) {
if tw.err != nil { if tw.err != nil {
return 0, tw.err return 0, tw.err
@ -503,7 +503,7 @@ func (tw *Writer) readFrom(r io.Reader) (int64, error) {
} }
// Close closes the tar archive by flushing the padding, and writing the footer. // Close closes the tar archive by flushing the padding, and writing the footer.
// If the current file (from a prior call to WriteHeader) is not fully written, // If the current file (from a prior call to [Writer.WriteHeader]) is not fully written,
// then this returns an error. // then this returns an error.
func (tw *Writer) Close() error { func (tw *Writer) Close() error {
if tw.err == ErrWriteAfterClose { if tw.err == ErrWriteAfterClose {

View File

@ -48,15 +48,15 @@ type Reader struct {
fileList []fileListEntry fileList []fileListEntry
} }
// A ReadCloser is a Reader that must be closed when no longer needed. // A ReadCloser is a [Reader] that must be closed when no longer needed.
type ReadCloser struct { type ReadCloser struct {
f *os.File f *os.File
Reader Reader
} }
// A File is a single file in a ZIP archive. // A File is a single file in a ZIP archive.
// The file information is in the embedded FileHeader. // The file information is in the embedded [FileHeader].
// The file content can be accessed by calling Open. // The file content can be accessed by calling [File.Open].
type File struct { type File struct {
FileHeader FileHeader
zip *Reader zip *Reader
@ -93,16 +93,16 @@ func OpenReader(name string) (*ReadCloser, error) {
return r, err return r, err
} }
// NewReader returns a new Reader reading from r, which is assumed to // NewReader returns a new [Reader] reading from r, which is assumed to
// have the given size in bytes. // have the given size in bytes.
// //
// If any file inside the archive uses a non-local name // If any file inside the archive uses a non-local name
// (as defined by [filepath.IsLocal]) or a name containing backslashes // (as defined by [filepath.IsLocal]) or a name containing backslashes
// and the GODEBUG environment variable contains `zipinsecurepath=0`, // and the GODEBUG environment variable contains `zipinsecurepath=0`,
// NewReader returns the reader with an ErrInsecurePath error. // NewReader returns the reader with an [ErrInsecurePath] error.
// A future version of Go may introduce this behavior by default. // A future version of Go may introduce this behavior by default.
// Programs that want to accept non-local names can ignore // Programs that want to accept non-local names can ignore
// the ErrInsecurePath error and use the returned reader. // the [ErrInsecurePath] error and use the returned reader.
func NewReader(r io.ReaderAt, size int64) (*Reader, error) { func NewReader(r io.ReaderAt, size int64) (*Reader, error) {
if size < 0 { if size < 0 {
return nil, errors.New("zip: size cannot be negative") return nil, errors.New("zip: size cannot be negative")
@ -178,7 +178,7 @@ func (r *Reader) init(rdr io.ReaderAt, size int64) error {
// RegisterDecompressor registers or overrides a custom decompressor for a // RegisterDecompressor registers or overrides a custom decompressor for a
// specific method ID. If a decompressor for a given method is not found, // specific method ID. If a decompressor for a given method is not found,
// Reader will default to looking up the decompressor at the package level. // [Reader] will default to looking up the decompressor at the package level.
func (r *Reader) RegisterDecompressor(method uint16, dcomp Decompressor) { func (r *Reader) RegisterDecompressor(method uint16, dcomp Decompressor) {
if r.decompressors == nil { if r.decompressors == nil {
r.decompressors = make(map[uint16]Decompressor) r.decompressors = make(map[uint16]Decompressor)
@ -202,7 +202,7 @@ func (rc *ReadCloser) Close() error {
// DataOffset returns the offset of the file's possibly-compressed // DataOffset returns the offset of the file's possibly-compressed
// data, relative to the beginning of the zip file. // data, relative to the beginning of the zip file.
// //
// Most callers should instead use Open, which transparently // Most callers should instead use [File.Open], which transparently
// decompresses data and verifies checksums. // decompresses data and verifies checksums.
func (f *File) DataOffset() (offset int64, err error) { func (f *File) DataOffset() (offset int64, err error) {
bodyOffset, err := f.findBodyOffset() bodyOffset, err := f.findBodyOffset()
@ -212,7 +212,7 @@ func (f *File) DataOffset() (offset int64, err error) {
return f.headerOffset + bodyOffset, nil return f.headerOffset + bodyOffset, nil
} }
// Open returns a ReadCloser that provides access to the File's contents. // Open returns a [ReadCloser] that provides access to the [File]'s contents.
// Multiple files may be read concurrently. // Multiple files may be read concurrently.
func (f *File) Open() (io.ReadCloser, error) { func (f *File) Open() (io.ReadCloser, error) {
bodyOffset, err := f.findBodyOffset() bodyOffset, err := f.findBodyOffset()
@ -255,7 +255,7 @@ func (f *File) Open() (io.ReadCloser, error) {
return rc, nil return rc, nil
} }
// OpenRaw returns a Reader that provides access to the File's contents without // OpenRaw returns a [Reader] that provides access to the [File]'s contents without
// decompression. // decompression.
func (f *File) OpenRaw() (io.Reader, error) { func (f *File) OpenRaw() (io.Reader, error) {
bodyOffset, err := f.findBodyOffset() bodyOffset, err := f.findBodyOffset()

View File

@ -19,7 +19,7 @@ import (
type Compressor func(w io.Writer) (io.WriteCloser, error) type Compressor func(w io.Writer) (io.WriteCloser, error)
// A Decompressor returns a new decompressing reader, reading from r. // A Decompressor returns a new decompressing reader, reading from r.
// The ReadCloser's Close method must be used to release associated resources. // The [io.ReadCloser]'s Close method must be used to release associated resources.
// The Decompressor itself must be safe to invoke from multiple goroutines // The Decompressor itself must be safe to invoke from multiple goroutines
// simultaneously, but each returned reader will be used only by // simultaneously, but each returned reader will be used only by
// one goroutine at a time. // one goroutine at a time.
@ -115,7 +115,7 @@ func init() {
} }
// RegisterDecompressor allows custom decompressors for a specified method ID. // RegisterDecompressor allows custom decompressors for a specified method ID.
// The common methods Store and Deflate are built in. // The common methods [Store] and [Deflate] are built in.
func RegisterDecompressor(method uint16, dcomp Decompressor) { func RegisterDecompressor(method uint16, dcomp Decompressor) {
if _, dup := decompressors.LoadOrStore(method, dcomp); dup { if _, dup := decompressors.LoadOrStore(method, dcomp); dup {
panic("decompressor already registered") panic("decompressor already registered")
@ -123,7 +123,7 @@ func RegisterDecompressor(method uint16, dcomp Decompressor) {
} }
// RegisterCompressor registers custom compressors for a specified method ID. // RegisterCompressor registers custom compressors for a specified method ID.
// The common methods Store and Deflate are built in. // The common methods [Store] and [Deflate] are built in.
func RegisterCompressor(method uint16, comp Compressor) { func RegisterCompressor(method uint16, comp Compressor) {
if _, dup := compressors.LoadOrStore(method, comp); dup { if _, dup := compressors.LoadOrStore(method, comp); dup {
panic("compressor already registered") panic("compressor already registered")

View File

@ -160,12 +160,12 @@ type FileHeader struct {
ExternalAttrs uint32 // Meaning depends on CreatorVersion ExternalAttrs uint32 // Meaning depends on CreatorVersion
} }
// FileInfo returns an fs.FileInfo for the FileHeader. // FileInfo returns an fs.FileInfo for the [FileHeader].
func (h *FileHeader) FileInfo() fs.FileInfo { func (h *FileHeader) FileInfo() fs.FileInfo {
return headerFileInfo{h} return headerFileInfo{h}
} }
// headerFileInfo implements fs.FileInfo. // headerFileInfo implements [fs.FileInfo].
type headerFileInfo struct { type headerFileInfo struct {
fh *FileHeader fh *FileHeader
} }
@ -194,7 +194,7 @@ func (fi headerFileInfo) String() string {
return fs.FormatFileInfo(fi) return fs.FormatFileInfo(fi)
} }
// FileInfoHeader creates a partially-populated FileHeader from an // FileInfoHeader creates a partially-populated [FileHeader] from an
// fs.FileInfo. // fs.FileInfo.
// Because fs.FileInfo's Name method returns only the base name of // Because fs.FileInfo's Name method returns only the base name of
// the file it describes, it may be necessary to modify the Name field // the file it describes, it may be necessary to modify the Name field
@ -273,17 +273,17 @@ func timeToMsDosTime(t time.Time) (fDate uint16, fTime uint16) {
} }
// ModTime returns the modification time in UTC using the legacy // ModTime returns the modification time in UTC using the legacy
// ModifiedDate and ModifiedTime fields. // [ModifiedDate] and [ModifiedTime] fields.
// //
// Deprecated: Use Modified instead. // Deprecated: Use [Modified] instead.
func (h *FileHeader) ModTime() time.Time { func (h *FileHeader) ModTime() time.Time {
return msDosTimeToTime(h.ModifiedDate, h.ModifiedTime) return msDosTimeToTime(h.ModifiedDate, h.ModifiedTime)
} }
// SetModTime sets the Modified, ModifiedTime, and ModifiedDate fields // SetModTime sets the [Modified], [ModifiedTime], and [ModifiedDate] fields
// to the given time in UTC. // to the given time in UTC.
// //
// Deprecated: Use Modified instead. // Deprecated: Use [Modified] instead.
func (h *FileHeader) SetModTime(t time.Time) { func (h *FileHeader) SetModTime(t time.Time) {
t = t.UTC() // Convert to UTC for compatibility t = t.UTC() // Convert to UTC for compatibility
h.Modified = t h.Modified = t
@ -309,7 +309,7 @@ const (
msdosReadOnly = 0x01 msdosReadOnly = 0x01
) )
// Mode returns the permission and mode bits for the FileHeader. // Mode returns the permission and mode bits for the [FileHeader].
func (h *FileHeader) Mode() (mode fs.FileMode) { func (h *FileHeader) Mode() (mode fs.FileMode) {
switch h.CreatorVersion >> 8 { switch h.CreatorVersion >> 8 {
case creatorUnix, creatorMacOSX: case creatorUnix, creatorMacOSX:
@ -323,7 +323,7 @@ func (h *FileHeader) Mode() (mode fs.FileMode) {
return mode return mode
} }
// SetMode changes the permission and mode bits for the FileHeader. // SetMode changes the permission and mode bits for the [FileHeader].
func (h *FileHeader) SetMode(mode fs.FileMode) { func (h *FileHeader) SetMode(mode fs.FileMode) {
h.CreatorVersion = h.CreatorVersion&0xff | creatorUnix<<8 h.CreatorVersion = h.CreatorVersion&0xff | creatorUnix<<8
h.ExternalAttrs = fileModeToUnixMode(mode) << 16 h.ExternalAttrs = fileModeToUnixMode(mode) << 16

View File

@ -41,7 +41,7 @@ type header struct {
raw bool raw bool
} }
// NewWriter returns a new Writer writing a zip file to w. // NewWriter returns a new [Writer] writing a zip file to w.
func NewWriter(w io.Writer) *Writer { func NewWriter(w io.Writer) *Writer {
return &Writer{cw: &countWriter{w: bufio.NewWriter(w)}} return &Writer{cw: &countWriter{w: bufio.NewWriter(w)}}
} }
@ -64,7 +64,7 @@ func (w *Writer) Flush() error {
} }
// SetComment sets the end-of-central-directory comment field. // SetComment sets the end-of-central-directory comment field.
// It can only be called before Close. // It can only be called before [Writer.Close].
func (w *Writer) SetComment(comment string) error { func (w *Writer) SetComment(comment string) error {
if len(comment) > uint16max { if len(comment) > uint16max {
return errors.New("zip: Writer.Comment too long") return errors.New("zip: Writer.Comment too long")
@ -208,14 +208,14 @@ func (w *Writer) Close() error {
} }
// Create adds a file to the zip file using the provided name. // Create adds a file to the zip file using the provided name.
// It returns a Writer to which the file contents should be written. // It returns a [Writer] to which the file contents should be written.
// The file contents will be compressed using the Deflate method. // The file contents will be compressed using the [Deflate] method.
// The name must be a relative path: it must not start with a drive // The name must be a relative path: it must not start with a drive
// letter (e.g. C:) or leading slash, and only forward slashes are // letter (e.g. C:) or leading slash, and only forward slashes are
// allowed. To create a directory instead of a file, add a trailing // allowed. To create a directory instead of a file, add a trailing
// slash to the name. // slash to the name.
// The file's contents must be written to the io.Writer before the next // The file's contents must be written to the [io.Writer] before the next
// call to Create, CreateHeader, or Close. // call to [Writer.Create], [Writer.CreateHeader], or [Writer.Close].
func (w *Writer) Create(name string) (io.Writer, error) { func (w *Writer) Create(name string) (io.Writer, error) {
header := &FileHeader{ header := &FileHeader{
Name: name, Name: name,
@ -262,13 +262,13 @@ func (w *Writer) prepare(fh *FileHeader) error {
return nil return nil
} }
// CreateHeader adds a file to the zip archive using the provided FileHeader // CreateHeader adds a file to the zip archive using the provided [FileHeader]
// for the file metadata. Writer takes ownership of fh and may mutate // for the file metadata. [Writer] takes ownership of fh and may mutate
// its fields. The caller must not modify fh after calling CreateHeader. // its fields. The caller must not modify fh after calling [Writer.CreateHeader].
// //
// This returns a Writer to which the file contents should be written. // This returns a [Writer] to which the file contents should be written.
// The file's contents must be written to the io.Writer before the next // The file's contents must be written to the io.Writer before the next
// call to Create, CreateHeader, CreateRaw, or Close. // call to [Writer.Create], [Writer.CreateHeader], [Writer.CreateRaw], or [Writer.Close].
func (w *Writer) CreateHeader(fh *FileHeader) (io.Writer, error) { func (w *Writer) CreateHeader(fh *FileHeader) (io.Writer, error) {
if err := w.prepare(fh); err != nil { if err := w.prepare(fh); err != nil {
return nil, err return nil, err
@ -427,12 +427,12 @@ func writeHeader(w io.Writer, h *header) error {
return err return err
} }
// CreateRaw adds a file to the zip archive using the provided FileHeader and // CreateRaw adds a file to the zip archive using the provided [FileHeader] and
// returns a Writer to which the file contents should be written. The file's // returns a [Writer] to which the file contents should be written. The file's
// contents must be written to the io.Writer before the next call to Create, // contents must be written to the io.Writer before the next call to [Writer.Create],
// CreateHeader, CreateRaw, or Close. // [Writer.CreateHeader], [Writer.CreateRaw], or [Writer.Close].
// //
// In contrast to CreateHeader, the bytes passed to Writer are not compressed. // In contrast to [Writer.CreateHeader], the bytes passed to Writer are not compressed.
func (w *Writer) CreateRaw(fh *FileHeader) (io.Writer, error) { func (w *Writer) CreateRaw(fh *FileHeader) (io.Writer, error) {
if err := w.prepare(fh); err != nil { if err := w.prepare(fh); err != nil {
return nil, err return nil, err
@ -464,7 +464,7 @@ func (w *Writer) CreateRaw(fh *FileHeader) (io.Writer, error) {
return fw, nil return fw, nil
} }
// Copy copies the file f (obtained from a Reader) into w. It copies the raw // Copy copies the file f (obtained from a [Reader]) into w. It copies the raw
// form directly bypassing decompression, compression, and validation. // form directly bypassing decompression, compression, and validation.
func (w *Writer) Copy(f *File) error { func (w *Writer) Copy(f *File) error {
r, err := f.OpenRaw() r, err := f.OpenRaw()
@ -480,7 +480,7 @@ func (w *Writer) Copy(f *File) error {
} }
// RegisterCompressor registers or overrides a custom compressor for a specific // RegisterCompressor registers or overrides a custom compressor for a specific
// method ID. If a compressor for a given method is not found, Writer will // method ID. If a compressor for a given method is not found, [Writer] will
// default to looking up the compressor at the package level. // default to looking up the compressor at the package level.
func (w *Writer) RegisterCompressor(method uint16, comp Compressor) { func (w *Writer) RegisterCompressor(method uint16, comp Compressor) {
if w.compressors == nil { if w.compressors == nil {