@@ -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
4646var _ repository.PackageDraft = & gitPackageDraft {}
4747
4848func (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.
108117func (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