Skip to content

Commit 5adb43c

Browse files
authored
Merge pull request #119 from SomtochiAma/git-repository
Allows use of private repositories
2 parents dbfe418 + 788f319 commit 5adb43c

File tree

2 files changed

+92
-2
lines changed

2 files changed

+92
-2
lines changed

go.mod

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ require (
99
github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b
1010
github.com/pkg/errors v0.9.1
1111
github.com/prometheus/client_golang v1.0.0
12+
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9
1213
golang.org/x/tools v0.0.0-20200714190737-9048b464a08d
1314
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543
1415
k8s.io/api v0.18.4

pkg/patterns/addon/pkg/loaders/git.go

Lines changed: 91 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,15 @@ import (
44
"context"
55
"fmt"
66
"io/ioutil"
7+
"os"
78
"path"
89
"path/filepath"
910
"strings"
1011

1112
"github.com/go-git/go-git/v5"
13+
"github.com/go-git/go-git/v5/plumbing/transport"
14+
gitssh "github.com/go-git/go-git/v5/plumbing/transport/ssh"
15+
"golang.org/x/crypto/ssh"
1216
"sigs.k8s.io/controller-runtime/pkg/log"
1317
"sigs.k8s.io/yaml"
1418
)
@@ -88,13 +92,29 @@ func (r *GitRepository) readURL(url string) ([]byte, error) {
8892
repoDir := "/tmp/repo"
8993
filePath := filepath.Join(repoDir, url)
9094
fmt.Println(r.baseURL)
91-
_, err := git.PlainClone(repoDir, false, &git.CloneOptions{
92-
URL: r.baseURL,
95+
96+
auth, err := getAuthMethod()
97+
if err != nil {
98+
return nil, err
99+
}
100+
101+
_, err = git.PlainClone(repoDir, false, &git.CloneOptions{
102+
URL: r.baseURL,
103+
RecurseSubmodules: git.DefaultSubmoduleRecursionDepth,
104+
Auth: auth,
93105
})
106+
94107
if err != nil && err != git.ErrRepositoryAlreadyExists {
95108
return nil, err
96109
}
97110

111+
if err == git.ErrRepositoryAlreadyExists {
112+
err := handleExistingRepo(repoDir, auth)
113+
if err != nil {
114+
return nil, err
115+
}
116+
}
117+
98118
b, err := ioutil.ReadFile(filePath)
99119
if err != nil {
100120
return nil, err
@@ -122,3 +142,72 @@ func parseGitURL(url string) GitRepository {
122142
subDir: subdir,
123143
}
124144
}
145+
146+
func handleExistingRepo(path string, auth transport.AuthMethod) error {
147+
gitRepo, err := git.PlainOpen(path)
148+
if err != nil {
149+
return err
150+
}
151+
152+
remote, err := gitRepo.Remote("origin")
153+
if err != nil {
154+
return err
155+
}
156+
157+
err = remote.Fetch(&git.FetchOptions{
158+
Force: true,
159+
Auth: auth,
160+
})
161+
if err != nil && err != git.NoErrAlreadyUpToDate {
162+
return err
163+
}
164+
165+
w, err := gitRepo.Worktree()
166+
if err != nil {
167+
return err
168+
}
169+
170+
err = w.Checkout(&git.CheckoutOptions{
171+
Branch: "refs/heads/master",
172+
})
173+
if err != nil {
174+
return err
175+
}
176+
177+
err = w.Reset(&git.ResetOptions{
178+
Mode: git.HardReset,
179+
})
180+
if err != nil {
181+
return err
182+
}
183+
184+
return nil
185+
}
186+
187+
func getAuthMethod() (transport.AuthMethod, error) {
188+
sshFile := fmt.Sprintf("%s/.ssh/id_rsa", os.Getenv("HOME"))
189+
if _, err := os.Stat(sshFile); os.IsNotExist(err) {
190+
return nil, nil
191+
}
192+
sshBytes, err := ioutil.ReadFile(sshFile)
193+
if err != nil {
194+
return nil, err
195+
}
196+
197+
sshPassphrase := os.Getenv("SSH_PASSPHRASE")
198+
var signer ssh.Signer
199+
if sshPassphrase != "" {
200+
signer, err = ssh.ParsePrivateKeyWithPassphrase(sshBytes, []byte(sshPassphrase))
201+
} else {
202+
signer, err = ssh.ParsePrivateKey(sshBytes)
203+
}
204+
if err != nil {
205+
return nil, err
206+
}
207+
208+
auth := &gitssh.PublicKeys{
209+
Signer: signer,
210+
User: "git",
211+
}
212+
return auth, nil
213+
}

0 commit comments

Comments
 (0)