user:USERNAME | [**user:defunkt ubuntu**](https://github.com/search?q=user%3Adefunkt+ubuntu&type=Issues) matches issues with the word "ubuntu" from repositories owned by @defunkt.
-| org:ORGNAME | [**org:github**](https://github.com/search?q=org%3Agithub&type=Issues&utf8=%E2%9C%93) matches issues in repositories owned by the GitHub organization.
-| repo:USERNAME/REPOSITORY | [**repo:mozilla/shumway created:<2012-03-01**](https://github.com/search?q=repo%3Amozilla%2Fshumway+created%3A%3C2012-03-01&type=Issues) matches issues from @mozilla's shumway project that were created before March 2012.
+| user:USERNAME | [**user:defunkt ubuntu**](https://github.com/search?q=user%3Adefunkt+ubuntu&type=Issues&ref_product=github&ref_type=engagement&ref_style=text) matches issues with the word "ubuntu" from repositories owned by @defunkt.
+| org:ORGNAME | [**org:github**](https://github.com/search?q=org%3Agithub&type=Issues&utf8=%E2%9C%93&ref_product=github&ref_type=engagement&ref_style=text) matches issues in repositories owned by the GitHub organization.
+| repo:USERNAME/REPOSITORY | [**repo:mozilla/shumway created:<2012-03-01**](https://github.com/search?q=repo%3Amozilla%2Fshumway+created%3A%3C2012-03-01&type=Issues&ref_product=github&ref_type=engagement&ref_style=text) matches issues from @mozilla's shumway project that were created before March 2012.
## Search by open or closed state
@@ -63,10 +63,10 @@ You can filter issues and pull requests based on whether they're open or closed
| Qualifier | Example
| ------------- | -------------
-| `state:open` | [**libraries state:open mentions:vmg**](https://github.com/search?utf8=%E2%9C%93&q=libraries+state%3Aopen+mentions%3Avmg&type=Issues) matches open issues that mention @vmg with the word "libraries."
-| `state:closed` | [**design state:closed in:body**](https://github.com/search?utf8=%E2%9C%93&q=design+state%3Aclosed+in%3Abody&type=Issues) matches closed issues with the word "design" in the body.
-| `is:open` | [**performance is:open is:issue**](https://github.com/search?q=performance+is%3Aopen+is%3Aissue&type=Issues) matches open issues with the word "performance."
-| `is:closed` | [**android is:closed**](https://github.com/search?utf8=%E2%9C%93&q=android+is%3Aclosed&type=) matches closed issues and pull requests with the word "android."
+| `state:open` | [**libraries state:open mentions:vmg**](https://github.com/search?utf8=%E2%9C%93&q=libraries+state%3Aopen+mentions%3Avmg&type=Issues&ref_product=github&ref_type=engagement&ref_style=text) matches open issues that mention @vmg with the word "libraries."
+| `state:closed` | [**design state:closed in:body**](https://github.com/search?utf8=%E2%9C%93&q=design+state%3Aclosed+in%3Abody&type=Issues&ref_product=github&ref_type=engagement&ref_style=text) matches closed issues with the word "design" in the body.
+| `is:open` | [**performance is:open is:issue**](https://github.com/search?q=performance+is%3Aopen+is%3Aissue&type=Issues&ref_product=github&ref_type=engagement&ref_style=text) matches open issues with the word "performance."
+| `is:closed` | [**android is:closed**](https://github.com/search?utf8=%E2%9C%93&q=android+is%3Aclosed&type=&ref_product=github&ref_type=engagement&ref_style=text) matches closed issues and pull requests with the word "android."
{% ifversion archive-pull-requests %}
@@ -76,7 +76,7 @@ Repository administrators can archive a pull request to remove it from public vi
| Qualifier | Example
| ------------- | -------------
-| `is:archived` | [**is:archived is:pr spam**](https://github.com/search?q=is%3Aarchived+is%3Apr+spam) matches archived pull requests that contain the word "spam" in repositories where you are a repository administrator.
+| `is:archived` | [**is:archived is:pr spam**](https://github.com/search?q=is%3Aarchived+is%3Apr+spam&ref_product=github&ref_type=engagement&ref_style=text) matches archived pull requests that contain the word "spam" in repositories where you are a repository administrator.
{% endif %}
@@ -86,7 +86,7 @@ You can also use the `is` qualifier to find pull requests that are queued to mer
| Qualifier | Example |
| --- | --- |
-| `is:queued` | [**is:queued**](https://github.com/search?q=is%3Aqueued&type=pullrequests) matches pull requests that are currently queued to merge.
+| `is:queued` | [**is:queued**](https://github.com/search?q=is%3Aqueued&type=pullrequests&ref_product=github&ref_type=engagement&ref_style=text) matches pull requests that are currently queued to merge.
## Search by the reason an issue was closed
@@ -94,8 +94,8 @@ You can filter issues based on the reason given when the issue was closed, using
| Qualifier | Example
| ------------- | -------------
-| `reason:completed` | [**libraries is:closed reason:completed**](https://github.com/search?q=libraries+is%3Aclosed+reason%3Acompleted&type=Issues) matches issues with the word "libraries" that were closed as "completed."
-| `reason:"not planned"` | [**libraries is:closed reason:"not planned"**](https://github.com/search?q=libraries+is%3Aclosed+reason%3A%22not+planned%22&type=Issues) matches issues with the word "libraries" that were closed as "not planned."
+| `reason:completed` | [**libraries is:closed reason:completed**](https://github.com/search?q=libraries+is%3Aclosed+reason%3Acompleted&type=Issues&ref_product=github&ref_type=engagement&ref_style=text) matches issues with the word "libraries" that were closed as "completed."
+| `reason:"not planned"` | [**libraries is:closed reason:"not planned"**](https://github.com/search?q=libraries+is%3Aclosed+reason%3A%22not+planned%22&type=Issues&ref_product=github&ref_type=engagement&ref_style=text) matches issues with the word "libraries" that were closed as "not planned."
## Filter by repository visibility
@@ -103,11 +103,11 @@ You can filter by the visibility of the repository containing the issues and pul
| Qualifier | Example |
| ------------- | ------------- |
-| `is:public` | [**is:public**](https://github.com/search?q=is%3Apublic&type=Issues) matches issues and pull requests in public repositories. |
+| `is:public` | [**is:public**](https://github.com/search?q=is%3Apublic&type=Issues&ref_product=github&ref_type=engagement&ref_style=text) matches issues and pull requests in public repositories. |
| {% ifversion ghes or ghec %} |
-| `is:internal` | [**is:internal**](https://github.com/search?q=is%3Ainternal&type=Issues) matches issues and pull requests in internal repositories. |
+| `is:internal` | [**is:internal**](https://github.com/search?q=is%3Ainternal&type=Issues&ref_product=github&ref_type=engagement&ref_style=text) matches issues and pull requests in internal repositories. |
| {% endif %} |
-| `is:private` | [**is:private cupcake**](https://github.com/search?q=is%3Aprivate+cupcake&type=Issues) matches issues and pull requests that contain the word "cupcake" in private repositories you can access.
+| `is:private` | [**is:private cupcake**](https://github.com/search?q=is%3Aprivate+cupcake&type=Issues&ref_product=github&ref_type=engagement&ref_style=text) matches issues and pull requests that contain the word "cupcake" in private repositories you can access.
## Search by author
@@ -115,10 +115,10 @@ The `author` qualifier finds issues and pull requests created by a certain user
| Qualifier | Example
| ------------- | -------------
-| author:USERNAME | [**cool author:gjtorikian**](https://github.com/search?q=cool+author%3Agjtorikian&type=Issues) matches issues and pull requests with the word "cool" that were created by @gjtorikian.
-| `in:body` author:USERNAME | [**bootstrap in:body author:mdo**](https://github.com/search?q=bootstrap+in%3Abody+author%3Amdo&type=Issues) matches issues written by @mdo that contain the word "bootstrap" in the body.
-| author:app/USERNAME | [**author:app/robot**](https://github.com/search?q=author%3Aapp%2Frobot&type=Issues) matches issues created by the integration account named "robot."
-| -author:app/USERNAME | [**-author:app/robot**](https://github.com/search?q=-author%3Aapp%2Frobot&type=Issues) matches issues created by any user other than the integration account named "robot." The minus sign, or dash character (-) before the qualifier signifies a logical NOT for the qualifier in the search query.
+| author:USERNAME | [**cool author:gjtorikian**](https://github.com/search?q=cool+author%3Agjtorikian&type=Issues&ref_product=github&ref_type=engagement&ref_style=text) matches issues and pull requests with the word "cool" that were created by @gjtorikian.
+| `in:body` author:USERNAME | [**bootstrap in:body author:mdo**](https://github.com/search?q=bootstrap+in%3Abody+author%3Amdo&type=Issues&ref_product=github&ref_type=engagement&ref_style=text) matches issues written by @mdo that contain the word "bootstrap" in the body.
+| author:app/USERNAME | [**author:app/robot**](https://github.com/search?q=author%3Aapp%2Frobot&type=Issues&ref_product=github&ref_type=engagement&ref_style=text) matches issues created by the integration account named "robot."
+| -author:app/USERNAME | [**-author:app/robot**](https://github.com/search?q=-author%3Aapp%2Frobot&type=Issues&ref_product=github&ref_type=engagement&ref_style=text) matches issues created by any user other than the integration account named "robot." The minus sign, or dash character (-) before the qualifier signifies a logical NOT for the qualifier in the search query.
## Search by assignee
@@ -126,7 +126,7 @@ The `assignee` qualifier finds issues and pull requests that are assigned to a c
| Qualifier | Example
| ------------- | -------------
-| assignee:USERNAME | [**assignee:vmg repo:libgit2/libgit2**](https://github.com/search?utf8=%E2%9C%93&q=assignee%3Avmg+repo%3Alibgit2%2Flibgit2&type=Issues) matches issues and pull requests in libgit2's project libgit2 that are assigned to @vmg.
+| assignee:USERNAME | [**assignee:vmg repo:libgit2/libgit2**](https://github.com/search?utf8=%E2%9C%93&q=assignee%3Avmg+repo%3Alibgit2%2Flibgit2&type=Issues&ref_product=github&ref_type=engagement&ref_style=text) matches issues and pull requests in libgit2's project libgit2 that are assigned to @vmg.
| assignee:* | [**is:open is:issue assignee:\***](https://github.com/openssl/openssl/issues/assigned/*) matches open issues within a single repository that are assigned to any user.
## Search by mention
@@ -135,7 +135,7 @@ The `mentions` qualifier finds issues that mention a certain user. For more info
| Qualifier | Example
| ------------- | -------------
-| mentions:USERNAME | [**`resque mentions:defunkt`**](https://github.com/search?q=resque+mentions%3Adefunkt&type=Issues) matches issues with the word "resque" that mention @defunkt.
+| mentions:USERNAME | [**`resque mentions:defunkt`**](https://github.com/search?q=resque+mentions%3Adefunkt&type=Issues&ref_product=github&ref_type=engagement&ref_style=text) matches issues with the word "resque" that mention @defunkt.
## Search by team mention
@@ -152,7 +152,7 @@ The `commenter` qualifier finds issues that contain a comment from a certain use
| Qualifier | Example
| ------------- | -------------
-| commenter:USERNAME | [**github commenter:defunkt org:github**](https://github.com/search?utf8=%E2%9C%93&q=github+commenter%3Adefunkt+org%3Agithub&type=Issues) matches issues in repositories owned by GitHub, that contain the word "github," and have a comment by @defunkt.
+| commenter:USERNAME | [**github commenter:defunkt org:github**](https://github.com/search?utf8=%E2%9C%93&q=github+commenter%3Adefunkt+org%3Agithub&type=Issues&ref_product=github&ref_type=engagement&ref_style=text) matches issues in repositories owned by GitHub, that contain the word "github," and have a comment by @defunkt.
## Search by a user that's involved in an issue or pull request
@@ -160,8 +160,8 @@ You can use the `involves` qualifier to find issues that in some way involve a c
| Qualifier | Example
| ------------- | -------------
-| involves:USERNAME | **[involves:defunkt involves:jlord](https://github.com/search?q=involves%3Adefunkt+involves%3Ajlord&type=Issues)** matches issues either @defunkt or @jlord are involved in.
-| `in:body` involves:USERNAME | [**NOT bootstrap in:body involves:mdo**](https://github.com/search?q=NOT+bootstrap+in%3Abody+involves%3Amdo&type=Issues) matches issues @mdo is involved in that do not contain the word "bootstrap" in the body.
+| involves:USERNAME | **[involves:defunkt involves:jlord](https://github.com/search?q=involves%3Adefunkt+involves%3Ajlord&type=Issues&ref_product=github&ref_type=engagement&ref_style=text)** matches issues either @defunkt or @jlord are involved in.
+| `in:body` involves:USERNAME | [**NOT bootstrap in:body involves:mdo**](https://github.com/search?q=NOT+bootstrap+in%3Abody+involves%3Amdo&type=Issues&ref_product=github&ref_type=engagement&ref_style=text) matches issues @mdo is involved in that do not contain the word "bootstrap" in the body.
## Search for my issues and pull requests
@@ -169,8 +169,8 @@ You can search for issues and pull requests you have created or have interacted
| Qualifier | Example
| ------------- | -------------
-| author:@me | **[author:@me](https://github.com/search?q=author%3A%40me)** matches issues and pull requests you have authored.
-| is:pr commenter:@me | **[is:pr commenter:@me](https://github.com/search?q=is%3Apr+commenter%3A%40me&type=pullrequests)** matches pull requests you have commented on.
+| author:@me | **[author:@me](https://github.com/search?q=author%3A%40me&ref_product=github&ref_type=engagement&ref_style=text)** matches issues and pull requests you have authored.
+| is:pr commenter:@me | **[is:pr commenter:@me](https://github.com/search?q=is%3Apr+commenter%3A%40me&type=pullrequests&ref_product=github&ref_type=engagement&ref_style=text)** matches pull requests you have commented on.
## Search for linked issues and pull requests
@@ -178,10 +178,10 @@ You can narrow your results to only include issues that are linked to a pull req
| Qualifier | Example |
| ------------- | ------------- |
-| `linked:pr` | [**repo:desktop/desktop is:open linked:pr**](https://github.com/search?q=repo%3Adesktop%2Fdesktop+is%3Aopen+linked%3Apr) matches open issues in the `desktop/desktop` repository that are linked to a pull request by a closing reference. |
-| `linked:issue` | [**repo:desktop/desktop is:closed linked:issue**](https://github.com/search?q=repo%3Adesktop%2Fdesktop+is%3Aclosed+linked%3Aissue) matches closed pull requests in the `desktop/desktop` repository that were linked to an issue that the pull request may have closed. |
-| `-linked:pr` | [**repo:desktop/desktop is:open -linked:pr**](https://github.com/search?q=repo%3Adesktop%2Fdesktop+is%3Aopen+-linked%3Apr) matches open issues in the `desktop/desktop` repository that are not linked to a pull request by a closing reference. |
-| `-linked:issue` | [**repo:desktop/desktop is:open -linked:issue**](https://github.com/search?q=repo%3Adesktop%2Fdesktop+is%3Aopen+-linked%3Aissue) matches open pull requests in the `desktop/desktop` repository that are not linked to an issue that the pull request may close. |
+| `linked:pr` | [**repo:desktop/desktop is:open linked:pr**](https://github.com/search?q=repo%3Adesktop%2Fdesktop+is%3Aopen+linked%3Apr&ref_product=github&ref_type=engagement&ref_style=text) matches open issues in the `desktop/desktop` repository that are linked to a pull request by a closing reference. |
+| `linked:issue` | [**repo:desktop/desktop is:closed linked:issue**](https://github.com/search?q=repo%3Adesktop%2Fdesktop+is%3Aclosed+linked%3Aissue&ref_product=github&ref_type=engagement&ref_style=text) matches closed pull requests in the `desktop/desktop` repository that were linked to an issue that the pull request may have closed. |
+| `-linked:pr` | [**repo:desktop/desktop is:open -linked:pr**](https://github.com/search?q=repo%3Adesktop%2Fdesktop+is%3Aopen+-linked%3Apr&ref_product=github&ref_type=engagement&ref_style=text) matches open issues in the `desktop/desktop` repository that are not linked to a pull request by a closing reference. |
+| `-linked:issue` | [**repo:desktop/desktop is:open -linked:issue**](https://github.com/search?q=repo%3Adesktop%2Fdesktop+is%3Aopen+-linked%3Aissue&ref_product=github&ref_type=engagement&ref_style=text) matches open pull requests in the `desktop/desktop` repository that are not linked to an issue that the pull request may close. |
## Search by label
@@ -189,10 +189,10 @@ You can narrow your results by labels, using the `label` qualifier. Since issues
| Qualifier | Example
| ------------- | -------------
-| label:LABEL | [**label:"help wanted" language:ruby**](https://github.com/search?utf8=%E2%9C%93&q=label%3A%22help+wanted%22+language%3Aruby&type=Issues) matches issues with the label "help wanted" that are in Ruby repositories.
-| `in:body` -label:LABEL label:LABEL | [**broken in:body -label:bug label:priority**](https://github.com/search?q=broken+in%3Abody+-label%3Abug+label%3Apriority&type=Issues) matches issues with the word "broken" in the body, that lack the label "bug", but _do_ have the label "priority."
-| label:LABEL label:LABEL | [**label:bug label:resolved**](https://github.com/search?l=&q=label%3Abug+label%3Aresolved&type=Issues) matches issues with the labels "bug" and "resolved."
-| label:LABEL,LABEL | [**label:bug,resolved**](https://github.com/search?q=label%3Abug%2Cresolved&type=Issues) matches issues with the label "bug" or the label "resolved."
+| label:LABEL | [**label:"help wanted" language:ruby**](https://github.com/search?utf8=%E2%9C%93&q=label%3A%22help+wanted%22+language%3Aruby&type=Issues&ref_product=github&ref_type=engagement&ref_style=text) matches issues with the label "help wanted" that are in Ruby repositories.
+| `in:body` -label:LABEL label:LABEL | [**broken in:body -label:bug label:priority**](https://github.com/search?q=broken+in%3Abody+-label%3Abug+label%3Apriority&type=Issues&ref_product=github&ref_type=engagement&ref_style=text) matches issues with the word "broken" in the body, that lack the label "bug", but _do_ have the label "priority."
+| label:LABEL label:LABEL | [**label:bug label:resolved**](https://github.com/search?l=&q=label%3Abug+label%3Aresolved&type=Issues&ref_product=github&ref_type=engagement&ref_style=text) matches issues with the labels "bug" and "resolved."
+| label:LABEL,LABEL | [**label:bug,resolved**](https://github.com/search?q=label%3Abug%2Cresolved&type=Issues&ref_product=github&ref_type=engagement&ref_style=text) matches issues with the label "bug" or the label "resolved."
## Search by milestone
@@ -200,8 +200,8 @@ The `milestone` qualifier finds issues or pull requests that are a part of a [mi
| Qualifier | Example
| ------------- | -------------
-| milestone:MILESTONE | [**milestone:"overhaul"**](https://github.com/search?utf8=%E2%9C%93&q=milestone%3A%22overhaul%22&type=Issues) matches issues that are in a milestone named "overhaul."
-| milestone:MILESTONE | [**milestone:"bug fix"**](https://github.com/search?utf8=%E2%9C%93&q=milestone%3A%22bug+fix%22&type=Issues) matches issues that are in a milestone named "bug fix."
+| milestone:MILESTONE | [**milestone:"overhaul"**](https://github.com/search?utf8=%E2%9C%93&q=milestone%3A%22overhaul%22&type=Issues&ref_product=github&ref_type=engagement&ref_style=text) matches issues that are in a milestone named "overhaul."
+| milestone:MILESTONE | [**milestone:"bug fix"**](https://github.com/search?utf8=%E2%9C%93&q=milestone%3A%22bug+fix%22&type=Issues&ref_product=github&ref_type=engagement&ref_style=text) matches issues that are in a milestone named "bug fix."
## Search by project
@@ -217,9 +217,9 @@ You can filter pull requests based on the status of the commits. This is especia
| Qualifier | Example
| ------------- | -------------
-| `status:pending` | [**language:go status:pending**](https://github.com/search?utf8=%E2%9C%93&q=language%3Ago+status%3Apending) matches pull requests opened into Go repositories where the status is pending.
-| `status:success` | [**is:open status:success finally in:body**](https://github.com/search?utf8=%E2%9C%93&q=is%3Aopen+status%3Asuccess+finally+in%3Abody&type=Issues) matches open pull requests with the word "finally" in the body with a successful status.
-| `status:failure` | [**created:2015-05-01..2015-05-30 status:failure**](https://github.com/search?utf8=%E2%9C%93&q=created%3A2015-05-01..2015-05-30+status%3Afailure&type=Issues) matches pull requests opened on May 2015 with a failed status.
+| `status:pending` | [**language:go status:pending**](https://github.com/search?utf8=%E2%9C%93&q=language%3Ago+status%3Apending&ref_product=github&ref_type=engagement&ref_style=text) matches pull requests opened into Go repositories where the status is pending.
+| `status:success` | [**is:open status:success finally in:body**](https://github.com/search?utf8=%E2%9C%93&q=is%3Aopen+status%3Asuccess+finally+in%3Abody&type=Issues&ref_product=github&ref_type=engagement&ref_style=text) matches open pull requests with the word "finally" in the body with a successful status.
+| `status:failure` | [**created:2015-05-01..2015-05-30 status:failure**](https://github.com/search?utf8=%E2%9C%93&q=created%3A2015-05-01..2015-05-30+status%3Afailure&type=Issues&ref_product=github&ref_type=engagement&ref_style=text) matches pull requests opened on May 2015 with a failed status.
## Search by commit SHA
@@ -227,8 +227,8 @@ If you know the specific SHA hash of a commit, you can use it to search for pull
| Qualifier | Example
| ------------- | -------------
-| SHA | [**e1109ab**](https://github.com/search?q=e1109ab&type=Issues) matches pull requests with a commit SHA that starts with `e1109ab`.
-| SHA `is:merged` | [**0eff326d6213c is:merged**](https://github.com/search?q=0eff326d+is%3Amerged&type=Issues) matches merged pull requests with a commit SHA that starts with `0eff326d6213c`.
+| SHA | [**e1109ab**](https://github.com/search?q=e1109ab&type=Issues&ref_product=github&ref_type=engagement&ref_style=text) matches pull requests with a commit SHA that starts with `e1109ab`.
+| SHA `is:merged` | [**0eff326d6213c is:merged**](https://github.com/search?q=0eff326d+is%3Amerged&type=Issues&ref_product=github&ref_type=engagement&ref_style=text) matches merged pull requests with a commit SHA that starts with `0eff326d6213c`.
## Search by branch name
@@ -236,8 +236,8 @@ You can filter pull requests based on the branch they came from (the "head" bran
| Qualifier | Example
| ------------- | -------------
-| head:HEAD_BRANCH | [**head:change is:closed is:unmerged**](https://github.com/search?utf8=%E2%9C%93&q=head%3Achange+is%3Aclosed+is%3Aunmerged) matches pull requests opened from branch names beginning with the word "change" that are closed.
-| base:BASE_BRANCH | [**base:gh-pages**](https://github.com/search?utf8=%E2%9C%93&q=base%3Agh-pages) matches pull requests that are being merged into the `gh-pages` branch.
+| head:HEAD_BRANCH | [**head:change is:closed is:unmerged**](https://github.com/search?utf8=%E2%9C%93&q=head%3Achange+is%3Aclosed+is%3Aunmerged&ref_product=github&ref_type=engagement&ref_style=text) matches pull requests opened from branch names beginning with the word "change" that are closed.
+| base:BASE_BRANCH | [**base:gh-pages**](https://github.com/search?utf8=%E2%9C%93&q=base%3Agh-pages&ref_product=github&ref_type=engagement&ref_style=text) matches pull requests that are being merged into the `gh-pages` branch.
## Search by language
@@ -245,7 +245,7 @@ With the `language` qualifier you can search for issues and pull requests within
| Qualifier | Example
| ------------- | -------------
-| language:LANGUAGE | [**language:ruby state:open**](https://github.com/search?q=language%3Aruby+state%3Aopen&type=Issues) matches open issues that are in Ruby repositories.
+| language:LANGUAGE | [**language:ruby state:open**](https://github.com/search?q=language%3Aruby+state%3Aopen&type=Issues&ref_product=github&ref_type=engagement&ref_style=text) matches open issues that are in Ruby repositories.
## Search by number of comments
@@ -253,8 +253,8 @@ You can use the `comments` qualifier along with [greater than, less than, and ra
| Qualifier | Example
| ------------- | -------------
-| comments:n | [**state:closed comments:>100**](https://github.com/search?q=state%3Aclosed+comments%3A%3E100&type=Issues) matches closed issues with more than 100 comments.
-| comments:n..n | [**comments:500..1000**](https://github.com/search?q=comments%3A500..1000&type=Issues) matches issues with comments ranging from 500 to 1,000.
+| comments:n | [**state:closed comments:>100**](https://github.com/search?q=state%3Aclosed+comments%3A%3E100&type=Issues&ref_product=github&ref_type=engagement&ref_style=text) matches closed issues with more than 100 comments.
+| comments:n..n | [**comments:500..1000**](https://github.com/search?q=comments%3A500..1000&type=Issues&ref_product=github&ref_type=engagement&ref_style=text) matches issues with comments ranging from 500 to 1,000.
## Search by number of interactions
@@ -262,8 +262,8 @@ You can filter issues and pull requests by the number of interactions with the `
| Qualifier | Example
| ------------- | -------------
-| interactions:n | [**interactions:>2000**](https://github.com/search?q=interactions%3A%3E2000) matches pull requests or issues with more than 2000 interactions.
-| interactions:n..n | [**interactions:500..1000**](https://github.com/search?q=interactions%3A500..1000) matches pull requests or issues with interactions ranging from 500 to 1,000.
+| interactions:n | [**interactions:>2000**](https://github.com/search?q=interactions%3A%3E2000&ref_product=github&ref_type=engagement&ref_style=text) matches pull requests or issues with more than 2000 interactions.
+| interactions:n..n | [**interactions:500..1000**](https://github.com/search?q=interactions%3A500..1000&ref_product=github&ref_type=engagement&ref_style=text) matches pull requests or issues with interactions ranging from 500 to 1,000.
## Search by number of reactions
@@ -271,8 +271,8 @@ You can filter issues and pull requests by the number of reactions using the `re
| Qualifier | Example
| ------------- | -------------
-| reactions:n | [**reactions:>1000**](https://github.com/search?q=reactions%3A%3E1000&type=Issues) matches issues with more than 1000 reactions.
-| reactions:n..n | [**reactions:500..1000**](https://github.com/search?q=reactions%3A500..1000) matches issues with reactions ranging from 500 to 1,000.
+| reactions:n | [**reactions:>1000**](https://github.com/search?q=reactions%3A%3E1000&type=Issues&ref_product=github&ref_type=engagement&ref_style=text) matches issues with more than 1000 reactions.
+| reactions:n..n | [**reactions:500..1000**](https://github.com/search?q=reactions%3A500..1000&ref_product=github&ref_type=engagement&ref_style=text) matches issues with reactions ranging from 500 to 1,000.
## Search for draft pull requests
@@ -280,8 +280,8 @@ You can filter for draft pull requests. For more information, see [AUTOTITLE](/p
| Qualifier | Example
| ------------- | -------------
-| `draft:true` | [**draft:true**](https://github.com/search?q=draft%3Atrue) matches draft pull requests.
-| `draft:false` | [**draft:false**](https://github.com/search?q=draft%3Afalse) matches pull requests that are ready for review.
+| `draft:true` | [**draft:true**](https://github.com/search?q=draft%3Atrue&ref_product=github&ref_type=engagement&ref_style=text) matches draft pull requests.
+| `draft:false` | [**draft:false**](https://github.com/search?q=draft%3Afalse&ref_product=github&ref_type=engagement&ref_style=text) matches pull requests that are ready for review.
## Search by pull request review status and reviewer
@@ -289,18 +289,18 @@ You can filter pull requests based on their [review status](/pull-requests/colla
| Qualifier | Example
| ------------- | -------------
-| `review:none` | [**type:pr review:none**](https://github.com/search?utf8=%E2%9C%93&q=type%3Apr+review%3Anone&type=Issues) matches pull requests that have not been reviewed.
-| `review:required` | [**type:pr review:required**](https://github.com/search?utf8=%E2%9C%93&q=type%3Apr+review%3Arequired&type=Issues) matches pull requests that require a review before they can be merged.
-| `review:approved` | [**type:pr review:approved**](https://github.com/search?utf8=%E2%9C%93&q=type%3Apr+review%3Aapproved&type=Issues) matches pull requests that a reviewer has approved.
-| `review:changes_requested` | [**type:pr review:changes_requested**](https://github.com/search?utf8=%E2%9C%93&q=type%3Apr+review%3Achanges_requested&type=Issues) matches pull requests in which a reviewer has asked for changes.
-| reviewed-by:USERNAME | [**type:pr reviewed-by:gjtorikian**](https://github.com/search?utf8=%E2%9C%93&q=type%3Apr+reviewed-by%3Agjtorikian&type=Issues) matches pull requests reviewed by a particular person.
-| review-requested:USERNAME | [**type:pr review-requested:benbalter**](https://github.com/search?utf8=%E2%9C%93&q=type%3Apr+review-requested%3Abenbalter&type=Issues) matches pull requests where a specific person is requested for review. Requested reviewers are no longer listed in the search results after they review a pull request. If the requested person is on a team that is requested for review, then review requests for that team will also appear in the search results.
+| `review:none` | [**type:pr review:none**](https://github.com/search?utf8=%E2%9C%93&q=type%3Apr+review%3Anone&type=Issues&ref_product=github&ref_type=engagement&ref_style=text) matches pull requests that have not been reviewed.
+| `review:required` | [**type:pr review:required**](https://github.com/search?utf8=%E2%9C%93&q=type%3Apr+review%3Arequired&type=Issues&ref_product=github&ref_type=engagement&ref_style=text) matches pull requests that require a review before they can be merged.
+| `review:approved` | [**type:pr review:approved**](https://github.com/search?utf8=%E2%9C%93&q=type%3Apr+review%3Aapproved&type=Issues&ref_product=github&ref_type=engagement&ref_style=text) matches pull requests that a reviewer has approved.
+| `review:changes_requested` | [**type:pr review:changes_requested**](https://github.com/search?utf8=%E2%9C%93&q=type%3Apr+review%3Achanges_requested&type=Issues&ref_product=github&ref_type=engagement&ref_style=text) matches pull requests in which a reviewer has asked for changes.
+| reviewed-by:USERNAME | [**type:pr reviewed-by:gjtorikian**](https://github.com/search?utf8=%E2%9C%93&q=type%3Apr+reviewed-by%3Agjtorikian&type=Issues&ref_product=github&ref_type=engagement&ref_style=text) matches pull requests reviewed by a particular person.
+| review-requested:USERNAME | [**type:pr review-requested:benbalter**](https://github.com/search?utf8=%E2%9C%93&q=type%3Apr+review-requested%3Abenbalter&type=Issues&ref_product=github&ref_type=engagement&ref_style=text) matches pull requests where a specific person is requested for review. Requested reviewers are no longer listed in the search results after they review a pull request. If the requested person is on a team that is requested for review, then review requests for that team will also appear in the search results.
| {% ifversion review-involves-search %} |
-| review-involves:USERNAME | [**type:pr review-involves:gjtorikian**](https://github.com/search?utf8=%E2%9C%93&q=type%3Apr+review-involves%3Agjtorikian&type=pullrequests) matches pull requests that a particular person is involved in reviewing, whether they were asked to review directly, are on a team that was asked, or have already reviewed. Unlike with `review-requested`, these pull requests remain in the results after the person or a teammate has reviewed them.
+| review-involves:USERNAME | [**type:pr review-involves:gjtorikian**](https://github.com/search?utf8=%E2%9C%93&q=type%3Apr+review-involves%3Agjtorikian&type=pullrequests&ref_product=github&ref_type=engagement&ref_style=text) matches pull requests that a particular person is involved in reviewing, whether they were asked to review directly, are on a team that was asked, or have already reviewed. Unlike with `review-requested`, these pull requests remain in the results after the person or a teammate has reviewed them.
| {% endif %} |
-| user-review-requested:@me | [**type:pr user-review-requested:@me**](https://github.com/search?q=is%3Apr+user-review-requested%3A%40me+) matches pull requests that you have directly been asked to review.
-| team-review-requested:TEAMNAME | [**type:pr team-review-requested:github/docs**](https://github.com/search?q=type%3Apr+team-review-requested%3Agithub%2Fdocs&type=pullrequests) matches pull requests that have review requests from the team `github/docs`. Requested reviewers are no longer listed in the search results after they review a pull request.
-| team-review-requested-user:USERNAME | [**type:pr team-review-requested-user:benbalter**](https://github.com/search?q=type%3Apr+team-review-requested-user%3Abenbalter&type=pullrequests) matches pull requests that have review requests from any team that a specific person is a member of. Review requests directed at the user specifically are not included. Requested reviewers are no longer listed in the search results after they review a pull request.
+| user-review-requested:@me | [**type:pr user-review-requested:@me**](https://github.com/search?q=is%3Apr+user-review-requested%3A%40me+&ref_product=github&ref_type=engagement&ref_style=text) matches pull requests that you have directly been asked to review.
+| team-review-requested:TEAMNAME | [**type:pr team-review-requested:github/docs**](https://github.com/search?q=type%3Apr+team-review-requested%3Agithub%2Fdocs&type=pullrequests&ref_product=github&ref_type=engagement&ref_style=text) matches pull requests that have review requests from the team `github/docs`. Requested reviewers are no longer listed in the search results after they review a pull request.
+| team-review-requested-user:USERNAME | [**type:pr team-review-requested-user:benbalter**](https://github.com/search?q=type%3Apr+team-review-requested-user%3Abenbalter&type=pullrequests&ref_product=github&ref_type=engagement&ref_style=text) matches pull requests that have review requests from any team that a specific person is a member of. Review requests directed at the user specifically are not included. Requested reviewers are no longer listed in the search results after they review a pull request.
## Search by when an issue or pull request was created or last updated
@@ -312,8 +312,8 @@ Both take a date as a parameter. {% data reusables.time_date.date_format %} {% d
| Qualifier | Example
| ------------- | -------------
-| created:YYYY-MM-DD | [**language:c# created:<2011-01-01 state:open**](https://github.com/search?q=language%3Ac%23+created%3A%3C2011-01-01+state%3Aopen&type=Issues) matches open issues that were created before 2011 in repositories written in C#.
-| updated:YYYY-MM-DD | [**weird in:body updated:>=2013-02-01**](https://github.com/search?q=weird+in%3Abody+updated%3A%3E%3D2013-02-01&type=Issues) matches issues with the word "weird" in the body that were updated after February 2013.
+| created:YYYY-MM-DD | [**language:c# created:<2011-01-01 state:open**](https://github.com/search?q=language%3Ac%23+created%3A%3C2011-01-01+state%3Aopen&type=Issues&ref_product=github&ref_type=engagement&ref_style=text) matches open issues that were created before 2011 in repositories written in C#.
+| updated:YYYY-MM-DD | [**weird in:body updated:>=2013-02-01**](https://github.com/search?q=weird+in%3Abody+updated%3A%3E%3D2013-02-01&type=Issues&ref_product=github&ref_type=engagement&ref_style=text) matches issues with the word "weird" in the body that were updated after February 2013.
## Search by when an issue or pull request was closed
@@ -325,8 +325,8 @@ This qualifier takes a date as its parameter. {% data reusables.time_date.date_f
| Qualifier | Example
| ------------- | -------------
-| closed:>YYYY-MM-DD | [**language:swift closed:>2014-06-11**](https://github.com/search?q=language%3Aswift+closed%3A%3E2014-06-11&type=Issues) matches issues and pull requests in Swift that were closed after June 11, 2014.
-| in:body closed:<YYYY-MM-DD | [**data in:body closed:<2012-10-01**](https://github.com/search?utf8=%E2%9C%93&q=data+in%3Abody+closed%3A%3C2012-10-01+&type=Issues) matches issues and pull requests with the word "data" in the body that were closed before October 2012.
+| closed:>YYYY-MM-DD | [**language:swift closed:>2014-06-11**](https://github.com/search?q=language%3Aswift+closed%3A%3E2014-06-11&type=Issues&ref_product=github&ref_type=engagement&ref_style=text) matches issues and pull requests in Swift that were closed after June 11, 2014.
+| in:body closed:<YYYY-MM-DD | [**data in:body closed:<2012-10-01**](https://github.com/search?utf8=%E2%9C%93&q=data+in%3Abody+closed%3A%3C2012-10-01+&type=Issues&ref_product=github&ref_type=engagement&ref_style=text) matches issues and pull requests with the word "data" in the body that were closed before October 2012.
## Search by when a pull request was merged
@@ -338,8 +338,8 @@ This qualifier takes a date as its parameter. {% data reusables.time_date.date_f
| Qualifier | Example
| ------------- | -------------
-| language:LANGUAGE merged:<YYYY-MM-DD | [**`language:javascript merged:<2011-01-01`**](https://github.com/search?q=language%3Ajavascript+merged%3A%3C2011-01-01+&type=Issues) matches pull requests in JavaScript repositories that were merged before 2011.
-| `in:title` language:LANGUAGE merged:>YYYY-MM-DD | [**fast in:title language:ruby merged:>=2014-05-01**](https://github.com/search?q=fast+in%3Atitle+language%3Aruby+merged%3A%3E%3D2014-05-01+&type=Issues) matches pull requests in Ruby with the word "fast" in the title that were merged after May 2014.
+| language:LANGUAGE merged:<YYYY-MM-DD | [**`language:javascript merged:<2011-01-01`**](https://github.com/search?q=language%3Ajavascript+merged%3A%3C2011-01-01+&type=Issues&ref_product=github&ref_type=engagement&ref_style=text) matches pull requests in JavaScript repositories that were merged before 2011.
+| `in:title` language:LANGUAGE merged:>YYYY-MM-DD | [**fast in:title language:ruby merged:>=2014-05-01**](https://github.com/search?q=fast+in%3Atitle+language%3Aruby+merged%3A%3E%3D2014-05-01+&type=Issues&ref_product=github&ref_type=engagement&ref_style=text) matches pull requests in Ruby with the word "fast" in the title that were merged after May 2014.
## Search based on whether a pull request is merged or unmerged
@@ -347,8 +347,8 @@ You can filter pull requests based on whether they're merged or unmerged using t
| Qualifier | Example
| ------------- | -------------
-| `is:merged` | [**bug is:pr is:merged**](https://github.com/search?utf8=%E2%9C%93&q=bugfix+is%3Apr+is%3Amerged&type=) matches merged pull requests with the word "bug."
-| `is:unmerged` | [**error is:unmerged**](https://github.com/search?utf8=%E2%9C%93&q=error+is%3Aunmerged&type=) matches pull requests with the word "error" that are either open or were closed without being merged.
+| `is:merged` | [**bug is:pr is:merged**](https://github.com/search?utf8=%E2%9C%93&q=bugfix+is%3Apr+is%3Amerged&type=&ref_product=github&ref_type=engagement&ref_style=text) matches merged pull requests with the word "bug."
+| `is:unmerged` | [**error is:unmerged**](https://github.com/search?utf8=%E2%9C%93&q=error+is%3Aunmerged&type=&ref_product=github&ref_type=engagement&ref_style=text) matches pull requests with the word "error" that are either open or were closed without being merged.
## Search based on whether a repository is archived
@@ -356,8 +356,8 @@ The `archived` qualifier filters your results based on whether an issue or pull
| Qualifier | Example
| ------------- | -------------
-| `archived:true` | [**archived:true GNOME**](https://github.com/search?q=archived%3Atrue+GNOME&type=) matches issues and pull requests that contain the word "GNOME" in archived repositories you have access to.
-| `archived:false` | [**archived:false GNOME**](https://github.com/search?q=archived%3Afalse+GNOME&type=) matches issues and pull requests that contain the word "GNOME" in unarchived repositories you have access to.
+| `archived:true` | [**archived:true GNOME**](https://github.com/search?q=archived%3Atrue+GNOME&type=&ref_product=github&ref_type=engagement&ref_style=text) matches issues and pull requests that contain the word "GNOME" in archived repositories you have access to.
+| `archived:false` | [**archived:false GNOME**](https://github.com/search?q=archived%3Afalse+GNOME&type=&ref_product=github&ref_type=engagement&ref_style=text) matches issues and pull requests that contain the word "GNOME" in unarchived repositories you have access to.
## Search based on whether a conversation is locked
@@ -365,8 +365,8 @@ You can search for an issue or pull request that has a locked conversation using
| Qualifier | Example
| ------------- | -------------
-| `is:locked` | [**code of conduct is:locked is:issue archived:false**](https://github.com/search?q=code+of+conduct+is%3Alocked+is%3Aissue+archived%3Afalse) matches issues or pull requests with the words "code of conduct" that have a locked conversation in a repository that is not archived.
-| `is:unlocked` | [**code of conduct is:unlocked is:issue archived:false**](https://github.com/search?q=code+of+conduct+is%3Aunlocked+archived%3Afalse) matches issues or pull requests with the words "code of conduct" that have an unlocked conversation in a repository that is not archived.
+| `is:locked` | [**code of conduct is:locked is:issue archived:false**](https://github.com/search?q=code+of+conduct+is%3Alocked+is%3Aissue+archived%3Afalse&ref_product=github&ref_type=engagement&ref_style=text) matches issues or pull requests with the words "code of conduct" that have a locked conversation in a repository that is not archived.
+| `is:unlocked` | [**code of conduct is:unlocked is:issue archived:false**](https://github.com/search?q=code+of+conduct+is%3Aunlocked+archived%3Afalse&ref_product=github&ref_type=engagement&ref_style=text) matches issues or pull requests with the words "code of conduct" that have an unlocked conversation in a repository that is not archived.
## Search by missing metadata
@@ -379,10 +379,10 @@ You can narrow your search to issues and pull requests that are missing certain
| Qualifier | Example
| ------------- | -------------
-| `no:label` | [**priority no:label**](https://github.com/search?q=priority+no%3Alabel&type=Issues) matches issues and pull requests with the word "priority" that also don't have any labels.
-| `no:milestone` | [**sprint no:milestone type:issue**](https://github.com/search?q=sprint+no%3Amilestone+type%3Aissue&type=Issues) matches issues not associated with a milestone containing the word "sprint."
-| `no:assignee` | [**important no:assignee language:java type:issue**](https://github.com/search?q=important+no%3Aassignee+language%3Ajava+type%3Aissue&type=Issues) matches issues not associated with an assignee, containing the word "important," and in Java repositories.
-| `no:project` | [**build no:project**](https://github.com/search?utf8=%E2%9C%93&q=build+no%3Aproject&type=Issues) matches issues not associated with a {% data variables.projects.project_v2 %}, containing the word "build."
+| `no:label` | [**priority no:label**](https://github.com/search?q=priority+no%3Alabel&type=Issues&ref_product=github&ref_type=engagement&ref_style=text) matches issues and pull requests with the word "priority" that also don't have any labels.
+| `no:milestone` | [**sprint no:milestone type:issue**](https://github.com/search?q=sprint+no%3Amilestone+type%3Aissue&type=Issues&ref_product=github&ref_type=engagement&ref_style=text) matches issues not associated with a milestone containing the word "sprint."
+| `no:assignee` | [**important no:assignee language:java type:issue**](https://github.com/search?q=important+no%3Aassignee+language%3Ajava+type%3Aissue&type=Issues&ref_product=github&ref_type=engagement&ref_style=text) matches issues not associated with an assignee, containing the word "important," and in Java repositories.
+| `no:project` | [**build no:project**](https://github.com/search?utf8=%E2%9C%93&q=build+no%3Aproject&type=Issues&ref_product=github&ref_type=engagement&ref_style=text) matches issues not associated with a {% data variables.projects.project_v2 %}, containing the word "build."
## Further reading
diff --git a/data/features/dependabot-malware-alerts-multi-ecosystem.yml b/data/features/dependabot-malware-alerts-multi-ecosystem.yml
new file mode 100644
index 000000000000..854b1486c1ac
--- /dev/null
+++ b/data/features/dependabot-malware-alerts-multi-ecosystem.yml
@@ -0,0 +1,6 @@
+# Reference: #23167
+# Expand ADB malware advisory support using OpenSSF malicious-packages [GA]
+versions:
+ fpt: '*'
+ ghec: '*'
+ ghes: '> 3.22'
diff --git a/data/reusables/advisory-database/malware-overview.md b/data/reusables/advisory-database/malware-overview.md
index db5beb23a3a8..f084724d4971 100644
--- a/data/reusables/advisory-database/malware-overview.md
+++ b/data/reusables/advisory-database/malware-overview.md
@@ -1 +1,5 @@
+{% ifversion dependabot-malware-alerts-multi-ecosystem %}
+**Malware** advisories are advisories about malicious open source packages. We publish them automatically into the {% data variables.product.prodname_advisory_database %} from the npm security team and the [OpenSSF Malicious Packages](https://github.com/ossf/malicious-packages) repository.
+{% else %}
**Malware** advisories relate to vulnerabilities caused by malware and are exclusive to the **npm** ecosystem. We publish them automatically into the {% data variables.product.prodname_advisory_database %}, directly from information provided by the npm security team.
+{% endif %}
diff --git a/data/reusables/dependabot/supported-package-managers.md b/data/reusables/dependabot/supported-package-managers.md
index a704d4381c77..2f62085428f8 100644
--- a/data/reusables/dependabot/supported-package-managers.md
+++ b/data/reusables/dependabot/supported-package-managers.md
@@ -38,7 +38,7 @@ npm | `npm` | v7, v8, v9, v10, v11 | {% octicon "check"
| {% ifversion dependabot-opentofu-support %} |
[OpenTofu](#opentofu) | `opentofu` | Not applicable | {% octicon "check" aria-label="Supported" %} | {% octicon "x" aria-label="Not supported" %} | {% octicon "check" aria-label="Supported" %} | {% octicon "x" aria-label="Not supported" %} | Not applicable |
| {% endif %} |
-[pip](#pip-and-pip-compile) | `pip` | 24.2 | {% octicon "check" aria-label="Supported" %} | {% octicon "check" aria-label="Supported" %} | {% octicon "x" aria-label="Not supported" %} | {% octicon "check" aria-label="Supported" %} | {% octicon "x" aria-label="Not supported" %} |
+[pip](#pip-and-pip-compile) | `pip` | 26.1.1 | {% octicon "check" aria-label="Supported" %} | {% octicon "check" aria-label="Supported" %} | {% octicon "x" aria-label="Not supported" %} | {% octicon "check" aria-label="Supported" %} | {% octicon "x" aria-label="Not supported" %} |
pipenv | `pip` | 2024.4.1 | {% octicon "check" aria-label="Supported" %} | {% octicon "check" aria-label="Supported" %} | {% octicon "x" aria-label="Not supported" %} | {% octicon "check" aria-label="Supported" %} | {% octicon "x" aria-label="Not supported" %} |
[pip-compile](#pip-and-pip-compile) | `pip` | 7.5.3 | {% octicon "check" aria-label="Supported" %} | {% octicon "check" aria-label="Supported" %} | {% octicon "x" aria-label="Not supported" %} | {% octicon "check" aria-label="Supported" %} | {% octicon "x" aria-label="Not supported" %} |
| pnpm | `npm` | v7, v8, v9, v10 | {% octicon "check" aria-label="Supported" %} | {% octicon "check" aria-label="Supported" %} | {% octicon "check" aria-label="Supported" %} | {% octicon "check" aria-label="Supported" %} | {% octicon "x" aria-label="Not supported" %} |
@@ -54,7 +54,7 @@ pipenv | `pip` | 2024.4.1 | {% octicon "check" aria-label="
[sbt](#sbt) | `sbt` | Not applicable | {% octicon "check" aria-label="Supported" %} | {% octicon "x" aria-label="Not supported" %} | {% octicon "check" aria-label="Supported" %} | {% octicon "check" aria-label="Supported" %} | {% octicon "x" aria-label="Not supported" %} |
| {% endif %} |
[Swift](#swift) | `swift` | v5 | {% octicon "check" aria-label="Supported" %} | {% octicon "check" aria-label="Supported" %} | {% octicon "check" aria-label="Supported" %} | {% octicon "check" aria-label="Supported" %} (git only) | {% octicon "x" aria-label="Not supported" %} |
-[Terraform](#terraform) | `terraform` | >= 0.13, <= 1.13.x | {% octicon "check" aria-label="Supported" %} | {% octicon "x" aria-label="Not supported" %} | {% octicon "check" aria-label="Supported" %} | {% octicon "check" aria-label="Supported" %} | Not applicable |
+[Terraform](#terraform) | `terraform` | >= 0.13, <= 1.15.x | {% octicon "check" aria-label="Supported" %} | {% octicon "x" aria-label="Not supported" %} | {% octicon "check" aria-label="Supported" %} | {% octicon "check" aria-label="Supported" %} | Not applicable |
| {% ifversion dependabot-uv-security-support %} |
uv | `uv` | v0 | {% octicon "check" aria-label="Supported" %} | {% octicon "check" aria-label="Supported" %} | {% octicon "check" aria-label="Supported" %} | {% octicon "check" aria-label="Supported" %} | Not applicable |
| {% elsif dependabot-uv-support %} |
diff --git a/data/reusables/enterprise-migration-tool/add-target-uploads-url.md b/data/reusables/enterprise-migration-tool/add-target-uploads-url.md
new file mode 100644
index 000000000000..40b68d0e66e5
--- /dev/null
+++ b/data/reusables/enterprise-migration-tool/add-target-uploads-url.md
@@ -0,0 +1 @@
+If you're migrating to {% data variables.enterprise.data_residency_site %} and using {% data variables.product.prodname_ghos %}, also add `--target-uploads-url TARGET-UPLOADS-URL`, where TARGET-UPLOADS-URL is the base uploads API URL for your enterprise's subdomain. For example: `https://uploads.{% data variables.enterprise.data_residency_example_domain %}`. This defaults to `https://uploads.github.com`.
diff --git a/data/reusables/enterprise-migration-tool/follow-up-tasks-common.md b/data/reusables/enterprise-migration-tool/follow-up-tasks-common.md
new file mode 100644
index 000000000000..791b363dbb56
--- /dev/null
+++ b/data/reusables/enterprise-migration-tool/follow-up-tasks-common.md
@@ -0,0 +1,42 @@
+## Checking the migration status
+
+First, check whether your migration succeeded or failed.
+
+The way you check the status of your migration depends on how you ran the migration.
+
+* If you ran the migration using the {% data variables.product.prodname_cli %}, by default, the process will display whether the migration succeeded or failed once the migration is complete. If the migration failed, you will see the reason for failure.
+
+ ```text
+ Migration completed (ID: RM_123)! State: SUCCEEDED
+ ```
+
+* If you ran the migration using the {% data variables.product.prodname_cli %} with the optional `--queue-only` argument, the process will exit immediately after queueing the migration, and will not tell you if the migration succeeded or failed. You can check a migration's status using the `wait-for-migration` command, or by reviewing the migration log.
+
+## Reviewing the migration log
+
+You should review the migration log for each migrated repository. People with read access to a repository can access the migration log for the repository on {% data variables.product.prodname_dotcom %}.
+
+1. Navigate to the migrated repository in your destination organization.
+{% data reusables.repositories.sidebar-issues %}
+1. Click the issue with the title "Migration Log."
+
+For more information, see [AUTOTITLE](/migrations/using-github-enterprise-importer/completing-your-migration-with-github-enterprise-importer/accessing-your-migration-logs-for-github-enterprise-importer).
+
+## Setting repository visibility
+
+{% data reusables.enterprise-migration-tool.setting-repository-visibility %}
+
+ For example, replace YOUR_ORG with your organization name, and the command below will set all of the organization's repositories to internal visibility.
+
+ ```bash copy
+ export ORG=YOUR_ORG
+ gh repo list "$ORG" --limit 100000 --json name -q '.[].name' | xargs -I{} gh repo edit "$ORG/{}" --visibility internal
+ ```
+
+## Reclaiming mannequins
+
+{% data reusables.enterprise-migration-tool.reclaiming-mannequins %}
+
+## Configuring IP allow lists
+
+If you added the IP ranges for {% data variables.product.prodname_importer_proper_name %} to the IP allow list for your destination organization, you can remove those entries. {% data reusables.enterprise-migration-tool.reenable-idp-ip-restrictions %}
diff --git a/data/reusables/enterprise-migration-tool/github-pat-required-scopes.md b/data/reusables/enterprise-migration-tool/github-pat-required-scopes.md
index 591a3d5cd2b8..3981ab289f23 100644
--- a/data/reusables/enterprise-migration-tool/github-pat-required-scopes.md
+++ b/data/reusables/enterprise-migration-tool/github-pat-required-scopes.md
@@ -6,6 +6,6 @@ The scopes that are required for your {% data variables.product.prodname_dotcom
Task | Organization owner | Migrator
---- | -------- | ----- |
Assigning the migrator role for repository migrations | `admin:org` | {% octicon "dash" aria-label="Not applicable" %}
-Running a repository migration (destination organization) | `repo`, `admin:org`, `workflow` | `repo`, `read:org`, `workflow`
-Downloading a migration log | `repo`, `admin:org`, `workflow` | `repo`, `read:org`, `workflow`
-Reclaiming mannequins | `repo`, `admin:org`, `workflow` | {% octicon "dash" aria-label="Not applicable" %}
+Running a repository migration (destination organization) | `repo`, `workflow`, `admin:org` | `repo`, `workflow`, `read:org`
+Downloading a migration log | `repo`, `workflow`, `admin:org` | `repo`, `workflow`, `read:org`
+Reclaiming mannequins | `repo`, `workflow`, `admin:org` | {% octicon "dash" aria-label="Not applicable" %}
diff --git a/data/reusables/enterprise-migration-tool/gl2gh-install-and-update.md b/data/reusables/enterprise-migration-tool/gl2gh-install-and-update.md
new file mode 100644
index 000000000000..8a25e401f68c
--- /dev/null
+++ b/data/reusables/enterprise-migration-tool/gl2gh-install-and-update.md
@@ -0,0 +1,14 @@
+1. Install the {% data variables.product.prodname_cli %}.
+ * {% data reusables.cli.cli-installation %}
+ * If you already have {% data variables.product.prodname_cli %} installed, run `gh --version` to ensure you're running version 2.4.0 or newer. If you have an older version, visit the [{% data variables.product.prodname_cli %} repository](https://github.com/cli/cli#installation) for upgrade instructions.
+1. Install the {% data variables.product.prodname_gl2gh_cli_short %}.
+
+ ```shell copy
+ gh extension install github/gh-gl2gh
+ ```
+
+1. The {% data variables.product.prodname_gl2gh_cli %} is updated frequently. {% data reusables.enterprise-migration-tool.update-your-extension %}
+
+ ```shell copy
+ gh extension upgrade github/gh-gl2gh
+ ```
diff --git a/data/reusables/enterprise-migration-tool/grant-migrator-role-ghecom.md b/data/reusables/enterprise-migration-tool/grant-migrator-role-ghecom.md
index 0065f4eafbb6..22eac37396a6 100644
--- a/data/reusables/enterprise-migration-tool/grant-migrator-role-ghecom.md
+++ b/data/reusables/enterprise-migration-tool/grant-migrator-role-ghecom.md
@@ -1 +1 @@
->[!NOTE] If you're the granting the migrator role for {% data variables.enterprise.data_residency_site %}, you must also include the target API URL for your enterprise's subdomain. For example: `--target-api-url https://api.{% data variables.enterprise.data_residency_example_domain %}`.
+>[!NOTE] If you're granting the migrator role for {% data variables.enterprise.data_residency_site %}, you must also include the target API URL for your enterprise's subdomain. For example: `--target-api-url https://api.{% data variables.enterprise.data_residency_example_domain %}`.
diff --git a/data/reusables/enterprise-migration-tool/migration-data-limitations.md b/data/reusables/enterprise-migration-tool/migration-data-limitations.md
new file mode 100644
index 000000000000..be522522d14e
--- /dev/null
+++ b/data/reusables/enterprise-migration-tool/migration-data-limitations.md
@@ -0,0 +1,19 @@
+## Limitations on migrated data
+
+There are limits to what {% data variables.product.prodname_importer_proper_name %} can migrate. Some are due to limitations of {% data variables.product.prodname_dotcom %}, while others are limitations of {% data variables.product.prodname_importer_proper_name %} itself.
+
+### Limitations of {% data variables.product.prodname_dotcom %}
+
+* **2 GiB size limit for a single Git commit:** No single commit in your Git repository can be larger than 2 GiB. If any of your commits are larger than 2 GiB, you will need to split the commit into smaller commits that are each 2 GiB or smaller.
+* **2 GiB size limit for a single push:** No single push can be larger than 2 GiB. Larger pushes fail with a `pack exceeds maximum allowed size` error.
+* **255 byte limit for Git references:** No single Git reference, commonly known as a "ref", can have a name larger than 255 bytes. Usually, this means that your references cannot be more than 255 characters long, but any non-ASCII characters, such as emojis, may consume more than one byte. If any of your Git references are too large, we'll return a clear error message.
+* **100 MiB file size limit:** After you complete your migration, no single file in your Git repository can be larger than 100 MiB. During repository migration this limit is increased to 400 MiB. Consider using {% data variables.large_files.product_name_short %} to store large files.
+
+### Limitations of {% data variables.product.prodname_importer_proper_name %}
+
+* {% data reusables.enterprise-migration-tool.git-repo-size-limit %}
+* **400 MiB file size limit:** When migrating a repository with {% data variables.product.prodname_importer_proper_name %}, no single file in your Git repository can be larger than 400 MiB. Consider using {% data variables.large_files.product_name_short %} for storing large files.
+* **{% data variables.large_files.product_name_short %} objects not migrated:** The {% data variables.product.prodname_importer_secondary_name %} can migrate repositories that use {% data variables.large_files.product_name_short %}, but the LFS objects themselves will not be migrated. They can be pushed to your migration destination as a follow-up task after the migration is complete.
+* **Delayed code search functionality:** Re-indexing the search index can take a few hours after a repository is migrated, and code searches may return unexpected results until re-indexing is complete.
+* **Rulesets configured for your organization can cause migrations to fail:** For example, if you configured a rule that requires email addresses for commit authors to end with `@monalisa.cat`, and the repository you're migrating contains commits that don't comply with this rule, your migration will fail.
+* **Mannequin content might not be searchable:** Mannequins are placeholder users to which imported content (such as issues, pull requests, comments, etc.) is associated. When you search for content associated with a mannequin, such as assigned issues, the issues may not be found. Once a mannequin is reclaimed, the content should be found via the new owner.
diff --git a/data/reusables/enterprise-migration-tool/organization-structure-tasks.md b/data/reusables/enterprise-migration-tool/organization-structure-tasks.md
index f416f0a7be1f..a5f1ae3e971f 100644
--- a/data/reusables/enterprise-migration-tool/organization-structure-tasks.md
+++ b/data/reusables/enterprise-migration-tool/organization-structure-tasks.md
@@ -1,3 +1,3 @@
-1. Decide what your new organization structural will be.
+1. Decide what your new organization structure will be.
1. Decide if you need to break up your migration effort into smaller batches.
1. If so, decide how you want to break up your migrations.
diff --git a/data/reusables/enterprise-migration-tool/supported-migration-paths.md b/data/reusables/enterprise-migration-tool/supported-migration-paths.md
index a0b2ee0f606e..63be17ea913d 100644
--- a/data/reusables/enterprise-migration-tool/supported-migration-paths.md
+++ b/data/reusables/enterprise-migration-tool/supported-migration-paths.md
@@ -4,6 +4,7 @@
* Bitbucket Server and Bitbucket Data Center 5.14+
* {% data variables.product.prodname_dotcom_the_website %}
* {% data variables.product.prodname_ghe_server %} (GHES) 3.4.1+
+* GitLab (GitLab.com or [maintained self-hosted versions](https://docs.gitlab.com/policy/maintenance/#maintained-versions))
> [!NOTE]
> {% data variables.product.prodname_importer_proper_name %} does not currently support migrations **from {% data variables.enterprise.data_residency_site %}.**
diff --git a/data/variables/product.yml b/data/variables/product.yml
index 02cb88cf85f3..801392674734 100644
--- a/data/variables/product.yml
+++ b/data/variables/product.yml
@@ -51,6 +51,9 @@ prodname_ado2gh_cli_short: ADO2GH extension
prodname_bbs2gh: BBS2GH
prodname_bbs2gh_cli: BBS2GH extension of the GitHub CLI
prodname_bbs2gh_cli_short: BBS2GH extension
+prodname_gl2gh_cli: GL2GH extension of the GitHub CLI
+prodname_gl2gh_cli_short: GL2GH extension
+prodname_gl2gh: GL2GH
prodname_ghos: GitHub-owned blob storage
## Enterprise Live Migrations
@@ -124,8 +127,7 @@ pat_v2: 'fine-grained personal access token'
pat_v2_plural: 'fine-grained personal access tokens'
pat_v2_caps: 'Fine-grained personal access token'
pat_v2_caps_plural: 'Fine-grained personal access tokens'
-pat_v1: >-
- personal access token (classic)
+pat_v1: 'personal access token (classic)'
pat_v1_plural: >-
personal access tokens (classic)
pat_v1_caps: >-
diff --git a/src/fixtures/fixtures/content/get-started/foo/anchor-scrolling.md b/src/fixtures/fixtures/content/get-started/foo/anchor-scrolling.md
new file mode 100644
index 000000000000..2fcd22b34f48
--- /dev/null
+++ b/src/fixtures/fixtures/content/get-started/foo/anchor-scrolling.md
@@ -0,0 +1,74 @@
+---
+title: Anchor scrolling
+intro: Exists for a Playwright test that a #anchor in the URL scrolls to the right heading.
+versions:
+ fpt: '*'
+ ghes: '*'
+ ghec: '*'
+---
+
+This page is deliberately tall, with the target heading in the middle rather than at the end. That lets a test tell the difference between "scrolled to the anchor" and "still at the top of the article", and stops the assertion passing by accident when the browser clamps to the maximum scroll offset.
+
+## Filler heading before target 1
+
+Filler paragraph so the article is taller than the viewport. Without enough height the browser has nowhere to scroll, and a test asserting the scroll position of an anchor target would pass no matter what the page does. Repeat this a few times per section to build up some height.
+
+Filler paragraph so the article is taller than the viewport. Without enough height the browser has nowhere to scroll, and a test asserting the scroll position of an anchor target would pass no matter what the page does. Repeat this a few times per section to build up some height.
+
+Filler paragraph so the article is taller than the viewport. Without enough height the browser has nowhere to scroll, and a test asserting the scroll position of an anchor target would pass no matter what the page does. Repeat this a few times per section to build up some height.
+
+Filler paragraph so the article is taller than the viewport. Without enough height the browser has nowhere to scroll, and a test asserting the scroll position of an anchor target would pass no matter what the page does. Repeat this a few times per section to build up some height.
+
+## Filler heading before target 2
+
+Filler paragraph so the article is taller than the viewport. Without enough height the browser has nowhere to scroll, and a test asserting the scroll position of an anchor target would pass no matter what the page does. Repeat this a few times per section to build up some height.
+
+Filler paragraph so the article is taller than the viewport. Without enough height the browser has nowhere to scroll, and a test asserting the scroll position of an anchor target would pass no matter what the page does. Repeat this a few times per section to build up some height.
+
+Filler paragraph so the article is taller than the viewport. Without enough height the browser has nowhere to scroll, and a test asserting the scroll position of an anchor target would pass no matter what the page does. Repeat this a few times per section to build up some height.
+
+Filler paragraph so the article is taller than the viewport. Without enough height the browser has nowhere to scroll, and a test asserting the scroll position of an anchor target would pass no matter what the page does. Repeat this a few times per section to build up some height.
+
+## Filler heading before target 3
+
+Filler paragraph so the article is taller than the viewport. Without enough height the browser has nowhere to scroll, and a test asserting the scroll position of an anchor target would pass no matter what the page does. Repeat this a few times per section to build up some height.
+
+Filler paragraph so the article is taller than the viewport. Without enough height the browser has nowhere to scroll, and a test asserting the scroll position of an anchor target would pass no matter what the page does. Repeat this a few times per section to build up some height.
+
+Filler paragraph so the article is taller than the viewport. Without enough height the browser has nowhere to scroll, and a test asserting the scroll position of an anchor target would pass no matter what the page does. Repeat this a few times per section to build up some height.
+
+Filler paragraph so the article is taller than the viewport. Without enough height the browser has nowhere to scroll, and a test asserting the scroll position of an anchor target would pass no matter what the page does. Repeat this a few times per section to build up some height.
+
+## Target heading
+
+The Playwright test links to `#target-heading` and asserts this heading ends up near the top of the viewport.
+
+## Filler heading after target 1
+
+Filler paragraph so the article is taller than the viewport. Without enough height the browser has nowhere to scroll, and a test asserting the scroll position of an anchor target would pass no matter what the page does. Repeat this a few times per section to build up some height.
+
+Filler paragraph so the article is taller than the viewport. Without enough height the browser has nowhere to scroll, and a test asserting the scroll position of an anchor target would pass no matter what the page does. Repeat this a few times per section to build up some height.
+
+Filler paragraph so the article is taller than the viewport. Without enough height the browser has nowhere to scroll, and a test asserting the scroll position of an anchor target would pass no matter what the page does. Repeat this a few times per section to build up some height.
+
+Filler paragraph so the article is taller than the viewport. Without enough height the browser has nowhere to scroll, and a test asserting the scroll position of an anchor target would pass no matter what the page does. Repeat this a few times per section to build up some height.
+
+## Filler heading after target 2
+
+Filler paragraph so the article is taller than the viewport. Without enough height the browser has nowhere to scroll, and a test asserting the scroll position of an anchor target would pass no matter what the page does. Repeat this a few times per section to build up some height.
+
+Filler paragraph so the article is taller than the viewport. Without enough height the browser has nowhere to scroll, and a test asserting the scroll position of an anchor target would pass no matter what the page does. Repeat this a few times per section to build up some height.
+
+Filler paragraph so the article is taller than the viewport. Without enough height the browser has nowhere to scroll, and a test asserting the scroll position of an anchor target would pass no matter what the page does. Repeat this a few times per section to build up some height.
+
+Filler paragraph so the article is taller than the viewport. Without enough height the browser has nowhere to scroll, and a test asserting the scroll position of an anchor target would pass no matter what the page does. Repeat this a few times per section to build up some height.
+
+## Filler heading after target 3
+
+Filler paragraph so the article is taller than the viewport. Without enough height the browser has nowhere to scroll, and a test asserting the scroll position of an anchor target would pass no matter what the page does. Repeat this a few times per section to build up some height.
+
+Filler paragraph so the article is taller than the viewport. Without enough height the browser has nowhere to scroll, and a test asserting the scroll position of an anchor target would pass no matter what the page does. Repeat this a few times per section to build up some height.
+
+Filler paragraph so the article is taller than the viewport. Without enough height the browser has nowhere to scroll, and a test asserting the scroll position of an anchor target would pass no matter what the page does. Repeat this a few times per section to build up some height.
+
+Filler paragraph so the article is taller than the viewport. Without enough height the browser has nowhere to scroll, and a test asserting the scroll position of an anchor target would pass no matter what the page does. Repeat this a few times per section to build up some height.
diff --git a/src/fixtures/fixtures/content/get-started/foo/for-playwright.md b/src/fixtures/fixtures/content/get-started/foo/for-playwright.md
index 0b71689d6720..7f6300a64717 100644
--- a/src/fixtures/fixtures/content/get-started/foo/for-playwright.md
+++ b/src/fixtures/fixtures/content/get-started/foo/for-playwright.md
@@ -14,3 +14,6 @@ This page exists to serve a Playwright test to view an article page.
## Second heading
This is the second heading.
+
+For a Playwright test of cross-page anchor navigation, here is a link to the
+[target heading](/get-started/foo/anchor-scrolling#target-heading).
diff --git a/src/fixtures/fixtures/content/get-started/foo/index.md b/src/fixtures/fixtures/content/get-started/foo/index.md
index 198a9293a549..d774a1ca7913 100644
--- a/src/fixtures/fixtures/content/get-started/foo/index.md
+++ b/src/fixtures/fixtures/content/get-started/foo/index.md
@@ -20,4 +20,5 @@ children:
- /code-snippet-with-hashbang
- /journey-test-article
- /broken-frontmatter-translation
+ - /anchor-scrolling
---
diff --git a/src/fixtures/tests/playwright-rendering.spec.ts b/src/fixtures/tests/playwright-rendering.spec.ts
index 114e37a198ea..9e74522d9403 100644
--- a/src/fixtures/tests/playwright-rendering.spec.ts
+++ b/src/fixtures/tests/playwright-rendering.spec.ts
@@ -859,6 +859,59 @@ test.describe('secondary-bar breadcrumb scroller', () => {
})
})
+test.describe('anchor link scrolling', () => {
+ // The doc-tree rail only renders at the xxl breakpoint (1400px) and up. Its
+ // "centre the active item" effect used to call scrollIntoView, which scrolls
+ // every scrollable ancestor including the document, so it undid the browser's
+ // scroll to the #anchor and dumped the reader at the top of the article.
+ // These tests only mean anything with the rail on screen.
+ const WIDE = { width: 1400, height: 720 }
+
+ // The heading is offset from the top of the viewport by `scroll-margin-top`
+ // (109px at xxl, see src/frame/stylesheets/scroll-top.scss). Allow slack for
+ // rounding and sticky-header tweaks, but stay well clear of "not scrolled".
+ const expectScrolledToTarget = async (page: import('@playwright/test').Page) => {
+ const heading = page.locator('#target-heading')
+ await expect(heading).toBeVisible()
+ await expect.poll(async () => Math.round((await heading.boundingBox())!.y)).toBeLessThan(200)
+ expect(await page.evaluate(() => Math.round(window.scrollY))).toBeGreaterThan(300)
+ }
+
+ test('a direct load of a URL with an #anchor scrolls to that section', async ({ page }) => {
+ page.setViewportSize(WIDE)
+ await page.goto('/get-started/foo/anchor-scrolling#target-heading')
+ await expect(page.getByTestId('sidebar')).toBeVisible()
+ await expectScrolledToTarget(page)
+
+ // Guard the setup: the regression only shows when the rail has actually
+ // scrolled its own container to centre the active item. If a fixture change
+ // ever makes the rail short enough that it doesn't need to scroll, these
+ // tests would keep passing while covering nothing — fail loudly instead.
+ const railScrollTop = await page
+ .getByTestId('sidebar')
+ .evaluate((el) => el.closest('[role="region"]')!.scrollTop)
+ expect(railScrollTop).toBeGreaterThan(0)
+ })
+
+ test('clicking a cross-page #anchor link scrolls to that section', async ({ page }) => {
+ page.setViewportSize(WIDE)
+ await page.goto('/get-started/foo/for-playwright')
+ await page.locator('main a[href$="/get-started/foo/anchor-scrolling#target-heading"]').click()
+ await expect(page).toHaveURL(/anchor-scrolling#target-heading/)
+ await expectScrolledToTarget(page)
+ })
+
+ test('navigating to a page without an #anchor still lands at the top', async ({ page }) => {
+ page.setViewportSize(WIDE)
+ await page.goto('/get-started/foo/anchor-scrolling#target-heading')
+ await expectScrolledToTarget(page)
+
+ await page.getByTestId('sidebar').getByRole('link', { name: 'Bar', exact: true }).click()
+ await expect(page).toHaveURL(/\/en\/get-started\/foo\/bar$/)
+ await expect.poll(async () => page.evaluate(() => Math.round(window.scrollY))).toBe(0)
+ })
+})
+
test.describe('survey', () => {
test.skip(!ANALYTICS_ENABLED, 'Analytics are disabled')
diff --git a/src/landings/components/SidebarProduct.tsx b/src/landings/components/SidebarProduct.tsx
index 233317f16983..13d60f687e6a 100644
--- a/src/landings/components/SidebarProduct.tsx
+++ b/src/landings/components/SidebarProduct.tsx
@@ -8,6 +8,7 @@ import {
useContext,
useEffect,
useMemo,
+ useRef,
useState,
} from 'react'
import { NavList } from '@primer/react-brand'
@@ -21,6 +22,22 @@ import { flattenDescendants, MAX_NAVLIST_LEVEL } from './sidebar-navlist-depth'
import styles from './SidebarProduct.module.scss'
+// The nearest ancestor that actually scrolls vertically. Brand's NavList.SubNav
+// wrappers use `overflow-y: hidden`, so match only auto/scroll to skip past them
+// and land on the sidebar's own overflow container. Returns null when the rail is
+// hidden (below the xxl breakpoint it is `display: none`, so nothing scrolls).
+function findScrollableAncestor(element: Element): HTMLElement | null {
+ let node = element.parentElement
+ while (node) {
+ const { overflowY } = getComputedStyle(node)
+ if ((overflowY === 'auto' || overflowY === 'scroll') && node.scrollHeight > node.clientHeight) {
+ return node
+ }
+ node = node.parentElement
+ }
+ return null
+}
+
type Router = ReturnType