@@ -38,6 +38,7 @@ import (
38
38
"github.com/go-git/go-git/v5/plumbing/transport"
39
39
"go.opentelemetry.io/otel"
40
40
"go.opentelemetry.io/otel/trace"
41
+ "golang.org/x/mod/semver"
41
42
"k8s.io/klog/v2"
42
43
)
43
44
@@ -238,7 +239,7 @@ func (r *gitRepository) ListPackageRevisions(ctx context.Context, filter reposit
238
239
klog .Warningf ("no package draft found for ref %v" , ref )
239
240
}
240
241
case isTagInLocalRepo (ref .Name ()):
241
- tagged , err := r .loadTaggedPackages (ctx , ref )
242
+ tagged , err := r .loadPackagesForGitTag (ctx , ref )
242
243
if err != nil {
243
244
// this tag is not associated with any package (e.g. could be a release tag)
244
245
continue
@@ -253,7 +254,7 @@ func (r *gitRepository) ListPackageRevisions(ctx context.Context, filter reposit
253
254
254
255
if main != nil {
255
256
// TODO: ignore packages that are unchanged in main branch, compared to a tagged version?
256
- mainpkgs , err := r .discoverFinalizedPackages (ctx , main )
257
+ mainpkgs , err := r .loadPackagesForGitBranch (ctx , main )
257
258
if err != nil {
258
259
return nil , err
259
260
}
@@ -437,8 +438,6 @@ func (r *gitRepository) GetPackageRevision(ctx context.Context, version, path st
437
438
438
439
gitRepo := r .repo
439
440
440
- var hash plumbing.Hash
441
-
442
441
// Trim leading and trailing slashes
443
442
path = strings .Trim (path , "/" )
444
443
@@ -448,38 +447,38 @@ func (r *gitRepository) GetPackageRevision(ctx context.Context, version, path st
448
447
// * prefixed (tag=<packageDir/<version>) - solving the co-versioning problem.
449
448
//
450
449
// We have to check both forms when looking up a version.
451
- refNames := [] string {}
450
+ var refNames []plumbing. ReferenceName
452
451
if path != "" {
453
- refNames = append ( refNames , path + "/" + version )
454
- // HACK: Is this always refs/remotes/origin ? Is it ever not (i.e. do we need both forms? )
455
- refNames = append (refNames , "refs/remotes/ origin/" + path + "/" + version )
452
+ // TODO: Need to support sub-paths, we can have any parent directory as the prefix
453
+ refNames = append ( refNames , plumbing . NewTagReferenceName ( path + "/" + version ) )
454
+ refNames = append (refNames , plumbing . NewRemoteReferenceName ( " origin" , path + "/" + version ) )
456
455
}
457
- refNames = append (refNames , version )
458
- // HACK: Is this always refs/remotes/origin ? Is it ever not (i.e. do we need both forms?)
459
- refNames = append (refNames , "refs/remotes/origin/" + version )
456
+ refNames = append (refNames , plumbing .NewTagReferenceName (version ))
457
+ refNames = append (refNames , plumbing .NewRemoteReferenceName ("origin" , version ))
460
458
461
- for _ , ref := range refNames {
462
- if resolved , err := gitRepo .ResolveRevision (plumbing .Revision (ref )); err != nil {
459
+ var foundRef * plumbing.Reference
460
+ for _ , refName := range refNames {
461
+ if ref , err := gitRepo .Reference (refName , true ); err != nil {
463
462
if errors .Is (err , plumbing .ErrReferenceNotFound ) {
464
463
continue
465
464
}
466
- return nil , kptfilev1.GitLock {}, fmt .Errorf ("error resolving git reference %q: %w" , ref , err )
465
+ return nil , kptfilev1.GitLock {}, fmt .Errorf ("error resolving git reference %q: %w" , refName , err )
467
466
} else {
468
- hash = * resolved
467
+ foundRef = ref
469
468
break
470
469
}
471
470
}
472
471
473
- if hash . IsZero () {
472
+ if foundRef == nil {
474
473
r .dumpAllRefs ()
475
474
476
475
return nil , kptfilev1.GitLock {}, fmt .Errorf ("cannot find git reference (tried %v)" , refNames )
477
476
}
478
477
479
- return r .loadPackageRevision (ctx , version , path , hash )
478
+ return r .loadPackageRevision (ctx , version , path , foundRef )
480
479
}
481
480
482
- func (r * gitRepository ) loadPackageRevision (ctx context.Context , version , path string , hash plumbing.Hash ) (repository.PackageRevision , kptfilev1.GitLock , error ) {
481
+ func (r * gitRepository ) loadPackageRevision (ctx context.Context , version , path string , ref * plumbing.Reference ) (repository.PackageRevision , kptfilev1.GitLock , error ) {
483
482
ctx , span := tracer .Start (ctx , "gitRepository::loadPackageRevision" , trace .WithAttributes ())
484
483
defer span .End ()
485
484
@@ -500,9 +499,9 @@ func (r *gitRepository) loadPackageRevision(ctx context.Context, version, path s
500
499
Ref : version ,
501
500
}
502
501
503
- commit , err := git .CommitObject (hash )
502
+ commit , err := git .CommitObject (ref . Hash () )
504
503
if err != nil {
505
- return nil , lock , fmt .Errorf ("cannot resolve git reference %s (hash: %s) to commit: %w" , version , hash , err )
504
+ return nil , lock , fmt .Errorf ("cannot resolve git reference %s (hash: %s) to commit: %w" , version , ref . Hash () , err )
506
505
}
507
506
lock .Commit = commit .Hash .String ()
508
507
@@ -515,9 +514,7 @@ func (r *gitRepository) loadPackageRevision(ctx context.Context, version, path s
515
514
return nil , lock , fmt .Errorf ("cannot find package %s@%s" , path , version )
516
515
}
517
516
518
- var ref * plumbing.Reference = nil // Cannot determine ref; this package will be considered final (immutable).
519
-
520
- var revision string
517
+ // var revision string
521
518
var workspace v1alpha1.WorkspaceName
522
519
last := strings .LastIndex (version , "/" )
523
520
@@ -526,44 +523,33 @@ func (r *gitRepository) loadPackageRevision(ctx context.Context, version, path s
526
523
workspace = v1alpha1 .WorkspaceName (version [last + 1 :])
527
524
} else {
528
525
// the passed in version is a ref to a published package revision
529
- if version == string (r .branch ) || last < 0 {
530
- revision = version
531
- } else {
532
- revision = version [last + 1 :]
533
- }
526
+ // if version == string(r.branch) || last < 0 {
527
+ // revision = version
528
+ // } else {
529
+ // revision = version[last+1:]
530
+ // }
534
531
workspace , err = getPkgWorkspace (ctx , commit , krmPackage , ref )
535
532
if err != nil {
536
533
return nil , kptfilev1.GitLock {}, err
537
534
}
538
535
}
539
536
540
- packageRevision , err := krmPackage .buildGitPackageRevision (ctx , revision , workspace , ref )
537
+ packageRevision , err := krmPackage .buildGitPackageRevision (ctx , workspace , ref )
541
538
if err != nil {
542
539
return nil , lock , err
543
540
}
544
541
return packageRevision , lock , nil
545
542
}
546
543
547
- func (r * gitRepository ) discoverFinalizedPackages (ctx context.Context , ref * plumbing.Reference ) ([]repository.PackageRevision , error ) {
544
+ func (r * gitRepository ) loadPackagesForGitBranch (ctx context.Context , ref * plumbing.Reference ) ([]repository.PackageRevision , error ) {
548
545
ctx , span := tracer .Start (ctx , "gitRepository::discoverFinalizedPackages" , trace .WithAttributes ())
549
546
defer span .End ()
550
547
551
- git := r .repo
552
- commit , err := git .CommitObject (ref .Hash ())
548
+ commit , err := r .repo .CommitObject (ref .Hash ())
553
549
if err != nil {
554
550
return nil , err
555
551
}
556
552
557
- var revision string
558
- if rev , ok := getBranchNameInLocalRepo (ref .Name ()); ok {
559
- revision = rev
560
- } else if rev , ok = getTagNameInLocalRepo (ref .Name ()); ok {
561
- revision = rev
562
- } else {
563
- // TODO: ignore the ref instead?
564
- return nil , fmt .Errorf ("cannot determine revision from ref: %q" , rev )
565
- }
566
-
567
553
krmPackages , err := r .DiscoverPackagesInTree (commit , DiscoverPackagesOptions {FilterPrefix : r .directory , Recurse : true })
568
554
if err != nil {
569
555
return nil , err
@@ -575,7 +561,8 @@ func (r *gitRepository) discoverFinalizedPackages(ctx context.Context, ref *plum
575
561
if err != nil {
576
562
return nil , err
577
563
}
578
- packageRevision , err := krmPackage .buildGitPackageRevision (ctx , revision , workspace , ref )
564
+
565
+ packageRevision , err := krmPackage .buildGitPackageRevision (ctx , workspace , ref )
579
566
if err != nil {
580
567
return nil , err
581
568
}
@@ -611,7 +598,7 @@ func (r *gitRepository) loadDraft(ctx context.Context, ref *plumbing.Reference)
611
598
return nil , nil
612
599
}
613
600
614
- packageRevision , err := krmPackage .buildGitPackageRevision (ctx , "" , workspaceName , ref )
601
+ packageRevision , err := krmPackage .buildGitPackageRevision (ctx , workspaceName , ref )
615
602
if err != nil {
616
603
return nil , err
617
604
}
@@ -669,7 +656,11 @@ func parseDraftName(draft *plumbing.Reference) (name string, workspaceName v1alp
669
656
return name , workspaceName , nil
670
657
}
671
658
672
- func (r * gitRepository ) loadTaggedPackages (ctx context.Context , tag * plumbing.Reference ) ([]repository.PackageRevision , error ) {
659
+ func isSemver (s string ) bool {
660
+ return semver .IsValid (s )
661
+ }
662
+
663
+ func (r * gitRepository ) loadPackagesForGitTag (ctx context.Context , tag * plumbing.Reference ) ([]repository.PackageRevision , error ) {
673
664
name , ok := getTagNameInLocalRepo (tag .Name ())
674
665
if ! ok {
675
666
return nil , fmt .Errorf ("invalid tag ref: %q" , tag )
@@ -683,8 +674,9 @@ func (r *gitRepository) loadTaggedPackages(ctx context.Context, tag *plumbing.Re
683
674
684
675
}
685
676
677
+ // TODO: I think tag can actually be any prefix of path, so there can be multiple packages here
686
678
// tag=<package path>/version
687
- path , revision := name [:slash ], name [slash + 1 :]
679
+ path , _ := name [:slash ], name [slash + 1 :]
688
680
689
681
if ! packageInDirectory (path , r .directory ) {
690
682
return nil , nil
@@ -711,7 +703,7 @@ func (r *gitRepository) loadTaggedPackages(ctx context.Context, tag *plumbing.Re
711
703
return nil , err
712
704
}
713
705
714
- packageRevision , err := krmPackage .buildGitPackageRevision (ctx , revision , workspaceName , tag )
706
+ packageRevision , err := krmPackage .buildGitPackageRevision (ctx , workspaceName , tag )
715
707
if err != nil {
716
708
return nil , err
717
709
}
0 commit comments