workspace

package
v0.0.5 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Aug 23, 2026 License: MIT Imports: 20 Imported by: 0

Documentation

Overview

Commit a set of changes, reading the file data they need from a local directory.

Import a directory into a repository without attaching it as a workspace.

Merge changes from the repository into the workspace and vice versa.

Index

Constants

This section is empty.

Variables

View Source
var (
	ErrSourceVanished = lib.Errorf("file vanished while committing")
	ErrSourceModified = lib.Errorf("file was modified while committing")
)
View Source
var (
	ErrUpToDate      = lib.Errorf("workspace is up to date")
	ErrRemoteChanged = lib.Errorf("remote repository has changed during merge")
)
View Source
var ErrSavedPassphraseNotFound = lib.Errorf("saved passphrase not found")
View Source
var ErrSymLinkTargetEscapes = lib.Errorf("symlink target escapes path root")

Functions

func AddFileToRepository

func AddFileToRepository(
	ctx context.Context,
	srcFS lib.FS,
	path lib.Path,
	fileInfo fs.FileInfo,
	repository *lib.Repository,
	entry *lib.RevisionEntry,
	mon CommitMonitor,
) (lib.PathMetadata, error)

Add the file contents to the repository and return the file metadata.

func AddSyncTarget

func AddSyncTarget(ctx context.Context, w *Workspace, name, uri string, passphrase []byte) error

