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

‎internal/arduino/libraries/librariesmanager/install.go‎

Lines changed: 35 additions & 21 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 != "" {
@@ -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 "git@github.com:arduino-libraries/SigFox.git"
256+
if strings.HasPrefix(argURL, "git@github.com:") {
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, "git@github.com:")
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

‎internal/arduino/libraries/librariesmanager/install_test.go‎

Lines changed: 44 additions & 53 deletions
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 = "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+
_, _, _, 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)

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