@@ -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,23 @@ 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+ var ref * plumbing.Reference = nil // Cannot determine ref; this package will be considered final (immutable).
401+
402+ packageRevision , err := krmPackage .buildGitPackageRevision (version , ref )
403+ if err != nil {
404+ return nil , lock , err
405+ }
406+ return packageRevision , lock , nil
417407}
418408
419409func (r * gitRepository ) discoverFinalizedPackages (ref * plumbing.Reference ) ([]repository.PackageRevision , error ) {
@@ -422,20 +412,6 @@ func (r *gitRepository) discoverFinalizedPackages(ref *plumbing.Reference) ([]re
422412 if err != nil {
423413 return nil , err
424414 }
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- }
439415
440416 var revision string
441417 if rev , ok := getBranchNameInLocalRepo (ref .Name ()); ok {
@@ -447,51 +423,20 @@ func (r *gitRepository) discoverFinalizedPackages(ref *plumbing.Reference) ([]re
447423 return nil , fmt .Errorf ("cannot determine revision from ref: %q" , rev )
448424 }
449425
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 {
426+ krmPackages , err := r .DiscoverPackagesInTree (commit , r .directory )
427+ if err != nil {
462428 return nil , err
463429 }
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- }
484430
485- dirTree , err := r .TreeObject (e .Hash )
431+ var result []repository.PackageRevision
432+ for _ , krmPackage := range krmPackages .packages {
433+ packageRevision , err := krmPackage .buildGitPackageRevision (revision , ref )
486434 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
435+ return nil , err
492436 }
437+ result = append (result , packageRevision )
493438 }
494- return nil
439+ return result , nil
495440}
496441
497442// loadDraft will load the draft package. If the package isn't found (we now require a Kptfile), it will return (nil, nil)
@@ -510,45 +455,25 @@ func (r *gitRepository) loadDraft(ref *plumbing.Reference) (*gitPackageRevision,
510455 if err != nil {
511456 return nil , fmt .Errorf ("cannot resolve draft branch to commit (corrupted repository?): %w" , err )
512457 }
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- }
517458
518- dirTree , err := tree .Tree (name )
459+ prefix := name
460+ krmPackages , err := r .DiscoverPackagesInTree (commit , prefix )
519461 if err != nil {
520- switch err {
521- case object .ErrDirectoryNotFound , object .ErrEntryNotFound :
522- // empty package
523- return nil , nil
462+ return nil , err
463+ }
524464
525- default :
526- return nil , fmt .Errorf ("error when looking for package in the repository: %w" , err )
527- }
465+ krmPackage := krmPackages .packages [name ]
466+ if krmPackage == nil {
467+ klog .Warningf ("draft package %q was not found in %#v" , name , krmPackages .packages )
468+ return nil , nil
528469 }
529470
530- packageTree := dirTree .Hash
531- kptfileEntry , err := dirTree .FindEntry ("Kptfile" )
471+ packageRevision , err := krmPackage .buildGitPackageRevision (revision , ref )
532472 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 )
473+ return nil , err
541474 }
542475
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
476+ return packageRevision , nil
552477}
553478
554479func parseDraftName (draft * plumbing.Reference ) (name , revision string , err error ) {
@@ -593,36 +518,28 @@ func (r *gitRepository) loadTaggedPackages(tag *plumbing.Reference) ([]repositor
593518 if err != nil {
594519 return nil , fmt .Errorf ("cannot resolve tag %q to commit (corrupted repository?): %w" , name , err )
595520 }
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- }
600521
601- dirTree , err := tree . Tree ( path )
522+ krmPackages , err := r . DiscoverPackagesInTree ( commit , path )
602523 if err != nil {
603524 klog .Warningf ("Skipping %q; cannot find %q (corrupted repository?): %w" , name , path , err )
604525 return nil , nil
605526 }
606527
607- if kptfileEntry , err := dirTree .FindEntry ("Kptfile" ); err != nil {
528+ krmPackage := krmPackages .packages [path ]
529+ if krmPackage == nil {
608530 klog .Warningf ("Skipping %q: Kptfile not found: %w" , name , err )
609531 return nil , nil
610- } else if ! kptfileEntry .Mode .IsRegular () {
611- klog .Warningf ("Skippping %q: Kptfile is not a file" , name )
612- return nil , nil
532+ }
533+
534+ packageRevision , err := krmPackage .buildGitPackageRevision (revision , tag )
535+ if err != nil {
536+ return nil , err
613537 }
614538
615539 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- },
540+ packageRevision ,
625541 }, nil
542+
626543}
627544
628545func (r * gitRepository ) dumpAllRefs () {
@@ -820,6 +737,7 @@ func (r *gitRepository) pushAndCleanup(ctx context.Context, ph *pushRefSpecBuild
820737 return err
821738 }
822739
740+ klog .Infof ("pushing refs: %v" , specs )
823741 if err := r .repo .Push (& git.PushOptions {
824742 RemoteName : OriginName ,
825743 RefSpecs : specs ,
0 commit comments