mirror of
https://github.com/electron/electron.git
synced 2026-04-10 03:01:51 -04:00
Compare commits
295 Commits
remove-mac
...
robo/enabl
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
22c8b7cf17 | ||
|
|
26f169d9d1 | ||
|
|
15416ef8e4 | ||
|
|
2d4e638722 | ||
|
|
4dfada86ce | ||
|
|
df81a1d4ac | ||
|
|
c3e3958668 | ||
|
|
afd5fb4a60 | ||
|
|
8679522922 | ||
|
|
0828de3ccd | ||
|
|
6b5a4ff66c | ||
|
|
ca28023d4d | ||
|
|
e60441ad60 | ||
|
|
a189425373 | ||
|
|
7eccea1315 | ||
|
|
2e74ad2c68 | ||
|
|
9ba299afff | ||
|
|
6df2228ea0 | ||
|
|
a29674e4cf | ||
|
|
81dd0f42e1 | ||
|
|
6aaf490aa5 | ||
|
|
b8f25c4ced | ||
|
|
9fafc81e88 | ||
|
|
4d05010945 | ||
|
|
c3189e9886 | ||
|
|
983ebdd6de | ||
|
|
b9c08ef9c2 | ||
|
|
9f3cc9122c | ||
|
|
e66e4ca02c | ||
|
|
6ed3198ba8 | ||
|
|
903e65e048 | ||
|
|
fef2fd2941 | ||
|
|
4d8fd31e5f | ||
|
|
96486a4102 | ||
|
|
3f8238b92c | ||
|
|
64c5440eec | ||
|
|
30cf60a935 | ||
|
|
ec30e4cdae | ||
|
|
40033db422 | ||
|
|
c3d441cf7d | ||
|
|
14583d22e6 | ||
|
|
68bfe49120 | ||
|
|
2c6332a7d6 | ||
|
|
ddc1bd9553 | ||
|
|
12109371d3 | ||
|
|
69891d04bf | ||
|
|
188813e206 | ||
|
|
8b768b8211 | ||
|
|
82b97ddf5b | ||
|
|
16f408a502 | ||
|
|
246aa63910 | ||
|
|
230f02faf2 | ||
|
|
1362d7b94d | ||
|
|
877fe479b5 | ||
|
|
f41438ff73 | ||
|
|
c6e201c965 | ||
|
|
156a4e610c | ||
|
|
81f8fc1880 | ||
|
|
343d6e5f3f | ||
|
|
e7080835f1 | ||
|
|
7c1a6f7e95 | ||
|
|
22ac2b13fb | ||
|
|
a8acb96608 | ||
|
|
97773bf50c | ||
|
|
1e0846749b | ||
|
|
8cd766ff53 | ||
|
|
e5b20a11d2 | ||
|
|
e0bd4ffc39 | ||
|
|
bbbcae1a12 | ||
|
|
3e1666be08 | ||
|
|
a06b49aca1 | ||
|
|
d318893aa0 | ||
|
|
f133e2f775 | ||
|
|
b44b9ba316 | ||
|
|
d5e4429724 | ||
|
|
8f11366f50 | ||
|
|
0dabcfdec4 | ||
|
|
b4460a05da | ||
|
|
0a1ea1f028 | ||
|
|
b41ec6586a | ||
|
|
4eff8f20f2 | ||
|
|
8cb61e8b9b | ||
|
|
b9731b89dc | ||
|
|
d64e1146dd | ||
|
|
ae6b219545 | ||
|
|
c44d60cfe4 | ||
|
|
9928c7d828 | ||
|
|
f5bc6f7949 | ||
|
|
a839fb94aa | ||
|
|
2e2c56adde | ||
|
|
678adeaf7c | ||
|
|
1d14694dec | ||
|
|
a48f03fb8d | ||
|
|
f6b43cb0ef | ||
|
|
7451d560ba | ||
|
|
27edd6e21c | ||
|
|
ec3a18d438 | ||
|
|
02d4101ca3 | ||
|
|
fdaba4c6b0 | ||
|
|
542ff828ab | ||
|
|
4371a4dceb | ||
|
|
60f4b07723 | ||
|
|
f282bec8ef | ||
|
|
cef388de3d | ||
|
|
1828690467 | ||
|
|
f4c4cd14ac | ||
|
|
3db3996102 | ||
|
|
dbcf0fb5f0 | ||
|
|
29750dda08 | ||
|
|
6df6ec5f09 | ||
|
|
882a6b2cf9 | ||
|
|
b8fa540fd3 | ||
|
|
dee8f5a0ff | ||
|
|
32f8e2ce45 | ||
|
|
4e6324e00b | ||
|
|
7f21d31498 | ||
|
|
639d3b99b7 | ||
|
|
0c7bde54d4 | ||
|
|
8a0c20431c | ||
|
|
72797d7b42 | ||
|
|
9ccc752a43 | ||
|
|
6993eb3c78 | ||
|
|
d9649f9e16 | ||
|
|
5b2b9cdeff | ||
|
|
e31a95b15f | ||
|
|
1ad832a4c1 | ||
|
|
8e077a09f3 | ||
|
|
95f0d8156b | ||
|
|
b881f86c8f | ||
|
|
5959ecc3ee | ||
|
|
a6a44692dc | ||
|
|
12ea28c23e | ||
|
|
ade684dc35 | ||
|
|
4ec6923898 | ||
|
|
e86cd9da96 | ||
|
|
d6db1a27af | ||
|
|
76331f0564 | ||
|
|
7cb6a737a9 | ||
|
|
3659b97563 | ||
|
|
7d72eb809e | ||
|
|
8ba0ae7fa8 | ||
|
|
36350d78d0 | ||
|
|
9b80324d7f | ||
|
|
a549c56faa | ||
|
|
958278c273 | ||
|
|
b7e9bbed0c | ||
|
|
eec3fe967e | ||
|
|
01714757e3 | ||
|
|
ffad67222d | ||
|
|
078586fab0 | ||
|
|
a561dd97a6 | ||
|
|
b9cbcde600 | ||
|
|
36b0709942 | ||
|
|
cf84efbbb9 | ||
|
|
58cd1aba10 | ||
|
|
26a3a8679a | ||
|
|
a1e4c260ea | ||
|
|
f4a50a8fde | ||
|
|
b35ed6346e | ||
|
|
816e5964fb | ||
|
|
3295d0d4b0 | ||
|
|
3e72e2e8dd | ||
|
|
313e501454 | ||
|
|
1f6dbb0917 | ||
|
|
378659c535 | ||
|
|
6be775ad83 | ||
|
|
11f28ac3ac | ||
|
|
5ec589a1de | ||
|
|
4fe3752fae | ||
|
|
c8dd0b99ee | ||
|
|
55ebdfb26b | ||
|
|
d6e0c270d1 | ||
|
|
c4c6195341 | ||
|
|
f1705eccf8 | ||
|
|
44b12fbb7b | ||
|
|
3691451c71 | ||
|
|
b3e4547acd | ||
|
|
bda1becab0 | ||
|
|
dda92fd53d | ||
|
|
d4cbd6cd7d | ||
|
|
2ba4872d2c | ||
|
|
c264402766 | ||
|
|
2c6dd1156c | ||
|
|
eacec9a47e | ||
|
|
0d869c2007 | ||
|
|
ccb2c77c17 | ||
|
|
603679cb18 | ||
|
|
9b78d75b30 | ||
|
|
3a48fd5fbb | ||
|
|
fb13492c89 | ||
|
|
8bdae63036 | ||
|
|
2a4909093e | ||
|
|
9f80b64617 | ||
|
|
3e0e1e4e84 | ||
|
|
86f2c7cced | ||
|
|
73596cff9d | ||
|
|
62c8db561c | ||
|
|
dc4ad2e932 | ||
|
|
fbfd0ed3a4 | ||
|
|
ddefb54c8f | ||
|
|
d6fc627ba5 | ||
|
|
7c0cb61b3c | ||
|
|
9b15976136 | ||
|
|
55106192af | ||
|
|
d18b017cb0 | ||
|
|
f7507447ad | ||
|
|
ff623a731c | ||
|
|
442debdcd4 | ||
|
|
0d7fc95817 | ||
|
|
54ac544f27 | ||
|
|
2c9bf0df6d | ||
|
|
7b1dde1f10 | ||
|
|
5eb1e1bf89 | ||
|
|
6418847fd2 | ||
|
|
2f13d85785 | ||
|
|
6d2fc4e5cb | ||
|
|
f037673655 | ||
|
|
238699221e | ||
|
|
0ae46d71d3 | ||
|
|
9f9a5b8b9b | ||
|
|
21a2bfca16 | ||
|
|
89483e7e89 | ||
|
|
4c3565fb88 | ||
|
|
e1e11c8fbe | ||
|
|
222c989f13 | ||
|
|
838d30510f | ||
|
|
ee76e549fa | ||
|
|
97fceb5f7c | ||
|
|
6dcec79bba | ||
|
|
07dcba74b3 | ||
|
|
839cc5b879 | ||
|
|
d0241ea27d | ||
|
|
20dfc93f3a | ||
|
|
2bd7758ec1 | ||
|
|
806b7e19a3 | ||
|
|
3d1cc3970b | ||
|
|
6a440f0bc9 | ||
|
|
699445f5da | ||
|
|
e3d8c9fcdf | ||
|
|
55d9e48c35 | ||
|
|
96ad701dd0 | ||
|
|
aee0661046 | ||
|
|
227cc02aee | ||
|
|
128880988e | ||
|
|
8d05285a1f | ||
|
|
6a2571ee3d | ||
|
|
94aa90bb64 | ||
|
|
b9a09acff3 | ||
|
|
fd9bf54243 | ||
|
|
d9170093aa | ||
|
|
aca83afeef | ||
|
|
e5d3fbf6dc | ||
|
|
0aaea4eaa0 | ||
|
|
818b28410f | ||
|
|
25db585a23 | ||
|
|
02eed1ec0b | ||
|
|
acd01e15e2 | ||
|
|
fc3a0abf19 | ||
|
|
fa2b9ac466 | ||
|
|
481e224992 | ||
|
|
90c9de70ac | ||
|
|
9d0a0a5459 | ||
|
|
19d0c072d5 | ||
|
|
2b80f4ccc9 | ||
|
|
5795689fd9 | ||
|
|
3e58c6cb3a | ||
|
|
ea89ba5b8d | ||
|
|
5ddd8a0200 | ||
|
|
8b81bfda8f | ||
|
|
491fa0442b | ||
|
|
b508510cab | ||
|
|
469b2af0c0 | ||
|
|
61b3d5d63c | ||
|
|
1e437c9a18 | ||
|
|
efb3fd98c6 | ||
|
|
9ca9311b73 | ||
|
|
8b05717661 | ||
|
|
be45b5f8e7 | ||
|
|
87597a99de | ||
|
|
3ed52a3ded | ||
|
|
dfdf04976e | ||
|
|
f4ba25a3da | ||
|
|
05061544ab | ||
|
|
10566c2d5f | ||
|
|
931c257de7 | ||
|
|
459a88f788 | ||
|
|
c98cf69f40 | ||
|
|
0da0c3a47e | ||
|
|
f19cfce430 | ||
|
|
ca61f2d7df | ||
|
|
1322bee878 | ||
|
|
dda71a464c | ||
|
|
a056c63fd8 | ||
|
|
bf3eb098bd | ||
|
|
67cced1270 |
@@ -7,19 +7,20 @@ description: Guide for performing Chromium version upgrades in the Electron proj
|
|||||||
|
|
||||||
## Summary
|
## Summary
|
||||||
|
|
||||||
Run `e sync --3` repeatedly, fixing patch conflicts as they arise, until it succeeds. Then run `e patches all` and commit changes atomically.
|
Run `e sync --3` repeatedly, fixing patch conflicts as they arise, until it succeeds. Then export patches and commit changes atomically.
|
||||||
|
|
||||||
## Success Criteria
|
## Success Criteria
|
||||||
|
|
||||||
Phase One is complete when:
|
Phase One is complete when:
|
||||||
- `e sync --3` exits with code 0 (no patch failures)
|
- `e sync --3` exits with code 0 (no patch failures)
|
||||||
- `e patches all` has been run to export all changes
|
- All changes are committed per the commit guidelines
|
||||||
- All changes are committed per the commit guidelines below
|
|
||||||
|
|
||||||
Do not stop until these criteria are met.
|
Do not stop until these criteria are met.
|
||||||
|
|
||||||
**CRITICAL** Do not delete or skip patches unless 100% certain the patch is no longer needed. Complicated conflicts or hard to resolve issues should be presented to the user after you have exhausted all other options. Do not delete the patch just because you can't solve it.
|
**CRITICAL** Do not delete or skip patches unless 100% certain the patch is no longer needed. Complicated conflicts or hard to resolve issues should be presented to the user after you have exhausted all other options. Do not delete the patch just because you can't solve it.
|
||||||
|
|
||||||
|
**CRITICAL** Never use `git am --skip` and then manually recreate a patch by making a new commit. This destroys the original patch's authorship, commit message, and position in the series. If `git am --continue` reports "No changes", investigate why — the changes were likely absorbed by a prior conflict resolution's 3-way merge. Present this situation to the user rather than skipping and recreating.
|
||||||
|
|
||||||
## Context
|
## Context
|
||||||
|
|
||||||
The `roller/chromium/main` branch is created by automation to update Electron's Chromium dependency SHA. No work has been done to handle breaking changes between the old and new versions.
|
The `roller/chromium/main` branch is created by automation to update Electron's Chromium dependency SHA. No work has been done to handle breaking changes between the old and new versions.
|
||||||
@@ -30,12 +31,18 @@ The `roller/chromium/main` branch is created by automation to update Electron's
|
|||||||
- `patches/`: Patch files organized by target
|
- `patches/`: Patch files organized by target
|
||||||
- `docs/development/patches.md`: Patch system documentation
|
- `docs/development/patches.md`: Patch system documentation
|
||||||
|
|
||||||
|
## Pre-flight Checks
|
||||||
|
|
||||||
|
Run these once at the start of each upgrade session:
|
||||||
|
|
||||||
|
1. **Clear rerere cache** (if enabled): `git rerere clear` in both the electron and `..` repos. Stale recorded resolutions from a prior attempt can silently apply wrong merges.
|
||||||
|
2. **Ensure pre-commit hooks are installed**: Check that `.git/hooks/pre-commit` exists. If not, run `yarn husky` to install it. The hook runs `lint-staged` which handles clang-format for C++ files.
|
||||||
|
|
||||||
## Workflow
|
## Workflow
|
||||||
|
|
||||||
1. Delete the `.git/rr-cache` in both the `electron` and `..` folder to ensure no accidental rerere replays occur from before this upgrade phase attempt started
|
1. Run `e sync --3` (the `--3` flag enables 3-way merge, always required)
|
||||||
2. Run `e sync --3` (the `--3` flag enables 3-way merge, always required)
|
2. If succeeds → skip to step 5
|
||||||
3. If succeeds → skip to step 6
|
3. If patch fails:
|
||||||
4. If patch fails:
|
|
||||||
- Identify target repo and patch from error output
|
- Identify target repo and patch from error output
|
||||||
- Analyze failure (see references/patch-analysis.md)
|
- Analyze failure (see references/patch-analysis.md)
|
||||||
- Fix conflict in target repo's working directory
|
- Fix conflict in target repo's working directory
|
||||||
@@ -43,10 +50,8 @@ The `roller/chromium/main` branch is created by automation to update Electron's
|
|||||||
- Repeat until all patches for that repo apply
|
- Repeat until all patches for that repo apply
|
||||||
- IMPORTANT: Once `git am --continue` succeeds you MUST run `e patches {target}` to export fixes
|
- IMPORTANT: Once `git am --continue` succeeds you MUST run `e patches {target}` to export fixes
|
||||||
- Return to step 1
|
- Return to step 1
|
||||||
5. When `e sync --3` succeeds, run `e patches all`
|
4. When `e sync --3` succeeds, run `e patches all`
|
||||||
6. **Read `references/phase-one-commit-guidelines.md` NOW**, then commit changes following those instructions exactly.
|
5. **Read `references/phase-one-commit-guidelines.md` NOW**, then commit changes following those instructions exactly.
|
||||||
|
|
||||||
Before committing any Phase One changes, you MUST read `references/phase-one-commit-guidelines.md` and follow its instructions exactly.
|
|
||||||
|
|
||||||
## Commands Reference
|
## Commands Reference
|
||||||
|
|
||||||
@@ -56,6 +61,7 @@ Before committing any Phase One changes, you MUST read `references/phase-one-com
|
|||||||
| `git am --continue` | Continue after resolving conflict (run in target repo) |
|
| `git am --continue` | Continue after resolving conflict (run in target repo) |
|
||||||
| `e patches {target}` | Export commits from target repo to patch files |
|
| `e patches {target}` | Export commits from target repo to patch files |
|
||||||
| `e patches all` | Export all patches from all targets |
|
| `e patches all` | Export all patches from all targets |
|
||||||
|
| `e patches {target} --commit-updates` | Export patches and auto-commit trivial changes |
|
||||||
| `e patches --list-targets` | List targets and config paths |
|
| `e patches --list-targets` | List targets and config paths |
|
||||||
|
|
||||||
## Patch System Mental Model
|
## Patch System Mental Model
|
||||||
@@ -80,25 +86,22 @@ Fix existing patches 99% of the time rather than creating new ones.
|
|||||||
1. **Preserve authorship**: Keep original author in TODO comments (from patch `From:` field)
|
1. **Preserve authorship**: Keep original author in TODO comments (from patch `From:` field)
|
||||||
2. **Never change TODO assignees**: `TODO(name)` must retain original name
|
2. **Never change TODO assignees**: `TODO(name)` must retain original name
|
||||||
3. **Update descriptions**: If upstream changed (e.g., `DCHECK` → `CHECK_IS_TEST`), update patch commit message to reflect current state
|
3. **Update descriptions**: If upstream changed (e.g., `DCHECK` → `CHECK_IS_TEST`), update patch commit message to reflect current state
|
||||||
|
4. **Never skip-and-recreate a patch**: If `git am --continue` says "No changes — did you forget to use 'git add'?", do NOT run `git am --skip` and create a replacement commit. The patch's changes were already absorbed by a prior 3-way merge resolution. This means an earlier conflict resolution pulled in too many changes. Present the situation to the user for guidance — the correct fix may require re-doing an earlier resolution more carefully to keep each patch's changes separate.
|
||||||
## Final Deliverable
|
|
||||||
|
|
||||||
After Phase One, write a summary of every change: what was fixed, why, reasoning, and Chromium CL links.
|
|
||||||
|
|
||||||
# Electron Chromium Upgrade: Phase Two
|
# Electron Chromium Upgrade: Phase Two
|
||||||
|
|
||||||
## Summary
|
## Summary
|
||||||
|
|
||||||
Run `e build -k 999` repeatedly, fixing build issues as they arise, until it succeeds. Then run `e start --version` to validate Electron launches and commit changes atomically.
|
Run `e build -k 999 -- --quiet` repeatedly, fixing build issues as they arise, until it succeeds. Then run `e start --version` to validate Electron launches and commit changes atomically.
|
||||||
|
|
||||||
Run Phase Two immediately after Phase One is complete.
|
Run Phase Two immediately after Phase One is complete.
|
||||||
|
|
||||||
## Success Criteria
|
## Success Criteria
|
||||||
|
|
||||||
Phase Two is complete when:
|
Phase Two is complete when:
|
||||||
- `e build -k 999` exits with code 0 (no build failures)
|
- `e build -k 999 -- --quiet` exits with code 0 (no build failures)
|
||||||
- `e start --version` has been run to check Electron launches
|
- `e start --version` has been run to check Electron launches
|
||||||
- All changes are committed per the commit guidelines below
|
- All changes are committed per the commit guidelines
|
||||||
|
|
||||||
Do not stop until these criteria are met. Do not delete code or features, never comment out code in order to take short cut. Make all existing code, logic and intention work.
|
Do not stop until these criteria are met. Do not delete code or features, never comment out code in order to take short cut. Make all existing code, logic and intention work.
|
||||||
|
|
||||||
@@ -112,8 +115,7 @@ The `roller/chromium/main` branch is created by automation to update Electron's
|
|||||||
|
|
||||||
## Workflow
|
## Workflow
|
||||||
|
|
||||||
1. Run `e build -k 999` (the `-k 999` flag is a flag to ninja to say "do not stop until you find that many errors" it is an attempt to get as much error
|
1. Run `e build -k 999 -- --quiet` (the `--quiet` flag suppresses per-target status lines, showing only errors and the final result)
|
||||||
context as possible for each time we run build)
|
|
||||||
2. If succeeds → skip to step 6
|
2. If succeeds → skip to step 6
|
||||||
3. If build fails:
|
3. If build fails:
|
||||||
- Identify underlying file in "electron" from the compilation error message
|
- Identify underlying file in "electron" from the compilation error message
|
||||||
@@ -126,27 +128,17 @@ The `roller/chromium/main` branch is created by automation to update Electron's
|
|||||||
4. **CRITICAL**: After ANY commit (especially patch commits), immediately run `git status` in the electron repo
|
4. **CRITICAL**: After ANY commit (especially patch commits), immediately run `git status` in the electron repo
|
||||||
- Look for other modified `.patch` files that only have index/hunk header changes
|
- Look for other modified `.patch` files that only have index/hunk header changes
|
||||||
- These are dependent patches affected by your fix
|
- These are dependent patches affected by your fix
|
||||||
- Commit them immediately with: `git commit -am "chore: update patch hunk headers"`
|
- Commit them immediately with: `git commit -am "chore: update patches (trivial only)"`
|
||||||
- This prevents losing track of necessary updates
|
|
||||||
5. Return to step 1
|
5. Return to step 1
|
||||||
6. When `e build` succeeds, run `e start --version`
|
6. When `e build` succeeds, run `e start --version`
|
||||||
7. Check if you have any pending changes in the Chromium repo by running `git status`
|
7. Check if you have any pending changes in the Chromium repo by running `git status`
|
||||||
- If you have changes follow the instructions below in "A. Patch Fixes" to correctly commit those modifications into the appropriate patch file
|
- If you have changes follow the instructions below in "A. Patch Fixes" to correctly commit those modifications into the appropriate patch file
|
||||||
|
|
||||||
Before committing any Phase Two changes, you MUST read `references/phase-two-commit-guidelines.md` and follow its instructions exactly.
|
|
||||||
|
|
||||||
## Build Error Detection
|
|
||||||
|
|
||||||
When monitoring `e build -k 999` output, filter for errors using this regex pattern:
|
|
||||||
error:|FAILED:|fatal:|subcommand failed|build finished
|
|
||||||
|
|
||||||
The build output is extremely verbose. Filtering is essential to catch errors quickly.
|
|
||||||
|
|
||||||
## Commands Reference
|
## Commands Reference
|
||||||
|
|
||||||
| Command | Purpose |
|
| Command | Purpose |
|
||||||
|---------|---------|
|
|---------|---------|
|
||||||
| `e build -k 999` | Builds Electron and won't stop until either all targets attempted or 999 errors found |
|
| `e build -k 999 -- --quiet` | Build Electron, continue on errors, suppress status lines |
|
||||||
| `e build -t {target}.o` | Build just one specific target to verify a fix |
|
| `e build -t {target}.o` | Build just one specific target to verify a fix |
|
||||||
| `e start --version` | Validate Electron launches after successful build |
|
| `e start --version` | Validate Electron launches after successful build |
|
||||||
|
|
||||||
@@ -163,28 +155,21 @@ When the error is in a file that Electron patches (check with `grep -l "filename
|
|||||||
git add <modified-file>
|
git add <modified-file>
|
||||||
git commit --fixup=<original-patch-commit-hash>
|
git commit --fixup=<original-patch-commit-hash>
|
||||||
GIT_SEQUENCE_EDITOR=: git rebase --autosquash --autostash -i <commit>^
|
GIT_SEQUENCE_EDITOR=: git rebase --autosquash --autostash -i <commit>^
|
||||||
3. Export the updated patch: e patches chromium
|
```
|
||||||
4. Commit the updated patch file in the electron repo following the `references/phase-one-commit-guidelines.md`, then commit changes following those instructions exactly. **READ THESE GUIDELINES BEFORE COMMITTING THESE CHANGES**
|
3. Export the updated patch: `e patches chromium`
|
||||||
|
4. Commit the updated patch file following `references/phase-one-commit-guidelines.md`.
|
||||||
|
|
||||||
To find the original patch commit to fixup: `git log --oneline | grep -i "keyword from patch name"`
|
To find the original patch commit to fixup: `git log --oneline | grep -i "keyword from patch name"`
|
||||||
|
|
||||||
The base commit for rebase is the Chromium commit before patches were applied. Find it by checking the `refs/patches/upstream-head` ref.
|
The base commit for rebase is the Chromium commit before patches were applied. Find it by checking the `refs/patches/upstream-head` ref.
|
||||||
|
|
||||||
B. Electron Code Fixes (for files in shell/, electron/, etc.)
|
### B. Electron Code Fixes (for files in shell/, electron/, etc.)
|
||||||
|
|
||||||
When the error is in Electron's own source code:
|
When the error is in Electron's own source code:
|
||||||
|
|
||||||
1. Edit files directly in the electron repo
|
1. Edit files directly in the electron repo
|
||||||
2. Commit directly (no patch export needed)
|
2. Commit directly (no patch export needed)
|
||||||
|
|
||||||
Dependent Patch Updates
|
|
||||||
|
|
||||||
IMPORTANT: When you modify a patch, other patches that apply to the same file may have their hunk headers invalidated. After committing a patch fix:
|
|
||||||
|
|
||||||
1. Run git status in the electron repo
|
|
||||||
2. Look for other modified .patch files with just index/hunk header changes
|
|
||||||
3. Commit these with: git commit -m "chore: update patch hunk headers"
|
|
||||||
|
|
||||||
# Critical: Read Before Committing
|
# Critical: Read Before Committing
|
||||||
|
|
||||||
- Before ANY Phase One commits: Read `references/phase-one-commit-guidelines.md`
|
- Before ANY Phase One commits: Read `references/phase-one-commit-guidelines.md`
|
||||||
@@ -196,4 +181,4 @@ This skill has additional reference files in `references/`:
|
|||||||
- phase-one-commit-guidelines.md - Commit format for Phase One
|
- phase-one-commit-guidelines.md - Commit format for Phase One
|
||||||
- phase-two-commit-guidelines.md - Commit format for Phase Two
|
- phase-two-commit-guidelines.md - Commit format for Phase Two
|
||||||
|
|
||||||
Read these when referenced in the workflow steps.
|
Read these when referenced in the workflow steps.
|
||||||
|
|||||||
@@ -17,6 +17,56 @@
|
|||||||
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/{CL_NUMBER}
|
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/{CL_NUMBER}
|
||||||
```
|
```
|
||||||
|
|
||||||
|
## Critical: Resolve by Intent, Not by Mechanical Merge
|
||||||
|
|
||||||
|
When resolving a patch conflict, do NOT blindly preserve the patch's old code. Instead:
|
||||||
|
|
||||||
|
1. **Understand the upstream CL's full scope** — not just the conflicting hunk.
|
||||||
|
Run `git show <commit> --stat` and read diffs for all affected files.
|
||||||
|
Upstream may have removed structs, members, or methods that the patch
|
||||||
|
references in other hunks or files.
|
||||||
|
|
||||||
|
2. **Re-read the patch commit message** to understand its *intent* — what
|
||||||
|
behavior does it need to preserve or add?
|
||||||
|
|
||||||
|
3. **Implement the intent against the new upstream code.** If the patch's
|
||||||
|
purpose is "add a feature flag guard", add only the guard — don't also
|
||||||
|
restore old code inside the guard that upstream separately removed.
|
||||||
|
|
||||||
|
### Lesson: Upstream Removals Break Patch References
|
||||||
|
|
||||||
|
- **Trigger:** Patch conflict involves an upstream refactor (not just context drift)
|
||||||
|
- **Strategy:** After identifying the upstream CL, check its full diff for
|
||||||
|
removed types, members, and methods. If the patch's old code references
|
||||||
|
something removed, the resolution must use the new upstream mechanism.
|
||||||
|
- **Evidence:** An upstream CL removed a `HeadlessModeWindow` struct from a
|
||||||
|
header, but the conflict was only in a `.mm` file. Mechanically keeping the
|
||||||
|
patch's old line (`headless_mode_window_ = ...`) produced code referencing
|
||||||
|
a nonexistent type — caught only on review, not at patch-apply time.
|
||||||
|
|
||||||
|
### Lesson: Separate Patch Purpose from Patch Implementation
|
||||||
|
|
||||||
|
- **Trigger:** Conflict between "upstream simplified code" vs "patch has older code"
|
||||||
|
- **Strategy:** Identify the *minimal* change the patch needs. If the patch
|
||||||
|
wraps code in a conditional, only add the conditional — don't restore old
|
||||||
|
code that was inside the conditional but was separately cleaned up upstream.
|
||||||
|
- **Evidence:** An occlusion patch needed only a feature flag check, but the
|
||||||
|
old patch also contained a version check that upstream intentionally removed.
|
||||||
|
Mechanically preserving the old patch code re-added the removed check.
|
||||||
|
|
||||||
|
### Lesson: Finish the Adaptation at Conflict Time
|
||||||
|
|
||||||
|
- **Trigger:** A patch conflict involves an upstream API removal or replacement
|
||||||
|
- **Strategy:** When resolving the conflict, fully adapt the patch to use the
|
||||||
|
new API in the same commit. Don't remove the old code and leave behind stale
|
||||||
|
references that will "be fixed in Phase Two." Each patch fix commit should be
|
||||||
|
a complete resolution.
|
||||||
|
- **Evidence:** A safestorage patch conflicted because Chromium removed Keychain V1.
|
||||||
|
The conflict was resolved by removing V1 hunks, but the remaining code still
|
||||||
|
called V1 methods (`FindGenericPassword` with 3 args, `ItemDelete` with
|
||||||
|
`SecKeychainItemRef`). These should have been adapted to V2 APIs in the same
|
||||||
|
commit, not deferred.
|
||||||
|
|
||||||
## Common Failure Patterns
|
## Common Failure Patterns
|
||||||
|
|
||||||
| Pattern | Cause | Solution |
|
| Pattern | Cause | Solution |
|
||||||
|
|||||||
@@ -4,19 +4,65 @@ Only follow these instructions if there are uncommitted changes to `patches/` af
|
|||||||
|
|
||||||
Ignore other instructions about making commit messages, our guidelines are CRITICALLY IMPORTANT and must be followed.
|
Ignore other instructions about making commit messages, our guidelines are CRITICALLY IMPORTANT and must be followed.
|
||||||
|
|
||||||
## Atomic Commits
|
## Each Commit Must Be Complete
|
||||||
|
|
||||||
For each fix made to a patch, create a separate commit:
|
When resolving a patch conflict, fully adapt the patch to the new upstream code in the same commit. If the upstream change removes an API the patch uses, update the patch to use the replacement API now — don't leave stale references knowing they'll need fixing later. The goal is that each commit represents a finished resolution, not a partial one that defers known work to a future phase.
|
||||||
|
|
||||||
|
## Commit Message Style
|
||||||
|
|
||||||
|
**Titles** follow the 60/80-character guideline: simple changes fit within 60 characters, otherwise the limit is 80 characters.
|
||||||
|
|
||||||
|
Always include a `Co-Authored-By` trailer identifying the AI model that assisted (e.g., `Co-Authored-By: <AI model attribution>`).
|
||||||
|
|
||||||
|
### Patch conflict fixes
|
||||||
|
|
||||||
|
Use `fix(patch):` prefix. The title should name the upstream change, not your response to it:
|
||||||
|
|
||||||
```
|
```
|
||||||
fix(patch-conflict): {concise title}
|
fix(patch): {topic headline}
|
||||||
|
|
||||||
{Brief explanation, 1-2 paragraphs max}
|
|
||||||
|
|
||||||
Ref: {Chromium CL link}
|
Ref: {Chromium CL link}
|
||||||
|
|
||||||
|
Co-Authored-By: <AI model attribution>
|
||||||
```
|
```
|
||||||
|
|
||||||
IMPORTANT: Ensure that any changes made to patch content as a result of a change in Chromium is committed individually. Each change should have it's own commit message and it's own REF.
|
Only add a description body if it provides clarity beyond the title. For straightforward context drift or simple API renames, the title + Ref is sufficient.
|
||||||
|
|
||||||
|
Examples:
|
||||||
|
- `fix(patch): constant moved to header`
|
||||||
|
- `fix(patch): headless mode refactor upstream`
|
||||||
|
- `fix(patch): V1 Keychain removal`
|
||||||
|
|
||||||
|
### Upstreamed patch removal
|
||||||
|
|
||||||
|
When patches are no longer needed (applied cleanly with "already applied" or confirmed upstreamed), group ALL removals into a single commit:
|
||||||
|
|
||||||
|
```
|
||||||
|
chore: remove upstreamed patch
|
||||||
|
```
|
||||||
|
|
||||||
|
or (if multiple):
|
||||||
|
|
||||||
|
```
|
||||||
|
chore: remove upstreamed patches
|
||||||
|
```
|
||||||
|
|
||||||
|
If the patch file did NOT contain a `Reviewed-on: https://chromium-review.googlesource.com/c/chromium/...` link, add a `Ref:` in the commit. If it did (i.e. cherry-picks), no `Ref:` is needed.
|
||||||
|
|
||||||
|
### Trivial patch updates
|
||||||
|
|
||||||
|
After all fix commits, stage remaining trivial changes (index, line numbers, context only):
|
||||||
|
|
||||||
|
```bash
|
||||||
|
git add patches
|
||||||
|
git commit -m "chore: update patches (trivial only)"
|
||||||
|
```
|
||||||
|
|
||||||
|
**Conflict resolution can produce trivial results.** A `git am` conflict doesn't always mean the patch content changed — context drift alone can cause a conflict. After resolving and exporting, inspect the patch diff: if only index hashes, line numbers, and context lines changed (not the patch's own `+`/`-` lines), it's trivial and belongs here, not in a `fix(patch):` commit.
|
||||||
|
|
||||||
|
## Atomic Commits
|
||||||
|
|
||||||
|
Each patch conflict fix gets its own commit with its own Ref.
|
||||||
|
|
||||||
IMPORTANT: Try really hard to find the CL reference per the instructions below. Each change you made should in theory have been in response to a change made in Chromium that you identified or can identify. Try for a while to identify and include the ref in the commit message. Do not give up easily.
|
IMPORTANT: Try really hard to find the CL reference per the instructions below. Each change you made should in theory have been in response to a change made in Chromium that you identified or can identify. Try for a while to identify and include the ref in the commit message. Do not give up easily.
|
||||||
|
|
||||||
@@ -30,23 +76,27 @@ Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/XXXXXXX
|
|||||||
|
|
||||||
If no CL found after searching: `Ref: Unable to locate CL`
|
If no CL found after searching: `Ref: Unable to locate CL`
|
||||||
|
|
||||||
## Final Cleanup
|
## Example Commits
|
||||||
|
|
||||||
After all fix commits, stage remaining changes:
|
### Patch conflict fix (simple — title is sufficient)
|
||||||
|
|
||||||
```bash
|
|
||||||
git add patches
|
|
||||||
git commit -m "chore: update patch hunk headers"
|
|
||||||
```
|
|
||||||
|
|
||||||
## Example Commit
|
|
||||||
|
|
||||||
```
|
```
|
||||||
fix(patch-conflict): update web_contents_impl.cc context for navigation refactor
|
fix(patch): constant moved to header
|
||||||
|
|
||||||
The upstream navigation code was refactored to use NavigationRequest directly
|
Ref: https://chromium-review.googlesource.com/c/chromium/src/+/7536483
|
||||||
instead of going through NavigationController. Updated surrounding context
|
|
||||||
to match new code structure.
|
|
||||||
|
|
||||||
Ref: https://chromium-review.googlesource.com/c/chromium/src/+/1234567
|
Co-Authored-By: <AI model attribution>
|
||||||
```
|
```
|
||||||
|
|
||||||
|
### Patch conflict fix (complex — description adds value)
|
||||||
|
|
||||||
|
```
|
||||||
|
fix(patch): V1 Keychain removal
|
||||||
|
|
||||||
|
Upstream deleted the V1 Keychain API. Removed V1 hunks and adapted
|
||||||
|
keychain_password_mac.mm to use KeychainV2 APIs.
|
||||||
|
|
||||||
|
Ref: https://chromium-review.googlesource.com/c/chromium/src/+/7540447
|
||||||
|
|
||||||
|
Co-Authored-By: <AI model attribution>
|
||||||
|
```
|
||||||
|
|||||||
@@ -4,41 +4,37 @@ Only follow these instructions if there are uncommitted changes in the Electron
|
|||||||
|
|
||||||
Ignore other instructions about making commit messages, our guidelines are CRITICALLY IMPORTANT and must be followed.
|
Ignore other instructions about making commit messages, our guidelines are CRITICALLY IMPORTANT and must be followed.
|
||||||
|
|
||||||
|
## Commit Message Style
|
||||||
|
|
||||||
|
**Titles** follow the 60/80-character guideline: simple changes fit within 60 characters, otherwise the limit is 80 characters. Exception: upstream Chromium CL titles are used verbatim even if longer.
|
||||||
|
|
||||||
|
Always include a `Co-Authored-By` trailer identifying the AI model that assisted (e.g., `Co-Authored-By: <AI model attribution>`).
|
||||||
|
|
||||||
## Two Commit Types
|
## Two Commit Types
|
||||||
|
|
||||||
### For Electron Source Changes (shell/, electron/, etc.)
|
### For Electron Source Changes (shell/, electron/, etc.)
|
||||||
|
|
||||||
```
|
```
|
||||||
{CL-Number}: {concise description of API change}
|
{CL-Number}: {upstream CL's original title}
|
||||||
|
|
||||||
{Brief explanation of what upstream changed and how Electron was adapted}
|
|
||||||
|
|
||||||
Ref: {Chromium CL link}
|
Ref: {Chromium CL link}
|
||||||
|
|
||||||
|
Co-Authored-By: <AI model attribution>
|
||||||
```
|
```
|
||||||
|
|
||||||
IMPORTANT: Ensure that any change made to electron as a result of a change in Chromium is committed individually. Each change should have it's own commit message and it's own REF. Logically grouped into commits that make sense rather than one giant commit.
|
Use the **upstream CL's original commit title** — do not paraphrase or rewrite it. To find it: `git log -1 --format=%s <chromium-commit-hash>`.
|
||||||
|
|
||||||
IMPORTANT: Try really hard to find the CL reference per the instructions below. Each change you made should in theory have been in response to a change made in Chromium that you identified or can identify. Try for a while to identify and include the ref in the commit message. Do not give up easily.
|
Only add a description body if it provides clarity beyond what the title already says (e.g., when Electron's adaptation is non-obvious). For simple renames, method additions, or straightforward API updates, the title + Ref link is sufficient.
|
||||||
|
|
||||||
You may include multiple "Ref" links if required.
|
Each change should have its own commit and its own Ref. Logically group into commits that make sense rather than one giant commit. You may include multiple "Ref" links if required.
|
||||||
|
|
||||||
For a CL link in the format `https://chromium-review.googlesource.com/c/chromium/src/+/2958369` the "CL-Number" is `2958369`
|
For a CL link in the format `https://chromium-review.googlesource.com/c/chromium/src/+/2958369` the "CL-Number" is `2958369`.
|
||||||
|
|
||||||
|
IMPORTANT: Try really hard to find the CL reference. Each change you made should in theory have been in response to a change in Chromium. Do not give up easily.
|
||||||
|
|
||||||
### For Patch Updates (patches/chromium/*.patch)
|
### For Patch Updates (patches/chromium/*.patch)
|
||||||
|
|
||||||
Use the same fixup workflow as Phase One:
|
Use the same fixup workflow as Phase One and follow `references/phase-one-commit-guidelines.md` for the commit message format (`fix(patch):` prefix, topic style).
|
||||||
1. Fix in Chromium source tree
|
|
||||||
2. Fixup commit + rebase
|
|
||||||
3. Export with `e patches chromium`
|
|
||||||
4. Commit the patch file:
|
|
||||||
|
|
||||||
```
|
|
||||||
fix(patch-update): {concise description}
|
|
||||||
|
|
||||||
{Brief explanation}
|
|
||||||
|
|
||||||
Ref: {Chromium CL link}
|
|
||||||
```
|
|
||||||
|
|
||||||
## Dependent Patch Header Updates
|
## Dependent Patch Header Updates
|
||||||
|
|
||||||
@@ -46,37 +42,43 @@ After any patch modification, check for other affected patches:
|
|||||||
|
|
||||||
```bash
|
```bash
|
||||||
git status
|
git status
|
||||||
# If other .patch files show as modified with only hunk header changes:
|
# If other .patch files show as modified with only index, line number, and context changes:
|
||||||
git add patches/
|
git add patches/
|
||||||
git commit -m "chore: update patch hunk headers"
|
git commit -m "chore: update patches (trivial only)"
|
||||||
```
|
```
|
||||||
|
|
||||||
## Finding CL References
|
## Finding CL References
|
||||||
|
|
||||||
Use git log or git blame on Chromium source files. Look for:
|
Use git log or git blame on Chromium source files. Look for:
|
||||||
|
|
||||||
|
```
|
||||||
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/XXXXXXX
|
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/XXXXXXX
|
||||||
|
```
|
||||||
|
|
||||||
If no CL found after searching: Ref: Unable to locate CL
|
If no CL found after searching: `Ref: Unable to locate CL`
|
||||||
|
|
||||||
## Example Commits
|
## Example Commits
|
||||||
|
|
||||||
### Electron Source Fix
|
### Electron Source Fix (simple — title is self-explanatory)
|
||||||
|
|
||||||
fix: update GetPlugins to GetPluginsAsync for API change
|
```
|
||||||
|
7535923: Rename ozone buildflags
|
||||||
|
|
||||||
The upstream Chromium API changed:
|
Ref: https://chromium-review.googlesource.com/c/chromium/src/+/7535923
|
||||||
- Old: GetPlugins(callback) - took a callback
|
|
||||||
- New: GetPluginsAsync(callback) - async version takes a callback
|
|
||||||
|
|
||||||
Ref: https://chromium-review.googlesource.com/c/chromium/src/+/1234567
|
Co-Authored-By: <AI model attribution>
|
||||||
|
```
|
||||||
|
|
||||||
### Patch Fix
|
### Electron Source Fix (complex — description adds value)
|
||||||
|
|
||||||
fix(patch-conflict): update picture-in-picture for gesture handling refactor
|
```
|
||||||
|
7534194: Convert some functions in ui::Clipboard to async
|
||||||
|
|
||||||
Upstream added new gesture handling code that accesses live caption dialog.
|
Adapted ExtractCustomPlatformNames calls to use RunLoop pattern
|
||||||
The live caption functionality is disabled in Electron's patch, so wrapped
|
consistent with existing ReadImage implementation, since upstream
|
||||||
the new code in #if 0 guards to match existing pattern.
|
converted the API from synchronous return to callback-based.
|
||||||
|
|
||||||
Ref: https://chromium-review.googlesource.com/c/chromium/src/+/7654321
|
Ref: https://chromium-review.googlesource.com/c/chromium/src/+/7534194
|
||||||
|
|
||||||
|
Co-Authored-By: <AI model attribution>
|
||||||
|
```
|
||||||
|
|||||||
@@ -35,7 +35,7 @@
|
|||||||
"ms-vscode.cpptools",
|
"ms-vscode.cpptools",
|
||||||
"mutantdino.resourcemonitor",
|
"mutantdino.resourcemonitor",
|
||||||
"dsanders11.vscode-electron-build-tools",
|
"dsanders11.vscode-electron-build-tools",
|
||||||
"dbaeumer.vscode-eslint",
|
"oxc.oxc-vscode",
|
||||||
"shakram02.bash-beautify",
|
"shakram02.bash-beautify",
|
||||||
"marshallofsound.gnls-electron"
|
"marshallofsound.gnls-electron"
|
||||||
],
|
],
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ version: '3'
|
|||||||
|
|
||||||
services:
|
services:
|
||||||
buildtools:
|
buildtools:
|
||||||
image: ghcr.io/electron/devcontainer:a82b87d7a4f5ff0cab61405f8151ac4cf4942aeb
|
image: ghcr.io/electron/devcontainer:eac3529546ea8f3aa356d31e345715eef342233b
|
||||||
|
|
||||||
volumes:
|
volumes:
|
||||||
- ..:/workspaces/gclient/src/electron:cached
|
- ..:/workspaces/gclient/src/electron:cached
|
||||||
|
|||||||
@@ -1,79 +0,0 @@
|
|||||||
{
|
|
||||||
"root": true,
|
|
||||||
"extends": "standard",
|
|
||||||
"parser": "@typescript-eslint/parser",
|
|
||||||
"plugins": ["@typescript-eslint"],
|
|
||||||
"env": {
|
|
||||||
"browser": true
|
|
||||||
},
|
|
||||||
"rules": {
|
|
||||||
"semi": ["error", "always"],
|
|
||||||
"no-var": "error",
|
|
||||||
"no-unused-vars": "off",
|
|
||||||
"guard-for-in": "error",
|
|
||||||
"@typescript-eslint/no-unused-vars": ["error", {
|
|
||||||
"vars": "all",
|
|
||||||
"args": "after-used",
|
|
||||||
"ignoreRestSiblings": true
|
|
||||||
}],
|
|
||||||
"prefer-const": ["error", {
|
|
||||||
"destructuring": "all"
|
|
||||||
}],
|
|
||||||
"n/no-callback-literal": "off",
|
|
||||||
"import/newline-after-import": "error",
|
|
||||||
"import/order": ["error", {
|
|
||||||
"alphabetize": {
|
|
||||||
"order": "asc"
|
|
||||||
},
|
|
||||||
"newlines-between": "always",
|
|
||||||
"pathGroups": [
|
|
||||||
{
|
|
||||||
"pattern": "@electron/internal/**",
|
|
||||||
"group": "external",
|
|
||||||
"position": "before"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"pattern": "@electron/**",
|
|
||||||
"group": "external",
|
|
||||||
"position": "before"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"pattern": "{electron,electron/**}",
|
|
||||||
"group": "external",
|
|
||||||
"position": "before"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"pathGroupsExcludedImportTypes": [],
|
|
||||||
"distinctGroup": true,
|
|
||||||
"groups": [
|
|
||||||
"external",
|
|
||||||
"builtin",
|
|
||||||
["sibling", "parent"],
|
|
||||||
"index",
|
|
||||||
"type"
|
|
||||||
]
|
|
||||||
}]
|
|
||||||
},
|
|
||||||
"parserOptions": {
|
|
||||||
"ecmaVersion": 6,
|
|
||||||
"sourceType": "module"
|
|
||||||
},
|
|
||||||
"overrides": [
|
|
||||||
{
|
|
||||||
"files": "*.ts",
|
|
||||||
"rules": {
|
|
||||||
"no-undef": "off",
|
|
||||||
"no-redeclare": "off",
|
|
||||||
"@typescript-eslint/no-redeclare": ["error"],
|
|
||||||
"no-use-before-define": "off"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"files": "*.d.ts",
|
|
||||||
"rules": {
|
|
||||||
"no-useless-constructor": "off",
|
|
||||||
"@typescript-eslint/no-unused-vars": "off"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
1
.github/CODEOWNERS
vendored
1
.github/CODEOWNERS
vendored
@@ -19,6 +19,7 @@ DEPS @electron/wg-upgrades
|
|||||||
/lib/renderer/security-warnings.ts @electron/wg-security
|
/lib/renderer/security-warnings.ts @electron/wg-security
|
||||||
|
|
||||||
# Infra WG
|
# Infra WG
|
||||||
|
/.claude/ @electron/wg-infra
|
||||||
/.github/actions/ @electron/wg-infra
|
/.github/actions/ @electron/wg-infra
|
||||||
/.github/workflows/*-publish.yml @electron/wg-infra
|
/.github/workflows/*-publish.yml @electron/wg-infra
|
||||||
/.github/workflows/build.yml @electron/wg-infra
|
/.github/workflows/build.yml @electron/wg-infra
|
||||||
|
|||||||
2
.github/PULL_REQUEST_TEMPLATE.md
vendored
2
.github/PULL_REQUEST_TEMPLATE.md
vendored
@@ -5,6 +5,8 @@ Thank you for your Pull Request. Please provide a description above and review
|
|||||||
the requirements below.
|
the requirements below.
|
||||||
|
|
||||||
Contributors guide: https://github.com/electron/electron/blob/main/CONTRIBUTING.md
|
Contributors guide: https://github.com/electron/electron/blob/main/CONTRIBUTING.md
|
||||||
|
|
||||||
|
NOTE: PRS submitted without this template will be automatically closed.
|
||||||
-->
|
-->
|
||||||
|
|
||||||
#### Checklist
|
#### Checklist
|
||||||
|
|||||||
66
.github/actions/build-electron/action.yml
vendored
66
.github/actions/build-electron/action.yml
vendored
@@ -47,6 +47,16 @@ runs:
|
|||||||
- name: Add Clang problem matcher
|
- name: Add Clang problem matcher
|
||||||
shell: bash
|
shell: bash
|
||||||
run: echo "::add-matcher::src/electron/.github/problem-matchers/clang.json"
|
run: echo "::add-matcher::src/electron/.github/problem-matchers/clang.json"
|
||||||
|
- name: Download previous object checksums
|
||||||
|
shell: bash
|
||||||
|
if: ${{ (github.event_name == 'push' || github.event_name == 'pull_request') && inputs.is-asan != 'true' }}
|
||||||
|
env:
|
||||||
|
GITHUB_TOKEN: ${{ github.token }}
|
||||||
|
ARTIFACT_NAME: object-checksums.${{ inputs.artifact-platform }}_${{ inputs.target-arch }}.json
|
||||||
|
SEARCH_BRANCH: ${{ case(github.event_name == 'push', github.ref_name, github.event.pull_request.base.ref) }}
|
||||||
|
REPO: ${{ github.repository }}
|
||||||
|
OUTPUT_PATH: src/previous-object-checksums.json
|
||||||
|
run: node src/electron/.github/actions/build-electron/download-previous-object-checksums.mjs
|
||||||
- name: Build Electron ${{ inputs.step-suffix }}
|
- name: Build Electron ${{ inputs.step-suffix }}
|
||||||
if: ${{ inputs.target-platform != 'win' }}
|
if: ${{ inputs.target-platform != 'win' }}
|
||||||
shell: bash
|
shell: bash
|
||||||
@@ -72,12 +82,17 @@ runs:
|
|||||||
cp out/Default/.ninja_log out/electron_ninja_log
|
cp out/Default/.ninja_log out/electron_ninja_log
|
||||||
node electron/script/check-symlinks.js
|
node electron/script/check-symlinks.js
|
||||||
|
|
||||||
# Upload build stats to Datadog
|
# Build stats and object checksums
|
||||||
if ! [ -z $DD_API_KEY ]; then
|
BUILD_STATS_ARGS="out/Default/siso.INFO --out-dir out/Default --output-object-checksums object-checksums.${{ inputs.artifact-platform }}_${{ inputs.target-arch }}.json"
|
||||||
npx node electron/script/build-stats.mjs out/Default/siso.INFO --upload-stats || true
|
if [ -f previous-object-checksums.json ]; then
|
||||||
|
BUILD_STATS_ARGS="$BUILD_STATS_ARGS --input-object-checksums previous-object-checksums.json"
|
||||||
|
fi
|
||||||
|
if ! [ -z "$DD_API_KEY" ]; then
|
||||||
|
BUILD_STATS_ARGS="$BUILD_STATS_ARGS --upload-stats"
|
||||||
else
|
else
|
||||||
echo "Skipping build-stats.mjs upload because DD_API_KEY is not set"
|
echo "Skipping build-stats.mjs upload because DD_API_KEY is not set"
|
||||||
fi
|
fi
|
||||||
|
node electron/script/build-stats.mjs $BUILD_STATS_ARGS || true
|
||||||
- name: Build Electron (Windows) ${{ inputs.step-suffix }}
|
- name: Build Electron (Windows) ${{ inputs.step-suffix }}
|
||||||
if: ${{ inputs.target-platform == 'win' }}
|
if: ${{ inputs.target-platform == 'win' }}
|
||||||
shell: powershell
|
shell: powershell
|
||||||
@@ -95,16 +110,21 @@ runs:
|
|||||||
Copy-Item out\Default\.ninja_log out\electron_ninja_log
|
Copy-Item out\Default\.ninja_log out\electron_ninja_log
|
||||||
node electron\script\check-symlinks.js
|
node electron\script\check-symlinks.js
|
||||||
|
|
||||||
# Upload build stats to Datadog
|
# Build stats and object checksums
|
||||||
|
$statsArgs = @("out\Default\siso.exe.INFO", "--out-dir", "out\Default", "--output-object-checksums", "object-checksums.${{ inputs.artifact-platform }}_${{ inputs.target-arch }}.json")
|
||||||
|
if (Test-Path previous-object-checksums.json) {
|
||||||
|
$statsArgs += @("--input-object-checksums", "previous-object-checksums.json")
|
||||||
|
}
|
||||||
if ($env:DD_API_KEY) {
|
if ($env:DD_API_KEY) {
|
||||||
try {
|
$statsArgs += "--upload-stats"
|
||||||
npx node electron\script\build-stats.mjs out\Default\siso.exe.INFO --upload-stats
|
|
||||||
} catch {
|
|
||||||
Write-Host "Build stats upload failed, continuing..."
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
Write-Host "Skipping build-stats.mjs upload because DD_API_KEY is not set"
|
Write-Host "Skipping build-stats.mjs upload because DD_API_KEY is not set"
|
||||||
}
|
}
|
||||||
|
try {
|
||||||
|
& node electron\script\build-stats.mjs @statsArgs ; $LASTEXITCODE = 0
|
||||||
|
} catch {
|
||||||
|
Write-Host "Build stats failed, continuing..."
|
||||||
|
}
|
||||||
- name: Verify dist.zip ${{ inputs.step-suffix }}
|
- name: Verify dist.zip ${{ inputs.step-suffix }}
|
||||||
shell: bash
|
shell: bash
|
||||||
run: |
|
run: |
|
||||||
@@ -128,6 +148,9 @@ runs:
|
|||||||
fi
|
fi
|
||||||
sed $SEDOPTION '/.*builtins-pgo/d' out/Default/mksnapshot_args
|
sed $SEDOPTION '/.*builtins-pgo/d' out/Default/mksnapshot_args
|
||||||
sed $SEDOPTION '/--turbo-profiling-input/d' out/Default/mksnapshot_args
|
sed $SEDOPTION '/--turbo-profiling-input/d' out/Default/mksnapshot_args
|
||||||
|
sed $SEDOPTION '/--reorder-builtins/d' out/Default/mksnapshot_args
|
||||||
|
sed $SEDOPTION '/--warn-about-builtin-profile-data/d' out/Default/mksnapshot_args
|
||||||
|
sed $SEDOPTION '/--abort-on-bad-builtin-profile-data/d' out/Default/mksnapshot_args
|
||||||
|
|
||||||
if [ "${{ inputs.target-platform }}" = "win" ]; then
|
if [ "${{ inputs.target-platform }}" = "win" ]; then
|
||||||
cd out/Default
|
cd out/Default
|
||||||
@@ -205,7 +228,17 @@ runs:
|
|||||||
if: ${{ inputs.is-release == 'true' }}
|
if: ${{ inputs.is-release == 'true' }}
|
||||||
run: |
|
run: |
|
||||||
cd src
|
cd src
|
||||||
gn gen out/ffmpeg --args="import(\"//electron/build/args/ffmpeg.gn\") use_remoteexec=true use_siso=true $GN_EXTRA_ARGS"
|
# Reuse the hermetic mac_sdk_path that `e build` wrote for out/Default so
|
||||||
|
# out/ffmpeg builds against the same SDK instead of the runner's system Xcode.
|
||||||
|
# The path has to live under root_build_dir, so copy the symlink tree and
|
||||||
|
# rewrite Default -> ffmpeg.
|
||||||
|
MAC_SDK_ARG=""
|
||||||
|
if [ "$(uname)" = "Darwin" ]; then
|
||||||
|
mkdir -p out/ffmpeg
|
||||||
|
cp -a out/Default/xcode_links out/ffmpeg/
|
||||||
|
MAC_SDK_ARG=$(sed -n 's|^\(mac_sdk_path = "//out/\)Default/|\1ffmpeg/|p' out/Default/args.gn)
|
||||||
|
fi
|
||||||
|
gn gen out/ffmpeg --args="import(\"//electron/build/args/ffmpeg.gn\") use_remoteexec=true use_siso=true $MAC_SDK_ARG $GN_EXTRA_ARGS"
|
||||||
e build --target electron:electron_ffmpeg_zip -C ../../out/ffmpeg
|
e build --target electron:electron_ffmpeg_zip -C ../../out/ffmpeg
|
||||||
- name: Remove Clang problem matcher
|
- name: Remove Clang problem matcher
|
||||||
shell: bash
|
shell: bash
|
||||||
@@ -274,18 +307,25 @@ runs:
|
|||||||
run: ./src/electron/script/actions/move-artifacts.sh
|
run: ./src/electron/script/actions/move-artifacts.sh
|
||||||
- name: Upload Generated Artifacts ${{ inputs.step-suffix }}
|
- name: Upload Generated Artifacts ${{ inputs.step-suffix }}
|
||||||
if: always() && !cancelled()
|
if: always() && !cancelled()
|
||||||
uses: actions/upload-artifact@65462800fd760344b1a7b4382951275a0abb4808
|
uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f #v7.0.0
|
||||||
with:
|
with:
|
||||||
name: generated_artifacts_${{ env.ARTIFACT_KEY }}
|
name: generated_artifacts_${{ env.ARTIFACT_KEY }}
|
||||||
path: ./generated_artifacts_${{ inputs.artifact-platform }}_${{ inputs.target-arch }}
|
path: ./generated_artifacts_${{ inputs.artifact-platform }}_${{ inputs.target-arch }}
|
||||||
- name: Upload Src Artifacts ${{ inputs.step-suffix }}
|
- name: Upload Src Artifacts ${{ inputs.step-suffix }}
|
||||||
uses: actions/upload-artifact@65462800fd760344b1a7b4382951275a0abb4808
|
uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f #v7.0.0
|
||||||
with:
|
with:
|
||||||
name: src_artifacts_${{ env.ARTIFACT_KEY }}
|
name: src_artifacts_${{ env.ARTIFACT_KEY }}
|
||||||
path: ./src_artifacts_${{ inputs.artifact-platform }}_${{ inputs.target-arch }}
|
path: ./src_artifacts_${{ inputs.artifact-platform }}_${{ inputs.target-arch }}
|
||||||
- name: Upload Out Gen Artifacts ${{ inputs.step-suffix }}
|
- name: Upload Out Gen Artifacts ${{ inputs.step-suffix }}
|
||||||
if: ${{ inputs.upload-out-gen-artifacts == 'true' }}
|
if: ${{ inputs.upload-out-gen-artifacts == 'true' }}
|
||||||
uses: actions/upload-artifact@65462800fd760344b1a7b4382951275a0abb4808
|
uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f #v7.0.0
|
||||||
with:
|
with:
|
||||||
name: out_gen_artifacts_${{ env.ARTIFACT_KEY }}
|
name: out_gen_artifacts_${{ env.ARTIFACT_KEY }}
|
||||||
path: ./src/out/Default/gen
|
path: ./src/out/Default/gen
|
||||||
|
- name: Upload Object Checksums ${{ inputs.step-suffix }}
|
||||||
|
if: ${{ always() && !cancelled() && inputs.is-asan != 'true' }}
|
||||||
|
uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0
|
||||||
|
with:
|
||||||
|
name: object_checksums_${{ inputs.artifact-platform }}_${{ inputs.target-arch }}
|
||||||
|
path: ./src/object-checksums.${{ inputs.artifact-platform }}_${{ inputs.target-arch }}.json
|
||||||
|
archive: false
|
||||||
|
|||||||
82
.github/actions/build-electron/download-previous-object-checksums.mjs
vendored
Normal file
82
.github/actions/build-electron/download-previous-object-checksums.mjs
vendored
Normal file
@@ -0,0 +1,82 @@
|
|||||||
|
import { Octokit } from '@octokit/rest';
|
||||||
|
|
||||||
|
import { writeFileSync } from 'node:fs';
|
||||||
|
|
||||||
|
const token = process.env.GITHUB_TOKEN;
|
||||||
|
const repo = process.env.REPO;
|
||||||
|
const artifactName = process.env.ARTIFACT_NAME;
|
||||||
|
const branch = process.env.SEARCH_BRANCH;
|
||||||
|
const outputPath = process.env.OUTPUT_PATH;
|
||||||
|
|
||||||
|
const required = { GITHUB_TOKEN: token, REPO: repo, ARTIFACT_NAME: artifactName, SEARCH_BRANCH: branch, OUTPUT_PATH: outputPath };
|
||||||
|
const missing = Object.entries(required).filter(([, v]) => !v).map(([k]) => k);
|
||||||
|
if (missing.length > 0) {
|
||||||
|
console.error(`Missing required environment variables: ${missing.join(', ')}`);
|
||||||
|
process.exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
const [owner, repoName] = repo.split('/');
|
||||||
|
const octokit = new Octokit({ auth: token });
|
||||||
|
|
||||||
|
async function main () {
|
||||||
|
console.log(`Searching for artifact '${artifactName}' on branch '${branch}'...`);
|
||||||
|
|
||||||
|
// Resolve the "Build" workflow name to an ID, mirroring how `gh run list --workflow` works
|
||||||
|
// under the hood (it uses /repos/{owner}/{repo}/actions/workflows/{id}/runs).
|
||||||
|
const { data: workflows } = await octokit.actions.listRepoWorkflows({ owner, repo: repoName });
|
||||||
|
const buildWorkflow = workflows.workflows.find((w) => w.name === 'Build');
|
||||||
|
if (!buildWorkflow) {
|
||||||
|
console.log('Could not find "Build" workflow, continuing without previous checksums');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const { data: runs } = await octokit.actions.listWorkflowRuns({
|
||||||
|
owner,
|
||||||
|
repo: repoName,
|
||||||
|
workflow_id: buildWorkflow.id,
|
||||||
|
branch,
|
||||||
|
status: 'completed',
|
||||||
|
event: 'push',
|
||||||
|
per_page: 20,
|
||||||
|
exclude_pull_requests: true
|
||||||
|
});
|
||||||
|
|
||||||
|
for (const run of runs.workflow_runs) {
|
||||||
|
const { data: artifacts } = await octokit.actions.listWorkflowRunArtifacts({
|
||||||
|
owner,
|
||||||
|
repo: repoName,
|
||||||
|
run_id: run.id,
|
||||||
|
name: artifactName
|
||||||
|
});
|
||||||
|
|
||||||
|
if (artifacts.artifacts.length > 0) {
|
||||||
|
const artifact = artifacts.artifacts[0];
|
||||||
|
console.log(`Found artifact in run ${run.id} (artifact ID: ${artifact.id}), downloading...`);
|
||||||
|
|
||||||
|
// Non-archived artifacts are still downloaded from the /zip endpoint
|
||||||
|
const response = await octokit.actions.downloadArtifact({
|
||||||
|
owner,
|
||||||
|
repo: repoName,
|
||||||
|
artifact_id: artifact.id,
|
||||||
|
archive_format: 'zip'
|
||||||
|
});
|
||||||
|
|
||||||
|
if (response.headers['content-type'] !== 'application/json') {
|
||||||
|
console.error(`Unexpected content type for artifact download: ${response.headers['content-type']}`);
|
||||||
|
console.error('Expected application/json, continuing without previous checksums');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
writeFileSync(outputPath, JSON.stringify(response.data));
|
||||||
|
console.log('Downloaded previous object checksums successfully');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
console.log(`No previous object checksums found in last ${runs.workflow_runs.length} runs, continuing without them`);
|
||||||
|
}
|
||||||
|
|
||||||
|
main().catch((err) => {
|
||||||
|
console.error('Failed to download previous object checksums, continuing without them:', err.message);
|
||||||
|
process.exit(0);
|
||||||
|
});
|
||||||
30
.github/actions/checkout/action.yml
vendored
30
.github/actions/checkout/action.yml
vendored
@@ -28,7 +28,7 @@ runs:
|
|||||||
shell: bash
|
shell: bash
|
||||||
run: |
|
run: |
|
||||||
node src/electron/script/generate-deps-hash.js
|
node src/electron/script/generate-deps-hash.js
|
||||||
DEPSHASH="v1-src-cache-$(cat src/electron/.depshash)"
|
DEPSHASH="v2-src-cache-$(cat src/electron/.depshash)"
|
||||||
echo "DEPSHASH=$DEPSHASH" >> $GITHUB_ENV
|
echo "DEPSHASH=$DEPSHASH" >> $GITHUB_ENV
|
||||||
echo "CACHE_FILE=$DEPSHASH.tar" >> $GITHUB_ENV
|
echo "CACHE_FILE=$DEPSHASH.tar" >> $GITHUB_ENV
|
||||||
if [ "${{ inputs.target-platform }}" = "win" ]; then
|
if [ "${{ inputs.target-platform }}" = "win" ]; then
|
||||||
@@ -43,7 +43,7 @@ runs:
|
|||||||
curl --unix-socket /var/run/sas/sas.sock --fail "http://foo/$CACHE_FILE?platform=${{ inputs.target-platform }}&getAccountName=true" > sas-token
|
curl --unix-socket /var/run/sas/sas.sock --fail "http://foo/$CACHE_FILE?platform=${{ inputs.target-platform }}&getAccountName=true" > sas-token
|
||||||
- name: Save SAS Key
|
- name: Save SAS Key
|
||||||
if: ${{ inputs.generate-sas-token == 'true' }}
|
if: ${{ inputs.generate-sas-token == 'true' }}
|
||||||
uses: actions/cache/save@5a3ec84eff668545956fd18022155c47e93e2684 # v4.2.3
|
uses: actions/cache/save@668228422ae6a00e4ad889ee87cd7109ec5666a7 # v5.0.4
|
||||||
with:
|
with:
|
||||||
path: sas-token
|
path: sas-token
|
||||||
key: sas-key-${{ inputs.target-platform }}-${{ github.run_number }}-${{ github.run_attempt }}
|
key: sas-key-${{ inputs.target-platform }}-${{ github.run_number }}-${{ github.run_attempt }}
|
||||||
@@ -109,7 +109,7 @@ runs:
|
|||||||
echo "target_os=['$TARGET_OS']" >> ./.gclient
|
echo "target_os=['$TARGET_OS']" >> ./.gclient
|
||||||
fi
|
fi
|
||||||
|
|
||||||
ELECTRON_USE_THREE_WAY_MERGE_FOR_PATCHES=1 e d gclient sync --with_branch_heads --with_tags -vv
|
ELECTRON_DEPOT_TOOLS_WIN_TOOLCHAIN=0 DEPOT_TOOLS_WIN_TOOLCHAIN=0 ELECTRON_USE_THREE_WAY_MERGE_FOR_PATCHES=1 e d gclient sync --with_branch_heads --with_tags
|
||||||
if [[ "${{ inputs.is-release }}" != "true" ]]; then
|
if [[ "${{ inputs.is-release }}" != "true" ]]; then
|
||||||
# Re-export all the patches to check if there were changes.
|
# Re-export all the patches to check if there were changes.
|
||||||
python3 src/electron/script/export_all_patches.py src/electron/patches/config.json
|
python3 src/electron/script/export_all_patches.py src/electron/patches/config.json
|
||||||
@@ -187,21 +187,35 @@ runs:
|
|||||||
shell: bash
|
shell: bash
|
||||||
run: |
|
run: |
|
||||||
echo "Uncompressed src size: $(du -sh src | cut -f1 -d' ')"
|
echo "Uncompressed src size: $(du -sh src | cut -f1 -d' ')"
|
||||||
tar -cf $CACHE_FILE src
|
# Named .tar but zstd-compressed; the sas-sidecar's filename allowlist
|
||||||
|
# only permits .tar/.tgz so we keep the extension and decode on restore.
|
||||||
|
tar -cf - src | zstd -T0 --long=30 -f -o $CACHE_FILE
|
||||||
echo "Compressed src to $(du -sh $CACHE_FILE | cut -f1 -d' ')"
|
echo "Compressed src to $(du -sh $CACHE_FILE | cut -f1 -d' ')"
|
||||||
cp ./$CACHE_FILE $CACHE_DRIVE/
|
|
||||||
- name: Persist Src Cache
|
- name: Persist Src Cache
|
||||||
if: ${{ steps.check-cache.outputs.cache_exists == 'false' && inputs.use-cache == 'true' }}
|
if: ${{ steps.check-cache.outputs.cache_exists == 'false' && inputs.use-cache == 'true' }}
|
||||||
shell: bash
|
shell: bash
|
||||||
run: |
|
run: |
|
||||||
final_cache_path=$CACHE_DRIVE/$CACHE_FILE
|
final_cache_path=$CACHE_DRIVE/$CACHE_FILE
|
||||||
|
# Upload to a run-unique temp name first so concurrent readers never
|
||||||
|
# observe a partially-written file, and an interrupted copy can't leave
|
||||||
|
# a truncated file at the final path. Orphaned temp files get swept by
|
||||||
|
# the clean-orphaned-cache-uploads workflow.
|
||||||
|
tmp_cache_path=$final_cache_path.upload-${GITHUB_RUN_ID}-${GITHUB_RUN_ATTEMPT}
|
||||||
|
echo "Uploading to temp path: $tmp_cache_path"
|
||||||
|
cp ./$CACHE_FILE $tmp_cache_path
|
||||||
|
|
||||||
echo "Using cache key: $DEPSHASH"
|
echo "Using cache key: $DEPSHASH"
|
||||||
echo "Checking path: $final_cache_path"
|
if [ -f "$final_cache_path" ]; then
|
||||||
|
echo "Cache already persisted at $final_cache_path by a concurrent run; discarding ours"
|
||||||
|
rm -f $tmp_cache_path
|
||||||
|
else
|
||||||
|
mv -f $tmp_cache_path $final_cache_path
|
||||||
|
echo "Cache key persisted in $final_cache_path"
|
||||||
|
fi
|
||||||
|
|
||||||
if [ ! -f "$final_cache_path" ]; then
|
if [ ! -f "$final_cache_path" ]; then
|
||||||
echo "Cache key not found"
|
echo "Cache key not found"
|
||||||
exit 1
|
exit 1
|
||||||
else
|
|
||||||
echo "Cache key persisted in $final_cache_path"
|
|
||||||
fi
|
fi
|
||||||
- name: Wait for active SSH sessions
|
- name: Wait for active SSH sessions
|
||||||
shell: bash
|
shell: bash
|
||||||
|
|||||||
38
.github/actions/cipd-install/action.yml
vendored
38
.github/actions/cipd-install/action.yml
vendored
@@ -22,30 +22,50 @@ runs:
|
|||||||
steps:
|
steps:
|
||||||
- name: Delete wrong ${{ inputs.dependency }}
|
- name: Delete wrong ${{ inputs.dependency }}
|
||||||
shell: bash
|
shell: bash
|
||||||
|
env:
|
||||||
|
CIPD_ROOT_PREFIX: ${{ inputs.cipd-root-prefix-path }}
|
||||||
|
INSTALLATION_DIR: ${{ inputs.installation-dir }}
|
||||||
run : |
|
run : |
|
||||||
rm -rf ${{ inputs.cipd-root-prefix-path }}${{ inputs.installation-dir }}
|
rm -rf "${CIPD_ROOT_PREFIX}${INSTALLATION_DIR}"
|
||||||
- name: Create ensure file for ${{ inputs.dependency }}
|
- name: Create ensure file for ${{ inputs.dependency }}
|
||||||
if: ${{ inputs.dependency-version == '' }}
|
if: ${{ inputs.dependency-version == '' }}
|
||||||
shell: bash
|
shell: bash
|
||||||
|
env:
|
||||||
|
PACKAGE: ${{ inputs.package }}
|
||||||
|
DEPS_FILE: ${{ inputs.deps-file }}
|
||||||
|
INSTALLATION_DIR: ${{ inputs.installation-dir }}
|
||||||
|
DEPENDENCY: ${{ inputs.dependency }}
|
||||||
run: |
|
run: |
|
||||||
echo '${{ inputs.package }}' `e d gclient getdep --deps-file=${{ inputs.deps-file }} -r '${{ inputs.installation-dir }}:${{ inputs.package }}'` > ${{ inputs.dependency }}_ensure_file
|
echo "$PACKAGE" $(e d gclient getdep --deps-file="$DEPS_FILE" -r "${INSTALLATION_DIR}:${PACKAGE}") > "${DEPENDENCY}_ensure_file"
|
||||||
cat ${{ inputs.dependency }}_ensure_file
|
cat "${DEPENDENCY}_ensure_file"
|
||||||
|
|
||||||
- name: Create ensure file for ${{ inputs.dependency }} from dependency-version
|
- name: Create ensure file for ${{ inputs.dependency }} from dependency-version
|
||||||
if: ${{ inputs.dependency-version != '' }}
|
if: ${{ inputs.dependency-version != '' }}
|
||||||
shell: bash
|
shell: bash
|
||||||
|
env:
|
||||||
|
PACKAGE: ${{ inputs.package }}
|
||||||
|
DEPENDENCY_VERSION: ${{ inputs.dependency-version }}
|
||||||
|
DEPENDENCY: ${{ inputs.dependency }}
|
||||||
run: |
|
run: |
|
||||||
echo '${{ inputs.package }} ${{ inputs.dependency-version }}' > ${{ inputs.dependency }}_ensure_file
|
echo "$PACKAGE $DEPENDENCY_VERSION" > "${DEPENDENCY}_ensure_file"
|
||||||
cat ${{ inputs.dependency }}_ensure_file
|
cat "${DEPENDENCY}_ensure_file"
|
||||||
- name: CIPD installation of ${{ inputs.dependency }} (macOS)
|
- name: CIPD installation of ${{ inputs.dependency }} (macOS)
|
||||||
if: ${{ inputs.target-platform != 'win' }}
|
if: ${{ inputs.target-platform != 'win' }}
|
||||||
shell: bash
|
shell: bash
|
||||||
|
env:
|
||||||
|
CIPD_ROOT_PREFIX: ${{ inputs.cipd-root-prefix-path }}
|
||||||
|
INSTALLATION_DIR: ${{ inputs.installation-dir }}
|
||||||
|
DEPENDENCY: ${{ inputs.dependency }}
|
||||||
run: |
|
run: |
|
||||||
echo "ensuring ${{ inputs.dependency }}"
|
echo "ensuring $DEPENDENCY"
|
||||||
e d cipd ensure --root ${{ inputs.cipd-root-prefix-path }}${{ inputs.installation-dir }} -ensure-file ${{ inputs.dependency }}_ensure_file
|
e d cipd ensure --root "${CIPD_ROOT_PREFIX}${INSTALLATION_DIR}" -ensure-file "${DEPENDENCY}_ensure_file"
|
||||||
- name: CIPD installation of ${{ inputs.dependency }} (Windows)
|
- name: CIPD installation of ${{ inputs.dependency }} (Windows)
|
||||||
if: ${{ inputs.target-platform == 'win' }}
|
if: ${{ inputs.target-platform == 'win' }}
|
||||||
shell: powershell
|
shell: powershell
|
||||||
|
env:
|
||||||
|
CIPD_ROOT_PREFIX: ${{ inputs.cipd-root-prefix-path }}
|
||||||
|
INSTALLATION_DIR: ${{ inputs.installation-dir }}
|
||||||
|
DEPENDENCY: ${{ inputs.dependency }}
|
||||||
run: |
|
run: |
|
||||||
echo "ensuring ${{ inputs.dependency }} on Windows"
|
echo "ensuring $env:DEPENDENCY on Windows"
|
||||||
e d cipd ensure --root ${{ inputs.cipd-root-prefix-path }}${{ inputs.installation-dir }} -ensure-file ${{ inputs.dependency }}_ensure_file
|
e d cipd ensure --root "$env:CIPD_ROOT_PREFIX$env:INSTALLATION_DIR" -ensure-file "$($env:DEPENDENCY)_ensure_file"
|
||||||
|
|||||||
1
.github/actions/fix-sync/action.yml
vendored
1
.github/actions/fix-sync/action.yml
vendored
@@ -27,6 +27,7 @@ runs:
|
|||||||
python3 src/tools/clang/scripts/update.py
|
python3 src/tools/clang/scripts/update.py
|
||||||
# Refs https://chromium-review.googlesource.com/c/chromium/src/+/6667681
|
# Refs https://chromium-review.googlesource.com/c/chromium/src/+/6667681
|
||||||
python3 src/tools/clang/scripts/update.py --package objdump
|
python3 src/tools/clang/scripts/update.py --package objdump
|
||||||
|
python3 src/tools/clang/scripts/update.py --package clang-tidy
|
||||||
- name: Fix esbuild
|
- name: Fix esbuild
|
||||||
if: ${{ inputs.target-platform != 'linux' }}
|
if: ${{ inputs.target-platform != 'linux' }}
|
||||||
uses: ./src/electron/.github/actions/cipd-install
|
uses: ./src/electron/.github/actions/cipd-install
|
||||||
|
|||||||
@@ -15,7 +15,7 @@ runs:
|
|||||||
git config --global core.preloadindex true
|
git config --global core.preloadindex true
|
||||||
git config --global core.longpaths true
|
git config --global core.longpaths true
|
||||||
fi
|
fi
|
||||||
export BUILD_TOOLS_SHA=4430e4a505e0f4fa2a41b707a10a36f780bbdd26
|
export BUILD_TOOLS_SHA=1b7bd25dae4a780bb3170fff56c9327b53aaf7eb
|
||||||
npm i -g @electron/build-tools
|
npm i -g @electron/build-tools
|
||||||
# Update depot_tools to ensure python
|
# Update depot_tools to ensure python
|
||||||
e d update_depot_tools
|
e d update_depot_tools
|
||||||
@@ -29,4 +29,4 @@ runs:
|
|||||||
else
|
else
|
||||||
echo "$HOME/.electron_build_tools/third_party/depot_tools" >> $GITHUB_PATH
|
echo "$HOME/.electron_build_tools/third_party/depot_tools" >> $GITHUB_PATH
|
||||||
echo "$HOME/.electron_build_tools/third_party/depot_tools/python-bin" >> $GITHUB_PATH
|
echo "$HOME/.electron_build_tools/third_party/depot_tools/python-bin" >> $GITHUB_PATH
|
||||||
fi
|
fi
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ runs:
|
|||||||
shell: bash
|
shell: bash
|
||||||
id: yarn-cache-dir-path
|
id: yarn-cache-dir-path
|
||||||
run: echo "dir=$(node src/electron/script/yarn.js config get cacheFolder)" >> $GITHUB_OUTPUT
|
run: echo "dir=$(node src/electron/script/yarn.js config get cacheFolder)" >> $GITHUB_OUTPUT
|
||||||
- uses: actions/cache@5a3ec84eff668545956fd18022155c47e93e2684 # v4.2.3
|
- uses: actions/cache@668228422ae6a00e4ad889ee87cd7109ec5666a7 # v5.0.4
|
||||||
id: yarn-cache
|
id: yarn-cache
|
||||||
with:
|
with:
|
||||||
path: ${{ steps.yarn-cache-dir-path.outputs.dir }}
|
path: ${{ steps.yarn-cache-dir-path.outputs.dir }}
|
||||||
|
|||||||
2
.github/actions/restore-cache-aks/action.yml
vendored
2
.github/actions/restore-cache-aks/action.yml
vendored
@@ -31,7 +31,7 @@ runs:
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
mkdir temp-cache
|
mkdir temp-cache
|
||||||
tar -xf $cache_path -C temp-cache
|
zstd -d --long=30 -c $cache_path | tar -xf - -C temp-cache
|
||||||
echo "Unzipped cache is $(du -sh temp-cache/src | cut -f1)"
|
echo "Unzipped cache is $(du -sh temp-cache/src | cut -f1)"
|
||||||
|
|
||||||
if [ -d "temp-cache/src" ]; then
|
if [ -d "temp-cache/src" ]; then
|
||||||
|
|||||||
33
.github/actions/restore-cache-azcopy/action.yml
vendored
33
.github/actions/restore-cache-azcopy/action.yml
vendored
@@ -8,14 +8,14 @@ runs:
|
|||||||
steps:
|
steps:
|
||||||
- name: Obtain SAS Key
|
- name: Obtain SAS Key
|
||||||
continue-on-error: true
|
continue-on-error: true
|
||||||
uses: actions/cache/restore@5a3ec84eff668545956fd18022155c47e93e2684 # v4.2.3
|
uses: actions/cache/restore@668228422ae6a00e4ad889ee87cd7109ec5666a7 # v5.0.4
|
||||||
with:
|
with:
|
||||||
path: sas-token
|
path: sas-token
|
||||||
key: sas-key-${{ inputs.target-platform }}-${{ github.run_number }}-1
|
key: sas-key-${{ inputs.target-platform }}-${{ github.run_number }}-1
|
||||||
enableCrossOsArchive: true
|
enableCrossOsArchive: true
|
||||||
- name: Obtain SAS Key
|
- name: Obtain SAS Key
|
||||||
continue-on-error: true
|
continue-on-error: true
|
||||||
uses: actions/cache/restore@5a3ec84eff668545956fd18022155c47e93e2684 # v4.2.3
|
uses: actions/cache/restore@668228422ae6a00e4ad889ee87cd7109ec5666a7 # v5.0.4
|
||||||
with:
|
with:
|
||||||
path: sas-token
|
path: sas-token
|
||||||
key: sas-key-${{ inputs.target-platform }}-${{ github.run_number }}-${{ github.run_attempt }}
|
key: sas-key-${{ inputs.target-platform }}-${{ github.run_number }}-${{ github.run_attempt }}
|
||||||
@@ -24,7 +24,7 @@ runs:
|
|||||||
# The cache will always exist here as a result of the checkout job
|
# The cache will always exist here as a result of the checkout job
|
||||||
# Either it was uploaded to Azure in the checkout job for this commit
|
# Either it was uploaded to Azure in the checkout job for this commit
|
||||||
# or it was uploaded in the checkout job for a previous commit.
|
# or it was uploaded in the checkout job for a previous commit.
|
||||||
uses: nick-fields/retry@7152eba30c6575329ac0576536151aca5a72780e # v3.0.0
|
uses: nick-fields/retry@ad984534de44a9489a53aefd81eb77f87c70dc60 # v4.0.0
|
||||||
with:
|
with:
|
||||||
timeout_minutes: 30
|
timeout_minutes: 30
|
||||||
max_attempts: 3
|
max_attempts: 3
|
||||||
@@ -61,9 +61,9 @@ runs:
|
|||||||
echo "Cache is empty - exiting"
|
echo "Cache is empty - exiting"
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
mkdir temp-cache
|
mkdir temp-cache
|
||||||
tar -xf $DEPSHASH.tar -C temp-cache
|
zstd -d --long=30 -c $DEPSHASH.tar | tar -xf - -C temp-cache
|
||||||
echo "Unzipped cache is $(du -sh temp-cache/src | cut -f1)"
|
echo "Unzipped cache is $(du -sh temp-cache/src | cut -f1)"
|
||||||
|
|
||||||
if [ -d "temp-cache/src" ]; then
|
if [ -d "temp-cache/src" ]; then
|
||||||
@@ -85,23 +85,21 @@ runs:
|
|||||||
|
|
||||||
- name: Unzip and Ensure Src Cache (Windows)
|
- name: Unzip and Ensure Src Cache (Windows)
|
||||||
if: ${{ inputs.target-platform == 'win' }}
|
if: ${{ inputs.target-platform == 'win' }}
|
||||||
shell: powershell
|
shell: bash
|
||||||
run: |
|
run: |
|
||||||
$src_cache = "$env:DEPSHASH.tar"
|
echo "Downloaded cache is $(du -sh $DEPSHASH.tar | cut -f1)"
|
||||||
$cache_size = $(Get-Item $src_cache).length
|
if [ `du $DEPSHASH.tar | cut -f1` = "0" ]; then
|
||||||
Write-Host "Downloaded cache is $cache_size"
|
echo "Cache is empty - exiting"
|
||||||
if ($cache_size -eq 0) {
|
|
||||||
Write-Host "Cache is empty - exiting"
|
|
||||||
exit 1
|
exit 1
|
||||||
}
|
fi
|
||||||
|
|
||||||
$TEMP_DIR=New-Item -ItemType Directory -Path temp-cache
|
mkdir temp-cache
|
||||||
$TEMP_DIR_PATH = $TEMP_DIR.FullName
|
zstd -d --long=30 -c $DEPSHASH.tar | tar -xf - -C temp-cache
|
||||||
C:\ProgramData\Chocolatey\bin\7z.exe -y -snld20 x $src_cache -o"$TEMP_DIR_PATH"
|
rm -f $DEPSHASH.tar
|
||||||
|
|
||||||
- name: Move Src Cache (Windows)
|
- name: Move Src Cache (Windows)
|
||||||
if: ${{ inputs.target-platform == 'win' }}
|
if: ${{ inputs.target-platform == 'win' }}
|
||||||
uses: nick-fields/retry@7152eba30c6575329ac0576536151aca5a72780e # v3.0.0
|
uses: nick-fields/retry@ad984534de44a9489a53aefd81eb77f87c70dc60 # v4.0.0
|
||||||
with:
|
with:
|
||||||
timeout_minutes: 30
|
timeout_minutes: 30
|
||||||
max_attempts: 3
|
max_attempts: 3
|
||||||
@@ -112,9 +110,6 @@ runs:
|
|||||||
Write-Host "Relocating Cache"
|
Write-Host "Relocating Cache"
|
||||||
Remove-Item -Recurse -Force src
|
Remove-Item -Recurse -Force src
|
||||||
Move-Item temp-cache\src src
|
Move-Item temp-cache\src src
|
||||||
|
|
||||||
Write-Host "Deleting zip file"
|
|
||||||
Remove-Item -Force $src_cache
|
|
||||||
}
|
}
|
||||||
if (-Not (Test-Path "src\third_party\blink")) {
|
if (-Not (Test-Path "src\third_party\blink")) {
|
||||||
Write-Host "Cache was not correctly restored - exiting"
|
Write-Host "Cache was not correctly restored - exiting"
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ runs:
|
|||||||
if: ${{ runner.os != 'Windows' }}
|
if: ${{ runner.os != 'Windows' }}
|
||||||
shell: bash
|
shell: bash
|
||||||
run: |
|
run: |
|
||||||
if [[ -z "${{ env.CHROMIUM_GIT_COOKIE }}" ]]; then
|
if [[ -z "$CHROMIUM_GIT_COOKIE" ]]; then
|
||||||
echo "CHROMIUM_GIT_COOKIE is not set - cannot authenticate."
|
echo "CHROMIUM_GIT_COOKIE is not set - cannot authenticate."
|
||||||
exit 0
|
exit 0
|
||||||
fi
|
fi
|
||||||
@@ -18,9 +18,7 @@ runs:
|
|||||||
|
|
||||||
git config --global http.cookiefile ~/.gitcookies
|
git config --global http.cookiefile ~/.gitcookies
|
||||||
|
|
||||||
tr , \\t <<\__END__ >>~/.gitcookies
|
echo "$CHROMIUM_GIT_COOKIE" | tr , \\t >>~/.gitcookies
|
||||||
${{ env.CHROMIUM_GIT_COOKIE }}
|
|
||||||
__END__
|
|
||||||
eval 'set -o history' 2>/dev/null || unsetopt HIST_IGNORE_SPACE 2>/dev/null
|
eval 'set -o history' 2>/dev/null || unsetopt HIST_IGNORE_SPACE 2>/dev/null
|
||||||
|
|
||||||
RESPONSE=$(curl -s -b ~/.gitcookies https://chromium-review.googlesource.com/a/accounts/self)
|
RESPONSE=$(curl -s -b ~/.gitcookies https://chromium-review.googlesource.com/a/accounts/self)
|
||||||
@@ -42,7 +40,7 @@ runs:
|
|||||||
)
|
)
|
||||||
|
|
||||||
git config --global http.cookiefile "%USERPROFILE%\.gitcookies"
|
git config --global http.cookiefile "%USERPROFILE%\.gitcookies"
|
||||||
powershell -noprofile -nologo -command Write-Output "${{ env.CHROMIUM_GIT_COOKIE_WINDOWS_STRING }}" >>"%USERPROFILE%\.gitcookies"
|
powershell -noprofile -nologo -command Write-Output $env:CHROMIUM_GIT_COOKIE_WINDOWS_STRING >>"%USERPROFILE%\.gitcookies"
|
||||||
|
|
||||||
curl -s -b "%USERPROFILE%\.gitcookies" https://chromium-review.googlesource.com/a/accounts/self > response.txt
|
curl -s -b "%USERPROFILE%\.gitcookies" https://chromium-review.googlesource.com/a/accounts/self > response.txt
|
||||||
|
|
||||||
|
|||||||
122
.github/copilot-instructions.md
vendored
Normal file
122
.github/copilot-instructions.md
vendored
Normal file
@@ -0,0 +1,122 @@
|
|||||||
|
# Copilot Instructions for Electron
|
||||||
|
|
||||||
|
## Build System
|
||||||
|
|
||||||
|
Electron uses `@electron/build-tools` (`e` CLI). Install with `npm i -g @electron/build-tools`.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
e sync # Fetch sources and apply patches
|
||||||
|
e build # Build Electron (GN + Ninja)
|
||||||
|
e build -k 999 # Build, continuing through errors
|
||||||
|
e start # Run built Electron
|
||||||
|
e start --version # Verify Electron launches
|
||||||
|
e test # Run full test suite
|
||||||
|
e debug # Run in debugger (lldb on macOS, gdb on Linux)
|
||||||
|
```
|
||||||
|
|
||||||
|
### Linting
|
||||||
|
|
||||||
|
```bash
|
||||||
|
npm run lint # Run all linters (JS, C++, Python, GN, docs)
|
||||||
|
npm run lint:js # JavaScript/TypeScript only
|
||||||
|
npm run lint:clang-format # C++ formatting only
|
||||||
|
npm run lint:cpp # C++ linting only
|
||||||
|
npm run lint:docs # Documentation only
|
||||||
|
```
|
||||||
|
|
||||||
|
### Running a Single Test
|
||||||
|
|
||||||
|
```bash
|
||||||
|
npm run test -- -g "pattern" # Run tests matching a regex pattern
|
||||||
|
# Example: npm run test -- -g "ipc"
|
||||||
|
```
|
||||||
|
|
||||||
|
### Running a Single Node.js Test
|
||||||
|
|
||||||
|
```bash
|
||||||
|
node script/node-spec-runner.js parallel/test-crypto-keygen
|
||||||
|
```
|
||||||
|
|
||||||
|
## Architecture
|
||||||
|
|
||||||
|
Electron embeds Chromium (rendering) and Node.js (backend) to enable desktop apps with web technologies. The parent directory (`../`) is the Chromium source tree.
|
||||||
|
|
||||||
|
### Process Model
|
||||||
|
|
||||||
|
Electron has two primary process types, mirroring Chromium:
|
||||||
|
|
||||||
|
- **Main process** (`shell/browser/` + `lib/browser/`): Controls app lifecycle, creates windows, system APIs
|
||||||
|
- **Renderer process** (`shell/renderer/` + `lib/renderer/`): Runs web content in BrowserWindows
|
||||||
|
|
||||||
|
### Native ↔ JavaScript Bridge
|
||||||
|
|
||||||
|
Each API is implemented as a C++/JS pair:
|
||||||
|
|
||||||
|
- C++ side: `shell/browser/api/electron_api_{name}.cc/.h` — uses `gin::Wrappable` and `ObjectTemplateBuilder`
|
||||||
|
- JS side: `lib/browser/api/{name}.ts` — exports the module, registered in `lib/browser/api/module-list.ts`
|
||||||
|
- Binding: `NODE_LINKED_BINDING_CONTEXT_AWARE(electron_browser_{name}, Initialize)` in C++ and registered in `shell/common/node_bindings.cc`
|
||||||
|
- Type declaration: `typings/internal-ambient.d.ts` maps `process._linkedBinding('electron_browser_{name}')`
|
||||||
|
|
||||||
|
### Patches System
|
||||||
|
|
||||||
|
Electron patches upstream dependencies (Chromium, Node.js, V8, etc.) rather than forking them. Patches live in `patches/` organized by target, with `patches/config.json` mapping directories to repos.
|
||||||
|
|
||||||
|
```text
|
||||||
|
patches/{target}/*.patch → [e sync] → target repo commits
|
||||||
|
← [e patches] ←
|
||||||
|
```
|
||||||
|
|
||||||
|
Key rules:
|
||||||
|
|
||||||
|
- Fix existing patches rather than creating new ones
|
||||||
|
- Preserve original authorship in TODO comments — never change `TODO(name)` assignees
|
||||||
|
- Each patch commit message must explain why the patch exists
|
||||||
|
- After modifying patches, run `e patches {target}` to export
|
||||||
|
|
||||||
|
When working on the `roller/chromium/main` branch for Chromium upgrades, use `e sync --3` for 3-way merge conflict resolution.
|
||||||
|
|
||||||
|
## Conventions
|
||||||
|
|
||||||
|
### File Naming
|
||||||
|
|
||||||
|
- JS/TS files: kebab-case (`file-name.ts`)
|
||||||
|
- C++ files: snake_case with `electron_api_` prefix (`electron_api_safe_storage.cc`)
|
||||||
|
- Test files: `api-{module-name}-spec.ts` in `spec/`
|
||||||
|
- Source file lists are maintained in `filenames.gni` (with platform-specific sections)
|
||||||
|
|
||||||
|
### JavaScript/TypeScript
|
||||||
|
|
||||||
|
- Semicolons required (`"semi": ["error", "always"]`)
|
||||||
|
- `const` and `let` only (no `var`)
|
||||||
|
- Arrow functions preferred
|
||||||
|
- Import order enforced: `@electron/internal` → `@electron` → `electron` → external → builtin → relative
|
||||||
|
- API naming: `PascalCase` for classes (`BrowserWindow`), `camelCase` for module APIs (`globalShortcut`)
|
||||||
|
- Prefer getters/setters over jQuery-style `.text([text])` patterns
|
||||||
|
|
||||||
|
### C++
|
||||||
|
|
||||||
|
- Follows Chromium coding style, enforced by `clang-format` and `clang-tidy`
|
||||||
|
- Uses Chromium abstractions (`base::`, `content::`, etc.)
|
||||||
|
- Header guards: `#ifndef ELECTRON_SHELL_BROWSER_API_ELECTRON_API_{NAME}_H_`
|
||||||
|
- Platform-specific files: `_mac.mm`, `_win.cc`, `_linux.cc`
|
||||||
|
|
||||||
|
### Testing
|
||||||
|
|
||||||
|
- Framework: Mocha + Chai + Sinon
|
||||||
|
- Test helpers in `spec/lib/` (e.g., `spec-helpers.ts`, `window-helpers.ts`)
|
||||||
|
- Use `defer()` from spec-helpers for cleanup, `closeAllWindows()` for window teardown
|
||||||
|
- Tests import from `electron/main` or `electron/renderer`
|
||||||
|
|
||||||
|
### Documentation
|
||||||
|
|
||||||
|
- API docs in `docs/api/` as Markdown, parsed by `@electron/docs-parser` to generate `electron.d.ts`
|
||||||
|
- API history tracked via YAML blocks in HTML comments within doc files
|
||||||
|
- Docs must pass `npm run lint:docs`
|
||||||
|
|
||||||
|
### Build Configuration
|
||||||
|
|
||||||
|
- `BUILD.gn`: Main GN build config
|
||||||
|
- `buildflags/buildflags.gni`: Feature flags (PDF viewer, extensions, spellchecker)
|
||||||
|
- `build/args/`: Build argument profiles (`testing.gn`, `release.gn`, `all.gn`)
|
||||||
|
- `DEPS`: Dependency versions and checkout paths
|
||||||
|
- `chromium_src/`: Chromium source file overrides (compiled instead of originals)
|
||||||
22
.github/problem-matchers/eslint-stylish.json
vendored
22
.github/problem-matchers/eslint-stylish.json
vendored
@@ -1,22 +0,0 @@
|
|||||||
{
|
|
||||||
"problemMatcher": [
|
|
||||||
{
|
|
||||||
"owner": "eslint-stylish",
|
|
||||||
"pattern": [
|
|
||||||
{
|
|
||||||
"regexp": "^\\s*([^\\s].*)$",
|
|
||||||
"file": 1
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"regexp": "^\\s+(\\d+):(\\d+)\\s+(error|warning|info)\\s+(.*)\\s\\s+(.*)$",
|
|
||||||
"line": 1,
|
|
||||||
"column": 2,
|
|
||||||
"severity": 3,
|
|
||||||
"message": 4,
|
|
||||||
"code": 5,
|
|
||||||
"loop": true
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
12
.github/workflows/apply-patches.yml
vendored
12
.github/workflows/apply-patches.yml
vendored
@@ -26,7 +26,7 @@ jobs:
|
|||||||
# Use dorny/paths-filter instead of the path filter under the on: pull_request: block
|
# Use dorny/paths-filter instead of the path filter under the on: pull_request: block
|
||||||
# so that the output can be used to conditionally run the apply-patches job, which lets
|
# so that the output can be used to conditionally run the apply-patches job, which lets
|
||||||
# the job be marked as a required status check (conditional skip counts as a success).
|
# the job be marked as a required status check (conditional skip counts as a success).
|
||||||
- uses: dorny/paths-filter@de90cc6fb38fc0963ad72b210f1f284cd68cea36 # v3.0.2
|
- uses: dorny/paths-filter@fbd0ab8f3e69293af611ebaee6363fc25e6d187d # v4.0.1
|
||||||
id: filter
|
id: filter
|
||||||
with:
|
with:
|
||||||
filters: |
|
filters: |
|
||||||
@@ -41,7 +41,7 @@ jobs:
|
|||||||
permissions:
|
permissions:
|
||||||
contents: read
|
contents: read
|
||||||
container:
|
container:
|
||||||
image: ghcr.io/electron/build:a82b87d7a4f5ff0cab61405f8151ac4cf4942aeb
|
image: ghcr.io/electron/build:eac3529546ea8f3aa356d31e345715eef342233b
|
||||||
options: --user root
|
options: --user root
|
||||||
volumes:
|
volumes:
|
||||||
- /mnt/cross-instance-cache:/mnt/cross-instance-cache
|
- /mnt/cross-instance-cache:/mnt/cross-instance-cache
|
||||||
@@ -71,3 +71,11 @@ jobs:
|
|||||||
uses: ./src/electron/.github/actions/checkout
|
uses: ./src/electron/.github/actions/checkout
|
||||||
with:
|
with:
|
||||||
target-platform: linux
|
target-platform: linux
|
||||||
|
- name: Upload Patch Conflict Fix
|
||||||
|
if: ${{ failure() }}
|
||||||
|
uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0
|
||||||
|
with:
|
||||||
|
name: update-patches
|
||||||
|
path: patches/update-patches.patch
|
||||||
|
if-no-files-found: ignore
|
||||||
|
archive: false
|
||||||
|
|||||||
24
.github/workflows/archaeologist-dig.yml
vendored
24
.github/workflows/archaeologist-dig.yml
vendored
@@ -17,21 +17,25 @@ jobs:
|
|||||||
with:
|
with:
|
||||||
fetch-depth: 0
|
fetch-depth: 0
|
||||||
- name: Setup Node.js/npm
|
- name: Setup Node.js/npm
|
||||||
uses: actions/setup-node@6044e13b5dc448c55e2357c09f80417699197238
|
uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f
|
||||||
with:
|
with:
|
||||||
node-version: 24.12.x
|
node-version: 24.12.x
|
||||||
- name: Setting Up Dig Site
|
- name: Setting Up Dig Site
|
||||||
|
env:
|
||||||
|
CLONE_URL: ${{ github.event.pull_request.head.repo.clone_url }}
|
||||||
|
HEAD_SHA: ${{ github.event.pull_request.head.sha }}
|
||||||
|
BASE_REF: ${{ github.event.pull_request.base.ref }}
|
||||||
run: |
|
run: |
|
||||||
echo "remote: ${{ github.event.pull_request.head.repo.clone_url }}"
|
echo "remote: $CLONE_URL"
|
||||||
echo "sha ${{ github.event.pull_request.head.sha }}"
|
echo "sha $HEAD_SHA"
|
||||||
echo "base ref ${{ github.event.pull_request.base.ref }}"
|
echo "base ref $BASE_REF"
|
||||||
git clone https://github.com/electron/electron.git electron
|
git clone https://github.com/electron/electron.git electron
|
||||||
cd electron
|
cd electron
|
||||||
mkdir -p artifacts
|
mkdir -p artifacts
|
||||||
git remote add fork ${{ github.event.pull_request.head.repo.clone_url }} && git fetch fork
|
git remote add fork "$CLONE_URL" && git fetch fork
|
||||||
git checkout ${{ github.event.pull_request.head.sha }}
|
git checkout "$HEAD_SHA"
|
||||||
git merge-base origin/${{ github.event.pull_request.base.ref }} HEAD > .dig-old
|
git merge-base "origin/$BASE_REF" HEAD > .dig-old
|
||||||
echo ${{ github.event.pull_request.head.sha }} > .dig-new
|
echo "$HEAD_SHA" > .dig-new
|
||||||
cp .dig-old artifacts
|
cp .dig-old artifacts
|
||||||
|
|
||||||
- name: Generating Types for SHA in .dig-new
|
- name: Generating Types for SHA in .dig-new
|
||||||
@@ -45,7 +49,7 @@ jobs:
|
|||||||
sha-file: .dig-old
|
sha-file: .dig-old
|
||||||
filename: electron.old.d.ts
|
filename: electron.old.d.ts
|
||||||
- name: Upload artifacts
|
- name: Upload artifacts
|
||||||
uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f #v6.0.0
|
uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f #v7.0.0
|
||||||
with:
|
with:
|
||||||
name: artifacts
|
name: artifacts
|
||||||
path: electron/artifacts
|
path: electron/artifacts
|
||||||
|
|||||||
5
.github/workflows/audit-branch-ci.yml
vendored
5
.github/workflows/audit-branch-ci.yml
vendored
@@ -17,7 +17,7 @@ jobs:
|
|||||||
contents: read
|
contents: read
|
||||||
steps:
|
steps:
|
||||||
- name: Setup Node.js
|
- name: Setup Node.js
|
||||||
uses: actions/setup-node@6044e13b5dc448c55e2357c09f80417699197238 # v6.2.0
|
uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0
|
||||||
with:
|
with:
|
||||||
node-version: 22.17.x
|
node-version: 22.17.x
|
||||||
- name: Sparse checkout repository
|
- name: Sparse checkout repository
|
||||||
@@ -86,6 +86,7 @@ jobs:
|
|||||||
!message.startsWith("Response status code does not indicate success") &&
|
!message.startsWith("Response status code does not indicate success") &&
|
||||||
!message.startsWith("The hosted runner lost communication with the server") &&
|
!message.startsWith("The hosted runner lost communication with the server") &&
|
||||||
!message.startsWith("Dependabot encountered an error performing the update") &&
|
!message.startsWith("Dependabot encountered an error performing the update") &&
|
||||||
|
!message.startsWith("The action 'Run Electron Tests' has timed out") &&
|
||||||
!/Unable to make request/.test(message) &&
|
!/Unable to make request/.test(message) &&
|
||||||
!/The requested URL returned error/.test(message),
|
!/The requested URL returned error/.test(message),
|
||||||
)
|
)
|
||||||
@@ -154,7 +155,7 @@ jobs:
|
|||||||
await core.summary.write();
|
await core.summary.write();
|
||||||
- name: Send Slack message if errors
|
- name: Send Slack message if errors
|
||||||
if: ${{ always() && steps.audit-errors.outputs.errorsFound && github.ref == 'refs/heads/main' }}
|
if: ${{ always() && steps.audit-errors.outputs.errorsFound && github.ref == 'refs/heads/main' }}
|
||||||
uses: slackapi/slack-github-action@91efab103c0de0a537f72a35f6b8cda0ee76bf0a # v2.1.1
|
uses: slackapi/slack-github-action@af78098f536edbc4de71162a307590698245be95 # v3.0.1
|
||||||
with:
|
with:
|
||||||
payload: |
|
payload: |
|
||||||
link: "https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }}"
|
link: "https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }}"
|
||||||
|
|||||||
75
.github/workflows/branch-created.yml
vendored
75
.github/workflows/branch-created.yml
vendored
@@ -31,16 +31,46 @@ jobs:
|
|||||||
else
|
else
|
||||||
echo "Not a release branch: $BRANCH_NAME"
|
echo "Not a release branch: $BRANCH_NAME"
|
||||||
fi
|
fi
|
||||||
|
- name: Determine Next Unsupported Major Version
|
||||||
|
id: determine-next-unsupported-major
|
||||||
|
if: ${{ steps.check-major-version.outputs.MAJOR }}
|
||||||
|
env:
|
||||||
|
MAJOR: ${{ steps.check-major-version.outputs.MAJOR }}
|
||||||
|
run: |
|
||||||
|
# Fetch the release schedule
|
||||||
|
SCHEDULE=$(curl -s https://releases.electronjs.org/schedule.json)
|
||||||
|
|
||||||
|
# Get the stableDate for the current major version
|
||||||
|
STABLE_DATE=$(echo "$SCHEDULE" | jq -r --arg major "${MAJOR}.0.0" '.[] | select(.version == $major) | .stableDate')
|
||||||
|
|
||||||
|
if [[ -z "$STABLE_DATE" || "$STABLE_DATE" == "null" ]]; then
|
||||||
|
echo "Could not find stableDate for version $MAJOR"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Find the oldest version where eolDate >= stableDate of the new major
|
||||||
|
# This gives us the oldest supported version when the new major goes stable
|
||||||
|
NEXT_UNSUPPORTED_MAJOR=$(echo "$SCHEDULE" | jq -r --arg stableDate "$STABLE_DATE" '
|
||||||
|
[.[] | select(.eolDate != null and .eolDate >= $stableDate)] | sort_by(.version | split(".")[0] | tonumber) | first | .version | split(".")[0]
|
||||||
|
')
|
||||||
|
|
||||||
|
if [[ -z "$NEXT_UNSUPPORTED_MAJOR" || "$NEXT_UNSUPPORTED_MAJOR" == "null" ]]; then
|
||||||
|
echo "Could not determine oldest supported version"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "SCHEDULE=$SCHEDULE" >> "$GITHUB_OUTPUT"
|
||||||
|
echo "NEXT_UNSUPPORTED_MAJOR=$NEXT_UNSUPPORTED_MAJOR" >> "$GITHUB_OUTPUT"
|
||||||
- name: New Release Branch Tasks
|
- name: New Release Branch Tasks
|
||||||
if: ${{ steps.check-major-version.outputs.MAJOR }}
|
if: ${{ steps.check-major-version.outputs.MAJOR }}
|
||||||
env:
|
env:
|
||||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
GH_REPO: electron/electron
|
GH_REPO: electron/electron
|
||||||
MAJOR: ${{ steps.check-major-version.outputs.MAJOR }}
|
MAJOR: ${{ steps.check-major-version.outputs.MAJOR }}
|
||||||
NUM_SUPPORTED_VERSIONS: 3
|
NEXT_UNSUPPORTED_MAJOR: ${{ steps.determine-next-unsupported-major.outputs.NEXT_UNSUPPORTED_MAJOR }}
|
||||||
run: |
|
run: |
|
||||||
PREVIOUS_MAJOR=$((MAJOR - 1))
|
PREVIOUS_MAJOR=$((MAJOR - 1))
|
||||||
UNSUPPORTED_MAJOR=$((MAJOR - NUM_SUPPORTED_VERSIONS - 1))
|
UNSUPPORTED_MAJOR=$((NEXT_UNSUPPORTED_MAJOR - 1))
|
||||||
|
|
||||||
# Create new labels
|
# Create new labels
|
||||||
gh label create $MAJOR-x-y --color 8d9ee8 || true
|
gh label create $MAJOR-x-y --color 8d9ee8 || true
|
||||||
@@ -77,12 +107,36 @@ jobs:
|
|||||||
if: ${{ steps.check-major-version.outputs.MAJOR }}
|
if: ${{ steps.check-major-version.outputs.MAJOR }}
|
||||||
uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8.0.0
|
uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8.0.0
|
||||||
id: generate-project-metadata
|
id: generate-project-metadata
|
||||||
|
env:
|
||||||
|
MAJOR: ${{ steps.check-major-version.outputs.MAJOR }}
|
||||||
|
NEXT_UNSUPPORTED_MAJOR: ${{ steps.determine-next-unsupported-major.outputs.NEXT_UNSUPPORTED_MAJOR }}
|
||||||
|
SCHEDULE: ${{ steps.determine-next-unsupported-major.outputs.SCHEDULE }}
|
||||||
with:
|
with:
|
||||||
script: |
|
script: |
|
||||||
const major = ${{ steps.check-major-version.outputs.MAJOR }}
|
const schedule = JSON.parse(process.env.SCHEDULE)
|
||||||
|
|
||||||
|
const major = parseInt(process.env.MAJOR)
|
||||||
const nextMajor = major + 1
|
const nextMajor = major + 1
|
||||||
const prevMajor = major - 1
|
const prevMajor = major - 1
|
||||||
|
|
||||||
|
const { betaDate, stableDate } = schedule.find(v => v.version === `${major}.0.0`)
|
||||||
|
|
||||||
|
const betaPrepWeek = new Date(betaDate)
|
||||||
|
betaPrepWeek.setDate(betaPrepWeek.getDate() - 8)
|
||||||
|
const betaPrepWeekEnd = new Date(betaPrepWeek)
|
||||||
|
betaPrepWeekEnd.setDate(betaPrepWeekEnd.getDate() + 4)
|
||||||
|
|
||||||
|
const stablePrepWeek = new Date(stableDate)
|
||||||
|
stablePrepWeek.setDate(stablePrepWeek.getDate() - 8)
|
||||||
|
const stablePrepWeekEnd = new Date(stablePrepWeek)
|
||||||
|
stablePrepWeekEnd.setDate(stablePrepWeekEnd.getDate() + 4)
|
||||||
|
|
||||||
|
const stableWeek = new Date(stableDate)
|
||||||
|
stableWeek.setDate(stableWeek.getDate() - 1)
|
||||||
|
|
||||||
|
const nextAlphaDate = new Date(stableDate)
|
||||||
|
nextAlphaDate.setDate(nextAlphaDate.getDate() + 2)
|
||||||
|
|
||||||
core.setOutput("major", major)
|
core.setOutput("major", major)
|
||||||
core.setOutput("next-major", nextMajor)
|
core.setOutput("next-major", nextMajor)
|
||||||
core.setOutput("prev-major", prevMajor)
|
core.setOutput("prev-major", prevMajor)
|
||||||
@@ -91,10 +145,19 @@ jobs:
|
|||||||
major,
|
major,
|
||||||
"next-major": nextMajor,
|
"next-major": nextMajor,
|
||||||
"prev-major": prevMajor,
|
"prev-major": prevMajor,
|
||||||
|
"ending-support-major": parseInt(process.env.NEXT_UNSUPPORTED_MAJOR),
|
||||||
|
"beta-date": betaDate,
|
||||||
|
"beta-prep-week": betaPrepWeek.toISOString().split('T')[0],
|
||||||
|
"beta-prep-week-end": betaPrepWeekEnd.toISOString().split('T')[0],
|
||||||
|
"stable-week": stableWeek.toISOString().split('T')[0],
|
||||||
|
"stable-prep-week": stablePrepWeek.toISOString().split('T')[0],
|
||||||
|
"stable-prep-week-end": stablePrepWeekEnd.toISOString().split('T')[0],
|
||||||
|
"stable-date": stableDate,
|
||||||
|
"next-alpha-date": nextAlphaDate.toISOString().split('T')[0],
|
||||||
}))
|
}))
|
||||||
- name: Create Release Project Board
|
- name: Create Release Project Board
|
||||||
if: ${{ steps.check-major-version.outputs.MAJOR }}
|
if: ${{ steps.check-major-version.outputs.MAJOR }}
|
||||||
uses: dsanders11/project-actions/copy-project@2134fe7cc71c58b7ae259c82a8e63c6058255678 # v1.7.0
|
uses: dsanders11/project-actions/copy-project@5767984408ccc6742f83acc8b8d8ea5e09f329af # v2.0.0
|
||||||
id: create-release-board
|
id: create-release-board
|
||||||
with:
|
with:
|
||||||
drafts: true
|
drafts: true
|
||||||
@@ -114,7 +177,7 @@ jobs:
|
|||||||
GITHUB_TOKEN: ${{ steps.generate-token.outputs.token }}
|
GITHUB_TOKEN: ${{ steps.generate-token.outputs.token }}
|
||||||
- name: Find Previous Release Project Board
|
- name: Find Previous Release Project Board
|
||||||
if: ${{ steps.check-major-version.outputs.MAJOR }}
|
if: ${{ steps.check-major-version.outputs.MAJOR }}
|
||||||
uses: dsanders11/project-actions/find-project@2134fe7cc71c58b7ae259c82a8e63c6058255678 # v1.7.0
|
uses: dsanders11/project-actions/find-project@5767984408ccc6742f83acc8b8d8ea5e09f329af # v2.0.0
|
||||||
id: find-prev-release-board
|
id: find-prev-release-board
|
||||||
with:
|
with:
|
||||||
fail-if-project-not-found: false
|
fail-if-project-not-found: false
|
||||||
@@ -122,7 +185,7 @@ jobs:
|
|||||||
token: ${{ steps.generate-token.outputs.token }}
|
token: ${{ steps.generate-token.outputs.token }}
|
||||||
- name: Close Previous Release Project Board
|
- name: Close Previous Release Project Board
|
||||||
if: ${{ steps.find-prev-release-board.outputs.number }}
|
if: ${{ steps.find-prev-release-board.outputs.number }}
|
||||||
uses: dsanders11/project-actions/close-project@2134fe7cc71c58b7ae259c82a8e63c6058255678 # v1.7.0
|
uses: dsanders11/project-actions/close-project@5767984408ccc6742f83acc8b8d8ea5e09f329af # v2.0.0
|
||||||
with:
|
with:
|
||||||
project-number: ${{ steps.find-prev-release-board.outputs.number }}
|
project-number: ${{ steps.find-prev-release-board.outputs.number }}
|
||||||
token: ${{ steps.generate-token.outputs.token }}
|
token: ${{ steps.generate-token.outputs.token }}
|
||||||
|
|||||||
6
.github/workflows/build-git-cache.yml
vendored
6
.github/workflows/build-git-cache.yml
vendored
@@ -15,7 +15,7 @@ jobs:
|
|||||||
permissions:
|
permissions:
|
||||||
contents: read
|
contents: read
|
||||||
container:
|
container:
|
||||||
image: ghcr.io/electron/build:a82b87d7a4f5ff0cab61405f8151ac4cf4942aeb
|
image: ghcr.io/electron/build:eac3529546ea8f3aa356d31e345715eef342233b
|
||||||
options: --user root
|
options: --user root
|
||||||
volumes:
|
volumes:
|
||||||
- /mnt/cross-instance-cache:/mnt/cross-instance-cache
|
- /mnt/cross-instance-cache:/mnt/cross-instance-cache
|
||||||
@@ -39,7 +39,7 @@ jobs:
|
|||||||
permissions:
|
permissions:
|
||||||
contents: read
|
contents: read
|
||||||
container:
|
container:
|
||||||
image: ghcr.io/electron/build:a82b87d7a4f5ff0cab61405f8151ac4cf4942aeb
|
image: ghcr.io/electron/build:eac3529546ea8f3aa356d31e345715eef342233b
|
||||||
options: --user root --device /dev/fuse --cap-add SYS_ADMIN
|
options: --user root --device /dev/fuse --cap-add SYS_ADMIN
|
||||||
volumes:
|
volumes:
|
||||||
- /mnt/win-cache:/mnt/win-cache
|
- /mnt/win-cache:/mnt/win-cache
|
||||||
@@ -66,7 +66,7 @@ jobs:
|
|||||||
# This job updates the same git cache as linux, so it needs to run after the linux one.
|
# This job updates the same git cache as linux, so it needs to run after the linux one.
|
||||||
needs: build-git-cache-linux
|
needs: build-git-cache-linux
|
||||||
container:
|
container:
|
||||||
image: ghcr.io/electron/build:a82b87d7a4f5ff0cab61405f8151ac4cf4942aeb
|
image: ghcr.io/electron/build:eac3529546ea8f3aa356d31e345715eef342233b
|
||||||
options: --user root
|
options: --user root
|
||||||
volumes:
|
volumes:
|
||||||
- /mnt/cross-instance-cache:/mnt/cross-instance-cache
|
- /mnt/cross-instance-cache:/mnt/cross-instance-cache
|
||||||
|
|||||||
45
.github/workflows/build.yml
vendored
45
.github/workflows/build.yml
vendored
@@ -6,7 +6,7 @@ on:
|
|||||||
build-image-sha:
|
build-image-sha:
|
||||||
type: string
|
type: string
|
||||||
description: 'SHA for electron/build image'
|
description: 'SHA for electron/build image'
|
||||||
default: 'a82b87d7a4f5ff0cab61405f8151ac4cf4942aeb'
|
default: 'eac3529546ea8f3aa356d31e345715eef342233b'
|
||||||
required: true
|
required: true
|
||||||
skip-macos:
|
skip-macos:
|
||||||
type: boolean
|
type: boolean
|
||||||
@@ -61,7 +61,7 @@ jobs:
|
|||||||
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd
|
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd
|
||||||
with:
|
with:
|
||||||
ref: ${{ github.event.pull_request.head.sha }}
|
ref: ${{ github.event.pull_request.head.sha }}
|
||||||
- uses: dorny/paths-filter@de90cc6fb38fc0963ad72b210f1f284cd68cea36 # v3.0.2
|
- uses: dorny/paths-filter@fbd0ab8f3e69293af611ebaee6363fc25e6d187d # v4.0.1
|
||||||
id: filter
|
id: filter
|
||||||
with:
|
with:
|
||||||
filters: |
|
filters: |
|
||||||
@@ -77,7 +77,7 @@ jobs:
|
|||||||
id: set-output
|
id: set-output
|
||||||
run: |
|
run: |
|
||||||
if [ -z "${{ inputs.build-image-sha }}" ]; then
|
if [ -z "${{ inputs.build-image-sha }}" ]; then
|
||||||
echo "build-image-sha=a82b87d7a4f5ff0cab61405f8151ac4cf4942aeb" >> "$GITHUB_OUTPUT"
|
echo "build-image-sha=eac3529546ea8f3aa356d31e345715eef342233b" >> "$GITHUB_OUTPUT"
|
||||||
else
|
else
|
||||||
echo "build-image-sha=${{ inputs.build-image-sha }}" >> "$GITHUB_OUTPUT"
|
echo "build-image-sha=${{ inputs.build-image-sha }}" >> "$GITHUB_OUTPUT"
|
||||||
fi
|
fi
|
||||||
@@ -365,6 +365,18 @@ jobs:
|
|||||||
generate-symbols: false
|
generate-symbols: false
|
||||||
upload-to-storage: '0'
|
upload-to-storage: '0'
|
||||||
secrets: inherit
|
secrets: inherit
|
||||||
|
|
||||||
|
test-linux-arm64-64k:
|
||||||
|
uses: ./.github/workflows/pipeline-segment-electron-test-64k.yml
|
||||||
|
permissions:
|
||||||
|
contents: read
|
||||||
|
issues: read
|
||||||
|
pull-requests: read
|
||||||
|
needs: [checkout-linux, linux-arm64]
|
||||||
|
with:
|
||||||
|
test-runs-on: ubuntu-22.04-arm
|
||||||
|
test-container: '{"image":"ghcr.io/electron/test:arm64v8-${{ needs.checkout-linux.outputs.build-image-sha }}","options":"--user root --privileged --init"}'
|
||||||
|
secrets: inherit
|
||||||
|
|
||||||
windows-x64:
|
windows-x64:
|
||||||
permissions:
|
permissions:
|
||||||
@@ -434,3 +446,30 @@ jobs:
|
|||||||
- name: GitHub Actions Jobs Done
|
- name: GitHub Actions Jobs Done
|
||||||
run: |
|
run: |
|
||||||
echo "All GitHub Actions Jobs are done"
|
echo "All GitHub Actions Jobs are done"
|
||||||
|
|
||||||
|
check-signed-commits:
|
||||||
|
name: Check signed commits in green PR
|
||||||
|
needs: gha-done
|
||||||
|
if: ${{ contains(github.event.pull_request.labels.*.name, 'needs-signed-commits')}}
|
||||||
|
runs-on: ubuntu-slim
|
||||||
|
permissions:
|
||||||
|
contents: read
|
||||||
|
pull-requests: write
|
||||||
|
steps:
|
||||||
|
- name: Check signed commits in PR
|
||||||
|
uses: 1Password/check-signed-commits-action@ed2885f3ed2577a4f5d3c3fe895432a557d23d52 # v1
|
||||||
|
with:
|
||||||
|
comment: |
|
||||||
|
⚠️ This PR contains unsigned commits. This repository enforces [commit signatures](https://docs.github.com/en/authentication/managing-commit-signature-verification)
|
||||||
|
for all incoming PRs. To get your PR merged, please sign those commits
|
||||||
|
(`git rebase --exec 'git commit -S --amend --no-edit -n' @{upstream}`) and force push them to this branch
|
||||||
|
(`git push --force-with-lease`)
|
||||||
|
|
||||||
|
For more information on signing commits, see GitHub's documentation on [Telling Git about your signing key](https://docs.github.com/en/authentication/managing-commit-signature-verification/telling-git-about-your-signing-key).
|
||||||
|
|
||||||
|
- name: Remove needs-signed-commits label
|
||||||
|
env:
|
||||||
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
PR_URL: ${{ github.event.pull_request.html_url }}
|
||||||
|
run: |
|
||||||
|
gh pr edit $PR_URL --remove-label needs-signed-commits
|
||||||
|
|||||||
32
.github/workflows/clean-orphaned-cache-uploads.yml
vendored
Normal file
32
.github/workflows/clean-orphaned-cache-uploads.yml
vendored
Normal file
@@ -0,0 +1,32 @@
|
|||||||
|
name: Clean Orphaned Cache Uploads
|
||||||
|
|
||||||
|
# Description:
|
||||||
|
# Sweeps orphaned in-flight upload temp files left on the src-cache volumes
|
||||||
|
# by checkout/action.yml when its cp-to-share step dies before the rename.
|
||||||
|
# A successful upload finishes in minutes, so anything older than 4h is dead.
|
||||||
|
|
||||||
|
on:
|
||||||
|
schedule:
|
||||||
|
- cron: "0 */4 * * *"
|
||||||
|
workflow_dispatch:
|
||||||
|
|
||||||
|
permissions: {}
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
clean-orphaned-uploads:
|
||||||
|
if: github.repository == 'electron/electron'
|
||||||
|
runs-on: electron-arc-centralus-linux-amd64-32core
|
||||||
|
permissions:
|
||||||
|
contents: read
|
||||||
|
container:
|
||||||
|
image: ghcr.io/electron/build:bc2f48b2415a670de18d13605b1cf0eb5fdbaae1
|
||||||
|
options: --user root
|
||||||
|
volumes:
|
||||||
|
- /mnt/cross-instance-cache:/mnt/cross-instance-cache
|
||||||
|
- /mnt/win-cache:/mnt/win-cache
|
||||||
|
steps:
|
||||||
|
- name: Remove Orphaned Upload Temp Files
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
find /mnt/cross-instance-cache -maxdepth 1 -type f -name '*.tar.upload-*' -mmin +240 -print -delete
|
||||||
|
find /mnt/win-cache -maxdepth 1 -type f -name '*.tar.upload-*' -mmin +240 -print -delete
|
||||||
127
.github/workflows/clean-src-cache.yml
vendored
127
.github/workflows/clean-src-cache.yml
vendored
@@ -7,6 +7,7 @@ name: Clean Source Cache
|
|||||||
on:
|
on:
|
||||||
schedule:
|
schedule:
|
||||||
- cron: "0 0 * * *"
|
- cron: "0 0 * * *"
|
||||||
|
workflow_dispatch:
|
||||||
|
|
||||||
permissions: {}
|
permissions: {}
|
||||||
|
|
||||||
@@ -16,6 +17,8 @@ jobs:
|
|||||||
runs-on: electron-arc-centralus-linux-amd64-32core
|
runs-on: electron-arc-centralus-linux-amd64-32core
|
||||||
permissions:
|
permissions:
|
||||||
contents: read
|
contents: read
|
||||||
|
env:
|
||||||
|
DD_API_KEY: ${{ secrets.DD_API_KEY }}
|
||||||
container:
|
container:
|
||||||
image: ghcr.io/electron/build:bc2f48b2415a670de18d13605b1cf0eb5fdbaae1
|
image: ghcr.io/electron/build:bc2f48b2415a670de18d13605b1cf0eb5fdbaae1
|
||||||
options: --user root
|
options: --user root
|
||||||
@@ -23,12 +26,130 @@ jobs:
|
|||||||
- /mnt/cross-instance-cache:/mnt/cross-instance-cache
|
- /mnt/cross-instance-cache:/mnt/cross-instance-cache
|
||||||
- /mnt/win-cache:/mnt/win-cache
|
- /mnt/win-cache:/mnt/win-cache
|
||||||
steps:
|
steps:
|
||||||
|
- name: Get Disk Space Before Cleanup
|
||||||
|
id: disk-before
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
echo "Disk space before cleanup:"
|
||||||
|
df -h /mnt/cross-instance-cache
|
||||||
|
df -h /mnt/win-cache
|
||||||
|
CROSS_FREE_BEFORE=$(df -k /mnt/cross-instance-cache | tail -1 | awk '{print $4}')
|
||||||
|
CROSS_TOTAL=$(df -k /mnt/cross-instance-cache | tail -1 | awk '{print $2}')
|
||||||
|
WIN_FREE_BEFORE=$(df -k /mnt/win-cache | tail -1 | awk '{print $4}')
|
||||||
|
WIN_TOTAL=$(df -k /mnt/win-cache | tail -1 | awk '{print $2}')
|
||||||
|
echo "cross_free_kb=$CROSS_FREE_BEFORE" >> $GITHUB_OUTPUT
|
||||||
|
echo "cross_total_kb=$CROSS_TOTAL" >> $GITHUB_OUTPUT
|
||||||
|
echo "win_free_kb=$WIN_FREE_BEFORE" >> $GITHUB_OUTPUT
|
||||||
|
echo "win_total_kb=$WIN_TOTAL" >> $GITHUB_OUTPUT
|
||||||
|
|
||||||
- name: Cleanup Source Cache
|
- name: Cleanup Source Cache
|
||||||
shell: bash
|
shell: bash
|
||||||
run: |
|
run: |
|
||||||
df -h /mnt/cross-instance-cache
|
|
||||||
find /mnt/cross-instance-cache -type f -mtime +15 -delete
|
find /mnt/cross-instance-cache -type f -mtime +15 -delete
|
||||||
|
find /mnt/win-cache -type f -mtime +15 -delete
|
||||||
|
|
||||||
|
- name: Get Disk Space After Cleanup
|
||||||
|
id: disk-after
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
echo "Disk space after cleanup:"
|
||||||
df -h /mnt/cross-instance-cache
|
df -h /mnt/cross-instance-cache
|
||||||
df -h /mnt/win-cache
|
df -h /mnt/win-cache
|
||||||
find /mnt/win-cache -type f -mtime +15 -delete
|
CROSS_FREE_AFTER=$(df -k /mnt/cross-instance-cache | tail -1 | awk '{print $4}')
|
||||||
df -h /mnt/win-cache
|
WIN_FREE_AFTER=$(df -k /mnt/win-cache | tail -1 | awk '{print $4}')
|
||||||
|
echo "cross_free_kb=$CROSS_FREE_AFTER" >> $GITHUB_OUTPUT
|
||||||
|
echo "win_free_kb=$WIN_FREE_AFTER" >> $GITHUB_OUTPUT
|
||||||
|
|
||||||
|
- name: Log Disk Space to Datadog
|
||||||
|
if: ${{ env.DD_API_KEY != '' }}
|
||||||
|
shell: bash
|
||||||
|
env:
|
||||||
|
CROSS_FREE_BEFORE: ${{ steps.disk-before.outputs.cross_free_kb }}
|
||||||
|
CROSS_FREE_AFTER: ${{ steps.disk-after.outputs.cross_free_kb }}
|
||||||
|
CROSS_TOTAL: ${{ steps.disk-before.outputs.cross_total_kb }}
|
||||||
|
WIN_FREE_BEFORE: ${{ steps.disk-before.outputs.win_free_kb }}
|
||||||
|
WIN_FREE_AFTER: ${{ steps.disk-after.outputs.win_free_kb }}
|
||||||
|
WIN_TOTAL: ${{ steps.disk-before.outputs.win_total_kb }}
|
||||||
|
run: |
|
||||||
|
TIMESTAMP=$(date +%s)
|
||||||
|
|
||||||
|
CROSS_FREE_BEFORE_GB=$(awk "BEGIN {printf \"%.2f\", $CROSS_FREE_BEFORE / 1024 / 1024}")
|
||||||
|
CROSS_FREE_AFTER_GB=$(awk "BEGIN {printf \"%.2f\", $CROSS_FREE_AFTER / 1024 / 1024}")
|
||||||
|
CROSS_FREED_GB=$(awk "BEGIN {printf \"%.2f\", ($CROSS_FREE_AFTER - $CROSS_FREE_BEFORE) / 1024 / 1024}")
|
||||||
|
CROSS_TOTAL_GB=$(awk "BEGIN {printf \"%.2f\", $CROSS_TOTAL / 1024 / 1024}")
|
||||||
|
|
||||||
|
WIN_FREE_BEFORE_GB=$(awk "BEGIN {printf \"%.2f\", $WIN_FREE_BEFORE / 1024 / 1024}")
|
||||||
|
WIN_FREE_AFTER_GB=$(awk "BEGIN {printf \"%.2f\", $WIN_FREE_AFTER / 1024 / 1024}")
|
||||||
|
WIN_FREED_GB=$(awk "BEGIN {printf \"%.2f\", ($WIN_FREE_AFTER - $WIN_FREE_BEFORE) / 1024 / 1024}")
|
||||||
|
WIN_TOTAL_GB=$(awk "BEGIN {printf \"%.2f\", $WIN_TOTAL / 1024 / 1024}")
|
||||||
|
|
||||||
|
echo "cross-instance-cache: free before=${CROSS_FREE_BEFORE_GB}GB, after=${CROSS_FREE_AFTER_GB}GB, freed=${CROSS_FREED_GB}GB, total=${CROSS_TOTAL_GB}GB"
|
||||||
|
echo "win-cache: free before=${WIN_FREE_BEFORE_GB}GB, after=${WIN_FREE_AFTER_GB}GB, freed=${WIN_FREED_GB}GB, total=${WIN_TOTAL_GB}GB"
|
||||||
|
|
||||||
|
curl -s -X POST "https://api.datadoghq.com/api/v2/series" \
|
||||||
|
-H "Content-Type: application/json" \
|
||||||
|
-H "DD-API-KEY: ${DD_API_KEY}" \
|
||||||
|
-d @- << EOF
|
||||||
|
{
|
||||||
|
"series": [
|
||||||
|
{
|
||||||
|
"metric": "electron.src_cache.disk.free_space_before_cleanup_gb",
|
||||||
|
"points": [{"timestamp": ${TIMESTAMP}, "value": ${CROSS_FREE_BEFORE_GB}}],
|
||||||
|
"type": 3,
|
||||||
|
"unit": "gigabyte",
|
||||||
|
"tags": ["volume:cross-instance-cache", "platform:linux"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"metric": "electron.src_cache.disk.free_space_after_cleanup_gb",
|
||||||
|
"points": [{"timestamp": ${TIMESTAMP}, "value": ${CROSS_FREE_AFTER_GB}}],
|
||||||
|
"type": 3,
|
||||||
|
"unit": "gigabyte",
|
||||||
|
"tags": ["volume:cross-instance-cache", "platform:linux"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"metric": "electron.src_cache.disk.space_freed_gb",
|
||||||
|
"points": [{"timestamp": ${TIMESTAMP}, "value": ${CROSS_FREED_GB}}],
|
||||||
|
"type": 3,
|
||||||
|
"unit": "gigabyte",
|
||||||
|
"tags": ["volume:cross-instance-cache", "platform:linux"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"metric": "electron.src_cache.disk.total_space_gb",
|
||||||
|
"points": [{"timestamp": ${TIMESTAMP}, "value": ${CROSS_TOTAL_GB}}],
|
||||||
|
"type": 3,
|
||||||
|
"unit": "gigabyte",
|
||||||
|
"tags": ["volume:cross-instance-cache", "platform:linux"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"metric": "electron.src_cache.disk.free_space_before_cleanup_gb",
|
||||||
|
"points": [{"timestamp": ${TIMESTAMP}, "value": ${WIN_FREE_BEFORE_GB}}],
|
||||||
|
"type": 3,
|
||||||
|
"unit": "gigabyte",
|
||||||
|
"tags": ["volume:win-cache", "platform:linux"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"metric": "electron.src_cache.disk.free_space_after_cleanup_gb",
|
||||||
|
"points": [{"timestamp": ${TIMESTAMP}, "value": ${WIN_FREE_AFTER_GB}}],
|
||||||
|
"type": 3,
|
||||||
|
"unit": "gigabyte",
|
||||||
|
"tags": ["volume:win-cache", "platform:linux"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"metric": "electron.src_cache.disk.space_freed_gb",
|
||||||
|
"points": [{"timestamp": ${TIMESTAMP}, "value": ${WIN_FREED_GB}}],
|
||||||
|
"type": 3,
|
||||||
|
"unit": "gigabyte",
|
||||||
|
"tags": ["volume:win-cache", "platform:linux"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"metric": "electron.src_cache.disk.total_space_gb",
|
||||||
|
"points": [{"timestamp": ${TIMESTAMP}, "value": ${WIN_TOTAL_GB}}],
|
||||||
|
"type": 3,
|
||||||
|
"unit": "gigabyte",
|
||||||
|
"tags": ["volume:win-cache", "platform:linux"]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
EOF
|
||||||
|
|
||||||
|
echo "Disk space metrics logged to Datadog"
|
||||||
|
|||||||
63
.github/workflows/issue-commented.yml
vendored
63
.github/workflows/issue-commented.yml
vendored
@@ -1,4 +1,4 @@
|
|||||||
name: Issue Commented
|
name: Issue / Pull Request Commented
|
||||||
|
|
||||||
on:
|
on:
|
||||||
issue_comment:
|
issue_comment:
|
||||||
@@ -8,16 +8,16 @@ on:
|
|||||||
permissions: {}
|
permissions: {}
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
issue-commented:
|
blocked-issue-commented:
|
||||||
name: Remove blocked/{need-info,need-repro} on comment
|
name: Remove blocked/{need-info,need-repro} on comment
|
||||||
if: ${{ (contains(github.event.issue.labels.*.name, 'blocked/need-repro') || contains(github.event.issue.labels.*.name, 'blocked/need-info ❌')) && github.event.comment.user.type != 'Bot' }}
|
if: ${{ !github.event.issue.pull_request && (contains(github.event.issue.labels.*.name, 'blocked/need-repro') || contains(github.event.issue.labels.*.name, 'blocked/need-info ❌')) && github.event.comment.user.type != 'Bot' }}
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-slim
|
||||||
steps:
|
steps:
|
||||||
- name: Get author association
|
- name: Get author association
|
||||||
id: get-author-association
|
id: get-author-association
|
||||||
env:
|
env:
|
||||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
run: |
|
run: &get-author-association |
|
||||||
AUTHOR_ASSOCIATION=$(gh api /repos/electron/electron/issues/comments/${{ github.event.comment.id }} --jq '.author_association')
|
AUTHOR_ASSOCIATION=$(gh api /repos/electron/electron/issues/comments/${{ github.event.comment.id }} --jq '.author_association')
|
||||||
echo "author_association=$AUTHOR_ASSOCIATION" >> "$GITHUB_OUTPUT"
|
echo "author_association=$AUTHOR_ASSOCIATION" >> "$GITHUB_OUTPUT"
|
||||||
- name: Generate GitHub App token
|
- name: Generate GitHub App token
|
||||||
@@ -33,3 +33,56 @@ jobs:
|
|||||||
ISSUE_URL: ${{ github.event.issue.html_url }}
|
ISSUE_URL: ${{ github.event.issue.html_url }}
|
||||||
run: |
|
run: |
|
||||||
gh issue edit $ISSUE_URL --remove-label 'blocked/need-repro','blocked/need-info ❌'
|
gh issue edit $ISSUE_URL --remove-label 'blocked/need-repro','blocked/need-info ❌'
|
||||||
|
|
||||||
|
pr-reviewer-requested:
|
||||||
|
name: Maintainer requested reviewer on PR
|
||||||
|
if: ${{ github.event.issue.pull_request && startsWith(github.event.comment.body, '/request-review') && github.event.comment.user.type != 'Bot' }}
|
||||||
|
runs-on: ubuntu-slim
|
||||||
|
steps:
|
||||||
|
- name: Get author association
|
||||||
|
id: get-author-association
|
||||||
|
env:
|
||||||
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
run: *get-author-association
|
||||||
|
- name: Generate GitHub App token
|
||||||
|
uses: electron/github-app-auth-action@e14e47722ed120360649d0789e25b9baece12725 # v2.0.0
|
||||||
|
if: ${{ contains(fromJSON('["MEMBER", "OWNER"]'), steps.get-author-association.outputs.author_association) }}
|
||||||
|
id: generate-token
|
||||||
|
with:
|
||||||
|
creds: ${{ secrets.ISSUE_TRIAGE_GH_APP_CREDS }}
|
||||||
|
- name: Request reviewer
|
||||||
|
if: ${{ contains(fromJSON('["MEMBER", "OWNER"]'), steps.get-author-association.outputs.author_association) }}
|
||||||
|
env:
|
||||||
|
GITHUB_TOKEN: ${{ steps.generate-token.outputs.token }}
|
||||||
|
PR_URL: ${{ github.event.issue.html_url }}
|
||||||
|
COMMENT_BODY: ${{ github.event.comment.body }}
|
||||||
|
run: |
|
||||||
|
RAW=$(echo "$COMMENT_BODY" | head -n 1 | sed 's|/request-review\s*||' | xargs)
|
||||||
|
|
||||||
|
if [ -z "$RAW" ]; then
|
||||||
|
echo "::warning::No username provided. Usage: /request-review <username>[,<username>,...]"
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
IFS=',' read -ra USERS <<< "$RAW"
|
||||||
|
for USER in "${USERS[@]}"; do
|
||||||
|
NAME=$(echo "$USER" | sed 's/@//g' | xargs)
|
||||||
|
if [ -z "$NAME" ]; then
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Strip "electron/" prefix if present to get the bare name
|
||||||
|
BARE_NAME=$(echo "$NAME" | sed 's|^electron/||')
|
||||||
|
|
||||||
|
# If the original name contained "electron/" or looks like a team slug, treat as team
|
||||||
|
if [ "$NAME" != "$BARE_NAME" ]; then
|
||||||
|
gh pr edit $PR_URL --add-reviewer "electron/$BARE_NAME"
|
||||||
|
else
|
||||||
|
if ! gh api /orgs/electron/public_members/$BARE_NAME --silent > /dev/null 2>&1; then
|
||||||
|
echo "::warning::$BARE_NAME is not a public member of the electron organization."
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
|
||||||
|
gh pr edit $PR_URL --add-reviewer "$BARE_NAME"
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|||||||
9
.github/workflows/issue-labeled.yml
vendored
9
.github/workflows/issue-labeled.yml
vendored
@@ -21,7 +21,7 @@ jobs:
|
|||||||
creds: ${{ secrets.ISSUE_TRIAGE_GH_APP_CREDS }}
|
creds: ${{ secrets.ISSUE_TRIAGE_GH_APP_CREDS }}
|
||||||
org: electron
|
org: electron
|
||||||
- name: Set status
|
- name: Set status
|
||||||
uses: dsanders11/project-actions/edit-item@2134fe7cc71c58b7ae259c82a8e63c6058255678 # v1.7.0
|
uses: dsanders11/project-actions/edit-item@5767984408ccc6742f83acc8b8d8ea5e09f329af # v2.0.0
|
||||||
with:
|
with:
|
||||||
token: ${{ steps.generate-token.outputs.token }}
|
token: ${{ steps.generate-token.outputs.token }}
|
||||||
project-number: 90
|
project-number: 90
|
||||||
@@ -42,7 +42,7 @@ jobs:
|
|||||||
creds: ${{ secrets.ISSUE_TRIAGE_GH_APP_CREDS }}
|
creds: ${{ secrets.ISSUE_TRIAGE_GH_APP_CREDS }}
|
||||||
org: electron
|
org: electron
|
||||||
- name: Set status
|
- name: Set status
|
||||||
uses: dsanders11/project-actions/edit-item@2134fe7cc71c58b7ae259c82a8e63c6058255678 # v1.7.0
|
uses: dsanders11/project-actions/edit-item@5767984408ccc6742f83acc8b8d8ea5e09f329af # v2.0.0
|
||||||
with:
|
with:
|
||||||
token: ${{ steps.generate-token.outputs.token }}
|
token: ${{ steps.generate-token.outputs.token }}
|
||||||
project-number: 90
|
project-number: 90
|
||||||
@@ -61,9 +61,10 @@ jobs:
|
|||||||
env:
|
env:
|
||||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
GH_REPO: electron/electron
|
GH_REPO: electron/electron
|
||||||
|
ISSUE_NUMBER: ${{ github.event.issue.number }}
|
||||||
run: |
|
run: |
|
||||||
set -eo pipefail
|
set -eo pipefail
|
||||||
COMMENT_COUNT=$(gh issue view ${{ github.event.issue.number }} --comments --json comments | jq '[ .comments[] | select(.author.login == "electron-issue-triage" or .authorAssociation == "OWNER" or .authorAssociation == "MEMBER") | select(.body | startswith("<!-- blocked/need-repro -->")) ] | length')
|
COMMENT_COUNT=$(gh issue view "$ISSUE_NUMBER" --comments --json comments | jq '[ .comments[] | select(.author.login == "electron-issue-triage" or .authorAssociation == "OWNER" or .authorAssociation == "MEMBER") | select(.body | startswith("<!-- blocked/need-repro -->")) ] | length')
|
||||||
if [[ $COMMENT_COUNT -eq 0 ]]; then
|
if [[ $COMMENT_COUNT -eq 0 ]]; then
|
||||||
echo "SHOULD_COMMENT=1" >> "$GITHUB_OUTPUT"
|
echo "SHOULD_COMMENT=1" >> "$GITHUB_OUTPUT"
|
||||||
fi
|
fi
|
||||||
@@ -75,7 +76,7 @@ jobs:
|
|||||||
creds: ${{ secrets.ISSUE_TRIAGE_GH_APP_CREDS }}
|
creds: ${{ secrets.ISSUE_TRIAGE_GH_APP_CREDS }}
|
||||||
- name: Create comment
|
- name: Create comment
|
||||||
if: ${{ steps.check-for-comment.outputs.SHOULD_COMMENT }}
|
if: ${{ steps.check-for-comment.outputs.SHOULD_COMMENT }}
|
||||||
uses: actions-cool/issues-helper@e2ff99831a4f13625d35064e2b3dfe65c07a0396 # v3.7.5
|
uses: actions-cool/issues-helper@200c78641dbf33838311e5a1e0c31bbdb92d7cf0 # v3.8.0
|
||||||
with:
|
with:
|
||||||
actions: 'create-comment'
|
actions: 'create-comment'
|
||||||
token: ${{ steps.generate-token.outputs.token }}
|
token: ${{ steps.generate-token.outputs.token }}
|
||||||
|
|||||||
4
.github/workflows/issue-opened.yml
vendored
4
.github/workflows/issue-opened.yml
vendored
@@ -20,7 +20,7 @@ jobs:
|
|||||||
creds: ${{ secrets.ISSUE_TRIAGE_GH_APP_CREDS }}
|
creds: ${{ secrets.ISSUE_TRIAGE_GH_APP_CREDS }}
|
||||||
org: electron
|
org: electron
|
||||||
- name: Add to Issue Triage
|
- name: Add to Issue Triage
|
||||||
uses: dsanders11/project-actions/add-item@2134fe7cc71c58b7ae259c82a8e63c6058255678 # v1.7.0
|
uses: dsanders11/project-actions/add-item@5767984408ccc6742f83acc8b8d8ea5e09f329af # v2.0.0
|
||||||
with:
|
with:
|
||||||
field: Reporter
|
field: Reporter
|
||||||
field-value: ${{ github.event.issue.user.login }}
|
field-value: ${{ github.event.issue.user.login }}
|
||||||
@@ -146,7 +146,7 @@ jobs:
|
|||||||
}
|
}
|
||||||
- name: Create unsupported major comment
|
- name: Create unsupported major comment
|
||||||
if: ${{ steps.add-labels.outputs.unsupportedMajor }}
|
if: ${{ steps.add-labels.outputs.unsupportedMajor }}
|
||||||
uses: actions-cool/issues-helper@e2ff99831a4f13625d35064e2b3dfe65c07a0396 # v3.7.5
|
uses: actions-cool/issues-helper@200c78641dbf33838311e5a1e0c31bbdb92d7cf0 # v3.8.0
|
||||||
with:
|
with:
|
||||||
actions: 'create-comment'
|
actions: 'create-comment'
|
||||||
token: ${{ steps.generate-token.outputs.token }}
|
token: ${{ steps.generate-token.outputs.token }}
|
||||||
|
|||||||
2
.github/workflows/issue-transferred.yml
vendored
2
.github/workflows/issue-transferred.yml
vendored
@@ -20,7 +20,7 @@ jobs:
|
|||||||
creds: ${{ secrets.ISSUE_TRIAGE_GH_APP_CREDS }}
|
creds: ${{ secrets.ISSUE_TRIAGE_GH_APP_CREDS }}
|
||||||
org: electron
|
org: electron
|
||||||
- name: Remove from issue triage
|
- name: Remove from issue triage
|
||||||
uses: dsanders11/project-actions/delete-item@2134fe7cc71c58b7ae259c82a8e63c6058255678 # v1.7.0
|
uses: dsanders11/project-actions/delete-item@5767984408ccc6742f83acc8b8d8ea5e09f329af # v2.0.0
|
||||||
with:
|
with:
|
||||||
token: ${{ steps.generate-token.outputs.token }}
|
token: ${{ steps.generate-token.outputs.token }}
|
||||||
project-number: 90
|
project-number: 90
|
||||||
|
|||||||
6
.github/workflows/issue-unlabeled.yml
vendored
6
.github/workflows/issue-unlabeled.yml
vendored
@@ -16,9 +16,11 @@ jobs:
|
|||||||
steps:
|
steps:
|
||||||
- name: Check for any blocked labels
|
- name: Check for any blocked labels
|
||||||
id: check-for-blocked-labels
|
id: check-for-blocked-labels
|
||||||
|
env:
|
||||||
|
LABELS_JSON: ${{ toJSON(github.event.issue.labels.*.name) }}
|
||||||
run: |
|
run: |
|
||||||
set -eo pipefail
|
set -eo pipefail
|
||||||
BLOCKED_LABEL_COUNT=$(echo '${{ toJSON(github.event.issue.labels.*.name) }}' | jq '[ .[] | select(startswith("blocked/")) ] | length')
|
BLOCKED_LABEL_COUNT=$(echo "$LABELS_JSON" | jq '[ .[] | select(startswith("blocked/")) ] | length')
|
||||||
if [[ $BLOCKED_LABEL_COUNT -eq 0 ]]; then
|
if [[ $BLOCKED_LABEL_COUNT -eq 0 ]]; then
|
||||||
echo "NOT_BLOCKED=1" >> "$GITHUB_OUTPUT"
|
echo "NOT_BLOCKED=1" >> "$GITHUB_OUTPUT"
|
||||||
fi
|
fi
|
||||||
@@ -31,7 +33,7 @@ jobs:
|
|||||||
org: electron
|
org: electron
|
||||||
- name: Set status
|
- name: Set status
|
||||||
if: ${{ steps.check-for-blocked-labels.outputs.NOT_BLOCKED }}
|
if: ${{ steps.check-for-blocked-labels.outputs.NOT_BLOCKED }}
|
||||||
uses: dsanders11/project-actions/edit-item@2134fe7cc71c58b7ae259c82a8e63c6058255678 # v1.7.0
|
uses: dsanders11/project-actions/edit-item@5767984408ccc6742f83acc8b8d8ea5e09f329af # v2.0.0
|
||||||
with:
|
with:
|
||||||
token: ${{ steps.generate-token.outputs.token }}
|
token: ${{ steps.generate-token.outputs.token }}
|
||||||
project-number: 90
|
project-number: 90
|
||||||
|
|||||||
2
.github/workflows/linux-publish.yml
vendored
2
.github/workflows/linux-publish.yml
vendored
@@ -6,7 +6,7 @@ on:
|
|||||||
build-image-sha:
|
build-image-sha:
|
||||||
type: string
|
type: string
|
||||||
description: 'SHA for electron/build image'
|
description: 'SHA for electron/build image'
|
||||||
default: 'a82b87d7a4f5ff0cab61405f8151ac4cf4942aeb'
|
default: 'eac3529546ea8f3aa356d31e345715eef342233b'
|
||||||
upload-to-storage:
|
upload-to-storage:
|
||||||
description: 'Uploads to Azure storage'
|
description: 'Uploads to Azure storage'
|
||||||
required: false
|
required: false
|
||||||
|
|||||||
2
.github/workflows/macos-publish.yml
vendored
2
.github/workflows/macos-publish.yml
vendored
@@ -6,7 +6,7 @@ on:
|
|||||||
build-image-sha:
|
build-image-sha:
|
||||||
type: string
|
type: string
|
||||||
description: 'SHA for electron/build image'
|
description: 'SHA for electron/build image'
|
||||||
default: 'a82b87d7a4f5ff0cab61405f8151ac4cf4942aeb'
|
default: 'eac3529546ea8f3aa356d31e345715eef342233b'
|
||||||
required: true
|
required: true
|
||||||
upload-to-storage:
|
upload-to-storage:
|
||||||
description: 'Uploads to Azure storage'
|
description: 'Uploads to Azure storage'
|
||||||
|
|||||||
@@ -10,6 +10,10 @@ on:
|
|||||||
- '.yarn/**'
|
- '.yarn/**'
|
||||||
- '.yarnrc.yml'
|
- '.yarnrc.yml'
|
||||||
|
|
||||||
|
# SECURITY: This workflow uses pull_request_target and has access to secrets.
|
||||||
|
# Do NOT checkout or run code from the PR head. All code execution must use
|
||||||
|
# the base branch only. Adding a ref to PR head would expose secrets to
|
||||||
|
# untrusted code.
|
||||||
permissions: {}
|
permissions: {}
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
@@ -45,5 +49,23 @@ jobs:
|
|||||||
env:
|
env:
|
||||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
PR_URL: ${{ github.event.pull_request.html_url }}
|
PR_URL: ${{ github.event.pull_request.html_url }}
|
||||||
|
PR_AUTHOR: ${{ github.event.pull_request.user.login }}
|
||||||
run: |
|
run: |
|
||||||
printf "<!-- disallowed-non-maintainer-change -->\n\nHello @${{ github.event.pull_request.user.login }}! It looks like this pull request touches one of our dependency or CI files, and per [our contribution policy](https://github.com/electron/electron/blob/main/CONTRIBUTING.md#dependencies-upgrades-policy) we do not accept these types of changes in PRs." | gh pr review $PR_URL -r --body-file=-
|
cat <<'REVIEW_EOF' | sed "s/%AUTHOR%/$PR_AUTHOR/g" | gh pr review $PR_URL -r --body-file=-
|
||||||
|
<!-- disallowed-non-maintainer-change -->
|
||||||
|
|
||||||
|
Hello @%AUTHOR%! It looks like this pull request touches one of our dependency or CI files, and per [our contribution policy](https://github.com/electron/electron/blob/main/CONTRIBUTING.md#dependencies-upgrades-policy) we do not accept these types of changes in PRs.
|
||||||
|
|
||||||
|
To move this PR forward, please:
|
||||||
|
|
||||||
|
1. Revert the dependency/CI file changes from your branch. (e.g. `yarn.lock`, `.yarn/`, `.yarnrc.yml`, `.github/workflows/`, `.github/actions/`)
|
||||||
|
2. Ensure your branch [allows maintainer commits](https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/working-with-forks/allowing-changes-to-a-pull-request-branch-created-from-a-fork) so a maintainer can push the necessary dependency changes on your behalf.
|
||||||
|
3. Leave a comment letting reviewers know the dependency change is still needed.
|
||||||
|
|
||||||
|
<details>
|
||||||
|
<summary>For maintainers</summary>
|
||||||
|
|
||||||
|
To land this PR, push a verified commit to the contributor's branch with the required dependency/CI changes, then dismiss this review.
|
||||||
|
|
||||||
|
</details>
|
||||||
|
REVIEW_EOF
|
||||||
|
|||||||
@@ -110,6 +110,21 @@ jobs:
|
|||||||
test-runs-on: ${{ inputs.test-runs-on }}
|
test-runs-on: ${{ inputs.test-runs-on }}
|
||||||
test-container: ${{ inputs.test-container }}
|
test-container: ${{ inputs.test-container }}
|
||||||
secrets: inherit
|
secrets: inherit
|
||||||
|
test-wayland:
|
||||||
|
uses: ./.github/workflows/pipeline-segment-electron-test.yml
|
||||||
|
permissions:
|
||||||
|
contents: read
|
||||||
|
issues: read
|
||||||
|
pull-requests: read
|
||||||
|
needs: build
|
||||||
|
if: ${{ inputs.target-platform == 'linux' && inputs.target-arch == 'x64' && !inputs.is-asan }}
|
||||||
|
with:
|
||||||
|
target-arch: ${{ inputs.target-arch }}
|
||||||
|
target-platform: ${{ inputs.target-platform }}
|
||||||
|
test-runs-on: ${{ inputs.test-runs-on }}
|
||||||
|
test-container: ${{ inputs.test-container }}
|
||||||
|
display-server: wayland
|
||||||
|
secrets: inherit
|
||||||
nn-test:
|
nn-test:
|
||||||
uses: ./.github/workflows/pipeline-segment-node-nan-test.yml
|
uses: ./.github/workflows/pipeline-segment-node-nan-test.yml
|
||||||
permissions:
|
permissions:
|
||||||
|
|||||||
@@ -35,7 +35,7 @@ jobs:
|
|||||||
- name: Generate DEPS Hash
|
- name: Generate DEPS Hash
|
||||||
run: |
|
run: |
|
||||||
node src/electron/script/generate-deps-hash.js
|
node src/electron/script/generate-deps-hash.js
|
||||||
DEPSHASH=v1-src-cache-$(cat src/electron/.depshash)
|
DEPSHASH=v2-src-cache-$(cat src/electron/.depshash)
|
||||||
echo "DEPSHASH=$DEPSHASH" >> $GITHUB_ENV
|
echo "DEPSHASH=$DEPSHASH" >> $GITHUB_ENV
|
||||||
echo "CACHE_PATH=$DEPSHASH.tar" >> $GITHUB_ENV
|
echo "CACHE_PATH=$DEPSHASH.tar" >> $GITHUB_ENV
|
||||||
- name: Restore src cache via AKS
|
- name: Restore src cache via AKS
|
||||||
|
|||||||
13
.github/workflows/pipeline-electron-lint.yml
vendored
13
.github/workflows/pipeline-electron-lint.yml
vendored
@@ -46,7 +46,11 @@ jobs:
|
|||||||
shell: bash
|
shell: bash
|
||||||
run: |
|
run: |
|
||||||
chromium_revision="$(grep -A1 chromium_version src/electron/DEPS | tr -d '\n' | cut -d\' -f4)"
|
chromium_revision="$(grep -A1 chromium_version src/electron/DEPS | tr -d '\n' | cut -d\' -f4)"
|
||||||
gn_version="$(curl -sL "https://chromium.googlesource.com/chromium/src/+/${chromium_revision}/DEPS?format=TEXT" | base64 -d | grep gn_version | head -n1 | cut -d\' -f4)"
|
if [[ ! "$chromium_revision" =~ ^[a-zA-Z0-9._-]+$ ]]; then
|
||||||
|
echo "::error::Invalid chromium_revision: $chromium_revision"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
gn_version="$(curl -sL "https://raw.githubusercontent.com/chromium/chromium/refs/tags/${chromium_revision}/DEPS" | grep gn_version | head -n1 | cut -d\' -f4)"
|
||||||
|
|
||||||
cipd ensure -ensure-file - -root . <<-CIPD
|
cipd ensure -ensure-file - -root . <<-CIPD
|
||||||
\$ServiceURL https://chrome-infra-packages.appspot.com/
|
\$ServiceURL https://chrome-infra-packages.appspot.com/
|
||||||
@@ -60,15 +64,18 @@ jobs:
|
|||||||
shell: bash
|
shell: bash
|
||||||
run: |
|
run: |
|
||||||
chromium_revision="$(grep -A1 chromium_version src/electron/DEPS | tr -d '\n' | cut -d\' -f4)"
|
chromium_revision="$(grep -A1 chromium_version src/electron/DEPS | tr -d '\n' | cut -d\' -f4)"
|
||||||
|
if [[ ! "$chromium_revision" =~ ^[a-zA-Z0-9._-]+$ ]]; then
|
||||||
|
echo "::error::Invalid chromium_revision: $chromium_revision"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
mkdir -p src/buildtools
|
mkdir -p src/buildtools
|
||||||
curl -sL "https://chromium.googlesource.com/chromium/src/+/${chromium_revision}/buildtools/DEPS?format=TEXT" | base64 -d > src/buildtools/DEPS
|
curl -sL "https://raw.githubusercontent.com/chromium/chromium/refs/tags/${chromium_revision}/buildtools/DEPS" > src/buildtools/DEPS
|
||||||
|
|
||||||
gclient sync --spec="solutions=[{'name':'src/buildtools','url':None,'deps_file':'DEPS','custom_vars':{'process_deps':True},'managed':False}]"
|
gclient sync --spec="solutions=[{'name':'src/buildtools','url':None,'deps_file':'DEPS','custom_vars':{'process_deps':True},'managed':False}]"
|
||||||
- name: Add problem matchers
|
- name: Add problem matchers
|
||||||
shell: bash
|
shell: bash
|
||||||
run: |
|
run: |
|
||||||
echo "::add-matcher::src/electron/.github/problem-matchers/eslint-stylish.json"
|
|
||||||
echo "::add-matcher::src/electron/.github/problem-matchers/markdownlint.json"
|
echo "::add-matcher::src/electron/.github/problem-matchers/markdownlint.json"
|
||||||
- name: Run Lint
|
- name: Run Lint
|
||||||
shell: bash
|
shell: bash
|
||||||
|
|||||||
@@ -124,7 +124,7 @@ jobs:
|
|||||||
run: df -h
|
run: df -h
|
||||||
- name: Setup Node.js/npm
|
- name: Setup Node.js/npm
|
||||||
if: ${{ inputs.target-platform == 'macos' }}
|
if: ${{ inputs.target-platform == 'macos' }}
|
||||||
uses: actions/setup-node@6044e13b5dc448c55e2357c09f80417699197238
|
uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f
|
||||||
with:
|
with:
|
||||||
node-version: 22.21.x
|
node-version: 22.21.x
|
||||||
cache: yarn
|
cache: yarn
|
||||||
@@ -156,7 +156,7 @@ jobs:
|
|||||||
- name: Generate DEPS Hash
|
- name: Generate DEPS Hash
|
||||||
run: |
|
run: |
|
||||||
node src/electron/script/generate-deps-hash.js
|
node src/electron/script/generate-deps-hash.js
|
||||||
DEPSHASH=v1-src-cache-$(cat src/electron/.depshash)
|
DEPSHASH=v2-src-cache-$(cat src/electron/.depshash)
|
||||||
echo "DEPSHASH=$DEPSHASH" >> $GITHUB_ENV
|
echo "DEPSHASH=$DEPSHASH" >> $GITHUB_ENV
|
||||||
echo "CACHE_PATH=$DEPSHASH.tar" >> $GITHUB_ENV
|
echo "CACHE_PATH=$DEPSHASH.tar" >> $GITHUB_ENV
|
||||||
- name: Restore src cache via AZCopy
|
- name: Restore src cache via AZCopy
|
||||||
|
|||||||
@@ -80,7 +80,7 @@ jobs:
|
|||||||
- name: Generate DEPS Hash
|
- name: Generate DEPS Hash
|
||||||
run: |
|
run: |
|
||||||
node src/electron/script/generate-deps-hash.js
|
node src/electron/script/generate-deps-hash.js
|
||||||
DEPSHASH=v1-src-cache-$(cat src/electron/.depshash)
|
DEPSHASH=v2-src-cache-$(cat src/electron/.depshash)
|
||||||
echo "DEPSHASH=$DEPSHASH" >> $GITHUB_ENV
|
echo "DEPSHASH=$DEPSHASH" >> $GITHUB_ENV
|
||||||
echo "CACHE_PATH=$DEPSHASH.tar" >> $GITHUB_ENV
|
echo "CACHE_PATH=$DEPSHASH.tar" >> $GITHUB_ENV
|
||||||
- name: Restore src cache via AZCopy
|
- name: Restore src cache via AZCopy
|
||||||
@@ -126,7 +126,7 @@ jobs:
|
|||||||
cd src/electron
|
cd src/electron
|
||||||
git pack-refs
|
git pack-refs
|
||||||
- name: Download Out Gen Artifacts
|
- name: Download Out Gen Artifacts
|
||||||
uses: actions/download-artifact@37930b1c2abaa49bbe596cd826c3c89aef350131
|
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c
|
||||||
with:
|
with:
|
||||||
name: out_gen_artifacts_${{ env.ARTIFACT_KEY }}
|
name: out_gen_artifacts_${{ env.ARTIFACT_KEY }}
|
||||||
path: ./src/out/${{ env.ELECTRON_OUT_DIR }}/gen
|
path: ./src/out/${{ env.ELECTRON_OUT_DIR }}/gen
|
||||||
|
|||||||
@@ -81,7 +81,7 @@ jobs:
|
|||||||
- name: Generate DEPS Hash
|
- name: Generate DEPS Hash
|
||||||
run: |
|
run: |
|
||||||
node src/electron/script/generate-deps-hash.js
|
node src/electron/script/generate-deps-hash.js
|
||||||
DEPSHASH=v1-src-cache-$(cat src/electron/.depshash)
|
DEPSHASH=v2-src-cache-$(cat src/electron/.depshash)
|
||||||
echo "DEPSHASH=$DEPSHASH" >> $GITHUB_ENV
|
echo "DEPSHASH=$DEPSHASH" >> $GITHUB_ENV
|
||||||
echo "CACHE_PATH=$DEPSHASH.tar" >> $GITHUB_ENV
|
echo "CACHE_PATH=$DEPSHASH.tar" >> $GITHUB_ENV
|
||||||
- name: Restore src cache via AZCopy
|
- name: Restore src cache via AZCopy
|
||||||
|
|||||||
@@ -132,7 +132,7 @@ jobs:
|
|||||||
run: df -h
|
run: df -h
|
||||||
- name: Setup Node.js/npm
|
- name: Setup Node.js/npm
|
||||||
if: ${{ inputs.target-platform == 'macos' }}
|
if: ${{ inputs.target-platform == 'macos' }}
|
||||||
uses: actions/setup-node@6044e13b5dc448c55e2357c09f80417699197238
|
uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f
|
||||||
with:
|
with:
|
||||||
node-version: 22.21.x
|
node-version: 22.21.x
|
||||||
cache: yarn
|
cache: yarn
|
||||||
@@ -165,7 +165,7 @@ jobs:
|
|||||||
- name: Generate DEPS Hash
|
- name: Generate DEPS Hash
|
||||||
run: |
|
run: |
|
||||||
node src/electron/script/generate-deps-hash.js
|
node src/electron/script/generate-deps-hash.js
|
||||||
DEPSHASH=v1-src-cache-$(cat src/electron/.depshash)
|
DEPSHASH=v2-src-cache-$(cat src/electron/.depshash)
|
||||||
echo "DEPSHASH=$DEPSHASH" >> $GITHUB_ENV
|
echo "DEPSHASH=$DEPSHASH" >> $GITHUB_ENV
|
||||||
echo "CACHE_PATH=$DEPSHASH.tar" >> $GITHUB_ENV
|
echo "CACHE_PATH=$DEPSHASH.tar" >> $GITHUB_ENV
|
||||||
- name: Restore src cache via AZCopy
|
- name: Restore src cache via AZCopy
|
||||||
|
|||||||
67
.github/workflows/pipeline-segment-electron-test-64k.yml
vendored
Normal file
67
.github/workflows/pipeline-segment-electron-test-64k.yml
vendored
Normal file
@@ -0,0 +1,67 @@
|
|||||||
|
name: Pipeline Segment - Electron Test on Linux ARM64 64k
|
||||||
|
|
||||||
|
on:
|
||||||
|
workflow_call:
|
||||||
|
inputs:
|
||||||
|
test-runs-on:
|
||||||
|
type: string
|
||||||
|
description: 'What host to run the tests on'
|
||||||
|
required: true
|
||||||
|
test-container:
|
||||||
|
type: string
|
||||||
|
description: 'JSON container information for aks runs-on'
|
||||||
|
required: false
|
||||||
|
default: '{"image":null}'
|
||||||
|
|
||||||
|
concurrency:
|
||||||
|
group: electron-test-linux-64k-${{ github.ref_protected == true && github.run_id || github.ref }}
|
||||||
|
cancel-in-progress: ${{ github.ref_protected != true }}
|
||||||
|
|
||||||
|
permissions: {}
|
||||||
|
|
||||||
|
env:
|
||||||
|
ELECTRON_OUT_DIR: Default
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
test-linux-arm64-64k:
|
||||||
|
env:
|
||||||
|
BUILD_TYPE: linux
|
||||||
|
TARGET_ARCH: arm64
|
||||||
|
defaults:
|
||||||
|
run:
|
||||||
|
shell: bash
|
||||||
|
runs-on: ${{ inputs.test-runs-on }}
|
||||||
|
permissions:
|
||||||
|
contents: read
|
||||||
|
issues: read
|
||||||
|
pull-requests: read
|
||||||
|
steps:
|
||||||
|
- name: Checkout Electron
|
||||||
|
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd
|
||||||
|
with:
|
||||||
|
path: src/electron
|
||||||
|
fetch-depth: 0
|
||||||
|
ref: ${{ github.event.pull_request.head.sha }}
|
||||||
|
- name: Download Generated Artifacts
|
||||||
|
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c
|
||||||
|
with:
|
||||||
|
name: generated_artifacts_linux_arm64
|
||||||
|
path: ./generated_artifacts_linux_arm64
|
||||||
|
- name: Restore Generated Artifacts
|
||||||
|
run: ./src/electron/script/actions/restore-artifacts.sh
|
||||||
|
- name: Unzip Dist
|
||||||
|
run: |
|
||||||
|
cd src/out/Default
|
||||||
|
unzip -:o dist.zip
|
||||||
|
|
||||||
|
- name: Run Electron Tests in QEMU 64k Container
|
||||||
|
shell: bash
|
||||||
|
env:
|
||||||
|
MOCHA_REPORTER: mocha-multi-reporters
|
||||||
|
MOCHA_MULTI_REPORTERS: mocha-junit-reporter, tap
|
||||||
|
ELECTRON_DISABLE_SECURITY_WARNINGS: 1
|
||||||
|
DISPLAY: ':99.0'
|
||||||
|
run: |
|
||||||
|
container=$(echo '${{ inputs.test-container }}' | jq -r '.image')
|
||||||
|
src/electron/script/run-qemu-64k.sh --container $container --testfiles "`pwd`/src"
|
||||||
|
|
||||||
@@ -30,9 +30,14 @@ on:
|
|||||||
required: false
|
required: false
|
||||||
type: boolean
|
type: boolean
|
||||||
default: false
|
default: false
|
||||||
|
display-server:
|
||||||
|
description: 'Display backend for Linux tests: x11 or wayland'
|
||||||
|
required: false
|
||||||
|
type: string
|
||||||
|
default: x11
|
||||||
|
|
||||||
concurrency:
|
concurrency:
|
||||||
group: electron-test-${{ inputs.target-platform }}-${{ inputs.target-arch }}-${{ inputs.is-asan }}-${{ github.ref_protected == true && github.run_id || github.ref }}
|
group: electron-test-${{ inputs.target-platform }}-${{ inputs.target-arch }}-${{ inputs.is-asan }}-${{ inputs.display-server }}-${{ github.ref_protected == true && github.run_id || github.ref }}
|
||||||
cancel-in-progress: ${{ github.ref_protected != true }}
|
cancel-in-progress: ${{ github.ref_protected != true }}
|
||||||
|
|
||||||
permissions: {}
|
permissions: {}
|
||||||
@@ -43,6 +48,8 @@ env:
|
|||||||
ELECTRON_OUT_DIR: Default
|
ELECTRON_OUT_DIR: Default
|
||||||
ELECTRON_RBE_JWT: ${{ secrets.ELECTRON_RBE_JWT }}
|
ELECTRON_RBE_JWT: ${{ secrets.ELECTRON_RBE_JWT }}
|
||||||
ACTIONS_STEP_DEBUG: ${{ secrets.ACTIONS_STEP_DEBUG }}
|
ACTIONS_STEP_DEBUG: ${{ secrets.ACTIONS_STEP_DEBUG }}
|
||||||
|
# @sentry/cli is only needed by release upload-symbols.py; skip the ~17MB CDN download on test jobs
|
||||||
|
SENTRYCLI_SKIP_DOWNLOAD: 1
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
test:
|
test:
|
||||||
@@ -59,7 +66,7 @@ jobs:
|
|||||||
fail-fast: false
|
fail-fast: false
|
||||||
matrix:
|
matrix:
|
||||||
build-type: ${{ inputs.target-platform == 'macos' && fromJSON('["darwin","mas"]') || (inputs.target-platform == 'win' && fromJSON('["win"]') || fromJSON('["linux"]')) }}
|
build-type: ${{ inputs.target-platform == 'macos' && fromJSON('["darwin","mas"]') || (inputs.target-platform == 'win' && fromJSON('["win"]') || fromJSON('["linux"]')) }}
|
||||||
shard: ${{ inputs.target-platform == 'linux' && fromJSON('[1, 2, 3]') || fromJSON('[1, 2]') }}
|
shard: ${{ case(inputs.display-server == 'wayland', fromJSON('[1]'), inputs.target-platform == 'linux', fromJSON('[1, 2, 3]'), fromJSON('[1, 2]')) }}
|
||||||
env:
|
env:
|
||||||
BUILD_TYPE: ${{ matrix.build-type }}
|
BUILD_TYPE: ${{ matrix.build-type }}
|
||||||
TARGET_ARCH: ${{ inputs.target-arch }}
|
TARGET_ARCH: ${{ inputs.target-arch }}
|
||||||
@@ -72,7 +79,7 @@ jobs:
|
|||||||
cp $(which node) /mnt/runner-externals/node24/bin/
|
cp $(which node) /mnt/runner-externals/node24/bin/
|
||||||
- name: Setup Node.js/npm
|
- name: Setup Node.js/npm
|
||||||
if: ${{ inputs.target-platform == 'win' }}
|
if: ${{ inputs.target-platform == 'win' }}
|
||||||
uses: actions/setup-node@6044e13b5dc448c55e2357c09f80417699197238
|
uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f
|
||||||
with:
|
with:
|
||||||
node-version: 22.21.x
|
node-version: 22.21.x
|
||||||
- name: Add TCC permissions on macOS
|
- name: Add TCC permissions on macOS
|
||||||
@@ -168,12 +175,12 @@ jobs:
|
|||||||
echo "DISABLE_CRASH_REPORTER_TESTS=true" >> $GITHUB_ENV
|
echo "DISABLE_CRASH_REPORTER_TESTS=true" >> $GITHUB_ENV
|
||||||
echo "IS_ASAN=true" >> $GITHUB_ENV
|
echo "IS_ASAN=true" >> $GITHUB_ENV
|
||||||
- name: Download Generated Artifacts
|
- name: Download Generated Artifacts
|
||||||
uses: actions/download-artifact@37930b1c2abaa49bbe596cd826c3c89aef350131
|
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c
|
||||||
with:
|
with:
|
||||||
name: generated_artifacts_${{ env.ARTIFACT_KEY }}
|
name: generated_artifacts_${{ env.ARTIFACT_KEY }}
|
||||||
path: ./generated_artifacts_${{ matrix.build-type }}_${{ inputs.target-arch }}
|
path: ./generated_artifacts_${{ matrix.build-type }}_${{ inputs.target-arch }}
|
||||||
- name: Download Src Artifacts
|
- name: Download Src Artifacts
|
||||||
uses: actions/download-artifact@37930b1c2abaa49bbe596cd826c3c89aef350131
|
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c
|
||||||
with:
|
with:
|
||||||
name: src_artifacts_${{ env.ARTIFACT_KEY }}
|
name: src_artifacts_${{ env.ARTIFACT_KEY }}
|
||||||
path: ./src_artifacts_${{ matrix.build-type }}_${{ inputs.target-arch }}
|
path: ./src_artifacts_${{ matrix.build-type }}_${{ inputs.target-arch }}
|
||||||
@@ -191,15 +198,25 @@ jobs:
|
|||||||
run: |
|
run: |
|
||||||
cd src/out/Default
|
cd src/out/Default
|
||||||
unzip -:o dist.zip
|
unzip -:o dist.zip
|
||||||
#- name: Import & Trust Self-Signed Codesigning Cert on MacOS
|
- name: Import & Trust Self-Signed Codesigning Cert on MacOS
|
||||||
# if: ${{ inputs.target-platform == 'macos' && inputs.target-arch == 'x64' }}
|
if: ${{ inputs.target-platform == 'macos' }}
|
||||||
# run: |
|
run: |
|
||||||
# sudo security authorizationdb write com.apple.trust-settings.admin allow
|
cd src/electron
|
||||||
# cd src/electron
|
./script/codesign/generate-identity.sh
|
||||||
# ./script/codesign/generate-identity.sh
|
# Sign with our self-signed cert so that macOS system integrations
|
||||||
|
# (UNNotifications, dock bounce, etc.) work in tests on both architectures.
|
||||||
|
# Autoupdater tests sign their own fixture copies via signApp().
|
||||||
|
- name: Sign Electron.app for macOS tests
|
||||||
|
if: ${{ inputs.target-platform == 'macos' }}
|
||||||
|
run: |
|
||||||
|
identity=$(src/electron/script/codesign/get-trusted-identity.sh)
|
||||||
|
if [ -n "$identity" ]; then
|
||||||
|
codesign -s "$identity" --deep --force src/out/Default/Electron.app
|
||||||
|
fi
|
||||||
|
|
||||||
- name: Run Electron Tests
|
- name: Run Electron Tests
|
||||||
shell: bash
|
shell: bash
|
||||||
|
timeout-minutes: 60
|
||||||
env:
|
env:
|
||||||
MOCHA_REPORTER: mocha-multi-reporters
|
MOCHA_REPORTER: mocha-multi-reporters
|
||||||
MOCHA_MULTI_REPORTERS: mocha-junit-reporter, tap
|
MOCHA_MULTI_REPORTERS: mocha-junit-reporter, tap
|
||||||
@@ -210,7 +227,22 @@ jobs:
|
|||||||
cd src/electron
|
cd src/electron
|
||||||
export ELECTRON_TEST_RESULTS_DIR=`pwd`/junit
|
export ELECTRON_TEST_RESULTS_DIR=`pwd`/junit
|
||||||
# Get which tests are on this shard
|
# Get which tests are on this shard
|
||||||
tests_files=$(node script/split-tests ${{ matrix.shard }} ${{ inputs.target-platform == 'linux' && 3 || 2 }})
|
tests_files=$(node script/split-tests ${{ matrix.shard }} ${{ case(inputs.display-server == 'wayland', 1, inputs.target-platform == 'linux', 3, 2) }})
|
||||||
|
if [ "${{ inputs.display-server }}" = "wayland" ]; then
|
||||||
|
allowlist_file=script/wayland-test-allowlist.txt
|
||||||
|
filtered_tests=""
|
||||||
|
for test_file in $tests_files; do
|
||||||
|
if grep -Fxq "$test_file" "$allowlist_file"; then
|
||||||
|
filtered_tests="$filtered_tests $test_file"
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
tests_files="${filtered_tests# }"
|
||||||
|
|
||||||
|
if [ -z "$tests_files" ]; then
|
||||||
|
echo "No tests matched Wayland filter, skipping."
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
# Run tests
|
# Run tests
|
||||||
if [ "${{ inputs.target-platform }}" != "linux" ]; then
|
if [ "${{ inputs.target-platform }}" != "linux" ]; then
|
||||||
@@ -245,11 +277,28 @@ jobs:
|
|||||||
if [ "${{ inputs.target-arch }}" = "arm" ]; then
|
if [ "${{ inputs.target-arch }}" = "arm" ]; then
|
||||||
runuser -u builduser -- xvfb-run script/actions/run-tests.sh script/yarn.js test --skipYarnInstall --runners=main --enableRerun=3 --trace-uncaught --enable-logging --files $tests_files
|
runuser -u builduser -- xvfb-run script/actions/run-tests.sh script/yarn.js test --skipYarnInstall --runners=main --enableRerun=3 --trace-uncaught --enable-logging --files $tests_files
|
||||||
else
|
else
|
||||||
runuser -u builduser -- xvfb-run script/actions/run-tests.sh script/yarn.js test --runners=main --enableRerun=3 --trace-uncaught --enable-logging --files $tests_files
|
if [ "${{ inputs.display-server }}" = "wayland" ]; then
|
||||||
|
runuser -u builduser -- script/actions/run-tests-wayland.sh script/yarn.js test --runners=main --enableRerun=3 --trace-uncaught --enable-logging --files $tests_files
|
||||||
|
else
|
||||||
|
runuser -u builduser -- xvfb-run script/actions/run-tests.sh script/yarn.js test --runners=main --enableRerun=3 --trace-uncaught --enable-logging --files $tests_files
|
||||||
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
- name: Take screenshot on timeout or cancellation
|
||||||
|
if: ${{ inputs.target-platform != 'linux' && (cancelled() || failure()) }}
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
screenshot_dir="src/electron/spec/artifacts"
|
||||||
|
mkdir -p "$screenshot_dir"
|
||||||
|
screenshot_file="$screenshot_dir/screenshot-timeout-$(date +%Y%m%d%H%M%S).png"
|
||||||
|
if [ "${{ inputs.target-platform }}" = "macos" ]; then
|
||||||
|
screencapture -x "$screenshot_file" || true
|
||||||
|
elif [ "${{ inputs.target-platform }}" = "win" ]; then
|
||||||
|
powershell -command "Add-Type -AssemblyName System.Windows.Forms; \$screen = [System.Windows.Forms.Screen]::PrimaryScreen.Bounds; \$bitmap = New-Object System.Drawing.Bitmap(\$screen.Width, \$screen.Height); \$graphics = [System.Drawing.Graphics]::FromImage(\$bitmap); \$graphics.CopyFromScreen(\$screen.Location, [System.Drawing.Point]::Empty, \$screen.Size); \$bitmap.Save('$screenshot_file')" || true
|
||||||
|
fi
|
||||||
|
|
||||||
- name: Upload Test results to Datadog
|
- name: Upload Test results to Datadog
|
||||||
env:
|
env:
|
||||||
DD_ENV: ci
|
DD_ENV: ci
|
||||||
@@ -265,10 +314,10 @@ jobs:
|
|||||||
fi
|
fi
|
||||||
if: always() && !cancelled()
|
if: always() && !cancelled()
|
||||||
- name: Upload Test Artifacts
|
- name: Upload Test Artifacts
|
||||||
if: always() && !cancelled()
|
if: always()
|
||||||
uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f
|
uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f #v7.0.0
|
||||||
with:
|
with:
|
||||||
name: test_artifacts_${{ env.ARTIFACT_KEY }}_${{ matrix.shard }}
|
name: ${{ inputs.target-platform == 'linux' && format('test_artifacts_{0}_{1}_{2}', env.ARTIFACT_KEY, inputs.display-server, matrix.shard) || format('test_artifacts_{0}_{1}', env.ARTIFACT_KEY, matrix.shard) }}
|
||||||
path: src/electron/spec/artifacts
|
path: src/electron/spec/artifacts
|
||||||
if-no-files-found: ignore
|
if-no-files-found: ignore
|
||||||
- name: Wait for active SSH sessions
|
- name: Wait for active SSH sessions
|
||||||
|
|||||||
@@ -36,6 +36,8 @@ env:
|
|||||||
CHROMIUM_GIT_COOKIE: ${{ secrets.CHROMIUM_GIT_COOKIE }}
|
CHROMIUM_GIT_COOKIE: ${{ secrets.CHROMIUM_GIT_COOKIE }}
|
||||||
ELECTRON_OUT_DIR: Default
|
ELECTRON_OUT_DIR: Default
|
||||||
ELECTRON_RBE_JWT: ${{ secrets.ELECTRON_RBE_JWT }}
|
ELECTRON_RBE_JWT: ${{ secrets.ELECTRON_RBE_JWT }}
|
||||||
|
# @sentry/cli is only needed by release upload-symbols.py; skip the ~17MB CDN download on test jobs
|
||||||
|
SENTRYCLI_SKIP_DOWNLOAD: 1
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
node-tests:
|
node-tests:
|
||||||
@@ -65,12 +67,12 @@ jobs:
|
|||||||
- name: Install Dependencies
|
- name: Install Dependencies
|
||||||
uses: ./src/electron/.github/actions/install-dependencies
|
uses: ./src/electron/.github/actions/install-dependencies
|
||||||
- name: Download Generated Artifacts
|
- name: Download Generated Artifacts
|
||||||
uses: actions/download-artifact@37930b1c2abaa49bbe596cd826c3c89aef350131
|
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c
|
||||||
with:
|
with:
|
||||||
name: generated_artifacts_${{ env.BUILD_TYPE }}_${{ env.TARGET_ARCH }}
|
name: generated_artifacts_${{ env.BUILD_TYPE }}_${{ env.TARGET_ARCH }}
|
||||||
path: ./generated_artifacts_${{ env.BUILD_TYPE }}_${{ env.TARGET_ARCH }}
|
path: ./generated_artifacts_${{ env.BUILD_TYPE }}_${{ env.TARGET_ARCH }}
|
||||||
- name: Download Src Artifacts
|
- name: Download Src Artifacts
|
||||||
uses: actions/download-artifact@37930b1c2abaa49bbe596cd826c3c89aef350131
|
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c
|
||||||
with:
|
with:
|
||||||
name: src_artifacts_linux_${{ env.TARGET_ARCH }}
|
name: src_artifacts_linux_${{ env.TARGET_ARCH }}
|
||||||
path: ./src_artifacts_linux_${{ env.TARGET_ARCH }}
|
path: ./src_artifacts_linux_${{ env.TARGET_ARCH }}
|
||||||
@@ -121,12 +123,12 @@ jobs:
|
|||||||
- name: Install Dependencies
|
- name: Install Dependencies
|
||||||
uses: ./src/electron/.github/actions/install-dependencies
|
uses: ./src/electron/.github/actions/install-dependencies
|
||||||
- name: Download Generated Artifacts
|
- name: Download Generated Artifacts
|
||||||
uses: actions/download-artifact@37930b1c2abaa49bbe596cd826c3c89aef350131
|
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c
|
||||||
with:
|
with:
|
||||||
name: generated_artifacts_${{ env.BUILD_TYPE }}_${{ env.TARGET_ARCH }}
|
name: generated_artifacts_${{ env.BUILD_TYPE }}_${{ env.TARGET_ARCH }}
|
||||||
path: ./generated_artifacts_${{ env.BUILD_TYPE }}_${{ env.TARGET_ARCH }}
|
path: ./generated_artifacts_${{ env.BUILD_TYPE }}_${{ env.TARGET_ARCH }}
|
||||||
- name: Download Src Artifacts
|
- name: Download Src Artifacts
|
||||||
uses: actions/download-artifact@37930b1c2abaa49bbe596cd826c3c89aef350131
|
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c
|
||||||
with:
|
with:
|
||||||
name: src_artifacts_linux_${{ env.TARGET_ARCH }}
|
name: src_artifacts_linux_${{ env.TARGET_ARCH }}
|
||||||
path: ./src_artifacts_linux_${{ env.TARGET_ARCH }}
|
path: ./src_artifacts_linux_${{ env.TARGET_ARCH }}
|
||||||
|
|||||||
58
.github/workflows/pr-template-check.yml
vendored
Normal file
58
.github/workflows/pr-template-check.yml
vendored
Normal file
@@ -0,0 +1,58 @@
|
|||||||
|
name: PR Template Check
|
||||||
|
|
||||||
|
on:
|
||||||
|
pull_request_target:
|
||||||
|
types: [opened, ready_for_review]
|
||||||
|
|
||||||
|
# SECURITY: This workflow uses pull_request_target and has access to secrets.
|
||||||
|
# Do NOT checkout or run code from the PR head. All code execution must use
|
||||||
|
# the base branch only. Adding a ref to PR head would expose secrets to
|
||||||
|
# untrusted code.
|
||||||
|
permissions: {}
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
check-pr-template:
|
||||||
|
if: ${{ github.event.pull_request.head.repo.fork && !github.event.pull_request.draft && !startsWith(github.head_ref, 'roller/') }}
|
||||||
|
name: Check PR Template
|
||||||
|
runs-on: ubuntu-slim
|
||||||
|
permissions:
|
||||||
|
contents: read
|
||||||
|
pull-requests: write
|
||||||
|
steps:
|
||||||
|
- name: Checkout
|
||||||
|
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd
|
||||||
|
with:
|
||||||
|
sparse-checkout: .github/PULL_REQUEST_TEMPLATE.md
|
||||||
|
sparse-checkout-cone-mode: false
|
||||||
|
- name: Check for required sections
|
||||||
|
uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8.0.0
|
||||||
|
with:
|
||||||
|
script: |
|
||||||
|
const fs = require('fs');
|
||||||
|
const template = fs.readFileSync('.github/PULL_REQUEST_TEMPLATE.md', 'utf8');
|
||||||
|
const requiredSections = [...template.matchAll(/^(#{1,4} .+)$/gm)].map(
|
||||||
|
(m) => m[1],
|
||||||
|
);
|
||||||
|
if (requiredSections.length === 0) {
|
||||||
|
console.log('No heading sections found in PR template');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
const body = context.payload.pull_request.body || '';
|
||||||
|
const missingSections = requiredSections.filter(
|
||||||
|
(section) => !body.includes(section),
|
||||||
|
);
|
||||||
|
if (missingSections.length > 0) {
|
||||||
|
const list = missingSections.map((s) => `- \`${s}\``).join('\n');
|
||||||
|
await github.rest.issues.createComment({
|
||||||
|
owner: context.repo.owner,
|
||||||
|
repo: context.repo.repo,
|
||||||
|
issue_number: context.payload.pull_request.number,
|
||||||
|
body: `This PR was automatically closed because the PR template was not properly filled out. The following required sections are missing:\n\n${list}\n\nPlease update your PR description to include all required sections and reopen the PR.`,
|
||||||
|
});
|
||||||
|
await github.rest.pulls.update({
|
||||||
|
owner: context.repo.owner,
|
||||||
|
repo: context.repo.repo,
|
||||||
|
pull_number: context.payload.pull_request.number,
|
||||||
|
state: 'closed',
|
||||||
|
});
|
||||||
|
}
|
||||||
46
.github/workflows/pr-triage-automation.yml
vendored
Normal file
46
.github/workflows/pr-triage-automation.yml
vendored
Normal file
@@ -0,0 +1,46 @@
|
|||||||
|
name: PR Triage Automation
|
||||||
|
|
||||||
|
on:
|
||||||
|
pull_request_target:
|
||||||
|
types: [synchronize, review_requested]
|
||||||
|
issue_comment:
|
||||||
|
types: [created]
|
||||||
|
|
||||||
|
# SECURITY: This workflow uses pull_request_target and has access to secrets.
|
||||||
|
# Do NOT checkout or run code from the PR head. All code execution must use
|
||||||
|
# the base branch only. Adding a ref to PR head would expose secrets to
|
||||||
|
# untrusted code.
|
||||||
|
permissions: {}
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
set-needs-review:
|
||||||
|
name: Set status to Needs Review
|
||||||
|
if: >-
|
||||||
|
(github.event_name == 'pull_request_target'
|
||||||
|
&& github.event.pull_request.state == 'open'
|
||||||
|
&& github.event.pull_request.draft != true
|
||||||
|
&& !contains(github.event.pull_request.labels.*.name, 'wip ⚒')
|
||||||
|
&& (github.event.action == 'synchronize' || github.event.action == 'review_requested'))
|
||||||
|
|| (github.event_name == 'issue_comment'
|
||||||
|
&& github.event.issue.pull_request
|
||||||
|
&& github.event.issue.state == 'open'
|
||||||
|
&& !contains(github.event.issue.labels.*.name, 'wip ⚒')
|
||||||
|
&& github.event.comment.user.login == github.event.issue.user.login)
|
||||||
|
runs-on: ubuntu-slim
|
||||||
|
permissions:
|
||||||
|
contents: read
|
||||||
|
steps:
|
||||||
|
- name: Generate GitHub App token
|
||||||
|
uses: electron/github-app-auth-action@e14e47722ed120360649d0789e25b9baece12725 # v2.0.0
|
||||||
|
id: generate-token
|
||||||
|
with:
|
||||||
|
creds: ${{ secrets.ISSUE_TRIAGE_GH_APP_CREDS }}
|
||||||
|
org: electron
|
||||||
|
- name: Set status to Needs Review
|
||||||
|
uses: dsanders11/project-actions/edit-item@5767984408ccc6742f83acc8b8d8ea5e09f329af # v2.0.0
|
||||||
|
with:
|
||||||
|
token: ${{ steps.generate-token.outputs.token }}
|
||||||
|
project-number: 118
|
||||||
|
field: Status
|
||||||
|
field-value: 🌀 Needs Review
|
||||||
|
fail-if-item-not-found: false
|
||||||
14
.github/workflows/pull-request-labeled.yml
vendored
14
.github/workflows/pull-request-labeled.yml
vendored
@@ -4,6 +4,10 @@ on:
|
|||||||
pull_request_target:
|
pull_request_target:
|
||||||
types: [labeled]
|
types: [labeled]
|
||||||
|
|
||||||
|
# SECURITY: This workflow uses pull_request_target and has access to secrets.
|
||||||
|
# Do NOT checkout or run code from the PR head. All code execution must use
|
||||||
|
# the base branch only. Adding a ref to PR head would expose secrets to
|
||||||
|
# untrusted code.
|
||||||
permissions: {}
|
permissions: {}
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
@@ -14,7 +18,7 @@ jobs:
|
|||||||
permissions: {}
|
permissions: {}
|
||||||
steps:
|
steps:
|
||||||
- name: Trigger Slack workflow
|
- name: Trigger Slack workflow
|
||||||
uses: slackapi/slack-github-action@91efab103c0de0a537f72a35f6b8cda0ee76bf0a # v2.1.1
|
uses: slackapi/slack-github-action@af78098f536edbc4de71162a307590698245be95 # v3.0.1
|
||||||
with:
|
with:
|
||||||
webhook: ${{ secrets.BACKPORT_REQUESTED_SLACK_WEBHOOK_URL }}
|
webhook: ${{ secrets.BACKPORT_REQUESTED_SLACK_WEBHOOK_URL }}
|
||||||
webhook-type: webhook-trigger
|
webhook-type: webhook-trigger
|
||||||
@@ -38,7 +42,7 @@ jobs:
|
|||||||
creds: ${{ secrets.RELEASE_BOARD_GH_APP_CREDS }}
|
creds: ${{ secrets.RELEASE_BOARD_GH_APP_CREDS }}
|
||||||
org: electron
|
org: electron
|
||||||
- name: Set status
|
- name: Set status
|
||||||
uses: dsanders11/project-actions/edit-item@2134fe7cc71c58b7ae259c82a8e63c6058255678 # v1.7.0
|
uses: dsanders11/project-actions/edit-item@5767984408ccc6742f83acc8b8d8ea5e09f329af # v2.0.0
|
||||||
with:
|
with:
|
||||||
token: ${{ steps.generate-token.outputs.token }}
|
token: ${{ steps.generate-token.outputs.token }}
|
||||||
project-number: 94
|
project-number: 94
|
||||||
@@ -46,7 +50,7 @@ jobs:
|
|||||||
field-value: ✅ Reviewed
|
field-value: ✅ Reviewed
|
||||||
pull-request-labeled-ai-pr:
|
pull-request-labeled-ai-pr:
|
||||||
name: ai-pr label added
|
name: ai-pr label added
|
||||||
if: github.event.label.name == 'ai-pr'
|
if: github.event.label.name == 'ai-pr' && github.event.pull_request.state != 'closed'
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
permissions: {}
|
permissions: {}
|
||||||
steps:
|
steps:
|
||||||
@@ -56,7 +60,7 @@ jobs:
|
|||||||
with:
|
with:
|
||||||
creds: ${{ secrets.ISSUE_TRIAGE_GH_APP_CREDS }}
|
creds: ${{ secrets.ISSUE_TRIAGE_GH_APP_CREDS }}
|
||||||
- name: Create comment
|
- name: Create comment
|
||||||
uses: actions-cool/issues-helper@e2ff99831a4f13625d35064e2b3dfe65c07a0396 # v3.7.5
|
uses: actions-cool/issues-helper@200c78641dbf33838311e5a1e0c31bbdb92d7cf0 # v3.8.0
|
||||||
with:
|
with:
|
||||||
actions: 'create-comment'
|
actions: 'create-comment'
|
||||||
token: ${{ steps.generate-token.outputs.token }}
|
token: ${{ steps.generate-token.outputs.token }}
|
||||||
@@ -68,7 +72,7 @@ jobs:
|
|||||||
|
|
||||||
Hello @${{ github.event.pull_request.user.login }}. Due to the high amount of AI spam PRs we receive, if a PR is detected to be majority AI-generated without disclosure and untested, we will automatically close the PR.
|
Hello @${{ github.event.pull_request.user.login }}. Due to the high amount of AI spam PRs we receive, if a PR is detected to be majority AI-generated without disclosure and untested, we will automatically close the PR.
|
||||||
|
|
||||||
We welcome the use of AI tools, as long as the PR meets our quality standards and has clearly been built and tested. If you believe your PR was closed in error, we welcome you to resubmit. However, please read our [CONTRIBUTING.md](http://contributing.md/) carefully before reopening. Thanks for your contribution.
|
We welcome the use of AI tools, as long as the PR meets our quality standards and has clearly been built and tested. If you believe your PR was closed in error, we welcome you to resubmit. However, please read our [CONTRIBUTING.md](https://github.com/electron/electron/blob/main/CONTRIBUTING.md) and [AI Tool Policy](https://github.com/electron/governance/blob/main/policy/ai.md) carefully before reopening. Thanks for your contribution.
|
||||||
- name: Close the pull request
|
- name: Close the pull request
|
||||||
env:
|
env:
|
||||||
GITHUB_TOKEN: ${{ steps.generate-token.outputs.token }}
|
GITHUB_TOKEN: ${{ steps.generate-token.outputs.token }}
|
||||||
|
|||||||
39
.github/workflows/pull-request-opened-synchronized.yml
vendored
Normal file
39
.github/workflows/pull-request-opened-synchronized.yml
vendored
Normal file
@@ -0,0 +1,39 @@
|
|||||||
|
name: Pull Request Opened/Synchronized
|
||||||
|
|
||||||
|
on:
|
||||||
|
pull_request_target:
|
||||||
|
types: [opened, synchronize]
|
||||||
|
|
||||||
|
# SECURITY: This workflow uses pull_request_target and has access to secrets.
|
||||||
|
# Do NOT checkout or run code from the PR head. All code execution must use
|
||||||
|
# the base branch only. Adding a ref to PR head would expose secrets to
|
||||||
|
# untrusted code.
|
||||||
|
permissions: {}
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
check-signed-commits:
|
||||||
|
name: Check signed commits in PR
|
||||||
|
if: ${{ !contains(github.event.pull_request.labels.*.name, 'needs-signed-commits')}}
|
||||||
|
runs-on: ubuntu-slim
|
||||||
|
permissions:
|
||||||
|
contents: read
|
||||||
|
pull-requests: write
|
||||||
|
steps:
|
||||||
|
- name: Check signed commits in PR
|
||||||
|
uses: 1Password/check-signed-commits-action@ed2885f3ed2577a4f5d3c3fe895432a557d23d52 # v1
|
||||||
|
with:
|
||||||
|
comment: |
|
||||||
|
⚠️ This PR contains unsigned commits. This repository enforces [commit signatures](https://docs.github.com/en/authentication/managing-commit-signature-verification)
|
||||||
|
for all incoming PRs. To get your PR merged, please sign those commits
|
||||||
|
(`git rebase --exec 'git commit -S --amend --no-edit -n' @{upstream}`) and force push them to this branch
|
||||||
|
(`git push --force-with-lease`)
|
||||||
|
|
||||||
|
For more information on signing commits, see GitHub's documentation on [Telling Git about your signing key](https://docs.github.com/en/authentication/managing-commit-signature-verification/telling-git-about-your-signing-key).
|
||||||
|
|
||||||
|
- name: Add needs-signed-commits label
|
||||||
|
if: ${{ failure() }}
|
||||||
|
env:
|
||||||
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
PR_URL: ${{ github.event.pull_request.html_url }}
|
||||||
|
run: |
|
||||||
|
gh pr edit $PR_URL --add-label needs-signed-commits
|
||||||
4
.github/workflows/scorecards.yml
vendored
4
.github/workflows/scorecards.yml
vendored
@@ -43,7 +43,7 @@ jobs:
|
|||||||
# Upload the results as artifacts (optional). Commenting out will disable uploads of run results in SARIF
|
# Upload the results as artifacts (optional). Commenting out will disable uploads of run results in SARIF
|
||||||
# format to the repository Actions tab.
|
# format to the repository Actions tab.
|
||||||
- name: "Upload artifact"
|
- name: "Upload artifact"
|
||||||
uses: actions/upload-artifact@b7c566a772e6b6bfb58ed0dc250532a479d7789f # v6.0.0
|
uses: actions/upload-artifact@bbbca2ddaa5d8feaa63e36b76fdaad77386f024f # v7.0.0
|
||||||
with:
|
with:
|
||||||
name: SARIF file
|
name: SARIF file
|
||||||
path: results.sarif
|
path: results.sarif
|
||||||
@@ -51,6 +51,6 @@ jobs:
|
|||||||
|
|
||||||
# Upload the results to GitHub's code scanning dashboard.
|
# Upload the results to GitHub's code scanning dashboard.
|
||||||
- name: "Upload to code-scanning"
|
- name: "Upload to code-scanning"
|
||||||
uses: github/codeql-action/upload-sarif@45cbd0c69e560cd9e7cd7f8c32362050c9b7ded2 # v3.29.5
|
uses: github/codeql-action/upload-sarif@c10b8064de6f491fea524254123dbe5e09572f13 # v3.29.5
|
||||||
with:
|
with:
|
||||||
sarif_file: results.sarif
|
sarif_file: results.sarif
|
||||||
|
|||||||
2
.github/workflows/stable-prep-items.yml
vendored
2
.github/workflows/stable-prep-items.yml
vendored
@@ -29,7 +29,7 @@ jobs:
|
|||||||
PROJECT_NUMBER=$(gh project list --owner electron --format json | jq -r '.projects | map(select(.title | test("^[0-9]+-x-y$"))) | max_by(.number) | .number')
|
PROJECT_NUMBER=$(gh project list --owner electron --format json | jq -r '.projects | map(select(.title | test("^[0-9]+-x-y$"))) | max_by(.number) | .number')
|
||||||
echo "PROJECT_NUMBER=$PROJECT_NUMBER" >> "$GITHUB_OUTPUT"
|
echo "PROJECT_NUMBER=$PROJECT_NUMBER" >> "$GITHUB_OUTPUT"
|
||||||
- name: Update Completed Stable Prep Items
|
- name: Update Completed Stable Prep Items
|
||||||
uses: dsanders11/project-actions/completed-by@2134fe7cc71c58b7ae259c82a8e63c6058255678 # v1.7.0
|
uses: dsanders11/project-actions/completed-by@5767984408ccc6742f83acc8b8d8ea5e09f329af # v2.0.0
|
||||||
with:
|
with:
|
||||||
field: Prep Status
|
field: Prep Status
|
||||||
field-value: ✅ Complete
|
field-value: ✅ Complete
|
||||||
|
|||||||
4
.github/workflows/stale.yml
vendored
4
.github/workflows/stale.yml
vendored
@@ -18,7 +18,7 @@ jobs:
|
|||||||
id: generate-token
|
id: generate-token
|
||||||
with:
|
with:
|
||||||
creds: ${{ secrets.ISSUE_TRIAGE_GH_APP_CREDS }}
|
creds: ${{ secrets.ISSUE_TRIAGE_GH_APP_CREDS }}
|
||||||
- uses: actions/stale@997185467fa4f803885201cee163a9f38240193d # tag: v10.1.1
|
- uses: actions/stale@b5d41d4e1d5dceea10e7104786b73624c18a190f # tag: v10.2.0
|
||||||
with:
|
with:
|
||||||
repo-token: ${{ steps.generate-token.outputs.token }}
|
repo-token: ${{ steps.generate-token.outputs.token }}
|
||||||
days-before-stale: 90
|
days-before-stale: 90
|
||||||
@@ -42,7 +42,7 @@ jobs:
|
|||||||
id: generate-token
|
id: generate-token
|
||||||
with:
|
with:
|
||||||
creds: ${{ secrets.ISSUE_TRIAGE_GH_APP_CREDS }}
|
creds: ${{ secrets.ISSUE_TRIAGE_GH_APP_CREDS }}
|
||||||
- uses: actions/stale@997185467fa4f803885201cee163a9f38240193d # tag: v10.1.1
|
- uses: actions/stale@b5d41d4e1d5dceea10e7104786b73624c18a190f # tag: v10.2.0
|
||||||
with:
|
with:
|
||||||
repo-token: ${{ steps.generate-token.outputs.token }}
|
repo-token: ${{ steps.generate-token.outputs.token }}
|
||||||
days-before-stale: -1
|
days-before-stale: -1
|
||||||
|
|||||||
2
.github/workflows/update-website-docs.yml
vendored
2
.github/workflows/update-website-docs.yml
vendored
@@ -31,7 +31,7 @@ jobs:
|
|||||||
echo "isLatestRelease=false" >> $GITHUB_OUTPUT
|
echo "isLatestRelease=false" >> $GITHUB_OUTPUT
|
||||||
fi
|
fi
|
||||||
- name: Trigger website docs update
|
- name: Trigger website docs update
|
||||||
if: ${{ steps.check-if-latest-release.outputs.isLatestRelease }}
|
if: ${{ steps.check-if-latest-release.outputs.isLatestRelease == 'true' }}
|
||||||
env:
|
env:
|
||||||
GH_REPO: electron/website
|
GH_REPO: electron/website
|
||||||
GH_TOKEN: ${{ fromJSON(steps.secret-service.outputs.secrets).WEBSITE_DOCS_UPDATER_APP_TOKEN }}
|
GH_TOKEN: ${{ fromJSON(steps.secret-service.outputs.secrets).WEBSITE_DOCS_UPDATER_APP_TOKEN }}
|
||||||
|
|||||||
2
.github/workflows/windows-publish.yml
vendored
2
.github/workflows/windows-publish.yml
vendored
@@ -6,7 +6,7 @@ on:
|
|||||||
build-image-sha:
|
build-image-sha:
|
||||||
type: string
|
type: string
|
||||||
description: 'SHA for electron/build image'
|
description: 'SHA for electron/build image'
|
||||||
default: 'a82b87d7a4f5ff0cab61405f8151ac4cf4942aeb'
|
default: 'eac3529546ea8f3aa356d31e345715eef342233b'
|
||||||
required: true
|
required: true
|
||||||
upload-to-storage:
|
upload-to-storage:
|
||||||
description: 'Uploads to Azure storage'
|
description: 'Uploads to Azure storage'
|
||||||
|
|||||||
1
.gitignore
vendored
1
.gitignore
vendored
@@ -42,6 +42,7 @@ spec/.hash
|
|||||||
|
|
||||||
# Generated native addon files
|
# Generated native addon files
|
||||||
/spec/fixtures/native-addon/echo/build/
|
/spec/fixtures/native-addon/echo/build/
|
||||||
|
/spec/fixtures/native-addon/dialog-helper/build/
|
||||||
|
|
||||||
# If someone runs tsc this is where stuff will end up
|
# If someone runs tsc this is where stuff will end up
|
||||||
ts-gen
|
ts-gen
|
||||||
|
|||||||
329
.oxlintrc.json
Normal file
329
.oxlintrc.json
Normal file
@@ -0,0 +1,329 @@
|
|||||||
|
{
|
||||||
|
"$schema": "./node_modules/oxlint/configuration_schema.json",
|
||||||
|
"plugins": [
|
||||||
|
"typescript",
|
||||||
|
"import",
|
||||||
|
"node",
|
||||||
|
"promise",
|
||||||
|
"unicorn"
|
||||||
|
],
|
||||||
|
"jsPlugins": [
|
||||||
|
{
|
||||||
|
"name": "no-only-tests",
|
||||||
|
"specifier": "./script/lint-plugins/no-only-tests.mjs"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"categories": {
|
||||||
|
"correctness": "off"
|
||||||
|
},
|
||||||
|
"options": {
|
||||||
|
"typeAware": false
|
||||||
|
},
|
||||||
|
"env": {
|
||||||
|
"builtin": true,
|
||||||
|
"browser": true
|
||||||
|
},
|
||||||
|
"ignorePatterns": [
|
||||||
|
".github/workflows/node_modules",
|
||||||
|
"spec/node_modules",
|
||||||
|
"spec/fixtures/native-addon",
|
||||||
|
"shell/browser/resources/win/resource.h",
|
||||||
|
"shell/common/node_includes.h",
|
||||||
|
"spec/fixtures/pages/jquery-3.6.0.min.js"
|
||||||
|
],
|
||||||
|
"rules": {
|
||||||
|
"no-var": "error",
|
||||||
|
"accessor-pairs": [
|
||||||
|
"error",
|
||||||
|
{
|
||||||
|
"setWithoutGet": true,
|
||||||
|
"enforceForClassMembers": true
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"array-callback-return": [
|
||||||
|
"error",
|
||||||
|
{
|
||||||
|
"allowImplicit": false,
|
||||||
|
"checkForEach": false
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"constructor-super": "error",
|
||||||
|
"curly": [
|
||||||
|
"error",
|
||||||
|
"multi-line"
|
||||||
|
],
|
||||||
|
"default-case-last": "error",
|
||||||
|
"eqeqeq": [
|
||||||
|
"error",
|
||||||
|
"always",
|
||||||
|
{
|
||||||
|
"null": "ignore"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"new-cap": [
|
||||||
|
"error",
|
||||||
|
{
|
||||||
|
"newIsCap": true,
|
||||||
|
"capIsNew": false,
|
||||||
|
"properties": true
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"no-array-constructor": "error",
|
||||||
|
"no-async-promise-executor": "error",
|
||||||
|
"no-caller": "error",
|
||||||
|
"no-case-declarations": "error",
|
||||||
|
"no-class-assign": "error",
|
||||||
|
"no-compare-neg-zero": "error",
|
||||||
|
"no-cond-assign": "error",
|
||||||
|
"no-const-assign": "error",
|
||||||
|
"no-constant-condition": [
|
||||||
|
"error",
|
||||||
|
{
|
||||||
|
"checkLoops": false
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"no-control-regex": "error",
|
||||||
|
"no-debugger": "error",
|
||||||
|
"no-delete-var": "error",
|
||||||
|
"no-dupe-class-members": "error",
|
||||||
|
"no-dupe-keys": "error",
|
||||||
|
"no-duplicate-case": "error",
|
||||||
|
"no-useless-backreference": "error",
|
||||||
|
"no-empty": [
|
||||||
|
"error",
|
||||||
|
{
|
||||||
|
"allowEmptyCatch": true
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"no-empty-character-class": "error",
|
||||||
|
"no-empty-pattern": "error",
|
||||||
|
"no-eval": "error",
|
||||||
|
"no-ex-assign": "error",
|
||||||
|
"no-extend-native": "error",
|
||||||
|
"no-extra-bind": "error",
|
||||||
|
"no-extra-boolean-cast": "error",
|
||||||
|
"no-fallthrough": "error",
|
||||||
|
"no-func-assign": "error",
|
||||||
|
"no-global-assign": "error",
|
||||||
|
"no-import-assign": "error",
|
||||||
|
"no-invalid-regexp": "error",
|
||||||
|
"no-irregular-whitespace": "error",
|
||||||
|
"no-iterator": "error",
|
||||||
|
"no-labels": [
|
||||||
|
"error",
|
||||||
|
{
|
||||||
|
"allowLoop": false,
|
||||||
|
"allowSwitch": false
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"no-lone-blocks": "error",
|
||||||
|
"no-loss-of-precision": "error",
|
||||||
|
"no-misleading-character-class": "error",
|
||||||
|
"no-prototype-builtins": "error",
|
||||||
|
"no-useless-catch": "error",
|
||||||
|
"no-useless-constructor": "error",
|
||||||
|
"no-use-before-define": [
|
||||||
|
"error",
|
||||||
|
{
|
||||||
|
"functions": false,
|
||||||
|
"classes": false,
|
||||||
|
"variables": false
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"no-multi-str": "error",
|
||||||
|
"no-new": "error",
|
||||||
|
"no-new-func": "error",
|
||||||
|
"no-new-wrappers": "error",
|
||||||
|
"no-obj-calls": "error",
|
||||||
|
"no-proto": "error",
|
||||||
|
"no-redeclare": [
|
||||||
|
"error"
|
||||||
|
],
|
||||||
|
"no-regex-spaces": "error",
|
||||||
|
"no-return-assign": [
|
||||||
|
"error",
|
||||||
|
"except-parens"
|
||||||
|
],
|
||||||
|
"no-self-assign": [
|
||||||
|
"error",
|
||||||
|
{
|
||||||
|
"props": true
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"no-self-compare": "error",
|
||||||
|
"no-sequences": "error",
|
||||||
|
"no-shadow-restricted-names": "error",
|
||||||
|
"no-sparse-arrays": "error",
|
||||||
|
"no-template-curly-in-string": "error",
|
||||||
|
"no-this-before-super": "error",
|
||||||
|
"no-throw-literal": "error",
|
||||||
|
"no-unexpected-multiline": "error",
|
||||||
|
"no-unmodified-loop-condition": "error",
|
||||||
|
"no-unneeded-ternary": [
|
||||||
|
"error",
|
||||||
|
{
|
||||||
|
"defaultAssignment": false
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"no-unreachable": "error",
|
||||||
|
"no-unsafe-finally": "error",
|
||||||
|
"no-unsafe-negation": "error",
|
||||||
|
"no-unused-vars": [
|
||||||
|
"error",
|
||||||
|
{
|
||||||
|
"vars": "all",
|
||||||
|
"args": "after-used",
|
||||||
|
"argsIgnorePattern": "^_",
|
||||||
|
"ignoreRestSiblings": true
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"no-useless-call": "error",
|
||||||
|
"no-useless-computed-key": "error",
|
||||||
|
"no-useless-escape": "error",
|
||||||
|
"no-useless-rename": "error",
|
||||||
|
"no-useless-return": "error",
|
||||||
|
"no-void": "error",
|
||||||
|
"no-with": "error",
|
||||||
|
"prefer-const": [
|
||||||
|
"error",
|
||||||
|
{
|
||||||
|
"destructuring": "all"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"prefer-promise-reject-errors": "error",
|
||||||
|
"symbol-description": "error",
|
||||||
|
"unicode-bom": [
|
||||||
|
"error",
|
||||||
|
"never"
|
||||||
|
],
|
||||||
|
"use-isnan": [
|
||||||
|
"error",
|
||||||
|
{
|
||||||
|
"enforceForSwitchCase": true,
|
||||||
|
"enforceForIndexOf": true
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"valid-typeof": [
|
||||||
|
"error",
|
||||||
|
{
|
||||||
|
"requireStringLiterals": true
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"yoda": [
|
||||||
|
"error",
|
||||||
|
"never"
|
||||||
|
],
|
||||||
|
"import/export": "error",
|
||||||
|
"import/first": "error",
|
||||||
|
"import/no-absolute-path": [
|
||||||
|
"error",
|
||||||
|
{
|
||||||
|
"esmodule": true,
|
||||||
|
"commonjs": true,
|
||||||
|
"amd": false
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"import/no-duplicates": "error",
|
||||||
|
"import/no-named-default": "error",
|
||||||
|
"import/no-webpack-loader-syntax": "error",
|
||||||
|
"promise/param-names": "error",
|
||||||
|
"guard-for-in": "error",
|
||||||
|
"node/handle-callback-err": [
|
||||||
|
"error",
|
||||||
|
"^(err|error)$"
|
||||||
|
],
|
||||||
|
"node/no-exports-assign": "error",
|
||||||
|
"node/no-new-require": "error",
|
||||||
|
"node/no-path-concat": "error"
|
||||||
|
},
|
||||||
|
"overrides": [
|
||||||
|
{
|
||||||
|
"files": ["**/*.ts", "**/*.tsx", "**/*.mts", "**/*.cts"],
|
||||||
|
"rules": {
|
||||||
|
"no-use-before-define": "off"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"files": ["lib/browser/**", "lib/utility/**"],
|
||||||
|
"rules": {
|
||||||
|
"no-restricted-imports": [
|
||||||
|
"error",
|
||||||
|
{
|
||||||
|
"paths": ["electron", "electron/renderer"],
|
||||||
|
"patterns": [
|
||||||
|
"./*",
|
||||||
|
"../*",
|
||||||
|
"@electron/internal/isolated_renderer/*",
|
||||||
|
"@electron/internal/renderer/*",
|
||||||
|
"@electron/internal/sandboxed_worker/*",
|
||||||
|
"@electron/internal/worker/*"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"files": [
|
||||||
|
"lib/renderer/**",
|
||||||
|
"lib/worker/**",
|
||||||
|
"lib/preload_realm/**",
|
||||||
|
"lib/sandboxed_renderer/**",
|
||||||
|
"lib/isolated_renderer/**"
|
||||||
|
],
|
||||||
|
"rules": {
|
||||||
|
"no-restricted-imports": [
|
||||||
|
"error",
|
||||||
|
{
|
||||||
|
"paths": ["electron", "electron/main"],
|
||||||
|
"patterns": ["./*", "../*", "@electron/internal/browser/*"]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"files": ["lib/common/**"],
|
||||||
|
"rules": {
|
||||||
|
"no-restricted-imports": [
|
||||||
|
"error",
|
||||||
|
{
|
||||||
|
"paths": ["electron", "electron/main", "electron/renderer"],
|
||||||
|
"patterns": [
|
||||||
|
"./*",
|
||||||
|
"../*",
|
||||||
|
"@electron/internal/browser/*",
|
||||||
|
"@electron/internal/isolated_renderer/*",
|
||||||
|
"@electron/internal/renderer/*",
|
||||||
|
"@electron/internal/sandboxed_worker/*",
|
||||||
|
"@electron/internal/worker/*"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"files": [
|
||||||
|
"build/**",
|
||||||
|
"script/**",
|
||||||
|
"docs/**",
|
||||||
|
"default_app/**",
|
||||||
|
"spec/**"
|
||||||
|
],
|
||||||
|
"rules": {
|
||||||
|
"unicorn/prefer-node-protocol": "error"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"files": ["spec/**/*.ts", "spec/**/*.js", "spec/**/*.mjs"],
|
||||||
|
"rules": {
|
||||||
|
"no-only-tests/no-only-tests": "error"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"files": ["**/*.d.ts"],
|
||||||
|
"rules": {
|
||||||
|
"no-useless-constructor": "off",
|
||||||
|
"no-unused-vars": "off"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
@@ -1,6 +0,0 @@
|
|||||||
{
|
|
||||||
"plugins": [
|
|
||||||
["remark-lint-code-block-style", "fenced"],
|
|
||||||
["remark-lint-fenced-code-flag"]
|
|
||||||
]
|
|
||||||
}
|
|
||||||
@@ -9,4 +9,8 @@ npmMinimalAgeGate: 10080
|
|||||||
npmPreapprovedPackages:
|
npmPreapprovedPackages:
|
||||||
- "@electron/*"
|
- "@electron/*"
|
||||||
|
|
||||||
|
httpProxy: "${HTTP_PROXY:-}"
|
||||||
|
|
||||||
|
httpsProxy: "${HTTPS_PROXY:-}"
|
||||||
|
|
||||||
yarnPath: .yarn/releases/yarn-4.12.0.cjs
|
yarnPath: .yarn/releases/yarn-4.12.0.cjs
|
||||||
|
|||||||
42
BUILD.gn
42
BUILD.gn
@@ -321,12 +321,33 @@ grit("resources") {
|
|||||||
"grit/electron_resources.h",
|
"grit/electron_resources.h",
|
||||||
"electron_resources.pak",
|
"electron_resources.pak",
|
||||||
]
|
]
|
||||||
|
if (translate_genders) {
|
||||||
|
outputs += [
|
||||||
|
"electron_resources_MASCULINE.pak",
|
||||||
|
"electron_resources_FEMININE.pak",
|
||||||
|
"electron_resources_NEUTER.pak",
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach(locale, all_chrome_locales) {
|
||||||
|
outputs += [ "electron_strings_$locale.pak" ]
|
||||||
|
if (translate_genders) {
|
||||||
|
outputs += [
|
||||||
|
"electron_strings_${locale}_MASCULINE.pak",
|
||||||
|
"electron_strings_${locale}_FEMININE.pak",
|
||||||
|
"electron_strings_${locale}_NEUTER.pak",
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
# Mojo manifest overlays are generated.
|
# Mojo manifest overlays are generated.
|
||||||
grit_flags = [
|
grit_flags = [
|
||||||
"-E",
|
"-E",
|
||||||
"target_gen_dir=" + rebase_path(target_gen_dir, root_build_dir),
|
"target_gen_dir=" + rebase_path(target_gen_dir, root_build_dir),
|
||||||
]
|
]
|
||||||
|
if (translate_genders) {
|
||||||
|
grit_flags += [ "--translate-genders" ]
|
||||||
|
}
|
||||||
|
|
||||||
deps = [ ":copy_shell_devtools_discovery_page" ]
|
deps = [ ":copy_shell_devtools_discovery_page" ]
|
||||||
|
|
||||||
@@ -450,6 +471,7 @@ source_set("electron_lib") {
|
|||||||
"//chrome:strings",
|
"//chrome:strings",
|
||||||
"//chrome/app:command_ids",
|
"//chrome/app:command_ids",
|
||||||
"//chrome/app/resources:platform_locale_settings",
|
"//chrome/app/resources:platform_locale_settings",
|
||||||
|
"//chrome/common/notifications",
|
||||||
"//components/autofill/core/common:features",
|
"//components/autofill/core/common:features",
|
||||||
"//components/certificate_transparency",
|
"//components/certificate_transparency",
|
||||||
"//components/compose:buildflags",
|
"//components/compose:buildflags",
|
||||||
@@ -619,6 +641,7 @@ source_set("electron_lib") {
|
|||||||
"SecurityInterface.framework",
|
"SecurityInterface.framework",
|
||||||
"ServiceManagement.framework",
|
"ServiceManagement.framework",
|
||||||
"StoreKit.framework",
|
"StoreKit.framework",
|
||||||
|
"UserNotifications.framework",
|
||||||
]
|
]
|
||||||
|
|
||||||
weak_frameworks = [ "QuickLookThumbnailing.framework" ]
|
weak_frameworks = [ "QuickLookThumbnailing.framework" ]
|
||||||
@@ -752,6 +775,7 @@ source_set("electron_lib") {
|
|||||||
"//components/zoom",
|
"//components/zoom",
|
||||||
"//extensions/browser",
|
"//extensions/browser",
|
||||||
"//extensions/browser/api:api_provider",
|
"//extensions/browser/api:api_provider",
|
||||||
|
"//extensions/browser/mime_handler:stream_info",
|
||||||
"//extensions/browser/updater",
|
"//extensions/browser/updater",
|
||||||
"//extensions/common",
|
"//extensions/common",
|
||||||
"//extensions/common:core_api_provider",
|
"//extensions/common:core_api_provider",
|
||||||
@@ -994,7 +1018,17 @@ if (is_mac) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
foreach(helper_params, content_mac_helpers) {
|
# Electron defines its own plugin helper (using CHILD_EMBEDDER_FIRST + 1) to
|
||||||
|
# allow loading of unsigned or third-party-signed libraries.
|
||||||
|
_electron_plugin_helper_params = [
|
||||||
|
"plugin",
|
||||||
|
".plugin",
|
||||||
|
" (Plugin)",
|
||||||
|
]
|
||||||
|
electron_mac_helpers =
|
||||||
|
content_mac_helpers + [ _electron_plugin_helper_params ]
|
||||||
|
|
||||||
|
foreach(helper_params, electron_mac_helpers) {
|
||||||
_helper_target = helper_params[0]
|
_helper_target = helper_params[0]
|
||||||
_helper_bundle_id = helper_params[1]
|
_helper_bundle_id = helper_params[1]
|
||||||
_helper_suffix = helper_params[2]
|
_helper_suffix = helper_params[2]
|
||||||
@@ -1047,7 +1081,7 @@ if (is_mac) {
|
|||||||
":stripped_squirrel_framework",
|
":stripped_squirrel_framework",
|
||||||
]
|
]
|
||||||
|
|
||||||
foreach(helper_params, content_mac_helpers) {
|
foreach(helper_params, electron_mac_helpers) {
|
||||||
sources +=
|
sources +=
|
||||||
[ "$root_out_dir/${electron_helper_name}${helper_params[2]}.app" ]
|
[ "$root_out_dir/${electron_helper_name}${helper_params[2]}.app" ]
|
||||||
public_deps += [ ":electron_helper_app_${helper_params[0]}" ]
|
public_deps += [ ":electron_helper_app_${helper_params[0]}" ]
|
||||||
@@ -1151,7 +1185,7 @@ if (is_mac) {
|
|||||||
deps = [ ":electron_framework" ]
|
deps = [ ":electron_framework" ]
|
||||||
}
|
}
|
||||||
|
|
||||||
foreach(helper_params, content_mac_helpers) {
|
foreach(helper_params, electron_mac_helpers) {
|
||||||
_helper_target = helper_params[0]
|
_helper_target = helper_params[0]
|
||||||
_helper_bundle_id = helper_params[1]
|
_helper_bundle_id = helper_params[1]
|
||||||
_helper_suffix = helper_params[2]
|
_helper_suffix = helper_params[2]
|
||||||
@@ -1203,7 +1237,7 @@ if (is_mac) {
|
|||||||
deps += [ ":crashpad_handler_syms" ]
|
deps += [ ":crashpad_handler_syms" ]
|
||||||
}
|
}
|
||||||
|
|
||||||
foreach(helper_params, content_mac_helpers) {
|
foreach(helper_params, electron_mac_helpers) {
|
||||||
_helper_target = helper_params[0]
|
_helper_target = helper_params[0]
|
||||||
deps += [ ":electron_helper_syms_${_helper_target}" ]
|
deps += [ ":electron_helper_syms_${_helper_target}" ]
|
||||||
}
|
}
|
||||||
|
|||||||
56
CLAUDE.md
56
CLAUDE.md
@@ -1,5 +1,14 @@
|
|||||||
# Electron Development Guide
|
# Electron Development Guide
|
||||||
|
|
||||||
|
## Running node_modules binaries
|
||||||
|
|
||||||
|
**Never use `npx`.** It is considered dangerous because it can silently fetch and execute arbitrary packages from the registry. Always run binaries through one of these safer mechanisms instead:
|
||||||
|
|
||||||
|
1. **Preferred** — spawn the executable directly from `node_modules/.bin/<tool>` (or the platform equivalent on Windows). This is what `script/lint.js` does for `oxlint`.
|
||||||
|
2. **Acceptable** — invoke via `yarn <tool>` or `yarn run <tool>`, which resolves to the locally installed version without the registry fallback that `npx` performs.
|
||||||
|
|
||||||
|
This rule applies to shell commands you run yourself and to any scripts you author or modify in this repo.
|
||||||
|
|
||||||
## Project Overview
|
## Project Overview
|
||||||
|
|
||||||
Electron is a framework for building cross-platform desktop applications using web technologies. It embeds Chromium for rendering and Node.js for backend functionality.
|
Electron is a framework for building cross-platform desktop applications using web technologies. It embeds Chromium for rendering and Node.js for backend functionality.
|
||||||
@@ -127,6 +136,22 @@ patches/{target}/*.patch → [e sync --3] → target repo commits
|
|||||||
2. Create a git commit
|
2. Create a git commit
|
||||||
3. Run `e patches <target>` to export
|
3. Run `e patches <target>` to export
|
||||||
|
|
||||||
|
**Fixing patch conflicts on an existing PR:**
|
||||||
|
|
||||||
|
If asked to fix a patch conflict on a branch that already has an open PR, check the PR's failed **Apply Patches** CI run for an `update-patches` artifact before running `e sync` locally. CI has already performed the 3-way merge and exported the resolved patch diff — applying it is much faster than a full local sync.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Find the failed Apply Patches run for the PR and download the artifact
|
||||||
|
gh run list --repo electron/electron --branch <pr-branch> --workflow "Apply Patches" --limit 1
|
||||||
|
gh run download <run-id> --repo electron/electron --name update-patches
|
||||||
|
|
||||||
|
# Apply the CI-generated fix, then push
|
||||||
|
git am update-patches.patch
|
||||||
|
git push
|
||||||
|
```
|
||||||
|
|
||||||
|
If no artifact exists (e.g. the 3-way merge itself failed), fall back to `e sync --3` and resolve manually.
|
||||||
|
|
||||||
## Testing
|
## Testing
|
||||||
|
|
||||||
**Test location:** `spec/` directory
|
**Test location:** `spec/` directory
|
||||||
@@ -155,16 +180,45 @@ e test # Run full test suite
|
|||||||
|
|
||||||
When working on the `roller/chromium/main` branch to upgrade Chromium activate the "Electron Chromium Upgrade" skill.
|
When working on the `roller/chromium/main` branch to upgrade Chromium activate the "Electron Chromium Upgrade" skill.
|
||||||
|
|
||||||
|
## Pull Requests
|
||||||
|
|
||||||
|
PR bodies must always include a `Notes:` section as the **last line** of the body. This is a consumer-facing release note for Electron app developers — describe the user-visible fix or change, not internal implementation details. Use `Notes: none` if there is no user-facing change.
|
||||||
|
|
||||||
|
### PR Labeling (write-access only)
|
||||||
|
|
||||||
|
When the user has write access to `electron/electron`, add these labels when creating PRs:
|
||||||
|
|
||||||
|
**Semver label** — one of:
|
||||||
|
|
||||||
|
- `semver/none` — build changes, refactors, CI, or anything with no end-user impact
|
||||||
|
- `semver/patch` — backwards-compatible bug fixes
|
||||||
|
- `semver/minor` — backwards-compatible new functionality
|
||||||
|
- `semver/major` — incompatible API changes
|
||||||
|
|
||||||
|
**Backport target labels** — add `target/{N}-x-y` for each supported release branch the change should land on. Default policy:
|
||||||
|
|
||||||
|
- **Bug fixes** — backport to all active release lines _except the oldest_
|
||||||
|
- **Security fixes** — backport to all active release lines _including the oldest_
|
||||||
|
- **Features (semver/minor) and breaking changes (semver/major)** — no backport labels; main-only by default
|
||||||
|
|
||||||
|
To find which release branches are active, check label colors — active `target/*` labels use color `#ad244f`, older/EOL ones use `#ededed`:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
gh label list --repo electron/electron --search target/ --json name,color --jq '.[] | select(.color == "ad244f") | .name'
|
||||||
|
```
|
||||||
|
|
||||||
## Code Style
|
## Code Style
|
||||||
|
|
||||||
**C++:** Follows Chromium style, enforced by clang-format
|
**C++:** Follows Chromium style, enforced by clang-format
|
||||||
**TypeScript/JavaScript:** ESLint configuration in `.eslintrc.json`
|
**TypeScript/JavaScript:** [oxlint](https://oxc.rs/docs/guide/usage/linter) configuration in `.oxlintrc.json`
|
||||||
|
|
||||||
**Linting:**
|
**Linting:**
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
npm run lint # Run all linters
|
npm run lint # Run all linters
|
||||||
|
npm run lint:js # Run oxlint over all JS/TS/MJS sources
|
||||||
npm run lint:clang-format # C++ formatting
|
npm run lint:clang-format # C++ formatting
|
||||||
|
npm run lint:api-history # Validate API history YAML blocks in docs
|
||||||
```
|
```
|
||||||
|
|
||||||
## Key Files
|
## Key Files
|
||||||
|
|||||||
4
DEPS
4
DEPS
@@ -2,9 +2,9 @@ gclient_gn_args_from = 'src'
|
|||||||
|
|
||||||
vars = {
|
vars = {
|
||||||
'chromium_version':
|
'chromium_version':
|
||||||
'146.0.7666.0',
|
'148.0.7778.0',
|
||||||
'node_version':
|
'node_version':
|
||||||
'v24.13.1',
|
'v24.14.1',
|
||||||
'nan_version':
|
'nan_version':
|
||||||
'675cefebca42410733da8a454c8d9391fcebfbc2',
|
'675cefebca42410733da8a454c8d9391fcebfbc2',
|
||||||
'squirrel.mac_version':
|
'squirrel.mac_version':
|
||||||
|
|||||||
@@ -1,8 +0,0 @@
|
|||||||
{
|
|
||||||
"plugins": [
|
|
||||||
"import"
|
|
||||||
],
|
|
||||||
"rules": {
|
|
||||||
"import/enforce-node-protocol-usage": ["error", "always"]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -2,7 +2,7 @@ is_electron_build = true
|
|||||||
root_extra_deps = [ "//electron" ]
|
root_extra_deps = [ "//electron" ]
|
||||||
|
|
||||||
# Registry of NMVs --> https://github.com/nodejs/node/blob/main/doc/abi_version_registry.json
|
# Registry of NMVs --> https://github.com/nodejs/node/blob/main/doc/abi_version_registry.json
|
||||||
node_module_version = 145
|
node_module_version = 146
|
||||||
|
|
||||||
v8_promise_internal_field_count = 1
|
v8_promise_internal_field_count = 1
|
||||||
v8_embedder_string = "-electron.0"
|
v8_embedder_string = "-electron.0"
|
||||||
@@ -51,9 +51,6 @@ is_cfi = false
|
|||||||
use_qt5 = false
|
use_qt5 = false
|
||||||
use_qt6 = false
|
use_qt6 = false
|
||||||
|
|
||||||
# Disables the builtins PGO for V8
|
|
||||||
v8_builtins_profiling_log_file = ""
|
|
||||||
|
|
||||||
# https://chromium.googlesource.com/chromium/src/+/main/docs/dangling_ptr.md
|
# https://chromium.googlesource.com/chromium/src/+/main/docs/dangling_ptr.md
|
||||||
# TODO(vertedinde): hunt down dangling pointers on Linux
|
# TODO(vertedinde): hunt down dangling pointers on Linux
|
||||||
enable_dangling_raw_ptr_checks = false
|
enable_dangling_raw_ptr_checks = false
|
||||||
|
|||||||
@@ -183,6 +183,7 @@ template("electron_paks") {
|
|||||||
"${root_gen_dir}/components/strings/components_locale_settings_",
|
"${root_gen_dir}/components/strings/components_locale_settings_",
|
||||||
"${root_gen_dir}/components/strings/components_strings_",
|
"${root_gen_dir}/components/strings/components_strings_",
|
||||||
"${root_gen_dir}/device/bluetooth/strings/bluetooth_strings_",
|
"${root_gen_dir}/device/bluetooth/strings/bluetooth_strings_",
|
||||||
|
"${root_gen_dir}/electron/electron_strings_",
|
||||||
"${root_gen_dir}/extensions/strings/extensions_strings_",
|
"${root_gen_dir}/extensions/strings/extensions_strings_",
|
||||||
"${root_gen_dir}/services/strings/services_strings_",
|
"${root_gen_dir}/services/strings/services_strings_",
|
||||||
"${root_gen_dir}/third_party/blink/public/strings/blink_strings_",
|
"${root_gen_dir}/third_party/blink/public/strings/blink_strings_",
|
||||||
@@ -199,6 +200,7 @@ template("electron_paks") {
|
|||||||
"//components/strings:components_locale_settings",
|
"//components/strings:components_locale_settings",
|
||||||
"//components/strings:components_strings",
|
"//components/strings:components_strings",
|
||||||
"//device/bluetooth/strings",
|
"//device/bluetooth/strings",
|
||||||
|
"//electron:resources",
|
||||||
"//extensions/strings",
|
"//extensions/strings",
|
||||||
"//services/strings",
|
"//services/strings",
|
||||||
"//third_party/blink/public/strings",
|
"//third_party/blink/public/strings",
|
||||||
|
|||||||
@@ -9,10 +9,189 @@
|
|||||||
<emit emit_type='prepend'></emit>
|
<emit emit_type='prepend'></emit>
|
||||||
</output>
|
</output>
|
||||||
<output filename="electron_resources.pak" type="data_package" />
|
<output filename="electron_resources.pak" type="data_package" />
|
||||||
|
<output filename="electron_strings_af.pak" type="data_package" lang="af" />
|
||||||
|
<output filename="electron_strings_am.pak" type="data_package" lang="am" />
|
||||||
|
<output filename="electron_strings_ar.pak" type="data_package" lang="ar" />
|
||||||
|
<output filename="electron_strings_as.pak" type="data_package" lang="as" />
|
||||||
|
<output filename="electron_strings_az.pak" type="data_package" lang="az" />
|
||||||
|
<output filename="electron_strings_be.pak" type="data_package" lang="be" />
|
||||||
|
<output filename="electron_strings_bg.pak" type="data_package" lang="bg" />
|
||||||
|
<output filename="electron_strings_bn.pak" type="data_package" lang="bn" />
|
||||||
|
<output filename="electron_strings_bs.pak" type="data_package" lang="bs" />
|
||||||
|
<output filename="electron_strings_ca.pak" type="data_package" lang="ca" />
|
||||||
|
<output filename="electron_strings_cs.pak" type="data_package" lang="cs" />
|
||||||
|
<output filename="electron_strings_cy.pak" type="data_package" lang="cy" />
|
||||||
|
<output filename="electron_strings_da.pak" type="data_package" lang="da" />
|
||||||
|
<output filename="electron_strings_de.pak" type="data_package" lang="de" />
|
||||||
|
<output filename="electron_strings_el.pak" type="data_package" lang="el" />
|
||||||
|
<output filename="electron_strings_en-GB.pak" type="data_package" lang="en-GB" />
|
||||||
|
<output filename="electron_strings_en-US.pak" type="data_package" lang="en" />
|
||||||
|
<output filename="electron_strings_es-419.pak" type="data_package" lang="es-419" />
|
||||||
|
<output filename="electron_strings_es.pak" type="data_package" lang="es" />
|
||||||
|
<output filename="electron_strings_et.pak" type="data_package" lang="et" />
|
||||||
|
<output filename="electron_strings_eu.pak" type="data_package" lang="eu" />
|
||||||
|
<output filename="electron_strings_fa.pak" type="data_package" lang="fa" />
|
||||||
|
<output filename="electron_strings_fi.pak" type="data_package" lang="fi" />
|
||||||
|
<output filename="electron_strings_fil.pak" type="data_package" lang="fil" />
|
||||||
|
<output filename="electron_strings_fr-CA.pak" type="data_package" lang="fr-CA" />
|
||||||
|
<output filename="electron_strings_fr.pak" type="data_package" lang="fr" />
|
||||||
|
<output filename="electron_strings_gl.pak" type="data_package" lang="gl" />
|
||||||
|
<output filename="electron_strings_gu.pak" type="data_package" lang="gu" />
|
||||||
|
<output filename="electron_strings_hi.pak" type="data_package" lang="hi" />
|
||||||
|
<output filename="electron_strings_hr.pak" type="data_package" lang="hr" />
|
||||||
|
<output filename="electron_strings_hu.pak" type="data_package" lang="hu" />
|
||||||
|
<output filename="electron_strings_hy.pak" type="data_package" lang="hy" />
|
||||||
|
<output filename="electron_strings_id.pak" type="data_package" lang="id" />
|
||||||
|
<output filename="electron_strings_is.pak" type="data_package" lang="is" />
|
||||||
|
<output filename="electron_strings_it.pak" type="data_package" lang="it" />
|
||||||
|
<output filename="electron_strings_he.pak" type="data_package" lang="he" />
|
||||||
|
<output filename="electron_strings_ja.pak" type="data_package" lang="ja" />
|
||||||
|
<output filename="electron_strings_ka.pak" type="data_package" lang="ka" />
|
||||||
|
<output filename="electron_strings_kk.pak" type="data_package" lang="kk" />
|
||||||
|
<output filename="electron_strings_km.pak" type="data_package" lang="km" />
|
||||||
|
<output filename="electron_strings_kn.pak" type="data_package" lang="kn" />
|
||||||
|
<output filename="electron_strings_ko.pak" type="data_package" lang="ko" />
|
||||||
|
<output filename="electron_strings_ky.pak" type="data_package" lang="ky" />
|
||||||
|
<output filename="electron_strings_lo.pak" type="data_package" lang="lo" />
|
||||||
|
<output filename="electron_strings_lt.pak" type="data_package" lang="lt" />
|
||||||
|
<output filename="electron_strings_lv.pak" type="data_package" lang="lv" />
|
||||||
|
<output filename="electron_strings_mk.pak" type="data_package" lang="mk" />
|
||||||
|
<output filename="electron_strings_ml.pak" type="data_package" lang="ml" />
|
||||||
|
<output filename="electron_strings_mn.pak" type="data_package" lang="mn" />
|
||||||
|
<output filename="electron_strings_mr.pak" type="data_package" lang="mr" />
|
||||||
|
<output filename="electron_strings_ms.pak" type="data_package" lang="ms" />
|
||||||
|
<output filename="electron_strings_my.pak" type="data_package" lang="my" />
|
||||||
|
<output filename="electron_strings_ne.pak" type="data_package" lang="ne" />
|
||||||
|
<output filename="electron_strings_nl.pak" type="data_package" lang="nl" />
|
||||||
|
<!-- The translation console uses 'no' for Norwegian Bokmål. It should
|
||||||
|
be 'nb'. -->
|
||||||
|
<output filename="electron_strings_nb.pak" type="data_package" lang="no" />
|
||||||
|
<output filename="electron_strings_or.pak" type="data_package" lang="or" />
|
||||||
|
<output filename="electron_strings_pa.pak" type="data_package" lang="pa" />
|
||||||
|
<output filename="electron_strings_pl.pak" type="data_package" lang="pl" />
|
||||||
|
<output filename="electron_strings_pt-BR.pak" type="data_package" lang="pt-BR" />
|
||||||
|
<output filename="electron_strings_pt-PT.pak" type="data_package" lang="pt-PT" />
|
||||||
|
<output filename="electron_strings_ro.pak" type="data_package" lang="ro" />
|
||||||
|
<output filename="electron_strings_ru.pak" type="data_package" lang="ru" />
|
||||||
|
<output filename="electron_strings_si.pak" type="data_package" lang="si" />
|
||||||
|
<output filename="electron_strings_sk.pak" type="data_package" lang="sk" />
|
||||||
|
<output filename="electron_strings_sl.pak" type="data_package" lang="sl" />
|
||||||
|
<output filename="electron_strings_sq.pak" type="data_package" lang="sq" />
|
||||||
|
<output filename="electron_strings_sr-Latn.pak" type="data_package" lang="sr-Latn" />
|
||||||
|
<output filename="electron_strings_sr.pak" type="data_package" lang="sr" />
|
||||||
|
<output filename="electron_strings_sv.pak" type="data_package" lang="sv" />
|
||||||
|
<output filename="electron_strings_sw.pak" type="data_package" lang="sw" />
|
||||||
|
<output filename="electron_strings_ta.pak" type="data_package" lang="ta" />
|
||||||
|
<output filename="electron_strings_te.pak" type="data_package" lang="te" />
|
||||||
|
<output filename="electron_strings_th.pak" type="data_package" lang="th" />
|
||||||
|
<output filename="electron_strings_tr.pak" type="data_package" lang="tr" />
|
||||||
|
<output filename="electron_strings_uk.pak" type="data_package" lang="uk" />
|
||||||
|
<output filename="electron_strings_ur.pak" type="data_package" lang="ur" />
|
||||||
|
<output filename="electron_strings_uz.pak" type="data_package" lang="uz" />
|
||||||
|
<output filename="electron_strings_vi.pak" type="data_package" lang="vi" />
|
||||||
|
<output filename="electron_strings_zh-CN.pak" type="data_package" lang="zh-CN" />
|
||||||
|
<output filename="electron_strings_zh-HK.pak" type="data_package" lang="zh-HK" />
|
||||||
|
<output filename="electron_strings_zh-TW.pak" type="data_package" lang="zh-TW" />
|
||||||
|
<output filename="electron_strings_zu.pak" type="data_package" lang="zu" />
|
||||||
|
<!-- CARO TODO: Pseudolocales? -->
|
||||||
|
<output filename="electron_strings_ar-XB.pak" type="data_package" lang="ar-XB" />
|
||||||
|
<output filename="electron_strings_en-XA.pak" type="data_package" lang="en-XA" />
|
||||||
</outputs>
|
</outputs>
|
||||||
<release seq="1" allow_pseudo="false">
|
<translations>
|
||||||
|
<file path="translations/electron_strings_af.xtb" lang="af" />
|
||||||
|
<file path="translations/electron_strings_am.xtb" lang="am" />
|
||||||
|
<file path="translations/electron_strings_ar.xtb" lang="ar" />
|
||||||
|
<file path="translations/electron_strings_as.xtb" lang="as" />
|
||||||
|
<file path="translations/electron_strings_az.xtb" lang="az" />
|
||||||
|
<file path="translations/electron_strings_be.xtb" lang="be" />
|
||||||
|
<file path="translations/electron_strings_bg.xtb" lang="bg" />
|
||||||
|
<file path="translations/electron_strings_bn.xtb" lang="bn" />
|
||||||
|
<file path="translations/electron_strings_bs.xtb" lang="bs" />
|
||||||
|
<file path="translations/electron_strings_ca.xtb" lang="ca" />
|
||||||
|
<file path="translations/electron_strings_cs.xtb" lang="cs" />
|
||||||
|
<file path="translations/electron_strings_cy.xtb" lang="cy" />
|
||||||
|
<file path="translations/electron_strings_da.xtb" lang="da" />
|
||||||
|
<file path="translations/electron_strings_de.xtb" lang="de" />
|
||||||
|
<file path="translations/electron_strings_el.xtb" lang="el" />
|
||||||
|
<file path="translations/electron_strings_en-GB.xtb" lang="en-GB" />
|
||||||
|
<file path="translations/electron_strings_es-419.xtb" lang="es-419" />
|
||||||
|
<file path="translations/electron_strings_es.xtb" lang="es" />
|
||||||
|
<file path="translations/electron_strings_et.xtb" lang="et" />
|
||||||
|
<file path="translations/electron_strings_eu.xtb" lang="eu" />
|
||||||
|
<file path="translations/electron_strings_fa.xtb" lang="fa" />
|
||||||
|
<file path="translations/electron_strings_fi.xtb" lang="fi" />
|
||||||
|
<file path="translations/electron_strings_fil.xtb" lang="fil" />
|
||||||
|
<file path="translations/electron_strings_fr-CA.xtb" lang="fr-CA" />
|
||||||
|
<file path="translations/electron_strings_fr.xtb" lang="fr" />
|
||||||
|
<file path="translations/electron_strings_gl.xtb" lang="gl" />
|
||||||
|
<file path="translations/electron_strings_gu.xtb" lang="gu" />
|
||||||
|
<file path="translations/electron_strings_hi.xtb" lang="hi" />
|
||||||
|
<file path="translations/electron_strings_hr.xtb" lang="hr" />
|
||||||
|
<file path="translations/electron_strings_hu.xtb" lang="hu" />
|
||||||
|
<file path="translations/electron_strings_hy.xtb" lang="hy" />
|
||||||
|
<file path="translations/electron_strings_id.xtb" lang="id" />
|
||||||
|
<file path="translations/electron_strings_is.xtb" lang="is" />
|
||||||
|
<file path="translations/electron_strings_it.xtb" lang="it" />
|
||||||
|
<!-- The translation console uses 'iw' for Hebrew, but we use 'he'. -->
|
||||||
|
<file path="translations/electron_strings_iw.xtb" lang="he" />
|
||||||
|
<file path="translations/electron_strings_ja.xtb" lang="ja" />
|
||||||
|
<file path="translations/electron_strings_ka.xtb" lang="ka" />
|
||||||
|
<file path="translations/electron_strings_kk.xtb" lang="kk" />
|
||||||
|
<file path="translations/electron_strings_km.xtb" lang="km" />
|
||||||
|
<file path="translations/electron_strings_kn.xtb" lang="kn" />
|
||||||
|
<file path="translations/electron_strings_ko.xtb" lang="ko" />
|
||||||
|
<file path="translations/electron_strings_ky.xtb" lang="ky" />
|
||||||
|
<file path="translations/electron_strings_lo.xtb" lang="lo" />
|
||||||
|
<file path="translations/electron_strings_lt.xtb" lang="lt" />
|
||||||
|
<file path="translations/electron_strings_lv.xtb" lang="lv" />
|
||||||
|
<file path="translations/electron_strings_mk.xtb" lang="mk" />
|
||||||
|
<file path="translations/electron_strings_ml.xtb" lang="ml" />
|
||||||
|
<file path="translations/electron_strings_mn.xtb" lang="mn" />
|
||||||
|
<file path="translations/electron_strings_mr.xtb" lang="mr" />
|
||||||
|
<file path="translations/electron_strings_ms.xtb" lang="ms" />
|
||||||
|
<file path="translations/electron_strings_my.xtb" lang="my" />
|
||||||
|
<file path="translations/electron_strings_ne.xtb" lang="ne" />
|
||||||
|
<file path="translations/electron_strings_nl.xtb" lang="nl" />
|
||||||
|
<file path="translations/electron_strings_no.xtb" lang="no" />
|
||||||
|
<file path="translations/electron_strings_or.xtb" lang="or" />
|
||||||
|
<file path="translations/electron_strings_pa.xtb" lang="pa" />
|
||||||
|
<file path="translations/electron_strings_pl.xtb" lang="pl" />
|
||||||
|
<file path="translations/electron_strings_pt-BR.xtb" lang="pt-BR" />
|
||||||
|
<file path="translations/electron_strings_pt-PT.xtb" lang="pt-PT" />
|
||||||
|
<file path="translations/electron_strings_ro.xtb" lang="ro" />
|
||||||
|
<file path="translations/electron_strings_ru.xtb" lang="ru" />
|
||||||
|
<file path="translations/electron_strings_si.xtb" lang="si" />
|
||||||
|
<file path="translations/electron_strings_sk.xtb" lang="sk" />
|
||||||
|
<file path="translations/electron_strings_sl.xtb" lang="sl" />
|
||||||
|
<file path="translations/electron_strings_sq.xtb" lang="sq" />
|
||||||
|
<file path="translations/electron_strings_sr-Latn.xtb" lang="sr-Latn" />
|
||||||
|
<file path="translations/electron_strings_sr.xtb" lang="sr" />
|
||||||
|
<file path="translations/electron_strings_sv.xtb" lang="sv" />
|
||||||
|
<file path="translations/electron_strings_sw.xtb" lang="sw" />
|
||||||
|
<file path="translations/electron_strings_ta.xtb" lang="ta" />
|
||||||
|
<file path="translations/electron_strings_te.xtb" lang="te" />
|
||||||
|
<file path="translations/electron_strings_th.xtb" lang="th" />
|
||||||
|
<file path="translations/electron_strings_tr.xtb" lang="tr" />
|
||||||
|
<file path="translations/electron_strings_uk.xtb" lang="uk" />
|
||||||
|
<file path="translations/electron_strings_ur.xtb" lang="ur" />
|
||||||
|
<file path="translations/electron_strings_uz.xtb" lang="uz" />
|
||||||
|
<file path="translations/electron_strings_vi.xtb" lang="vi" />
|
||||||
|
<file path="translations/electron_strings_zh-CN.xtb" lang="zh-CN" />
|
||||||
|
<file path="translations/electron_strings_zh-HK.xtb" lang="zh-HK" />
|
||||||
|
<file path="translations/electron_strings_zh-TW.xtb" lang="zh-TW" />
|
||||||
|
<file path="translations/electron_strings_zu.xtb" lang="zu" />
|
||||||
|
</translations>
|
||||||
|
<release seq="1">
|
||||||
|
<messages fallback_to_english="true">
|
||||||
|
<message name="IDS_MAC_NOTIFICATION_INLINE_REPLY_BUTTON" desc="Label for the inline reply button inside a macOS notification.">
|
||||||
|
Reply
|
||||||
|
</message>
|
||||||
|
<message name="IDS_MAC_NOTIFICATION_SHOW_BUTTON" desc="Label for the default action button inside a macOS notification.">
|
||||||
|
Show
|
||||||
|
</message>
|
||||||
|
</messages>
|
||||||
<includes>
|
<includes>
|
||||||
<include name="IDR_CONTENT_SHELL_DEVTOOLS_DISCOVERY_PAGE" file="${target_gen_dir}/shell_devtools_discovery_page.html" use_base_dir="false" type="BINDATA" />
|
<include name="IDR_CONTENT_SHELL_DEVTOOLS_DISCOVERY_PAGE" file="${target_gen_dir}/shell_devtools_discovery_page.html" use_base_dir="false" type="BINDATA" />
|
||||||
</includes>
|
</includes>
|
||||||
</release>
|
</release>
|
||||||
</grit>
|
</grit>
|
||||||
@@ -9,5 +9,6 @@
|
|||||||
"embedded_asar_integrity_validation": "0",
|
"embedded_asar_integrity_validation": "0",
|
||||||
"only_load_app_from_asar": "0",
|
"only_load_app_from_asar": "0",
|
||||||
"load_browser_process_specific_v8_snapshot": "0",
|
"load_browser_process_specific_v8_snapshot": "0",
|
||||||
"grant_file_protocol_extra_privileges": "1"
|
"grant_file_protocol_extra_privileges": "1",
|
||||||
|
"wasm_trap_handlers": "1"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,21 +0,0 @@
|
|||||||
# -*- bazel-starlark -*-
|
|
||||||
|
|
||||||
load("@builtin//struct.star", "module")
|
|
||||||
|
|
||||||
def __platform_properties(ctx):
|
|
||||||
container_image = "docker://gcr.io/chops-public-images-prod/rbe/siso-chromium/linux@sha256:d7cb1ab14a0f20aa669c23f22c15a9dead761dcac19f43985bf9dd5f41fbef3a"
|
|
||||||
return {
|
|
||||||
"default": {
|
|
||||||
"OSFamily": "Linux",
|
|
||||||
"container-image": container_image,
|
|
||||||
},
|
|
||||||
"large": {
|
|
||||||
"OSFamily": "Linux",
|
|
||||||
"container-image": container_image,
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
||||||
backend = module(
|
|
||||||
"backend",
|
|
||||||
platform_properties = __platform_properties,
|
|
||||||
)
|
|
||||||
@@ -1,66 +0,0 @@
|
|||||||
load("@builtin//encoding.star", "json")
|
|
||||||
load("@builtin//path.star", "path")
|
|
||||||
load("@builtin//runtime.star", "runtime")
|
|
||||||
load("@builtin//struct.star", "module")
|
|
||||||
load("@config//main.star", upstream_init = "init")
|
|
||||||
load("@config//win_sdk.star", "win_sdk")
|
|
||||||
load("@config//gn_logs.star", "gn_logs")
|
|
||||||
|
|
||||||
def init(ctx):
|
|
||||||
mod = upstream_init(ctx)
|
|
||||||
step_config = json.decode(mod.step_config)
|
|
||||||
|
|
||||||
# Buildbarn doesn't support input_root_absolute_path so disable that
|
|
||||||
for rule in step_config["rules"]:
|
|
||||||
input_root_absolute_path = rule.get("input_root_absolute_path", False)
|
|
||||||
if input_root_absolute_path:
|
|
||||||
rule.pop("input_root_absolute_path", None)
|
|
||||||
|
|
||||||
# Only wrap clang rules with a remote wrapper if not on Linux. These are currently only
|
|
||||||
# needed for X-Compile builds, which run on Windows and Mac.
|
|
||||||
if runtime.os != "linux":
|
|
||||||
for rule in step_config["rules"]:
|
|
||||||
if rule["name"].startswith("clang/") or rule["name"].startswith("clang-cl/"):
|
|
||||||
rule["remote_wrapper"] = "../../buildtools/reclient_cfgs/chromium-browser-clang/clang_remote_wrapper"
|
|
||||||
if "inputs" not in rule:
|
|
||||||
rule["inputs"] = []
|
|
||||||
rule["inputs"].append("buildtools/reclient_cfgs/chromium-browser-clang/clang_remote_wrapper")
|
|
||||||
rule["inputs"].append("third_party/llvm-build/Release+Asserts_linux/bin/clang")
|
|
||||||
|
|
||||||
if "executables" not in step_config:
|
|
||||||
step_config["executables"] = []
|
|
||||||
step_config["executables"].append("buildtools/reclient_cfgs/chromium-browser-clang/clang_remote_wrapper")
|
|
||||||
step_config["executables"].append("third_party/llvm-build/Release+Asserts_linux/bin/clang")
|
|
||||||
|
|
||||||
if runtime.os == "darwin":
|
|
||||||
# Update platforms to match our default siso config instead of reclient configs.
|
|
||||||
step_config["platforms"].update({
|
|
||||||
"clang": step_config["platforms"]["default"],
|
|
||||||
"clang_large": step_config["platforms"]["default"],
|
|
||||||
})
|
|
||||||
|
|
||||||
if runtime.os == "windows":
|
|
||||||
# Add additional Windows SDK headers needed by Electron
|
|
||||||
win_toolchain_dir = win_sdk.toolchain_dir(ctx)
|
|
||||||
if win_toolchain_dir:
|
|
||||||
sdk_version = gn_logs.read(ctx).get("windows_sdk_version")
|
|
||||||
step_config["input_deps"][win_toolchain_dir + ":headers"].extend([
|
|
||||||
# third_party/electron_node/deps/uv/include/uv/win.h includes mswsock.h
|
|
||||||
path.join(win_toolchain_dir, "Windows Kits/10/Include", sdk_version, "um/mswsock.h"),
|
|
||||||
# third_party/electron_node/src/debug_utils.cc includes lm.h
|
|
||||||
path.join(win_toolchain_dir, "Windows Kits/10/Include", sdk_version, "um/Lm.h"),
|
|
||||||
])
|
|
||||||
|
|
||||||
# Update platforms to match our default siso config instead of reclient configs.
|
|
||||||
step_config["platforms"].update({
|
|
||||||
"clang-cl": step_config["platforms"]["default"],
|
|
||||||
"clang-cl_large": step_config["platforms"]["default"],
|
|
||||||
"lld-link": step_config["platforms"]["default"],
|
|
||||||
})
|
|
||||||
|
|
||||||
return module(
|
|
||||||
"config",
|
|
||||||
step_config = json.encode(step_config),
|
|
||||||
filegroups = mod.filegroups,
|
|
||||||
handlers = mod.handlers,
|
|
||||||
)
|
|
||||||
6
build/translations/electron_strings_af.xtb
Normal file
6
build/translations/electron_strings_af.xtb
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
<?xml version="1.0" ?>
|
||||||
|
<!DOCTYPE translationbundle>
|
||||||
|
<translationbundle lang="af">
|
||||||
|
<translation id="2727175239389218057">Antwoord</translation>
|
||||||
|
<translation id="5300589172476337783">Wys</translation>
|
||||||
|
</translationbundle>
|
||||||
6
build/translations/electron_strings_am.xtb
Normal file
6
build/translations/electron_strings_am.xtb
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
<?xml version="1.0" ?>
|
||||||
|
<!DOCTYPE translationbundle>
|
||||||
|
<translationbundle lang="am">
|
||||||
|
<translation id="2727175239389218057">ምላሽ ስጥ</translation>
|
||||||
|
<translation id="5300589172476337783">አሳይ</translation>
|
||||||
|
</translationbundle>
|
||||||
6
build/translations/electron_strings_ar.xtb
Normal file
6
build/translations/electron_strings_ar.xtb
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
<?xml version="1.0" ?>
|
||||||
|
<!DOCTYPE translationbundle>
|
||||||
|
<translationbundle lang="ar">
|
||||||
|
<translation id="2727175239389218057">الرّد</translation>
|
||||||
|
<translation id="5300589172476337783">عرض</translation>
|
||||||
|
</translationbundle>
|
||||||
6
build/translations/electron_strings_as.xtb
Normal file
6
build/translations/electron_strings_as.xtb
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
<?xml version="1.0" ?>
|
||||||
|
<!DOCTYPE translationbundle>
|
||||||
|
<translationbundle lang="as">
|
||||||
|
<translation id="2727175239389218057">প্ৰত্যুত্তৰ দিয়ক</translation>
|
||||||
|
<translation id="5300589172476337783">দেখুৱাওক</translation>
|
||||||
|
</translationbundle>
|
||||||
6
build/translations/electron_strings_az.xtb
Normal file
6
build/translations/electron_strings_az.xtb
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
<?xml version="1.0" ?>
|
||||||
|
<!DOCTYPE translationbundle>
|
||||||
|
<translationbundle lang="az">
|
||||||
|
<translation id="2727175239389218057">Cavablayın</translation>
|
||||||
|
<translation id="5300589172476337783">Göstərin</translation>
|
||||||
|
</translationbundle>
|
||||||
6
build/translations/electron_strings_be.xtb
Normal file
6
build/translations/electron_strings_be.xtb
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
<?xml version="1.0" ?>
|
||||||
|
<!DOCTYPE translationbundle>
|
||||||
|
<translationbundle lang="be">
|
||||||
|
<translation id="2727175239389218057">Адказаць</translation>
|
||||||
|
<translation id="5300589172476337783">Паказаць</translation>
|
||||||
|
</translationbundle>
|
||||||
6
build/translations/electron_strings_bg.xtb
Normal file
6
build/translations/electron_strings_bg.xtb
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
<?xml version="1.0" ?>
|
||||||
|
<!DOCTYPE translationbundle>
|
||||||
|
<translationbundle lang="bg">
|
||||||
|
<translation id="2727175239389218057">Отговор</translation>
|
||||||
|
<translation id="5300589172476337783">Показване</translation>
|
||||||
|
</translationbundle>
|
||||||
6
build/translations/electron_strings_bn.xtb
Normal file
6
build/translations/electron_strings_bn.xtb
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
<?xml version="1.0" ?>
|
||||||
|
<!DOCTYPE translationbundle>
|
||||||
|
<translationbundle lang="bn">
|
||||||
|
<translation id="2727175239389218057">উত্তর দিন</translation>
|
||||||
|
<translation id="5300589172476337783">দেখান</translation>
|
||||||
|
</translationbundle>
|
||||||
6
build/translations/electron_strings_bs.xtb
Normal file
6
build/translations/electron_strings_bs.xtb
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
<?xml version="1.0" ?>
|
||||||
|
<!DOCTYPE translationbundle>
|
||||||
|
<translationbundle lang="bs">
|
||||||
|
<translation id="2727175239389218057">Odgovori</translation>
|
||||||
|
<translation id="5300589172476337783">Prikaži</translation>
|
||||||
|
</translationbundle>
|
||||||
6
build/translations/electron_strings_ca.xtb
Normal file
6
build/translations/electron_strings_ca.xtb
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
<?xml version="1.0" ?>
|
||||||
|
<!DOCTYPE translationbundle>
|
||||||
|
<translationbundle lang="ca">
|
||||||
|
<translation id="2727175239389218057">Respon</translation>
|
||||||
|
<translation id="5300589172476337783">Mostra</translation>
|
||||||
|
</translationbundle>
|
||||||
6
build/translations/electron_strings_cs.xtb
Normal file
6
build/translations/electron_strings_cs.xtb
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
<?xml version="1.0" ?>
|
||||||
|
<!DOCTYPE translationbundle>
|
||||||
|
<translationbundle lang="cs">
|
||||||
|
<translation id="2727175239389218057">Odpovědět</translation>
|
||||||
|
<translation id="5300589172476337783">Zobrazit</translation>
|
||||||
|
</translationbundle>
|
||||||
6
build/translations/electron_strings_cy.xtb
Normal file
6
build/translations/electron_strings_cy.xtb
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
<?xml version="1.0" ?>
|
||||||
|
<!DOCTYPE translationbundle>
|
||||||
|
<translationbundle lang="cy">
|
||||||
|
<translation id="2727175239389218057">Ateb</translation>
|
||||||
|
<translation id="5300589172476337783">Arddangos</translation>
|
||||||
|
</translationbundle>
|
||||||
6
build/translations/electron_strings_da.xtb
Normal file
6
build/translations/electron_strings_da.xtb
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
<?xml version="1.0" ?>
|
||||||
|
<!DOCTYPE translationbundle>
|
||||||
|
<translationbundle lang="da">
|
||||||
|
<translation id="2727175239389218057">Svar</translation>
|
||||||
|
<translation id="5300589172476337783">Vis</translation>
|
||||||
|
</translationbundle>
|
||||||
6
build/translations/electron_strings_de.xtb
Normal file
6
build/translations/electron_strings_de.xtb
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
<?xml version="1.0" ?>
|
||||||
|
<!DOCTYPE translationbundle>
|
||||||
|
<translationbundle lang="de">
|
||||||
|
<translation id="2727175239389218057">Antworten</translation>
|
||||||
|
<translation id="5300589172476337783">Anzeigen</translation>
|
||||||
|
</translationbundle>
|
||||||
6
build/translations/electron_strings_el.xtb
Normal file
6
build/translations/electron_strings_el.xtb
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
<?xml version="1.0" ?>
|
||||||
|
<!DOCTYPE translationbundle>
|
||||||
|
<translationbundle lang="el">
|
||||||
|
<translation id="2727175239389218057">Απάντηση</translation>
|
||||||
|
<translation id="5300589172476337783">Εμφάνιση</translation>
|
||||||
|
</translationbundle>
|
||||||
6
build/translations/electron_strings_en-GB.xtb
Normal file
6
build/translations/electron_strings_en-GB.xtb
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
<?xml version="1.0" ?>
|
||||||
|
<!DOCTYPE translationbundle>
|
||||||
|
<translationbundle lang="en-GB">
|
||||||
|
<translation id="2727175239389218057">Reply</translation>
|
||||||
|
<translation id="5300589172476337783">Show</translation>
|
||||||
|
</translationbundle>
|
||||||
6
build/translations/electron_strings_es-419.xtb
Normal file
6
build/translations/electron_strings_es-419.xtb
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
<?xml version="1.0" ?>
|
||||||
|
<!DOCTYPE translationbundle>
|
||||||
|
<translationbundle lang="es-419">
|
||||||
|
<translation id="2727175239389218057">Responder</translation>
|
||||||
|
<translation id="5300589172476337783">Mostrar</translation>
|
||||||
|
</translationbundle>
|
||||||
6
build/translations/electron_strings_es.xtb
Normal file
6
build/translations/electron_strings_es.xtb
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
<?xml version="1.0" ?>
|
||||||
|
<!DOCTYPE translationbundle>
|
||||||
|
<translationbundle lang="es">
|
||||||
|
<translation id="2727175239389218057">Responder</translation>
|
||||||
|
<translation id="5300589172476337783">Mostrar</translation>
|
||||||
|
</translationbundle>
|
||||||
6
build/translations/electron_strings_et.xtb
Normal file
6
build/translations/electron_strings_et.xtb
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
<?xml version="1.0" ?>
|
||||||
|
<!DOCTYPE translationbundle>
|
||||||
|
<translationbundle lang="et">
|
||||||
|
<translation id="2727175239389218057">Vasta</translation>
|
||||||
|
<translation id="5300589172476337783">Kuva</translation>
|
||||||
|
</translationbundle>
|
||||||
6
build/translations/electron_strings_eu.xtb
Normal file
6
build/translations/electron_strings_eu.xtb
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
<?xml version="1.0" ?>
|
||||||
|
<!DOCTYPE translationbundle>
|
||||||
|
<translationbundle lang="eu">
|
||||||
|
<translation id="2727175239389218057">Erantzun</translation>
|
||||||
|
<translation id="5300589172476337783">Erakutsi</translation>
|
||||||
|
</translationbundle>
|
||||||
6
build/translations/electron_strings_fa.xtb
Normal file
6
build/translations/electron_strings_fa.xtb
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
<?xml version="1.0" ?>
|
||||||
|
<!DOCTYPE translationbundle>
|
||||||
|
<translationbundle lang="fa">
|
||||||
|
<translation id="2727175239389218057">پاسخ دادن</translation>
|
||||||
|
<translation id="5300589172476337783">نمایش</translation>
|
||||||
|
</translationbundle>
|
||||||
6
build/translations/electron_strings_fi.xtb
Normal file
6
build/translations/electron_strings_fi.xtb
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
<?xml version="1.0" ?>
|
||||||
|
<!DOCTYPE translationbundle>
|
||||||
|
<translationbundle lang="fi">
|
||||||
|
<translation id="2727175239389218057">Vastaa</translation>
|
||||||
|
<translation id="5300589172476337783">Näytä</translation>
|
||||||
|
</translationbundle>
|
||||||
6
build/translations/electron_strings_fil.xtb
Normal file
6
build/translations/electron_strings_fil.xtb
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
<?xml version="1.0" ?>
|
||||||
|
<!DOCTYPE translationbundle>
|
||||||
|
<translationbundle lang="fil">
|
||||||
|
<translation id="2727175239389218057">Sumagot</translation>
|
||||||
|
<translation id="5300589172476337783">Ipakita</translation>
|
||||||
|
</translationbundle>
|
||||||
6
build/translations/electron_strings_fr-CA.xtb
Normal file
6
build/translations/electron_strings_fr-CA.xtb
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
<?xml version="1.0" ?>
|
||||||
|
<!DOCTYPE translationbundle>
|
||||||
|
<translationbundle lang="fr-CA">
|
||||||
|
<translation id="2727175239389218057">Répondre</translation>
|
||||||
|
<translation id="5300589172476337783">Afficher</translation>
|
||||||
|
</translationbundle>
|
||||||
6
build/translations/electron_strings_fr.xtb
Normal file
6
build/translations/electron_strings_fr.xtb
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
<?xml version="1.0" ?>
|
||||||
|
<!DOCTYPE translationbundle>
|
||||||
|
<translationbundle lang="fr">
|
||||||
|
<translation id="2727175239389218057">Répondre</translation>
|
||||||
|
<translation id="5300589172476337783">Afficher</translation>
|
||||||
|
</translationbundle>
|
||||||
6
build/translations/electron_strings_gl.xtb
Normal file
6
build/translations/electron_strings_gl.xtb
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
<?xml version="1.0" ?>
|
||||||
|
<!DOCTYPE translationbundle>
|
||||||
|
<translationbundle lang="gl">
|
||||||
|
<translation id="2727175239389218057">Responder</translation>
|
||||||
|
<translation id="5300589172476337783">Mostrar</translation>
|
||||||
|
</translationbundle>
|
||||||
6
build/translations/electron_strings_gu.xtb
Normal file
6
build/translations/electron_strings_gu.xtb
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
<?xml version="1.0" ?>
|
||||||
|
<!DOCTYPE translationbundle>
|
||||||
|
<translationbundle lang="gu">
|
||||||
|
<translation id="2727175239389218057">જવાબ આપો</translation>
|
||||||
|
<translation id="5300589172476337783">બતાવો</translation>
|
||||||
|
</translationbundle>
|
||||||
6
build/translations/electron_strings_hi.xtb
Normal file
6
build/translations/electron_strings_hi.xtb
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
<?xml version="1.0" ?>
|
||||||
|
<!DOCTYPE translationbundle>
|
||||||
|
<translationbundle lang="hi">
|
||||||
|
<translation id="2727175239389218057">जवाब दें</translation>
|
||||||
|
<translation id="5300589172476337783">दिखाएं</translation>
|
||||||
|
</translationbundle>
|
||||||
6
build/translations/electron_strings_hr.xtb
Normal file
6
build/translations/electron_strings_hr.xtb
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
<?xml version="1.0" ?>
|
||||||
|
<!DOCTYPE translationbundle>
|
||||||
|
<translationbundle lang="hr">
|
||||||
|
<translation id="2727175239389218057">Odgovori</translation>
|
||||||
|
<translation id="5300589172476337783">Prikaži</translation>
|
||||||
|
</translationbundle>
|
||||||
6
build/translations/electron_strings_hu.xtb
Normal file
6
build/translations/electron_strings_hu.xtb
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
<?xml version="1.0" ?>
|
||||||
|
<!DOCTYPE translationbundle>
|
||||||
|
<translationbundle lang="hu">
|
||||||
|
<translation id="2727175239389218057">Válasz</translation>
|
||||||
|
<translation id="5300589172476337783">Megjelenítés</translation>
|
||||||
|
</translationbundle>
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user