svn commit: r1935038 - httpd/dev-tools/trunk/github
[email protected] Fri, 05 Jun 2026 16:24:49 -0000
| Newsgroups | gmane.comp.apache.cvs |
|---|---|
| Message-ID | <178067668950.3199937.4095395844913309427@svn03-he-fi> |
Author: jorton Date: Fri Jun 5 16:24:49 2026 New Revision: 1935038 Log: Add script to create MRs in icing/mod_h2 from httpd trunk commits. Your fork must be a git remote named "fork", or else edit $FORK_REMOTE. Co-Authored-By: Claude Opus 4.6 <[email protected]> Added: httpd/dev-tools/trunk/github/mod_h2_sync_from_trunk.sh (contents, props changed) Added: httpd/dev-tools/trunk/github/mod_h2_sync_from_trunk.sh ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ httpd/dev-tools/trunk/github/mod_h2_sync_from_trunk.sh Fri Jun 5 16:24:49 2026 (r1935038) @@ -0,0 +1,112 @@ +#!/bin/bash +# Sync SVN revisions from httpd trunk modules/http2 into this git repo. +# Creates a branch, applies each revision as a separate commit, pushes, +# and opens a PR. + +set -euo pipefail + +SVN_BASE_URL="https://svn.apache.org/repos/asf/httpd/httpd/trunk" +SVN_SUBDIR="modules/http2" +GIT_SUBDIR="mod_http2" +FORK_REMOTE="fork" +UPSTREAM_REPO="icing/mod_h2" + +usage() { + echo "Usage: $0 <svn-revision>..." >&2 + exit 1 +} + +if [ $# -lt 1 ]; then + usage +fi + +REVS=() +for REV in "$@"; do + if ! [[ "$REV" =~ ^[0-9]+$ ]]; then + echo "Error: revision must be a number: $REV" >&2 + usage + fi + REVS+=("$REV") +done + +patchfile=$(mktemp) +trap 'rm -f "$patchfile"' EXIT + +BRANCH="svn-r$(IFS=-; echo "${REVS[*]}")" +ORIG_BRANCH=$(git symbolic-ref --short HEAD 2>/dev/null || git rev-parse HEAD) + +git fetch origin master +git checkout -b "$BRANCH" origin/master + +for REV in "${REVS[@]}"; do + # Fetch the SVN log message and author + svn_log=$(svn log -r "$REV" "$SVN_BASE_URL/" 2>&1) + if ! echo "$svn_log" | grep -q "^r${REV} "; then + echo "Error: could not fetch SVN log for r${REV}" >&2 + echo "$svn_log" >&2 + git checkout "$ORIG_BRANCH" + git branch -D "$BRANCH" + exit 1 + fi + + svn_author=$(echo "$svn_log" | sed -n '2s/^r[0-9]* | \([^ ]*\) |.*/\1/p') + svn_message=$(echo "$svn_log" | sed '1,3d; /^-\{72\}$/d' | sed -e '/./,$!d' -e :a -e '/^\n*$/{$d;N;ba}') + + echo "Merging r${REV} by ${svn_author}:" + echo "$svn_message" + echo + + # Fetch the diff, filter to modules/http2 + svn diff -c "$REV" "$SVN_BASE_URL/" \ + | filterdiff --strip=2 --addprefix="${GIT_SUBDIR}/" -i "${SVN_SUBDIR}/*" \ + > "$patchfile" + + if [ ! -s "$patchfile" ]; then + echo "Error: no changes under ${SVN_SUBDIR}/ in r${REV}" >&2 + git checkout "$ORIG_BRANCH" + git branch -D "$BRANCH" + exit 1 + fi + + git apply -p0 "$patchfile" + + git add "$GIT_SUBDIR"/ + + commit_message="Merge r${REV} from httpd trunk: + +${svn_message} + +Reference: https://svn.apache.org/viewvc/?view=revision&revision=${REV}" + + git commit -m "$commit_message" +done + +git checkout "$ORIG_BRANCH" + +git push "$FORK_REMOTE" "${BRANCH}:${BRANCH}" + +# Build PR title and body +if [ ${#REVS[@]} -eq 1 ]; then + pr_title="Backport SVN r${REVS[0]}: $(echo "$svn_message" | head -1)" + pr_body="Backport of [SVN r${REVS[0]}](https://svn.apache.org/viewvc?view=revision&revision=${REVS[0]}) by \`${svn_author}\`." +else + pr_title="Backport SVN $(printf 'r%s ' "${REVS[@]}" | sed 's/ $//')" + pr_body="" + for REV in "${REVS[@]}"; do + pr_body="${pr_body}- [SVN r${REV}](https://svn.apache.org/viewvc?view=revision&revision=${REV}) +" + done +fi + +if ! gh pr create \ + --repo "$UPSTREAM_REPO" \ + --head "${FORK_REMOTE}:${BRANCH}" \ + --base master \ + --title "$pr_title" \ + --body "$pr_body"; then + echo "gh pr create failed. Create the PR manually:" >&2 + echo " https://github.com/${UPSTREAM_REPO}/compare/master...${FORK_REMOTE}:${BRANCH}?expand=1" >&2 + exit 1 +fi + +echo "Done."