@@ -16,84 +16,64 @@ defaults:
1616env :
1717 # So cargo doesn't complain about unstable features
1818 RUSTC_BOOTSTRAP : 1
19- PR_TITLE : Weekly `cargo update`
20- PR_MESSAGE : |
21- Automation to keep dependencies in `Cargo.lock` current.
22-
23- The following is the output from `cargo update`:
24- COMMIT_MESSAGE : " cargo update \n\n "
2519
2620jobs :
27- not-waiting-on-bors :
28- if : github.repository_owner == 'rust-lang'
29- name : skip if S-waiting-on-bors
30- runs-on : ubuntu-latest
31- steps :
32- - env :
33- GITHUB_TOKEN : ${{ secrets.GITHUB_TOKEN }}
34- run : |
35- # Fetch state and labels of PR
36- # Or exit successfully if PR does not exist
37- JSON=$(gh pr view cargo_update --repo $GITHUB_REPOSITORY --json labels,state || exit 0)
38- STATE=$(echo "$JSON" | jq -r '.state')
39- WAITING_ON_BORS=$(echo "$JSON" | jq '.labels[] | any(.name == "S-waiting-on-bors"; .)')
40-
41- # Exit with error if open and S-waiting-on-bors
42- if [[ "$STATE" == "OPEN" && "$WAITING_ON_BORS" == "true" ]]; then
43- exit 1
44- fi
45-
4621 update :
4722 if : github.repository_owner == 'rust-lang'
4823 name : update dependencies
49- needs : not-waiting-on-bors
5024 runs-on : ubuntu-latest
25+ outputs :
26+ all_lockfiles : ${{ steps.update_script.outputs.all_lockfiles }}
27+ enqueued_lockfiles : ${{ steps.update_script.outputs.enqueued_lockfiles }}
5128 steps :
5229 - name : checkout the source code
5330 uses : actions/checkout@v4
5431 with :
5532 submodules : recursive
33+
5634 - name : install the bootstrap toolchain
5735 run : |
5836 # Extract the stage0 version
59- TOOLCHAIN =$(awk -F= '{a[$1]=$2} END {print(a["compiler_version"] "-" a["compiler_date"])}' src/stage0)
37+ toolchain =$(awk -F= '{a[$1]=$2} END {print(a["compiler_version"] "-" a["compiler_date"])}' src/stage0)
6038 # Install and set as default
61- rustup toolchain install --no-self-update --profile minimal $TOOLCHAIN
62- rustup default $TOOLCHAIN
39+ rustup toolchain install --no-self-update --profile minimal "$toolchain"
40+ rustup default "$toolchain"
6341
64- - name : cargo update compiler & tools
65- # Remove first line that always just says "Updating crates.io index"
66- run : |
67- echo -e "\ncompiler & tools dependencies:" >> cargo_update.log
68- cargo update 2>&1 | sed '/crates.io index/d' | tee -a cargo_update.log
69- - name : cargo update library
70- run : |
71- echo -e "\nlibrary dependencies:" >> cargo_update.log
72- cargo update --manifest-path library/Cargo.toml 2>&1 | sed '/crates.io index/d' | tee -a cargo_update.log
73- - name : cargo update rustbook
42+ - name : run update script
43+ id : update_script
44+ env :
45+ GITHUB_TOKEN : ${{ secrets.GITHUB_TOKEN }}
7446 run : |
75- echo -e "\nrustbook dependencies:" >> cargo_update.log
76- cargo update --manifest-path src/tools/rustbook/Cargo.toml 2>&1 | sed '/crates.io index/d' | tee -a cargo_update.log
77- - name : upload Cargo.lock artifact for use in PR
78- uses : actions/upload-artifact@v4
79- with :
80- name : Cargo-lock
81- path : |
82- Cargo.lock
83- library/Cargo.lock
84- src/tools/rustbook/Cargo.lock
85- retention-days : 1
86- - name : upload cargo-update log artifact for use in PR
47+ # Update all lockfiles
48+ ./ src/ci/scripts/update-all-lockfiles.py --run-update
49+
50+ # Make a list of all lockfiles that we manage, as well as a list of
51+ # those that already have PRs in the queue.
52+ all_lockfiles="$(./src/ci/scripts/update-all-lockfiles.py --list-all)"
53+ enqueued_lockfiles="$(./src/ci/scripts/update-all-lockfiles.py --list-enqueued)"
54+
55+ echo "all_lockfiles=$all_lockfiles" >> "$GITHUB_OUTPUT"
56+ echo "enqueued_lockfiles=$enqueued_lockfiles" >> "$GITHUB_OUTPUT"
57+
58+ - name : upload output file
8759 uses : actions/upload-artifact@v4
8860 with :
89- name : cargo-updates
90- path : cargo_update.log
61+ name : update-output
62+ path : update_output.json
9163 retention-days : 1
9264
9365 pr :
94- if : github.repository_owner == 'rust-lang'
95- name : amend PR
96- needs : update
66+ name : create or update PR
67+ needs : [update]
68+ strategy :
69+ fail-fast : false
70+ matrix :
71+ name : ${{ fromJson(needs.update.outputs.all_lockfiles) }}
72+ # Don't run the job for a branch if we don't need to make a PR (because there is
73+ # already one in the queue).
74+ if : >
75+ github.repository_owner == 'rust-lang' &&
76+ !contains(fromJSON(needs.update.outputs.enqueued_lockfiles), matrix.name)
9777 runs-on : ubuntu-latest
9878 permissions :
9979 contents : write
@@ -102,35 +82,34 @@ jobs:
10282 - name : checkout the source code
10383 uses : actions/checkout@v4
10484
105- - name : download Cargo.lock from update job
106- uses : actions/download-artifact@v4
107- with :
108- name : Cargo-lock
109- - name : download cargo-update log from update job
85+ - name : download output file from update job
11086 uses : actions/download-artifact@v4
11187 with :
112- name : cargo-updates
88+ name : update-output
11389
11490 - name : craft PR body and commit message
11591 run : |
116- echo "${COMMIT_MESSAGE}" > commit.txt
117- cat cargo_update.log >> commit.txt
92+ # Create ` commit.txt` and `pr_body.md`
93+ ./src/ci/scripts/update-all-lockfiles.py --prepare-pr-files "${{ matrix.name }}"
11894
119- echo "${PR_MESSAGE}" > body.md
120- echo '```txt' >> body.md
121- cat cargo_update.log >> body.md
122- echo '```' >> body.md
95+ # Set some environment variables from the JSON file
96+ echo "BRANCH=$(jq -r '.${{ matrix.name }}.branch' update_output.json)" >> "$GITHUB_OUTPUT"
97+ echo "PR_TITLE=$(jq -r '.${{ matrix.name }}.pr_title' update_output.json)" >> "$GITHUB_OUTPUT"
12398
12499 - name : commit
125100 run : |
126101 git config user.name github-actions
127102 git config user.email github-actions@github.com
128- git switch --force-create cargo_update
129- git add ./Cargo.lock ./library/Cargo.lock ./src/tools/rustbook/Cargo.lock
103+ git switch --force-create "$BRANCH"
104+
105+ # Add only the relevant lockfile
106+ ./src/ci/scripts/update-all-lockfiles.py --restore-lockfile "${{ matrix.name }}"
107+
108+ git add "$(jq -r '.${{ matrix.name }}.lockfile_path' update_output.json)"
130109 git commit --no-verify --file=commit.txt
131110
132111 - name : push
133- run : git push --no-verify --force --set-upstream origin cargo_update
112+ run : git push --no-verify --force --set-upstream origin "$BRANCH"
134113
135114 - name : edit existing open pull request
136115 id : edit
@@ -140,16 +119,15 @@ jobs:
140119 GITHUB_TOKEN : ${{ secrets.GITHUB_TOKEN }}
141120 run : |
142121 # Exit with error if PR is closed
143- STATE=$(gh pr view cargo_update --repo $GITHUB_REPOSITORY --json state --jq '.state')
144- if [[ "$STATE" != "OPEN" ]]; then
145- exit 1
146- fi
122+ state=$(gh pr view "$BRANCH" --repo "$GITHUB_REPOSITORY" --json state --jq '.state')
123+ [ "$state" != "OPEN" ] && exit 1
147124
148- gh pr edit cargo_update --title "${PR_TITLE}" --body-file body.md --repo $GITHUB_REPOSITORY
125+ # Replace the title and body with what we generated
126+ gh pr edit "$BRANCH" --title "$PR_TITLE" --body-file pr_body.md --repo "$GITHUB_REPOSITORY"
149127
150128 - name : open new pull request
151129 # Only run if there wasn't an existing PR
152130 if : steps.edit.outcome != 'success'
153131 env :
154132 GITHUB_TOKEN : ${{ secrets.GITHUB_TOKEN }}
155- run : gh pr create --title "${ PR_TITLE} " --body-file body .md --repo $GITHUB_REPOSITORY
133+ run : gh pr create --title "$PR_TITLE" --body-file pr_body .md --repo " $GITHUB_REPOSITORY"
0 commit comments