aboutsummaryrefslogtreecommitdiffhomepage
path: root/pkg/archive.go
diff options
context:
space:
mode:
Diffstat (limited to 'pkg/archive.go')
-rw-r--r--pkg/archive.go42
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