diff --git a/internal/txlib/merge.go b/internal/txlib/merge.go index ce457f6..8ee141b 100644 --- a/internal/txlib/merge.go +++ b/internal/txlib/merge.go @@ -95,7 +95,7 @@ type MergeResourcePollTask struct { args MergeCommandArguments } -func (task *MergeResourcePollTask) Run(send func(string), abort func()) { +func (task *MergeResourcePollTask) Run(send func(string), abort func()) bool { merge := task.merge args := task.args @@ -124,7 +124,8 @@ func (task *MergeResourcePollTask) Run(send func(string), abort func()) { if !args.Skip { abort() } - return + return false } sendMessage("Done", false) + return true } diff --git a/internal/txlib/pull.go b/internal/txlib/pull.go index 48e4717..cb910b6 100644 --- a/internal/txlib/pull.go +++ b/internal/txlib/pull.go @@ -142,7 +142,7 @@ type ResourcePullTask struct { cfg *config.Config } -func (task *ResourcePullTask) Run(send func(string), abort func()) { +func (task *ResourcePullTask) Run(send func(string), abort func()) bool { cfgResource := task.cfgResource api := task.api args := task.args @@ -177,7 +177,7 @@ func (task *ResourcePullTask) Run(send func(string), abort func()) { if !args.Skip { abort() } - return + return false } if resource == nil { sendMessage( @@ -188,7 +188,7 @@ func (task *ResourcePullTask) Run(send func(string), abort func()) { ), true, ) - return + return false } projectRelationship, err := resource.Fetch("project") @@ -197,7 +197,7 @@ func (task *ResourcePullTask) Run(send func(string), abort func()) { if !args.Skip { abort() } - return + return false } project := projectRelationship.DataSingular sourceLanguage := project.Relationships["source_language"].DataSingular @@ -213,7 +213,7 @@ func (task *ResourcePullTask) Run(send func(string), abort func()) { if !args.Skip { abort() } - return + return false } if args.Source { @@ -242,7 +242,7 @@ func (task *ResourcePullTask) Run(send func(string), abort func()) { if !args.Skip { abort() } - return + return false } fileFilter := setFileTypeExtensions(args.FileType, cfgResource.FileFilter) if args.Pseudo { @@ -329,6 +329,7 @@ func (task *ResourcePullTask) Run(send func(string), abort func()) { } } sendMessage("Done", false) + return true } type FilePullTask struct { @@ -342,7 +343,7 @@ type FilePullTask struct { remoteToLocalLanguageMappings map[string]string } -func (task *FilePullTask) Run(send func(string), abort func()) { +func (task *FilePullTask) Run(send func(string), abort func()) bool { cfgResource := task.cfgResource languageCode := task.languageCode args := task.args @@ -381,7 +382,7 @@ func (task *FilePullTask) Run(send func(string), abort func()) { if err == nil && args.DisableOverwrite { if !args.KeepNewFiles { sendMessage("Disable overwrite enabled, skipping", false) - return + return true } else { sourceFile = sourceFile + ".new" } @@ -398,11 +399,11 @@ func (task *FilePullTask) Run(send func(string), abort func()) { if !args.Skip { abort() } - return + return false } if shouldSkip { sendMessage("Local file is newer than remote, skipping", false) - return + return true } } @@ -429,7 +430,7 @@ func (task *FilePullTask) Run(send func(string), abort func()) { if !args.Skip { abort() } - return + return false } // Polling @@ -446,7 +447,7 @@ func (task *FilePullTask) Run(send func(string), abort func()) { if !args.Skip { abort() } - return + return false } } else { if filePath != "" { @@ -454,7 +455,7 @@ func (task *FilePullTask) Run(send func(string), abort func()) { if args.DisableOverwrite { if !args.KeepNewFiles { sendMessage("Disable overwrite enabled, skipping", false) - return + return true } else { filePath = filePath + ".new" } @@ -470,7 +471,7 @@ func (task *FilePullTask) Run(send func(string), abort func()) { (!stringSliceContains(args.Languages, remoteLanguageCode) && !stringSliceContains(args.Languages, localLanguageCode)) { sendMessage("File was not found locally, skipping", false) - return + return true } pseudo_postfix := "" if args.Pseudo { @@ -503,11 +504,11 @@ func (task *FilePullTask) Run(send func(string), abort func()) { if !args.Skip { abort() } - return + return false } if shouldSkip { sendMessage(feedbackMessage, false) - return + return true } // Creating download job @@ -544,7 +545,7 @@ func (task *FilePullTask) Run(send func(string), abort func()) { if !args.Skip { abort() } - return + return false } // Polling @@ -561,10 +562,11 @@ func (task *FilePullTask) Run(send func(string), abort func()) { if !args.Skip { abort() } - return + return false } } sendMessage("Done", false) + return true } func shouldSkipDownload( diff --git a/internal/txlib/push.go b/internal/txlib/push.go index 93ca82a..6a77e2f 100644 --- a/internal/txlib/push.go +++ b/internal/txlib/push.go @@ -264,7 +264,7 @@ type ResourcePushTask struct { targetLanguagesChannel chan TargetLanguageMessage } -func (task *ResourcePushTask) Run(send func(string), abort func()) { +func (task *ResourcePushTask) Run(send func(string), abort func()) bool { cfg := task.cfg cfgResource := task.cfgResource sourceTaskChannel := task.sourceTaskChannel @@ -291,7 +291,7 @@ func (task *ResourcePushTask) Run(send func(string), abort func()) { if !args.Skip { abort() } - return + return false } resourceIsNew := resource == nil @@ -305,7 +305,7 @@ func (task *ResourcePushTask) Run(send func(string), abort func()) { if !args.Skip { abort() } - return + return false } sendMessage("Resource does not exist; creating", false) if cfgResource.Type == "" { @@ -313,7 +313,7 @@ func (task *ResourcePushTask) Run(send func(string), abort func()) { if !args.Skip { abort() } - return + return false } var resourceName string var baseResourceId string @@ -341,7 +341,7 @@ func (task *ResourcePushTask) Run(send func(string), abort func()) { if !args.Skip { abort() } - return + return false } if args.Base != "-1" { if baseResource == nil { @@ -349,7 +349,7 @@ func (task *ResourcePushTask) Run(send func(string), abort func()) { if !args.Skip { abort() } - return + return false } } else { if baseResource == nil { @@ -375,7 +375,7 @@ func (task *ResourcePushTask) Run(send func(string), abort func()) { if !args.Skip { abort() } - return + return false } } else { if args.Branch != "" && args.Base != "-1" { @@ -396,7 +396,7 @@ func (task *ResourcePushTask) Run(send func(string), abort func()) { if !args.Skip { abort() } - return + return false } } } @@ -408,7 +408,7 @@ func (task *ResourcePushTask) Run(send func(string), abort func()) { if !args.Skip { abort() } - return + return false } project := projectRelationship.DataSingular sourceLanguageRelationship, exists := project.Relationships["source_language"] @@ -421,7 +421,7 @@ func (task *ResourcePushTask) Run(send func(string), abort func()) { if !args.Skip { abort() } - return + return false } sourceLanguage := sourceLanguageRelationship.DataSingular var remoteStats map[string]*jsonapi.Resource @@ -435,7 +435,7 @@ func (task *ResourcePushTask) Run(send func(string), abort func()) { if !args.Skip { abort() } - return + return false } if args.Source || !args.Translation { sourceTaskChannel <- &SourceFilePushTask{ @@ -461,7 +461,7 @@ func (task *ResourcePushTask) Run(send func(string), abort func()) { if !args.Skip { abort() } - return + return false } fileFilter := cfgResource.FileFilter err = checkFileFilter(fileFilter) @@ -470,7 +470,7 @@ func (task *ResourcePushTask) Run(send func(string), abort func()) { if !args.Skip { abort() } - return + return false } if args.Xliff { fileFilter = fmt.Sprintf("%s.xlf", fileFilter) @@ -485,14 +485,14 @@ func (task *ResourcePushTask) Run(send func(string), abort func()) { if !args.Skip { abort() } - return + return false } allLanguages, err := txapi.GetLanguages(api) if err != nil { sendMessage(err.Error(), true) abort() - return + return false } for _, languageCode := range newLanguageCodes { _, exists := allLanguages[languageCode] @@ -519,6 +519,7 @@ func (task *ResourcePushTask) Run(send func(string), abort func()) { } } sendMessage("Done", false) + return true } type LanguagePushTask struct { @@ -527,7 +528,7 @@ type LanguagePushTask struct { args PushCommandArguments } -func (task *LanguagePushTask) Run(send func(string), abort func()) { +func (task *LanguagePushTask) Run(send func(string), abort func()) bool { project := task.project languages := task.languages args := task.args @@ -558,10 +559,11 @@ func (task *LanguagePushTask) Run(send func(string), abort func()) { if err != nil { sendMessage(err.Error(), true) abort() - return + return false } sendMessage("Done", false) + return true } type SourceFilePushTask struct { @@ -573,7 +575,7 @@ type SourceFilePushTask struct { resourceIsNew bool } -func (task *SourceFilePushTask) Run(send func(string), abort func()) { +func (task *SourceFilePushTask) Run(send func(string), abort func()) bool { api := task.api resource := task.resource sourceFile := task.sourceFile @@ -595,7 +597,7 @@ func (task *SourceFilePushTask) Run(send func(string), abort func()) { if !args.Skip { abort() } - return + return false } defer file.Close() @@ -607,14 +609,14 @@ func (task *SourceFilePushTask) Run(send func(string), abort func()) { ) if skip { sendMessage("Skipping", false) - return + return false } if err != nil { sendMessage(err.Error(), true) if !args.Skip { abort() } - return + return false } } @@ -635,7 +637,7 @@ func (task *SourceFilePushTask) Run(send func(string), abort func()) { if !args.Skip { abort() } - return + return false } // Polling @@ -652,10 +654,11 @@ func (task *SourceFilePushTask) Run(send func(string), abort func()) { if !args.Skip { abort() } - return + return false } sendMessage("Done", false) + return true } type TranslationFileTask struct { @@ -668,7 +671,7 @@ type TranslationFileTask struct { resourceIsNew bool } -func (task *TranslationFileTask) Run(send func(string), abort func()) { +func (task *TranslationFileTask) Run(send func(string), abort func()) bool { api := task.api languageCode := task.languageCode path := task.path @@ -700,11 +703,11 @@ func (task *TranslationFileTask) Run(send func(string), abort func()) { if !args.Skip { abort() } - return + return false } if skip { sendMessage("Skipping because remote file is newer than local", false) - return + return true } } } @@ -728,7 +731,7 @@ func (task *TranslationFileTask) Run(send func(string), abort func()) { if !args.Skip { abort() } - return + return false } // Polling @@ -744,9 +747,10 @@ func (task *TranslationFileTask) Run(send func(string), abort func()) { if !args.Skip { abort() } - return + return false } sendMessage("Done", false) + return true } func getFilesToPush( diff --git a/pkg/worker_pool/main.go b/pkg/worker_pool/main.go index 5f86876..7b2f4ee 100644 --- a/pkg/worker_pool/main.go +++ b/pkg/worker_pool/main.go @@ -9,10 +9,11 @@ Usage: i int } - func (task *Task) Run(send func(string), abort funct()) { + func (task *Task) Run(send func(string), abort func()) bool { send(fmt.Sprintf("Processing task %d\n", task.i)) time.Sleep(time.Duration(5) * time.Second) send(fmt.Sprintf("Processed task %d\n", task.i)) + return true } func main() { @@ -41,9 +42,10 @@ listen to other channels that the tasks can write to at the same time: resultChannel chan int } - func (task Task) Run() { + func (task Task) Run(send func(string), abort func()) bool { time.Sleep(time.Duration(5) * time.Second) resultChannel <- task.i * task.i + return true } func main() { @@ -76,12 +78,13 @@ done, you can check the IsAborted field to see if any of the tasks aborted. i int } - func (task Task) Run(send func(string), abort func()) { + func (task Task) Run(send func(string), abort func()) bool { if task.i == 20 { abort() - return + return false } // Do stuff + return true } func main() { @@ -95,6 +98,11 @@ done, you can check the IsAborted field to see if any of the tasks aborted. fmt.Pritnln("Something went wrong") } } + +You can indicate the success status of a completed task by returning true or +false from the 'Run' method. The printed logs will show the number of +successful tasks. Furthermore, you can inspect the 'pool.FinishedTasks' value +after the worker pool has finished. */ package worker_pool @@ -111,7 +119,7 @@ import ( ) type Task interface { - Run(send func(string), abort func()) + Run(send func(string), abort func()) bool } type taskContainer_t struct { @@ -133,7 +141,8 @@ type Pool struct { counter int forceNotTerminal bool - IsAborted bool + IsAborted bool + FinishedTasks int32 } func New(numWorkers, numTasks int, forceNotTerminal bool) *Pool { @@ -160,22 +169,23 @@ func (pool *Pool) Start() { } pool.outerWaitGroup.Add(1) - var finishedTasks int32 = 0 - for i := 0; i < pool.numWorkers; i++ { go func() { for taskContainer := range pool.taskChannel { + var success bool if !pool.IsAborted { send := func(body string) { messageChannel <- message_t{taskContainer.i, body} } - taskContainer.task.Run(send, pool.abort) + success = taskContainer.task.Run(send, pool.abort) + } + if success { + atomic.AddInt32(&pool.FinishedTasks, 1) } if !pool.forceNotTerminal && isatty.IsTerminal(os.Stdout.Fd()) { - atomic.AddInt32(&finishedTasks, 1) messageChannel <- message_t{ pool.numTasks, - makeProgressBar(finishedTasks, pool.numTasks), + makeProgressBar(pool.FinishedTasks, pool.numTasks), } } pool.innerWaitGroup.Done() @@ -215,6 +225,8 @@ func (pool *Pool) Start() { exitfor = true if !pool.forceNotTerminal && isatty.IsTerminal(os.Stdout.Fd()) { writer.Stop() + } else { + fmt.Printf("Completed %d / %d tasks\n", pool.FinishedTasks, pool.counter) } close(messageChannel) pool.outerWaitGroup.Done() @@ -225,7 +237,7 @@ func (pool *Pool) Start() { if !pool.forceNotTerminal && isatty.IsTerminal(os.Stdout.Fd()) { messageChannel <- message_t{ pool.numTasks, - makeProgressBar(finishedTasks, pool.numTasks), + makeProgressBar(pool.FinishedTasks, pool.numTasks), } } }