Remove stale cleanup leftovers
This commit is contained in:
@@ -1,14 +1,10 @@
|
|||||||
package app
|
package app
|
||||||
|
|
||||||
import "errors"
|
|
||||||
|
|
||||||
const Name = "distributor"
|
const Name = "distributor"
|
||||||
|
|
||||||
// Version can be replaced at build time with -ldflags "-X .../internal/app.Version=<value>".
|
// Version can be replaced at build time with -ldflags "-X .../internal/app.Version=<value>".
|
||||||
var Version = "dev"
|
var Version = "dev"
|
||||||
|
|
||||||
var ErrNotImplemented = errors.New("not implemented")
|
|
||||||
|
|
||||||
func VersionString() string {
|
func VersionString() string {
|
||||||
return Name + " " + Version
|
return Name + " " + Version
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ import (
|
|||||||
"io"
|
"io"
|
||||||
|
|
||||||
"gitea.maximumdirect.net/eric/distributor/internal/bundle"
|
"gitea.maximumdirect.net/eric/distributor/internal/bundle"
|
||||||
|
"gitea.maximumdirect.net/eric/distributor/internal/storage"
|
||||||
)
|
)
|
||||||
|
|
||||||
type InspectOptions struct {
|
type InspectOptions struct {
|
||||||
@@ -39,7 +40,7 @@ func writeInspection(w io.Writer, bundles []bundle.Bundle) error {
|
|||||||
if _, err := fmt.Fprintf(
|
if _, err := fmt.Fprintf(
|
||||||
w,
|
w,
|
||||||
"- path=%s id=%s created=%s digest=%s files=%d\n",
|
"- path=%s id=%s created=%s digest=%s files=%d\n",
|
||||||
displayBundlePath(sourceBundle.RootRelativePath),
|
storage.DisplayPath(sourceBundle.RootRelativePath),
|
||||||
sourceBundle.Manifest.ID,
|
sourceBundle.Manifest.ID,
|
||||||
sourceBundle.Manifest.Created.Format("2006-01-02T15:04:05Z07:00"),
|
sourceBundle.Manifest.Created.Format("2006-01-02T15:04:05Z07:00"),
|
||||||
sourceBundle.Manifest.Digest,
|
sourceBundle.Manifest.Digest,
|
||||||
@@ -55,10 +56,3 @@ func writeInspection(w io.Writer, bundles []bundle.Bundle) error {
|
|||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func displayBundlePath(path string) string {
|
|
||||||
if path == "" {
|
|
||||||
return "."
|
|
||||||
}
|
|
||||||
return path
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -1,5 +0,0 @@
|
|||||||
package app
|
|
||||||
|
|
||||||
type Pipeline struct {
|
|
||||||
ID string
|
|
||||||
}
|
|
||||||
@@ -11,6 +11,7 @@ import (
|
|||||||
"gitea.maximumdirect.net/eric/distributor/internal/config"
|
"gitea.maximumdirect.net/eric/distributor/internal/config"
|
||||||
"gitea.maximumdirect.net/eric/distributor/internal/notify"
|
"gitea.maximumdirect.net/eric/distributor/internal/notify"
|
||||||
"gitea.maximumdirect.net/eric/distributor/internal/publish"
|
"gitea.maximumdirect.net/eric/distributor/internal/publish"
|
||||||
|
"gitea.maximumdirect.net/eric/distributor/internal/storage"
|
||||||
)
|
)
|
||||||
|
|
||||||
type RunOptions struct {
|
type RunOptions struct {
|
||||||
@@ -68,7 +69,7 @@ func runConfig(ctx context.Context, cfg config.Config, options RunOptions) error
|
|||||||
for _, destination := range pipeline.Destinations {
|
for _, destination := range pipeline.Destinations {
|
||||||
destinationBackend, err := backends.openDestination(ctx, destination)
|
destinationBackend, err := backends.openDestination(ctx, destination)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
failures.add(pipeline.ID, destination.ID, displayBundlePath(sourceBundle.RootRelativePath), err)
|
failures.add(pipeline.ID, destination.ID, storage.DisplayPath(sourceBundle.RootRelativePath), err)
|
||||||
summary.recordFailure()
|
summary.recordFailure()
|
||||||
if options.Stdout != nil {
|
if options.Stdout != nil {
|
||||||
writeErrorLine(options.Stdout, sourceBundle.RootRelativePath, destination.ID, err)
|
writeErrorLine(options.Stdout, sourceBundle.RootRelativePath, destination.ID, err)
|
||||||
@@ -96,20 +97,20 @@ func runConfig(ctx context.Context, cfg config.Config, options RunOptions) error
|
|||||||
writePlanLine(options.Stdout, plan, err)
|
writePlanLine(options.Stdout, plan, err)
|
||||||
}
|
}
|
||||||
if err != nil {
|
if err != nil {
|
||||||
failures.add(pipeline.ID, destination.ID, displayBundlePath(sourceBundle.RootRelativePath), err)
|
failures.add(pipeline.ID, destination.ID, storage.DisplayPath(sourceBundle.RootRelativePath), err)
|
||||||
summary.recordFailure()
|
summary.recordFailure()
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
summary.recordPlan(plan.Action)
|
summary.recordPlan(plan.Action)
|
||||||
if !options.DryRun {
|
if !options.DryRun {
|
||||||
if err := publish.Execute(ctx, req, plan); err != nil {
|
if err := publish.Execute(ctx, req, plan); err != nil {
|
||||||
failures.add(pipeline.ID, destination.ID, displayBundlePath(sourceBundle.RootRelativePath), err)
|
failures.add(pipeline.ID, destination.ID, storage.DisplayPath(sourceBundle.RootRelativePath), err)
|
||||||
summary.recordFailure()
|
summary.recordFailure()
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
if shouldNotify(plan.Action) {
|
if shouldNotify(plan.Action) {
|
||||||
if err := notifier.Notify(ctx, notifyEvent(plan)); err != nil {
|
if err := notifier.Notify(ctx, notifyEvent(plan)); err != nil {
|
||||||
failures.add(pipeline.ID, destination.ID, displayBundlePath(sourceBundle.RootRelativePath), err)
|
failures.add(pipeline.ID, destination.ID, storage.DisplayPath(sourceBundle.RootRelativePath), err)
|
||||||
summary.recordFailure()
|
summary.recordFailure()
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
@@ -138,17 +139,17 @@ func writePlanLine(w io.Writer, plan publish.Plan, planErr error) {
|
|||||||
if destinationID == "" {
|
if destinationID == "" {
|
||||||
destinationID = "unknown"
|
destinationID = "unknown"
|
||||||
}
|
}
|
||||||
fmt.Fprintf(w, " - bundle=%s destination=%s action=error reason=%q\n", displayBundlePath(plan.BundlePath), destinationID, planErr.Error())
|
fmt.Fprintf(w, " - bundle=%s destination=%s action=error reason=%q\n", storage.DisplayPath(plan.BundlePath), destinationID, planErr.Error())
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
fmt.Fprintf(w, " - bundle=%s destination=%s action=%s outputs=%s reason=%q\n", displayBundlePath(plan.BundlePath), plan.DestinationID, plan.Action, outputSummary(plan.Outputs), plan.Reason)
|
fmt.Fprintf(w, " - bundle=%s destination=%s action=%s outputs=%s reason=%q\n", storage.DisplayPath(plan.BundlePath), plan.DestinationID, plan.Action, outputSummary(plan.Outputs), plan.Reason)
|
||||||
}
|
}
|
||||||
|
|
||||||
func writeErrorLine(w io.Writer, bundlePath, destinationID string, err error) {
|
func writeErrorLine(w io.Writer, bundlePath, destinationID string, err error) {
|
||||||
if w == nil {
|
if w == nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
fmt.Fprintf(w, " - bundle=%s destination=%s action=error reason=%q\n", displayBundlePath(bundlePath), destinationID, err.Error())
|
fmt.Fprintf(w, " - bundle=%s destination=%s action=error reason=%q\n", storage.DisplayPath(bundlePath), destinationID, err.Error())
|
||||||
}
|
}
|
||||||
|
|
||||||
func outputSummary(outputs []publish.Output) string {
|
func outputSummary(outputs []publish.Output) string {
|
||||||
|
|||||||
@@ -35,7 +35,7 @@ func Discover(ctx context.Context, backend storage.Backend, sourceRoot string) (
|
|||||||
}
|
}
|
||||||
sort.Strings(roots)
|
sort.Strings(roots)
|
||||||
if len(roots) == 0 {
|
if len(roots) == 0 {
|
||||||
return nil, fmt.Errorf("no bundles found under %q", displayRoot(sourceRoot))
|
return nil, fmt.Errorf("no bundles found under %q", storage.DisplayPath(sourceRoot))
|
||||||
}
|
}
|
||||||
if err := rejectNestedRoots(roots); err != nil {
|
if err := rejectNestedRoots(roots); err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
@@ -57,7 +57,7 @@ func rejectNestedRoots(roots []string) error {
|
|||||||
for index, root := range roots {
|
for index, root := range roots {
|
||||||
for _, candidate := range roots[index+1:] {
|
for _, candidate := range roots[index+1:] {
|
||||||
if isAncestor(root, candidate) {
|
if isAncestor(root, candidate) {
|
||||||
return fmt.Errorf("nested manifest %q under bundle %q", displayRoot(candidate), displayRoot(root))
|
return fmt.Errorf("nested manifest %q under bundle %q", storage.DisplayPath(candidate), storage.DisplayPath(root))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -74,31 +74,31 @@ func validateAt(ctx context.Context, backend storage.Backend, bundleRoot, relati
|
|||||||
}
|
}
|
||||||
manifest, err := ParseManifest(manifestData)
|
manifest, err := ParseManifest(manifestData)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return Bundle{}, fmt.Errorf("bundle %q: %w", displayRoot(relativeRoot), err)
|
return Bundle{}, fmt.Errorf("bundle %q: %w", storage.DisplayPath(relativeRoot), err)
|
||||||
}
|
}
|
||||||
|
|
||||||
for index, manifestFile := range manifest.Files {
|
for index, manifestFile := range manifest.Files {
|
||||||
filePath, err := storage.Join(bundleRoot, manifestFile.Path)
|
filePath, err := storage.Join(bundleRoot, manifestFile.Path)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return Bundle{}, fmt.Errorf("bundle %q file %q: %w", displayRoot(relativeRoot), manifestFile.Path, err)
|
return Bundle{}, fmt.Errorf("bundle %q file %q: %w", storage.DisplayPath(relativeRoot), manifestFile.Path, err)
|
||||||
}
|
}
|
||||||
entry, err := backend.Stat(ctx, filePath)
|
entry, err := backend.Stat(ctx, filePath)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return Bundle{}, fmt.Errorf("bundle %q file %q stat: %w", displayRoot(relativeRoot), manifestFile.Path, err)
|
return Bundle{}, fmt.Errorf("bundle %q file %q stat: %w", storage.DisplayPath(relativeRoot), manifestFile.Path, err)
|
||||||
}
|
}
|
||||||
if entry.Type != storage.EntryTypeFile {
|
if entry.Type != storage.EntryTypeFile {
|
||||||
return Bundle{}, fmt.Errorf("bundle %q file %q must be a regular file", displayRoot(relativeRoot), manifestFile.Path)
|
return Bundle{}, fmt.Errorf("bundle %q file %q must be a regular file", storage.DisplayPath(relativeRoot), manifestFile.Path)
|
||||||
}
|
}
|
||||||
if entry.Size != manifestFile.Size {
|
if entry.Size != manifestFile.Size {
|
||||||
return Bundle{}, fmt.Errorf("bundle %q file %q size mismatch: got %d want %d", displayRoot(relativeRoot), manifestFile.Path, entry.Size, manifestFile.Size)
|
return Bundle{}, fmt.Errorf("bundle %q file %q size mismatch: got %d want %d", storage.DisplayPath(relativeRoot), manifestFile.Path, entry.Size, manifestFile.Size)
|
||||||
}
|
}
|
||||||
data, err := backend.ReadFile(ctx, filePath)
|
data, err := backend.ReadFile(ctx, filePath)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return Bundle{}, fmt.Errorf("bundle %q file %q read: %w", displayRoot(relativeRoot), manifestFile.Path, err)
|
return Bundle{}, fmt.Errorf("bundle %q file %q read: %w", storage.DisplayPath(relativeRoot), manifestFile.Path, err)
|
||||||
}
|
}
|
||||||
actualDigest := FileDigest(data)
|
actualDigest := FileDigest(data)
|
||||||
if actualDigest != manifestFile.SHA256 {
|
if actualDigest != manifestFile.SHA256 {
|
||||||
return Bundle{}, fmt.Errorf("bundle %q file %q sha256 mismatch: got %s want %s", displayRoot(relativeRoot), manifestFile.Path, actualDigest, manifestFile.SHA256)
|
return Bundle{}, fmt.Errorf("bundle %q file %q sha256 mismatch: got %s want %s", storage.DisplayPath(relativeRoot), manifestFile.Path, actualDigest, manifestFile.SHA256)
|
||||||
}
|
}
|
||||||
manifest.Files[index].SHA256 = actualDigest
|
manifest.Files[index].SHA256 = actualDigest
|
||||||
manifest.Files[index].Size = int64(len(data))
|
manifest.Files[index].Size = int64(len(data))
|
||||||
@@ -106,7 +106,7 @@ func validateAt(ctx context.Context, backend storage.Backend, bundleRoot, relati
|
|||||||
|
|
||||||
actualBundleDigest := BundleDigest(manifest.Files)
|
actualBundleDigest := BundleDigest(manifest.Files)
|
||||||
if actualBundleDigest != manifest.Digest {
|
if actualBundleDigest != manifest.Digest {
|
||||||
return Bundle{}, fmt.Errorf("bundle %q digest mismatch: got %s want %s", displayRoot(relativeRoot), actualBundleDigest, manifest.Digest)
|
return Bundle{}, fmt.Errorf("bundle %q digest mismatch: got %s want %s", storage.DisplayPath(relativeRoot), actualBundleDigest, manifest.Digest)
|
||||||
}
|
}
|
||||||
|
|
||||||
return Bundle{
|
return Bundle{
|
||||||
@@ -114,10 +114,3 @@ func validateAt(ctx context.Context, backend storage.Backend, bundleRoot, relati
|
|||||||
Manifest: manifest,
|
Manifest: manifest,
|
||||||
}, nil
|
}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func displayRoot(root string) string {
|
|
||||||
if root == "" {
|
|
||||||
return "."
|
|
||||||
}
|
|
||||||
return root
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -2,7 +2,6 @@ package cli
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
"errors"
|
|
||||||
"fmt"
|
"fmt"
|
||||||
"io"
|
"io"
|
||||||
"strings"
|
"strings"
|
||||||
@@ -67,10 +66,6 @@ func hasHelp(args []string) bool {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func fail(stderr io.Writer, err error) int {
|
func fail(stderr io.Writer, err error) int {
|
||||||
if errors.Is(err, app.ErrNotImplemented) {
|
|
||||||
fmt.Fprintf(stderr, "%s: %s\n", app.Name, err)
|
|
||||||
return exitError
|
|
||||||
}
|
|
||||||
fmt.Fprintf(stderr, "%s: %s\n", app.Name, err)
|
fmt.Fprintf(stderr, "%s: %s\n", app.Name, err)
|
||||||
return exitError
|
return exitError
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -139,10 +139,3 @@ func actionForComparison(comparison state.Comparison, transfer config.TransferPo
|
|||||||
return ActionFailConflict, "unsupported comparison outcome"
|
return ActionFailConflict, "unsupported comparison outcome"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func displayPath(path string) string {
|
|
||||||
if path == "" {
|
|
||||||
return "."
|
|
||||||
}
|
|
||||||
return path
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -13,7 +13,7 @@ func ensureDestinationEmpty(ctx context.Context, backend storage.Backend, bundle
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
if hasAny {
|
if hasAny {
|
||||||
return fmt.Errorf("destination bundle path %q is not empty after managed cleanup", displayPath(bundlePath))
|
return fmt.Errorf("destination bundle path %q is not empty after managed cleanup", storage.DisplayPath(bundlePath))
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -42,6 +42,13 @@ func StatePath(bundlePath string) (string, error) {
|
|||||||
return Join(bundlePath, StateFileName)
|
return Join(bundlePath, StateFileName)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func DisplayPath(path string) string {
|
||||||
|
if path == "" {
|
||||||
|
return "."
|
||||||
|
}
|
||||||
|
return path
|
||||||
|
}
|
||||||
|
|
||||||
func ManagedBundleTargets(bundlePath string, managedOutputPaths []string) ([]string, error) {
|
func ManagedBundleTargets(bundlePath string, managedOutputPaths []string) ([]string, error) {
|
||||||
if err := ValidatePrefix(bundlePath); err != nil {
|
if err := ValidatePrefix(bundlePath); err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
|
|||||||
@@ -67,6 +67,20 @@ func TestStatePath(t *testing.T) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestDisplayPath(t *testing.T) {
|
||||||
|
tests := map[string]string{
|
||||||
|
"": ".",
|
||||||
|
"bundle": "bundle",
|
||||||
|
}
|
||||||
|
for path, want := range tests {
|
||||||
|
t.Run(path, func(t *testing.T) {
|
||||||
|
if got := DisplayPath(path); got != want {
|
||||||
|
t.Fatalf("DisplayPath(%q) = %q, want %q", path, got, want)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func TestManagedBundleTargets(t *testing.T) {
|
func TestManagedBundleTargets(t *testing.T) {
|
||||||
tests := []struct {
|
tests := []struct {
|
||||||
name string
|
name string
|
||||||
|
|||||||
Reference in New Issue
Block a user