diff options
| author | Ophestra <cat@gensokyo.uk> | 2026-09-16 13:56:11 +0900 |
|---|---|---|
| committer | Ophestra <cat@gensokyo.uk> | 2026-09-16 13:57:07 +0900 |
| commit | abab2782c4316a6f14500c38854c427d21fb0423 (patch) | |
| tree | 9acbf54227f1dd1df728327b23e693c97a379f9e /pkg/archive.go | |
| parent | 56572324956cfaa9039f7d7b7885cb3fec22f3fb (diff) | |
pkg: write archive status
Same idea behind the previous change, although this is more often used
by the external cache implementations. This is a revision of the
archiveArtifact to avoid inconsistent state from previously cured
archiveArtifact lacking their status files.
Signed-off-by: Ophestra <cat@gensokyo.uk>
Diffstat (limited to 'pkg/archive.go')
| -rw-r--r-- | pkg/archive.go | 42 |
1 files changed, 41 insertions, 1 deletions
diff --git a/pkg/archive.go b/pkg/archive.go index ea4017d9..e9f76f5b 100644 --- a/pkg/archive.go +++ b/pkg/archive.go @@ -311,8 +311,16 @@ func (a archiveArtifact) Inputs() []Artifact { // IsExclusive returns false: [Reader] is fully sequential. func (archiveArtifact) IsExclusive() bool { return false } +// Revision satisfies [RevisionArtifact] for status behaviour. +func (archiveArtifact) Revision() uint64 { return 0 } + // Cure cures the [Artifact], producing a directory located at work. func (a archiveArtifact) Cure(t *TContext) (err error) { + var status io.Writer + if status, err = t.GetStatusWriter(); err != nil { + return + } + var r io.ReadCloser if r, err = t.Open(a.f); err != nil { return @@ -347,7 +355,9 @@ func (a archiveArtifact) Cure(t *TContext) (err error) { var header *ArchiveHeader ar := NewReader(r) + msg := t.GetMessage() for header, err = ar.Next(); err == nil; header, err = ar.Next() { + var m string if header.Mode.IsRegular() { var f *os.File if f, err = root.OpenFile( @@ -363,18 +373,33 @@ func (a archiveArtifact) Cure(t *TContext) (err error) { } else if err = f.Close(); err != nil { return } + + m = fmt.Sprintf( + "%s %s (%d bytes)", + header.Mode, + header.Path, + header.Size, + ) } else if header.Mode&fs.ModeSymlink != 0 { var p []byte if p, err = io.ReadAll(ar); err != nil { return } + linkname := unsafe.String(unsafe.SliceData(p), len(p)) if err = root.Symlink( - unsafe.String(unsafe.SliceData(p), len(p)), + linkname, header.Path, ); err != nil { return } + + m = fmt.Sprintf( + "%s %s linkname %s", + header.Mode, + header.Path, + linkname, + ) } else if header.Mode.IsDir() { if header.Path == "." { continue @@ -387,9 +412,24 @@ func (a archiveArtifact) Cure(t *TContext) (err error) { if err = root.Mkdir(header.Path, 0700); err != nil { return } + + m = fmt.Sprintf( + "%s %s", + header.Mode, + header.Path, + ) } else { return InvalidFileModeError(header.Mode) } + + if m != "" { + msg.Verbose(m) + if _, err = io.WriteString(status, m); err != nil { + return + } else if _, err = status.Write([]byte{'\n'}); err != nil { + return + } + } } if errors.Is(err, io.EOF) { err = nil |
