Skip to content

Commit 9defc18

Browse files
authored
Git Repo Loading and Tests (#2912)
* Improve Git repository loading * Recognize package revision types (draft, proposed) * Add more tests
1 parent 14a6bf2 commit 9defc18

File tree

12 files changed

+679
-125
lines changed

12 files changed

+679
-125
lines changed

porch/apiserver/pkg/e2e/suite.go

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ import (
2424
"os"
2525
"path/filepath"
2626
"strings"
27+
"sync"
2728
"testing"
2829
"time"
2930

@@ -289,12 +290,18 @@ func createLocalGitServer(t *testing.T) GitConfig {
289290
return GitConfig{}
290291
}
291292

293+
var wg sync.WaitGroup
292294
ctx, cancel := context.WithCancel(context.Background())
293-
t.Cleanup(cancel)
295+
t.Cleanup(func() {
296+
cancel()
297+
wg.Wait()
298+
})
294299

295300
addressChannel := make(chan net.Addr)
296301

302+
wg.Add(1)
297303
go func() {
304+
defer wg.Done()
298305
err := server.ListenAndServe(ctx, "127.0.0.1:0", addressChannel)
299306
if err != nil {
300307
if err == http.ErrServerClosed {

porch/engine/pkg/engine/clone_test.go

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ import (
2424
"net/http"
2525
"os"
2626
"path/filepath"
27+
"sync"
2728
"testing"
2829
"time"
2930

@@ -118,12 +119,18 @@ func startGitServer(t *testing.T, repo *gogit.Repository, opts ...git.GitServerO
118119
t.Fatalf("Failed to create git server: %v", err)
119120
}
120121

122+
var wg sync.WaitGroup
121123
ctx, cancel := context.WithCancel(context.Background())
122-
t.Cleanup(cancel)
124+
t.Cleanup(func() {
125+
cancel()
126+
wg.Wait()
127+
})
123128

124129
addressChannel := make(chan net.Addr)
125130

131+
wg.Add(1)
126132
go func() {
133+
defer wg.Done()
127134
err := server.ListenAndServe(ctx, "127.0.0.1:0", addressChannel)
128135
if err != nil {
129136
if err == http.ErrServerClosed {

porch/repository/go.mod

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ require (
77
github.com/GoogleContainerTools/kpt/porch/api v0.0.0-00010101000000-000000000000
88
github.com/GoogleContainerTools/kpt/porch/controllers v0.0.0-00010101000000-000000000000
99
github.com/go-git/go-git/v5 v5.4.3-0.20220119145113-935af59cf64f
10+
github.com/google/go-cmp v0.5.7
1011
github.com/google/go-containerregistry v0.8.0
1112
go.opentelemetry.io/otel v0.20.0
1213
go.opentelemetry.io/otel/trace v0.20.0
@@ -44,7 +45,6 @@ require (
4445
github.com/go-openapi/swag v0.19.14 // indirect
4546
github.com/gogo/protobuf v1.3.2 // indirect
4647
github.com/golang/protobuf v1.5.2 // indirect
47-
github.com/google/go-cmp v0.5.7 // indirect
4848
github.com/google/gofuzz v1.1.0 // indirect
4949
github.com/imdario/mergo v0.3.12 // indirect
5050
github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 // indirect

porch/repository/pkg/git/draft.go

Lines changed: 27 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -38,29 +38,38 @@ type gitPackageDraft struct {
3838
path string
3939
revision string
4040
updated time.Time
41-
draft *plumbing.Reference
42-
tree plumbing.Hash
43-
sha plumbing.Hash // Current version of the package (commit sha)
41+
ref *plumbing.Reference // ref is the Git reference at which the package exists
42+
tree plumbing.Hash // tree of the package itself, some descendent of commit.Tree()
43+
commit plumbing.Hash // Current version of the package (commit sha)
4444
}
4545

4646
var _ repository.PackageDraft = &gitPackageDraft{}
4747

4848
func (d *gitPackageDraft) UpdateResources(ctx context.Context, new *v1alpha1.PackageRevisionResources, change *v1alpha1.Task) error {
49-
parent, err := d.parent.repo.CommitObject(d.draft.Hash())
50-
if err != nil {
51-
return fmt.Errorf("cannot resolve parent commit hash to commit: %w", err)
52-
}
53-
root, err := parent.Tree()
54-
if err != nil {
55-
return fmt.Errorf("cannot resolve parent commit to root tree: %w", err)
49+
var rootTree *object.Tree
50+
baseCommit := d.ref.Hash()
51+
52+
if baseCommit.IsZero() {
53+
// Empty repository
54+
rootTree = &object.Tree{}
55+
} else {
56+
parent, err := d.parent.repo.CommitObject(baseCommit)
57+
if err != nil {
58+
return fmt.Errorf("cannot resolve parent commit hash to commit: %w", err)
59+
}
60+
root, err := parent.Tree()
61+
if err != nil {
62+
return fmt.Errorf("cannot resolve parent commit to root tree: %w", err)
63+
}
64+
rootTree = root
5665
}
5766

5867
dirs := map[string]*object.Tree{
5968
"": {
6069
// Root tree; Copy over all entries
6170
// TODO: Verify that on creation (first commit) the package directory doesn't exist.
6271
// TODO: Verify that on subsequent commits, only the package's directory is being modified.
63-
Entries: root.Entries,
72+
Entries: rootTree.Entries,
6473
},
6574
}
6675
for k, v := range new.Spec.Resources {
@@ -81,12 +90,12 @@ func (d *gitPackageDraft) UpdateResources(ctx context.Context, new *v1alpha1.Pac
8190
return err
8291
}
8392

84-
commit, err := storeCommit(d.parent.repo.Storer, d.draft.Hash(), treeHash, change)
93+
commit, err := storeCommit(d.parent.repo.Storer, d.ref.Hash(), treeHash, change)
8594
if err != nil {
8695
return err
8796
}
8897

89-
head := plumbing.NewHashReference(d.draft.Name(), commit)
98+
head := plumbing.NewHashReference(d.ref.Name(), commit)
9099
if err := d.parent.repo.Storer.SetReference(head); err != nil {
91100
return err
92101
}
@@ -99,14 +108,14 @@ func (d *gitPackageDraft) UpdateResources(ctx context.Context, new *v1alpha1.Pac
99108
d.tree = plumbing.Hash{}
100109
}
101110

102-
d.draft = head
103-
d.sha = commit
111+
d.ref = head
112+
d.commit = commit
104113
return nil
105114
}
106115

107116
// Finish round of updates.
108117
func (d *gitPackageDraft) Close(ctx context.Context) (repository.PackageRevision, error) {
109-
refSpec := config.RefSpec(fmt.Sprintf("%s:%s", d.draft.Name(), d.draft.Name().String()))
118+
refSpec := config.RefSpec(fmt.Sprintf("%s:%s", d.ref.Name(), d.ref.Name().String()))
110119
klog.Infof("pushing refspec %v", refSpec)
111120

112121
auth, err := d.parent.getAuthMethod(ctx)
@@ -128,9 +137,9 @@ func (d *gitPackageDraft) Close(ctx context.Context) (repository.PackageRevision
128137
path: d.path,
129138
revision: d.revision,
130139
updated: d.updated,
131-
draft: d.draft,
140+
ref: d.ref,
132141
tree: d.tree,
133-
sha: d.draft.Hash(),
142+
commit: d.ref.Hash(),
134143
}, nil
135144
}
136145

0 commit comments

Comments
 (0)