Merge BlockstreamResearch/secp256k1-zkp#341: sync-upstream: Overhaul

656c7cc704 sync-upstream: Clarify that we merge a *single* upstream ref (Tim Ruffing)
349a94b169 sync-upstream: Remove "select" mode and simplify (Tim Ruffing)

Pull request description:

  Please see individual commit messages for details.

  ---

  Here's an example session that shows why `select` doesn't make sense:

  ```
  ### Let's find some PRs to sync (master is at 5a67b63)

  ❯ ./contrib/sync-upstream.sh -b master range
  Merging b9cb1cbf 1aafe151 . Continue with y
  n

  ### Let's look at them in the order they have been merged

  ❯ git show b9cb1cbf
  commit b9cb1cbfd7
  Merge: c0a2aba0 921b9711
  Author: merge-script <me@real-or-random.org>
  Date:   Tue Mar 3 15:31:46 2026 +0100

      Merge bitcoin-core/secp256k1#1824: util: introduce and use `ARRAY_SIZE` macro

  [...]

  ❯ git --no-pager show 1aafe151

  commit 1aafe15139 (upstream/master, upstream/HEAD)
  Merge: b9cb1cbf 4d92a083
  Author: merge-script <me@real-or-random.org>
  Date:   Wed Mar 4 08:43:07 2026 +0100

      Merge bitcoin-core/secp256k1#1777: Make SHA256 compression runtime pluggable

  [...]

  ### Let's assume I want to cherry-pick 1aafe151 but not sync b9cb1bcf

  ❯ ./contrib/sync-upstream.sh -b master select 1aafe151
  -----------------------------------
  Upstream PRs 1777
  -----------------------------------

  [bitcoin-core/secp256k1#1777]: Make SHA256 compression runtime pluggable

  This PR can be recreated with `./contrib/sync-upstream.sh -b master select 1aafe151`.

  [...]

  ### Let's check if it's really only PR #1777

  ❯ git diff | grep ARRAY_SIZE
  + #define ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0]))

  ### Ah damn, we also got the other PR #1824...
  ```

ACKs for top commit:
  mllwchrry:
    ACK 656c7cc
  jonasnick:
    ACK 656c7cc704

Tree-SHA512: 27cdfe7c6decce840ef4f2d12fa0a5fd829b35ac24403272c4b34c0a3b0da2303cee36bcb419d0608c6b1297fd5bf8a6cd6d41672850ac092814c140638f9d83
This commit is contained in:
merge-script
2026-03-05 21:28:45 +01:00

View File

@@ -6,14 +6,11 @@ help() {
echo "Sync merge commits from bitcoin-core/secp256k1 into secp256k1-zkp."
echo
echo "Usage:"
echo " $0 [-b <branch>] range [end]"
echo " $0 [-b <branch>] [end]"
echo " Merges every merge commit present in upstream/master and missing in <branch>"
echo " (default: master). If the optional [end] commit is provided, only merges"
echo " up to and including [end]."
echo
echo " $0 [-b <branch>] select <commit> ... <commit>"
echo " Merges every selected merge commit into <branch> (default: master)."
echo
echo "This tool creates a temporary branch and attempts to merge the upstream commits."
echo "If there are merge conflicts, resolve them and run tests, then use the generated"
echo "script contrib/gh-pr-create.sh to create the PR (requires the gh tool)."
@@ -25,8 +22,8 @@ help() {
echo
echo "Listing upstream merge commits:"
echo " To list merge commits in upstream/master that are missing from <branch> (oldest first):"
echo " git log --oneline --merges \$(git merge-base upstream/master <branch>)..upstream/master | tac"
echo " Use these for [end] in 'range' or as arguments to 'select'."
echo " git log --oneline --topo-order --reverse --merges \$(git merge-base upstream/master <branch>)..upstream/master"
echo " These are candidates for [end]."
exit 1
}
@@ -56,25 +53,21 @@ range() {
if [ "$#" = 1 ]; then
RANGEEND_COMMIT=$1
fi
COMMITS=$(git --no-pager log --oneline --merges "$RANGESTART_COMMIT".."$RANGEEND_COMMIT")
COMMITS=$(echo "$COMMITS" | tac | awk '{ print $1 }' ORS=' ')
echo "Merging $COMMITS. Continue with y"
read -r yn
case $yn in
[Yy]* ) ;;
* ) exit 1;;
esac
COMMITS=$(git --no-pager log --pretty=format:%H --topo-order --reverse --merges "$RANGESTART_COMMIT".."$RANGEEND_COMMIT")
}
# Process -b <branch> argument
while getopts "b:" opt; do
# Process -b <branch> and -h arguments
while getopts "b:h" opt; do
case $opt in
b)
LOCAL_BRANCH=$OPTARG
;;
\?)
echo "Invalid option: -$OPTARG" >&2
h)
help
;;
*)
echo
help
;;
esac
done
@@ -82,37 +75,18 @@ done
# Shift off the processed options
shift $((OPTIND -1))
if [ "$#" -lt 1 ]; then
help
fi
case $1 in
range)
shift
setup
range "$@"
REPRODUCE_COMMAND="$0 -b $LOCAL_BRANCH range $RANGEEND_COMMIT"
;;
select)
shift
setup
COMMITS=$*
REPRODUCE_COMMAND="$0 -b $LOCAL_BRANCH select $@"
;;
help)
help
;;
*)
help
esac
setup
range "$@"
TITLE="Upstream PRs"
REPRODUCE_COMMAND="$0 -b $LOCAL_BRANCH $RANGEEND_COMMIT"
BODY=""
for COMMIT in $COMMITS
do
PRNUM=$(git log -1 "$COMMIT" --pretty=format:%s | sed s/'Merge \(bitcoin-core\/secp256k1\)\?#\([0-9]*\).*'/'\2'/)
TITLE="$TITLE $PRNUM,"
BODY=$(printf "%s\n%s" "$BODY" "$(git log -1 "$COMMIT" --pretty=format:%s | sed s/'Merge \(bitcoin-core\/secp256k1\)\?#\([0-9]*\)'/'[bitcoin-core\/secp256k1#\2]'/)")
LAST_COMMIT="$COMMIT"
done
# Remove trailing ","
TITLE=${TITLE%?}
@@ -128,6 +102,13 @@ Tips:
EOF
)
echo "Merging $TITLE. Continue with y"
read -r yn
case $yn in
[Yy]* ) ;;
* ) exit 1;;
esac
echo "-----------------------------------"
echo "$TITLE"
echo "-----------------------------------"
@@ -159,4 +140,4 @@ EOT
chmod +x "$FNAME"
echo Run "$FNAME" after solving the merge conflicts
git merge --no-edit -m "Merge commits '$COMMITS' into temp-merge-$PRNUM" $COMMITS
git merge --no-edit -m "Merge upstream '${LAST_COMMIT:0:7}' into temp-merge-$PRNUM" "$LAST_COMMIT"