-
-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy pathrepoclone.go
122 lines (100 loc) · 2.41 KB
/
repoclone.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
package libraries
import (
"errors"
"io/ioutil"
"os"
"path/filepath"
"strings"
"arduino.cc/repository/libraries/db"
"fmt"
"arduino.cc/repository/libraries/metadata"
"github.com/go-git/go-git/v5"
)
// Repository represents a Git repository located on the filesystem.
type Repository struct {
Repository *git.Repository
FolderPath string
URL string
}
func CloneOrFetch(repoMeta *Repo, folderName string) (*Repository, error) {
repo := Repository{
FolderPath: folderName,
URL: repoMeta.Url,
}
if _, err := os.Stat(folderName); os.IsNotExist(err) {
repo.Repository, err = git.PlainClone(folderName, false, &git.CloneOptions{URL: repoMeta.Url})
if err != nil {
return nil, err
}
} else {
repo.Repository, err = git.PlainOpen(folderName)
if err != nil {
return nil, err
}
}
tags, err := repo.Repository.Tags()
if err != nil {
return nil, err
}
for {
tag, err := tags.Next()
if err != nil {
// Reached end of tags
break
}
if err = repo.Repository.DeleteTag(strings.TrimPrefix(tag.Name().String(), "refs/tags/")); err != nil {
return nil, err
}
}
if err = repo.Repository.Fetch(&git.FetchOptions{Tags: git.AllTags}); err != nil {
return nil, err
}
return &repo, err
}
func GenerateLibraryFromRepo(repo *Repository) (*metadata.LibraryMetadata, error) {
bytes, err := ioutil.ReadFile(filepath.Join(repo.FolderPath, "library.properties"))
if err != nil {
return nil, fmt.Errorf("can't read library.properties: %s", err)
}
library, err := metadata.Parse(bytes)
if err != nil {
return nil, err
}
libraryErrors := library.Validate()
if len(libraryErrors) > 0 {
var errorsString []string
for _, error := range libraryErrors {
errorsString = append(errorsString, error.Error())
}
combinedErrors := strings.Join(errorsString, ",")
return nil, errors.New(combinedErrors)
}
return library, nil
}
func UpdateLibrary(release *db.Release, repoURL string, libraryDb *db.DB) error {
var err error
if !libraryDb.HasLibrary(release.LibraryName) {
err = libraryDb.AddLibrary(&db.Library{
Name: release.LibraryName,
Repository: repoURL})
if err != nil {
return err
}
err = libraryDb.Commit()
if err != nil {
return err
}
}
if libraryDb.HasRelease(release) {
return nil
}
err = libraryDb.AddRelease(release, repoURL)
if err != nil {
return err
}
err = libraryDb.Commit()
if err != nil {
return err
}
return nil
}