Files
root/build-tools/merge-topic
Scott Little c80bcae82d merge-topic.py: better error handling
Signed-off-by: Scott Little <scott.little@windriver.com>
Change-Id: I42d06386d6514b732340f33d5d9ec9c4e516dd61
2025-06-11 14:33:45 -04:00
..
2025-05-16 11:01:20 -04:00

gerrit-topic-picker

Features for repositories managed by repo tool

  • Can filter status

    merge-topic.py --status/-s open --status/-s merged .. --status/-s whatever
    
  • Can avoid re-downloading a review if a commit with the Change-Id is present

    merge-topic.py --avoid-re-download/-ard
    
  • Specify one or more topics

    merge-topic.py --topic target-topic-1 --topic target-topic-2
    merge-topic.py -t target-topic
    
  • gerrit URL is automatically discovered from the .gitreview file for each repo

  • Specify download strategy

    merge-topic.py --download-strategy/-ds "Cherry Pick"
    merge-topic.py --download-strategy/-ds "Pull"
    
  • Specify script to be run in case of merge conflict. A simple fixer is supplied by "pick_both_merge_fixer.py".
    Otherwise provide your own.

    merge-topic.py --merge-fixer pick_both_merge_fixer.py
    merge-topic.py --merge-fixer my_script.sh
    merge-topic.py --merge-fixer my_script.py
    merge-topic.py --merge-fixer my_script.runnable
    

Usage for repositories managed by repo tool:

Set the MY_REPO_ROOT_DIR environment variable to the repo root directory (the one which contains the .repo dir)

MY_REPO_ROOT_DIR=/path/to/repo/ python3 merge-topic.py repo --help

Example usage in real life:

MY_REPO_ROOT_DIR=/here \
    python3 merge-topic.py repo \
    --topic my-topic \
    --download-strategy "Cherry Pick" \
    --status open \
    --avoid-re-download
# OR short
MY_REPO_ROOT_DIR=/here \
    python3 merge-topic.py repo \
    -t my-topic \
    -ds "Cherry Pick" \
    -s open \
    -ard


# fails a cherry-pick: CalledProcessError(1, ' git cherry-pick FETCH_HEAD')

# resolve the cherry-pick merge errors
# then invoke the tool againg with the same parameters
# repeat the process until all commits are synced

Example usage for specifying a script that could automatically fix merge conflicts:

MY_REPO_ROOT_DIR=/here \
    python3 merge-topic.py repo \
    --topic my-topic \
    --download-strategy "Cherry Pick" \
    --status open \
    --avoid-re-download \
    --merge-fixer dummy_merge_fixer.py

Example real life usage with merge fixer that picks changes from both sources:

MY_REPO_ROOT_DIR=/here \
    python3 merge-topic.py repo \
    --topic my-topic \
    --download-strategy "Cherry Pick" \
    --status open \
    --avoid-re-download \
    --merge-fixer pick_both_merge_fixer.py

Example usage for syncing open and merged reviews:

MY_REPO_ROOT_DIR=/here \
    python3 merge-topic.py repo \
    --topic my-topic \
    --download-strategy "Cherry Pick" \
    --status open \
    --status merged \
    --avoid-re-download

Future Work

  • Pick relation chain
  • Improve merge fixer logging
  • Fully automate merge fixer