Skip to content

Commit 687f074

Browse files
sanialescmaglie
authored andcommitted
adding files
1 parent 12b2eb8 commit 687f074

File tree

5 files changed

+102
-33
lines changed

5 files changed

+102
-33
lines changed

cmd/arduino_sketch.go

Lines changed: 74 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -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 {
176184
func 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
200208
func 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
}

create_client_helpers/alive.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,11 @@ func (c *Client) NewPingAliveRequest(ctx context.Context, path string) (*http.Re
5757
if scheme == "" {
5858
scheme = "http"
5959
}
60+
if prod {
61+
path = prodURL + path
62+
} else {
63+
path = devURL + path
64+
}
6065
u := url.URL{Host: c.Host, Scheme: scheme, Path: path}
6166
req, err := http.NewRequest("GET", u.String(), nil)
6267
if err != nil {

create_client_helpers/files.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,11 @@ func (c *Client) NewShowFilesRequest(ctx context.Context, path string) (*http.Re
6060
if scheme == "" {
6161
scheme = "http"
6262
}
63+
if prod {
64+
path = prodURL + path
65+
} else {
66+
path = devURL + path
67+
}
6368
u := url.URL{Host: c.Host, Scheme: scheme, Path: path}
6469
req, err := http.NewRequest("GET", u.String(), nil)
6570
if err != nil {

create_client_helpers/sketches.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ func CreateSketchesPath() string {
4545
const (
4646
devURL = "api-dev.arduino.cc"
4747
prodURL = "api.arduino.cc"
48-
prod = false
48+
prod = true
4949
)
5050

5151
// CreateSketches Adds a new sketch.

create_client_helpers/user_types.go

Lines changed: 17 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,8 @@ package createClient
3131

3232
import (
3333
"encoding/base64"
34-
"fmt"
34+
"io/ioutil"
35+
"path/filepath"
3536

3637
"github.com/bcmi-labs/arduino-modules/sketches"
3738
)
@@ -65,10 +66,15 @@ type Sketch struct {
6566
Types []string `form:"types,omitempty" json:"types,omitempty" xml:"types,omitempty"`
6667
}
6768

69+
//ConvertFrom converts from a local sketch to an Arduino Create sketch.
6870
func ConvertFrom(sketch sketches.Sketch) *Sketch {
69-
var temp []byte
70-
base64.StdEncoding.Encode(temp, sketch.Ino.Data)
71-
ino := string(temp)
71+
_, inoPath := filepath.Split(sketch.Ino.Path)
72+
content, err := ioutil.ReadFile(filepath.Join(sketch.FullPath, inoPath))
73+
if err != nil {
74+
return nil
75+
}
76+
77+
ino := base64.StdEncoding.EncodeToString(content)
7278
ret := Sketch{
7379
Name: sketch.Name,
7480
Folder: &sketch.Path,
@@ -83,15 +89,18 @@ func ConvertFrom(sketch sketches.Sketch) *Sketch {
8389
}
8490
ret.Files = make([]*File, len(sketch.Files))
8591
for i, f := range sketch.Files {
86-
base64.StdEncoding.Encode(temp, f.Data)
87-
data := string(temp)
92+
_, filePath := filepath.Split(f.Path)
93+
content, err := ioutil.ReadFile(filepath.Join(sketch.FullPath, filePath))
94+
if err != nil {
95+
return nil
96+
}
97+
98+
data := base64.StdEncoding.EncodeToString(content)
8899
ret.Files[i] = &File{
89100
Data: &data,
90101
Name: f.Name,
91102
}
92103
}
93-
fmt.Println(sketch.Metadata.CPU.Fqbn)
94-
fmt.Println(*ret.Metadata.CPU.Fqbn)
95104
return &ret
96105
}
97106

0 commit comments

Comments
 (0)