@@ -17,17 +17,22 @@ package git
17
17
import (
18
18
"context"
19
19
"flag"
20
+ "fmt"
20
21
"io/ioutil"
21
22
"net"
22
23
"os"
23
24
"path/filepath"
24
25
"reflect"
25
26
"testing"
27
+ "time"
26
28
27
29
"github.com/GoogleContainerTools/kpt/porch/api/porch/v1alpha1"
28
30
configapi "github.com/GoogleContainerTools/kpt/porch/controllers/pkg/apis/porch/v1alpha1"
29
31
"github.com/GoogleContainerTools/kpt/porch/repository/pkg/repository"
30
32
gogit "github.com/go-git/go-git/v5"
33
+ "github.com/go-git/go-git/v5/plumbing"
34
+ "github.com/go-git/go-git/v5/plumbing/filemode"
35
+ "github.com/go-git/go-git/v5/plumbing/object"
31
36
"k8s.io/klog/v2"
32
37
)
33
38
@@ -178,3 +183,104 @@ func TestGitPackageRoundTrip(t *testing.T) {
178
183
}
179
184
}
180
185
}
186
+
187
+ // initRepo is a helper that creates a first commit, ensuring the repo is not empty.
188
+ func initRepo (repo * gogit.Repository ) error {
189
+ store := repo .Storer
190
+
191
+ var objectHash plumbing.Hash
192
+ {
193
+ data := []byte ("This is a test repo" )
194
+ eo := store .NewEncodedObject ()
195
+ eo .SetType (plumbing .BlobObject )
196
+ eo .SetSize (int64 (len (data )))
197
+
198
+ w , err := eo .Writer ()
199
+ if err != nil {
200
+ return fmt .Errorf ("error creating object writer: %w" , err )
201
+ }
202
+
203
+ if _ , err = w .Write (data ); err != nil {
204
+ w .Close ()
205
+ return fmt .Errorf ("error writing object data: %w" , err )
206
+ }
207
+ if err := w .Close (); err != nil {
208
+ return fmt .Errorf ("error closing object data: %w" , err )
209
+ }
210
+
211
+ if h , err := store .SetEncodedObject (eo ); err != nil {
212
+ return fmt .Errorf ("error storing object: %w" , err )
213
+ } else {
214
+ objectHash = h
215
+ }
216
+ }
217
+
218
+ var treeHash plumbing.Hash
219
+ {
220
+ tree := object.Tree {}
221
+
222
+ te := object.TreeEntry {
223
+ Name : "README.md" ,
224
+ Mode : filemode .Regular ,
225
+ Hash : objectHash ,
226
+ }
227
+ tree .Entries = append (tree .Entries , te )
228
+
229
+ eo := store .NewEncodedObject ()
230
+ if err := tree .Encode (eo ); err != nil {
231
+ return fmt .Errorf ("error encoding tree: %w" , err )
232
+ }
233
+ if h , err := store .SetEncodedObject (eo ); err != nil {
234
+ return fmt .Errorf ("error storing tree: %w" , err )
235
+ } else {
236
+ treeHash = h
237
+ }
238
+ }
239
+
240
+ var commitHash plumbing.Hash
241
+ {
242
+ now := time .Now ()
243
+ commit := & object.Commit {
244
+ Author : object.Signature {
245
+ Name : "Porch Author" ,
246
+
247
+ When : now ,
248
+ },
249
+ Committer : object.Signature {
250
+ Name : "Porch Committer" ,
251
+
252
+ When : now ,
253
+ },
254
+ Message : "First commit" ,
255
+ TreeHash : treeHash ,
256
+ }
257
+
258
+ eo := store .NewEncodedObject ()
259
+ if err := commit .Encode (eo ); err != nil {
260
+ return fmt .Errorf ("error encoding commit: %w" , err )
261
+ }
262
+ if h , err := store .SetEncodedObject (eo ); err != nil {
263
+ return fmt .Errorf ("error storing commit: %w" , err )
264
+ } else {
265
+ commitHash = h
266
+ }
267
+ }
268
+
269
+ {
270
+ ref := plumbing .NewHashReference (Main , commitHash )
271
+ if err := repo .Storer .SetReference (ref ); err != nil {
272
+ return fmt .Errorf ("error setting reference %q: %w" , Main , err )
273
+ }
274
+
275
+ // gogit uses suboptimal default reference name; delete it
276
+ repo .Storer .RemoveReference (plumbing .Master )
277
+
278
+ // create correct HEAD as a symbolic reference of main branch
279
+ head := plumbing .NewSymbolicReference (plumbing .HEAD , Main )
280
+ if err := repo .Storer .SetReference (head ); err != nil {
281
+ return fmt .Errorf ("error creating HEAD ref: %w" , err )
282
+ }
283
+ }
284
+
285
+ return nil
286
+ }
0 commit comments