@@ -8,9 +8,12 @@ import (
8
8
"os/exec"
9
9
"strings"
10
10
11
- cmds "github.com/ipfs/go-ipfs/commands"
11
+ oldcmds "github.com/ipfs/go-ipfs/commands"
12
+ cmdenv "github.com/ipfs/go-ipfs/core/commands/cmdenv"
13
+ e "github.com/ipfs/go-ipfs/core/commands/e"
12
14
13
- "gx/ipfs/Qmde5VP1qUkyQXKCfmEUA7bP64V2HAptbJ7phuPp7jXWwg/go-ipfs-cmdkit"
15
+ cmds "gx/ipfs/Qma6uuSyjkecGhMFFLfzyJDPyoDtNJSHJNweDccZhaWkgU/go-ipfs-cmds"
16
+ cmdkit "gx/ipfs/Qmde5VP1qUkyQXKCfmEUA7bP64V2HAptbJ7phuPp7jXWwg/go-ipfs-cmdkit"
14
17
)
15
18
16
19
func ExternalBinary () * cmds.Command {
@@ -19,29 +22,27 @@ func ExternalBinary() *cmds.Command {
19
22
cmdkit .StringArg ("args" , false , true , "Arguments for subcommand." ),
20
23
},
21
24
External : true ,
22
- Run : func (req cmds.Request , res cmds.Response ) {
23
- binname := strings .Join (append ([]string {"ipfs" }, req .Path () ... ), "-" )
25
+ Run : func (req * cmds.Request , res cmds.ResponseEmitter , env cmds. Environment ) error {
26
+ binname := strings .Join (append ([]string {"ipfs" }, req .Path ... ), "-" )
24
27
_ , err := exec .LookPath (binname )
25
28
if err != nil {
26
29
// special case for '--help' on uninstalled binaries.
27
- for _ , arg := range req .Arguments () {
30
+ for _ , arg := range req .Arguments {
28
31
if arg == "--help" || arg == "-h" {
29
32
buf := new (bytes.Buffer )
30
33
fmt .Fprintf (buf , "%s is an 'external' command.\n " , binname )
31
34
fmt .Fprintf (buf , "It does not currently appear to be installed.\n " )
32
35
fmt .Fprintf (buf , "Please refer to the ipfs documentation for instructions.\n " )
33
- res .SetOutput (buf )
34
- return
36
+ return res .Emit (buf )
35
37
}
36
38
}
37
39
38
- res .SetError (fmt .Errorf ("%s not installed" , binname ), cmdkit .ErrNormal )
39
- return
40
+ return fmt .Errorf ("%s not installed" , binname )
40
41
}
41
42
42
43
r , w := io .Pipe ()
43
44
44
- cmd := exec .Command (binname , req .Arguments () ... )
45
+ cmd := exec .Command (binname , req .Arguments ... )
45
46
46
47
// TODO: make commands lib be able to pass stdin through daemon
47
48
//cmd.Stdin = req.Stdin()
@@ -50,39 +51,44 @@ func ExternalBinary() *cmds.Command {
50
51
cmd .Stderr = w
51
52
52
53
// setup env of child program
53
- env := os .Environ ()
54
+ osenv := os .Environ ()
54
55
55
56
// Get the node iff already defined.
56
- if req .InvocContext ().Online {
57
- nd , err := req .InvocContext ().GetNode ()
57
+ ctx , ok := env .(* oldcmds.Context )
58
+ if ! ok {
59
+ return e .TypeErr (ctx , env )
60
+ }
61
+
62
+ if ctx .Online {
63
+ nd , err := cmdenv .GetNode (env )
58
64
if err != nil {
59
- res .SetError (fmt .Errorf (
60
- "failed to start ipfs node: %s" ,
61
- err ,
62
- ), cmdkit .ErrFatal )
63
- return
65
+ return fmt .Errorf ("failed to start ipfs node: %s" , err )
64
66
}
65
- env = append (env , fmt .Sprintf ("IPFS_ONLINE=%t" , nd .OnlineMode ()))
67
+ osenv = append (osenv , fmt .Sprintf ("IPFS_ONLINE=%t" , nd .OnlineMode ()))
66
68
}
67
69
68
- cmd .Env = env
70
+ cmd .Env = osenv
69
71
70
72
err = cmd .Start ()
71
73
if err != nil {
72
- res .SetError (fmt .Errorf ("failed to start subcommand: %s" , err ), cmdkit .ErrNormal )
73
- return
74
+ return fmt .Errorf ("failed to start subcommand: %s" , err )
74
75
}
75
76
76
- res . SetOutput ( r )
77
+ errC := make ( chan error )
77
78
78
79
go func () {
80
+ var err error
81
+ defer func () { errC <- err }()
79
82
err = cmd .Wait ()
80
- if err != nil {
81
- res .SetError (err , cmdkit .ErrNormal )
82
- }
83
-
84
83
w .Close ()
85
84
}()
85
+
86
+ err = res .Emit (r )
87
+ if err != nil {
88
+ return err
89
+ }
90
+
91
+ return <- errC
86
92
},
87
93
}
88
94
}
0 commit comments