feat: Add support for tape format update actions
This commit is contained in:
@@ -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
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user