Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

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‎

Lines changed: 39 additions & 20 deletions
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‎

Lines changed: 72 additions & 53 deletions
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)

AltStyle によって変換されたページ (->オリジナル) /