@@ -100,6 +100,7 @@ func OpenRepository(ctx context.Context, name, namespace string, spec *configapi
100100 namespace : namespace ,
101101 repo : repo ,
102102 branch : branch ,
103+ directory : strings .Trim (spec .Directory , "/" ),
103104 secret : spec .SecretRef .Name ,
104105 credentialResolver : opts .CredentialResolver ,
105106 userInfoProvider : opts .UserInfoProvider ,
@@ -117,6 +118,7 @@ type gitRepository struct {
117118 namespace string // Repository resource namespace
118119 secret string // Name of the k8s Secret resource containing credentials
119120 branch BranchName // The main branch from repository registration (defaults to 'main' if unspecified)
121+ directory string // Directory within the repository where to look for packages.
120122 repo * git.Repository
121123 cachedCredentials transport.AuthMethod
122124 credentialResolver repository.CredentialResolver
@@ -184,6 +186,10 @@ func (r *gitRepository) ListPackageRevisions(ctx context.Context) ([]repository.
184186}
185187
186188func (r * gitRepository ) CreatePackageRevision (ctx context.Context , obj * v1alpha1.PackageRevision ) (repository.PackageDraft , error ) {
189+ if ! packageInDirectory (obj .Spec .PackageName , r .directory ) {
190+ return nil , fmt .Errorf ("cannot create %s outside of repository directory %q" , obj .Spec .PackageName , r .directory )
191+ }
192+
187193 var base plumbing.Hash
188194 refName := r .branch .RefInLocal ()
189195 switch main , err := r .repo .Reference (refName , true ); {
@@ -345,6 +351,10 @@ func (r *gitRepository) GetPackage(version, path string) (repository.PackageRevi
345351}
346352
347353func (r * gitRepository ) loadPackageRevision (version , path string , hash plumbing.Hash ) (repository.PackageRevision , kptfilev1.GitLock , error ) {
354+ if ! packageInDirectory (path , r .directory ) {
355+ return nil , kptfilev1.GitLock {}, fmt .Errorf ("cannot find package %s@%s; package is not under the Repository.spec.directory" , path , version )
356+ }
357+
348358 git := r .repo
349359
350360 origin , err := git .Remote ("origin" )
@@ -402,6 +412,16 @@ func (r *gitRepository) discoverFinalizedPackages(ref *plumbing.Reference) ([]re
402412 return nil , err
403413 }
404414
415+ var result []repository.PackageRevision
416+
417+ // Recurse into the specified directory
418+ if r .directory != "" {
419+ tree , err = tree .Tree (r .directory )
420+ if err == object .ErrDirectoryNotFound {
421+ return result , nil
422+ }
423+ }
424+
405425 var revision string
406426 if rev , ok := getBranchNameInLocalRepo (ref .Name ()); ok {
407427 revision = rev
@@ -412,8 +432,7 @@ func (r *gitRepository) discoverFinalizedPackages(ref *plumbing.Reference) ([]re
412432 return nil , fmt .Errorf ("cannot determine revision from ref: %q" , rev )
413433 }
414434
415- var result []repository.PackageRevision
416- if err := discoverPackagesInTree (git , tree , "" , func (dir string , tree , kptfile plumbing.Hash ) error {
435+ if err := discoverPackagesInTree (git , tree , r .directory , func (dir string , tree , kptfile plumbing.Hash ) error {
417436 result = append (result , & gitPackageRevision {
418437 parent : r ,
419438 path : dir ,
@@ -467,6 +486,11 @@ func (r *gitRepository) loadDraft(ref *plumbing.Reference) (*gitPackageRevision,
467486 return nil , err
468487 }
469488
489+ // Only load drafts in the directory specified at repository registration.
490+ if ! packageInDirectory (name , r .directory ) {
491+ return nil , nil
492+ }
493+
470494 commit , err := r .repo .CommitObject (ref .Hash ())
471495 if err != nil {
472496 return nil , fmt .Errorf ("cannot resolve draft branch to commit (corrupted repository?): %w" , err )
@@ -546,6 +570,10 @@ func (r *gitRepository) loadTaggedPackages(tag *plumbing.Reference) ([]repositor
546570 // tag=<package path>/version
547571 path , revision := name [:slash ], name [slash + 1 :]
548572
573+ if ! packageInDirectory (path , r .directory ) {
574+ return nil , nil
575+ }
576+
549577 commit , err := r .repo .CommitObject (tag .Hash ())
550578 if err != nil {
551579 return nil , fmt .Errorf ("cannot resolve tag %q to commit (corrupted repository?): %w" , name , err )
0 commit comments