feat: Add support for metadata-only UPDATE PAX headers

This commit is contained in:
Felicitas Pojtinger
2021-11-28 14:59:23 +01:00
parent e4ab0e72ca
commit 7115d0ecb4
3 changed files with 53 additions and 62 deletions

View File

@@ -271,34 +271,32 @@ func indexHeader(record, block int64, hdr *tar.Header, metadataPersister *persis
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(), newHdr); err != nil {
var newHdr *models.Header
if replacesContent, ok := hdr.PAXRecords[pax.STFSRecordReplacesContent]; ok && replacesContent == 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(), newHdr); err != nil {
return err
}
if moveAfterEdits {

View File

@@ -8,6 +8,7 @@ import (
"github.com/pojntfx/stfs/pkg/adapters"
"github.com/pojntfx/stfs/pkg/converters"
"github.com/pojntfx/stfs/pkg/formatting"
"github.com/pojntfx/stfs/pkg/pax"
"github.com/pojntfx/stfs/pkg/persisters"
"github.com/spf13/cobra"
"github.com/spf13/viper"
@@ -31,19 +32,19 @@ var updateCmd = &cobra.Command{
boil.DebugMode = true
}
// dirty := false
// tw, _, cleanup, err := openTapeWriter(viper.GetString(tapeFlag))
// if err != nil {
// return err
// }
// defer cleanup(&dirty)
dirty := false
tw, _, cleanup, err := openTapeWriter(viper.GetString(tapeFlag))
if err != nil {
return err
}
defer cleanup(&dirty)
metadataPersister := persisters.NewMetadataPersister(viper.GetString(metadataFlag))
if err := metadataPersister.Open(); err != nil {
return err
}
stat, err := os.Stat(viper.GetString(contentFlag))
stat, err := os.Stat(viper.GetString(srcFlag))
if err != nil {
return err
}
@@ -68,53 +69,45 @@ var updateCmd = &cobra.Command{
hdr.Format = tar.FormatPAX
if !viper.GetBool(contentFlag) {
// Metadata-only update; use the old record & block
oldhdr, err := metadataPersister.GetHeader(context.Background(), viper.GetString(srcFlag))
if err != nil {
return err
}
newHdr, err := converters.TarHeaderToDBHeader(-1, -1, hdr)
newHdr, err := converters.TarHeaderToDBHeader(oldhdr.Record, oldhdr.Block, hdr)
if err != nil {
return err
}
// Metadata-only update; use the old record & block
newHdr.Record = oldhdr.Record
newHdr.Block = oldhdr.Block
// Add the update header to the index
if err := metadataPersister.UpdateHeaderMetadata(context.Background(), newHdr); err != nil {
return nil
}
// Append update headers to the tape/tar file
if hdr.PAXRecords == nil {
hdr.PAXRecords = map[string]string{}
}
hdr.Size = 0 // Don't try to seek after the record
hdr.PAXRecords[pax.STFSRecordVersion] = pax.STFSRecordVersion1
hdr.PAXRecords[pax.STFSRecordAction] = pax.STFSRecordActionUpdate
if err := tw.WriteHeader(hdr); err != nil {
return err
}
dirty = true
if err := formatting.PrintCSV(formatting.TARHeaderCSV); err != nil {
return err
}
if err := formatting.PrintCSV(formatting.GetTARHeaderAsCSV(-1, -1, hdr)); err != nil {
return err
}
}
// TODO: Append the headers to the tape
// Append update headers to the tape/tar file
// hdr, err := converters.DBHeaderToTarHeader(dbhdr)
// if err != nil {
// return err
// }
// hdr.Size = 0 // Don't try to seek after the record
// 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] = dbhdr.Name
// if err := tw.WriteHeader(hdr); err != nil {
// return err
// }
// dirty = true
// if err := formatting.PrintCSV(formatting.GetTARHeaderAsCSV(-1, -1, hdr)); err != nil {
// return err
// }
return nil
},
}

View File

@@ -13,7 +13,7 @@ const (
STFSRecordReplacesContent = "STFS.ReplacesContent"
STFSRecordReplacesContentTrue = "true"
kTFSRecordReplacesContentFalse = "false"
STFSRecordReplacesContentFalse = "false"
STFSRecordReplacesName = "STFS.ReplacesName"
)