From 6acbbbf9fc4b675a7bf15e52fe1039b1fd8ed98c Mon Sep 17 00:00:00 2001 From: Yanqin Jin Date: Thu, 30 Apr 2020 19:20:55 -0700 Subject: [PATCH] Add Github Action for some basic sanity test of PR (#6761) Summary: Add Github Action to perform some basic sanity check for PR, inclding the following. 1) Buck TARGETS file. On the one hand, The TARGETS file is used for internal buck, and we do not manually update it. On the other hand, we need to run the buckifier scripts to update TARGETS whenever new files are added, etc. With this Github Action, we make sure that every PR does not forget this step. The GH Action uses a Makefile target called check-buck-targets. Users can manually run `make check-buck-targets` on local machine. 2) Code format We use clang-format-diff.py to format our code. The GH Action in this PR makes sure this step is not skipped. The checking script build_tools/format-diff.sh assumes that `clang-format-diff.py` is executable. On host running GH Action, it is difficult to download `clang-format-diff.py` and make it executable. Therefore, we modified build_tools/format-diff.sh to handle the case in which there is a non-executable clang-format-diff.py file in the top-level rocksdb repo directory. Test Plan (Github and devserver): Watch for Github Action result in the `Checks` tab. On dev server ``` make check-format make check-buck-targets make check ``` Pull Request resolved: https://github.com/facebook/rocksdb/pull/6761 Test Plan: Watch for Github Action result in the `Checks` tab. Reviewed By: pdillinger Differential Revision: D21260209 Pulled By: riversand963 fbshipit-source-id: c646e2f37c6faf9f0614b68aa0efc818cff96787 --- .github/workflows/sanity_check.yml | 41 ++++++++++++++++++++ Makefile | 8 ++++ buckifier/check_buck_targets.sh | 31 +++++++++++++++ build_tools/format-diff.sh | 62 ++++++++++++++++++++++++------ 4 files changed, 130 insertions(+), 12 deletions(-) create mode 100644 .github/workflows/sanity_check.yml create mode 100755 buckifier/check_buck_targets.sh diff --git a/.github/workflows/sanity_check.yml b/.github/workflows/sanity_check.yml new file mode 100644 index 000000000..92b25bb7b --- /dev/null +++ b/.github/workflows/sanity_check.yml @@ -0,0 +1,41 @@ +name: Check buck targets and code format +on: [push, pull_request] +jobs: + check: + name: Check TARGETS file and code format + runs-on: ubuntu-latest + steps: + - name: Checkout feature branch + uses: actions/checkout@v2 + with: + fetch-depth: 0 + + - name: Fetch from upstream + run: | + git remote add upstream https://github.com/facebook/rocksdb.git && git fetch upstream + + - name: Where am I + run: | + echo git status && git status + echo "git remote -v" && git remote -v + echo git branch && git branch + + - name: Setup Python + uses: actions/setup-python@v1 + + - name: Install Dependencies + run: python -m pip install --upgrade pip + + - name: Install argparse + run: pip install argparse + + - name: Download clang-format-diff.py + uses: wei/wget@v1 + with: + args: https://raw.githubusercontent.com/llvm-mirror/clang/master/tools/clang-format/clang-format-diff.py + + - name: Check format + run: make check-format + + - name: Compare buckify output + run: make check-buck-targets diff --git a/Makefile b/Makefile index 38a5e5db6..abe07c71d 100644 --- a/Makefile +++ b/Makefile @@ -976,6 +976,8 @@ ifeq ($(filter -DROCKSDB_LITE,$(OPT)),) sh tools/rocksdb_dump_test.sh endif endif + $(MAKE) check-format + $(MAKE) check-buck-targets # TODO add ldb_tests check_some: $(SUBSET) @@ -1196,6 +1198,12 @@ tags0: format: build_tools/format-diff.sh +check-format: + build_tools/format-diff.sh -c + +check-buck-targets: + buckifier/check_buck_targets.sh + package: bash build_tools/make_package.sh $(SHARED_MAJOR).$(SHARED_MINOR) diff --git a/buckifier/check_buck_targets.sh b/buckifier/check_buck_targets.sh new file mode 100755 index 000000000..ff97e9571 --- /dev/null +++ b/buckifier/check_buck_targets.sh @@ -0,0 +1,31 @@ +#!/usr/bin/env bash +# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved. +# If clang_format_diff.py command is not specfied, we assume we are able to +# access directly without any path. + +TGT_DIFF=`git diff TARGETS | head -n 1` + +if [ ! -z "$TGT_DIFF" ] +then + echo "TARGETS file has uncommitted changes. Skip this check." + exit 0 +fi + +echo Backup original TARGETS file. + +cp TARGETS TARGETS.bkp + +python buckifier/buckify_rocksdb.py + +TGT_DIFF=`git diff TARGETS | head -n 1` + +if [ -z "$TGT_DIFF" ] +then + mv TARGETS.bkp TARGETS + exit 0 +else + echo "Please run 'python buckifier/buckify_rocksdb.py' to update TARGETS file." + echo "Do not manually update TARGETS file." + mv TARGETS.bkp TARGETS + exit 1 +fi diff --git a/build_tools/format-diff.sh b/build_tools/format-diff.sh index aa04093b0..6e3cbbd47 100755 --- a/build_tools/format-diff.sh +++ b/build_tools/format-diff.sh @@ -2,6 +2,30 @@ # Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved. # If clang_format_diff.py command is not specfied, we assume we are able to # access directly without any path. + +print_usage () { + echo "Usage:" + echo "format-diff.sh [OPTIONS]" + echo "-c: check only." + echo "-h: print this message." +} + +while getopts ':ch' OPTION; do + case "$OPTION" in + c) + CHECK_ONLY=1 + ;; + h) + print_usage + exit 1 + ;; + ?) + print_usage + exit 1 + ;; + esac +done + if [ -z $CLANG_FORMAT_DIFF ] then CLANG_FORMAT_DIFF="clang-format-diff.py" @@ -10,18 +34,28 @@ fi # Check clang-format-diff.py if ! which $CLANG_FORMAT_DIFF &> /dev/null then - echo "You didn't have clang-format-diff.py and/or clang-format available in your computer!" - echo "You can download clang-format-diff.py by running: " - echo " curl --location http://goo.gl/iUW1u2 -o ${CLANG_FORMAT_DIFF}" - echo "You can download clang-format by running:" - echo " brew install clang-format" - echo " Or" - echo " apt install clang-format" - echo " This might work too:" - echo " yum install git-clang-format" - echo "Then, move both files (i.e. ${CLANG_FORMAT_DIFF} and clang-format) to some directory within PATH=${PATH}" - echo "and make sure ${CLANG_FORMAT_DIFF} is executable." - exit 128 + if [ ! -f ./clang-format-diff.py ] + then + echo "You didn't have clang-format-diff.py and/or clang-format available in your computer!" + echo "You can download clang-format-diff.py by running: " + echo " curl --location http://goo.gl/iUW1u2 -o ${CLANG_FORMAT_DIFF}" + echo "You can download clang-format by running:" + echo " brew install clang-format" + echo " Or" + echo " apt install clang-format" + echo " This might work too:" + echo " yum install git-clang-format" + echo "Then, move both files (i.e. ${CLANG_FORMAT_DIFF} and clang-format) to some directory within PATH=${PATH}" + echo "and make sure ${CLANG_FORMAT_DIFF} is executable." + exit 128 + else + if [ -x ./clang-format-diff.py ] + then + PATH=$PATH:. + else + CLANG_FORMAT_DIFF="python ./clang-format-diff.py" + fi + fi fi # Check argparse, a library that clang-format-diff.py requires. @@ -87,6 +121,10 @@ if [ -z "$diffs" ] then echo "Nothing needs to be reformatted!" exit 0 +elif [ $CHECK_ONLY ] +then + echo "Your change has unformatted code. Please run make format!" + exit 1 fi # Highlight the insertion/deletion from the clang-format-diff.py's output