@@ -37,6 +37,7 @@ import (
3737 "io/ioutil"
3838 "os"
3939 "path/filepath"
40+ "strings"
4041
4142 "github.com/bcmi-labs/arduino-cli/auth"
4243 "github.com/bcmi-labs/arduino-cli/create_client_helpers"
@@ -82,7 +83,7 @@ func executeSketchSyncCommand(cmd *cobra.Command, args []string) error {
8283 return nil
8384 }
8485
85- bearerToken , err := login ()
86+ username , bearerToken , err := login ()
8687 if err != nil {
8788 if GlobalFlags .Verbose == 0 {
8889 formatter .PrintErrorMessage ("Cannot login automatically: try arduino login the run again this command" )
@@ -91,34 +92,32 @@ func executeSketchSyncCommand(cmd *cobra.Command, args []string) error {
9192 }
9293 }
9394
94- sketchMap := sketches .Find (sketchbook )
95+ sketchMap := sketches .Find (sketchbook , "libraries" ) //exclude libraries folder
9596
9697 client := createClient .New (nil )
9798 tok := "Bearer " + bearerToken
98- resp , err := client .SearchSketches (context .Background (), createClient .SearchSketchesPath (), nil , nil , & tok )
99+ resp , err := client .SearchSketches (context .Background (), createClient .SearchSketchesPath (), nil , & username , & tok )
99100 if err != nil {
100- //formatter.Print(err)
101101 formatter .PrintErrorMessage ("Cannot get create sketches, sync failed" )
102102 return nil
103103 }
104104 defer resp .Body .Close ()
105105
106106 onlineSketches , err := client .DecodeArduinoCreateSketches (resp )
107107 if err != nil {
108- content , _ := ioutil .ReadAll (resp .Body )
109- formatter .PrintResult (content )
110- formatter .Print (err )
108+
109+ fmt .Println (ioutil .ReadAll (resp .Body ))
111110 formatter .PrintErrorMessage ("Cannot unmarshal response from create, sync failed" )
112111 return nil
113112 }
114113
115114 onlineSketchesMap := make (map [string ]* createClient.ArduinoCreateSketch , len (onlineSketches .Sketches ))
116115 for _ , item := range onlineSketches .Sketches {
117- onlineSketchesMap [fmt . Sprint ( item .ID ) ] = item
116+ onlineSketchesMap [* item .Name ] = item
118117 }
119118
120119 for _ , item := range sketchMap {
121- itemOnline , hasConflict := onlineSketchesMap [item .ID ]
120+ itemOnline , hasConflict := onlineSketchesMap [item .Name ]
122121 if hasConflict {
123122 //solve conflicts
124123 priority := arduinoSketchSyncFlags .Priority
@@ -141,23 +140,28 @@ func executeSketchSyncCommand(cmd *cobra.Command, args []string) error {
141140 }
142141 switch priority {
143142 case "remote" :
143+ formatter .Print ("pushing edits of sketch: " + item .Name )
144144 editSketch (* item , sketchbook , bearerToken )
145145 break
146146 case "local" :
147- pullSketch (* itemOnline , sketchbook , bearerToken )
147+ formatter .Print ("pulling " + item .Name )
148+ pullSketch (itemOnline , sketchbook , bearerToken )
148149 break
149150 case "skip-conflict" :
151+ formatter .Print ("skipping " + item .Name )
150152 break
151153 default :
152154 priority = "skip-conflict"
153155 if GlobalFlags .Verbose > 0 {
154156 formatter .Print ("Priority not recognized, using skip-conflict" )
155157 }
158+ formatter .Print ("skipping " + item .Name )
156159 break
157160 }
158161
159162 delete (onlineSketchesMap , fmt .Sprint (item .ID ))
160163 } else { //only local, push
164+ formatter .Print ("pushing " + item .Name )
161165 pushSketch (* item , sketchbook , bearerToken )
162166 }
163167 }
@@ -167,7 +171,11 @@ func executeSketchSyncCommand(cmd *cobra.Command, args []string) error {
167171 continue
168172 }
169173 //only online, pull
170- pullSketch (* item , sketchbook , bearerToken )
174+ formatter .Print ("pulling " + * item .Name )
175+ err := pullSketch (item , sketchbook , bearerToken )
176+ if err != nil {
177+ formatter .PrintError (err )
178+ }
171179 }
172180 formatter .PrintResult ("OK" ) // Issue # : Provide output struct to print the result in a prettier way.
173181 return nil
@@ -176,7 +184,7 @@ func executeSketchSyncCommand(cmd *cobra.Command, args []string) error {
176184func pushSketch (sketch sketches.Sketch , sketchbook string , bearerToken string ) error {
177185 client := createClient .New (nil )
178186
179- resp , err := client .CreateSketches (nil , createClient .CreateSketchesPath (), createClient .ConvertFrom (sketch ), "Bearer " + bearerToken )
187+ resp , err := client .CreateSketches (context . Background () , createClient .CreateSketchesPath (), createClient .ConvertFrom (sketch ), "Bearer " + bearerToken )
180188 if err != nil {
181189 return err
182190 }
@@ -200,7 +208,7 @@ func pushSketch(sketch sketches.Sketch, sketchbook string, bearerToken string) e
200208func editSketch (sketch sketches.Sketch , sketchbook string , bearerToken string ) error {
201209 client := createClient .New (nil )
202210
203- resp , err := client .EditSketches (nil , createClient .EditSketchesPath (sketch .ID ), createClient .ConvertFrom (sketch ), "Bearer " + bearerToken )
211+ resp , err := client .EditSketches (context . Background () , createClient .EditSketchesPath (sketch .ID ), createClient .ConvertFrom (sketch ), "Bearer " + bearerToken )
204212 if err != nil {
205213 return err
206214 }
@@ -221,10 +229,11 @@ func editSketch(sketch sketches.Sketch, sketchbook string, bearerToken string) e
221229 return nil
222230}
223231
224- func pullSketch (sketch createClient.ArduinoCreateSketch , sketchbook string , bearerToken string ) error {
232+ func pullSketch (sketch * createClient.ArduinoCreateSketch , sketchbook string , bearerToken string ) error {
225233 client := createClient .New (nil )
226234 bearer := "Bearer " + bearerToken
227- resp , err := client .ShowSketches (nil , createClient .ShowSketchesPath (fmt .Sprint (sketch .ID )), & bearer )
235+
236+ resp , err := client .ShowSketches (context .Background (), createClient .ShowSketchesPath (fmt .Sprint (sketch .ID )), & bearer )
228237 if err != nil {
229238 return err
230239 }
@@ -251,13 +260,42 @@ func pullSketch(sketch createClient.ArduinoCreateSketch, sketchbook string, bear
251260
252261 destFolder := filepath .Join (sketchbook , * sketch .Name )
253262
263+ resp , err = client .ShowFiles (context .Background (), * sketch .Ino .Path )
264+ if err != nil {
265+ return err
266+ }
267+
254268 for _ , file := range r .Files {
255- path := filepath .Join (sketchFolder , * file .Path )
269+ urlPath := strings .Split (* file .Path , ":" )[1 ]
270+ path := findPathOf (* sketch .Name , * file .Path )
271+ path = filepath .Join (sketchFolder , path )
272+
256273 err := os .MkdirAll (filepath .Dir (path ), 0755 )
257274 if err != nil {
258275 return err
259276 }
260- encodedData , _ := base64 .StdEncoding .DecodeString (* file .Data )
277+ resp , err := client .ShowFiles (context .Background (), "/" + urlPath )
278+ if err != nil {
279+ return err
280+ }
281+
282+ filewithData , err := client .DecodeArduinoCreateFile (resp )
283+ if err != nil {
284+ return err
285+ }
286+ if resp .StatusCode != 200 {
287+ errResp , err := client .DecodeErrorResponse (resp )
288+ if err != nil {
289+ return errors .New (resp .Status )
290+ }
291+ return errResp
292+ }
293+
294+ encodedData , err := base64 .StdEncoding .DecodeString (* filewithData .Data )
295+ if err != nil {
296+ return err
297+ }
298+
261299 err = ioutil .WriteFile (path , encodedData , 0666 )
262300 if err != nil {
263301 return errors .New ("Copy of a file of the downloaded sketch failed, sync failed" )
@@ -281,32 +319,44 @@ func pullSketch(sketch createClient.ArduinoCreateSketch, sketchbook string, bear
281319 return nil
282320}
283321
284- func login () (string , error ) {
322+ func findPathOf (sketchName string , path string ) string {
323+ list := strings .Split (path , "/" )
324+
325+ for i := len (list ) - 1 ; i > - 1 ; i -- {
326+ fmt .Println (list [i ], "==" , sketchName , "?" )
327+ if list [i ] == sketchName {
328+ return filepath .Join (list [i + 1 : len (list )]... )
329+ }
330+ }
331+ return ""
332+ }
333+
334+ func login () (string , string , error ) {
285335 authConf := auth .New ()
286336
287337 home , err := homedir .Dir ()
288338 if err != nil {
289- return "" , err
339+ return "" , "" , err
290340 }
291341
292342 netRCFile := filepath .Join (home , ".netrc" )
293343 file , err := os .OpenFile (netRCFile , os .O_CREATE | os .O_RDONLY , 0666 )
294344 if err != nil {
295- return "" , err
345+ return "" , "" , err
296346 }
297347 NetRC , err := netrc .Parse (file )
298348 if err != nil {
299- return "" , err
349+ return "" , "" , err
300350 }
301351
302352 arduinoMachine := NetRC .FindMachine ("arduino.cc" )
303353 if arduinoMachine .Name != "arduino.cc" {
304- return "" , errors .New ("Credentials not present, try login with arduino login first" )
354+ return "" , "" , errors .New ("Credentials not present, try login with arduino login first" )
305355 }
306356
307357 newToken , err := authConf .Refresh (arduinoMachine .Password )
308358 if err != nil {
309- return "" , err
359+ return "" , "" , err
310360 }
311361
312362 var token string
@@ -327,5 +377,5 @@ func login() (string, error) {
327377 } else if GlobalFlags .Verbose > 0 {
328378 formatter .Print (err .Error ())
329379 }
330- return token , nil
380+ return arduinoMachine . Login , token , nil
331381}
0 commit comments