From fccee426136fe1e849b608626410aa542206e816 Mon Sep 17 00:00:00 2001 From: Fabio Forni Date: Mon, 20 Nov 2023 15:23:31 +0100 Subject: [PATCH] installer: Add the DryRun StepWriter --- installer/steps.go | 14 +++--- installer/stepwriter/dryrun.go | 79 ++++++++++++++++++++++++++++++++++ installer/stepwriter/file.go | 11 +++++ 3 files changed, 95 insertions(+), 9 deletions(-) create mode 100644 installer/stepwriter/dryrun.go create mode 100644 installer/stepwriter/file.go diff --git a/installer/steps.go b/installer/steps.go index 4e2c9b9..0d0c4b7 100644 --- a/installer/steps.go +++ b/installer/steps.go @@ -8,6 +8,7 @@ import ( "path/filepath" "strings" + "github.com/livingsilver94/backee/installer/stepwriter" "github.com/livingsilver94/backee/repo" "github.com/livingsilver94/backee/service" ) @@ -16,7 +17,7 @@ type StepWriter interface { Setup(script string) error InstallPackages(fullCmd []string) error SymlinkFile(dst service.FilePath, src string) error - CopyFile(dst service.FilePath, src string) error + CopyFile(dst service.FilePath, src stepwriter.FileContent) error Finalize(script string) error } @@ -84,23 +85,18 @@ func (s Steps) CopyFiles(repo repo.Repo, vars repo.Variables) error { } s.log.Info("Copying files") - lnDir, err := repo.DataDir(s.srv.Name) + _, err := repo.DataDir(s.srv.Name) if err != nil { return err } tmpl := NewTemplate(s.srv.Name, vars) dest := &strings.Builder{} - for srcFile, dstFile := range s.srv.Copies { + for _, dstFile := range s.srv.Copies { err := tmpl.ReplaceString(dstFile.Path, dest) if err != nil { return err } - err = s.wri.CopyFile( - service.FilePath{Path: dest.String(), Mode: dstFile.Mode}, - filepath.Join(lnDir, srcFile)) - if err != nil { - return err - } + // TODO: read file. dest.Reset() } return nil diff --git a/installer/stepwriter/dryrun.go b/installer/stepwriter/dryrun.go new file mode 100644 index 0000000..b54bf95 --- /dev/null +++ b/installer/stepwriter/dryrun.go @@ -0,0 +1,79 @@ +// SPDX-FileCopyrightText: Fabio Forni +// SPDX-License-Identifier: MPL-2.0 + +package stepwriter + +import ( + "bufio" + "fmt" + "io" + "strings" + + "github.com/livingsilver94/backee/service" +) + +var ( + buf = &strings.Builder{} +) + +type DryRun struct{} + +func (DryRun) Setup(script string) error { + return printMultiline(strings.NewReader(script)) +} + +func (DryRun) InstallPackages(fullCmd []string) error { + return printf("Will run %q", strings.Join(fullCmd, " ")) +} + +func (DryRun) SymlinkFile(dst service.FilePath, src string) error { + defer buf.Reset() + fmt.Fprintf(buf, "%s → %s", src, dst.Path) + if dst.Mode != 0 { + fmt.Fprintf(buf, " with permission %o", dst.Mode) + } + return printLine(buf.String()) +} + +func (DryRun) CopyFile(dst service.FilePath, file FileContent) error { + defer buf.Reset() + fmt.Fprintf(buf, "Will write %s", dst.Path) + if dst.Mode != 0 { + fmt.Fprintf(buf, " with permission %o", dst.Mode) + } + buf.WriteString(" with the following content:") + if file.Binary { + buf.WriteString(" *binary*") + return printLine(buf.String()) + } + err := printLine(buf.String()) + if err != nil { + return err + } + return printMultiline(file.Content) +} + +func (DryRun) Finalize(script string) error { + return printMultiline(strings.NewReader(script)) +} + +func printLine(str string) error { + _, err := fmt.Println("\t" + str) + return err +} + +func printMultiline(read io.Reader) error { + lines := bufio.NewScanner(read) + for lines.Scan() { + err := printLine(lines.Text()) + if err != nil { + return err + } + } + return nil +} + +func printf(format string, args ...any) error { + _, err := fmt.Printf("\t"+format+"\n", args) + return err +} diff --git a/installer/stepwriter/file.go b/installer/stepwriter/file.go new file mode 100644 index 0000000..be85e60 --- /dev/null +++ b/installer/stepwriter/file.go @@ -0,0 +1,11 @@ +// SPDX-FileCopyrightText: Fabio Forni +// SPDX-License-Identifier: MPL-2.0 + +package stepwriter + +import "io" + +type FileContent struct { + Binary bool + Content io.Reader +}