feat: Add support for tape format update actions

This commit is contained in:
Felicitas Pojtinger
2021-11-26 19:00:32 +01:00
parent f4e0b3a9b2
commit 9ebe92a678
3 changed files with 41 additions and 29 deletions

View File

@@ -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
}

View File

@@ -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

View File

@@ -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
}