@@ -38,8 +38,8 @@ type Shell struct {
38
38
url string
39
39
httpcli gohttp.Client
40
40
41
- versionOnce sync.Once
42
- version * semver.Version
41
+ versionMu sync.Mutex
42
+ version * semver.Version
43
43
}
44
44
45
45
func NewLocalShell () * Shell {
@@ -130,33 +130,34 @@ func NewShellWithClient(url string, client *gohttp.Client) *Shell {
130
130
// multipart requests is %-encoded. Before this version, its sent raw.
131
131
var encodedAbsolutePathVersion = semver .MustParse ("0.23.0-dev" )
132
132
133
- func (s * Shell ) loadRemoteVersion () error {
133
+ func (s * Shell ) loadRemoteVersion () (* semver.Version , error ) {
134
+ s .versionMu .Lock ()
135
+ defer s .versionMu .Unlock ()
136
+
134
137
if s .version == nil {
135
138
version , _ , err := s .Version ()
136
139
if err != nil {
137
- return err
140
+ return nil , err
138
141
}
139
142
140
143
remoteVersion , err := semver .New (version )
141
144
if err != nil {
142
- return err
145
+ return nil , err
143
146
}
144
147
145
- s .versionOnce .Do (func () {
146
- s .version = remoteVersion
147
- })
148
+ s .version = remoteVersion
148
149
}
149
150
150
- return nil
151
+ return s . version , nil
151
152
}
152
153
153
154
func (s * Shell ) newMultiFileReader (dir files.Directory ) (* files.MultiFileReader , error ) {
154
- err := s .loadRemoteVersion ()
155
+ version , err := s .loadRemoteVersion ()
155
156
if err != nil {
156
157
return nil , err
157
158
}
158
159
159
- return files .NewMultiFileReader (dir , true , s . version .LT (encodedAbsolutePathVersion )), nil
160
+ return files .NewMultiFileReader (dir , true , version .LT (encodedAbsolutePathVersion )), nil
160
161
}
161
162
162
163
func (s * Shell ) SetTimeout (d time.Duration ) {
@@ -406,7 +407,10 @@ func (s *Shell) PatchData(root string, set bool, data interface{}) (string, erro
406
407
407
408
fr := files .NewReaderFile (read )
408
409
slf := files .NewSliceDirectory ([]files.DirEntry {files .FileEntry ("" , fr )})
409
- fileReader := files .NewMultiFileReader (slf , true , s .version .LT (encodedAbsolutePathVersion ))
410
+ fileReader , err := s .newMultiFileReader (slf )
411
+ if err != nil {
412
+ return "" , err
413
+ }
410
414
411
415
var out object
412
416
return out .Hash , s .Request ("object/patch/" + cmd , root ).
@@ -508,7 +512,10 @@ func (s *Shell) BlockPut(block []byte, format, mhtype string, mhlen int) (string
508
512
509
513
fr := files .NewBytesFile (block )
510
514
slf := files .NewSliceDirectory ([]files.DirEntry {files .FileEntry ("" , fr )})
511
- fileReader := files .NewMultiFileReader (slf , true , s .version .LT (encodedAbsolutePathVersion ))
515
+ fileReader , err := s .newMultiFileReader (slf )
516
+ if err != nil {
517
+ return "" , err
518
+ }
512
519
513
520
return out .Key , s .Request ("block/put" ).
514
521
Option ("mhtype" , mhtype ).
@@ -545,7 +552,10 @@ func (s *Shell) ObjectPut(obj *IpfsObject) (string, error) {
545
552
546
553
fr := files .NewReaderFile (& data )
547
554
slf := files .NewSliceDirectory ([]files.DirEntry {files .FileEntry ("" , fr )})
548
- fileReader := files .NewMultiFileReader (slf , true , s .version .LT (encodedAbsolutePathVersion ))
555
+ fileReader , err := s .newMultiFileReader (slf )
556
+ if err != nil {
557
+ return "" , err
558
+ }
549
559
550
560
var out object
551
561
return out .Hash , s .Request ("object/put" ).
0 commit comments