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

Method Dispatch

pkg/cmd/extension/manager.go:94–140  ·  view source on GitHub ↗
(args []string, stdin io.Reader, stdout, stderr io.Writer)

Source from the content-addressed store, hash-verified

92}
93
94func (m *Manager) Dispatch(args []string, stdin io.Reader, stdout, stderr io.Writer) (bool, error) {
95 if len(args) == 0 {
96 return false, errors.New("too few arguments in list")
97 }
98
99 var exe string
100 extName := args[0]
101 forwardArgs := args[1:]
102
103 exts, _ := m.list(false)
104 var ext *Extension
105 for _, e := range exts {
106 if e.Name() == extName {
107 ext = e
108 exe = ext.Path()
109 break
110 }
111 }
112 if exe == "" {
113 return false, nil
114 }
115
116 var externalCmd *exec.Cmd
117
118 if ext.IsBinary() || runtime.GOOS != "windows" {
119 externalCmd = m.newCommand(exe, forwardArgs...)
120 } else if runtime.GOOS == "windows" {
121 // Dispatch all extension calls through the `sh` interpreter to support executable files with a
122 // shebang line on Windows.
123 shExe, err := m.findSh()
124 if err != nil {
125 if errors.Is(err, exec.ErrNotFound) {
126 return true, errors.New("the `sh.exe` interpreter is required. Please install Git for Windows and try again")
127 }
128 return true, err
129 }
130 forwardArgs = append([]string{"-c", `command "$@"`, "--", exe}, forwardArgs...)
131 externalCmd = m.newCommand(shExe, forwardArgs...)
132 }
133 // Tell the extension that gh dispatched it and provide a reliable path back to this executable.
134 externalCmd.Env = append(externalCmd.Environ(), "GH_EXTENSION=1", "GH_PATH="+m.ghPath)
135
136 externalCmd.Stdin = stdin
137 externalCmd.Stdout = stdout
138 externalCmd.Stderr = stderr
139 return true, externalCmd.Run()
140}
141
142func (m *Manager) List() []extensions.Extension {
143 exts, _ := m.list(false)

Callers

nothing calls this directly

Calls 5

listMethod · 0.95
PathMethod · 0.95
IsBinaryMethod · 0.95
NameMethod · 0.65
RunMethod · 0.65

Tested by

no test coverage detected