diff --git a/cmd/stbak/cmd/index.go b/cmd/stbak/cmd/index.go index da0fec9..4e729ae 100644 --- a/cmd/stbak/cmd/index.go +++ b/cmd/stbak/cmd/index.go @@ -11,6 +11,7 @@ import ( "github.com/pojntfx/stfs/pkg/controllers" "github.com/pojntfx/stfs/pkg/converters" "github.com/pojntfx/stfs/pkg/counters" + models "github.com/pojntfx/stfs/pkg/db/sqlite/models/metadata" "github.com/pojntfx/stfs/pkg/formatting" "github.com/pojntfx/stfs/pkg/pax" "github.com/pojntfx/stfs/pkg/persisters" @@ -263,26 +264,50 @@ func indexHeader(record, block int64, hdr *tar.Header, metadataPersister *persis return err } case pax.STFSRecordActionUpdate: - if hdr.PAXRecords[pax.STFSRecordReplacesContent] == pax.STFSRecordReplacesContentTrue { - // Metadata & content update - // TODO: Add implementation - return pax.ErrUnsupportedAction - } else if _, ok := hdr.PAXRecords[pax.STFSRecordReplacesName]; ok { - // Move header; do not update metadata - if err := metadataPersister.MoveHeader(context.Background(), hdr.PAXRecords[pax.STFSRecordReplacesName], hdr.Name); err != nil { - return err - } - } else { - // Metadata-only update - dbhdr, err := converters.TarHeaderToDBHeader(record, block, hdr) - if err != nil { - return err + moveAfterEdits := false + oldName := hdr.Name + if _, ok := hdr.PAXRecords[pax.STFSRecordReplacesName]; ok { + moveAfterEdits = true + oldName = hdr.PAXRecords[pax.STFSRecordReplacesName] + } + + if _, ok := hdr.PAXRecords[pax.STFSRecordReplacesContent]; ok { + var newHdr *models.Header + if hdr.PAXRecords[pax.STFSRecordReplacesContent] == pax.STFSRecordReplacesContentTrue { + // Content & metadata update; use the new record & block + h, err := converters.TarHeaderToDBHeader(record, block, hdr) + if err != nil { + return err + } + + newHdr = h + } else { + // Metadata-only update; use the old record & block + oldHdr, err := metadataPersister.GetHeader(context.Background(), oldName) + if err != nil { + return err + } + + h, err := converters.TarHeaderToDBHeader(oldHdr.Record, oldHdr.Block, hdr) + if err != nil { + return err + } + + newHdr = h } - if err := metadataPersister.UpdateHeaderMetadata(context.Background(), dbhdr); err != nil { + if err := metadataPersister.UpdateHeaderMetadata(context.Background(), newHdr); err != nil { return err } } + + if moveAfterEdits { + // Move header + if err := metadataPersister.MoveHeader(context.Background(), oldName, hdr.Name); err != nil { + return err + } + } + default: return pax.ErrUnsupportedAction } diff --git a/cmd/stbak/cmd/move.go b/cmd/stbak/cmd/move.go index 4f22dc8..e2fe919 100644 --- a/cmd/stbak/cmd/move.go +++ b/cmd/stbak/cmd/move.go @@ -77,7 +77,7 @@ var moveCmd = &cobra.Command{ hdr.Name = strings.TrimSuffix(viper.GetString(dstFlag), "/") + strings.TrimPrefix(hdr.Name, strings.TrimSuffix(viper.GetString(srcFlag), "/")) hdr.PAXRecords[pax.STFSRecordVersion] = pax.STFSRecordVersion1 hdr.PAXRecords[pax.STFSRecordAction] = pax.STFSRecordActionUpdate - hdr.PAXRecords[pax.STFSRecordReplacesName] = viper.GetString(srcFlag) + hdr.PAXRecords[pax.STFSRecordReplacesName] = dbhdr.Name if err := tw.WriteHeader(hdr); err != nil { return err diff --git a/pkg/persisters/metadata.go b/pkg/persisters/metadata.go index 21423d0..94d51fd 100644 --- a/pkg/persisters/metadata.go +++ b/pkg/persisters/metadata.go @@ -55,19 +55,6 @@ func (p *MetadataPersister) UpsertHeader(ctx context.Context, dbhdr *models.Head } func (p *MetadataPersister) UpdateHeaderMetadata(ctx context.Context, dbhdr *models.Header) error { - currentHdr, err := models.FindHeader(ctx, p.db, dbhdr.Name, models.HeaderColumns.Name, models.HeaderColumns.Record, models.HeaderColumns.Block) - if err == sql.ErrNoRows { - return nil // We may have renamed the header in a later, but indexed record/block, so we can skip this - } - - if err != nil { - return err - } - - // Update everything but the name, record & block - dbhdr.Record = currentHdr.Record - dbhdr.Block = currentHdr.Block - if _, err := dbhdr.Update(ctx, p.db, boil.Infer()); err != nil { return err }