Full Mattermost server source with integrated Community Enterprise features. Includes vendor directory for offline/air-gapped builds. Structure: - enterprise-impl/: Enterprise feature implementations - enterprise-community/: Init files that register implementations - enterprise/: Bridge imports (community_imports.go) - vendor/: All dependencies for offline builds Build (online): go build ./cmd/mattermost Build (offline/air-gapped): go build -mod=vendor ./cmd/mattermost 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
117 lines
3.7 KiB
Go
117 lines
3.7 KiB
Go
package archives
|
|
|
|
import (
|
|
"context"
|
|
"io"
|
|
)
|
|
|
|
// Format represents a way of getting data out of something else.
|
|
// A format usually represents compression or an archive (or both).
|
|
type Format interface {
|
|
// Extension returns the conventional file extension for this
|
|
// format.
|
|
Extension() string
|
|
|
|
// MediaType returns the MIME type ("content type") of this
|
|
// format (see RFC 2046).
|
|
MediaType() string
|
|
|
|
// Match returns true if the given name/stream is recognized.
|
|
// One of the arguments is optional: filename might be empty
|
|
// if working with an unnamed stream, or stream might be empty
|
|
// if only working with a file on disk; but both may also be
|
|
// specified. The filename should consist only of the base name,
|
|
// not path components, and is typically used for matching by
|
|
// file extension. However, matching by reading the stream is
|
|
// preferred as it is more accurate. Match reads only as many
|
|
// bytes as needed to determine a match.
|
|
Match(ctx context.Context, filename string, stream io.Reader) (MatchResult, error)
|
|
}
|
|
|
|
// Compression is a compression format with both compress and decompress methods.
|
|
type Compression interface {
|
|
Format
|
|
Compressor
|
|
Decompressor
|
|
}
|
|
|
|
// Archival is an archival format that can create/write archives.
|
|
type Archival interface {
|
|
Format
|
|
Archiver
|
|
Extractor
|
|
}
|
|
|
|
// Extraction is an archival format that extract from (read) archives.
|
|
type Extraction interface {
|
|
Format
|
|
Extractor
|
|
}
|
|
|
|
// Compressor can compress data by wrapping a writer.
|
|
type Compressor interface {
|
|
// OpenWriter wraps w with a new writer that compresses what is written.
|
|
// The writer must be closed when writing is finished.
|
|
OpenWriter(w io.Writer) (io.WriteCloser, error)
|
|
}
|
|
|
|
// Decompressor can decompress data by wrapping a reader.
|
|
type Decompressor interface {
|
|
// OpenReader wraps r with a new reader that decompresses what is read.
|
|
// The reader must be closed when reading is finished.
|
|
OpenReader(r io.Reader) (io.ReadCloser, error)
|
|
}
|
|
|
|
// Archiver can create a new archive.
|
|
type Archiver interface {
|
|
// Archive writes an archive file to output with the given files.
|
|
//
|
|
// Context cancellation must be honored.
|
|
Archive(ctx context.Context, output io.Writer, files []FileInfo) error
|
|
}
|
|
|
|
// ArchiveAsyncJob contains a File to be archived and a channel that
|
|
// the result of the archiving should be returned on.
|
|
// EXPERIMENTAL: Subject to change or removal.
|
|
type ArchiveAsyncJob struct {
|
|
File FileInfo
|
|
Result chan<- error
|
|
}
|
|
|
|
// ArchiverAsync is an Archiver that can also create archives
|
|
// asynchronously by pumping files into a channel as they are
|
|
// discovered.
|
|
// EXPERIMENTAL: Subject to change or removal.
|
|
type ArchiverAsync interface {
|
|
Archiver
|
|
|
|
// Use ArchiveAsync if you can't pre-assemble a list of all
|
|
// the files for the archive. Close the jobs channel after
|
|
// all the files have been sent.
|
|
//
|
|
// This won't return until the channel is closed.
|
|
ArchiveAsync(ctx context.Context, output io.Writer, jobs <-chan ArchiveAsyncJob) error
|
|
}
|
|
|
|
// Extractor can extract files from an archive.
|
|
type Extractor interface {
|
|
// Extract walks entries in the archive and calls handleFile for each
|
|
// entry in the archive.
|
|
//
|
|
// Any files opened in the FileHandler should be closed when it returns,
|
|
// as there is no guarantee the files can be read outside the handler
|
|
// or after the walk has proceeded to the next file.
|
|
//
|
|
// Context cancellation must be honored.
|
|
Extract(ctx context.Context, archive io.Reader, handleFile FileHandler) error
|
|
}
|
|
|
|
// Inserter can insert files into an existing archive.
|
|
// EXPERIMENTAL: Subject to change.
|
|
type Inserter interface {
|
|
// Insert inserts the files into archive.
|
|
//
|
|
// Context cancellation must be honored.
|
|
Insert(ctx context.Context, archive io.ReadWriteSeeker, files []FileInfo) error
|
|
}
|