@@ -4,10 +4,12 @@ import (
4
4
"context"
5
5
"fmt"
6
6
"io"
7
+ "os"
7
8
"time"
8
9
9
10
core "github.com/ipfs/go-ipfs/core"
10
11
cmdenv "github.com/ipfs/go-ipfs/core/commands/cmdenv"
12
+ e "github.com/ipfs/go-ipfs/core/commands/e"
11
13
iface "github.com/ipfs/go-ipfs/core/coreapi/interface"
12
14
options "github.com/ipfs/go-ipfs/core/coreapi/interface/options"
13
15
corerepo "github.com/ipfs/go-ipfs/core/corerepo"
@@ -19,7 +21,7 @@ import (
19
21
"gx/ipfs/QmYMQuypUbgsdNHmuCBSUJV6wdQVsBHRivNAp3efHJwZJD/go-verifcid"
20
22
cmds "gx/ipfs/Qma6uuSyjkecGhMFFLfzyJDPyoDtNJSHJNweDccZhaWkgU/go-ipfs-cmds"
21
23
dag "gx/ipfs/QmaDBne4KeY3UepeqSVKYpSmQGa3q9zP6x3LfVF2UjF3Hc/go-merkledag"
22
- "gx/ipfs/Qmde5VP1qUkyQXKCfmEUA7bP64V2HAptbJ7phuPp7jXWwg/go-ipfs-cmdkit"
24
+ cmdkit "gx/ipfs/Qmde5VP1qUkyQXKCfmEUA7bP64V2HAptbJ7phuPp7jXWwg/go-ipfs-cmdkit"
23
25
)
24
26
25
27
var PinCmd = & cmds.Command {
@@ -65,11 +67,6 @@ var addPinCmd = &cmds.Command{
65
67
},
66
68
Type : AddPinOutput {},
67
69
Run : func (req * cmds.Request , res cmds.ResponseEmitter , env cmds.Environment ) error {
68
- err := req .ParseBodyArgs ()
69
- if err != nil {
70
- return err
71
- }
72
-
73
70
n , err := cmdenv .GetNode (env )
74
71
if err != nil {
75
72
return err
@@ -86,6 +83,10 @@ var addPinCmd = &cmds.Command{
86
83
recursive , _ := req .Options [pinRecursiveOptionName ].(bool )
87
84
showProgress , _ := req .Options [pinProgressOptionName ].(bool )
88
85
86
+ if err := req .ParseBodyArgs (); err != nil {
87
+ return err
88
+ }
89
+
89
90
if ! showProgress {
90
91
added , err := corerepo .Pin (n , api , req .Context , req .Arguments , recursive )
91
92
if err != nil {
@@ -94,84 +95,83 @@ var addPinCmd = &cmds.Command{
94
95
return cmds .EmitOnce (res , & AddPinOutput {Pins : cidsToStrings (added )})
95
96
}
96
97
97
- out := make (chan interface {})
98
-
99
98
v := new (dag.ProgressTracker )
100
99
ctx := v .DeriveContext (req .Context )
101
100
102
101
type pinResult struct {
103
102
pins []cid.Cid
104
103
err error
105
104
}
105
+
106
106
ch := make (chan pinResult , 1 )
107
107
go func () {
108
108
added , err := corerepo .Pin (n , api , ctx , req .Arguments , recursive )
109
109
ch <- pinResult {pins : added , err : err }
110
110
}()
111
111
112
- errC := make (chan error )
113
- go func () {
114
- var err error
115
- ticker := time .NewTicker (500 * time .Millisecond )
116
- defer ticker .Stop ()
117
- defer func () { errC <- err }()
118
- defer close (out )
112
+ ticker := time .NewTicker (500 * time .Millisecond )
113
+ defer ticker .Stop ()
119
114
120
- for {
121
- select {
122
- case val := <- ch :
123
- if val .err != nil {
124
- err = val .err
125
- return
126
- }
115
+ for {
116
+ select {
117
+ case val := <- ch :
118
+ if val .err != nil {
119
+ return val .err
120
+ }
127
121
128
- if pv := v .Value (); pv != 0 {
129
- out <- & AddPinOutput {Progress : v .Value ()}
122
+ if pv := v .Value (); pv != 0 {
123
+ if err := res .Emit (& AddPinOutput {Progress : v .Value ()}); err != nil {
124
+ return err
130
125
}
131
- out <- & AddPinOutput {Pins : cidsToStrings (val .pins )}
132
- return
133
- case <- ticker .C :
134
- out <- & AddPinOutput {Progress : v .Value ()}
135
- case <- ctx .Done ():
136
- log .Error (ctx .Err ())
137
- err = ctx .Err ()
138
- return
139
126
}
127
+ return res .Emit (& AddPinOutput {Pins : cidsToStrings (val .pins )})
128
+ case <- ticker .C :
129
+ if err := res .Emit (& AddPinOutput {Progress : v .Value ()}); err != nil {
130
+ return err
131
+ }
132
+ case <- ctx .Done ():
133
+ log .Error (ctx .Err ())
134
+ return ctx .Err ()
140
135
}
141
- }()
142
-
143
- err = res .Emit (out )
144
- if err != nil {
145
- return err
146
136
}
147
-
148
- return <- errC
149
137
},
150
- Encoders : cmds.EncoderMap {
151
- cmds .Text : cmds . MakeTypedEncoder ( func (req * cmds.Request , w io. Writer , out * AddPinOutput ) error {
152
- var added [] string
153
-
154
- if out . Pins != nil {
155
- added = out . Pins
156
- } else {
157
- // this can only happen if the progress option is set
158
- return fmt . Errorf ( "Fetched/Processed %d nodes \r " , out . Progress )
159
- }
138
+ PostRun : cmds.PostRunMap {
139
+ cmds .CLI : func (res cmds.Response , re cmds. ResponseEmitter ) error {
140
+ for {
141
+ v , err := res . Next ()
142
+ if err != nil {
143
+ if err == io . EOF {
144
+ return nil
145
+ }
146
+ return err
147
+ }
160
148
161
- var pintype string
162
- rec , found := req .Options ["recursive" ].(bool )
163
- if rec || ! found {
164
- pintype = "recursively"
165
- } else {
166
- pintype = "directly"
167
- }
149
+ out , ok := v .(* AddPinOutput )
150
+ if ! ok {
151
+ return e .TypeErr (out , v )
152
+ }
153
+ var added []string
168
154
169
- for _ , k := range added {
170
- fmt .Fprintf (w , "pinned %s %s\n " , k , pintype )
171
- }
155
+ if out .Pins != nil {
156
+ added = out .Pins
157
+ } else {
158
+ // this can only happen if the progress option is set
159
+ fmt .Fprintf (os .Stderr , "Fetched/Processed %d nodes\r " , out .Progress )
160
+ }
172
161
173
- return nil
174
- }),
162
+ var pintype string
163
+ rec , found := res .Request ().Options ["recursive" ].(bool )
164
+ if rec || ! found {
165
+ pintype = "recursively"
166
+ } else {
167
+ pintype = "directly"
168
+ }
169
+
170
+ for _ , k := range added {
171
+ fmt .Fprintf (os .Stdout , "pinned %s %s\n " , k , pintype )
172
+ }
173
+ }
174
+ },
175
175
},
176
176
}
177
177
@@ -192,11 +192,6 @@ collected if needed. (By default, recursively. Use -r=false for direct pins.)
192
192
},
193
193
Type : PinOutput {},
194
194
Run : func (req * cmds.Request , res cmds.ResponseEmitter , env cmds.Environment ) error {
195
- err := req .ParseBodyArgs ()
196
- if err != nil {
197
- return err
198
- }
199
-
200
195
n , err := cmdenv .GetNode (env )
201
196
if err != nil {
202
197
return err
@@ -210,6 +205,10 @@ collected if needed. (By default, recursively. Use -r=false for direct pins.)
210
205
// set recursive flag
211
206
recursive , _ := req .Options [pinRecursiveOptionName ].(bool )
212
207
208
+ if err := req .ParseBodyArgs (); err != nil {
209
+ return err
210
+ }
211
+
213
212
removed , err := corerepo .Unpin (n , api , req .Context , req .Arguments , recursive )
214
213
if err != nil {
215
214
return err
0 commit comments