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
+40 -15
View File
@@ -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
} }
+1 -1
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.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
-13
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 { 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
} }