AddSyncTarget registers a new target. Returns an error if `name` is invalid, already present, or if the target's repository config does not match the workspace's source repository (the sync precondition). `passphrase` is forwarded to `OpenStorage` so it can decrypt S3 URIs (both `w`'s source URI and the target `uri`). Non-S3 URIs ignore it.

func Cat

func Cat(ctx context.Context, view *lib.RepositoryView, w io.Writer, opts *CatOptions, tmpFS lib.FS) error

Cat writes the contents of a single regular file from the repository to w.

func CommitFiles

func CommitFiles(
	ctx context.Context,
	src *CommitFilesSrc,
	dest *CommitFilesDest,
	opts *CommitFilesOptions,
	tmpFS lib.FS,
) (lib.RevisionId, error)

Commit `src.Files` as a new revision, uploading the file data they need. Return `lib.ErrEmptyCommit` if nothing was left to commit, `lib.ErrHeadChanged` if the repository moved on, and `ErrSourceVanished` or `ErrSourceModified` if the source changed underneath.

func Cp

func Cp(
	ctx context.Context,
	view *lib.RepositoryView,
	targetFS lib.FS,
	opts *CpOptions,
	tmpFS lib.FS,
) error

func DeleteSyncTarget

func DeleteSyncTarget(ctx context.Context, w *Workspace, name string) error

DeleteSyncTarget removes the named target. Returns an error if it isn't registered.

func FixHeadAfterRewrite added in v0.0.4

func FixHeadAfterRewrite(
	ctx context.Context,
	ws *Workspace,
	repository *lib.Repository,
) (from lib.RevisionId, to lib.RevisionId, err error)

Point a workspace at the revision that replaced the one it names, after `check --fix-repo` rewrote every revision of the repository.

The rewrite keeps the same revisions in the same order and leaves the old ones in storage, so the replacement is simply the revision sitting the same distance from the root. That holds whether or not the workspace was up to date, and running it again does nothing, because the second pass counts along the new chain and lands on the same revision.

Temporary, and goes away with the rest of the migration.

func ForceCommit

func ForceCommit(
	ctx context.Context,
	ws *Workspace,
	repository *lib.Repository,
	opts *ForceCommitOptions,
) (lib.RevisionId, error)

Commit all local changes ignoring possible conflicts. Afterwards, merge the repository into the workspace. Return a `lib.EmptyCommit` error if there are no local changes.

func FormatBytes

func FormatBytes(b int64) string

func GetSyncTarget

func GetSyncTarget(ctx context.Context, w *Workspace, name string) (uri string, found bool, err error)

GetSyncTarget looks up a registered target by name. `found` is false if no target with that name is registered.

func Merge

func Merge(ctx context.Context, ws *Workspace, repository *lib.Repository, opts *MergeOptions) (lib.RevisionId, error)

Merge the changes from the repository into the workspace and vice versa. Return a `MergeConflictsError` error if there are conflicts. todo: return new revision id and the local changes.

func NewStagingCacheWriter

func NewStagingCacheWriter(fs lib.FS, maxChunkSize int) *lib.TempWriter[*StagingEntry]

func OpenStorage

func OpenStorage(uri string, passphrase []byte) (lib.Storage, error)

OpenStorage opens a repository storage by URI. `s3+<http-url>` URIs need the repository passphrase to decrypt the embedded credentials. Local paths ignore the passphrase.

func Reset

func Reset(ctx context.Context, ws *Workspace, repository *lib.Repository, opts *ResetOptions) error

Reset the workspace to a specific revision. Return `ResetError` if there are local changes and `opts.Force` is not set.

func RunSync

func RunSync(
	ctx context.Context,
	w *Workspace,
	name string,
	passphrase []byte,
	srcRevisionChain lib.RevisionChain,
	opts RunSyncOpts,
) error

RunSync syncs the workspace's repository to the registered target named `name`. The caller drives multi-target iteration and aggregation.

func StagingCacheKey

func StagingCacheKey(stagingEntry *StagingEntry) lib.PathKey

func StagingEntryPathCompare

func StagingEntryPathCompare(a, b *StagingEntry) int

func ValidatePathPrefix

func ValidatePathPrefix(pathPrefix string) (lib.Path, error)

func ValidateSyncTargetName

func ValidateSyncTargetName(name string) error

ValidateSyncTargetName rejects names that aren't ASCII alphanumeric or '-'.

Types

type CatOptions

type CatOptions struct {
	RevisionId      lib.RevisionId
	SnapshotMonitor lib.RevisionSnapshotMonitor
	Path            lib.Path
}

type CommitFilesDest

type CommitFilesDest struct {
	View *lib.RepositoryView
	// The revision `Files` were computed against, and the parent of the new one.
	// Blocks it already holds are reused instead of read and uploaded again.
	Snapshot *lib.ViewSnapshot
}

The repository the files are committed to, and the revision they are committed onto.

type CommitFilesOptions

type CommitFilesOptions struct {
	Author  string
	Message string
	Monitor CommitMonitor
	// Which metadata differences count as a change. An entry that differs in no
	// other way is left out of the revision.
	RestorableMetadataFlag lib.RestorableMetadataFlag
}

type CommitFilesSrc

type CommitFilesSrc struct {
	Src   lib.FS
	Files *lib.Temp[*lib.RevisionEntry]
}

The files to commit and where their data is read from.

type CommitMonitor

type CommitMonitor interface {
	OnStart(entry *lib.RevisionEntry) error
	// bytesWritten: if nil, the block already existed; otherwise, the total block size (including
	// header) written.
	OnAddBlock(entry *lib.RevisionEntry, blockId lib.BlockId, dataSize int, bytesWritten *int) error
	OnEnd(entry *lib.RevisionEntry) error
	OnBeforeCommit() error
}

type CpMonitor

type CpMonitor interface {
	OnStart(entry *lib.RevisionEntry, targetPath string) error
	OnExists(entry *lib.RevisionEntry, targetPath string) CpOnExists
	OnWrite(entry *lib.RevisionEntry, targetPath string, blockId lib.BlockId, data []byte) error
	OnEnd(entry *lib.RevisionEntry, targetPath string) error
	OnError(entry *lib.RevisionEntry, targetPath string, err error) CpOnError
}

type CpOnError

type CpOnError int
const (
	CpOnErrorIgnore CpOnError = 1
	CpOnErrorAbort  CpOnError = 2
)

type CpOnExists

type CpOnExists int
const (
	CpOnExistsAbort     CpOnExists = 1
	CpOnExistsIgnore    CpOnExists = 2
	CpOnExistsOverwrite CpOnExists = 3
)

type CpOptions

type CpOptions struct {
	RevisionId             lib.RevisionId
	Monitor                CpMonitor
	SnapshotMonitor        lib.RevisionSnapshotMonitor
	Include                *lib.PathInclusionFilter
	Exclude                *lib.PathExclusionFilter
	RestorableMetadataFlag lib.RestorableMetadataFlag
}

type DefaultCommitMonitor

type DefaultCommitMonitor struct {
	StartTime            time.Time
	Paths                int
	RawBytesAdded        int64
	CompressedBytesAdded int64
	RawBytesReused       int64
	// contains filtered or unexported fields
}

func NewDefaultCommitMonitor

func NewDefaultCommitMonitor(
	mode DefaultMonitorMode,
	cancel func() error,
	emit MonitorEmit,
) *DefaultCommitMonitor

func (*DefaultCommitMonitor) OnAddBlock

func (m *DefaultCommitMonitor) OnAddBlock(
	entry *lib.RevisionEntry,
	blockId lib.BlockId,
	dataSize int,
	dataBytesWritten *int,
) error

func (*DefaultCommitMonitor) OnBeforeCommit

func (m *DefaultCommitMonitor) OnBeforeCommit() error

func (*DefaultCommitMonitor) OnEnd

func (m *DefaultCommitMonitor) OnEnd(entry *lib.RevisionEntry) error

func (*DefaultCommitMonitor) OnStart

func (m *DefaultCommitMonitor) OnStart(entry *lib.RevisionEntry) error

func (*DefaultCommitMonitor) Preparing

func (m *DefaultCommitMonitor) Preparing()

Preparing emits a placeholder while an operation stays silent before its first real output.

type DefaultCpMonitor

type DefaultCpMonitor struct {
	StartTime    time.Time
	Paths        int
	Excluded     int
	BytesWritten int64
	Errors       int
	// contains filtered or unexported fields
}

func NewDefaultCpMonitor

func NewDefaultCpMonitor(
	mode DefaultMonitorMode,
	cancel func() error,
	emit MonitorEmit,
	cpOnExists CpOnExists,
	ignoreErrors bool,
) *DefaultCpMonitor

func (*DefaultCpMonitor) OnEnd

func (m *DefaultCpMonitor) OnEnd(entry *lib.RevisionEntry, targetPath string) error

func (*DefaultCpMonitor) OnError

func (m *DefaultCpMonitor) OnError(entry *lib.RevisionEntry, targetPath string, err error) CpOnError

func (*DefaultCpMonitor) OnExists

func (m *DefaultCpMonitor) OnExists(entry *lib.RevisionEntry, targetPath string) CpOnExists

func (*DefaultCpMonitor) OnStart

func (m *DefaultCpMonitor) OnStart(entry *lib.RevisionEntry, targetPath string) error

func (*DefaultCpMonitor) OnWrite

func (m *DefaultCpMonitor) OnWrite(
	entry *lib.RevisionEntry,
	targetPath string,
	blockID lib.BlockId,
	data []byte,
) error

func (*DefaultCpMonitor) Preparing

func (m *DefaultCpMonitor) Preparing()

Preparing emits a placeholder while an operation stays silent before its first real output.

type DefaultHealthCheckMonitor

type DefaultHealthCheckMonitor struct {
	StartTime      time.Time
	EndTime        time.Time
	Revisions      int
	Paths          int
	Blocks         int
	BlockBytes     int64
	OrphanedBlocks []lib.BlockId
	// contains filtered or unexported fields
}

func NewDefaultHealthCheckMonitor

func NewDefaultHealthCheckMonitor(mode DefaultMonitorMode, emit MonitorEmit) *DefaultHealthCheckMonitor

func (*DefaultHealthCheckMonitor) Duration

func (m *DefaultHealthCheckMonitor) Duration() time.Duration

func (*DefaultHealthCheckMonitor) Finish

func (m *DefaultHealthCheckMonitor) Finish()

func (*DefaultHealthCheckMonitor) OnBlockVerified

func (m *DefaultHealthCheckMonitor) OnBlockVerified(blockID lib.BlockId, length int)

func (*DefaultHealthCheckMonitor) OnOrphanedBlock

func (m *DefaultHealthCheckMonitor) OnOrphanedBlock(blockID lib.BlockId)

func (*DefaultHealthCheckMonitor) OnRevisionEntry

func (m *DefaultHealthCheckMonitor) OnRevisionEntry(entry *lib.RevisionEntry)

func (*DefaultHealthCheckMonitor) OnRevisionStart

func (m *DefaultHealthCheckMonitor) OnRevisionStart(revisionID lib.RevisionId)

func (*DefaultHealthCheckMonitor) Preparing

func (m *DefaultHealthCheckMonitor) Preparing()

Preparing emits a placeholder while an operation stays silent before its first real output.

func (*DefaultHealthCheckMonitor) Report

func (m *DefaultHealthCheckMonitor) Report(
	checkedBlocks bool,
	checkedOrphanedBlocks bool,
	orphanedBlocksFile string,
) (string, error)

type DefaultMonitorMode

type DefaultMonitorMode int
const (
	DefaultMonitorModeSilent DefaultMonitorMode = iota
	DefaultMonitorModeProgress
	DefaultMonitorModeVerbose
)

type DefaultRevisionSnapshotMonitor

type DefaultRevisionSnapshotMonitor struct {
	Revisions int
	Entries   int
	// contains filtered or unexported fields
}

func NewDefaultRevisionSnapshotMonitor

func NewDefaultRevisionSnapshotMonitor(mode DefaultMonitorMode, emit MonitorEmit) *DefaultRevisionSnapshotMonitor

func (*DefaultRevisionSnapshotMonitor) OnRevisionEntry

func (m *DefaultRevisionSnapshotMonitor) OnRevisionEntry(entry *lib.RevisionEntry)

func (*DefaultRevisionSnapshotMonitor) OnRevisionStart

func (m *DefaultRevisionSnapshotMonitor) OnRevisionStart(revisionId lib.RevisionId)

func (*DefaultRevisionSnapshotMonitor) Preparing

func (m *DefaultRevisionSnapshotMonitor) Preparing()

Preparing emits a placeholder while an operation stays silent before its first real output.

type DefaultStagingMonitor

type DefaultStagingMonitor struct {
	StartTime      time.Time
	Paths          int
	Excluded       int
	TotalFileSizes int64
	// contains filtered or unexported fields
}

func NewDefaultStagingMonitor

func NewDefaultStagingMonitor(
	mode DefaultMonitorMode,
	cancel func() error,
	emit MonitorEmit,
) *DefaultStagingMonitor

func (*DefaultStagingMonitor) OnEnd

func (m *DefaultStagingMonitor) OnEnd(path lib.Path, excluded bool, metadata *lib.PathMetadata) error

func (*DefaultStagingMonitor) OnStart

func (m *DefaultStagingMonitor) OnStart(path lib.Path, dirEntry fs.DirEntry) error

func (*DefaultStagingMonitor) Preparing

func (m *DefaultStagingMonitor) Preparing()

Preparing emits a placeholder while an operation stays silent before its first real output.

type DefaultSyncRepoMonitor

type DefaultSyncRepoMonitor struct {
	TargetName string
	StartTime  time.Time
	SrcBlocks  int
	DstBlocks  int
	Blocks     int
	Bytes      int64
	// contains filtered or unexported fields
}

func NewDefaultSyncRepoMonitor

func NewDefaultSyncRepoMonitor(mode DefaultMonitorMode, emit MonitorEmit, targetName string) *DefaultSyncRepoMonitor

func (*DefaultSyncRepoMonitor) OnBeforeCopy

func (m *DefaultSyncRepoMonitor) OnBeforeCopy(srcBlocks, dstBlocks int)

func (*DefaultSyncRepoMonitor) OnBeforeUpdateDstHead

func (m *DefaultSyncRepoMonitor) OnBeforeUpdateDstHead(newHead lib.RevisionId)

func (*DefaultSyncRepoMonitor) OnCopyBlock

func (m *DefaultSyncRepoMonitor) OnCopyBlock(blockID lib.BlockId, existed bool, length int)

func (*DefaultSyncRepoMonitor) OnDstBlockIdsRead

func (m *DefaultSyncRepoMonitor) OnDstBlockIdsRead(blocksTotal int)

func (*DefaultSyncRepoMonitor) OnSrcBlockIdsRead

func (m *DefaultSyncRepoMonitor) OnSrcBlockIdsRead(blocksTotal int)

func (*DefaultSyncRepoMonitor) Preparing

func (m *DefaultSyncRepoMonitor) Preparing()

type ForceCommitOptions

type ForceCommitOptions struct {
	MergeOptions
}

type Import

type Import struct {
	Changes StatusFiles
	// contains filtered or unexported fields
}

func NewImport

func NewImport(
	ctx context.Context,
	view *lib.RepositoryView,
	src lib.FS,
	opts *ImportOptions,
	tmpFS lib.FS,
) (*Import, error)

Scan `src` and compute the changes `Commit` would write to the repository. Nothing is written until `Commit` is called.

func (*Import) Commit

func (i *Import) Commit(ctx context.Context, info *lib.CommitInfo) (lib.RevisionId, error)

Commit the changes as a new revision. Return `lib.ErrEmptyCommit` if there is nothing to commit and `lib.ErrHeadChanged` if the repository moved on since the scan.

type ImportOptions

type ImportOptions struct {
	// The directory in the view that receives the contents of the source.
	Dest                   lib.Path
	Include                *lib.PathInclusionFilter
	Exclude                *lib.PathExclusionFilter
	StagingMonitor         StagingEntryMonitor
	CommitMonitor          CommitMonitor
	SnapshotMonitor        lib.RevisionSnapshotMonitor
	RestorableMetadataFlag lib.RestorableMetadataFlag
}

type LogOptions

type LogOptions struct {
	// Either filter drops a revision that has no path left after filtering.
	Include *lib.PathInclusionFilter
	Exclude *lib.PathExclusionFilter
	Status  bool
	// Range is not validated against the repository:
	// a Range.Until not in the repository fails when its revision is read,
	// and a Range.Since not in the repository is never reached, so the log
	// runs to the root.
	Range lib.RevisionRange
}

type LsFile

type LsFile struct {
	Path     lib.Path
	Metadata lib.PathMetadata
}

func Ls

func Ls(ctx context.Context, view *lib.RepositoryView, tmpFS lib.FS, opts *LsOptions) ([]LsFile, error)

func (*LsFile) Format

func (f *LsFile) Format(format *LsFormat) string

func (*LsFile) String

func (f *LsFile) String() string

type LsFormat

type LsFormat struct {
	FullPath bool
	FullMode bool
	FileHash bool
	// A `time.Format` string or one of the special values "relative", "unix", or "unix-fraction".
	TimestampFormat   string
	HumanReadableSize bool
}

type LsOptions

type LsOptions struct {
	RevisionId      lib.RevisionId
	SnapshotMonitor lib.RevisionSnapshotMonitor
	Include         *lib.PathInclusionFilter
	Exclude         *lib.PathExclusionFilter
	// Maximum number of path segments to list, 0 means unlimited.
	Depth int
}

type MergeConflict

type MergeConflict struct {
	WorkspaceEntry  *lib.RevisionEntry
	RepositoryEntry *lib.RevisionEntry
}

type MergeConflictsError

type MergeConflictsError []MergeConflict

func (MergeConflictsError) Error

func (mc MergeConflictsError) Error() string

type MergeOptions

type MergeOptions struct {
	StagingMonitor         StagingEntryMonitor
	CpMonitor              CpMonitor
	CommitMonitor          CommitMonitor
	SnapshotMonitor        lib.RevisionSnapshotMonitor
	Author                 string
	Message                string
	RestorableMetadataFlag lib.RestorableMetadataFlag
	UseStagingCache        bool
}

type Merger

type Merger struct {
	// contains filtered or unexported fields
}

type MonitorEmit

type MonitorEmit func(text string)

type RemoteRepository

type RemoteRepository string

type ResetError

type ResetError struct {
	LocalChanges *lib.RevisionEntryCache
}

func (ResetError) Error

func (e ResetError) Error() string

type ResetOptions

type ResetOptions struct {
	RevisionId             lib.RevisionId
	Force                  bool
	StagingMonitor         StagingEntryMonitor
	CpMonitor              CpMonitor
	SnapshotMonitor        lib.RevisionSnapshotMonitor
	RestorableMetadataFlag lib.RestorableMetadataFlag
	UseStagingCache        bool
}

type RevisionLog

type RevisionLog struct {
	RevisionId lib.RevisionId
	Revision   lib.Revision
	Files      []StatusFile
	// How many paths the revision holds, including the ones the view hides
	// and the ones Include and Exclude drop.
	TotalFiles int
}

func Log

func Log(
	ctx context.Context,
	view *lib.RepositoryView,
	opts *LogOptions,
) ([]RevisionLog, error)

A view deliberately does not hide revisions that touched nothing inside it, because history is global: revision ids, `~<n>`, and ranges all address the whole chain.

func (*RevisionLog) Long

func (l *RevisionLog) Long() string

Return the log in long format (a bit like `git log`).

Revision: 54601297f7a5003df8a4be36f4298c03dd2f90d1 Author: pero Date: Tue, 13 May 2025 12:16:16 CEST

Commit message

func (*RevisionLog) Short

func (l *RevisionLog) Short() string

Return the log in short format.

<RevisionId> <Date> <Message>

type RunSyncOpts

type RunSyncOpts struct {
	Monitor       lib.RepositorySyncMonitor
	Workers       int
	SkipHeadCheck bool
}

RunSyncOpts holds the tunable options for `RunSync`.

type Staging

type Staging struct {
	Include *lib.PathInclusionFilter
	Exclude *lib.PathExclusionFilter
	// contains filtered or unexported fields
}

func NewStaging

func NewStaging(
	src lib.FS,
	include *lib.PathInclusionFilter,
	exclude *lib.PathExclusionFilter,
	cache *StagingCache,
	tmp lib.FS,
	mon StagingEntryMonitor,
) (*Staging, error)

Build a `Staging` from the `src` directory. `.cling` is always ignored, and stale `.cling_sync_tmp_*` files left by an interrupted restore are deleted. A nil `cache` scans without reading or writing a staging cache, so nothing else in `src` is written.

func (*Staging) Finalize

func (s *Staging) Finalize() (*lib.Temp[*StagingEntry], error)

func (*Staging) MergeWithSnapshot

func (s *Staging) MergeWithSnapshot(
	snapshot *lib.ViewSnapshot,
	restorableMetadataFlag lib.RestorableMetadataFlag,
	suppressDeletes bool,
) (*lib.Temp[*lib.RevisionEntry], error)

Merge the staging snapshot with the revision snapshot. The resulting `RevisionTemp` will contain all entries that transition from the revision snapshot to the staging snapshot. If `suppressDeletes` is `true`, paths that are in the revision snapshot but not in staging do not produce `Delete` entries. Used when the diff baseline is the repository head rather than the workspace head (attach-non-empty).

type StagingCache

type StagingCache struct {
	// contains filtered or unexported fields
}

func NewStagingCache

func NewStagingCache(src lib.FS, useCache bool) (*StagingCache, error)

func (*StagingCache) Cleanup

func (c *StagingCache) Cleanup() error

Remove the current and all temp cache directories if they are alder than one day.

func (*StagingCache) Finalize

func (c *StagingCache) Finalize() error

func (*StagingCache) Handle

func (c *StagingCache) Handle(localPath lib.Path, fileInfo fs.FileInfo) (*StagingEntry, error)

Return the metadata either from the cache or compute it. Update the cache.

type StagingEntry

type StagingEntry struct {
	Path     lib.Path
	Metadata lib.PathMetadata
	Ctime    lib.Timestamp
	Size     int64
	Inode    uint64
}

func NewStagingEntry

func NewStagingEntry(
	path lib.Path,
	fileInfo fs.FileInfo,
	fileSize int64,
	fileHash lib.Sha256,
	blockIds []lib.BlockId,
) (*StagingEntry, error)

func UnmarshallStagingEntry

func UnmarshallStagingEntry(r *lib.ProtobufReader) (*StagingEntry, error)

func (*StagingEntry) HasChanged

func (e *StagingEntry) HasChanged(other *StagingEntry) bool

func (*StagingEntry) Marshall

func (o *StagingEntry) Marshall(w lib.ProtobufWriter) error

func (*StagingEntry) MarshallSize

func (o *StagingEntry) MarshallSize() int

func (*StagingEntry) Validate

func (o *StagingEntry) Validate() error

type StagingEntryCache added in v0.0.4

type StagingEntryCache = lib.TempCache[*StagingEntry, lib.PathKey]

func OpenStagingCache

func OpenStagingCache(fs lib.FS, maxChunksInCache int) (*StagingEntryCache, error)

type StagingEntryChunk

type StagingEntryChunk struct {
	Entries []*StagingEntry
}

func UnmarshallStagingEntryChunk

func UnmarshallStagingEntryChunk(r *lib.ProtobufReader) (*StagingEntryChunk, error)

func (*StagingEntryChunk) Marshall

func (o *StagingEntryChunk) Marshall(w lib.ProtobufWriter) error

func (*StagingEntryChunk) MarshallSize

func (o *StagingEntryChunk) MarshallSize() int

func (*StagingEntryChunk) Validate

func (o *StagingEntryChunk) Validate() error

type StagingEntryMonitor

type StagingEntryMonitor interface {
	OnStart(path lib.Path, dirEntry fs.DirEntry) error
	OnEnd(path lib.Path, excluded bool, metadata *lib.PathMetadata) error
}

type StatusFile

type StatusFile struct {
	Path     lib.Path
	Kind     lib.RevisionEntryKind
	Metadata lib.PathMetadata
}

func (StatusFile) Format

func (f StatusFile) Format() string

type StatusFiles

type StatusFiles []StatusFile

func Status

func Status(
	ctx context.Context,
	ws *Workspace,
	repository *lib.Repository,
	opts *StatusOptions,
	tmpFS lib.FS,
) (StatusFiles, error)

func (StatusFiles) Summary

func (s StatusFiles) Summary() string

type StatusOptions

type StatusOptions struct {
	Include                *lib.PathInclusionFilter
	Exclude                *lib.PathExclusionFilter
	Monitor                StagingEntryMonitor
	SnapshotMonitor        lib.RevisionSnapshotMonitor
	RestorableMetadataFlag lib.RestorableMetadataFlag
	UseStagingCache        bool
}

type SyncTarget

type SyncTarget struct {
	Name string
	URI  string
}

SyncTarget is one registered sync destination.

func LoadSyncTargets

func LoadSyncTargets(ctx context.Context, w *Workspace) ([]SyncTarget, error)

LoadSyncTargets returns the workspace's registered sync targets sorted by name.

type TestCommitMonitor

type TestCommitMonitor struct {
	OnStartCalls    []*lib.RevisionEntry
	OnAddBlockCalls []*lib.RevisionEntry
	OnEndCalls      []*lib.RevisionEntry
}

func (*TestCommitMonitor) OnAddBlock

func (m *TestCommitMonitor) OnAddBlock(
	entry *lib.RevisionEntry,
	blockId lib.BlockId,
	dataSize int,
	dataBytesWritten *int,
) error

func (*TestCommitMonitor) OnBeforeCommit

func (m *TestCommitMonitor) OnBeforeCommit() error

func (*TestCommitMonitor) OnEnd

func (m *TestCommitMonitor) OnEnd(entry *lib.RevisionEntry) error

func (*TestCommitMonitor) OnStart

func (m *TestCommitMonitor) OnStart(entry *lib.RevisionEntry) error

type TestCpMonitor

type TestCpMonitor struct {
	Exists        CpOnExists
	OnStartCalls  []*lib.RevisionEntry
	OnWriteCalls  []*lib.RevisionEntry
	OnExistsCalls []*lib.RevisionEntry
	OnEndCalls    []*lib.RevisionEntry
	OnErrorCalls  []*lib.RevisionEntry
}

func NewTestCpMonitor

func NewTestCpMonitor(exists CpOnExists) *TestCpMonitor

func (*TestCpMonitor) OnEnd

func (m *TestCpMonitor) OnEnd(entry *lib.RevisionEntry, targetPath string) error

func (*TestCpMonitor) OnError

func (m *TestCpMonitor) OnError(entry *lib.RevisionEntry, targetPath string, err error) CpOnError

func (*TestCpMonitor) OnExists

func (m *TestCpMonitor) OnExists(entry *lib.RevisionEntry, targetPath string) CpOnExists

func (*TestCpMonitor) OnStart

func (m *TestCpMonitor) OnStart(entry *lib.RevisionEntry, targetPath string) error

func (*TestCpMonitor) OnWrite

func (m *TestCpMonitor) OnWrite(entry *lib.RevisionEntry, targetPath string, blockId lib.BlockId, data []byte) error

type TestStagingEntryInfo

type TestStagingEntryInfo struct {
	Path string
	Mode fs.FileMode
	Hash lib.Sha256
}

type TestStagingMonitor

type TestStagingMonitor struct{}

func (*TestStagingMonitor) Close

func (m *TestStagingMonitor) Close()

func (*TestStagingMonitor) OnEnd

func (m *TestStagingMonitor) OnEnd(path lib.Path, excluded bool, metadata *lib.PathMetadata) error

func (*TestStagingMonitor) OnStart

func (m *TestStagingMonitor) OnStart(path lib.Path, dirEntry fs.DirEntry) error

type TestWorkspace

type TestWorkspace struct {
	*Workspace
	*lib.TestFS
	// contains filtered or unexported fields
}

func (*TestWorkspace) Head

func (w *TestWorkspace) Head() lib.RevisionId

type Workspace

type Workspace struct {
	RemoteRepository RemoteRepository
	PathPrefix       lib.Path
	Storage          lib.Storage
	FS               lib.FS
	TempFS           lib.FS
}

func NewWorkspace

func NewWorkspace(
	ctx context.Context,
	fs lib.FS,
	tempFS lib.FS,
	remoteRepository RemoteRepository,
	pathPrefix lib.Path,
) (*Workspace, error)

Create a new workspace. Workspaces can be nested, i.e. a workspace can be inside another workspace.

func OpenWorkspace

func OpenWorkspace(ctx context.Context, fs lib.FS, tempFS lib.FS) (*Workspace, error)

Load the configuration from `<fs>/.cling/workspace.txt`.

func (*Workspace) Close

func (w *Workspace) Close() error

Remove `w.TempFS`.

func (*Workspace) DeleteSavedPassphrase

func (w *Workspace) DeleteSavedPassphrase(ctx context.Context) error

func (*Workspace) HasSavedPassphrase

func (w *Workspace) HasSavedPassphrase(ctx context.Context) bool

func (*Workspace) Head

func (w *Workspace) Head(ctx context.Context) (lib.RevisionId, error)

func (*Workspace) ReadSavedPassphrase

func (w *Workspace) ReadSavedPassphrase(ctx context.Context, cipher cryptoCipher.AEAD) ([]byte, error)

func (*Workspace) View added in v0.0.5

func (w *Workspace) View(repository *lib.Repository) *lib.RepositoryView

The repository as this workspace sees it.

func (*Workspace) WriteSavedPassphrase

func (w *Workspace) WriteSavedPassphrase(ctx context.Context, passphrase []byte, cipher cryptoCipher.AEAD) error

WriteSavedPassphrase AEAD-encrypts `passphrase` with `cipher` and stores the ciphertext as a workspace control file. The encryption key (which `cipher` was built from) is meant to live in the system keychain; the two-layer scheme means neither alone unlocks the repository.

type WorkspaceTestData

type WorkspaceTestData struct{}

func (WorkspaceTestData) CommitFilesOptions

func (wstd WorkspaceTestData) CommitFilesOptions() *CommitFilesOptions

func (WorkspaceTestData) CommitMonitor

func (wstd WorkspaceTestData) CommitMonitor() *TestCommitMonitor

func (WorkspaceTestData) CpMonitor

func (wstd WorkspaceTestData) CpMonitor() *TestCpMonitor

func (WorkspaceTestData) CpMonitorOverwrite

func (wstd WorkspaceTestData) CpMonitorOverwrite() *TestCpMonitor

func (WorkspaceTestData) CpOptions

func (wstd WorkspaceTestData) CpOptions(revisionId lib.RevisionId) *CpOptions

func (WorkspaceTestData) ImportOptions

func (wstd WorkspaceTestData) ImportOptions(dest lib.Path) *ImportOptions

func (WorkspaceTestData) LsOptions

func (wstd WorkspaceTestData) LsOptions(revisionId lib.RevisionId) *LsOptions

func (WorkspaceTestData) MergeOptions

func (wstd WorkspaceTestData) MergeOptions() *MergeOptions

func (WorkspaceTestData) NewTestWorkspace

func (wstd WorkspaceTestData) NewTestWorkspace(tb testing.TB, repository *lib.Repository) *TestWorkspace

func (WorkspaceTestData) NewTestWorkspaceExtra

func (wstd WorkspaceTestData) NewTestWorkspaceExtra(
	tb testing.TB,
	repository *lib.Repository,
	pathPrefix string,
	fs lib.FS,
) *TestWorkspace

func (WorkspaceTestData) NewTestWorkspaceWithPathPrefix

func (wstd WorkspaceTestData) NewTestWorkspaceWithPathPrefix(
	tb testing.TB,
	repository *lib.Repository,
	pathPrefix string,
) *TestWorkspace

func (WorkspaceTestData) ResetOptions

func (wstd WorkspaceTestData) ResetOptions(revisionId lib.RevisionId, force bool) *ResetOptions

func (WorkspaceTestData) SnapshotMonitor

func (wstd WorkspaceTestData) SnapshotMonitor() *lib.TestRevisionSnapshotMonitor

func (WorkspaceTestData) StagingEntryInfos

func (wstd WorkspaceTestData) StagingEntryInfos(temp *lib.Temp[*StagingEntry]) []TestStagingEntryInfo

func (WorkspaceTestData) StagingMonitor

func (wstd WorkspaceTestData) StagingMonitor() *TestStagingMonitor

func (WorkspaceTestData) StatusOptions

func (wstd WorkspaceTestData) StatusOptions() *StatusOptions

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL