Skip to content

Commit bc89264

Browse files
authored
Merge pull request #42611 from github/repo-sync
Repo sync
2 parents 3b4c57b + 65e3e5e commit bc89264

File tree

18 files changed

+263
-10
lines changed

18 files changed

+263
-10
lines changed

content/copilot/reference/copilot-feature-matrix.md

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,10 +26,20 @@ topics:
2626

2727
The following table shows supported {% data variables.product.prodname_copilot_short %} features in the latest version of each IDE.
2828

29+
{%- comment %}
30+
This loop generates the "Features by IDE" comparison table:
31+
- Outer loop: Iterates through each feature from VS Code's feature list (using VS Code as the canonical source)
32+
- Inner loop: For each feature, iterates through all IDEs to check support in their latest version
33+
- Gets the latest version using ideEntry[1].versions | first
34+
- Looks up the support level for that feature in that version
35+
- Outputs ✓ (supported), P (preview), or ✗ (not supported)
36+
Example row: | Agent mode | ✓ | ✓ | P | ✗ | ... |
37+
{%- endcomment %}
38+
2939
| Feature{%- for entry in tables.copilot.copilot-matrix.ides %} | {{ entry[0] }}{%- endfor %} |
3040
|:----{%- for entry in tables.copilot.copilot-matrix.ides %}|:----:{%- endfor %}|
3141
{%- for featureEntry in tables.copilot.copilot-matrix.ides["VS Code"].features %}
32-
| {{ featureEntry[0] }}{%- for ideEntry in tables.copilot.copilot-matrix.ides %}{%- assign latestVersion = ideEntry[1].versions | last %}{%- assign supportLevel = ideEntry[1].features[featureEntry[0]][latestVersion] %} | {%- case supportLevel -%}{%- when "supported" %}✓{%- when "preview" %}P{%- else %}✗{%- endcase -%}{%- endfor %} |
42+
| {{ featureEntry[0] }}{%- for ideEntry in tables.copilot.copilot-matrix.ides %}{%- assign latestVersion = ideEntry[1].versions | first %}{%- assign supportLevel = ideEntry[1].features[featureEntry[0]][latestVersion] %} | {%- case supportLevel -%}{%- when "supported" %}✓{%- when "preview" %}P{%- else %}✗{%- endcase -%}{%- endfor %} |
3343
{%- endfor %}
3444

3545
{% endides %}

data/release-notes/enterprise-server/3-16/13.yml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,8 @@ sections:
2727
2828
Now, if an administrator sets the instance's `skip_rebase_commit_generation_from_rebase_merge_settings` configuration variable to `true`, the "Allow rebase merging" option in a repository's pull request settings becomes the source of truth for whether rebase commits are generated when mergeability is checked.
2929
known_issues:
30+
- |
31+
When applying an enterprise security configuration to all repositories (for example, enabling Secret Scanning or Code Scanning across all repositories), the system immediately enqueues enablement jobs for every organization in the enterprise simultaneously. For enterprises with a large number of repositories, this can result in significant system load and potential performance degradation. If you manage a large enterprise with many organizations and repositories, we recommend applying security configurations at the organization level rather than at the enterprise level in the UI. This allows you to enable security features incrementally and monitor system performance as you roll out changes.
3032
- |
3133
During an upgrade of GitHub Enterprise Server, custom firewall rules are removed. If you use custom firewall rules, you must reapply them after upgrading.
3234
- |

data/release-notes/enterprise-server/3-17/10.yml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,8 @@ sections:
3333
3434
Now, if an administrator sets the instance's `skip_rebase_commit_generation_from_rebase_merge_settings` configuration variable to `true`, the "Allow rebase merging" option in a repository's pull request settings becomes the source of truth for whether rebase commits are generated when mergeability is checked.
3535
known_issues:
36+
- |
37+
When applying an enterprise security configuration to all repositories (for example, enabling Secret Scanning or Code Scanning across all repositories), the system immediately enqueues enablement jobs for every organization in the enterprise simultaneously. For enterprises with a large number of repositories, this can result in significant system load and potential performance degradation. If you manage a large enterprise with many organizations and repositories, we recommend applying security configurations at the organization level rather than at the enterprise level in the UI. This allows you to enable security features incrementally and monitor system performance as you roll out changes.
3638
- |
3739
During an upgrade of GitHub Enterprise Server, custom firewall rules are removed. If you use custom firewall rules, you must reapply them after upgrading.
3840
- |

data/release-notes/enterprise-server/3-18/4.yml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,8 @@ sections:
4343
4444
Now, if an administrator sets the instance's `skip_rebase_commit_generation_from_rebase_merge_settings` configuration variable to `true`, the "Allow rebase merging" option in a repository's pull request settings becomes the source of truth for whether rebase commits are generated when mergeability is checked.
4545
known_issues:
46+
- |
47+
When applying an enterprise security configuration to all repositories (for example, enabling Secret Scanning or Code Scanning across all repositories), the system immediately enqueues enablement jobs for every organization in the enterprise simultaneously. For enterprises with a large number of repositories, this can result in significant system load and potential performance degradation. If you manage a large enterprise with many organizations and repositories, we recommend applying security configurations at the organization level rather than at the enterprise level in the UI. This allows you to enable security features incrementally and monitor system performance as you roll out changes.
4648
- |
4749
During an upgrade of GitHub Enterprise Server, custom firewall rules are removed. If you use custom firewall rules, you must reapply them after upgrading.
4850
- |

data/release-notes/enterprise-server/3-19/1.yml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,8 @@ sections:
4848
- |
4949
You can configure multiple data disks to host MySQL and repository data. This capability is currently in public preview and is applicable only for standalone and high availability topologies. It does not apply to cluster topologies. For more information, see [AUTOTITLE](/admin/monitoring-and-managing-your-instance/multiple-data-disks/configuring-multiple-data-disks). [Updated: 2026-01-19]
5050
known_issues:
51+
- |
52+
When applying an enterprise security configuration to all repositories (for example, enabling Secret Scanning or Code Scanning across all repositories), the system immediately enqueues enablement jobs for every organization in the enterprise simultaneously. For enterprises with a large number of repositories, this can result in significant system load and potential performance degradation. If you manage a large enterprise with many organizations and repositories, we recommend applying security configurations at the organization level rather than at the enterprise level in the UI. This allows you to enable security features incrementally and monitor system performance as you roll out changes.
5153
- |
5254
Upgrading or hotpatching to 3.19.1 may fail on very old nodes that have been continuously upgraded from versions older than 2021 versions (i.e. 2.17). If this issue occurs, you will see log entries prefixed with `invalid secret` in ghe-config.log. If you are running nodes this old, it is recommended not to upgrade to 3.19.1.
5355
If you must hotpatch to 3.19.1, first run `ghe-config 'secrets.session-manage' | tr -d '\n' | wc -c`. If the output is less than 64, run `ghe-config --unset 'secrets.session-manage'` and `ghe-config-apply` before you start the hotpatch. You can also run these same commands after the hotpatch to recover from the failure. [Updated: 2026-01-12]

package-lock.json

Lines changed: 7 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -157,6 +157,7 @@
157157
"dependencies": {
158158
"@elastic/elasticsearch": "8.19.1",
159159
"@github/failbot": "0.8.3",
160+
"@github/hydro-analytics-client": "^2.3.3",
160161
"@gr2m/gray-matter": "4.0.3-with-pr-137",
161162
"@horizon-rs/language-guesser": "0.1.1",
162163
"@octokit/graphql": "9.0.1",

src/events/components/events.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import { isLoggedIn } from '@/frame/components/hooks/useHasAccount'
66
import { getExperimentVariationForContext } from './experiments/experiment'
77
import { EventType, EventPropsByType } from '../types'
88
import { isHeadless } from './is-headless'
9+
import { sendHydroAnalyticsEvent, getOctoClientId } from './hydro-analytics'
910

1011
const COOKIE_NAME = '_docs-events'
1112

@@ -114,6 +115,7 @@ export function sendEvent<T extends EventType>({
114115
content_type: getMetaContent('page-content-type'),
115116
status: Number(getMetaContent('status') || 0),
116117
is_logged_in: isLoggedIn(),
118+
octo_client_id: getOctoClientId(),
117119

118120
// Device information
119121
// os, os_version, browser, browser_version:
@@ -152,6 +154,9 @@ export function sendEvent<T extends EventType>({
152154

153155
queueEvent(body)
154156

157+
// Send events to hydro-analytics-client for cross-subdomain tracking
158+
sendHydroAnalyticsEvent(body)
159+
155160
if (type === EventType.exit) {
156161
flushQueue()
157162
}
Lines changed: 98 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,98 @@
1+
/**
2+
* Integration with @github/hydro-analytics-client for cross-subdomain tracking.
3+
*
4+
* This sends events to collector.githubapp.com alongside our existing analytics.
5+
* The client auto-collects: page, title, client_id, referrer, user_agent,
6+
* screen_resolution, browser_resolution, browser_languages, pixel_ratio, timestamp, tz_seconds
7+
*
8+
* We send all other docs-specific context fields, including:
9+
* - path_language, path_version, path_product, path_article
10+
* - page_document_type, page_type, content_type
11+
* - color_mode_preference, is_logged_in, experiment_variation, is_headless
12+
* - event_id, page_event_id, octo_client_id
13+
* - Plus any event-specific properties (exit metrics, link_url, etc.)
14+
*
15+
* All functions are wrapped in try/catch to ensure that issues with the
16+
* hydro-analytics-client or collector don't affect our primary analytics.
17+
*/
18+
19+
import {
20+
AnalyticsClient,
21+
getOrCreateClientId as hydroGetOrCreateClientId,
22+
} from '@github/hydro-analytics-client'
23+
import { EventType } from '../types'
24+
25+
/**
26+
* Safe wrapper around hydro-analytics-client's getOrCreateClientId.
27+
* Returns undefined if the client fails for any reason.
28+
*/
29+
export function getOctoClientId(): string | undefined {
30+
try {
31+
return hydroGetOrCreateClientId()
32+
} catch (error) {
33+
console.log('hydro-analytics-client getOctoClientId error:', error)
34+
return undefined
35+
}
36+
}
37+
38+
const hydroClient = new AnalyticsClient({
39+
collectorUrl: 'https://collector.githubapp.com/docs/collect',
40+
clientId: getOctoClientId(),
41+
})
42+
43+
// Fields that hydro-analytics-client already collects automatically
44+
const AUTO_COLLECTED_FIELDS = new Set([
45+
'referrer',
46+
'user_agent',
47+
'viewport_width',
48+
'viewport_height',
49+
'screen_width',
50+
'screen_height',
51+
'pixel_ratio',
52+
'timezone',
53+
'user_language',
54+
'href',
55+
'title',
56+
])
57+
58+
/**
59+
* Flatten a nested event body into a single-level context object,
60+
* excluding fields that hydro-analytics-client already auto-collects.
61+
*/
62+
export function prepareData(body: Record<string, unknown>): {
63+
type: string
64+
context: Record<string, string>
65+
} {
66+
const { context: nestedContext, type, ...rest } = body
67+
const flattened = {
68+
...((nestedContext as Record<string, unknown>) || {}),
69+
...rest,
70+
}
71+
const context = Object.fromEntries(
72+
Object.entries(flattened)
73+
.filter(([, value]) => value != null)
74+
.filter(([key]) => !AUTO_COLLECTED_FIELDS.has(key))
75+
.map(([key, value]) => [key, String(value)]),
76+
)
77+
return { type: typeof type === 'string' ? type : 'unknown', context }
78+
}
79+
80+
/**
81+
* Send an event to hydro-analytics-client.
82+
* For page events, sends as a page view. For all other events, sends as a custom event.
83+
*
84+
* This is wrapped in try/catch to ensure that if the hydro collector is down
85+
* or errors, it doesn't affect our primary analytics pipeline.
86+
*/
87+
export function sendHydroAnalyticsEvent(body: Record<string, unknown>): void {
88+
try {
89+
const { type, context } = prepareData(body)
90+
if (type === EventType.page) {
91+
hydroClient.sendPageView(context)
92+
} else {
93+
hydroClient.sendEvent(type, context)
94+
}
95+
} catch (error) {
96+
console.log('hydro-analytics-client error:', error)
97+
}
98+
}

src/events/lib/schema.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -124,6 +124,11 @@ const context = {
124124
type: 'boolean',
125125
description: 'The cookie value of staffonly',
126126
},
127+
octo_client_id: {
128+
type: 'string',
129+
description:
130+
'The _octo cookie client ID for cross-subdomain tracking with github.com analytics.',
131+
},
127132

128133
// Device information
129134
os: {

0 commit comments

Comments
 (0)