diff --git a/cmd-sync.go b/cmd-sync.go index da4915b0..71552c18 100644 --- a/cmd-sync.go +++ b/cmd-sync.go @@ -23,6 +23,7 @@ import ( "os" "os/signal" "runtime" + "strings" "sync" "github.com/minio/cli" @@ -71,9 +72,13 @@ EXAMPLES: // doSyncSession - Sync an object to multiple destination func doSyncSession(sURLs syncURLs, bar *barSend, syncQueue chan bool, ssCh chan syncSession, wg *sync.WaitGroup, s *sessionV1) { + // waitgroup reply deferred until this function returns defer wg.Done() + + // hold lock for map updates inside session s.Lock.Lock() defer s.Lock.Unlock() + if !globalQuietFlag { bar.SetCaption(sURLs.SourceContent.Name + ": ") } @@ -105,6 +110,10 @@ func doSyncSession(sURLs syncURLs, bar *barSend, syncQueue chan bool, ssCh chan var newReader io.Reader switch globalQuietFlag { case true: + console.Infos(SyncMessage{ + Source: sURLs.SourceContent.Name, + Target: strings.Join(targetURLs, " "), + }) newReader = yielder.NewReader(reader) default: // set up progress diff --git a/cp-url.go b/cp-url.go index d3c71788..3cc69963 100644 --- a/cp-url.go +++ b/cp-url.go @@ -53,6 +53,13 @@ type cpURLs struct { Error error } +func (c cpURLs) IsEmpty() bool { + if c.SourceContent == nil && c.TargetContent == nil { + return true + } + return false +} + type cpURLsType uint8 const ( diff --git a/print-structs.go b/print-structs.go index 065eb44d..b81c2119 100644 --- a/print-structs.go +++ b/print-structs.go @@ -74,6 +74,7 @@ func (i InfoMessage) String() string { return i.Message } +// CopyMessage container for file copy messages type CopyMessage struct { Message string `json:"message"` Source string `json:"source"` @@ -83,3 +84,10 @@ type CopyMessage struct { func (c CopyMessage) String() string { return fmt.Sprintf("‘%s’ -> ‘%s’", c.Source, c.Target) } + +// SyncMessage container for file sync messages, inherits CopyMessage +type SyncMessage CopyMessage + +func (s SyncMessage) String() string { + return fmt.Sprintf("‘%s’ -> ‘%s’", s.Source, s.Target) +} diff --git a/sync-url.go b/sync-url.go index 7fd82351..efd10c16 100644 --- a/sync-url.go +++ b/sync-url.go @@ -52,6 +52,22 @@ type syncURLs struct { Error error } +func (s syncURLs) IsEmpty() bool { + empty := false + if s.SourceContent == nil { + empty = true + if s.TargetContents == nil { + empty = true + return empty + } + if len(s.TargetContents) > 0 && s.TargetContents[0] == nil { + empty = true + return empty + } + } + return empty +} + type syncURLsType cpURLsType // guessSyncURLType guesses the type of URL. This approach all allows prepareURL @@ -91,7 +107,9 @@ func prepareSyncURLsTypeA(sourceURL string, targetURLs []string) <-chan syncURLs sURLs.SourceContent = cURLs.SourceContent sURLs.TargetContents = append(sURLs.TargetContents, cURLs.TargetContent) } - syncURLsCh <- sURLs + if !sURLs.IsEmpty() { + syncURLsCh <- sURLs + } }() return syncURLsCh } @@ -113,7 +131,9 @@ func prepareSyncURLsTypeB(sourceURL string, targetURLs []string) <-chan syncURLs sURLs.SourceContent = cURLs.SourceContent sURLs.TargetContents = append(sURLs.TargetContents, cURLs.TargetContent) } - syncURLsCh <- sURLs + if !sURLs.IsEmpty() { + syncURLsCh <- sURLs + } }() return syncURLsCh }