From 93d1913fb03362f97e95aeacc7d1541764cafc2f Mon Sep 17 00:00:00 2001 From: Yann Soubeyrand Date: Mon, 3 Oct 2022 16:52:50 +0200 Subject: [PATCH] Add OnFinalize method (#1788) This method is the OnInitialize counterpart. Like OnInitialize which allows loading the configuration before each command is executed, OnFinalize allows saving the configuration after each command has been executed. --- cobra.go | 7 +++++++ command.go | 8 ++++++++ 2 files changed, 15 insertions(+) diff --git a/cobra.go b/cobra.go index 1a95c3c1b..fe44bc8a0 100644 --- a/cobra.go +++ b/cobra.go @@ -40,6 +40,7 @@ var templateFuncs = template.FuncMap{ } var initializers []func() +var finalizers []func() const ( defaultPrefixMatching = false @@ -94,6 +95,12 @@ func OnInitialize(y ...func()) { initializers = append(initializers, y...) } +// OnFinalize sets the passed functions to be run when each command's +// Execute method is terminated. +func OnFinalize(y ...func()) { + finalizers = append(finalizers, y...) +} + // FIXME Gt is unused by cobra and should be removed in a version 2. It exists only for compatibility with users of cobra. // Gt takes two types and checks whether the first type is greater than the second. In case of types Arrays, Chans, diff --git a/command.go b/command.go index 5ed3df8de..8ce5c3c88 100644 --- a/command.go +++ b/command.go @@ -834,6 +834,8 @@ func (c *Command) execute(a []string) (err error) { c.preRun() + defer c.postRun() + argWoFlags := c.Flags().Args() if c.DisableFlagParsing { argWoFlags = a @@ -904,6 +906,12 @@ func (c *Command) preRun() { } } +func (c *Command) postRun() { + for _, x := range finalizers { + x() + } +} + // ExecuteContext is the same as Execute(), but sets the ctx on the command. // Retrieve ctx by calling cmd.Context() inside your *Run lifecycle or ValidArgs // functions.