internal/gitaly/storage/wal/manifest.go (38 lines of code) (raw):
package wal
import (
"context"
"fmt"
"os"
"path/filepath"
"gitlab.com/gitlab-org/gitaly/v16/internal/gitaly/storage/mode"
"gitlab.com/gitlab-org/gitaly/v16/proto/go/gitalypb"
"google.golang.org/protobuf/proto"
)
// ManifestPath returns the manifest file's path in the log entry.
func ManifestPath(logEntryPath string) string {
return filepath.Join(logEntryPath, "MANIFEST")
}
// ReadManifest returns the log entry's manifest from the given position in the log.
func ReadManifest(stateDir string) (*gitalypb.LogEntry, error) {
manifestBytes, err := os.ReadFile(ManifestPath(stateDir))
if err != nil {
return nil, fmt.Errorf("read manifest: %w", err)
}
var logEntry gitalypb.LogEntry
if err := proto.Unmarshal(manifestBytes, &logEntry); err != nil {
return nil, fmt.Errorf("unmarshal manifest: %w", err)
}
return &logEntry, nil
}
// WriteManifest writes the log entry's manifest to the disk.
func WriteManifest(ctx context.Context, stateDir string, manifest *gitalypb.LogEntry) error {
manifestBytes, err := proto.Marshal(manifest)
if err != nil {
return fmt.Errorf("marshal manifest: %w", err)
}
// Finalize the log entry by writing the MANIFEST file into the log entry's directory.
manifestPath := ManifestPath(stateDir)
if err := os.WriteFile(manifestPath, manifestBytes, mode.File); err != nil {
return fmt.Errorf("write manifest: %w", err)
}
return nil
}
// RemoveManifest removes the existing manifest file.
func RemoveManifest(ctx context.Context, stateDir string) error {
return os.Remove(ManifestPath(stateDir))
}