Fix format-diff.sh detecting changes vs. upstream (#5831)

Summary:
format-diff.sh, a.k.a. 'make format', would use 'master'
to decide which commits are probably unpublished. Much better to use
facebook remote master since local master may not be caught up and may
have its own unpublished commits. Script now tries to compare against
facebook remote master branch (branch pointer is updated with any fetch
or pull), because those differences are what would be considered the
differences for a pull request.

Also, script would compare against *parent* of merge-base with that
reference point, which is just wrong since that includes the last
published commit.

In case of problems, you can now customize the reference point, by
setting the FORMAT_UPSTREAM variable.
Pull Request resolved: https://github.com/facebook/rocksdb/pull/5831

Test Plan: manual

Differential Revision: D17528462

Pulled By: pdillinger

fbshipit-source-id: 50fdb8795d683bf3c14d449669c1a5299e0dfa8b
This commit is contained in:
Peter Dillinger 2019-09-23 09:05:18 -07:00 committed by Facebook Github Bot
parent e8263dbdaa
commit 42f898bf83

View File

@ -54,15 +54,25 @@ fi
set -e set -e
uncommitted_code=`git diff HEAD` uncommitted_code=`git diff HEAD`
LAST_MASTER=`git merge-base master HEAD`
# If there's no uncommitted changes, we assume user are doing post-commit # If there's no uncommitted changes, we assume user are doing post-commit
# format check, in which case we'll check the modified lines since last commit # format check, in which case we'll try to check the modified lines vs. the
# from master. Otherwise, we'll check format of the uncommitted code only. # facebook/rocksdb.git master branch. Otherwise, we'll check format of the
# uncommitted code only.
if [ -z "$uncommitted_code" ] if [ -z "$uncommitted_code" ]
then then
# Check the format of last commit # Attempt to get name of facebook/rocksdb.git remote.
diffs=$(git diff -U0 $LAST_MASTER^ | $CLANG_FORMAT_DIFF -p 1) [ "$FORMAT_REMOTE" ] || FORMAT_REMOTE="$(git remote -v | grep 'facebook/rocksdb.git' | head -n 1 | cut -f 1)"
# Fall back on 'origin' if that fails
[ "$FORMAT_REMOTE" ] || FORMAT_REMOTE=origin
# Use master branch from that remote
[ "$FORMAT_UPSTREAM" ] || FORMAT_UPSTREAM="$FORMAT_REMOTE/master"
# Get the common ancestor with that remote branch. Everything after that
# common ancestor would be considered the contents of a pull request, so
# should be relevant for formatting fixes.
FORMAT_UPSTREAM_MERGE_BASE="$(git merge-base "$FORMAT_UPSTREAM" HEAD)"
# Get the differences
diffs=$(git diff -U0 "$FORMAT_UPSTREAM_MERGE_BASE" | $CLANG_FORMAT_DIFF -p 1)
else else
# Check the format of uncommitted lines, # Check the format of uncommitted lines,
diffs=$(git diff -U0 HEAD | $CLANG_FORMAT_DIFF -p 1) diffs=$(git diff -U0 HEAD | $CLANG_FORMAT_DIFF -p 1)
@ -76,12 +86,12 @@ fi
# Highlight the insertion/deletion from the clang-format-diff.py's output # Highlight the insertion/deletion from the clang-format-diff.py's output
COLOR_END="\033[0m" COLOR_END="\033[0m"
COLOR_RED="\033[0;31m" COLOR_RED="\033[0;31m"
COLOR_GREEN="\033[0;32m" COLOR_GREEN="\033[0;32m"
echo -e "Detect lines that doesn't follow the format rules:\r" echo -e "Detect lines that doesn't follow the format rules:\r"
# Add the color to the diff. lines added will be green; lines removed will be red. # Add the color to the diff. lines added will be green; lines removed will be red.
echo "$diffs" | echo "$diffs" |
sed -e "s/\(^-.*$\)/`echo -e \"$COLOR_RED\1$COLOR_END\"`/" | sed -e "s/\(^-.*$\)/`echo -e \"$COLOR_RED\1$COLOR_END\"`/" |
sed -e "s/\(^+.*$\)/`echo -e \"$COLOR_GREEN\1$COLOR_END\"`/" sed -e "s/\(^+.*$\)/`echo -e \"$COLOR_GREEN\1$COLOR_END\"`/"
@ -104,7 +114,7 @@ fi
# Do in-place format adjustment. # Do in-place format adjustment.
if [ -z "$uncommitted_code" ] if [ -z "$uncommitted_code" ]
then then
git diff -U0 $LAST_MASTER^ | $CLANG_FORMAT_DIFF -i -p 1 git diff -U0 "$FORMAT_UPSTREAM_MERGE_BASE" | $CLANG_FORMAT_DIFF -i -p 1
else else
git diff -U0 HEAD^ | $CLANG_FORMAT_DIFF -i -p 1 git diff -U0 HEAD^ | $CLANG_FORMAT_DIFF -i -p 1
fi fi