Skip to content

Commit 9eea744

Browse files
authored
[libc++] Add a merge driver that can apply clang-format (#73712)
In preparation for the moment when we'll clang-format the whole code base, this patch adds a script that can be used to rebase patches across clang-format changes mechanically, without requiring manual intervention. See https://discourse.llvm.org/t/rfc-clang-formatting-all-of-libc-once-and-for-all.
1 parent b18a46e commit 9eea744

File tree

1 file changed

+37
-0
lines changed

1 file changed

+37
-0
lines changed
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
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.
17+
base="$1"
18+
19+
# Path to the file's contents at the current version.
20+
current="$2"
21+
22+
# Path to the file's contents at the other branch's version (for nonlinear histories, there might be multiple other branches).
23+
other="$3"
24+
25+
# The path of the file in the repository.
26+
path="$4"
27+
28+
clang-format --style=file --assume-filename="$path" < "$base" > "$base.tmp"
29+
mv "$base.tmp" "$base"
30+
31+
clang-format --style=file --assume-filename="$path" < "$current" > "$current.tmp"
32+
mv "$current.tmp" "$current"
33+
34+
clang-format --style=file --assume-filename="$path" < "$other" > "$other.tmp"
35+
mv "$other.tmp" "$other"
36+
37+
git merge-file -Lcurrent -Lbase -Lother "$current" "$base" "$other"

0 commit comments

Comments
 (0)