]> ruderich.org/simon Gitweb - safcm/safcm.git/blobdiff - cmd/safcm/sync_changes.go
changes: add "(hidden)" to commands with no output and quiet mode
[safcm/safcm.git] / cmd / safcm / sync_changes.go
index 46349116a602d1fb7e389b7b089116aabbbbd418..2650bb46062b33ab0f86e75d9b0f0cb1643bf556 100644 (file)
@@ -30,13 +30,48 @@ import (
 // the remote helper is untrusted and must be either escaped with %q or by
 // calling EscapeControlCharacters().
 
+func (s *Sync) formatChanges(resp safcm.MsgSyncResp) string {
+       var changes []string
+       if len(resp.FileChanges) > 0 {
+               changes = append(changes,
+                       s.formatFileChanges(resp.FileChanges))
+       }
+       if len(resp.PackageChanges) > 0 {
+               changes = append(changes,
+                       s.formatPackageChanges(resp.PackageChanges))
+       }
+       if len(resp.ServiceChanges) > 0 {
+               changes = append(changes,
+                       s.formatServiceChanges(resp.ServiceChanges))
+       }
+       if len(resp.CommandChanges) > 0 {
+               changes = append(changes,
+                       s.formatCommandChanges(resp.CommandChanges))
+       }
+       if len(changes) == 0 {
+               // Notify user that the host was synced successfully
+               return "no changes"
+       }
+
+       x := strings.Join(changes, "\n")
+       // If quiet is used and only commands without output were executed
+       // then don't prepend a newline so that the whole change output of a
+       // host fits in a single line. This makes the output much more
+       // readable with multiple hosts.
+       if strings.Count(x, "\n") == 1 {
+               return x
+       }
+       return "\n" + x
+}
+
 func (s *Sync) formatFileChanges(changes []safcm.FileChange) string {
        var buf strings.Builder
-       fmt.Fprintf(&buf, "changed %d file(s):", len(changes))
        if s.config.DryRun {
-               fmt.Fprintf(&buf, " (dry-run)")
+               fmt.Fprintf(&buf, "will change %d file(s): (dry-run)\n",
+                       len(changes))
+       } else {
+               fmt.Fprintf(&buf, "changed %d file(s):\n", len(changes))
        }
-       fmt.Fprintf(&buf, "\n")
        for _, x := range changes {
                fmt.Fprintf(&buf, "%s:", s.formatTarget(x.Path))
 
@@ -82,7 +117,6 @@ func (s *Sync) formatFileChanges(changes []safcm.FileChange) string {
                }
                fmt.Fprintf(&buf, "\n")
        }
-
        return buf.String()
 }
 func formatFileType(info safcm.FileChangeInfo) string {
@@ -108,11 +142,12 @@ func formatFilePerm(info safcm.FileChangeInfo) string {
 
 func (s *Sync) formatPackageChanges(changes []safcm.PackageChange) string {
        var buf strings.Builder
-       fmt.Fprintf(&buf, "installed %d package(s):", len(changes))
        if s.config.DryRun {
-               fmt.Fprintf(&buf, " (dry-run)")
+               fmt.Fprintf(&buf, "will install %d package(s): (dry-run)\n",
+                       len(changes))
+       } else {
+               fmt.Fprintf(&buf, "installed %d package(s):\n", len(changes))
        }
-       fmt.Fprintf(&buf, "\n")
        for _, x := range changes {
                // TODO: indicate if installation failed
                fmt.Fprintf(&buf, "%s\n", s.formatTarget(x.Name))
@@ -122,11 +157,12 @@ func (s *Sync) formatPackageChanges(changes []safcm.PackageChange) string {
 
 func (s *Sync) formatServiceChanges(changes []safcm.ServiceChange) string {
        var buf strings.Builder
-       fmt.Fprintf(&buf, "modified %d service(s):", len(changes))
        if s.config.DryRun {
-               fmt.Fprintf(&buf, " (dry-run)")
+               fmt.Fprintf(&buf, "will modify %d service(s): (dry-run)\n",
+                       len(changes))
+       } else {
+               fmt.Fprintf(&buf, "modified %d service(s):\n", len(changes))
        }
-       fmt.Fprintf(&buf, "\n")
        for _, x := range changes {
                var info []string
                if x.Started {
@@ -152,7 +188,7 @@ func (s *Sync) formatCommandChanges(changes []safcm.CommandChange) string {
        // Instead, quiet shows them only when they produce output (e.g.
        // `ainsl`, `rm -v`) and thus modify the host's state.
        var noOutput int
-       if s.config.Quiet && !s.config.DryRun {
+       if s.config.Quiet {
                for _, x := range changes {
                        if x.Trigger == "" &&
                                x.Error == "" &&
@@ -163,9 +199,13 @@ func (s *Sync) formatCommandChanges(changes []safcm.CommandChange) string {
        }
 
        var buf strings.Builder
-       fmt.Fprintf(&buf, "executed %d command(s)", len(changes))
-       if noOutput > 0 {
-               fmt.Fprintf(&buf, ", %d with no output", noOutput)
+       if s.config.DryRun {
+               fmt.Fprintf(&buf, "will execute %d command(s)", len(changes))
+       } else {
+               fmt.Fprintf(&buf, "executed %d command(s)", len(changes))
+       }
+       if noOutput > 0 && !s.config.DryRun {
+               fmt.Fprintf(&buf, ", %d with no output (hidden)", noOutput)
        }
        if noOutput != len(changes) {
                fmt.Fprintf(&buf, ":")
@@ -226,10 +266,6 @@ func (s *Sync) formatDiff(diff string) string {
 }
 
 func indentBlock(x string, sep string) string {
-       if x == "" {
-               return ""
-       }
-
        lines := strings.Split(x, "\n")
        if lines[len(lines)-1] == "" {
                lines = lines[:len(lines)-1]