@@ -4,11 +4,15 @@ import (
4
4
"context"
5
5
"fmt"
6
6
"io/ioutil"
7
+ "os"
7
8
"path"
8
9
"path/filepath"
9
10
"strings"
10
11
11
12
"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"
12
16
"sigs.k8s.io/controller-runtime/pkg/log"
13
17
"sigs.k8s.io/yaml"
14
18
)
@@ -88,13 +92,29 @@ func (r *GitRepository) readURL(url string) ([]byte, error) {
88
92
repoDir := "/tmp/repo"
89
93
filePath := filepath .Join (repoDir , url )
90
94
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 ,
93
105
})
106
+
94
107
if err != nil && err != git .ErrRepositoryAlreadyExists {
95
108
return nil , err
96
109
}
97
110
111
+ if err == git .ErrRepositoryAlreadyExists {
112
+ err := handleExistingRepo (repoDir , auth )
113
+ if err != nil {
114
+ return nil , err
115
+ }
116
+ }
117
+
98
118
b , err := ioutil .ReadFile (filePath )
99
119
if err != nil {
100
120
return nil , err
@@ -122,3 +142,72 @@ func parseGitURL(url string) GitRepository {
122
142
subDir : subdir ,
123
143
}
124
144
}
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