From 296dc0622f0e8c4e803ff4f19a5c6fe02a2ae66e Mon Sep 17 00:00:00 2001 From: Joey Perrott Date: Thu, 16 Jan 2020 08:39:09 -0800 Subject: [PATCH] ci: Migrate from CODEOWNERS to PullApprove for PR review management (#34814) We are migrating to PullApprove for our PR review management in an attempt to allow for more granular and equitable code review assignments across the team. Currently this migration is equivalent in the review assignments it will create. Once stable, our expectation is that we will be able to take advantage of PullApproves additional features for things like staged reviews. PR Close #34814 --- .circleci/config.yml | 1 - .github/CODEOWNERS | 981 ------------------------------- .github/angular-robot.yml | 1 + .pullapprove.yml | 1017 +++++++++++++++++++++++++++++++++ docs/COMMITTER.md | 2 +- docs/TRIAGE_AND_LABELS.md | 4 +- tools/verify-codeownership.js | 199 ------- 7 files changed, 1020 insertions(+), 1185 deletions(-) delete mode 100644 .github/CODEOWNERS create mode 100644 .pullapprove.yml delete mode 100644 tools/verify-codeownership.js diff --git a/.circleci/config.yml b/.circleci/config.yml index 6030e6095f..dc96076b7e 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -252,7 +252,6 @@ jobs: (echo -e "\n.bzl files have lint errors. Please run ''yarn bazel:lint-fix''"; exit 1)' - run: yarn gulp lint - - run: node tools/verify-codeownership test: executor: diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS deleted file mode 100644 index ea680b4a0d..0000000000 --- a/.github/CODEOWNERS +++ /dev/null @@ -1,981 +0,0 @@ -# ================================================================================== -# ================================================================================== -# Angular CODEOWNERS -# ================================================================================== -# ================================================================================== -# -# Configuration of code ownership and review approvals for the angular/angular repo. -# -# More info: https://help.github.com/articles/about-codeowners/ -# - - -# ================================================ -# General rules / philosophy -# ================================================ -# -# - we trust that people do the right thing and not approve changes they don't feel confident reviewing -# - we use github teams so that we funnel code reviews to the most appropriate reviewer, this is why the team structure is fine-grained -# - we enforce that only approved PRs get merged to ensure that unreviewed code doesn't get accidentally merged -# - we delegate approval rights as much as possible so that we can scale better -# - each group must have at least one person, but several people are preferable to avoid a single point of failure issues -# - most file groups have one or two global approvers groups as fallbacks: -# - @angular/fw-global-approvers: for approving minor changes, large-scale refactorings, and emergency situations. -# - @angular/fw-global-approvers-for-docs-only-changes: for approving minor documentation-only changes that don't require engineering review -# - a small number of file groups have very limited number of reviewers because incorrect changes to the files they guard would have serious consequences (e.g. security, public api) -# -# Configuration nuances: -# -# - This configuration works in conjunction with the protected branch settings that require all changes to be made via pull requests with at least one approval. -# - This approval can come from an appropriate codeowner, or any repo collaborator (person with write access) if the PR is authored by a codeowner. -# - Each codeowners team must have write access to the repo, otherwise their reviews won't count. -# -# In the case of emergency, the repo administrators which include angular-caretaker can bypass this requirement. - - - -# ================================================ -# GitHub username registry -# (just to make this file easier to understand) -# ================================================ - -# alan-agius4 - Alan Agius -# alexeagle - Alex Eagle -# alxhub - Alex Rickabaugh -# AndrewKushnir - Andrew Kushnir -# andrewseguin - Andrew Seguin -# atscott - Andrew Scott -# devversion - Paul Gschwendtner -# filipesilva - Filipe Silva -# gkalpak - George Kalpakas -# IgorMinar - Igor Minar -# JiaLiPassion - Jia Li -# JoostK - Joost Koehoorn -# josephperrott - Joey Perrott -# kapunahelewong - Kapunahele Wong -# kara - Kara Erickson -# kyliau - Keen Yee Liau -# matsko - Matias Niemelä -# mgechev - Minko Gechev -# mhevery - Misko Hevery -# petebacondarwin - Pete Bacon Darwin -# pkozlowski-opensource - Pawel Kozlowski -# robwormald - Rob Wormald -# stephenfluin - Stephen Fluin -# vikerman - Vikram Subramanian - - - -###################################################################################################### -# -# Team structure and memberships -# ------------------------------ -# -# This section is here just because the GitHub UI is too hard to navigate and audit. -# -# Any changes to team structure or memberships must first be made in this file and only then -# implemented in the GitHub UI. -####################################################################################################### - - -# =========================================================== -# @angular/framework-global-approvers -# =========================================================== -# Used for approving minor changes, large-scale refactorings, and emergency situations. -# (secret team to avoid review requests, it also doesn't inherit from @angular/framework because nested teams can't be secret) -# -# - IgorMinar -# - josephperrott -# - kara -# - mhevery - - -# =========================================================== -# @angular/framework-global-approvers-for-docs-only-changes -# =========================================================== -# Used for approving minor documentation-only changes that don't require engineering review. -# (secret team to avoid review requests, it also doesn't inherit from @angular/framework because nested teams can't be secret) -# -# - gkalpak -# - kapunahelewong -# - petebacondarwin - - -# =========================================================== -# @angular/fw-animations -# =========================================================== -# -# - matsko - - -# =========================================================== -# @angular/tools-bazel -# =========================================================== -# -# - alexeagle -# - kyliau -# - IgorMinar -# - mgechev - - -# =========================================================== -# @angular/tools-cli -# =========================================================== -# -# - filipesilva -# - mgechev -# - vikerman - - -# =========================================================== -# @angular/fw-compiler -# =========================================================== -# -# - alxhub -# - AndrewKushnir -# - kara -# - JoostK - - -# =========================================================== -# @angular/fw-ngcc -# =========================================================== -# -# - alxhub -# - gkalpak -# - petebacondarwin - - -# =========================================================== -# @angular/fw-core -# =========================================================== -# -# - alxhub -# - AndrewKushnir -# - kara -# - mhevery -# - pkozlowski-opensource - - -# =========================================================== -# @angular/fw-http -# =========================================================== -# -# - alxhub -# - IgorMinar - - -# =========================================================== -# @angular/fw-elements -# =========================================================== -# -# - andrewseguin -# - gkalpak -# - robwormald - - -# =========================================================== -# @angular/fw-forms -# =========================================================== -# -# - AndrewKushnir - - -# =========================================================== -# @angular/tools-language-service -# =========================================================== -# -# - kyliau - - -# =========================================================== -# @angular/fw-server -# =========================================================== -# -# - alxhub -# - vikerman - - -# =========================================================== -# @angular/fw-router -# =========================================================== -# -# - atscott - - -# =========================================================== -# @angular/fw-service-worker -# =========================================================== -# -# - alxhub -# - gkalpak -# - IgorMinar - - -# =========================================================== -# @angular/fw-upgrade -# =========================================================== -# -# - gkalpak -# - petebacondarwin - - -# =========================================================== -# @angular/fw-testing -# =========================================================== -# -# - vikerman - - -# =========================================================== -# @angular/fw-i18n -# =========================================================== -# -# - AndrewKushnir -# - mhevery -# - petebacondarwin -# - vikerman - - -# =========================================================== -# @angular/fw-security -# =========================================================== -# -# - IgorMinar -# - mhevery - - -# =========================================================== -# @angular/fw-zones -# =========================================================== -# -# - JiaLiPassion -# - mhevery -# - vikerman - - -# =========================================================== -# @angular/tools-benchpress -# =========================================================== -# -# - alxhub - - -# =========================================================== -# @angular/fw-integration -# =========================================================== -# -# - IgorMinar -# - josephperrott -# - mhevery - - -# =========================================================== -# @angular/docs-infra -# =========================================================== -# -# - gkalpak -# - IgorMinar -# - petebacondarwin - - -# =========================================================== -# @angular/fw-docs-intro -# =========================================================== -# -# - IgorMinar -# - stephenfluin - - -# =========================================================== -# @angular/fw-docs-observables -# =========================================================== -# -# - alxhub - - -# =========================================================== -# @angular/fw-docs-packaging -# =========================================================== -# -# - IgorMinar -# - vikerman - - -# =========================================================== -# @angular/tools-docs-libraries -# =========================================================== -# -# - alan-agius4 -# - IgorMinar -# - mgechev -# - vikerman - - -# =========================================================== -# @angular/tools-docs-schematics -# =========================================================== -# -# - alan-agius4 -# - IgorMinar -# - mgechev -# - vikerman - - -# =========================================================== -# @angular/fw-docs-marketing -# =========================================================== -# -# - IgorMinar -# - stephenfluin - - -# =========================================================== -# @angular/fw-public-api -# =========================================================== -# -# - IgorMinar - - -# =========================================================== -# @angular/dev-infra-framework -# =========================================================== -# -# - devversion -# - filipesilva -# - gkalpak -# - IgorMinar -# - josephperrott - - -# =========================================================== -# @angular/fw-size-tracking -# =========================================================== -# -# - IgorMinar -# - kara - - - - -###################################################################################################### -# -# CODEOWNERS rules -# ----------------- -# -# All the following rules are applied in the order specified in this file. -# The last rule that matches wins! -# -# See https://git-scm.com/docs/gitignore#_pattern_format for pattern syntax docs. -# -###################################################################################################### - - -# ================================================ -# Default Owners -# (in case no pattern matches a path in a PR - this should be treated as a bug and result in adding the path to CODEOWNERS) -# ================================================ - -* @IgorMinar @angular/framework-global-approvers - - - -# ================================================ -# Build, CI & Dev-infra Owners -# ================================================ - -/* @angular/dev-infra-framework -/.buildkite/** @angular/dev-infra-framework -/.circleci/** @angular/dev-infra-framework -/.devcontainer/** @angular/dev-infra-framework -/.github/** @angular/dev-infra-framework -/.vscode/** @angular/dev-infra-framework -/docs/BAZEL.md @angular/dev-infra-framework -/packages/* @angular/dev-infra-framework -/packages/examples/test-utils/** @angular/dev-infra-framework -/packages/private/** @angular/dev-infra-framework -/scripts/** @angular/dev-infra-framework -/third_party/** @angular/dev-infra-framework -/tools/build/** @angular/dev-infra-framework -/tools/cjs-jasmine/** @angular/dev-infra-framework -/tools/gulp-tasks/** @angular/dev-infra-framework -/tools/ngcontainer/** @angular/dev-infra-framework -/tools/npm/** @angular/dev-infra-framework -/tools/npm_workspace/** @angular/dev-infra-framework -/tools/public_api_guard/** @angular/dev-infra-framework -/tools/rxjs/** @angular/dev-infra-framework -/tools/size-tracking/** @angular/dev-infra-framework -/tools/source-map-test/** @angular/dev-infra-framework -/tools/symbol-extractor/** @angular/dev-infra-framework -/tools/testing/** @angular/dev-infra-framework -/tools/ts-api-guardian/** @angular/dev-infra-framework -/tools/tslint/** @angular/dev-infra-framework -/tools/validate-commit-message/** @angular/dev-infra-framework -/tools/yarn/** @angular/dev-infra-framework -/tools/* @angular/dev-infra-framework -*.BAZEL @angular/dev-infra-framework -*.bzl @angular/dev-infra-framework - - - -# ================================================ -# @angular/animations -# ================================================ - -/packages/animations/** @angular/fw-animations @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes -/packages/platform-browser/animations/** @angular/fw-animations @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes - -/aio/content/guide/animations.md @angular/fw-animations @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes -/aio/content/examples/animations/** @angular/fw-animations @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes -/aio/content/images/guide/animations/** @angular/fw-animations @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes - -/aio/content/guide/complex-animation-sequences.md @angular/fw-animations @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes - -/aio/content/guide/reusable-animations.md @angular/fw-animations @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes - -/aio/content/guide/route-animations.md @angular/fw-animations @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes - -/aio/content/guide/transition-and-triggers.md @angular/fw-animations @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes - - - -# ================================================ -# @angular/bazel -# ================================================ - -/packages/bazel/** @angular/tools-bazel @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes -/aio/content/guide/bazel.md @angular/tools-bazel @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes - - - -# ================================================ -# @angular/compiler -# @angular/compiler-cli -# ================================================ - -/packages/compiler/** @angular/fw-compiler @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes -/packages/examples/compiler/** @angular/fw-compiler @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes -/packages/compiler-cli/** @angular/fw-compiler @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes -/aio/content/guide/angular-compiler-options.md @angular/fw-compiler @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes -/aio/content/guide/aot-compiler.md @angular/fw-compiler @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes -/aio/content/guide/aot-metadata-errors.md @angular/fw-compiler @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes -/aio/content/guide/template-typecheck.md @angular/fw-compiler @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes - - - -# ================================================ -# packages/compiler-cli/ngcc/ -# ================================================ - -/packages/compiler-cli/ngcc/** @angular/fw-ngcc @angular/framework-global-approvers - - - -# ================================================ -# Framework/cli integration -# -# a rule to control API changes between @angular/compiler-cli and @angular/cli -# ================================================ - -/packages/compiler-cli/src/ngtools/** @angular/tools-cli @angular/framework-global-approvers -/aio/content/guide/cli-builder.md @angular/tools-cli @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes -/aio/content/examples/cli-builder/** @angular/tools-cli @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes -/aio/content/guide/ivy.md @angular/tools-cli @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes -/aio/content/guide/web-worker.md @angular/tools-cli @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes - - -# ================================================ -# @angular/core -# @angular/common (except @angular/common/http) -# @angular/platform-browser -# @angular/platform-browser-dynamic -# @angular/platform-webworker -# @angular/platform-webworker-dynamic -# ================================================ - -/packages/core/** @angular/fw-core @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes -/packages/examples/core/** @angular/fw-core @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes -/packages/common/** @angular/fw-core @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes -/packages/platform-browser/** @angular/fw-core @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes -/packages/examples/platform-browser/** @angular/fw-core @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes -/packages/platform-browser-dynamic/** @angular/fw-core @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes -/packages/platform-webworker/** @angular/fw-core @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes -/packages/platform-webworker-dynamic/** @angular/fw-core @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes -/packages/examples/common/** @angular/fw-core @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes -/packages/docs/** @angular/fw-core @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes - -/aio/content/guide/accessibility.md @angular/fw-core @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes -/aio/content/examples/accessibility/** @angular/fw-core @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes - -/aio/content/guide/architecture-components.md @angular/fw-core @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes -/aio/content/guide/architecture-modules.md @angular/fw-core @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes -/aio/content/guide/architecture-next-steps.md @angular/fw-core @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes -/aio/content/guide/architecture-services.md @angular/fw-core @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes -/aio/content/guide/architecture.md @angular/fw-core @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes -/aio/content/examples/architecture/** @angular/fw-core @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes -/aio/content/images/guide/architecture/** @angular/fw-core @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes - -/aio/content/guide/attribute-directives.md @angular/fw-core @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes -/aio/content/examples/attribute-directives/** @angular/fw-core @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes -/aio/content/images/guide/attribute-directives/** @angular/fw-core @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes - -/aio/content/guide/bootstrapping.md @angular/fw-core @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes -/aio/content/examples/bootstrapping/** @angular/fw-core @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes - -/aio/content/guide/cheatsheet.md @angular/fw-core @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes - -/aio/content/guide/component-interaction.md @angular/fw-core @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes -/aio/content/examples/component-interaction/** @angular/fw-core @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes -/aio/content/images/guide/component-interaction/** @angular/fw-core @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes - -/aio/content/guide/component-styles.md @angular/fw-core @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes -/aio/content/examples/component-styles/** @angular/fw-core @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes - -/aio/content/guide/dependency-injection.md @angular/fw-core @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes -/aio/content/examples/dependency-injection/** @angular/fw-core @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes -/aio/content/images/guide/dependency-injection/** @angular/fw-core @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes - -/aio/content/guide/dependency-injection-in-action.md @angular/fw-core @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes -/aio/content/examples/dependency-injection-in-action/** @angular/fw-core @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes -/aio/content/images/guide/dependency-injection-in-action/** @angular/fw-core @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes - -/aio/content/guide/dependency-injection-navtree.md @angular/fw-core @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes - -/aio/content/guide/dependency-injection-providers.md @angular/fw-core @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes - -/aio/content/guide/displaying-data.md @angular/fw-core @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes -/aio/content/examples/displaying-data/** @angular/fw-core @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes -/aio/content/images/guide/displaying-data/** @angular/fw-core @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes - -/aio/content/guide/dynamic-component-loader.md @angular/fw-core @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes -/aio/content/examples/dynamic-component-loader/** @angular/fw-core @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes -/aio/content/images/guide/dynamic-component-loader/** @angular/fw-core @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes - -/aio/content/guide/entry-components.md @angular/fw-core @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes - -/aio/content/guide/feature-modules.md @angular/fw-core @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes -/aio/content/examples/feature-modules/** @angular/fw-core @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes -/aio/content/images/guide/feature-modules/** @angular/fw-core @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes - -/aio/content/guide/frequent-ngmodules.md @angular/fw-core @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes -/aio/content/images/guide/frequent-ngmodules/** @angular/fw-core @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes - -/aio/content/guide/hierarchical-dependency-injection.md @angular/fw-core @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes -/aio/content/examples/hierarchical-dependency-injection/** @angular/fw-core @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes -/aio/content/examples/providers-viewproviders/** @angular/fw-core @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes -/aio/content/examples/resolution-modifiers/** @angular/fw-core @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes - -/aio/content/guide/lazy-loading-ngmodules.md @angular/fw-core @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes -/aio/content/examples/lazy-loading-ngmodules/** @angular/fw-core @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes -/aio/content/images/guide/lazy-loading-ngmodules/** @angular/fw-core @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes - -/aio/content/guide/lifecycle-hooks.md @angular/fw-core @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes -/aio/content/examples/lifecycle-hooks/** @angular/fw-core @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes -/aio/content/images/guide/lifecycle-hooks/** @angular/fw-core @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes - -/aio/content/examples/ngcontainer/** @angular/fw-core @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes - -/aio/content/guide/ngmodules.md @angular/fw-core @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes -/aio/content/examples/ngmodules/** @angular/fw-core @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes - -/aio/content/guide/ngmodule-api.md @angular/fw-core @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes - -/aio/content/guide/ngmodule-faq.md @angular/fw-core @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes -/aio/content/examples/ngmodule-faq/** @angular/fw-core @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes - -/aio/content/guide/ngmodule-vs-jsmodule.md @angular/fw-core @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes - -/aio/content/guide/module-types.md @angular/fw-core @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes - -/aio/content/guide/template-syntax.md @angular/fw-core @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes -/aio/content/examples/built-in-template-functions/** @angular/fw-core @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes -/aio/content/examples/event-binding/** @angular/fw-core @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes -/aio/content/examples/interpolation/** @angular/fw-core @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes -/aio/content/examples/template-syntax/** @angular/fw-core @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes -/aio/content/images/guide/template-syntax/** @angular/fw-core @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes -/aio/content/examples/binding-syntax/** @angular/fw-core @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes -/aio/content/examples/property-binding/** @angular/fw-core @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes -/aio/content/examples/attribute-binding/** @angular/fw-core @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes -/aio/content/examples/two-way-binding/** @angular/fw-core @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes -/aio/content/examples/built-in-directives/** @angular/fw-core @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes -/aio/content/images/guide/built-in-directives/** @angular/fw-core @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes -/aio/content/examples/template-reference-variables/** @angular/fw-core @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes -/aio/content/examples/inputs-outputs/** @angular/fw-core @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes -/aio/content/images/guide/inputs-outputs/** @angular/fw-core @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes -/aio/content/examples/template-expression-operators/** @angular/fw-core @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes - -/aio/content/guide/pipes.md @angular/fw-core @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes -/aio/content/examples/pipes/** @angular/fw-core @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes -/aio/content/images/guide/pipes/** @angular/fw-core @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes - -/aio/content/guide/providers.md @angular/fw-core @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes -/aio/content/examples/providers/** @angular/fw-core @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes - -/aio/content/guide/singleton-services.md @angular/fw-core @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes - -/aio/content/guide/set-document-title.md @angular/fw-core @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes -/aio/content/examples/set-document-title/** @angular/fw-core @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes -/aio/content/images/guide/set-document-title/** @angular/fw-core @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes - -/aio/content/guide/sharing-ngmodules.md @angular/fw-core @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes - -/aio/content/guide/structural-directives.md @angular/fw-core @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes -/aio/content/examples/structural-directives/** @angular/fw-core @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes -/aio/content/images/guide/structural-directives/** @angular/fw-core @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes - -/aio/content/guide/user-input.md @angular/fw-core @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes -/aio/content/examples/user-input/** @angular/fw-core @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes -/aio/content/images/guide/user-input/** @angular/fw-core @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes - - - -# ================================================ -# @angular/common/http -# @angular/http -# ================================================ - -/packages/common/http/** @angular/fw-http @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes -/packages/http/** @angular/fw-http @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes -/packages/examples/http/** @angular/fw-http @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes -/aio/content/guide/http.md @angular/fw-http @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes -/aio/content/examples/http/** @angular/fw-http @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes -/aio/content/images/guide/http/** @angular/fw-http @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes - - - -# ================================================ -# @angular/elements -# ================================================ - -/packages/elements/** @angular/fw-elements @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes -/aio/content/examples/elements/** @angular/fw-elements @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes -/aio/content/images/guide/elements/** @angular/fw-elements @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes -/aio/content/guide/elements.md @angular/fw-elements @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes - - - -# ================================================ -# @angular/forms -# ================================================ - -/packages/forms/** @angular/fw-forms @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes -/packages/examples/forms/** @angular/fw-forms @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes -/aio/content/guide/forms.md @angular/fw-forms @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes -/aio/content/examples/forms/** @angular/fw-forms @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes -/aio/content/images/guide/forms/** @angular/fw-forms @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes -/aio/content/guide/forms-overview.md @angular/fw-forms @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes -/aio/content/examples/forms-overview/** @angular/fw-forms @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes -/aio/content/images/guide/forms-overview/** @angular/fw-forms @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes -/aio/content/guide/form-validation.md @angular/fw-forms @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes -/aio/content/examples/form-validation/** @angular/fw-forms @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes -/aio/content/images/guide/form-validation/** @angular/fw-forms @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes -/aio/content/guide/dynamic-form.md @angular/fw-forms @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes -/aio/content/examples/dynamic-form/** @angular/fw-forms @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes -/aio/content/images/guide/dynamic-form/** @angular/fw-forms @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes -/aio/content/guide/reactive-forms.md @angular/fw-forms @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes -/aio/content/examples/reactive-forms/** @angular/fw-forms @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes -/aio/content/images/guide/reactive-forms/** @angular/fw-forms @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes - - - -# ================================================ -# @angular/language-service -# ================================================ - -/packages/language-service/** @angular/tools-language-service @angular/framework-global-approvers -/aio/content/guide/language-service.md @angular/tools-language-service @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes -/aio/content/images/guide/language-service/** @angular/tools-language-service @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes - - - -# ================================================ -# @angular/platform-server -# ================================================ - -/packages/platform-server/** @angular/fw-server @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes -/aio/content/guide/universal.md @angular/fw-server @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes -/aio/content/examples/universal/** @angular/fw-server @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes - - - -# ================================================ -# @angular/router -# ================================================ - -/packages/router/** @angular/fw-router @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes -/packages/examples/router/** @angular/fw-router @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes -/aio/content/guide/router.md @angular/fw-router @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes -/aio/content/examples/router/** @angular/fw-router @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes -/aio/content/images/guide/router/** @angular/fw-router @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes - - - -# ================================================ -# @angular/service-worker -# ================================================ - -/packages/service-worker/** @angular/fw-service-worker @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes -/packages/examples/service-worker/** @angular/fw-service-worker @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes -/aio/content/guide/service-worker-getting-started.md @angular/fw-service-worker @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes -/aio/content/examples/service-worker-getting-started/** @angular/fw-service-worker @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes -/aio/content/guide/app-shell.md @angular/fw-service-worker @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes -/aio/content/guide/service-worker-communications.md @angular/fw-service-worker @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes -/aio/content/guide/service-worker-config.md @angular/fw-service-worker @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes -/aio/content/guide/service-worker-devops.md @angular/fw-service-worker @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes -/aio/content/guide/service-worker-intro.md @angular/fw-service-worker @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes -/aio/content/images/guide/service-worker/** @angular/fw-service-worker @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes - - - -# ================================================ -# @angular/upgrade -# ================================================ - -/packages/upgrade/** @angular/fw-upgrade @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes -/packages/common/upgrade/** @angular/fw-upgrade @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes -/packages/examples/upgrade/** @angular/fw-upgrade @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes -/aio/content/guide/upgrade.md @angular/fw-upgrade @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes -/aio/content/examples/upgrade-lazy-load-ajs/** @angular/fw-upgrade @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes -/aio/content/examples/upgrade-module/** @angular/fw-upgrade @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes -/aio/content/images/guide/upgrade/** @angular/fw-upgrade @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes -/aio/content/examples/upgrade-phonecat-1-typescript/** @angular/fw-upgrade @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes -/aio/content/examples/upgrade-phonecat-2-hybrid/** @angular/fw-upgrade @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes -/aio/content/examples/upgrade-phonecat-3-final/** @angular/fw-upgrade @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes -/aio/content/guide/upgrade-performance.md @angular/fw-upgrade @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes -/aio/content/guide/upgrade-setup.md @angular/fw-upgrade @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes -/aio/content/guide/ajs-quick-reference.md @angular/fw-upgrade @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes -/aio/content/examples/ajs-quick-reference/** @angular/fw-upgrade @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes - - - -# ================================================ -# @angular/**/testing -# ================================================ - -testing/** @angular/fw-testing @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes -/aio/content/guide/testing.md @angular/fw-testing @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes -/aio/content/examples/testing/** @angular/fw-testing @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes -/aio/content/images/guide/testing/** @angular/fw-testing @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes - - - -# ================================================ -# @angular i18n -# ================================================ - -/packages/core/src/i18n/** @angular/fw-i18n @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes -/packages/core/src/render3/i18n.ts @angular/fw-i18n @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes -/packages/core/src/render3/i18n.md @angular/fw-i18n @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes -/packages/core/src/render3/interfaces/i18n.ts @angular/fw-i18n @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes -/packages/common/locales/** @angular/fw-i18n @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes -/packages/common/src/i18n/** @angular/fw-i18n @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes -/packages/common/src/pipes/date_pipe.ts @angular/fw-i18n @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes -/packages/common/src/pipes/i18n_plural_pipe.ts @angular/fw-i18n @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes -/packages/common/src/pipes/i18n_select_pipe.ts @angular/fw-i18n @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes -/packages/common/src/pipes/number_pipe.ts @angular/fw-i18n @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes -/packages/compiler/src/i18n/** @angular/fw-i18n @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes -/packages/compiler/src/render3/view/i18n/** @angular/fw-i18n @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes -/packages/compiler-cli/src/extract_i18n.ts @angular/fw-i18n @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes -/packages/localize/** @angular/fw-i18n @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes -/aio/content/guide/i18n.md @angular/fw-i18n @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes -/aio/content/examples/i18n/** @angular/fw-i18n @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes - - -# ================================================ -# @angular security -# ================================================ - -/packages/core/src/sanitization/** @angular/fw-security -/packages/core/test/linker/security_integration_spec.ts @angular/fw-security -/packages/compiler/src/schema/** @angular/fw-security -/packages/platform-browser/src/security/** @angular/fw-security -/aio/content/guide/security.md @angular/fw-security @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes -/aio/content/examples/security/** @angular/fw-security @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes -/aio/content/images/guide/security/** @angular/fw-security @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes - - - -# ================================================ -# zone.js -# ================================================ - -/packages/zone.js/** @angular/fw-zones @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes - - -# ================================================ -# benchpress -# ================================================ - -/packages/benchpress/** @angular/tools-benchpress @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes - - - -# ================================================ -# /integration/* -# ================================================ - -/integration/** @angular/fw-integration @angular/framework-global-approvers - - - -# ================================================ -# docs-infra -# ================================================ - -/aio/* @angular/docs-infra @angular/framework-global-approvers -/aio/aio-builds-setup/** @angular/docs-infra @angular/framework-global-approvers -/aio/content/examples/* @angular/docs-infra @angular/framework-global-approvers -/aio/scripts/** @angular/docs-infra @angular/framework-global-approvers -/aio/src/** @angular/docs-infra @angular/framework-global-approvers -/aio/tests/** @angular/docs-infra @angular/framework-global-approvers -/aio/tools/** @angular/docs-infra @angular/framework-global-approvers - -# Hidden docs -/aio/content/guide/docs-style-guide.md @angular/docs-infra @angular/framework-global-approvers -/aio/content/examples/docs-style-guide/** @angular/docs-infra @angular/framework-global-approvers -/aio/content/images/guide/docs-style-guide/** @angular/docs-infra @angular/framework-global-approvers -/aio/content/guide/visual-studio-2015.md @angular/docs-infra @angular/framework-global-approvers -/aio/content/examples/visual-studio-2015/** @angular/docs-infra @angular/framework-global-approvers - - - -# ================================================ -# Docs: getting started & tutorial -# ================================================ - -/aio/content/guide/setup-local.md @angular/fw-docs-intro @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes -/aio/content/images/guide/setup-local/** @angular/fw-docs-intro @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes -/aio/content/tutorial/** @angular/fw-docs-intro @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes -/aio/content/images/guide/toh/** @angular/fw-docs-intro @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes -/aio/content/examples/toh-pt0/** @angular/fw-docs-intro @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes -/aio/content/examples/toh-pt1/** @angular/fw-docs-intro @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes -/aio/content/examples/toh-pt2/** @angular/fw-docs-intro @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes -/aio/content/examples/toh-pt3/** @angular/fw-docs-intro @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes -/aio/content/examples/toh-pt4/** @angular/fw-docs-intro @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes -/aio/content/examples/toh-pt5/** @angular/fw-docs-intro @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes -/aio/content/examples/toh-pt6/** @angular/fw-docs-intro @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes -/aio/content/examples/getting-started-v0/** @angular/fw-docs-intro @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes -/aio/content/examples/getting-started/** @angular/fw-docs-intro @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes -/aio/content/start/** @angular/fw-docs-intro @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes -/aio/content/images/guide/start/** @angular/fw-docs-intro @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes - - -# ================================================ -# Docs: observables -# ================================================ - -/aio/content/guide/observables.md @angular/fw-docs-observables @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes -/aio/content/examples/observables/** @angular/fw-docs-observables @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes -/aio/content/guide/comparing-observables.md @angular/fw-docs-observables @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes -/aio/content/examples/comparing-observables/** @angular/fw-docs-observables @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes -/aio/content/guide/observables-in-angular.md @angular/fw-docs-observables @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes -/aio/content/examples/observables-in-angular/** @angular/fw-docs-observables @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes -/aio/content/guide/practical-observable-usage.md @angular/fw-docs-observables @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes -/aio/content/examples/practical-observable-usage/** @angular/fw-docs-observables @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes -/aio/content/guide/rx-library.md @angular/fw-docs-observables @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes -/aio/content/examples/rx-library/** @angular/fw-docs-observables @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes - - - -# ================================================ -# Docs: packaging, tooling, releasing -# ================================================ - -/aio/content/guide/npm-packages.md @angular/fw-docs-packaging @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes -/aio/content/guide/browser-support.md @angular/fw-docs-packaging @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes -/aio/content/guide/typescript-configuration.md @angular/fw-docs-packaging @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes -/aio/content/examples/setup/** @angular/fw-docs-packaging @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes -/aio/content/guide/build.md @angular/fw-docs-packaging @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes -/aio/content/images/guide/build/** @angular/fw-docs-packaging @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes -/aio/content/guide/deployment.md @angular/fw-docs-packaging @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes -/aio/content/images/guide/deployment/** @angular/fw-docs-packaging @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes -/aio/content/guide/file-structure.md @angular/fw-docs-packaging @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes -/aio/content/guide/releases.md @angular/fw-docs-packaging @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes -/aio/content/guide/updating.md @angular/fw-docs-packaging @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes -/aio/content/guide/workspace-config.md @angular/fw-docs-packaging @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes -/aio/content/guide/deprecations.md @angular/fw-docs-packaging @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes -/aio/content/guide/migration-renderer.md @angular/fw-docs-packaging @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes -/aio/content/guide/migration-undecorated-classes.md @angular/fw-docs-packaging @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes -/aio/content/guide/migration-dynamic-flag.md @angular/fw-docs-packaging @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes -/aio/content/guide/migration-injectable.md @angular/fw-docs-packaging @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes -/aio/content/guide/migration-localize.md @angular/fw-docs-packaging @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes -/aio/content/guide/migration-module-with-providers.md @angular/fw-docs-packaging @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes -/aio/content/guide/updating-to-version-9.md @angular/fw-docs-packaging @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes -/aio/content/guide/ivy-compatibility.md @angular/fw-docs-packaging @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes -/aio/content/guide/ivy-compatibility-examples.md @angular/fw-docs-packaging @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes - - -# ================================================ -# Docs: libraries -# ================================================ - -/aio/content/guide/creating-libraries.md @angular/tools-docs-libraries @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes -/aio/content/guide/libraries.md @angular/tools-docs-libraries @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes -/aio/content/guide/using-libraries.md @angular/tools-docs-libraries @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes - - -# ================================================ -# Docs: schematics -# ================================================ - -/aio/content/guide/schematics.md @angular/tools-docs-schematics @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes -/aio/content/guide/schematics-authoring.md @angular/tools-docs-schematics @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes -/aio/content/guide/schematics-for-libraries.md @angular/tools-docs-schematics @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes -/aio/content/images/guide/schematics/** @angular/tools-docs-schematics @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes -/aio/content/examples/schematics-for-libraries/** @angular/tools-docs-schematics @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes - - - -# ================================================ -# Docs: marketing -# ================================================ - -/aio/content/marketing/** @angular/fw-docs-marketing @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes -/aio/content/images/bios/** @angular/fw-docs-marketing @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes -/aio/content/images/marketing/** @angular/fw-docs-marketing @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes -/aio/content/navigation.json @angular/fw-docs-marketing @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes -/aio/content/license.md @angular/fw-docs-marketing @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes - - - -# ================================================ -# angular/components CI -# ================================================ - -/tools/components-repo-ci/** @angular/fw-core @angular/framework-global-approvers - - - -# ================================================ -# Public API -# ================================================ - -/tools/public_api_guard/** @angular/fw-public-api -/aio/content/guide/glossary.md @angular/fw-public-api -/aio/content/guide/styleguide.md @angular/fw-public-api -/aio/content/examples/styleguide/** @angular/fw-public-api -/aio/content/images/guide/styleguide/** @angular/fw-public-api - - - -# ================================================ -# Size tracking -# ================================================ - -/aio/scripts/_payload-limits.json @angular/fw-size-tracking -/integration/_payload-limits.json @angular/fw-size-tracking - - -# ================================================ -# Special cases -# ================================================ - -/aio/content/guide/static-query-migration.md @kara @angular/framework-global-approvers @angular/framework-global-approvers-for-docs-only-changes - - - -# ================================================ -# CODEOWNERS Owners owners ... -# ================================================ - -/.github/CODEOWNERS @IgorMinar @angular/framework-global-approvers diff --git a/.github/angular-robot.yml b/.github/angular-robot.yml index 94038c4ddd..171b2336c1 100644 --- a/.github/angular-robot.yml +++ b/.github/angular-robot.yml @@ -115,6 +115,7 @@ merge: - "ci/angular: size" - "cla/google" - "google3" + - "pullapprove" # the comment that will be added when the merge label is added despite failing checks, leave empty or set to false to disable diff --git a/.pullapprove.yml b/.pullapprove.yml new file mode 100644 index 0000000000..101b788f54 --- /dev/null +++ b/.pullapprove.yml @@ -0,0 +1,1017 @@ +#################################################################################### +#################################################################################### +# Angular Code Ownership # +#################################################################################### +#################################################################################### +# +# Configuration of code ownership and review approvals for the angular/angular repo. +# ========================================================= +# General rules / philosophy +# ========================================================= +# +# - We trust that people do the right thing and won't approve changes they don't feel confident reviewing +# - We enforce that only approved PRs are merged ensuring that unreviewed code isn't accidentally merged +# - We distribute approval rights as much as possible to help us scale better +# - Groups have one or two global approvers groups as fallbacks: +# - @angular/fw-global-approvers: for approving minor changes, large-scale refactorings, and emergency situations. +# - @angular/fw-global-approvers-for-docs-only-changes: for approving minor documentation-only changes that don't require engineering review +# - A small number of file groups have very limited number of reviewers because incorrect changes to the files they guard would have serious consequences (e.g. security, public api) +# +# Configuration nuances: +# +# - This configuration works in conjunction with the protected branch settings that require all changes to be made via pull requests with at least one approval. +# - This approval can come from an appropriate codeowner, or any repo collaborator (person with write access) if the PR is authored by a codeowner. +# - All groups whose pullapprove rules are matched will be required for overall approval. +# +# NOTE: +# In the case of emergency, the repo administrators which include the current angular caretaker +# can bypass this reviewer approval requirement, this is expected as a last resort and to be +# done exceedingly sparingly. + +#################################################################################### +# GitHub usernames +#################################################################################### +# aikidave - Dave Shevitz +# alan-agius4 - Alan Agius +# alxhub - Alex Rickabaugh +# AndrewKushnir - Andrew Kushnir +# andrewseguin - Andrew Seguin +# atscott - Andrew Scott +# clydin - Charles Lyding +# crisbeto - Kristiyan Kostadinov +# dennispbrown - Denny Brown +# devversion - Paul Gschwendtner +# dgp1130 - Doug Parker +# filipesilva - Filipe Silva +# gkalpak - Georgios Kalpakas +# gregmagolan - Greg Magolan +# IgorMinar - Igor Minar +# jbogarthyde - Judy Bogart +# jelbourn - Jeremy Elbourn +# JiaLiPassion - Jia Li +# JoostK - Joost Koehoorn +# josephperrott - Joey Perrott +# juleskremer - Jules Kremer +# kapunahelewong - Kapunahele Wong +# kara - Kara Erickson +# kyliau - Keen Yee Liau +# manughub - Manu Murthy +# matsko - Matias Niemela +# mgechev - Minko Gechev +# mhevery - Miško Hevery +# michaelprentice - Michael Prentice +# mmalerba - Miles Malerba +# petebacondarwin - Pete Bacon Darwin +# pkozlowski-opensource - Pawel Kozlowski +# robwormald - Rob Wormald +# stephenfluin - Stephen Fluin + + +#################################################################################### +# Approval Groups +#################################################################################### +# ========================================================= +# @angular/framework-global-approvers +# ========================================================= +# IgorMinar +# josephperrott +# kara +# mhevery +# +# ========================================================= +# @angular/framework-global-approvers-for-docs-only-changes +# ========================================================= +# aikidave +# kapunahelewong +# gkalpak +# petebacondarwin + + +version: 3 + +# turn on 'draft' support +# https://docs.pullapprove.com/config/github-api-version/ +# https://developer.github.com/v3/previews/#draft-pull-requests +github_api_version: "shadow-cat-preview" + +pullapprove_conditions: + - condition: "'WIP' not in title and 'PR state: WIP' not in labels and not draft" + unmet_status: pending + explanation: "Waiting to send reviews as PR is WIP" + +groups: + # ========================================================= + # Framework: Animations + # ========================================================= + fw-animations: + conditions: + - > + contains_any_globs(files, [ + 'packages/animations/**', + 'packages/platform-browser/animations/**', + 'aio/content/guide/animations.md', + 'aio/content/examples/animations/**', + 'aio/content/images/guide/animations/**', + 'aio/content/guide/complex-animation-sequences.md', + 'aio/content/guide/reusable-animations.md', + 'aio/content/guide/route-animations.md', + 'aio/content/guide/transition-and-triggers.md' + ]) + reviewers: + users: + - matsko + teams: + - ~framework-global-approvers + - ~framework-global-approvers-for-docs-only-changes + + + # ========================================================= + # Framework: Compiler + # ========================================================= + fw-compiler: + conditions: + - > + contains_any_globs(files, [ + 'packages/compiler/**', + 'packages/examples/compiler/**', + 'packages/compiler-cli/**', + 'aio/content/guide/angular-compiler-options.md', + 'aio/content/guide/aot-compiler.md', + 'aio/content/guide/aot-metadata-errors.md', + 'aio/content/guide/template-typecheck.md ' + ]) + reviewers: + users: + - alxhub + - AndrewKushnir + - JoostK + - kara + teams: + - ~framework-global-approvers + - ~framework-global-approvers-for-docs-only-changes + + + # ========================================================= + # Framework: Compiler / ngcc + # ========================================================= + fw-ngcc: + conditions: + - > + contains_any_globs(files, [ + 'packages/compiler-cli/ngcc/*' + ]) + reviewers: + users: + - alxhub + - gkalpak + - JoostK + - petebacondarwin + teams: + - ~framework-global-approvers + - ~framework-global-approvers-for-docs-only-changes + + + # ========================================================= + # Framework: Compiler + CLI integration + # ========================================================= + fw-cli-integration: + conditions: + - > + contains_any_globs(files, [ + 'packages/compiler-cli/src/ngtools/**', + ]) + reviewers: + users: + - filipesilva + teams: + - ~framework-global-approvers + - ~framework-global-approvers-for-docs-only-changes + + + # ========================================================= + # Framework: Core + # ========================================================= + fw-core: + conditions: + - > + contains_any_globs(files, [ + 'packages/core/**', + 'packages/examples/core/**', + 'packages/common/**', + 'packages/platform-browser/**', + 'packages/examples/platform-browser/**', + 'packages/platform-browser-dynamic/**', + 'packages/platform-webworker/**', + 'packages/platform-webworker-dynamic/**', + 'packages/examples/common/**', + 'packages/docs/**', + 'aio/content/guide/accessibility.md', + 'aio/content/examples/accessibility/**', + 'aio/content/guide/architecture-components.md', + 'aio/content/guide/architecture-modules.md', + 'aio/content/guide/architecture-next-steps.md', + 'aio/content/guide/architecture-services.md', + 'aio/content/guide/architecture.md', + 'aio/content/examples/architecture/**', + 'aio/content/images/guide/architecture/**', + 'aio/content/guide/attribute-directives.md', + 'aio/content/examples/attribute-directives/**', + 'aio/content/images/guide/attribute-directives/**', + 'aio/content/guide/bootstrapping.md', + 'aio/content/examples/bootstrapping/**', + 'aio/content/guide/cheatsheet.md', + 'aio/content/guide/component-interaction.md', + 'aio/content/examples/component-interaction/**', + 'aio/content/images/guide/component-interaction/**', + 'aio/content/guide/component-styles.md', + 'aio/content/examples/component-styles/**', + 'aio/content/guide/dependency-injection.md', + 'aio/content/examples/dependency-injection/**', + 'aio/content/images/guide/dependency-injection/**', + 'aio/content/guide/dependency-injection-in-action.md', + 'aio/content/examples/dependency-injection-in-action/**', + 'aio/content/images/guide/dependency-injection-in-action/**', + 'aio/content/guide/dependency-injection-navtree.md', + 'aio/content/guide/dependency-injection-providers.md', + 'aio/content/guide/displaying-data.md', + 'aio/content/examples/displaying-data/**', + 'aio/content/images/guide/displaying-data/**', + 'aio/content/guide/dynamic-component-loader.md', + 'aio/content/examples/dynamic-component-loader/**', + 'aio/content/images/guide/dynamic-component-loader/**', + 'aio/content/guide/entry-components.md', + 'aio/content/guide/feature-modules.md', + 'aio/content/examples/feature-modules/**', + 'aio/content/images/guide/feature-modules/**', + 'aio/content/guide/frequent-ngmodules.md', + 'aio/content/images/guide/frequent-ngmodules/**', + 'aio/content/guide/hierarchical-dependency-injection.md', + 'aio/content/examples/hierarchical-dependency-injection/**', + 'aio/content/examples/providers-viewproviders/**', + 'aio/content/examples/resolution-modifiers/**', + 'aio/content/guide/lazy-loading-ngmodules.md', + 'aio/content/examples/lazy-loading-ngmodules/**', + 'aio/content/images/guide/lazy-loading-ngmodules/**', + 'aio/content/guide/lifecycle-hooks.md', + 'aio/content/examples/lifecycle-hooks/**', + 'aio/content/images/guide/lifecycle-hooks/**', + 'aio/content/examples/ngcontainer/**', + 'aio/content/guide/ngmodules.md', + 'aio/content/examples/ngmodules/**', + 'aio/content/guide/ngmodule-api.md', + 'aio/content/guide/ngmodule-faq.md', + 'aio/content/examples/ngmodule-faq/**', + 'aio/content/guide/ngmodule-vs-jsmodule.md', + 'aio/content/guide/module-types.md', + 'aio/content/guide/template-syntax.md', + 'aio/content/examples/built-in-template-functions/**', + 'aio/content/examples/event-binding/**', + 'aio/content/examples/interpolation/**', + 'aio/content/examples/template-syntax/**', + 'aio/content/images/guide/template-syntax/**', + 'aio/content/examples/binding-syntax/**', + 'aio/content/examples/property-binding/**', + 'aio/content/examples/attribute-binding/**', + 'aio/content/examples/two-way-binding/**', + 'aio/content/examples/built-in-directives/**', + 'aio/content/images/guide/built-in-directives/**', + 'aio/content/examples/template-reference-variables/**', + 'aio/content/examples/inputs-outputs/**', + 'aio/content/images/guide/inputs-outputs/**', + 'aio/content/examples/template-expression-operators/**', + 'aio/content/guide/pipes.md', + 'aio/content/examples/pipes/**', + 'aio/content/images/guide/pipes/**', + 'aio/content/guide/providers.md', + 'aio/content/examples/providers/**', + 'aio/content/guide/singleton-services.md', + 'aio/content/guide/set-document-title.md', + 'aio/content/examples/set-document-title/**', + 'aio/content/images/guide/set-document-title/**', + 'aio/content/guide/sharing-ngmodules.md', + 'aio/content/guide/structural-directives.md', + 'aio/content/examples/structural-directives/**', + 'aio/content/images/guide/structural-directives/**', + 'aio/content/guide/user-input.md', + 'aio/content/examples/user-input/**', + 'aio/content/images/guide/user-input/*' + ]) + reviewers: + users: + - alxhub + - AndrewKushnir + - kara + - mhevery + - pkozlowski-opensource + teams: + - ~framework-global-approvers + - ~framework-global-approvers-for-docs-only-changes + + + # ========================================================= + # Framework: Http + # ========================================================= + fw-http: + conditions: + - > + contains_any_globs(files, [ + 'packages/common/http/**', + 'packages/http/**', + 'packages/examples/http/**', + 'aio/content/guide/http.md', + 'aio/content/examples/http/**', + 'aio/content/images/guide/http/*' + ]) + reviewers: + users: + - alxhub + - IgorMinar + teams: + - ~framework-global-approvers + - ~framework-global-approvers-for-docs-only-changes + + + # ========================================================= + # Framework: Elements + # ========================================================= + fw-elements: + conditions: + - > + contains_any_globs(files, [ + 'packages/elements/**', + 'aio/content/examples/elements/**', + 'aio/content/images/guide/elements/**', + 'aio/content/guide/elements.md' + ]) + reviewers: + users: + - andrewseguin + - gkalpak + teams: + - ~framework-global-approvers + - ~framework-global-approvers-for-docs-only-changes + + + # ========================================================= + # Framework: Forms + # ========================================================= + fw-forms: + conditions: + - > + contains_any_globs(files, [ + 'packages/forms/**', + 'packages/examples/forms/**', + 'aio/content/guide/forms.md', + 'aio/content/examples/forms/**', + 'aio/content/images/guide/forms/**', + 'aio/content/guide/forms-overview.md', + 'aio/content/examples/forms-overview/**', + 'aio/content/images/guide/forms-overview/**', + 'aio/content/guide/form-validation.md', + 'aio/content/examples/form-validation/**', + 'aio/content/images/guide/form-validation/**', + 'aio/content/guide/dynamic-form.md', + 'aio/content/examples/dynamic-form/**', + 'aio/content/images/guide/dynamic-form/**', + 'aio/content/guide/reactive-forms.md', + 'aio/content/examples/reactive-forms/**', + 'aio/content/images/guide/reactive-forms/*' + ]) + reviewers: + users: + - AndrewKushnir + teams: + - ~framework-global-approvers + - ~framework-global-approvers-for-docs-only-changes + + + # ========================================================= + # Framework: i18n + # ========================================================= + fw-i18n: + conditions: + - > + contains_any_globs(files, [ + 'packages/core/src/i18n/**', + 'packages/core/src/render3/i18n.ts', + 'packages/core/src/render3/i18n.md', + 'packages/core/src/render3/interfaces/i18n.ts', + 'packages/common/locales/**', + 'packages/common/src/i18n/**', + 'packages/common/src/pipes/date_pipe.ts', + 'packages/common/src/pipes/i18n_plural_pipe.ts', + 'packages/common/src/pipes/i18n_select_pipe.ts', + 'packages/common/src/pipes/number_pipe.ts', + 'packages/compiler/src/i18n/**', + 'packages/compiler/src/render3/view/i18n/**', + 'packages/compiler-cli/src/extract_i18n.ts', + 'packages/localize/**', + 'aio/content/guide/i18n.md', + 'aio/content/examples/i18n/*' + ]) + reviewers: + users: + - AndrewKushnir + - mhevery + - petebacondarwin + teams: + - ~framework-global-approvers + - ~framework-global-approvers-for-docs-only-changes + + + # ========================================================= + # Framework: Platform Server + # ========================================================= + fw-platform-server: + conditions: + - > + contains_any_globs(files, [ + 'packages/platform-server/**', + 'aio/content/guide/universal.md', + 'aio/content/examples/universal/*' + ]) + reviewers: + users: + - alxhub + - kyliau + teams: + - ~framework-global-approvers + - ~framework-global-approvers-for-docs-only-changes + + + # ========================================================= + # Framework: Router + # ========================================================= + fw-router: + conditions: + - > + contains_any_globs(files, [ + 'packages/router/**', + 'packages/examples/router/**', + 'aio/content/guide/router.md', + 'aio/content/examples/router/**', + 'aio/content/images/guide/router/*' + ]) + reviewers: + users: + - atscott + teams: + - ~framework-global-approvers + - ~framework-global-approvers-for-docs-only-changes + + + # ========================================================= + # Framework: Service Worker + # ========================================================= + fw-server-worker: + conditions: + - > + contains_any_globs(files, [ + 'packages/service-worker/**', + 'packages/examples/service-worker/**', + 'aio/content/guide/service-worker-getting-started.md', + 'aio/content/examples/service-worker-getting-started/**', + 'aio/content/guide/app-shell.md', + 'aio/content/guide/service-worker-communications.md', + 'aio/content/guide/service-worker-config.md', + 'aio/content/guide/service-worker-devops.md', + 'aio/content/guide/service-worker-intro.md', + 'aio/content/images/guide/service-worker/*' + ]) + reviewers: + users: + - alxhub + - gkalpak + - IgorMinar + teams: + - ~framework-global-approvers + - ~framework-global-approvers-for-docs-only-changes + + + # ========================================================= + # Framework: Upgrade + # ========================================================= + fw-upgrade: + conditions: + - > + contains_any_globs(files, [ + 'packages/upgrade/**', + 'packages/common/upgrade/**', + 'packages/examples/upgrade/**', + 'aio/content/guide/upgrade.md', + 'aio/content/examples/upgrade-lazy-load-ajs/**', + 'aio/content/examples/upgrade-module/**', + 'aio/content/images/guide/upgrade/**', + 'aio/content/examples/upgrade-phonecat-1-typescript/**', + 'aio/content/examples/upgrade-phonecat-2-hybrid/**', + 'aio/content/examples/upgrade-phonecat-3-final/**', + 'aio/content/guide/upgrade-performance.md', + 'aio/content/guide/upgrade-setup.md', + 'aio/content/guide/ajs-quick-reference.md', + 'aio/content/examples/ajs-quick-reference/*' + ]) + reviewers: + users: + - gkalpak + - petebacondarwin + teams: + - ~framework-global-approvers + - ~framework-global-approvers-for-docs-only-changes + + + # ========================================================= + # Framework: Testing + # ========================================================= + fw-testing: + conditions: + - > + contains_any_globs(files, [ + 'testing/**', + 'aio/content/guide/testing.md', + 'aio/content/examples/testing/**', + 'aio/content/images/guide/testing/*' + ]) + reviewers: + users: + - kara + - IgorMinar + - pkozlowski-opensource + teams: + - ~framework-global-approvers + - ~framework-global-approvers-for-docs-only-changes + + + # ========================================================= + # Framework: Security + # ========================================================= + fw-security: + conditions: + - > + contains_any_globs(files, [ + 'packages/core/src/sanitization/**', + 'packages/core/test/linker/security_integration_spec.ts', + 'packages/compiler/src/schema/**', + 'packages/platform-browser/src/security/**', + 'aio/content/guide/security.md', + 'aio/content/examples/security/**', + 'aio/content/images/guide/security/*' + ]) + reviewers: + users: + - IgorMinar + - mhevery + teams: + - ~framework-global-approvers + - ~framework-global-approvers-for-docs-only-changes + + + # ========================================================= + # Bazel + # ========================================================= + bazel: + conditions: + - > + contains_any_globs(files, [ + 'packages/bazel/**', + 'aio/content/guide/bazel.md' + ]) + reviewers: + users: + - kyliau + - IgorMinar + - josephperrott + teams: + - ~framework-global-approvers + - ~framework-global-approvers-for-docs-only-changes + + + # ========================================================= + # Language Service + # ========================================================= + language-service: + conditions: + - > + contains_any_globs(files, [ + 'packages/language-service/**', + 'aio/content/guide/language-service.md', + 'aio/content/images/guide/language-service/*' + ]) + reviewers: + users: + - kyliau + teams: + - ~framework-global-approvers + - ~framework-global-approvers-for-docs-only-changes + + + # ========================================================= + # zone.js + # ========================================================= + zone-js: + conditions: + - > + contains_any_globs(files, [ + 'packages/zone.js/**' + ]) + reviewers: + users: + - JiaLiPassion + - mhevery + teams: + - ~framework-global-approvers + - ~framework-global-approvers-for-docs-only-changes + + + # ========================================================= + # Benchpress + # ========================================================= + benchpress: + conditions: + - > + contains_any_globs(files, [ + 'packages/benchpress/**' + ]) + reviewers: + users: + - alxhub + teams: + - ~framework-global-approvers + - ~framework-global-approvers-for-docs-only-changes + + + # ========================================================= + # Integration Tests + # ========================================================= + integration-tests: + conditions: + - > + contains_any_globs(files, [ + 'integration/*' + ]) + reviewers: + users: + - IgorMinar + - josephperrott + - kara + - mhevery + teams: + - ~framework-global-approvers + - ~framework-global-approvers-for-docs-only-changes + + + # ========================================================= + # Docs: Gettings Started & Tutorial + # ========================================================= + docs-getting-started-and-tutorial: + conditions: + - > + contains_any_globs(files, [ + 'aio/content/guide/setup-local.md', + 'aio/content/images/guide/setup-local/**', + 'aio/content/tutorial/**', + 'aio/content/images/guide/toh/**', + 'aio/content/examples/toh-pt0/**', + 'aio/content/examples/toh-pt1/**', + 'aio/content/examples/toh-pt2/**', + 'aio/content/examples/toh-pt3/**', + 'aio/content/examples/toh-pt4/**', + 'aio/content/examples/toh-pt5/**', + 'aio/content/examples/toh-pt6/**', + 'aio/content/examples/getting-started-v0/**', + 'aio/content/examples/getting-started/**', + 'aio/content/start/**', + 'aio/content/images/guide/start/*' + ]) + reviewers: + users: + - aikidave + - IgorMinar + - stephenfluin + teams: + - ~framework-global-approvers + - ~framework-global-approvers-for-docs-only-changes + + + # ========================================================= + # Docs: Marketing + # ========================================================= + docs-marketing: + conditions: + - > + contains_any_globs(files, [ + 'aio/content/marketing/**', + 'aio/content/images/bios/**', + 'aio/content/images/marketing/**', + 'aio/content/navigation.json', + 'aio/content/license.md' + ]) + reviewers: + users: + - IgorMinar + - stephenfluin + teams: + - ~framework-global-approvers + - ~framework-global-approvers-for-docs-only-changes + + + # ========================================================= + # Docs: Observables + # ========================================================= + docs-observables: + conditions: + - > + contains_any_globs(files, [ + 'aio/content/guide/observables.md', + 'aio/content/examples/observables/**', + 'aio/content/guide/comparing-observables.md', + 'aio/content/guide/observables-in-angular.md', + 'aio/content/examples/observables-in-angular/**', + 'aio/content/guide/practical-observable-usage.md', + 'aio/content/examples/practical-observable-usage/**', + 'aio/content/guide/rx-library.md', + 'aio/content/examples/rx-library/*' + ]) + reviewers: + users: + - alxhub + teams: + - ~framework-global-approvers + - ~framework-global-approvers-for-docs-only-changes + + + # ========================================================= + # Docs: Packaging, Tooling, Releasing + # ========================================================= + docs-packaging-and-releasing: + conditions: + - > + contains_any_globs(files, [ + 'aio/content/guide/npm-packages.md', + 'aio/content/guide/browser-support.md', + 'aio/content/guide/releases.md', + 'aio/content/guide/updating.md', + 'aio/content/guide/deprecations.md', + 'aio/content/guide/migration-renderer.md', + 'aio/content/guide/migration-undecorated-classes.md', + 'aio/content/guide/migration-dynamic-flag.md', + 'aio/content/guide/migration-injectable.md', + 'aio/content/guide/migration-localize.md', + 'aio/content/guide/migration-module-with-providers.md', + 'aio/content/guide/static-query-migration.md', + 'aio/content/guide/updating-to-version-9.md', + 'aio/content/guide/ivy-compatibility.md', + 'aio/content/guide/ivy-compatibility-examples.md' + ]) + reviewers: + users: + - IgorMinar + - kara + teams: + - ~framework-global-approvers + - ~framework-global-approvers-for-docs-only-changes + + + # ========================================================= + # Docs: CLI + # ========================================================= + docs-cli: + conditions: + - > + contains_any_globs(files, [ + 'aio/content/guide/typescript-configuration.md', + 'aio/content/examples/setup/**', + 'aio/content/guide/build.md', + 'aio/content/images/guide/build/**', + 'aio/content/guide/cli-builder.md', + 'aio/content/guide/deployment.md', + 'aio/content/images/guide/deployment/**', + 'aio/content/guide/file-structure.md', + 'aio/content/guide/ivy.md', + 'aio/content/guide/web-worker.md' + 'aio/content/guide/workspace-config.md', + ]) + reviewers: + users: + - clydin + - IgorMinar + - mgechev + teams: + - ~framework-global-approvers + - ~framework-global-approvers-for-docs-only-changes + + + # ========================================================= + # Docs: CLI Libraries + # ========================================================= + docs-libraries: + conditions: + - > + contains_any_globs(files, [ + 'aio/content/guide/creating-libraries.md', + 'aio/content/guide/libraries.md', + 'aio/content/guide/using-libraries.md' + ]) + reviewers: + users: + - alan-agius4 + - IgorMinar + - mgechev + teams: + - ~framework-global-approvers + - ~framework-global-approvers-for-docs-only-changes + + + # ========================================================= + # Docs: Schematics + # ========================================================= + docs-schematics: + conditions: + - > + contains_any_globs(files, [ + 'aio/content/guide/schematics.md', + 'aio/content/guide/schematics-authoring.md', + 'aio/content/guide/schematics-for-libraries.md', + 'aio/content/images/guide/schematics/**', + 'aio/content/examples/schematics-for-libraries/**' + ]) + reviewers: + users: + - alan-agius4 + - IgorMinar + - mgechev + teams: + - ~framework-global-approvers + - ~framework-global-approvers-for-docs-only-changes + + + # ========================================================= + # Docs-infra + # ========================================================= + docs-infra: + conditions: + - > + contains_any_globs(files, [ + 'aio/*', + 'aio/aio-builds-setup/**', + 'aio/content/examples/*', + 'aio/scripts/**', + 'aio/src/**', + 'aio/tests/**', + 'aio/tools/**', + 'aio/content/guide/docs-style-guide.md', + 'aio/content/examples/docs-style-guide/**', + 'aio/content/images/guide/docs-style-guide/**', + 'aio/content/guide/visual-studio-2015.md', + 'aio/content/examples/visual-studio-2015/*' + ]) + reviewers: + users: + - gkalpak + - IgorMinar + - petebacondarwin + teams: + - ~framework-global-approvers + - ~framework-global-approvers-for-docs-only-changes + + + # ========================================================= + # Dev-infra + # ========================================================= + dev-infra: + conditions: + - > + contains_any_globs(files, [ + '*', + '.buildkite/**', + '.circleci/**', + '.devcontainer/**', + '.github/**', + '.vscode/**', + 'docs/BAZEL.md', + 'packages/*', + 'packages/examples/test-utils/**', + 'packages/private/**', + 'scripts/**', + 'third_party/**', + 'tools/build/**', + 'tools/gulp-tasks/**', + 'tools/ngcontainer/**', + 'tools/npm/**', + 'tools/public_api_guard/BUILD', + 'tools/public_api_guard/public_api_guard.bzl', + 'tools/rxjs/**', + 'tools/size-tracking/**', + 'tools/source-map-test/**', + 'tools/symbol-extractor/**', + 'tools/testing/**', + 'tools/ts-api-guardian/**', + 'tools/tslint/**', + 'tools/validate-commit-message/**', + 'tools/yarn/**', + 'tools/*', + '*.bzl', + '*.BAZEL' + ]) + reviewers: + users: + - devversion + - filipesilva + - gkalpak + - IgorMinar + - josephperrott + teams: + - ~framework-global-approvers + + + # ========================================================= + # Material CI + # ========================================================= + material-ci: + conditions: + - > + contains_any_globs(files, [ + 'tools/material-ci/*' + ]) + reviewers: + users: + - alxhub + - AndrewKushnir + - kara + - mhevery + - pkozlowski-opensource + teams: + - ~framework-global-approvers + + + # ========================================================= + # Public API + # ========================================================= + public-api: + conditions: + - > + contains_any_globs(files, [ + 'tools/public_api_guard/**', + 'aio/content/guide/glossary.md', + 'aio/content/guide/styleguide.md', + 'aio/content/examples/styleguide/**', + 'aio/content/images/guide/styleguide/*' + ]) + reviewers: + users: + - IgorMinar + teams: + - ~framework-global-approvers + + + # ================================================ + # Size tracking + # ================================================ + size-tracking: + conditions: + - > + contains_any_globs(files, [ + 'aio/scripts/_payload-limits.json', + 'integration/_payload-limits.json' + ]) + reviewers: + users: + - IgorMinar + - kara + teams: + - ~framework-global-approvers + + +#################################################################################### +# Special Cases +#################################################################################### + + # ========================================================= + # Code Ownership + # ========================================================= + code-ownership: + conditions: + - > + contains_any_globs(files, [ + '.pullapprove.yml' + ]) + reviewers: + users: + - IgorMinar + teams: + - ~framework-global-approvers + + + # ==================================================== + # Catch all for if no groups match the code change + # ==================================================== + fallback: + conditions: + # Groups which are found to have matching conditions are `active` + # according to PullApprove. If no groups are matched and considered + # active, we still want to have a review occur. + - len(groups.active) == 0 + reviewers: + users: + - IgorMinar + teams: + - ~framework-global-approvers diff --git a/docs/COMMITTER.md b/docs/COMMITTER.md index 1ac3a5c8d6..a66ed3faa7 100644 --- a/docs/COMMITTER.md +++ b/docs/COMMITTER.md @@ -7,7 +7,7 @@ As a contributor, see the instructions in [CONTRIBUTING.md](../CONTRIBUTING.md). # Change approvals -Change approvals in our monorepo are managed via [GitHub CODEOWNERS](https://help.github.com/articles/about-codeowners/) and are configured via the [`.github/CODEOWNERS`](../.github/CODEOWNERS) file. +Change approvals in our monorepo are managed via [PullApprove](https://https://docs.pullapprove.com/) and are configured via the [`.pullapprove`](../.pullapprove) file. # Merging diff --git a/docs/TRIAGE_AND_LABELS.md b/docs/TRIAGE_AND_LABELS.md index 317732ca60..d04fe546c9 100644 --- a/docs/TRIAGE_AND_LABELS.md +++ b/docs/TRIAGE_AND_LABELS.md @@ -171,9 +171,7 @@ If a PR is missing the `PR target: *` label, or if the label is set to "TBD" whe Before a PR can be merged it must be approved by the appropriate reviewer(s). -To ensure that the right people review each change, we configured [GitHub CODEOWNERS](https://help.github.com/articles/about-codeowners/) (via `.github/CODEOWNERS`) and require that each PR has at least one approval from an appropriate code owner. - -If the PR author is a code owner themselves, the approval can come from _any_ repo collaborator (person with write access). GitHub CODEOWNERs does not support this scenario, so the `merge-assistance` label must be added, mentioning that the PR author is a code owner. In any case, the reviewer should actually look through the code and provide feedback if necessary. +To ensure that the right people review each change, we set review requests using [PullApprove](https://https://docs.pullapprove.com/) (via `.pullapprove`) and require that each PR has at least one approval from an appropriate code owner. Note that approved state does not mean a PR is ready to be merged. For example, a reviewer might approve the PR but request a minor tweak that doesn't need further review, e.g., a rebase or small uncontroversial change. diff --git a/tools/verify-codeownership.js b/tools/verify-codeownership.js deleted file mode 100644 index 00d5b46142..0000000000 --- a/tools/verify-codeownership.js +++ /dev/null @@ -1,199 +0,0 @@ -/** - * @license - * Copyright Google Inc. All Rights Reserved. - * - * Use of this source code is governed by an MIT-style license that can be - * found in the LICENSE file at https://angular.io/license - */ - -/** - * **Usage:** - * ``` - * node tools/verify-codeownership - * ``` - * - * Verify whether there are directories in the codebase that don't have a codeowner (in - * `.github/CODEOWNERS`) and vice versa (that there are no patterns in `CODEOWNERS` that do not - * correspond to actual directories). - * - * The script does not aim to be exhaustive and highly accurate, checking all files and directories - * (since that would be too complicated). Instead, it does a coarse check on some important (or - * frequently changing) directories. - * - * Currently, it checks the following: - * - **Packages**: Top-level directories in `packages/`. - * - **API docs examples**: Top-level directories in `packages/examples/`. - * - **Guides**: Top-level files in `aio/content/guide/`. - * - **Guide images**: Top-level directories in `aio/content/images/guide/`. - * - **Guide examples**: Top-level directories in `aio/content/examples/`. - */ -'use strict'; - -// Imports -const chalk = require('chalk'); -const fs = require('fs'); -const path = require('path'); - -// Constants -const PROJECT_ROOT_DIR = path.resolve(__dirname, '..'); -const CODEOWNERS_PATH = path.resolve(PROJECT_ROOT_DIR, '.github/CODEOWNERS'); -const PKG_DIR = path.resolve(PROJECT_ROOT_DIR, 'packages'); -const PKG_EXAMPLES_DIR = path.resolve(PKG_DIR, 'examples'); -const AIO_CONTENT_DIR = path.resolve(PROJECT_ROOT_DIR, 'aio/content'); -const AIO_GUIDES_DIR = path.resolve(AIO_CONTENT_DIR, 'guide'); -const AIO_GUIDE_IMAGES_DIR = path.resolve(AIO_CONTENT_DIR, 'images/guide'); -const AIO_GUIDE_EXAMPLES_DIR = path.resolve(AIO_CONTENT_DIR, 'examples'); -const IGNORED_PKG_DIRS = new Set([ - // Examples are checked separately. - 'examples', -]); - -// Run -_main(); - -// Functions - Definitions -function _main() { - const {packages: pkgPackagePaths, examples: pkgExamplePaths} = getPathsFromPkg(); - const { - guides: aioGuidePaths, - images: aioGuideImagesPaths, - examples: aioExamplePaths, - } = getPathsFromAioContent(); - const { - pkgPackages: coPkgPackagePaths, - pkgExamples: coPkgExamplePaths, - aioGuides: coAioGuidePaths, - aioImages: coAioGuideImagesPaths, - aioExamples: coAioExamplePaths, - } = getPathsFromCodeowners(); - - const pkgPackagesDiff = arrayDiff(pkgPackagePaths, coPkgPackagePaths); - const pkgExamplesDiff = arrayDiff(pkgExamplePaths, coPkgExamplePaths); - const aioGuidesDiff = arrayDiff(aioGuidePaths, coAioGuidePaths); - const aioImagesDiff = arrayDiff(aioGuideImagesPaths, coAioGuideImagesPaths); - const aioExamplesDiff = arrayDiff(aioExamplePaths, coAioExamplePaths); - const hasDiff = (pkgPackagesDiff.diffCount > 0) || (pkgExamplesDiff.diffCount > 0) || - (aioGuidesDiff.diffCount > 0) || (aioImagesDiff.diffCount > 0) || - (aioExamplesDiff.diffCount > 0); - - if (hasDiff) { - const expectedPkgPackagesSrc = path.relative(PROJECT_ROOT_DIR, PKG_DIR); - const expectedPkgExamplesSrc = path.relative(PROJECT_ROOT_DIR, PKG_EXAMPLES_DIR); - const expectedAioGuidesSrc = path.relative(PROJECT_ROOT_DIR, AIO_GUIDES_DIR); - const expectedAioImagesSrc = path.relative(PROJECT_ROOT_DIR, AIO_GUIDE_IMAGES_DIR); - const expectedAioExamplesSrc = path.relative(PROJECT_ROOT_DIR, AIO_GUIDE_EXAMPLES_DIR); - const actualSrc = path.relative(PROJECT_ROOT_DIR, CODEOWNERS_PATH); - - reportDiff(pkgPackagesDiff, expectedPkgPackagesSrc, actualSrc); - reportDiff(pkgExamplesDiff, expectedPkgExamplesSrc, actualSrc); - reportDiff(aioGuidesDiff, expectedAioGuidesSrc, actualSrc); - reportDiff(aioImagesDiff, expectedAioImagesSrc, actualSrc); - reportDiff(aioExamplesDiff, expectedAioExamplesSrc, actualSrc); - - // tslint:disable-next-line: no-console - console.log(chalk.red( - '\nCode-ownership verification failed.\n' + - 'Please update \'.github/CODEOWNERS\' to ensure that all necessary files/directories ' + - 'have code-owners and all patterns that appear in the file correspond to actual ' + - 'files/directories in the repo.')); - } else { - // tslint:disable-next-line: no-console - console.log(chalk.green('\nCode-ownership verification succeeded!')); - } - - process.exit(hasDiff ? 1 : 0); -} - -function arrayDiff(expected, actual) { - const missing = expected.filter(x => !actual.includes(x)).sort(); - const extra = actual.filter(x => !expected.includes(x)).sort(); - - return {missing, extra, diffCount: missing.length + extra.length}; -} - -function findDirectories(parentDir) { - return fs.readdirSync(parentDir).filter( - name => fs.statSync(`${parentDir}/${name}`).isDirectory()); -} - -function getPathsFromAioContent() { - return { - guides: fs.readdirSync(AIO_GUIDES_DIR), - images: fs.readdirSync(AIO_GUIDE_IMAGES_DIR), - examples: fs.readdirSync(AIO_GUIDE_EXAMPLES_DIR) - .filter(name => fs.statSync(`${AIO_GUIDE_EXAMPLES_DIR}/${name}`).isDirectory()), - }; -} - -function getPathsFromCodeowners() { - const pkgPackagesPathRe = /^\/packages\/([^\s\*/]+)\/\*?\*\s/; - const pkgExamplesPathRe = /^\/packages\/examples\/([^\s\*/]+)/; - // Use capturing groups for `images/` and `examples` to be able to differentiate between the - // different kinds of matches (guide, image, example) later (see `isImage`/`isExample` below). - const aioGuidesImagesExamplesPathRe = - /^\/aio\/content\/(?:(images\/)?guide|(examples))\/([^\s\*/]+)/; - const manualGlobExpansions = { - // `CODEOWNERS` has a glob to match all `testing/` directories, so no specific glob for - // `packages/examples/testing/` is necessary. - 'testing/**': ['/packages/examples/testing/**'], - }; - - const pkgPackages = []; - const pkgExamples = []; - const aioGuides = []; - const aioImages = []; - const aioExamples = []; - - // Read `CODEOWNERS` and split into lines. - const lines = fs.readFileSync(CODEOWNERS_PATH, 'utf8').split('\n').map(l => l.trim()); - - // Manually expand globs to known matching patterns. - for (const [glob, expansions] of Object.entries(manualGlobExpansions)) { - const matchingLine = lines.find(l => l.startsWith(`${glob} `)); - if (matchingLine !== undefined) { - lines.push(...expansions); - } - } - - // Collect packages (`packages/`). - lines.map(l => l.match(pkgPackagesPathRe)).filter(m => m).forEach(([ - , path - ]) => pkgPackages.push(path)); - - // Collect API docs examples (`packages/examples/`). - lines.map(l => l.match(pkgExamplesPathRe)).filter(m => m).forEach(([ - , path - ]) => pkgExamples.push(path)); - - // Collect `aio/` guides/images/examples. - lines.map(l => l.match(aioGuidesImagesExamplesPathRe)) - .filter(m => m) - .forEach(([, isImage, isExample, path]) => { - const list = isExample ? aioExamples : isImage ? aioImages : aioGuides; - list.push(path); - }); - - return {pkgPackages, pkgExamples, aioGuides, aioImages, aioExamples}; -} - -function getPathsFromPkg() { - return { - packages: findDirectories(PKG_DIR).filter(name => !IGNORED_PKG_DIRS.has(name)), - examples: findDirectories(PKG_EXAMPLES_DIR), - }; -} - - -function reportDiff(diff, expectedSrc, actualSrc) { - if (diff.missing.length) { - console.error( - `\nEntries in '${expectedSrc}' but not in '${actualSrc}':\n` + - diff.missing.map(x => ` - ${x}`).join('\n')); - } - - if (diff.extra.length) { - console.error( - `\nEntries in '${actualSrc}' but not in '${expectedSrc}':\n` + - diff.extra.map(x => ` - ${x}`).join('\n')); - } -}