X-Git-Url: https://ruderich.org/simon/gitweb/?a=blobdiff_plain;f=cmd%2Fsafcm%2Fsync_sync.go;h=ff4f4c8a41935fe45eb06f6fec55e9dd89dc21dd;hb=HEAD;hp=e84b7f416c07b84df027f017c826d8b381324d4a;hpb=f2f2bc47e8729548f3c10117f7f008b547c4afc5;p=safcm%2Fsafcm.git diff --git a/cmd/safcm/sync_sync.go b/cmd/safcm/sync_sync.go index e84b7f4..ff4f4c8 100644 --- a/cmd/safcm/sync_sync.go +++ b/cmd/safcm/sync_sync.go @@ -1,31 +1,20 @@ // "sync" sub-command: sync files -// Copyright (C) 2021 Simon Ruderich -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . +// SPDX-License-Identifier: GPL-3.0-or-later +// Copyright (C) 2021-2024 Simon Ruderich package main import ( "fmt" + "math" "os" - "path/filepath" "sort" "strings" "ruderich.org/simon/safcm" "ruderich.org/simon/safcm/cmd/safcm/config" + "ruderich.org/simon/safcm/frontend" "ruderich.org/simon/safcm/rpc" ) @@ -34,36 +23,20 @@ func (s *Sync) hostSync(conn *rpc.Conn, detectedGroups []string) error { if err != nil { return err } - x, err := s.sendRecv(conn, req) + resp, err := s.loop.HostSyncMsg(s, conn, req) if err != nil { return err } - resp, ok := x.(safcm.MsgSyncResp) - if !ok { - return fmt.Errorf("unexpected response %v", x) - } // Display changes - 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)) + c := frontend.Changes{ + DryRun: s.config.DryRun, + Quiet: s.config.Quiet, + IsTTY: s.isTTY, } - if len(changes) > 0 { - s.logf(safcm.LogInfo, true, "%s", - "\n"+strings.Join(changes, "\n")) + changes := c.FormatChanges(resp) + if changes != "" { + s.log(safcm.LogInfo, true, changes) } if resp.Error != "" { @@ -82,8 +55,8 @@ func (s *Sync) hostSyncReq(detectedGroups []string) ( return empty, err } { - // Don't leak internal group order which is confusing without - // knowing the implementation details. + // Don't leak internal group priority which is confusing + // without knowing the implementation details. groupsSorted := make([]string, len(groups)) copy(groupsSorted, groups) sort.Strings(groupsSorted) @@ -99,16 +72,16 @@ func (s *Sync) hostSyncReq(detectedGroups []string) ( sort.Slice(priorities, func(i, j int) bool { a := priorities[i] b := priorities[j] - return groupPriority[a] < groupPriority[b] + return groupPriority[a] > groupPriority[b] }) - s.logVerbosef("host group priorities (desc. order): %v", + s.logVerbosef("host group priorities (descending): %v", strings.Join(priorities, " ")) } allFiles := make(map[string]*safcm.File) allPackagesMap := make(map[string]bool) // map to deduplicate allServicesMap := make(map[string]bool) // map to deduplicate - var allCommands []string + var allCommands []*safcm.Command for _, group := range groups { // Skip non-existent group directories @@ -202,21 +175,21 @@ func (s *Sync) resolveHostGroups(detectedGroups []string) ( return nil, nil, err } - // Early entries have higher priorities + // Early entries in "group_priority" have higher priorities groupPriority := make(map[string]int) - for i, x := range s.config.GroupOrder { - groupPriority[x] = i + 1 + for i, x := range s.config.GroupPriority { + groupPriority[x] = len(s.config.GroupPriority) - i } // Host itself always has highest priority - groupPriority[s.host.Name] = -1 + groupPriority[s.host.Name] = math.MaxInt32 // Sort groups after priority and name sort.Slice(groups, func(i, j int) bool { a := groups[i] b := groups[j] - if groupPriority[a] > groupPriority[b] { + if groupPriority[a] < groupPriority[b] { return true - } else if groupPriority[a] < groupPriority[b] { + } else if groupPriority[a] > groupPriority[b] { return false } else { return a < b @@ -236,7 +209,7 @@ func (s *Sync) checkFileConflict(group string, path string, file *safcm.File, newPrio := groupPriority[group] oldPrio := groupPriority[old.OrigGroup] - if oldPrio > newPrio { + if oldPrio < newPrio { if old.Mode.IsDir() && file.Mode.IsDir() && old.TriggerCommands != nil { s.logDebugf("files: %q: "+ @@ -244,7 +217,7 @@ func (s *Sync) checkFileConflict(group string, path string, file *safcm.File, path, group, old.OrigGroup) } return nil - } else if oldPrio < newPrio { + } else if oldPrio > newPrio { // Should never happen, groups are sorted by priority panic("invalid group priorities") } @@ -257,8 +230,8 @@ func (s *Sync) checkFileConflict(group string, path string, file *safcm.File, return nil } - return fmt.Errorf("groups %s and %s both provide file %q\n"+ - "Use 'group_order' in config.yaml to declare preference", + return fmt.Errorf("groups %s and %s both provide %q\n"+ + "Use 'group_priority' in config.yaml to declare preference", group, old.OrigGroup, path) } @@ -271,11 +244,12 @@ func resolveFileDirConflicts(files map[string]*safcm.File) { return paths[i] < paths[j] }) - const sep = string(filepath.Separator) + // Slash separated paths are used for the configuration + const sep = "/" - // Remove invalid paths which can result from group_order overriding - // paths from another group (e.g. "/foo" as file from one group and - // "/foo/bar" from another). + // Remove invalid paths which can result from group_priority + // overriding paths from another group (e.g. "/foo" as file from one + // group and "/foo/bar" from another). var last *safcm.File for _, x := range paths { file := files[x]