1#!/usr/bin/env bash 2 3# This script can be installed in .git/config to allow rebasing old patches across 4# libc++'s clang-format of the whole tree. Most contributors should not require that 5# since they don't have many pre-clang-format patches lying around. This script is to 6# make it easier for contributors that do have such patches. 7# 8# The script is installed by running the following from the root of your repository: 9# 10# $ git config merge.libcxx-reformat.name "Run clang-format when rebasing libc++ patches" 11# $ git config merge.libcxx-reformat.driver "libcxx/utils/clang-format-merge-driver.sh %O %A %B %P" 12# 13# This is based on https://github.com/nico/hack/blob/main/notes/auto_git_rebase_across_mechanical_changes.md. 14# Many thanks to Nico Weber for paving the way here. 15 16# Path to the file's contents at the ancestor's version. 17base="$1" 18 19# Path to the file's contents at the current version. 20current="$2" 21 22# Path to the file's contents at the other branch's version (for nonlinear histories, there might be multiple other branches). 23other="$3" 24 25# The path of the file in the repository. 26path="$4" 27 28clang-format --style=file --assume-filename="$path" < "$base" > "$base.tmp" 29mv "$base.tmp" "$base" 30 31clang-format --style=file --assume-filename="$path" < "$current" > "$current.tmp" 32mv "$current.tmp" "$current" 33 34clang-format --style=file --assume-filename="$path" < "$other" > "$other.tmp" 35mv "$other.tmp" "$other" 36 37git merge-file -Lcurrent -Lbase -Lother "$current" "$base" "$other" 38