Skip to content

Commit 480cd88

Browse files
committed
Use go-git for Git operations
github.com/go-git/go-git is actively maintained and used in several other Arduino tooling projects. It provides all the functionality needed for this application without the difficulties associated wih authentication in order to access a dependency hosted in a private repository, as was the case with the github.com/arduino/arduino-modules/git package it replaces.
1 parent 654337e commit 480cd88

File tree

5 files changed

+58
-37
lines changed

5 files changed

+58
-37
lines changed

README.md

Lines changed: 0 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -6,25 +6,10 @@ go get github.com/google/go-github/github
66
go get github.com/vaughan0/go-ini
77
go get github.com/blang/semver
88
go get github.com/stretchr/testify
9-
go get github.com/arduino/arduino-modules/git
109
1110
go build arduino.cc/repository/libraries-repository-engine
1211
```
1312

14-
You may want to setup git to allow "go get" from private repos, in this case you must
15-
generate a personal access token from github that grants "repo access" permissions and do:
16-
17-
```
18-
git config --global url."https://YOUR_ACCESS_TOKEN:x-oauth-basic@github.com/".insteadOf "https://github.com/"
19-
```
20-
21-
the configuration will be saved inside `~/.gitconfig` as:
22-
23-
```
24-
...
25-
[url "https://YOUR_ACCESS_TOKEN:x-oauth-basic@github.com/"]
26-
insteadOf = https://github.com/
27-
...
2813
```
2914
3015
TDD

Taskfile.yml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@ tasks:
88
go:deps:
99
desc: Install dependencies
1010
cmds:
11-
- go get github.com/arduino/arduino-modules/git
1211
- go get github.com/arduino/golang-concurrent-workers
1312
- go get github.com/blang/semver
1413
- go get github.com/google/go-github/github

src/arduino.cc/repository/libraries-repository-engine/sync_libraries.go

Lines changed: 19 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,9 @@ import (
1212
"arduino.cc/repository/libraries"
1313
"arduino.cc/repository/libraries/db"
1414
"arduino.cc/repository/libraries/hash"
15-
"github.com/arduino/arduino-modules/git"
1615
cc "github.com/arduino/golang-concurrent-workers"
16+
"github.com/go-git/go-git/v5"
17+
"github.com/go-git/go-git/v5/plumbing"
1718
)
1819

1920
type Config struct {
@@ -202,13 +203,19 @@ func syncLibrary(logger *log.Logger, repoMetadata *libraries.Repo, libraryDb *db
202203
}
203204

204205
// Retrieve the list of git-tags
205-
tags, err := repo.ListTags()
206+
tags, err := repo.Repository.Tags()
206207
if err != nil {
207208
logger.Printf("Error retrieving git-tags: %s", err)
208209
return
209210
}
210211

211-
for _, tag := range tags {
212+
for {
213+
tag, err := tags.Next()
214+
if err != nil {
215+
// Reached end of tags
216+
break
217+
}
218+
212219
// Sync the library release for each git-tag
213220
err = syncLibraryTaggedRelease(logger, repo, tag, repoMetadata, libraryDb)
214221
if err != nil {
@@ -217,11 +224,16 @@ func syncLibrary(logger *log.Logger, repoMetadata *libraries.Repo, libraryDb *db
217224
}
218225
}
219226

220-
func syncLibraryTaggedRelease(logger *log.Logger, repo *git.Repository, tag string, repoMeta *libraries.Repo, libraryDb *db.DB) error {
227+
func syncLibraryTaggedRelease(logger *log.Logger, repo *libraries.Repository, tag *plumbing.Reference, repoMeta *libraries.Repo, libraryDb *db.DB) error {
221228
// Checkout desired tag
222-
logger.Printf("Checking out tag: %s", tag)
223-
if out, err := repo.CheckoutTagWithOutput(tag); err != nil {
224-
logger.Printf("git output: %s", out)
229+
logger.Printf("Checking out tag: %s", tag.Name())
230+
231+
repoTree, err := repo.Repository.Worktree()
232+
if err != nil {
233+
return err
234+
}
235+
236+
if err = repoTree.Checkout(&git.CheckoutOptions{Hash: tag.Hash()}); err != nil {
225237
return fmt.Errorf("Error checking out repo: %s", err)
226238
}
227239

src/arduino.cc/repository/libraries/git_integration_test.go

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import (
77
"testing"
88

99
"arduino.cc/repository/libraries/db"
10+
"github.com/go-git/go-git/v5"
1011
"github.com/stretchr/testify/require"
1112
)
1213

@@ -33,11 +34,14 @@ func TestUpdateLibraryJson(t *testing.T) {
3334

3435
defer os.RemoveAll(r.FolderPath)
3536

36-
tags, err := r.ListTags()
37+
tags, err := r.Repository.Tags()
38+
require.NoError(t, err)
39+
tag, err := tags.Next()
3740
require.NoError(t, err)
38-
require.NotEmpty(t, tags)
3941

40-
err = r.CheckoutTag(tags[0])
42+
repoTree, err := r.Repository.Worktree()
43+
require.NoError(t, err)
44+
err = repoTree.Checkout(&git.CheckoutOptions{Hash: tag.Hash()})
4145
require.NoError(t, err)
4246

4347
library, err := GenerateLibraryFromRepo(r)

src/arduino.cc/repository/libraries/repoclone.go

Lines changed: 32 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -12,38 +12,59 @@ import (
1212
"fmt"
1313

1414
"arduino.cc/repository/libraries/metadata"
15-
"github.com/arduino/arduino-modules/git"
15+
"github.com/go-git/go-git/v5"
1616
)
1717

18-
func CloneOrFetch(repoMeta *Repo, folderName string) (*git.Repository, error) {
19-
var repo *git.Repository
18+
// Repository represents a Git repository located on the filesystem.
19+
type Repository struct {
20+
Repository *git.Repository
21+
FolderPath string
22+
URL string
23+
}
24+
25+
func CloneOrFetch(repoMeta *Repo, folderName string) (*Repository, error) {
26+
repo := Repository{
27+
FolderPath: folderName,
28+
URL: repoMeta.Url,
29+
}
30+
2031
if _, err := os.Stat(folderName); os.IsNotExist(err) {
21-
repo, err = git.Clone(repoMeta.Url, folderName)
32+
repo.Repository, err = git.PlainClone(folderName, false, &git.CloneOptions{URL: repoMeta.Url})
2233
if err != nil {
2334
return nil, err
2435
}
2536
} else {
26-
repo = &git.Repository{FolderPath: folderName, URL: repoMeta.Url}
37+
repo.Repository, err = git.PlainOpen(folderName)
38+
if err != nil {
39+
return nil, err
40+
}
2741
}
2842

29-
tags, err := repo.ListTags()
43+
tags, err := repo.Repository.Tags()
3044
if err != nil {
3145
return nil, err
3246
}
33-
for _, tag := range tags {
34-
if err = repo.RemoveTag(tag); err != nil {
47+
48+
for {
49+
tag, err := tags.Next()
50+
if err != nil {
51+
// Reached end of tags
52+
break
53+
}
54+
55+
if err = repo.Repository.DeleteTag(strings.TrimPrefix(tag.Name().String(), "refs/tags/")); err != nil {
3556
return nil, err
3657
}
3758
}
3859

39-
if err = repo.Fetch(); err != nil {
60+
if err = repo.Repository.Fetch(&git.FetchOptions{Tags: git.AllTags}); err != nil {
4061
return nil, err
4162
}
4263

43-
return repo, err
64+
return &repo, err
4465
}
4566

46-
func GenerateLibraryFromRepo(repo *git.Repository) (*metadata.LibraryMetadata, error) {
67+
func GenerateLibraryFromRepo(repo *Repository) (*metadata.LibraryMetadata, error) {
4768
bytes, err := ioutil.ReadFile(filepath.Join(repo.FolderPath, "library.properties"))
4869
if err != nil {
4970
return nil, fmt.Errorf("can't read library.properties: %s", err)

0 commit comments

Comments
 (0)