MCPcopy Create free account
hub / github.com/cli/cli / NewCmdExtension

Function NewCmdExtension

pkg/cmd/root/extension.go:22–91  ·  view source on GitHub ↗
(io *iostreams.IOStreams, em extensions.ExtensionManager, ext extensions.Extension, checkExtensionReleaseInfo func(extensions.ExtensionManager, extensions.Extension) (*update.ReleaseInfo, error))

Source from the content-addressed store, hash-verified

20}
21
22func NewCmdExtension(io *iostreams.IOStreams, em extensions.ExtensionManager, ext extensions.Extension, checkExtensionReleaseInfo func(extensions.ExtensionManager, extensions.Extension) (*update.ReleaseInfo, error)) *cobra.Command {
23 updateMessageChan := make(chan *update.ReleaseInfo)
24 cs := io.ColorScheme()
25 hasDebug, _ := utils.IsDebugEnabled()
26 if checkExtensionReleaseInfo == nil {
27 checkExtensionReleaseInfo = checkForExtensionUpdate
28 }
29
30 cmd := &cobra.Command{
31 Use: ext.Name(),
32 Short: fmt.Sprintf("Extension %s", ext.Name()),
33 // PreRun handles looking up whether extension has a latest version only when the command is ran.
34 PreRun: func(c *cobra.Command, args []string) {
35 go func() {
36 releaseInfo, err := checkExtensionReleaseInfo(em, ext)
37 if err != nil && hasDebug {
38 fmt.Fprintf(io.ErrOut, "warning: checking for update failed: %v", err)
39 }
40 updateMessageChan <- releaseInfo
41 }()
42 },
43 RunE: func(c *cobra.Command, args []string) error {
44 args = append([]string{ext.Name()}, args...)
45 if _, err := em.Dispatch(args, io.In, io.Out, io.ErrOut); err != nil {
46 if execError, ok := errors.AsType[*exec.ExitError](err); ok {
47 return &ExternalCommandExitError{execError}
48 }
49 return fmt.Errorf("failed to run extension: %w\n", err)
50 }
51 return nil
52 },
53 // PostRun handles communicating extension release information if found
54 PostRun: func(c *cobra.Command, args []string) {
55 select {
56 case releaseInfo := <-updateMessageChan:
57 if releaseInfo != nil {
58 stderr := io.ErrOut
59 fmt.Fprintf(stderr, "\n\n%s %s → %s\n",
60 cs.Yellowf("A new release of %s is available:", ext.Name()),
61 cs.Cyan(strings.TrimPrefix(ext.CurrentVersion(), "v")),
62 cs.Cyan(strings.TrimPrefix(releaseInfo.Version, "v")))
63 if ext.IsPinned() {
64 fmt.Fprintf(stderr, "To upgrade, run: gh extension upgrade %s --force\n", ext.Name())
65 } else {
66 fmt.Fprintf(stderr, "To upgrade, run: gh extension upgrade %s\n", ext.Name())
67 }
68 fmt.Fprintf(stderr, "%s\n\n",
69 cs.Yellow(releaseInfo.URL))
70 }
71 default:
72 // Do not make the user wait for extension update check if incomplete by this time.
73 // This is being handled in non-blocking default as there is no context to cancel like in gh update checks.
74 }
75 },
76 GroupID: "extension",
77 DisableFlagParsing: true,
78 }
79

Calls 14

IsDebugEnabledFunction · 0.92
DisableAuthCheckFunction · 0.92
IsOfficialFunction · 0.92
DisableTelemetryFunction · 0.92
ColorSchemeMethod · 0.80
YellowfMethod · 0.80
CyanMethod · 0.80
YellowMethod · 0.80
NameMethod · 0.65
DispatchMethod · 0.65
ErrorfMethod · 0.65
CurrentVersionMethod · 0.65