@@ -20,7 +20,6 @@ import (
2020 "fmt"
2121 "io"
2222 "os"
23- "path"
2423 "path/filepath"
2524 "strings"
2625 "time"
@@ -32,7 +31,6 @@ import (
3231 "github.com/go-git/go-git/v5"
3332 "github.com/go-git/go-git/v5/config"
3433 "github.com/go-git/go-git/v5/plumbing"
35- "github.com/go-git/go-git/v5/plumbing/filemode"
3634 "github.com/go-git/go-git/v5/plumbing/object"
3735 "github.com/go-git/go-git/v5/plumbing/transport"
3836 "github.com/go-git/go-git/v5/plumbing/transport/http"
@@ -389,31 +387,24 @@ func (r *gitRepository) loadPackageRevision(version, path string, hash plumbing.
389387 }
390388 lock .Commit = commit .Hash .String ()
391389
392- commitTree , err := commit . Tree ( )
390+ krmPackages , err := r . discoverPackagesInTree ( commit , path )
393391 if err != nil {
394- return nil , lock , fmt . Errorf ( "cannot resolve git reference %s (hash %s) to tree: %w" , version , hash , err )
392+ return nil , lock , err
395393 }
396- treeHash := commitTree .Hash
397- if path != "" {
398- te , err := commitTree .FindEntry (path )
399- if err != nil {
400- return nil , lock , fmt .Errorf ("cannot find package %s@%s: %w" , path , version , err )
401- }
402- if te .Mode != filemode .Dir {
403- return nil , lock , fmt .Errorf ("path %s@%s is not a directory" , path , version )
404- }
405- treeHash = te .Hash
406- }
407-
408- return & gitPackageRevision {
409- parent : r ,
410- path : path ,
411- revision : version ,
412- updated : commit .Author .When ,
413- ref : nil , // Cannot determine ref; this package will be considered final (immutable).
414- tree : treeHash ,
415- commit : hash ,
416- }, lock , nil
394+
395+ krmPackage := krmPackages .packages [path ]
396+ if krmPackage == nil {
397+ return nil , lock , fmt .Errorf ("cannot find package %s@%s" , path , version )
398+ }
399+
400+ // TODO: We could just pass the ref in
401+ var ref * plumbing.Reference = nil // Cannot determine ref; this package will be considered final (immutable).
402+
403+ packageRevision , err := krmPackage .buildGitPackageRevision (version , ref )
404+ if err != nil {
405+ return nil , lock , err
406+ }
407+ return packageRevision , lock , nil
417408}
418409
419410func (r * gitRepository ) discoverFinalizedPackages (ref * plumbing.Reference ) ([]repository.PackageRevision , error ) {
@@ -422,20 +413,6 @@ func (r *gitRepository) discoverFinalizedPackages(ref *plumbing.Reference) ([]re
422413 if err != nil {
423414 return nil , err
424415 }
425- tree , err := commit .Tree ()
426- if err != nil {
427- return nil , err
428- }
429-
430- var result []repository.PackageRevision
431-
432- // Recurse into the specified directory
433- if r .directory != "" {
434- tree , err = tree .Tree (r .directory )
435- if err == object .ErrDirectoryNotFound {
436- return result , nil
437- }
438- }
439416
440417 var revision string
441418 if rev , ok := getBranchNameInLocalRepo (ref .Name ()); ok {
@@ -447,51 +424,20 @@ func (r *gitRepository) discoverFinalizedPackages(ref *plumbing.Reference) ([]re
447424 return nil , fmt .Errorf ("cannot determine revision from ref: %q" , rev )
448425 }
449426
450- if err := discoverPackagesInTree (git , tree , r .directory , func (dir string , tree , kptfile plumbing.Hash ) error {
451- result = append (result , & gitPackageRevision {
452- parent : r ,
453- path : dir ,
454- revision : revision ,
455- updated : commit .Author .When ,
456- ref : ref ,
457- tree : tree ,
458- commit : ref .Hash (),
459- })
460- return nil
461- }); err != nil {
427+ krmPackages , err := r .discoverPackagesInTree (commit , r .directory )
428+ if err != nil {
462429 return nil , err
463430 }
464- return result , nil
465- }
466-
467- type foundPackageCallback func (dir string , tree , kptfile plumbing.Hash ) error
468-
469- func discoverPackagesInTree (r * git.Repository , tree * object.Tree , dir string , found foundPackageCallback ) error {
470- for _ , e := range tree .Entries {
471- if e .Mode .IsRegular () && e .Name == "Kptfile" {
472- // Found a package
473- klog .Infof ("Found package %q with Kptfile hash %q" , path .Join (dir , e .Name ), e .Hash )
474- if err := found (dir , tree .Hash , e .Hash ); err != nil {
475- return err
476- }
477- }
478- }
479-
480- for _ , e := range tree .Entries {
481- if e .Mode != filemode .Dir {
482- continue
483- }
484431
485- dirTree , err := r .TreeObject (e .Hash )
432+ var result []repository.PackageRevision
433+ for _ , krmPackage := range krmPackages .packages {
434+ packageRevision , err := krmPackage .buildGitPackageRevision (revision , ref )
486435 if err != nil {
487- return fmt .Errorf ("error getting git tree %v: %w" , e .Hash , err )
488- }
489-
490- if err := discoverPackagesInTree (r , dirTree , path .Join (dir , e .Name ), found ); err != nil {
491- return err
436+ return nil , err
492437 }
438+ result = append (result , packageRevision )
493439 }
494- return nil
440+ return result , nil
495441}
496442
497443// loadDraft will load the draft package. If the package isn't found (we now require a Kptfile), it will return (nil, nil)
@@ -510,45 +456,25 @@ func (r *gitRepository) loadDraft(ref *plumbing.Reference) (*gitPackageRevision,
510456 if err != nil {
511457 return nil , fmt .Errorf ("cannot resolve draft branch to commit (corrupted repository?): %w" , err )
512458 }
513- tree , err := commit .Tree ()
514- if err != nil {
515- return nil , fmt .Errorf ("cannot resolve package commit to tree (corrupted repository?): %w" , err )
516- }
517459
518- dirTree , err := tree .Tree (name )
460+ prefix := name
461+ krmPackages , err := r .discoverPackagesInTree (commit , prefix )
519462 if err != nil {
520- switch err {
521- case object .ErrDirectoryNotFound , object .ErrEntryNotFound :
522- // empty package
523- return nil , nil
463+ return nil , err
464+ }
524465
525- default :
526- return nil , fmt .Errorf ("error when looking for package in the repository: %w" , err )
527- }
466+ krmPackage := krmPackages .packages [name ]
467+ if krmPackage == nil {
468+ klog .Warningf ("draft package %q was not found in %#v" , name , krmPackages .packages )
469+ return nil , nil
528470 }
529471
530- packageTree := dirTree .Hash
531- kptfileEntry , err := dirTree .FindEntry ("Kptfile" )
472+ packageRevision , err := krmPackage .buildGitPackageRevision (revision , ref )
532473 if err != nil {
533- if err == object .ErrEntryNotFound {
534- return nil , nil
535- } else {
536- return nil , fmt .Errorf ("error finding Kptfile: %w" , err )
537- }
538- }
539- if ! kptfileEntry .Mode .IsRegular () {
540- return nil , fmt .Errorf ("found Kptfile which is not a regular file: %s" , kptfileEntry .Mode )
474+ return nil , err
541475 }
542476
543- return & gitPackageRevision {
544- parent : r ,
545- path : name ,
546- revision : revision ,
547- updated : commit .Author .When ,
548- ref : ref ,
549- tree : packageTree ,
550- commit : ref .Hash (),
551- }, nil
477+ return packageRevision , nil
552478}
553479
554480func parseDraftName (draft * plumbing.Reference ) (name , revision string , err error ) {
@@ -593,36 +519,28 @@ func (r *gitRepository) loadTaggedPackages(tag *plumbing.Reference) ([]repositor
593519 if err != nil {
594520 return nil , fmt .Errorf ("cannot resolve tag %q to commit (corrupted repository?): %w" , name , err )
595521 }
596- tree , err := commit .Tree ()
597- if err != nil {
598- return nil , fmt .Errorf ("cannot resolve tag %q to tree (corrupted repository?): %w" , name , err )
599- }
600522
601- dirTree , err := tree . Tree ( path )
523+ krmPackages , err := r . discoverPackagesInTree ( commit , path )
602524 if err != nil {
603525 klog .Warningf ("Skipping %q; cannot find %q (corrupted repository?): %w" , name , path , err )
604526 return nil , nil
605527 }
606528
607- if kptfileEntry , err := dirTree .FindEntry ("Kptfile" ); err != nil {
529+ krmPackage := krmPackages .packages [path ]
530+ if krmPackage == nil {
608531 klog .Warningf ("Skipping %q: Kptfile not found: %w" , name , err )
609532 return nil , nil
610- } else if ! kptfileEntry .Mode .IsRegular () {
611- klog .Warningf ("Skippping %q: Kptfile is not a file" , name )
612- return nil , nil
533+ }
534+
535+ packageRevision , err := krmPackage .buildGitPackageRevision (revision , tag )
536+ if err != nil {
537+ return nil , err
613538 }
614539
615540 return []repository.PackageRevision {
616- & gitPackageRevision {
617- parent : r ,
618- path : path ,
619- revision : revision ,
620- updated : commit .Author .When ,
621- ref : tag ,
622- tree : dirTree .Hash ,
623- commit : tag .Hash (),
624- },
541+ packageRevision ,
625542 }, nil
543+
626544}
627545
628546func (r * gitRepository ) dumpAllRefs () {
@@ -820,6 +738,7 @@ func (r *gitRepository) pushAndCleanup(ctx context.Context, ph *pushRefSpecBuild
820738 return err
821739 }
822740
741+ klog .Infof ("pushing refs: %v" , specs )
823742 if err := r .repo .Push (& git.PushOptions {
824743 RemoteName : OriginName ,
825744 RefSpecs : specs ,
0 commit comments