feat: Add support for tape format update actions
This commit is contained in:
+40
-15
@@ -11,6 +11,7 @@ import (
|
|||||||
"github.com/pojntfx/stfs/pkg/controllers"
|
"github.com/pojntfx/stfs/pkg/controllers"
|
||||||
"github.com/pojntfx/stfs/pkg/converters"
|
"github.com/pojntfx/stfs/pkg/converters"
|
||||||
"github.com/pojntfx/stfs/pkg/counters"
|
"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/formatting"
|
||||||
"github.com/pojntfx/stfs/pkg/pax"
|
"github.com/pojntfx/stfs/pkg/pax"
|
||||||
"github.com/pojntfx/stfs/pkg/persisters"
|
"github.com/pojntfx/stfs/pkg/persisters"
|
||||||
@@ -263,26 +264,50 @@ func indexHeader(record, block int64, hdr *tar.Header, metadataPersister *persis
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
case pax.STFSRecordActionUpdate:
|
case pax.STFSRecordActionUpdate:
|
||||||
if hdr.PAXRecords[pax.STFSRecordReplacesContent] == pax.STFSRecordReplacesContentTrue {
|
moveAfterEdits := false
|
||||||
// Metadata & content update
|
oldName := hdr.Name
|
||||||
// TODO: Add implementation
|
if _, ok := hdr.PAXRecords[pax.STFSRecordReplacesName]; ok {
|
||||||
return pax.ErrUnsupportedAction
|
moveAfterEdits = true
|
||||||
} else if _, ok := hdr.PAXRecords[pax.STFSRecordReplacesName]; ok {
|
oldName = hdr.PAXRecords[pax.STFSRecordReplacesName]
|
||||||
// Move header; do not update metadata
|
}
|
||||||
if err := metadataPersister.MoveHeader(context.Background(), hdr.PAXRecords[pax.STFSRecordReplacesName], hdr.Name); err != nil {
|
|
||||||
return err
|
if _, ok := hdr.PAXRecords[pax.STFSRecordReplacesContent]; ok {
|
||||||
}
|
var newHdr *models.Header
|
||||||
} else {
|
if hdr.PAXRecords[pax.STFSRecordReplacesContent] == pax.STFSRecordReplacesContentTrue {
|
||||||
// Metadata-only update
|
// Content & metadata update; use the new record & block
|
||||||
dbhdr, err := converters.TarHeaderToDBHeader(record, block, hdr)
|
h, err := converters.TarHeaderToDBHeader(record, block, hdr)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
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
|
return err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if moveAfterEdits {
|
||||||
|
// Move header
|
||||||
|
if err := metadataPersister.MoveHeader(context.Background(), oldName, hdr.Name); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
default:
|
default:
|
||||||
return pax.ErrUnsupportedAction
|
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.Name = strings.TrimSuffix(viper.GetString(dstFlag), "/") + strings.TrimPrefix(hdr.Name, strings.TrimSuffix(viper.GetString(srcFlag), "/"))
|
||||||
hdr.PAXRecords[pax.STFSRecordVersion] = pax.STFSRecordVersion1
|
hdr.PAXRecords[pax.STFSRecordVersion] = pax.STFSRecordVersion1
|
||||||
hdr.PAXRecords[pax.STFSRecordAction] = pax.STFSRecordActionUpdate
|
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 {
|
if err := tw.WriteHeader(hdr); err != nil {
|
||||||
return err
|
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 {
|
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 {
|
if _, err := dbhdr.Update(ctx, p.db, boil.Infer()); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user