Skip to content

Commit 915160a

Browse files
committed
Fixed unit test and url parsing in lib install via git
Previously go-git accepted urls in the format: https://github.com/author/repo#ref but now it refuses to fetch if the "#ref" suffix is present. The new parsing utility returns the URL cleaned up of the reference.
1 parent 409d77f commit 915160a

File tree

2 files changed

+79
-74
lines changed

2 files changed

+79
-74
lines changed

Diff for: internal/arduino/libraries/librariesmanager/install.go

+35-21
Original file line numberDiff line numberDiff line change
@@ -201,8 +201,8 @@ func (lmi *Installer) InstallZipLib(ctx context.Context, archivePath *paths.Path
201201
}
202202

203203
// InstallGitLib installs a library hosted on a git repository on the specified path.
204-
func (lmi *Installer) InstallGitLib(gitURL string, overwrite bool) error {
205-
gitLibraryName, ref, err := parseGitURL(gitURL)
204+
func (lmi *Installer) InstallGitLib(argURL string, overwrite bool) error {
205+
libraryName, gitURL, ref, err := parseGitArgURL(argURL)
206206
if err != nil {
207207
return err
208208
}
@@ -213,7 +213,7 @@ func (lmi *Installer) InstallGitLib(gitURL string, overwrite bool) error {
213213
return err
214214
}
215215
defer tmp.RemoveAll()
216-
tmpInstallPath := tmp.Join(gitLibraryName)
216+
tmpInstallPath := tmp.Join(libraryName)
217217

218218
depth := 1
219219
if ref != "" {
@@ -225,7 +225,7 @@ func (lmi *Installer) InstallGitLib(gitURL string, overwrite bool) error {
225225
Progress: os.Stdout,
226226
})
227227
if err != nil {
228-
return err
228+
return fmt.Errorf("error cloning git repo: %w", err)
229229
}
230230

231231
if ref != "" {
@@ -249,25 +249,39 @@ func (lmi *Installer) InstallGitLib(gitURL string, overwrite bool) error {
249249
return nil
250250
}
251251

252-
// parseGitURL tries to recover a library name from a git URL.
252+
// parseGitArgURL tries to recover a library name from a git URL.
253253
// Returns an error in case the URL is not a valid git URL.
254-
func parseGitURL(gitURL string) (string, plumbing.Revision, error) {
255-
var res string
256-
var rev plumbing.Revision
257-
if strings.HasPrefix(gitURL, "git@") {
254+
func parseGitArgURL(argURL string) (string, string, plumbing.Revision, error) {
255+
// Handle github-specific address in the form "[email protected]:arduino-libraries/SigFox.git"
256+
if strings.HasPrefix(argURL, "[email protected]:") {
258257
// We can't parse these as URLs
259-
i := strings.LastIndex(gitURL, "/")
260-
res = strings.TrimSuffix(gitURL[i+1:], ".git")
261-
} else if path := paths.New(gitURL); path != nil && path.Exist() {
262-
res = path.Base()
263-
} else if parsed, err := url.Parse(gitURL); parsed.String() != "" && err == nil {
264-
i := strings.LastIndex(parsed.Path, "/")
265-
res = strings.TrimSuffix(parsed.Path[i+1:], ".git")
266-
rev = plumbing.Revision(parsed.Fragment)
267-
} else {
268-
return "", "", errors.New(i18n.Tr("invalid git url"))
269-
}
270-
return res, rev, nil
258+
argURL = "https://github.com/" + strings.TrimPrefix(argURL, "[email protected]:")
259+
}
260+
261+
parsedURL, err := url.Parse(argURL)
262+
if err != nil {
263+
return "", "", "", fmt.Errorf("%s: %w", i18n.Tr("invalid git url"), err)
264+
}
265+
if parsedURL.String() == "" {
266+
return "", "", "", errors.New(i18n.Tr("invalid git url"))
267+
}
268+
269+
// Extract lib name from "https://github.com/arduino-libraries/SigFox.git#1.0.3"
270+
// path == "/arduino-libraries/SigFox.git"
271+
slash := strings.LastIndex(parsedURL.Path, "/")
272+
if slash == -1 {
273+
return "", "", "", errors.New(i18n.Tr("invalid git url"))
274+
}
275+
libName := strings.TrimSuffix(parsedURL.Path[slash+1:], ".git")
276+
if libName == "" {
277+
return "", "", "", errors.New(i18n.Tr("invalid git url"))
278+
}
279+
// fragment == "1.0.3"
280+
rev := plumbing.Revision(parsedURL.Fragment)
281+
// gitURL == "https://github.com/arduino-libraries/SigFox.git"
282+
parsedURL.Fragment = ""
283+
gitURL := parsedURL.String()
284+
return libName, gitURL, rev, nil
271285
}
272286

273287
// validateLibrary verifies the dir contains a valid library, meaning it has either

Diff for: internal/arduino/libraries/librariesmanager/install_test.go

+44-53
Original file line numberDiff line numberDiff line change
@@ -23,59 +23,50 @@ import (
2323
)
2424

2525
func TestParseGitURL(t *testing.T) {
26-
gitURL := ""
27-
libraryName, ref, err := parseGitURL(gitURL)
28-
require.Equal(t, "", libraryName)
29-
require.EqualValues(t, "", ref)
30-
require.Errorf(t, err, "invalid git url")
31-
32-
gitURL = "https://github.com/arduino/arduino-lib.git"
33-
libraryName, ref, err = parseGitURL(gitURL)
34-
require.Equal(t, "arduino-lib", libraryName)
35-
require.EqualValues(t, "", ref)
36-
require.NoError(t, err)
37-
38-
gitURL = "https://github.com/arduino/arduino-lib.git#0.1.2"
39-
libraryName, ref, err = parseGitURL(gitURL)
40-
require.Equal(t, "arduino-lib", libraryName)
41-
require.EqualValues(t, "0.1.2", ref)
42-
require.NoError(t, err)
43-
44-
gitURL = "[email protected]:arduino/arduino-lib.git"
45-
libraryName, ref, err = parseGitURL(gitURL)
46-
require.Equal(t, "arduino-lib", libraryName)
47-
require.EqualValues(t, "", ref)
48-
require.NoError(t, err)
49-
50-
gitURL = "file:///path/to/arduino-lib"
51-
libraryName, ref, err = parseGitURL(gitURL)
52-
require.Equal(t, "arduino-lib", libraryName)
53-
require.EqualValues(t, "", ref)
54-
require.NoError(t, err)
55-
56-
gitURL = "file:///path/to/arduino-lib.git"
57-
libraryName, ref, err = parseGitURL(gitURL)
58-
require.Equal(t, "arduino-lib", libraryName)
59-
require.EqualValues(t, "", ref)
60-
require.NoError(t, err)
61-
62-
gitURL = "/path/to/arduino-lib"
63-
libraryName, ref, err = parseGitURL(gitURL)
64-
require.Equal(t, "arduino-lib", libraryName)
65-
require.EqualValues(t, "", ref)
66-
require.NoError(t, err)
67-
68-
gitURL = "/path/to/arduino-lib.git"
69-
libraryName, ref, err = parseGitURL(gitURL)
70-
require.Equal(t, "arduino-lib", libraryName)
71-
require.EqualValues(t, "", ref)
72-
require.NoError(t, err)
73-
74-
gitURL = "file:///path/to/arduino-lib"
75-
libraryName, ref, err = parseGitURL(gitURL)
76-
require.Equal(t, "arduino-lib", libraryName)
77-
require.EqualValues(t, "", ref)
78-
require.NoError(t, err)
26+
{
27+
_, _, _, err := parseGitArgURL("")
28+
require.EqualError(t, err, "invalid git url")
29+
}
30+
{
31+
libraryName, gitURL, ref, err := parseGitArgURL("https://github.com/arduino/arduino-lib.git")
32+
require.NoError(t, err)
33+
require.Equal(t, "arduino-lib", libraryName)
34+
require.Equal(t, "https://github.com/arduino/arduino-lib.git", gitURL)
35+
require.EqualValues(t, "", ref)
36+
}
37+
{
38+
libraryName, gitURL, ref, err := parseGitArgURL("https://github.com/arduino/arduino-lib.git#0.1.2")
39+
require.NoError(t, err)
40+
require.Equal(t, "arduino-lib", libraryName)
41+
require.Equal(t, "https://github.com/arduino/arduino-lib.git", gitURL)
42+
require.EqualValues(t, "0.1.2", ref)
43+
}
44+
{
45+
libraryName, gitURL, ref, err := parseGitArgURL("[email protected]:arduino/arduino-lib.git")
46+
require.NoError(t, err)
47+
require.Equal(t, "arduino-lib", libraryName)
48+
require.Equal(t, "https://github.com/arduino/arduino-lib.git", gitURL)
49+
require.EqualValues(t, "", ref)
50+
}
51+
{
52+
libraryName, gitURL, ref, err := parseGitArgURL("[email protected]:arduino/arduino-lib.git#0.1.2")
53+
require.NoError(t, err)
54+
require.Equal(t, "arduino-lib", libraryName)
55+
require.Equal(t, "https://github.com/arduino/arduino-lib.git", gitURL)
56+
require.EqualValues(t, "0.1.2", ref)
57+
}
58+
{
59+
_, _, _, err := parseGitArgURL("https://arduino.cc")
60+
require.EqualError(t, err, "invalid git url")
61+
}
62+
{
63+
_, _, _, err := parseGitArgURL("https://arduino.cc/")
64+
require.EqualError(t, err, "invalid git url")
65+
}
66+
{
67+
_, _, _, err := parseGitArgURL("://not@a@url")
68+
require.EqualError(t, err, "invalid git url: parse \"://not@a@url\": missing protocol scheme")
69+
}
7970
}
8071

8172
func TestValidateLibrary(t *testing.T) {

0 commit comments

Comments
 (0)