mirror of
https://github.com/aptly-dev/aptly.git
synced 2026-06-05 05:20:34 +00:00
fad660450c
When a publishing uses a publish prefix, instead of listing the contents of the whole bucket under the storage prefix, only list the contents of the bucket under the storage prefix and publish prefix, and cache it by publish prefix. This speeds up publish operations under a prefix.
178 lines
7.3 KiB
Go
178 lines
7.3 KiB
Go
// Package aptly provides common infrastructure that doesn't depend directly on
|
|
// Debian or CentOS
|
|
package aptly
|
|
|
|
import (
|
|
"context"
|
|
"io"
|
|
"os"
|
|
|
|
"github.com/aptly-dev/aptly/database"
|
|
"github.com/aptly-dev/aptly/utils"
|
|
)
|
|
|
|
// ReadSeekerCloser = ReadSeeker + Closer
|
|
type ReadSeekerCloser interface {
|
|
io.ReadSeeker
|
|
io.Closer
|
|
}
|
|
|
|
// PackagePool is asbtraction of package pool storage.
|
|
//
|
|
// PackagePool stores all the package files, deduplicating them.
|
|
type PackagePool interface {
|
|
// Verify checks whether file exists in the pool and fills back checksum info
|
|
//
|
|
// if poolPath is empty, poolPath is generated automatically based on checksum info (if available)
|
|
// in any case, if function returns true, it also fills back checksums with complete information about the file in the pool
|
|
Verify(poolPath, basename string, checksums *utils.ChecksumInfo, checksumStorage ChecksumStorage) (string, bool, error)
|
|
// Import copies file into package pool
|
|
//
|
|
// - srcPath is full path to source file as it is now
|
|
// - basename is desired human-readable name (canonical filename)
|
|
// - checksums are used to calculate file placement
|
|
// - move indicates whether srcPath can be removed
|
|
Import(srcPath, basename string, checksums *utils.ChecksumInfo, move bool, storage ChecksumStorage) (path string, err error)
|
|
// LegacyPath returns legacy (pre 1.1) path to package file (relative to root)
|
|
LegacyPath(filename string, checksums *utils.ChecksumInfo) (string, error)
|
|
// Stat returns Unix stat(2) info
|
|
Stat(path string) (os.FileInfo, error)
|
|
// Open returns ReadSeekerCloser to access the file
|
|
Open(path string) (ReadSeekerCloser, error)
|
|
// FilepathList returns file paths of all the files in the pool
|
|
FilepathList(progress Progress) ([]string, error)
|
|
// Remove deletes file in package pool returns its size
|
|
Remove(path string) (size int64, err error)
|
|
}
|
|
|
|
// LocalPackagePool is implemented by PackagePools residing on the same filesystem
|
|
type LocalPackagePool interface {
|
|
// GenerateTempPath generates temporary path for download (which is fast to import into package pool later on)
|
|
GenerateTempPath(filename string) (string, error)
|
|
// Link generates hardlink to destination path
|
|
Link(path, dstPath string) error
|
|
// Symlink generates symlink to destination path
|
|
Symlink(path, dstPath string) error
|
|
// FullPath generates full path to the file in pool
|
|
//
|
|
// Please use with care: it's not supposed to be used to access files
|
|
FullPath(path string) string
|
|
}
|
|
|
|
// PublishedStorage is abstraction of filesystem storing all published repositories
|
|
type PublishedStorage interface {
|
|
// MkDir creates directory recursively under public path
|
|
MkDir(path string) error
|
|
// PutFile puts file into published storage at specified path
|
|
PutFile(path string, sourceFilename string) error
|
|
// RemoveDirs removes directory structure under public path
|
|
RemoveDirs(path string, progress Progress) error
|
|
// Remove removes single file under public path
|
|
Remove(path string) error
|
|
// LinkFromPool links package file from pool to dist's pool location
|
|
LinkFromPool(publishedPrefix, publishedRelPath, fileName string, sourcePool PackagePool, sourcePath string, sourceChecksums utils.ChecksumInfo, force bool) error
|
|
// Filelist returns list of files under prefix
|
|
Filelist(prefix string) ([]string, error)
|
|
// RenameFile renames (moves) file
|
|
RenameFile(oldName, newName string) error
|
|
// SymLink creates a symbolic link, which can be read with ReadLink
|
|
SymLink(src string, dst string) error
|
|
// HardLink creates a hardlink of a file
|
|
HardLink(src string, dst string) error
|
|
// FileExists returns true if path exists
|
|
FileExists(path string) (bool, error)
|
|
// ReadLink returns the symbolic link pointed to by path
|
|
ReadLink(path string) (string, error)
|
|
}
|
|
|
|
// FileSystemPublishedStorage is published storage on filesystem
|
|
type FileSystemPublishedStorage interface {
|
|
// PublicPath returns root of public part
|
|
PublicPath() string
|
|
}
|
|
|
|
// PublishedStorageProvider is a thing that returns PublishedStorage by name
|
|
type PublishedStorageProvider interface {
|
|
// GetPublishedStorage returns PublishedStorage by name
|
|
GetPublishedStorage(name string) PublishedStorage
|
|
}
|
|
|
|
// BarType used to differentiate between different progress bars
|
|
type BarType int
|
|
|
|
const (
|
|
// BarGeneralBuildPackageList identifies bar for building package list
|
|
BarGeneralBuildPackageList BarType = iota
|
|
// BarGeneralVerifyDependencies identifies bar for verifying dependencies
|
|
BarGeneralVerifyDependencies
|
|
// BarGeneralBuildFileList identifies bar for building file list
|
|
BarGeneralBuildFileList
|
|
// BarCleanupBuildList identifies bar for building list to cleanup
|
|
BarCleanupBuildList
|
|
// BarCleanupDeleteUnreferencedFiles identifies bar for deleting unreferenced files
|
|
BarCleanupDeleteUnreferencedFiles
|
|
// BarMirrorUpdateDownloadIndexes identifies bar for downloading index files
|
|
BarMirrorUpdateDownloadIndexes
|
|
// BarMirrorUpdateDownloadPackages identifies bar for downloading packages
|
|
BarMirrorUpdateDownloadPackages
|
|
// BarMirrorUpdateBuildPackageList identifies bar for building package list of downloaded files
|
|
BarMirrorUpdateBuildPackageList
|
|
// BarMirrorUpdateImportFiles identifies bar for importing package files
|
|
BarMirrorUpdateImportFiles
|
|
// BarMirrorUpdateFinalizeDownload identifies bar for finalizing downloads
|
|
BarMirrorUpdateFinalizeDownload
|
|
// BarPublishGeneratePackageFiles identifies bar for generating package files to publish
|
|
BarPublishGeneratePackageFiles
|
|
// BarPublishFinalizeIndexes identifies bar for finalizing index files
|
|
BarPublishFinalizeIndexes
|
|
)
|
|
|
|
// Progress is a progress displaying entity, it allows progress bars & simple prints
|
|
type Progress interface {
|
|
// Writer interface to support progress bar ticking
|
|
io.Writer
|
|
// Start makes progress start its work
|
|
Start()
|
|
// Shutdown shuts down progress display
|
|
Shutdown()
|
|
// Flush returns when all queued messages are sent
|
|
Flush()
|
|
// InitBar starts progressbar for count bytes or count items
|
|
InitBar(count int64, isBytes bool, barType BarType)
|
|
// ShutdownBar stops progress bar and hides it
|
|
ShutdownBar()
|
|
// AddBar increments progress for progress bar
|
|
AddBar(count int)
|
|
// SetBar sets current position for progress bar
|
|
SetBar(count int)
|
|
// Printf does printf but in safe manner: not overwriting progress bar
|
|
Printf(msg string, a ...interface{})
|
|
// ColoredPrintf does printf in colored way + newline
|
|
ColoredPrintf(msg string, a ...interface{})
|
|
// PrintfStdErr does printf but in safe manner to stderr
|
|
PrintfStdErr(msg string, a ...interface{})
|
|
}
|
|
|
|
// Downloader is parallel HTTP fetcher
|
|
type Downloader interface {
|
|
// Download starts new download task
|
|
Download(ctx context.Context, url string, destination string) error
|
|
// DownloadWithChecksum starts new download task with checksum verification
|
|
DownloadWithChecksum(ctx context.Context, url string, destination string, expected *utils.ChecksumInfo, ignoreMismatch bool) error
|
|
// GetProgress returns Progress object
|
|
GetProgress() Progress
|
|
// GetLength returns size by heading object with url
|
|
GetLength(ctx context.Context, url string) (int64, error)
|
|
}
|
|
|
|
// ChecksumStorageProvider creates ChecksumStorage based on DB
|
|
type ChecksumStorageProvider func(db database.ReaderWriter) ChecksumStorage
|
|
|
|
// ChecksumStorage is stores checksums in some (persistent) storage
|
|
type ChecksumStorage interface {
|
|
// Get finds checksums in DB by path
|
|
Get(path string) (*utils.ChecksumInfo, error)
|
|
// Update adds or updates information about checksum in DB
|
|
Update(path string, c *utils.ChecksumInfo) error
|
|
}
|