diff --git a/cmd/stbak/cmd/index.go b/cmd/stbak/cmd/index.go index 4e729ae..0c9983d 100644 --- a/cmd/stbak/cmd/index.go +++ b/cmd/stbak/cmd/index.go @@ -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 { diff --git a/cmd/stbak/cmd/update.go b/cmd/stbak/cmd/update.go index 55775c6..d1c8876 100644 --- a/cmd/stbak/cmd/update.go +++ b/cmd/stbak/cmd/update.go @@ -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 }, } diff --git a/pkg/pax/stfs.go b/pkg/pax/stfs.go index b7067f3..130ba3a 100644 --- a/pkg/pax/stfs.go +++ b/pkg/pax/stfs.go @@ -13,7 +13,7 @@ const ( STFSRecordReplacesContent = "STFS.ReplacesContent" STFSRecordReplacesContentTrue = "true" - kTFSRecordReplacesContentFalse = "false" + STFSRecordReplacesContentFalse = "false" STFSRecordReplacesName = "STFS.ReplacesName" )