Skip to content

Commit 763145c

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 763145c

File tree

2 files changed

+111
-73
lines changed

2 files changed

+111
-73
lines changed

internal/arduino/libraries/librariesmanager/install.go

+39-20
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 != "" {
@@ -249,25 +249,44 @@ 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+
// On Windows handle paths with backslashes in the form C:\Path\to\library
256+
if path := paths.New(argURL); path != nil && path.Exist() {
257+
return path.Base(), argURL, "", nil
258+
}
259+
260+
// Handle github-specific address in the form "git@github.com:arduino-libraries/SigFox.git"
261+
if strings.HasPrefix(argURL, "git@github.com:") {
258262
// 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
263+
argURL = "https://github.com/" + strings.TrimPrefix(argURL, "git@github.com:")
264+
}
265+
266+
parsedURL, err := url.Parse(argURL)
267+
if err != nil {
268+
return "", "", "", fmt.Errorf("%s: %w", i18n.Tr("invalid git url"), err)
269+
}
270+
if parsedURL.String() == "" {
271+
return "", "", "", errors.New(i18n.Tr("invalid git url"))
272+
}
273+
274+
// Extract lib name from "https://github.com/arduino-libraries/SigFox.git#1.0.3"
275+
// path == "/arduino-libraries/SigFox.git"
276+
slash := strings.LastIndex(parsedURL.Path, "/")
277+
if slash == -1 {
278+
return "", "", "", errors.New(i18n.Tr("invalid git url"))
279+
}
280+
libName := strings.TrimSuffix(parsedURL.Path[slash+1:], ".git")
281+
if libName == "" {
282+
return "", "", "", errors.New(i18n.Tr("invalid git url"))
283+
}
284+
// fragment == "1.0.3"
285+
rev := plumbing.Revision(parsedURL.Fragment)
286+
// gitURL == "https://github.com/arduino-libraries/SigFox.git"
287+
parsedURL.Fragment = ""
288+
gitURL := parsedURL.String()
289+
return libName, gitURL, rev, nil
271290
}
272291

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

internal/arduino/libraries/librariesmanager/install_test.go

+72-53
Original file line numberDiff line numberDiff line change
@@ -23,59 +23,78 @@ 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 = "git@github.com: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("git@github.com: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("git@github.com: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+
libraryName, gitURL, ref, err := parseGitArgURL("file:///path/to/arduino-lib")
60+
require.NoError(t, err)
61+
require.Equal(t, "arduino-lib", libraryName)
62+
require.Equal(t, "file:///path/to/arduino-lib", gitURL)
63+
require.EqualValues(t, "", ref)
64+
}
65+
{
66+
libraryName, gitURL, ref, err := parseGitArgURL("file:///path/to/arduino-lib.git")
67+
require.NoError(t, err)
68+
require.Equal(t, "arduino-lib", libraryName)
69+
require.Equal(t, "file:///path/to/arduino-lib.git", gitURL)
70+
require.EqualValues(t, "", ref)
71+
}
72+
{
73+
libraryName, gitURL, ref, err := parseGitArgURL("/path/to/arduino-lib")
74+
require.NoError(t, err)
75+
require.Equal(t, "arduino-lib", libraryName)
76+
require.Equal(t, "/path/to/arduino-lib", gitURL)
77+
require.EqualValues(t, "", ref)
78+
}
79+
{
80+
libraryName, gitURL, ref, err := parseGitArgURL("/path/to/arduino-lib.git")
81+
require.NoError(t, err)
82+
require.Equal(t, "arduino-lib", libraryName)
83+
require.Equal(t, "/path/to/arduino-lib.git", gitURL)
84+
require.EqualValues(t, "", ref)
85+
}
86+
{
87+
_, _, _, err := parseGitArgURL("https://arduino.cc")
88+
require.EqualError(t, err, "invalid git url")
89+
}
90+
{
91+
_, _, _, err := parseGitArgURL("https://arduino.cc/")
92+
require.EqualError(t, err, "invalid git url")
93+
}
94+
{
95+
_, _, _, err := parseGitArgURL("://not@a@url")
96+
require.EqualError(t, err, "invalid git url: parse \"://not@a@url\": missing protocol scheme")
97+
}
7998
}
8099

81100
func TestValidateLibrary(t *testing.T) {

0 commit comments

Comments
 (0)