@@ -44,6 +44,34 @@ PYPROJECT="${PROJECT_PATH}/pyproject.toml"
4444LOCKFILE=" ${PROJECT_PATH} /uv.lock"
4545MODAL_APP=" ${PROJECT_PATH} /src/modal/app.py"
4646
47+ create_pr_body_file () {
48+ local changelog
49+ local pr_body_file
50+
51+ changelog=$( python3 " ${ROOT_DIR} /.github/scripts/check-country-package-updates.py" \
52+ --package " $PACKAGE " \
53+ --old-version " $CURRENT " \
54+ --new-version " $LATEST " 2> /dev/null || true)
55+
56+ pr_body_file=" $( mktemp) "
57+ {
58+ echo " ## Summary"
59+ echo
60+ echo " Update ${DISPLAY_NAME} from ${CURRENT} to ${LATEST} in the simulation API runtime."
61+ if [[ -n " $changelog " ]]; then
62+ echo
63+ echo " ## What changed (${CURRENT} -> ${LATEST} )"
64+ echo
65+ echo " $changelog "
66+ fi
67+ echo
68+ echo " ---"
69+ echo " Generated automatically by GitHub Actions."
70+ } > " $pr_body_file "
71+
72+ echo " $pr_body_file "
73+ }
74+
4775if [[ ! -f " $PYPROJECT " || ! -f " $LOCKFILE " || ! -f " $MODAL_APP " ]]; then
4876 echo " ERROR: Expected simulation project files were not found under ${PROJECT_DIR} ." >&2
4977 exit 1
89117BRANCH=" auto/update-${PACKAGE} -${LATEST} "
90118echo " Update available: ${CURRENT} -> ${LATEST} "
91119
92- if git ls-remote --exit-code --heads origin " $BRANCH " > /dev/null 2>&1 ; then
93- echo " Branch '${BRANCH} ' already exists on remote. Skipping."
94- exit 0
95- fi
96-
97120if [[ " $DRY_RUN " == " 1" ]]; then
121+ if git ls-remote --exit-code --heads origin " $BRANCH " > /dev/null 2>&1 ; then
122+ echo " Dry run: remote branch '${BRANCH} ' already exists; would ensure a PR exists for it."
123+ exit 0
124+ fi
98125 echo " Dry run: would create ${BRANCH} and update:"
99126 echo " ${PROJECT_DIR} /pyproject.toml"
100127 echo " ${PROJECT_DIR} /uv.lock"
101128 echo " ${PROJECT_DIR} /src/modal/app.py"
102129 exit 0
103130fi
104131
132+ EXISTING_PR=$( gh pr list \
133+ --head " $BRANCH " \
134+ --state open \
135+ --json number \
136+ --jq ' .[0].number' 2> /dev/null || true)
137+ if [[ -n " $EXISTING_PR " ]]; then
138+ echo " PR #${EXISTING_PR} already exists for ${BRANCH} . Skipping."
139+ exit 0
140+ fi
141+
142+ if git ls-remote --exit-code --heads origin " $BRANCH " > /dev/null 2>&1 ; then
143+ echo " Remote branch '${BRANCH} ' already exists without an open PR. Creating PR."
144+ PR_BODY_FILE=" $( create_pr_body_file) "
145+ gh pr create \
146+ --base main \
147+ --head " $BRANCH " \
148+ --title " chore(deps): update ${PACKAGE} to ${LATEST} " \
149+ --body-file " $PR_BODY_FILE "
150+ echo " PR created for existing branch ${BRANCH} "
151+ exit 0
152+ fi
153+
105154git config user.name " github-actions[bot]"
106155git config user.email " github-actions[bot]@users.noreply.github.com"
107156git checkout -b " $BRANCH "
@@ -141,26 +190,7 @@ if git diff --quiet -- "$PYPROJECT" "$LOCKFILE" "$MODAL_APP"; then
141190 exit 0
142191fi
143192
144- CHANGELOG=$( python3 " ${ROOT_DIR} /.github/scripts/check-country-package-updates.py" \
145- --package " $PACKAGE " \
146- --old-version " $CURRENT " \
147- --new-version " $LATEST " 2> /dev/null || true)
148-
149- PR_BODY_FILE=" $( mktemp) "
150- {
151- echo " ## Summary"
152- echo
153- echo " Update ${DISPLAY_NAME} from ${CURRENT} to ${LATEST} in the simulation API runtime."
154- if [[ -n " $CHANGELOG " ]]; then
155- echo
156- echo " ## What changed (${CURRENT} -> ${LATEST} )"
157- echo
158- echo " $CHANGELOG "
159- fi
160- echo
161- echo " ---"
162- echo " Generated automatically by GitHub Actions."
163- } > " $PR_BODY_FILE "
193+ PR_BODY_FILE=" $( create_pr_body_file) "
164194
165195git add " $PYPROJECT " " $LOCKFILE " " $MODAL_APP "
166196git commit -m " chore(deps): update ${PACKAGE} to ${LATEST} "
0 commit comments