@@ -471,4 +471,51 @@ void gitlabExclusionMultipleSections() {
471471 assertOwners (codeOwners , "/config/something.conf" , "@ops-team" );
472472 }
473473
474+ @ Test
475+ void gitlabExclusionRealUsecase () {
476+ CodeOwners codeOwners = new CodeOwners (
477+ "[Code Quality][3] @quality\n " +
478+ "*\n " +
479+ "\n " +
480+ "[Change Management Process][1] @changemanagement\n " +
481+ "!/docs/\n " +
482+ "!*.md\n " +
483+ "!*.example\n " +
484+ "!.gitignore\n " +
485+ "!.prettierignore\n " +
486+ "*"
487+ );
488+
489+ codeOwners .setVerbose (true );
490+ assertOwners (codeOwners , "README.md" , "@quality" ); // Not for *.md
491+ assertOwners (codeOwners , "docs/README.md" , "@quality" ); // Not for *.md
492+ assertOwners (codeOwners , "subdir/README.md" , "@quality" ); // Not for *.md
493+ assertOwners (codeOwners , "Something.rb" , "@quality" , "@changemanagement" );
494+ assertOwners (codeOwners , "docs/Something.rb" , "@quality" ); // Not in /docs/
495+ assertOwners (codeOwners , "subdir/Something.rb" , "@quality" , "@changemanagement" );
496+ assertOwners (codeOwners , "Foo.gitignore" , "@quality" , "@changemanagement" );
497+ assertOwners (codeOwners , ".gitignore" , "@quality" ); // Not .gitignore
498+ assertOwners (codeOwners , "docs/Foo.gitignore" , "@quality" ); // Not in /docs/
499+ assertOwners (codeOwners , "docs/.gitignore" , "@quality" ); // Not in /docs/ AND Not .gitignore
500+ assertOwners (codeOwners , "subdir/Foo.gitignore" , "@quality" , "@changemanagement" );
501+ assertOwners (codeOwners , "subdir/.gitignore" , "@quality" ); // Not .gitignore
502+ }
503+
504+
505+ @ Test
506+ void gitlabFileMatchingBugReproduction () {
507+ // The bug: The second line also matches "foo.gitignore"
508+ CodeOwners codeOwners = new CodeOwners (
509+ "*.gitignore @one\n " +
510+ ".gitignore @two\n "
511+ );
512+ codeOwners .setVerbose (true );
513+ assertOwners (codeOwners , ".gitignore" , "@two" ); // Last match in a section is used
514+ assertOwners (codeOwners , "foo.gitignore" , "@one" );
515+ assertOwners (codeOwners , "/.gitignore" , "@two" ); // Last match in a section is used
516+ assertOwners (codeOwners , "/foo.gitignore" , "@one" );
517+ assertOwners (codeOwners , "/subdir/.gitignore" , "@two" );
518+ assertOwners (codeOwners , "/subdir/foo.gitignore" , "@one" );
519+ }
520+
474521}
0 commit comments