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