* [PATCH 0/8] clang-format: add more rules and enable on CI
@ 2024-07-08 9:23 Karthik Nayak
2024-07-08 9:23 ` [PATCH 1/8] clang-format: indent preprocessor directives after hash Karthik Nayak
` (9 more replies)
0 siblings, 10 replies; 127+ messages in thread
From: Karthik Nayak @ 2024-07-08 9:23 UTC (permalink / raw)
To: karthik.188; +Cc: git, jltobler, chriscool
The series was mostly inspired by a patch sent recently to 'include
kh_foreach* macros in ForEachMacros' [1]. I was wondering why we don't
run the formatting on CI and reduce some of the workload of reviewers.
We have a '.clang-format' file to provide rules for code formatting.
The commits 1-6 aims to add more rules to the file while deprecating old
ones.
Commit 7 enables CI action on GitHub and GitLab to also check for the
code formatting. Currently, it is allowed to fail. This way we can build
confidence and fine tune the values as needed and finally enforce the
check in a future patch. I'm not well versed with GitHub workflows, and
I mostly tried to copy existing work there. Expecting some feedback in
that section!
Commit 8 fixes an existing issue with the 'check-whitespace' job, which
is failing as success in the GitLab CI.
1: https://lore.kernel.org/git/4e7893f5-2dd9-46cf-8a64-cf780f4e1730@web.de/
Karthik Nayak (8):
clang-format: indent preprocessor directives after hash
clang-format: avoid spacing around bitfield colon
clang-format: ensure files end with newlines
clang-format: replace deprecated option with 'SpacesInParens'
clang-format: avoid braces on simple single-statement bodies
clang-format: formalize some of the spacing rules
ci: run style check on GitHub and GitLab
check-whitespace: detect if no base_commit is provided
.clang-format | 41 +++++++++++++++++++++++++++----
.github/workflows/check-style.yml | 29 ++++++++++++++++++++++
.gitlab-ci.yml | 14 ++++++++++-
ci/check-whitespace.sh | 13 +++++++---
ci/install-dependencies.sh | 2 +-
ci/run-style-check.sh | 8 ++++++
6 files changed, 97 insertions(+), 10 deletions(-)
create mode 100644 .github/workflows/check-style.yml
create mode 100755 ci/run-style-check.sh
--
2.45.1
^ permalink raw reply [flat|nested] 127+ messages in thread
* [PATCH 1/8] clang-format: indent preprocessor directives after hash
2024-07-08 9:23 [PATCH 0/8] clang-format: add more rules and enable on CI Karthik Nayak
@ 2024-07-08 9:23 ` Karthik Nayak
2024-07-08 10:08 ` Chris Torek
` (2 more replies)
2024-07-08 9:23 ` [PATCH 2/8] clang-format: avoid spacing around bitfield colon Karthik Nayak
` (8 subsequent siblings)
9 siblings, 3 replies; 127+ messages in thread
From: Karthik Nayak @ 2024-07-08 9:23 UTC (permalink / raw)
To: karthik.188; +Cc: git, jltobler, chriscool
We do not have a rule around the indentation of preprocessor directives.
This was also discussed on the list [1], noting how there is often
inconsistency in the styling. While there was discussion, there was no
conclusion around what is the preferred style here. One style being
indenting after the hash:
#if FOO
# if BAR
# include <foo>
# endif
#endif
The other being before the hash:
#if FOO
#if BAR
#include <foo>
#endif
#endif
Let's pick the former and add 'IndentPPDirectives: AfterHash' value to
our '.clang-format'. There is no clear reason to pick one over the
other, but it would definitely be nicer to be consistent.
[1]: https://lore.kernel.org/r/xmqqwmmm1bw6.fsf@gitster.g
Signed-off-by: Karthik Nayak <karthik.188@gmail.com>
---
.clang-format | 6 ++++++
1 file changed, 6 insertions(+)
diff --git a/.clang-format b/.clang-format
index 3ed4fac753..5e128519bf 100644
--- a/.clang-format
+++ b/.clang-format
@@ -96,6 +96,12 @@ BreakStringLiterals: false
# Switch statement body is always indented one level more than case labels.
IndentCaseLabels: false
+# Indents directives before the hash.
+# #if FOO
+# # include <foo>
+# #endif
+IndentPPDirectives: AfterHash
+
# Don't indent a function definition or declaration if it is wrapped after the
# type
IndentWrappedFunctionNames: false
--
2.45.1
^ permalink raw reply related [flat|nested] 127+ messages in thread
* [PATCH 2/8] clang-format: avoid spacing around bitfield colon
2024-07-08 9:23 [PATCH 0/8] clang-format: add more rules and enable on CI Karthik Nayak
2024-07-08 9:23 ` [PATCH 1/8] clang-format: indent preprocessor directives after hash Karthik Nayak
@ 2024-07-08 9:23 ` Karthik Nayak
2024-07-08 9:23 ` [PATCH 3/8] clang-format: ensure files end with newlines Karthik Nayak
` (7 subsequent siblings)
9 siblings, 0 replies; 127+ messages in thread
From: Karthik Nayak @ 2024-07-08 9:23 UTC (permalink / raw)
To: karthik.188; +Cc: git, jltobler, chriscool
The spacing around colons is currently not standardized and as such we
have the following practices in our code base:
- Spacing around the colon `int bf : 1`: 146 instances
- No spacing around the colon `int bf:1`: 148 instances
- Spacing before the colon `int bf :1`: 6 instances
- Spacing after the colon `int bf: 1`: 12 instances
Let's formalize this by picking the most followed pattern and add the
corresponding style to '.clang-format'.
Signed-off-by: Karthik Nayak <karthik.188@gmail.com>
---
.clang-format | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/.clang-format b/.clang-format
index 5e128519bf..803b274dd5 100644
--- a/.clang-format
+++ b/.clang-format
@@ -72,6 +72,10 @@ AlwaysBreakAfterReturnType: None
BinPackArguments: true
BinPackParameters: true
+# Add no space around the bit field
+# unsigned bf:2;
+BitFieldColonSpacing: None
+
# Attach braces to surrounding context except break before braces on function
# definitions.
# void foo()
--
2.45.1
^ permalink raw reply related [flat|nested] 127+ messages in thread
* [PATCH 3/8] clang-format: ensure files end with newlines
2024-07-08 9:23 [PATCH 0/8] clang-format: add more rules and enable on CI Karthik Nayak
2024-07-08 9:23 ` [PATCH 1/8] clang-format: indent preprocessor directives after hash Karthik Nayak
2024-07-08 9:23 ` [PATCH 2/8] clang-format: avoid spacing around bitfield colon Karthik Nayak
@ 2024-07-08 9:23 ` Karthik Nayak
2024-07-08 16:32 ` Junio C Hamano
2024-07-08 9:23 ` [PATCH 4/8] clang-format: replace deprecated option with 'SpacesInParens' Karthik Nayak
` (6 subsequent siblings)
9 siblings, 1 reply; 127+ messages in thread
From: Karthik Nayak @ 2024-07-08 9:23 UTC (permalink / raw)
To: karthik.188; +Cc: git, jltobler, chriscool
All our source files end with a newline, let's formalize in
'.clang-format'.
Signed-off-by: Karthik Nayak <karthik.188@gmail.com>
---
.clang-format | 3 +++
1 file changed, 3 insertions(+)
diff --git a/.clang-format b/.clang-format
index 803b274dd5..4c9751a9db 100644
--- a/.clang-format
+++ b/.clang-format
@@ -106,6 +106,9 @@ IndentCaseLabels: false
# #endif
IndentPPDirectives: AfterHash
+# Insert a newline at end of file if missing
+InsertNewlineAtEOF: true
+
# Don't indent a function definition or declaration if it is wrapped after the
# type
IndentWrappedFunctionNames: false
--
2.45.1
^ permalink raw reply related [flat|nested] 127+ messages in thread
* [PATCH 4/8] clang-format: replace deprecated option with 'SpacesInParens'
2024-07-08 9:23 [PATCH 0/8] clang-format: add more rules and enable on CI Karthik Nayak
` (2 preceding siblings ...)
2024-07-08 9:23 ` [PATCH 3/8] clang-format: ensure files end with newlines Karthik Nayak
@ 2024-07-08 9:23 ` Karthik Nayak
2024-07-08 16:32 ` Junio C Hamano
2024-07-08 9:23 ` [PATCH 5/8] clang-format: avoid braces on simple single-statement bodies Karthik Nayak
` (5 subsequent siblings)
9 siblings, 1 reply; 127+ messages in thread
From: Karthik Nayak @ 2024-07-08 9:23 UTC (permalink / raw)
To: karthik.188; +Cc: git, jltobler, chriscool
Replace the deprecated options 'SpacesInParentheses' and
'SpaceInEmptyParentheses' with the newer 'SpacesInParens' option. The
usage is the same.
Signed-off-by: Karthik Nayak <karthik.188@gmail.com>
---
.clang-format | 9 ++++-----
1 file changed, 4 insertions(+), 5 deletions(-)
diff --git a/.clang-format b/.clang-format
index 4c9751a9db..914254a29b 100644
--- a/.clang-format
+++ b/.clang-format
@@ -134,8 +134,6 @@ SpaceBeforeAssignmentOperators: true
# }
SpaceBeforeParens: ControlStatements
-# Don't insert spaces inside empty '()'
-SpaceInEmptyParentheses: false
# The number of spaces before trailing line comments (// - comments).
# This does not affect trailing block comments (/* - comments).
@@ -149,9 +147,10 @@ SpacesInCStyleCastParentheses: false
# var arr = [1, 2, 3]; not var arr = [ 1, 2, 3 ];
SpacesInContainerLiterals: false
-# Don't insert spaces after '(' or before ')'
-# f(arg); not f( arg );
-SpacesInParentheses: false
+SpacesInParens: Custom
+SpacesInParensOptions:
+ # Don't insert spaces inside empty '()'
+ InEmptyParentheses: false
# Don't insert spaces after '[' or before ']'
# int a[5]; not int a[ 5 ];
--
2.45.1
^ permalink raw reply related [flat|nested] 127+ messages in thread
* [PATCH 5/8] clang-format: avoid braces on simple single-statement bodies
2024-07-08 9:23 [PATCH 0/8] clang-format: add more rules and enable on CI Karthik Nayak
` (3 preceding siblings ...)
2024-07-08 9:23 ` [PATCH 4/8] clang-format: replace deprecated option with 'SpacesInParens' Karthik Nayak
@ 2024-07-08 9:23 ` Karthik Nayak
2024-07-08 16:48 ` Junio C Hamano
2024-07-08 9:23 ` [PATCH 6/8] clang-format: formalize some of the spacing rules Karthik Nayak
` (4 subsequent siblings)
9 siblings, 1 reply; 127+ messages in thread
From: Karthik Nayak @ 2024-07-08 9:23 UTC (permalink / raw)
To: karthik.188; +Cc: git, jltobler, chriscool
Set the 'RemoveBracesLLVM' to 'true' which ensures that we avoid curly
braces for single-statement bodies in conditional blocks.
Signed-off-by: Karthik Nayak <karthik.188@gmail.com>
---
.clang-format | 5 +++++
1 file changed, 5 insertions(+)
diff --git a/.clang-format b/.clang-format
index 914254a29b..1a5f0c9046 100644
--- a/.clang-format
+++ b/.clang-format
@@ -117,6 +117,11 @@ IndentWrappedFunctionNames: false
# int *a;
PointerAlignment: Right
+# Remove optional braces of control statements (if, else, for, and while)
+# according to the LLVM coding style
+# This avoids braces on simple single-statement bodies of statements.
+RemoveBracesLLVM: true
+
# Don't insert a space after a cast
# x = (int32)y; not x = (int32) y;
SpaceAfterCStyleCast: false
--
2.45.1
^ permalink raw reply related [flat|nested] 127+ messages in thread
* [PATCH 6/8] clang-format: formalize some of the spacing rules
2024-07-08 9:23 [PATCH 0/8] clang-format: add more rules and enable on CI Karthik Nayak
` (4 preceding siblings ...)
2024-07-08 9:23 ` [PATCH 5/8] clang-format: avoid braces on simple single-statement bodies Karthik Nayak
@ 2024-07-08 9:23 ` Karthik Nayak
2024-07-08 16:54 ` Junio C Hamano
` (2 more replies)
2024-07-08 9:23 ` [PATCH 7/8] ci: run style check on GitHub and GitLab Karthik Nayak
` (3 subsequent siblings)
9 siblings, 3 replies; 127+ messages in thread
From: Karthik Nayak @ 2024-07-08 9:23 UTC (permalink / raw)
To: karthik.188; +Cc: git, jltobler, chriscool
There are some spacing rules that we follow in the project and it makes
sen to formalize them:
* Ensure there is no space inserted after the logical not '!' operator.
* Ensure there is no space before the case statement's color.
* Ensure there is no space before the first bracket '[' of an array.
* Ensure there is no space in empty blocks.
Signed-off-by: Karthik Nayak <karthik.188@gmail.com>
---
.clang-format | 14 ++++++++++++++
1 file changed, 14 insertions(+)
diff --git a/.clang-format b/.clang-format
index 1a5f0c9046..05036f610b 100644
--- a/.clang-format
+++ b/.clang-format
@@ -126,11 +126,18 @@ RemoveBracesLLVM: true
# x = (int32)y; not x = (int32) y;
SpaceAfterCStyleCast: false
+# No space is inserted after the logical not operator
+SpaceAfterLogicalNot: false
+
# Insert spaces before and after assignment operators
# int a = 5; not int a=5;
# a += 42; a+=42;
SpaceBeforeAssignmentOperators: true
+# Spaces will be removed before case colon.
+# case 1: break; not case 1 : break;
+SpaceBeforeCaseColon: false
+
# Put a space before opening parentheses only after control statement keywords.
# void f() {
# if (true) {
@@ -139,6 +146,13 @@ SpaceBeforeAssignmentOperators: true
# }
SpaceBeforeParens: ControlStatements
+# No space before first '[' in arrays
+# int a[5][5]; not int a [5][5];
+SpaceBeforeSquareBrackets: false
+
+# No space will be inserted into {}
+# while (true) {} not while (true) { }
+SpaceInEmptyBlock: false
# The number of spaces before trailing line comments (// - comments).
# This does not affect trailing block comments (/* - comments).
--
2.45.1
^ permalink raw reply related [flat|nested] 127+ messages in thread
* [PATCH 7/8] ci: run style check on GitHub and GitLab
2024-07-08 9:23 [PATCH 0/8] clang-format: add more rules and enable on CI Karthik Nayak
` (5 preceding siblings ...)
2024-07-08 9:23 ` [PATCH 6/8] clang-format: formalize some of the spacing rules Karthik Nayak
@ 2024-07-08 9:23 ` Karthik Nayak
2024-07-08 17:15 ` Junio C Hamano
2024-07-08 18:10 ` Justin Tobler
2024-07-08 9:23 ` [PATCH 8/8] check-whitespace: detect if no base_commit is provided Karthik Nayak
` (2 subsequent siblings)
9 siblings, 2 replies; 127+ messages in thread
From: Karthik Nayak @ 2024-07-08 9:23 UTC (permalink / raw)
To: karthik.188; +Cc: git, jltobler, chriscool
We don't run style checks on our CI, even though we have a
'.clang-format' setup in the repository. Let's add one, the job will
validate only against the new commits added and will only run on merge
requests. Since we're introducing it for the first time, let's allow
this job to fail, so we can validate if this is useful and eventually
enforce it.
Signed-off-by: Karthik Nayak <karthik.188@gmail.com>
---
.github/workflows/check-style.yml | 29 +++++++++++++++++++++++++++++
.gitlab-ci.yml | 12 ++++++++++++
ci/install-dependencies.sh | 2 +-
ci/run-style-check.sh | 8 ++++++++
4 files changed, 50 insertions(+), 1 deletion(-)
create mode 100644 .github/workflows/check-style.yml
create mode 100755 ci/run-style-check.sh
diff --git a/.github/workflows/check-style.yml b/.github/workflows/check-style.yml
new file mode 100644
index 0000000000..27276dfe5e
--- /dev/null
+++ b/.github/workflows/check-style.yml
@@ -0,0 +1,29 @@
+name: check-style
+
+# Get the repository with all commits to ensure that we can analyze
+# all of the commits contributed via the Pull Request.
+
+on:
+ pull_request:
+ types: [opened, synchronize]
+
+# Avoid unnecessary builds. Unlike the main CI jobs, these are not
+# ci-configurable (but could be).
+concurrency:
+ group: ${{ github.workflow }}-${{ github.ref }}
+ cancel-in-progress: true
+
+jobs:
+ check-style:
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/checkout@v4
+ with:
+ fetch-depth: 0
+
+ - name: git clang-format
+ continue-on-error: true
+ id: check_out
+ run: |
+ ./ci/run-style-check.sh \
+ "${{github.event.pull_request.base.sha}}"
diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 37b991e080..65fd261e5e 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -123,6 +123,18 @@ check-whitespace:
rules:
- if: $CI_PIPELINE_SOURCE == 'merge_request_event'
+check-style:
+ image: ubuntu:latest
+ allow_failure: true
+ variables:
+ CC: clang
+ before_script:
+ - ./ci/install-dependencies.sh
+ script:
+ - ./ci/run-style-check.sh "$CI_MERGE_REQUEST_DIFF_BASE_SHA"
+ rules:
+ - if: $CI_PIPELINE_SOURCE == 'merge_request_event'
+
documentation:
image: ubuntu:latest
variables:
diff --git a/ci/install-dependencies.sh b/ci/install-dependencies.sh
index 6ec0f85972..46fe12a690 100755
--- a/ci/install-dependencies.sh
+++ b/ci/install-dependencies.sh
@@ -43,7 +43,7 @@ ubuntu-*)
make libssl-dev libcurl4-openssl-dev libexpat-dev wget sudo default-jre \
tcl tk gettext zlib1g-dev perl-modules liberror-perl libauthen-sasl-perl \
libemail-valid-perl libio-pty-perl libio-socket-ssl-perl libnet-smtp-ssl-perl libdbd-sqlite3-perl libcgi-pm-perl \
- ${CC_PACKAGE:-${CC:-gcc}} $PYTHON_PACKAGE
+ ${CC_PACKAGE:-${CC:-gcc}} $PYTHON_PACKAGE clang-format
mkdir --parents "$CUSTOM_PATH"
wget --quiet --directory-prefix="$CUSTOM_PATH" \
diff --git a/ci/run-style-check.sh b/ci/run-style-check.sh
new file mode 100755
index 0000000000..9d4c4089c1
--- /dev/null
+++ b/ci/run-style-check.sh
@@ -0,0 +1,8 @@
+#!/usr/bin/env sh
+#
+# Perform style check
+#
+
+baseCommit=$1
+
+git clang-format --style file --diff --extensions c,h "$baseCommit"
--
2.45.1
^ permalink raw reply related [flat|nested] 127+ messages in thread
* [PATCH 8/8] check-whitespace: detect if no base_commit is provided
2024-07-08 9:23 [PATCH 0/8] clang-format: add more rules and enable on CI Karthik Nayak
` (6 preceding siblings ...)
2024-07-08 9:23 ` [PATCH 7/8] ci: run style check on GitHub and GitLab Karthik Nayak
@ 2024-07-08 9:23 ` Karthik Nayak
2024-07-08 10:18 ` Chris Torek
` (2 more replies)
2024-07-08 10:06 ` [PATCH 0/8] clang-format: add more rules and enable on CI Chris Torek
2024-07-11 8:30 ` [PATCH v2 " Karthik Nayak
9 siblings, 3 replies; 127+ messages in thread
From: Karthik Nayak @ 2024-07-08 9:23 UTC (permalink / raw)
To: karthik.188; +Cc: git, jltobler, chriscool
The 'check-whitespace' CI script exists gracefully if no base commit is
provided or if an invalid revision is provided. This is not good because
if a particular CI provides an incorrect base_commit, it would fail
successfully.
This is exactly the case with the GitLab CI. The CI is using the
"$CI_MERGE_REQUEST_TARGET_BRANCH_SHA" variable to get the base commit
SHA, but variable is only defined for _merged_ pipelines. So it is empty
for regular pipelines [1]. This should've failed the check-whitespace
job.
Let's fix the variable used in the GitLab CI. Let's also add a check for
incorrect base_commit in the 'check-whitespace.sh' script. While here,
fix a small typo too.
[1]: https://docs.gitlab.com/ee/ci/variables/predefined_variables.html#predefined-variables-for-merge-request-pipelines
Signed-off-by: Karthik Nayak <karthik.188@gmail.com>
---
.gitlab-ci.yml | 2 +-
ci/check-whitespace.sh | 13 ++++++++++---
2 files changed, 11 insertions(+), 4 deletions(-)
diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 65fd261e5e..36199893d8 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -119,7 +119,7 @@ check-whitespace:
before_script:
- ./ci/install-dependencies.sh
script:
- - ./ci/check-whitespace.sh "$CI_MERGE_REQUEST_TARGET_BRANCH_SHA"
+ - ./ci/check-whitespace.sh "$CI_MERGE_REQUEST_DIFF_BASE_SHA"
rules:
- if: $CI_PIPELINE_SOURCE == 'merge_request_event'
diff --git a/ci/check-whitespace.sh b/ci/check-whitespace.sh
index db399097a5..ab023f9519 100755
--- a/ci/check-whitespace.sh
+++ b/ci/check-whitespace.sh
@@ -9,12 +9,19 @@ baseCommit=$1
outputFile=$2
url=$3
-if test "$#" -ne 1 && test "$#" -ne 3
+if { test "$#" -ne 1 && test "$#" -ne 3; } || test -z "$1"
then
echo "USAGE: $0 <BASE_COMMIT> [<OUTPUT_FILE> <URL>]"
exit 1
fi
+gitLogOutput=$(git log --check --pretty=format:"---% h% s" "${baseCommit}"..)
+if test $? -ne 0
+then
+ echo -n $gitLogOutput
+ exit 1
+fi
+
problems=()
commit=
commitText=
@@ -58,7 +65,7 @@ do
echo "${dash} ${sha} ${etc}"
;;
esac
-done <<< "$(git log --check --pretty=format:"---% h% s" "${baseCommit}"..)"
+done <<< "$gitLogOutput"
if test ${#problems[*]} -gt 0
then
@@ -67,7 +74,7 @@ then
goodParent=${baseCommit: 0:7}
fi
- echo "A whitespace issue was found in onen of more of the commits."
+ echo "A whitespace issue was found in one of more of the commits."
echo "Run the following command to resolve whitespace issues:"
echo "git rebase --whitespace=fix ${goodParent}"
--
2.45.1
^ permalink raw reply related [flat|nested] 127+ messages in thread
* Re: [PATCH 0/8] clang-format: add more rules and enable on CI
2024-07-08 9:23 [PATCH 0/8] clang-format: add more rules and enable on CI Karthik Nayak
` (7 preceding siblings ...)
2024-07-08 9:23 ` [PATCH 8/8] check-whitespace: detect if no base_commit is provided Karthik Nayak
@ 2024-07-08 10:06 ` Chris Torek
2024-07-11 8:30 ` [PATCH v2 " Karthik Nayak
9 siblings, 0 replies; 127+ messages in thread
From: Chris Torek @ 2024-07-08 10:06 UTC (permalink / raw)
To: Karthik Nayak; +Cc: git, jltobler, chriscool
On Mon, Jul 8, 2024 at 2:23 AM Karthik Nayak <karthik.188@gmail.com> wrote:
> The series was mostly inspired by a patch sent recently to 'include
> kh_foreach* macros in ForEachMacros' [1]. I was wondering why we don't
> run the formatting on CI and reduce some of the workload of reviewers.
As a big fan of automated formatting, I scanned through all of these.
I did not spot anything problematic and had just a few minor comments.
I'm not an expert on clang-format directives, nor on GitHub/GitLab CI,
though. Anyway if you want it you can have a reviewed-by from me. :-)
(Comments stuck on individual patches)
Chris
^ permalink raw reply [flat|nested] 127+ messages in thread
* Re: [PATCH 1/8] clang-format: indent preprocessor directives after hash
2024-07-08 9:23 ` [PATCH 1/8] clang-format: indent preprocessor directives after hash Karthik Nayak
@ 2024-07-08 10:08 ` Chris Torek
2024-07-08 16:22 ` Junio C Hamano
2024-07-08 16:27 ` Re* " Junio C Hamano
2 siblings, 0 replies; 127+ messages in thread
From: Chris Torek @ 2024-07-08 10:08 UTC (permalink / raw)
To: Karthik Nayak; +Cc: git, jltobler, chriscool
On Mon, Jul 8, 2024 at 2:23 AM Karthik Nayak <karthik.188@gmail.com> wrote:
> Let's pick the former and add 'IndentPPDirectives: AfterHash' value to
> our '.clang-format'. There is no clear reason to pick one over the
> other, but it would definitely be nicer to be consistent.
There is one extremely weak technical reason to pick "# in left column",
which is: some ancient C compilers required it. I don't think any modern
ones do.
Chris
^ permalink raw reply [flat|nested] 127+ messages in thread
* Re: [PATCH 8/8] check-whitespace: detect if no base_commit is provided
2024-07-08 9:23 ` [PATCH 8/8] check-whitespace: detect if no base_commit is provided Karthik Nayak
@ 2024-07-08 10:18 ` Chris Torek
2024-07-08 10:35 ` Georg Pfuetzenreuter
2024-07-08 17:35 ` Junio C Hamano
2024-07-08 17:58 ` Justin Tobler
2 siblings, 1 reply; 127+ messages in thread
From: Chris Torek @ 2024-07-08 10:18 UTC (permalink / raw)
To: Karthik Nayak; +Cc: git, jltobler, chriscool
On Mon, Jul 8, 2024 at 2:24 AM Karthik Nayak <karthik.188@gmail.com> wrote:
> diff --git a/ci/check-whitespace.sh b/ci/check-whitespace.sh
> index db399097a5..ab023f9519 100755
> --- a/ci/check-whitespace.sh
> +++ b/ci/check-whitespace.sh
> @@ -9,12 +9,19 @@ baseCommit=$1
> outputFile=$2
> url=$3
>
> -if test "$#" -ne 1 && test "$#" -ne 3
> +if { test "$#" -ne 1 && test "$#" -ne 3; } || test -z "$1"
> then
The braces `{ ... }` here are unnecessary as `&&`will bind first
(sh and bash give both operators the same precedence but
then use left associativity). Dropping them drops the need for
the semicolon. Of course some might prefer this to be explicit.
The `test` command has AND and OR operators of its own,
which give `-a` (AND) higher precedence than `-o` (OR). In
addition, `$#` can only expand to an integer value, so quotes
are not required, and the whole thing can be written as:
if test $# -ne 1 -a $# -ne 3 -o -z "$1"
(which is what I would do myself, unless I wanted a separate
error message for an empty "$1"). It's fine as is though.
Chris
^ permalink raw reply [flat|nested] 127+ messages in thread
* Re: [PATCH 8/8] check-whitespace: detect if no base_commit is provided
2024-07-08 10:18 ` Chris Torek
@ 2024-07-08 10:35 ` Georg Pfuetzenreuter
2024-07-08 10:42 ` Chris Torek
0 siblings, 1 reply; 127+ messages in thread
From: Georg Pfuetzenreuter @ 2024-07-08 10:35 UTC (permalink / raw)
To: Chris Torek, Karthik Nayak; +Cc: git, jltobler, chriscool
On 7/8/24 12:18 PM, Chris Torek wrote:
> The `test` command has AND and OR operators of its own,
> which give `-a` (AND) higher precedence than `-o` (OR). In
> addition, `$#` can only expand to an integer value, so quotes
> are not required, and the whole thing can be written as:
>
> if test $# -ne 1 -a $# -ne 3 -o -z "$1"
>
> (which is what I would do myself, unless I wanted a separate
> error message for an empty "$1"). It's fine as is though.
Hi,
https://pubs.opengroup.org/onlinepubs/9699919799/utilities/test.html states
"The XSI extensions specifying the -a and -o binary primaries and the
'(' and ')' operators have been marked obsolescent."
suggesting "&&" being preferred over "-a".
> Chris
>
^ permalink raw reply [flat|nested] 127+ messages in thread
* Re: [PATCH 8/8] check-whitespace: detect if no base_commit is provided
2024-07-08 10:35 ` Georg Pfuetzenreuter
@ 2024-07-08 10:42 ` Chris Torek
2024-07-08 17:13 ` Karthik Nayak
2024-07-08 17:19 ` Junio C Hamano
0 siblings, 2 replies; 127+ messages in thread
From: Chris Torek @ 2024-07-08 10:42 UTC (permalink / raw)
To: Georg Pfuetzenreuter; +Cc: Karthik Nayak, git, jltobler, chriscool
On Mon, Jul 8, 2024 at 3:35 AM Georg Pfuetzenreuter <georg@syscid.com> wrote:
> https://pubs.opengroup.org/onlinepubs/9699919799/utilities/test.html states
>
> "The XSI extensions specifying the -a and -o binary primaries and the
> '(' and ')' operators have been marked obsolescent."
>
> suggesting "&&" being preferred over "-a".
That's annoying, I wonder why they did that. It does make
the "test" parser a bit tricky, especially with empty expansions,
but empty expansions are already a problem requiring careful
quoting in the first place...
Chris
^ permalink raw reply [flat|nested] 127+ messages in thread
* Re: [PATCH 1/8] clang-format: indent preprocessor directives after hash
2024-07-08 9:23 ` [PATCH 1/8] clang-format: indent preprocessor directives after hash Karthik Nayak
2024-07-08 10:08 ` Chris Torek
@ 2024-07-08 16:22 ` Junio C Hamano
2024-07-08 20:33 ` Karthik Nayak
2024-07-08 16:27 ` Re* " Junio C Hamano
2 siblings, 1 reply; 127+ messages in thread
From: Junio C Hamano @ 2024-07-08 16:22 UTC (permalink / raw)
To: Karthik Nayak; +Cc: git, jltobler, chriscool
Karthik Nayak <karthik.188@gmail.com> writes:
> We do not have a rule around the indentation of preprocessor directives.
> This was also discussed on the list [1], noting how there is often
> inconsistency in the styling. While there was discussion, there was no
> conclusion around what is the preferred style here. One style being
> indenting after the hash:
>
> #if FOO
> # if BAR
> # include <foo>
> # endif
> #endif
>
> The other being before the hash:
>
> #if FOO
> #if BAR
> #include <foo>
> #endif
> #endif
>
> Let's pick the former and add 'IndentPPDirectives: AfterHash' value to
> our '.clang-format'. There is no clear reason to pick one over the
> other, but it would definitely be nicer to be consistent.
When I experimented with reindenting the CPP directives in
<git-compat-util.h> [*], I think I saw an existing violation in an
early part of the file. Outside the borrowed code in compat/, we
have these:
$ git grep -e '^[ ]\{1,\}#' master -- ':!compat/' \*.[ch]
blame.c: #define FINGERPRINT_FILE_THRESHOLD 10
block-sha1/sha1.c: #define setW(x, val) (*(volatile unsigned int *)&W(x) = (val))
block-sha1/sha1.c: #define setW(x, val) do { W(x) = (val); __asm__("":::"memory"); } while (0)
block-sha1/sha1.c: #define setW(x, val) (W(x) = (val))
diff.h: #define COLOR_MOVED_DEFAULT COLOR_MOVED_ZEBRA
diff.h: #define COLOR_MOVED_MIN_ALNUM_COUNT 20
diff.h: #define COLOR_MOVED_WS_ALLOW_INDENTATION_CHANGE (1<<5)
diff.h: #define COLOR_MOVED_WS_ERROR (1<<0)
git-compat-util.h: #define GIT_GNUC_PREREQ(maj, min) 0
pkt-line.c: #define hex(a) (hexchar[(a) & 15])
pkt-line.c: #undef hex
sha1dc/sha1.c: #define sha1_load(m, t, temp) { temp = m[t]; }
sha1dc/sha1.c: #define sha1_load(m, t, temp) { temp = m[t]; sha1_bswap32(temp); }
Should we clean them up before we start adding these rules to the
file, especially if we plan to run the rules for stylistic check?
Otherwise wouldn't we see noises coming from the existing lines that
may dwarf the new ones, whose addition we want prevent?
If we were to run the check in CI to help contributors, I would
assume that you are arranging it to only complain about the lines
touched by the commits they are contributing, not about the existing
style violations. This comment is not limited to the CPP directive
indentation but any other style rules .clang-format defines.
If we are not checking only for lines affected by commits being
contributed, then perhaps we should exclude compat/ from these
rules?
Thanks for working on this.
[Reference]
* https://lore.kernel.org/git/xmqqjzim197j.fsf@gitster.g/
^ permalink raw reply [flat|nested] 127+ messages in thread
* Re* [PATCH 1/8] clang-format: indent preprocessor directives after hash
2024-07-08 9:23 ` [PATCH 1/8] clang-format: indent preprocessor directives after hash Karthik Nayak
2024-07-08 10:08 ` Chris Torek
2024-07-08 16:22 ` Junio C Hamano
@ 2024-07-08 16:27 ` Junio C Hamano
2 siblings, 0 replies; 127+ messages in thread
From: Junio C Hamano @ 2024-07-08 16:27 UTC (permalink / raw)
To: Karthik Nayak; +Cc: git, jltobler, chriscool
Subject: cpp: consistently write '#' for CPP directive at column 1
Besides it would get complaints from older compilers and look
strange to older eyes that were trained with such compilers, we will
be introducing a rule to be enforced to new code. Update a few
existing violators before it happens.
The changes in git-compat-util.h and sha1dc/sha1.c are both about
indenting the body of conditional CPP directives, e.g.,
(correct) (incorrect)
#if foo #if foo
# define bar #define bar
#endif #endif
The #define/#undef in pkt-line.c were indented not because they were
inside a conditional compilation block inside #if/#endif but because
they were added inside a function. As the function body is short,
we can move them out of the function and lose their indentation
without sacrificing the readability.
Signed-off-by: Junio C Hamano <gitster@pobox.com>
---
* So, if we decide to apply a preliminary clean-up to the codebase,
it should look somethine like this. I couldn't decide what we
want to do with diff.h where the indentation is done for the same
reason as how pkt-line.c temporarily defines hex(), but it is
messier.
diff --git i/diff.h w/diff.h
index 9901c8ca8c..ecaa8ec49e 100644
--- i/diff.h
+++ w/diff.h
@@ -386,12 +386,12 @@ struct diff_options {
COLOR_MOVED_ZEBRA = 3,
COLOR_MOVED_ZEBRA_DIM = 4,
} color_moved;
- #define COLOR_MOVED_DEFAULT COLOR_MOVED_ZEBRA
- #define COLOR_MOVED_MIN_ALNUM_COUNT 20
+#define COLOR_MOVED_DEFAULT COLOR_MOVED_ZEBRA
+#define COLOR_MOVED_MIN_ALNUM_COUNT 20
/* XDF_WHITESPACE_FLAGS regarding block detection are set at 2, 3, 4 */
- #define COLOR_MOVED_WS_ALLOW_INDENTATION_CHANGE (1<<5)
- #define COLOR_MOVED_WS_ERROR (1<<0)
+#define COLOR_MOVED_WS_ALLOW_INDENTATION_CHANGE (1<<5)
+#define COLOR_MOVED_WS_ERROR (1<<0)
unsigned color_moved_ws_handling;
struct repository *repo;
I _think_ the right solution for the first half of this is
actually to define the enum outside the structure and define
_DEFAULT and _COUNT next to the enum, all at the top-level of the
header file outside "struct diff_options" definition.
But I am unsure how to clean up the latter and that is where I
stopped.
git-compat-util.h | 2 +-
pkt-line.c | 4 ++--
sha1dc/sha1.c | 4 ++--
4 files changed, 9 insertions(+), 9 deletions(-)
diff --git c/git-compat-util.h w/git-compat-util.h
index ca7678a379..2cbd7c92b8 100644
--- c/git-compat-util.h
+++ w/git-compat-util.h
@@ -41,7 +41,7 @@ struct strbuf;
# define GIT_GNUC_PREREQ(maj, min) \
((__GNUC__ << 16) + __GNUC_MINOR__ >= ((maj) << 16) + (min))
#else
- #define GIT_GNUC_PREREQ(maj, min) 0
+# define GIT_GNUC_PREREQ(maj, min) 0
#endif
diff --git c/pkt-line.c w/pkt-line.c
index 24479eae4d..30044b2e76 100644
--- c/pkt-line.c
+++ w/pkt-line.c
@@ -132,17 +132,17 @@ void packet_buf_delim(struct strbuf *buf)
strbuf_add(buf, "0001", 4);
}
+#define hex(a) (hexchar[(a) & 15])
void set_packet_header(char *buf, int size)
{
static char hexchar[] = "0123456789abcdef";
- #define hex(a) (hexchar[(a) & 15])
buf[0] = hex(size >> 12);
buf[1] = hex(size >> 8);
buf[2] = hex(size >> 4);
buf[3] = hex(size);
- #undef hex
}
+#undef hex
static void format_packet(struct strbuf *out, const char *prefix,
const char *fmt, va_list args)
diff --git c/sha1dc/sha1.c w/sha1dc/sha1.c
index f993ef9c69..e82e05425e 100644
--- c/sha1dc/sha1.c
+++ w/sha1dc/sha1.c
@@ -139,9 +139,9 @@
#define sha1_mix(W, t) (rotate_left(W[t - 3] ^ W[t - 8] ^ W[t - 14] ^ W[t - 16], 1))
#ifdef SHA1DC_BIGENDIAN
- #define sha1_load(m, t, temp) { temp = m[t]; }
+# define sha1_load(m, t, temp) { temp = m[t]; }
#else
- #define sha1_load(m, t, temp) { temp = m[t]; sha1_bswap32(temp); }
+# define sha1_load(m, t, temp) { temp = m[t]; sha1_bswap32(temp); }
#endif
#define sha1_store(W, t, x) *(volatile uint32_t *)&W[t] = x
^ permalink raw reply related [flat|nested] 127+ messages in thread
* Re: [PATCH 4/8] clang-format: replace deprecated option with 'SpacesInParens'
2024-07-08 9:23 ` [PATCH 4/8] clang-format: replace deprecated option with 'SpacesInParens' Karthik Nayak
@ 2024-07-08 16:32 ` Junio C Hamano
0 siblings, 0 replies; 127+ messages in thread
From: Junio C Hamano @ 2024-07-08 16:32 UTC (permalink / raw)
To: Karthik Nayak; +Cc: git, jltobler, chriscool
Karthik Nayak <karthik.188@gmail.com> writes:
> Replace the deprecated options 'SpacesInParentheses' and
> 'SpaceInEmptyParentheses' with the newer 'SpacesInParens' option. The
> usage is the same.
I do not follow clang and clang-format development; updating to
avoid deprecated features is a welcome change, as long as the
replacing feature isn't too new (like, "introduced only 3 years
ago").
Thanks.
> Signed-off-by: Karthik Nayak <karthik.188@gmail.com>
> ---
> .clang-format | 9 ++++-----
> 1 file changed, 4 insertions(+), 5 deletions(-)
>
> diff --git a/.clang-format b/.clang-format
> index 4c9751a9db..914254a29b 100644
> --- a/.clang-format
> +++ b/.clang-format
> @@ -134,8 +134,6 @@ SpaceBeforeAssignmentOperators: true
> # }
> SpaceBeforeParens: ControlStatements
>
> -# Don't insert spaces inside empty '()'
> -SpaceInEmptyParentheses: false
>
> # The number of spaces before trailing line comments (// - comments).
> # This does not affect trailing block comments (/* - comments).
> @@ -149,9 +147,10 @@ SpacesInCStyleCastParentheses: false
> # var arr = [1, 2, 3]; not var arr = [ 1, 2, 3 ];
> SpacesInContainerLiterals: false
>
> -# Don't insert spaces after '(' or before ')'
> -# f(arg); not f( arg );
> -SpacesInParentheses: false
> +SpacesInParens: Custom
> +SpacesInParensOptions:
> + # Don't insert spaces inside empty '()'
> + InEmptyParentheses: false
>
> # Don't insert spaces after '[' or before ']'
> # int a[5]; not int a[ 5 ];
^ permalink raw reply [flat|nested] 127+ messages in thread
* Re: [PATCH 3/8] clang-format: ensure files end with newlines
2024-07-08 9:23 ` [PATCH 3/8] clang-format: ensure files end with newlines Karthik Nayak
@ 2024-07-08 16:32 ` Junio C Hamano
0 siblings, 0 replies; 127+ messages in thread
From: Junio C Hamano @ 2024-07-08 16:32 UTC (permalink / raw)
To: Karthik Nayak; +Cc: git, jltobler, chriscool
Karthik Nayak <karthik.188@gmail.com> writes:
> All our source files end with a newline, let's formalize in
> '.clang-format'.
Makes sense.
>
> Signed-off-by: Karthik Nayak <karthik.188@gmail.com>
> ---
> .clang-format | 3 +++
> 1 file changed, 3 insertions(+)
>
> diff --git a/.clang-format b/.clang-format
> index 803b274dd5..4c9751a9db 100644
> --- a/.clang-format
> +++ b/.clang-format
> @@ -106,6 +106,9 @@ IndentCaseLabels: false
> # #endif
> IndentPPDirectives: AfterHash
>
> +# Insert a newline at end of file if missing
> +InsertNewlineAtEOF: true
> +
> # Don't indent a function definition or declaration if it is wrapped after the
> # type
> IndentWrappedFunctionNames: false
^ permalink raw reply [flat|nested] 127+ messages in thread
* Re: [PATCH 5/8] clang-format: avoid braces on simple single-statement bodies
2024-07-08 9:23 ` [PATCH 5/8] clang-format: avoid braces on simple single-statement bodies Karthik Nayak
@ 2024-07-08 16:48 ` Junio C Hamano
2024-07-08 20:25 ` Karthik Nayak
0 siblings, 1 reply; 127+ messages in thread
From: Junio C Hamano @ 2024-07-08 16:48 UTC (permalink / raw)
To: Karthik Nayak; +Cc: git, jltobler, chriscool
Karthik Nayak <karthik.188@gmail.com> writes:
> Set the 'RemoveBracesLLVM' to 'true' which ensures that we avoid curly
> braces for single-statement bodies in conditional blocks.
Hmph, two warnings in its documentation [*] sound ominous, especially
the second one that says:
Warning
Setting this option to true could lead to incorrect code
formatting due to clang-format’s lack of complete semantic
information. As such, extra care should be taken to review code
changes made by this option.
which implies it may not necessarily a good idea to add to
automation without telling contributors that they may get hit with a
false positive (or incorrect rewrite).
Reading from the examples in that documentation page, it was unclear
how it would handle if/else if/.../else cascade where not all branches
are multi-statement blocks, e.g.,
if (A) {
do_A_thing();
} else if (B) {
do_B_thing();
} else {
do_C_things();
do_other_things();
}
but looking around I am getting a feeling that the tool would do the
right thing, i.e., to match our preference that is to use {braces}
around all branches, if I am not mistaken.
[Reference]
* https://releases.llvm.org/16.0.0/tools/clang/docs/ClangFormatStyleOptions.html#:~:text=RemoveBracesLLVM
> +# Remove optional braces of control statements (if, else, for, and while)
> +# according to the LLVM coding style
> +# This avoids braces on simple single-statement bodies of statements.
"... but keeps braces if one side of if/else if/.../else cascade has
multi-statement body."
> +RemoveBracesLLVM: true
^ permalink raw reply [flat|nested] 127+ messages in thread
* Re: [PATCH 6/8] clang-format: formalize some of the spacing rules
2024-07-08 9:23 ` [PATCH 6/8] clang-format: formalize some of the spacing rules Karthik Nayak
@ 2024-07-08 16:54 ` Junio C Hamano
2024-07-08 17:26 ` Karthik Nayak
2024-07-08 16:56 ` Justin Tobler
2024-07-08 20:53 ` Eric Sunshine
2 siblings, 1 reply; 127+ messages in thread
From: Junio C Hamano @ 2024-07-08 16:54 UTC (permalink / raw)
To: Karthik Nayak; +Cc: git, jltobler, chriscool
Karthik Nayak <karthik.188@gmail.com> writes:
> There are some spacing rules that we follow in the project and it makes
> sen to formalize them:
> * Ensure there is no space inserted after the logical not '!' operator.
Shouldn't the rule be more like "no space between any single operand
prefix or postfix operator and its operand"? "foo++", "--foo", "~0"
are the examples that come to my mind.
> * Ensure there is no space before the case statement's color.
"color" -> "colon".
> * Ensure there is no space before the first bracket '[' of an array.
> * Ensure there is no space in empty blocks.
Hmph, I actually thought we preferred to be more explicit, using
if (foo)
; /* nothing */
instead of any of
if (foo) {}
if (foo) { }
if (foo) { ; }
if (foo) { ; /* nothing */ }
to write an empty statement.
> Signed-off-by: Karthik Nayak <karthik.188@gmail.com>
> ---
> .clang-format | 14 ++++++++++++++
> 1 file changed, 14 insertions(+)
>
> diff --git a/.clang-format b/.clang-format
> index 1a5f0c9046..05036f610b 100644
> --- a/.clang-format
> +++ b/.clang-format
> @@ -126,11 +126,18 @@ RemoveBracesLLVM: true
> # x = (int32)y; not x = (int32) y;
> SpaceAfterCStyleCast: false
>
> +# No space is inserted after the logical not operator
> +SpaceAfterLogicalNot: false
> +
> # Insert spaces before and after assignment operators
> # int a = 5; not int a=5;
> # a += 42; a+=42;
> SpaceBeforeAssignmentOperators: true
>
> +# Spaces will be removed before case colon.
> +# case 1: break; not case 1 : break;
> +SpaceBeforeCaseColon: false
> +
> # Put a space before opening parentheses only after control statement keywords.
> # void f() {
> # if (true) {
> @@ -139,6 +146,13 @@ SpaceBeforeAssignmentOperators: true
> # }
> SpaceBeforeParens: ControlStatements
>
> +# No space before first '[' in arrays
> +# int a[5][5]; not int a [5][5];
> +SpaceBeforeSquareBrackets: false
> +
> +# No space will be inserted into {}
> +# while (true) {} not while (true) { }
> +SpaceInEmptyBlock: false
>
> # The number of spaces before trailing line comments (// - comments).
> # This does not affect trailing block comments (/* - comments).
^ permalink raw reply [flat|nested] 127+ messages in thread
* Re: [PATCH 6/8] clang-format: formalize some of the spacing rules
2024-07-08 9:23 ` [PATCH 6/8] clang-format: formalize some of the spacing rules Karthik Nayak
2024-07-08 16:54 ` Junio C Hamano
@ 2024-07-08 16:56 ` Justin Tobler
2024-07-08 17:27 ` Karthik Nayak
2024-07-08 20:53 ` Eric Sunshine
2 siblings, 1 reply; 127+ messages in thread
From: Justin Tobler @ 2024-07-08 16:56 UTC (permalink / raw)
To: Karthik Nayak; +Cc: git, chriscool
On 24/07/08 11:23AM, Karthik Nayak wrote:
> There are some spacing rules that we follow in the project and it makes
> sen to formalize them:
> * Ensure there is no space inserted after the logical not '!' operator.
> * Ensure there is no space before the case statement's color.
s/color/colon
> * Ensure there is no space before the first bracket '[' of an array.
> * Ensure there is no space in empty blocks.
^ permalink raw reply [flat|nested] 127+ messages in thread
* Re: [PATCH 8/8] check-whitespace: detect if no base_commit is provided
2024-07-08 10:42 ` Chris Torek
@ 2024-07-08 17:13 ` Karthik Nayak
2024-07-08 17:19 ` Junio C Hamano
1 sibling, 0 replies; 127+ messages in thread
From: Karthik Nayak @ 2024-07-08 17:13 UTC (permalink / raw)
To: Chris Torek, Georg Pfuetzenreuter; +Cc: git, jltobler, chriscool
[-- Attachment #1: Type: text/plain, Size: 706 bytes --]
Chris Torek <chris.torek@gmail.com> writes:
> On Mon, Jul 8, 2024 at 3:35 AM Georg Pfuetzenreuter <georg@syscid.com> wrote:
>> https://pubs.opengroup.org/onlinepubs/9699919799/utilities/test.html states
>>
>> "The XSI extensions specifying the -a and -o binary primaries and the
>> '(' and ')' operators have been marked obsolescent."
>>
>> suggesting "&&" being preferred over "-a".
>
> That's annoying, I wonder why they did that. It does make
> the "test" parser a bit tricky, especially with empty expansions,
> but empty expansions are already a problem requiring careful
> quoting in the first place...
>
> Chris
Thanks both, I think with this, it makes sense to keep it as is.
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 690 bytes --]
^ permalink raw reply [flat|nested] 127+ messages in thread
* Re: [PATCH 7/8] ci: run style check on GitHub and GitLab
2024-07-08 9:23 ` [PATCH 7/8] ci: run style check on GitHub and GitLab Karthik Nayak
@ 2024-07-08 17:15 ` Junio C Hamano
2024-07-08 21:05 ` Karthik Nayak
2024-07-08 22:52 ` Re* " Junio C Hamano
2024-07-08 18:10 ` Justin Tobler
1 sibling, 2 replies; 127+ messages in thread
From: Junio C Hamano @ 2024-07-08 17:15 UTC (permalink / raw)
To: Karthik Nayak; +Cc: git, jltobler, chriscool
Karthik Nayak <karthik.188@gmail.com> writes:
> We don't run style checks on our CI, even though we have a
> '.clang-format' setup in the repository. Let's add one, the job will
> validate only against the new commits added and will only run on merge
> requests.
I hope "against new commits" means what I think it does ;-) I am
worried about the case where a new commit touches a file that has
existing style violations but the commit does not make the situation
any worse at all.
OK, "git clang-format" is used to for this thing and it is designed
to address only lines that differ, so hopefully that would be good.
> Since we're introducing it for the first time, let's allow
> this job to fail, so we can validate if this is useful and eventually
> enforce it.
Very good idea.
> Signed-off-by: Karthik Nayak <karthik.188@gmail.com>
> ---
> .github/workflows/check-style.yml | 29 +++++++++++++++++++++++++++++
> .gitlab-ci.yml | 12 ++++++++++++
> ci/install-dependencies.sh | 2 +-
> ci/run-style-check.sh | 8 ++++++++
> 4 files changed, 50 insertions(+), 1 deletion(-)
> create mode 100644 .github/workflows/check-style.yml
> create mode 100755 ci/run-style-check.sh
>
> diff --git a/.github/workflows/check-style.yml b/.github/workflows/check-style.yml
> new file mode 100644
> index 0000000000..27276dfe5e
> --- /dev/null
> +++ b/.github/workflows/check-style.yml
> @@ -0,0 +1,29 @@
> +name: check-style
> +
> +# Get the repository with all commits to ensure that we can analyze
> +# all of the commits contributed via the Pull Request.
> +
> +on:
> + pull_request:
> + types: [opened, synchronize]
> +
> +# Avoid unnecessary builds. Unlike the main CI jobs, these are not
> +# ci-configurable (but could be).
> +concurrency:
> + group: ${{ github.workflow }}-${{ github.ref }}
> + cancel-in-progress: true
> +
> +jobs:
> + check-style:
> + runs-on: ubuntu-latest
> + steps:
> + - uses: actions/checkout@v4
> + with:
> + fetch-depth: 0
> +
> + - name: git clang-format
> + continue-on-error: true
> + id: check_out
> + run: |
> + ./ci/run-style-check.sh \
> + "${{github.event.pull_request.base.sha}}"
> diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
> index 37b991e080..65fd261e5e 100644
> --- a/.gitlab-ci.yml
> +++ b/.gitlab-ci.yml
> @@ -123,6 +123,18 @@ check-whitespace:
> rules:
> - if: $CI_PIPELINE_SOURCE == 'merge_request_event'
>
> +check-style:
> + image: ubuntu:latest
> + allow_failure: true
> + variables:
> + CC: clang
> + before_script:
> + - ./ci/install-dependencies.sh
> + script:
> + - ./ci/run-style-check.sh "$CI_MERGE_REQUEST_DIFF_BASE_SHA"
> + rules:
> + - if: $CI_PIPELINE_SOURCE == 'merge_request_event'
> +
> documentation:
> image: ubuntu:latest
> variables:
> diff --git a/ci/install-dependencies.sh b/ci/install-dependencies.sh
> index 6ec0f85972..46fe12a690 100755
> --- a/ci/install-dependencies.sh
> +++ b/ci/install-dependencies.sh
> @@ -43,7 +43,7 @@ ubuntu-*)
> make libssl-dev libcurl4-openssl-dev libexpat-dev wget sudo default-jre \
> tcl tk gettext zlib1g-dev perl-modules liberror-perl libauthen-sasl-perl \
> libemail-valid-perl libio-pty-perl libio-socket-ssl-perl libnet-smtp-ssl-perl libdbd-sqlite3-perl libcgi-pm-perl \
> - ${CC_PACKAGE:-${CC:-gcc}} $PYTHON_PACKAGE
> + ${CC_PACKAGE:-${CC:-gcc}} $PYTHON_PACKAGE clang-format
>
> mkdir --parents "$CUSTOM_PATH"
> wget --quiet --directory-prefix="$CUSTOM_PATH" \
> diff --git a/ci/run-style-check.sh b/ci/run-style-check.sh
> new file mode 100755
> index 0000000000..9d4c4089c1
> --- /dev/null
> +++ b/ci/run-style-check.sh
> @@ -0,0 +1,8 @@
> +#!/usr/bin/env sh
Under ci/ hierarchy we are very inconsistent. Most use the bog
standard "#!/bin/sh" (which is my preference by the way), but
see what we have here right now:
$ git grep -e '^#![a-z/]*/bin/[a-z]*sh' -e '^#![a-z/]*bin/env ' ci |
sort -t: -k2
ci/check-directional-formatting.bash:#!/bin/bash
ci/install-dependencies.sh:#!/bin/sh
ci/make-test-artifacts.sh:#!/bin/sh
ci/mount-fileshare.sh:#!/bin/sh
ci/print-test-failures.sh:#!/bin/sh
ci/run-build-and-minimal-fuzzers.sh:#!/bin/sh
ci/run-build-and-tests.sh:#!/bin/sh
ci/run-docker-build.sh:#!/bin/sh
ci/run-docker.sh:#!/bin/sh
ci/run-static-analysis.sh:#!/bin/sh
ci/run-test-slice.sh:#!/bin/sh
ci/util/extract-trash-dirs.sh:#!/bin/sh
ci/check-whitespace.sh:#!/usr/bin/env bash
ci/test-documentation.sh:#!/usr/bin/env bash
Unless you have a strong reason to suspect that in your CI
environment /bin/sh is an unusuably broken shell, please do not
spread the inconsistencies.
I think the consensus from the last discussion we had was to allow
scripts that rely on bash-isms to say "#!/usr/bin/env bash" because
we know /bin/sh can legitimately be not bash and we assume bash may
not be installed as /bin/bash. As all of them would run in the CI
environment that we have some control over what required packages
are installed at what path, it is OK to assume that "bash" would be
found on the $PATH by using /usr/bin/env (but it does assume
everybody installs "env" there, not /bin/env or /usr/local/bin/env,
with a bit of chicken-and-egg issue).
> +#
> +# Perform style check
> +#
> +
> +baseCommit=$1
> +
> +git clang-format --style file --diff --extensions c,h "$baseCommit"
OK, "git clang-format" compares the working tree with the named
commit, so if we have the tip of the topic branch proposed to be
merged checked out and compare it with the base commit of the topic,
that would give us exactly what we want. Nice.
Thanks.
^ permalink raw reply [flat|nested] 127+ messages in thread
* Re: [PATCH 8/8] check-whitespace: detect if no base_commit is provided
2024-07-08 10:42 ` Chris Torek
2024-07-08 17:13 ` Karthik Nayak
@ 2024-07-08 17:19 ` Junio C Hamano
1 sibling, 0 replies; 127+ messages in thread
From: Junio C Hamano @ 2024-07-08 17:19 UTC (permalink / raw)
To: Chris Torek; +Cc: Georg Pfuetzenreuter, Karthik Nayak, git, jltobler, chriscool
Chris Torek <chris.torek@gmail.com> writes:
> On Mon, Jul 8, 2024 at 3:35 AM Georg Pfuetzenreuter <georg@syscid.com> wrote:
>> https://pubs.opengroup.org/onlinepubs/9699919799/utilities/test.html states
>>
>> "The XSI extensions specifying the -a and -o binary primaries and the
>> '(' and ')' operators have been marked obsolescent."
>>
>> suggesting "&&" being preferred over "-a".
>
> That's annoying, I wonder why they did that.
Consult Documentation/CodingGuidelines?
- We do not write our "test" command with "-a" and "-o" and use "&&"
or "||" to concatenate multiple "test" commands instead, because
the use of "-a/-o" is often error-prone. E.g.
test -n "$x" -a "$a" = "$b"
is buggy and breaks when $x is "=", but
test -n "$x" && test "$a" = "$b"
does not have such a problem.
^ permalink raw reply [flat|nested] 127+ messages in thread
* Re: [PATCH 6/8] clang-format: formalize some of the spacing rules
2024-07-08 16:54 ` Junio C Hamano
@ 2024-07-08 17:26 ` Karthik Nayak
0 siblings, 0 replies; 127+ messages in thread
From: Karthik Nayak @ 2024-07-08 17:26 UTC (permalink / raw)
To: Junio C Hamano; +Cc: git, jltobler, chriscool
[-- Attachment #1: Type: text/plain, Size: 1469 bytes --]
Junio C Hamano <gitster@pobox.com> writes:
> Karthik Nayak <karthik.188@gmail.com> writes:
>
>> There are some spacing rules that we follow in the project and it makes
>> sen to formalize them:
>> * Ensure there is no space inserted after the logical not '!' operator.
>
> Shouldn't the rule be more like "no space between any single operand
> prefix or postfix operator and its operand"? "foo++", "--foo", "~0"
> are the examples that come to my mind.
>
The rule here is SpaceAfterLogicalNot [1], is specific to logical not
operator. Unfortunately I couldn't find a general rule for unary
operators. That would be very useful indeed.
>> * Ensure there is no space before the case statement's color.
>
> "color" -> "colon".
>
Will fix, thanks!
>> * Ensure there is no space before the first bracket '[' of an array.
>> * Ensure there is no space in empty blocks.
>
> Hmph, I actually thought we preferred to be more explicit, using
>
> if (foo)
> ; /* nothing */
>
> instead of any of
>
> if (foo) {}
> if (foo) { }
> if (foo) { ; }
> if (foo) { ; /* nothing */ }
>
> to write an empty statement.
>
Yup, that is correct. This rule doesn't state that we need to use 'if (foo) {}'
over the more explicit format. It only states that if we do create an
empty block without statements, the rule is to have no spaces.
We only have a few instances of this in our code.
[1]: https://clang.llvm.org/docs/ClangFormatStyleOptions.html#spaceafterlogicalnot
[snip]
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 690 bytes --]
^ permalink raw reply [flat|nested] 127+ messages in thread
* Re: [PATCH 6/8] clang-format: formalize some of the spacing rules
2024-07-08 16:56 ` Justin Tobler
@ 2024-07-08 17:27 ` Karthik Nayak
0 siblings, 0 replies; 127+ messages in thread
From: Karthik Nayak @ 2024-07-08 17:27 UTC (permalink / raw)
To: Justin Tobler; +Cc: git, chriscool
[-- Attachment #1: Type: text/plain, Size: 508 bytes --]
Justin Tobler <jltobler@gmail.com> writes:
> On 24/07/08 11:23AM, Karthik Nayak wrote:
>> There are some spacing rules that we follow in the project and it makes
>> sen to formalize them:
>> * Ensure there is no space inserted after the logical not '!' operator.
>> * Ensure there is no space before the case statement's color.
>
> s/color/colon
>
Thanks, will fix in the next version!
>> * Ensure there is no space before the first bracket '[' of an array.
>> * Ensure there is no space in empty blocks.
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 690 bytes --]
^ permalink raw reply [flat|nested] 127+ messages in thread
* Re: [PATCH 8/8] check-whitespace: detect if no base_commit is provided
2024-07-08 9:23 ` [PATCH 8/8] check-whitespace: detect if no base_commit is provided Karthik Nayak
2024-07-08 10:18 ` Chris Torek
@ 2024-07-08 17:35 ` Junio C Hamano
2024-07-10 14:06 ` Karthik Nayak
2024-07-08 17:58 ` Justin Tobler
2 siblings, 1 reply; 127+ messages in thread
From: Junio C Hamano @ 2024-07-08 17:35 UTC (permalink / raw)
To: Karthik Nayak; +Cc: git, jltobler, chriscool
Karthik Nayak <karthik.188@gmail.com> writes:
> The 'check-whitespace' CI script exists gracefully if no base commit is
"exists" -> "exits"
> provided or if an invalid revision is provided...
> ...
> Let's fix the variable used in the GitLab CI. Let's also add a check for
> incorrect base_commit in the 'check-whitespace.sh' script. While here,
> fix a small typo too.
>
> [1]: https://docs.gitlab.com/ee/ci/variables/predefined_variables.html#predefined-variables-for-merge-request-pipelines
>
> Signed-off-by: Karthik Nayak <karthik.188@gmail.com>
> ---
> .gitlab-ci.yml | 2 +-
> ci/check-whitespace.sh | 13 ++++++++++---
> 2 files changed, 11 insertions(+), 4 deletions(-)
>
> diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
> index 65fd261e5e..36199893d8 100644
> --- a/.gitlab-ci.yml
> +++ b/.gitlab-ci.yml
> @@ -119,7 +119,7 @@ check-whitespace:
> before_script:
> - ./ci/install-dependencies.sh
> script:
> - - ./ci/check-whitespace.sh "$CI_MERGE_REQUEST_TARGET_BRANCH_SHA"
> + - ./ci/check-whitespace.sh "$CI_MERGE_REQUEST_DIFF_BASE_SHA"
> rules:
> - if: $CI_PIPELINE_SOURCE == 'merge_request_event'
>
> diff --git a/ci/check-whitespace.sh b/ci/check-whitespace.sh
> index db399097a5..ab023f9519 100755
> --- a/ci/check-whitespace.sh
> +++ b/ci/check-whitespace.sh
> @@ -9,12 +9,19 @@ baseCommit=$1
> outputFile=$2
> url=$3
>
> -if test "$#" -ne 1 && test "$#" -ne 3
> +if { test "$#" -ne 1 && test "$#" -ne 3; } || test -z "$1"
You can just add || test -z "$1" after the existing one, making the
thing A && B || C which evaulates left to right with the same
precedence for && and ||.
> then
> echo "USAGE: $0 <BASE_COMMIT> [<OUTPUT_FILE> <URL>]"
> exit 1
> fi
>
> +gitLogOutput=$(git log --check --pretty=format:"---% h% s" "${baseCommit}"..)
That is a large string to hold in a variable for a potentially large
series with lots of breakages. I didn't quite read the reasoning
behind this change in the proposed log message. Under what
condition do you expect the command to exit with non-zero status?
$basecommit being a non-empty string but does not name a valid
commit object or something, in which case shouldn't "git log
--oneline $baseCommit.." or something simpler should suffice?
> +if test $? -ne 0
> +then
> + echo -n $gitLogOutput
What is "-n" doing here? Why are you squashing run of spaces in the
$gitLogOutput variable into a space by not "quoting" inside a dq-pair?
> + exit 1
> +fi
Looking for "--check" in
$ git log --help
tells me that the command exits with non-zero status if problems are
found, so wouldn't that mean the cases with problems always exit
early, bypassing the while loop with full of bash-ism that comes
after this block?
> problems=()
> commit=
> commitText=
> @@ -58,7 +65,7 @@ do
> echo "${dash} ${sha} ${etc}"
> ;;
> esac
> -done <<< "$(git log --check --pretty=format:"---% h% s" "${baseCommit}"..)"
> +done <<< "$gitLogOutput"
>
> if test ${#problems[*]} -gt 0
> then
> @@ -67,7 +74,7 @@ then
> goodParent=${baseCommit: 0:7}
> fi
>
> - echo "A whitespace issue was found in onen of more of the commits."
> + echo "A whitespace issue was found in one of more of the commits."
> echo "Run the following command to resolve whitespace issues:"
> echo "git rebase --whitespace=fix ${goodParent}"
^ permalink raw reply [flat|nested] 127+ messages in thread
* Re: [PATCH 8/8] check-whitespace: detect if no base_commit is provided
2024-07-08 9:23 ` [PATCH 8/8] check-whitespace: detect if no base_commit is provided Karthik Nayak
2024-07-08 10:18 ` Chris Torek
2024-07-08 17:35 ` Junio C Hamano
@ 2024-07-08 17:58 ` Justin Tobler
2024-07-10 14:12 ` Karthik Nayak
2 siblings, 1 reply; 127+ messages in thread
From: Justin Tobler @ 2024-07-08 17:58 UTC (permalink / raw)
To: Karthik Nayak; +Cc: git, chriscool
On 24/07/08 11:23AM, Karthik Nayak wrote:
> The 'check-whitespace' CI script exists gracefully if no base commit is
> provided or if an invalid revision is provided. This is not good because
> if a particular CI provides an incorrect base_commit, it would fail
> successfully.
s/exists/exits
If no base commit is provided, we already fail. Here is an example
GitLab CI job demonstrating this:
https://gitlab.com/gitlab-org/git/-/jobs/7289543498#L2370
If the base commit does not exist though, it currently prints that error occured
but still exits with 0. Makes sense to update and fail the job accordingly.
>
> This is exactly the case with the GitLab CI. The CI is using the
> "$CI_MERGE_REQUEST_TARGET_BRANCH_SHA" variable to get the base commit
> SHA, but variable is only defined for _merged_ pipelines. So it is empty
> for regular pipelines [1]. This should've failed the check-whitespace
> job.
The CI for this project is configured to use merged pipelines. So
$CI_MERGE_REQUEST_TARGET_BRANCH_SHA is defined. The downside with using
$CI_MERGE_REQUEST_DIFF_BASE_SHA is that it will include other commits in
the check that are not part of the MR, but are included in the merge for
merge pipelines. With this change, the job can now fail due to unrelated
changes.
If we feel inclined to also support regular pipelines, one option would
be to simply fallback to $CI_MERGE_REQUEST_DIFF_BASE_SHA if a merge
pipeline is not in use.
GitLab CI pipeline showing $CI_MERGE_REQUEST_TARGET_BRANCH_SHA defined:
https://gitlab.com/gitlab-org/git/-/jobs/7289331488#L2371
>
> Let's fix the variable used in the GitLab CI. Let's also add a check for
> incorrect base_commit in the 'check-whitespace.sh' script. While here,
> fix a small typo too.
>
> [1]: https://docs.gitlab.com/ee/ci/variables/predefined_variables.html#predefined-variables-for-merge-request-pipelines
>
> Signed-off-by: Karthik Nayak <karthik.188@gmail.com>
> ---
> .gitlab-ci.yml | 2 +-
> ci/check-whitespace.sh | 13 ++++++++++---
> 2 files changed, 11 insertions(+), 4 deletions(-)
>
> diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
> index 65fd261e5e..36199893d8 100644
> --- a/.gitlab-ci.yml
> +++ b/.gitlab-ci.yml
> @@ -119,7 +119,7 @@ check-whitespace:
> before_script:
> - ./ci/install-dependencies.sh
> script:
> - - ./ci/check-whitespace.sh "$CI_MERGE_REQUEST_TARGET_BRANCH_SHA"
> + - ./ci/check-whitespace.sh "$CI_MERGE_REQUEST_DIFF_BASE_SHA"
> rules:
> - if: $CI_PIPELINE_SOURCE == 'merge_request_event'
>
> diff --git a/ci/check-whitespace.sh b/ci/check-whitespace.sh
> index db399097a5..ab023f9519 100755
> --- a/ci/check-whitespace.sh
> +++ b/ci/check-whitespace.sh
> @@ -9,12 +9,19 @@ baseCommit=$1
> outputFile=$2
> url=$3
>
> -if test "$#" -ne 1 && test "$#" -ne 3
> +if { test "$#" -ne 1 && test "$#" -ne 3; } || test -z "$1"
I might be misunderstanding, but this additional check seems redundant to me.
> then
> echo "USAGE: $0 <BASE_COMMIT> [<OUTPUT_FILE> <URL>]"
> exit 1
> fi
>
> +gitLogOutput=$(git log --check --pretty=format:"---% h% s" "${baseCommit}"..)
> +if test $? -ne 0
> +then
> + echo -n $gitLogOutput
> + exit 1
> +fi
> +
> problems=()
> commit=
> commitText=
> @@ -58,7 +65,7 @@ do
> echo "${dash} ${sha} ${etc}"
> ;;
> esac
> -done <<< "$(git log --check --pretty=format:"---% h% s" "${baseCommit}"..)"
> +done <<< "$gitLogOutput"
>
> if test ${#problems[*]} -gt 0
> then
> @@ -67,7 +74,7 @@ then
> goodParent=${baseCommit: 0:7}
> fi
>
> - echo "A whitespace issue was found in onen of more of the commits."
> + echo "A whitespace issue was found in one of more of the commits."
There is another preexisting typo:
s/one of/one or/
> echo "Run the following command to resolve whitespace issues:"
> echo "git rebase --whitespace=fix ${goodParent}"
>
> --
> 2.45.1
>
^ permalink raw reply [flat|nested] 127+ messages in thread
* Re: [PATCH 7/8] ci: run style check on GitHub and GitLab
2024-07-08 9:23 ` [PATCH 7/8] ci: run style check on GitHub and GitLab Karthik Nayak
2024-07-08 17:15 ` Junio C Hamano
@ 2024-07-08 18:10 ` Justin Tobler
2024-07-08 21:16 ` Karthik Nayak
1 sibling, 1 reply; 127+ messages in thread
From: Justin Tobler @ 2024-07-08 18:10 UTC (permalink / raw)
To: Karthik Nayak; +Cc: git, chriscool
On 24/07/08 11:23AM, Karthik Nayak wrote:
> We don't run style checks on our CI, even though we have a
> '.clang-format' setup in the repository. Let's add one, the job will
> validate only against the new commits added and will only run on merge
> requests. Since we're introducing it for the first time, let's allow
> this job to fail, so we can validate if this is useful and eventually
> enforce it.
[snip]
> diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
> index 37b991e080..65fd261e5e 100644
> --- a/.gitlab-ci.yml
> +++ b/.gitlab-ci.yml
> @@ -123,6 +123,18 @@ check-whitespace:
> rules:
> - if: $CI_PIPELINE_SOURCE == 'merge_request_event'
>
> +check-style:
> + image: ubuntu:latest
> + allow_failure: true
> + variables:
> + CC: clang
> + before_script:
> + - ./ci/install-dependencies.sh
> + script:
> + - ./ci/run-style-check.sh "$CI_MERGE_REQUEST_DIFF_BASE_SHA"
One downside to using $CI_MERGE_REQUEST_DIFF_BASE_SHA is that for GitLab
merge pipeines, commits from the merge that are not part of the MR
changes are also included. This could lead to somewhat confusing
failures.
Example failure occuring on this patch series:
https://gitlab.com/gitlab-org/git/-/jobs/7284442220
It might be best to use $CI_MERGE_REQUEST_TARGET_BRANCH_SHA instead.
> + rules:
> + - if: $CI_PIPELINE_SOURCE == 'merge_request_event'
> +
^ permalink raw reply [flat|nested] 127+ messages in thread
* Re: [PATCH 5/8] clang-format: avoid braces on simple single-statement bodies
2024-07-08 16:48 ` Junio C Hamano
@ 2024-07-08 20:25 ` Karthik Nayak
2024-07-12 15:24 ` Phillip Wood
0 siblings, 1 reply; 127+ messages in thread
From: Karthik Nayak @ 2024-07-08 20:25 UTC (permalink / raw)
To: Junio C Hamano; +Cc: git, jltobler, chriscool
[-- Attachment #1: Type: text/plain, Size: 2338 bytes --]
Junio C Hamano <gitster@pobox.com> writes:
> Karthik Nayak <karthik.188@gmail.com> writes:
>
>> Set the 'RemoveBracesLLVM' to 'true' which ensures that we avoid curly
>> braces for single-statement bodies in conditional blocks.
>
> Hmph, two warnings in its documentation [*] sound ominous, especially
> the second one that says:
>
> Warning
>
> Setting this option to true could lead to incorrect code
> formatting due to clang-format’s lack of complete semantic
> information. As such, extra care should be taken to review code
> changes made by this option.
>
> which implies it may not necessarily a good idea to add to
> automation without telling contributors that they may get hit with a
> false positive (or incorrect rewrite).
>
Agreed on this one. I'm a bit skeptical to be honest too. I think I
should have added information about the warning in the commit too. I
will for next round. Overall, this also contributes to the reason why I
decided these CI jobs need to be allowed to fail.
>
> Reading from the examples in that documentation page, it was unclear
> how it would handle if/else if/.../else cascade where not all branches
> are multi-statement blocks, e.g.,
>
> if (A) {
> do_A_thing();
> } else if (B) {
> do_B_thing();
> } else {
> do_C_things();
> do_other_things();
> }
>
> but looking around I am getting a feeling that the tool would do the
> right thing, i.e., to match our preference that is to use {braces}
> around all branches, if I am not mistaken.
>
Yup, that was my understanding and what I could see from some quick
trials that I did too.
It would be a great win to have this though, because it is one of the
things that always get me.
>
> [Reference]
>
> * https://releases.llvm.org/16.0.0/tools/clang/docs/ClangFormatStyleOptions.html#:~:text=RemoveBracesLLVM
>
>> +# Remove optional braces of control statements (if, else, for, and while)
>> +# according to the LLVM coding style
>> +# This avoids braces on simple single-statement bodies of statements.
>
> "... but keeps braces if one side of if/else if/.../else cascade has
> multi-statement body."
>
Makes sense, will add.
>> +RemoveBracesLLVM: true
Overall I must say, I'd be okay if this patch is also dropped from this
series.
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 690 bytes --]
^ permalink raw reply [flat|nested] 127+ messages in thread
* Re: [PATCH 1/8] clang-format: indent preprocessor directives after hash
2024-07-08 16:22 ` Junio C Hamano
@ 2024-07-08 20:33 ` Karthik Nayak
0 siblings, 0 replies; 127+ messages in thread
From: Karthik Nayak @ 2024-07-08 20:33 UTC (permalink / raw)
To: Junio C Hamano; +Cc: git, jltobler, chriscool
[-- Attachment #1: Type: text/plain, Size: 3161 bytes --]
Junio C Hamano <gitster@pobox.com> writes:
> Karthik Nayak <karthik.188@gmail.com> writes:
>
>> We do not have a rule around the indentation of preprocessor directives.
>> This was also discussed on the list [1], noting how there is often
>> inconsistency in the styling. While there was discussion, there was no
>> conclusion around what is the preferred style here. One style being
>> indenting after the hash:
>>
>> #if FOO
>> # if BAR
>> # include <foo>
>> # endif
>> #endif
>>
>> The other being before the hash:
>>
>> #if FOO
>> #if BAR
>> #include <foo>
>> #endif
>> #endif
>>
>> Let's pick the former and add 'IndentPPDirectives: AfterHash' value to
>> our '.clang-format'. There is no clear reason to pick one over the
>> other, but it would definitely be nicer to be consistent.
>
> When I experimented with reindenting the CPP directives in
> <git-compat-util.h> [*], I think I saw an existing violation in an
> early part of the file. Outside the borrowed code in compat/, we
> have these:
>
> $ git grep -e '^[ ]\{1,\}#' master -- ':!compat/' \*.[ch]
> blame.c: #define FINGERPRINT_FILE_THRESHOLD 10
> block-sha1/sha1.c: #define setW(x, val) (*(volatile unsigned int *)&W(x) = (val))
> block-sha1/sha1.c: #define setW(x, val) do { W(x) = (val); __asm__("":::"memory"); } while (0)
> block-sha1/sha1.c: #define setW(x, val) (W(x) = (val))
> diff.h: #define COLOR_MOVED_DEFAULT COLOR_MOVED_ZEBRA
> diff.h: #define COLOR_MOVED_MIN_ALNUM_COUNT 20
> diff.h: #define COLOR_MOVED_WS_ALLOW_INDENTATION_CHANGE (1<<5)
> diff.h: #define COLOR_MOVED_WS_ERROR (1<<0)
> git-compat-util.h: #define GIT_GNUC_PREREQ(maj, min) 0
> pkt-line.c: #define hex(a) (hexchar[(a) & 15])
> pkt-line.c: #undef hex
> sha1dc/sha1.c: #define sha1_load(m, t, temp) { temp = m[t]; }
> sha1dc/sha1.c: #define sha1_load(m, t, temp) { temp = m[t]; sha1_bswap32(temp); }
>
> Should we clean them up before we start adding these rules to the
> file, especially if we plan to run the rules for stylistic check?
> Otherwise wouldn't we see noises coming from the existing lines that
> may dwarf the new ones, whose addition we want prevent?
>
Making syntax changes just so the rule works was something I did
consider, but I avoided it mostly because the CI only applies to the
changes made and not pre-existing files.
This also allows us to apply the boy scout rule and cleanup as we go.
> If we were to run the check in CI to help contributors, I would
> assume that you are arranging it to only complain about the lines
> touched by the commits they are contributing, not about the existing
> style violations. This comment is not limited to the CPP directive
> indentation but any other style rules .clang-format defines.
>
Yes exactly, the usage of 'git-clang-format' allows us to only check for
lines changed.
> If we are not checking only for lines affected by commits being
> contributed, then perhaps we should exclude compat/ from these
> rules?
>
> Thanks for working on this.
>
> [Reference]
>
> * https://lore.kernel.org/git/xmqqjzim197j.fsf@gitster.g/
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 690 bytes --]
^ permalink raw reply [flat|nested] 127+ messages in thread
* Re: [PATCH 6/8] clang-format: formalize some of the spacing rules
2024-07-08 9:23 ` [PATCH 6/8] clang-format: formalize some of the spacing rules Karthik Nayak
2024-07-08 16:54 ` Junio C Hamano
2024-07-08 16:56 ` Justin Tobler
@ 2024-07-08 20:53 ` Eric Sunshine
2024-07-10 13:36 ` Karthik Nayak
2 siblings, 1 reply; 127+ messages in thread
From: Eric Sunshine @ 2024-07-08 20:53 UTC (permalink / raw)
To: Karthik Nayak; +Cc: git, jltobler, chriscool
On Mon, Jul 8, 2024 at 5:24 AM Karthik Nayak <karthik.188@gmail.com> wrote:
> There are some spacing rules that we follow in the project and it makes
> sen to formalize them:
Since nobody else pointed it out: s/sen/sense/
^ permalink raw reply [flat|nested] 127+ messages in thread
* Re: [PATCH 7/8] ci: run style check on GitHub and GitLab
2024-07-08 17:15 ` Junio C Hamano
@ 2024-07-08 21:05 ` Karthik Nayak
2024-07-08 22:52 ` Re* " Junio C Hamano
1 sibling, 0 replies; 127+ messages in thread
From: Karthik Nayak @ 2024-07-08 21:05 UTC (permalink / raw)
To: Junio C Hamano; +Cc: git, jltobler, chriscool
[-- Attachment #1: Type: text/plain, Size: 2561 bytes --]
Junio C Hamano <gitster@pobox.com> writes:
[snip]
>> diff --git a/ci/run-style-check.sh b/ci/run-style-check.sh
>> new file mode 100755
>> index 0000000000..9d4c4089c1
>> --- /dev/null
>> +++ b/ci/run-style-check.sh
>> @@ -0,0 +1,8 @@
>> +#!/usr/bin/env sh
>
> Under ci/ hierarchy we are very inconsistent. Most use the bog
> standard "#!/bin/sh" (which is my preference by the way), but
> see what we have here right now:
>
> $ git grep -e '^#![a-z/]*/bin/[a-z]*sh' -e '^#![a-z/]*bin/env ' ci |
> sort -t: -k2
> ci/check-directional-formatting.bash:#!/bin/bash
> ci/install-dependencies.sh:#!/bin/sh
> ci/make-test-artifacts.sh:#!/bin/sh
> ci/mount-fileshare.sh:#!/bin/sh
> ci/print-test-failures.sh:#!/bin/sh
> ci/run-build-and-minimal-fuzzers.sh:#!/bin/sh
> ci/run-build-and-tests.sh:#!/bin/sh
> ci/run-docker-build.sh:#!/bin/sh
> ci/run-docker.sh:#!/bin/sh
> ci/run-static-analysis.sh:#!/bin/sh
> ci/run-test-slice.sh:#!/bin/sh
> ci/util/extract-trash-dirs.sh:#!/bin/sh
> ci/check-whitespace.sh:#!/usr/bin/env bash
> ci/test-documentation.sh:#!/usr/bin/env bash
>
> Unless you have a strong reason to suspect that in your CI
> environment /bin/sh is an unusuably broken shell, please do not
> spread the inconsistencies.
>
> I think the consensus from the last discussion we had was to allow
> scripts that rely on bash-isms to say "#!/usr/bin/env bash" because
> we know /bin/sh can legitimately be not bash and we assume bash may
> not be installed as /bin/bash. As all of them would run in the CI
> environment that we have some control over what required packages
> are installed at what path, it is OK to assume that "bash" would be
> found on the $PATH by using /usr/bin/env (but it does assume
> everybody installs "env" there, not /bin/env or /usr/local/bin/env,
> with a bit of chicken-and-egg issue).
>
I must admit, I didn't put any thought into this while writing. The
usage of '/usr/bin/env' is mostly muscle memory and since I didn't need
any bash-isms, I defaulted to /bin/sh.
I'll change it, thanks!
>> +#
>> +# Perform style check
>> +#
>> +
>> +baseCommit=$1
>> +
>> +git clang-format --style file --diff --extensions c,h "$baseCommit"
>
> OK, "git clang-format" compares the working tree with the named
> commit, so if we have the tip of the topic branch proposed to be
> merged checked out and compare it with the base commit of the topic,
> that would give us exactly what we want. Nice.
>
> Thanks.
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 690 bytes --]
^ permalink raw reply [flat|nested] 127+ messages in thread
* Re: [PATCH 7/8] ci: run style check on GitHub and GitLab
2024-07-08 18:10 ` Justin Tobler
@ 2024-07-08 21:16 ` Karthik Nayak
2024-07-09 0:22 ` Justin Tobler
0 siblings, 1 reply; 127+ messages in thread
From: Karthik Nayak @ 2024-07-08 21:16 UTC (permalink / raw)
To: Justin Tobler; +Cc: git, chriscool
[-- Attachment #1: Type: text/plain, Size: 2024 bytes --]
Justin Tobler <jltobler@gmail.com> writes:
> On 24/07/08 11:23AM, Karthik Nayak wrote:
>> We don't run style checks on our CI, even though we have a
>> '.clang-format' setup in the repository. Let's add one, the job will
>> validate only against the new commits added and will only run on merge
>> requests. Since we're introducing it for the first time, let's allow
>> this job to fail, so we can validate if this is useful and eventually
>> enforce it.
>
> [snip]
>
>> diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
>> index 37b991e080..65fd261e5e 100644
>> --- a/.gitlab-ci.yml
>> +++ b/.gitlab-ci.yml
>> @@ -123,6 +123,18 @@ check-whitespace:
>> rules:
>> - if: $CI_PIPELINE_SOURCE == 'merge_request_event'
>>
>> +check-style:
>> + image: ubuntu:latest
>> + allow_failure: true
>> + variables:
>> + CC: clang
>> + before_script:
>> + - ./ci/install-dependencies.sh
>> + script:
>> + - ./ci/run-style-check.sh "$CI_MERGE_REQUEST_DIFF_BASE_SHA"
>
> One downside to using $CI_MERGE_REQUEST_DIFF_BASE_SHA is that for GitLab
> merge pipeines, commits from the merge that are not part of the MR
> changes are also included. This could lead to somewhat confusing
> failures.
>
I'm not sure I follow.
> Example failure occuring on this patch series:
> https://gitlab.com/gitlab-org/git/-/jobs/7284442220
>
If you notice this job, it points to the commit: 1c6551488, and the
parent commit of that commit is: 614dff2011.
The parent commit [1] is a test commit I added to check the failures. So
isn't this working as expected?
> It might be best to use $CI_MERGE_REQUEST_TARGET_BRANCH_SHA instead.
>
I actually started with $CI_MERGE_REQUEST_TARGET_BRANCH_SHA, it didn't
work, because the value was undefined.
See: https://gitlab.com/gitlab-org/git/-/jobs/7283724903
This is why I also decided to fix and change the whitespace check.
>> + rules:
>> + - if: $CI_PIPELINE_SOURCE == 'merge_request_event'
>> +
[1]: https://gitlab.com/gitlab-org/git/-/commit/614dff20119aa325661424a9fcef552e242a95d9
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 690 bytes --]
^ permalink raw reply [flat|nested] 127+ messages in thread
* Re* [PATCH 7/8] ci: run style check on GitHub and GitLab
2024-07-08 17:15 ` Junio C Hamano
2024-07-08 21:05 ` Karthik Nayak
@ 2024-07-08 22:52 ` Junio C Hamano
2024-07-08 23:17 ` Justin Tobler
2024-07-09 0:56 ` brian m. carlson
1 sibling, 2 replies; 127+ messages in thread
From: Junio C Hamano @ 2024-07-08 22:52 UTC (permalink / raw)
To: git; +Cc: Karthik Nayak, jltobler, chriscool
Junio C Hamano <gitster@pobox.com> writes:
> I think the consensus from the last discussion we had was to allow
> scripts that rely on bash-isms to say "#!/usr/bin/env bash" because
> we know /bin/sh can legitimately be not bash and we assume bash may
> not be installed as /bin/bash.
Let's do this before we forget.
------- >8 ------------- >8 ------------- >8 -------
Subject: [PATCH] ci: unify bash calling convention
Under ci/ hierarchy, we run scripts under either "sh" (any Bourne
compatible POSIX shell would work) or specifically "bash" (as they
require features from bash, e.g., $(parameter/pattern/string}
expansion). As we have the CI envionment under our control, we can
expect that /bin/sh will always be fine to run the scripts that only
require Bourne, but we may not know where "bash" gets installed
depending on distros.
So let's make sure we start these scripts with either one of these:
#!/bin/sh
#!/usr/bin/env bash
Yes, the latter has to assume that everybody installs "env" at that
path and not as /bin/env or /usr/local/bin/env, but this currently
is the best we could do.
Signed-off-by: Junio C Hamano <gitster@pobox.com>
---
ci/check-directional-formatting.bash | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/ci/check-directional-formatting.bash b/ci/check-directional-formatting.bash
index e6211b141a..3cbbb7030e 100755
--- a/ci/check-directional-formatting.bash
+++ b/ci/check-directional-formatting.bash
@@ -1,4 +1,4 @@
-#!/bin/bash
+#!/usr/bin/env bash
# This script verifies that the non-binary files tracked in the Git index do
# not contain any Unicode directional formatting: such formatting could be used
--
2.45.2-924-g22c02b0a17
^ permalink raw reply related [flat|nested] 127+ messages in thread
* Re: Re* [PATCH 7/8] ci: run style check on GitHub and GitLab
2024-07-08 22:52 ` Re* " Junio C Hamano
@ 2024-07-08 23:17 ` Justin Tobler
2024-07-09 0:56 ` brian m. carlson
1 sibling, 0 replies; 127+ messages in thread
From: Justin Tobler @ 2024-07-08 23:17 UTC (permalink / raw)
To: Junio C Hamano; +Cc: git, Karthik Nayak, chriscool
On 24/07/08 03:52PM, Junio C Hamano wrote:
> Junio C Hamano <gitster@pobox.com> writes:
>
> > I think the consensus from the last discussion we had was to allow
> > scripts that rely on bash-isms to say "#!/usr/bin/env bash" because
> > we know /bin/sh can legitimately be not bash and we assume bash may
> > not be installed as /bin/bash.
>
> Let's do this before we forget.
>
> ------- >8 ------------- >8 ------------- >8 -------
> Subject: [PATCH] ci: unify bash calling convention
>
> Under ci/ hierarchy, we run scripts under either "sh" (any Bourne
> compatible POSIX shell would work) or specifically "bash" (as they
> require features from bash, e.g., $(parameter/pattern/string}
> expansion). As we have the CI envionment under our control, we can
s/envionment/environment
> expect that /bin/sh will always be fine to run the scripts that only
> require Bourne, but we may not know where "bash" gets installed
> depending on distros.
>
> So let's make sure we start these scripts with either one of these:
>
> #!/bin/sh
> #!/usr/bin/env bash
>
> Yes, the latter has to assume that everybody installs "env" at that
> path and not as /bin/env or /usr/local/bin/env, but this currently
> is the best we could do.
Makes sense to me to be consistent and I also think `#!/usr/bin/env bash`
is probably the best route. Other than the small typo this looks good to
me.
-Justin
^ permalink raw reply [flat|nested] 127+ messages in thread
* Re: [PATCH 7/8] ci: run style check on GitHub and GitLab
2024-07-08 21:16 ` Karthik Nayak
@ 2024-07-09 0:22 ` Justin Tobler
2024-07-09 8:44 ` Karthik Nayak
0 siblings, 1 reply; 127+ messages in thread
From: Justin Tobler @ 2024-07-09 0:22 UTC (permalink / raw)
To: Karthik Nayak; +Cc: git, chriscool
On 24/07/08 02:16PM, Karthik Nayak wrote:
> Justin Tobler <jltobler@gmail.com> writes:
>
> > On 24/07/08 11:23AM, Karthik Nayak wrote:
> >> We don't run style checks on our CI, even though we have a
> >> '.clang-format' setup in the repository. Let's add one, the job will
> >> validate only against the new commits added and will only run on merge
> >> requests. Since we're introducing it for the first time, let's allow
> >> this job to fail, so we can validate if this is useful and eventually
> >> enforce it.
> >
> > [snip]
> >
> >> diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
> >> index 37b991e080..65fd261e5e 100644
> >> --- a/.gitlab-ci.yml
> >> +++ b/.gitlab-ci.yml
> >> @@ -123,6 +123,18 @@ check-whitespace:
> >> rules:
> >> - if: $CI_PIPELINE_SOURCE == 'merge_request_event'
> >>
> >> +check-style:
> >> + image: ubuntu:latest
> >> + allow_failure: true
> >> + variables:
> >> + CC: clang
> >> + before_script:
> >> + - ./ci/install-dependencies.sh
> >> + script:
> >> + - ./ci/run-style-check.sh "$CI_MERGE_REQUEST_DIFF_BASE_SHA"
> >
> > One downside to using $CI_MERGE_REQUEST_DIFF_BASE_SHA is that for GitLab
> > merge pipeines, commits from the merge that are not part of the MR
> > changes are also included. This could lead to somewhat confusing
> > failures.
> >
>
> I'm not sure I follow.
>
> > Example failure occuring on this patch series:
> > https://gitlab.com/gitlab-org/git/-/jobs/7284442220
> >
>
> If you notice this job, it points to the commit: 1c6551488, and the
> parent commit of that commit is: 614dff2011.
>
> The parent commit [1] is a test commit I added to check the failures. So
> isn't this working as expected?
Ah ok, I misunderstood the setup of that CI job, but the problem is
still present. Here is an example CI job I've run demonstrating it:
CI - https://gitlab.com/gitlab-org/git/-/jobs/7291829941
MR - https://gitlab.com/gitlab-org/git/-/merge_requests/174
For the MR that spawned this CI job, This patch series is the source
branch and the target branch is a version of master one commit ahead
containing a clang format error. Because this is a merge pipeline, using
$CI_MERGE_REQUEST_DIFF_BASE_SHA will include changes from either side of
the base commit. This means it would be possible for the CI job to fail
due to commits ahead in the target branch, but not in the source branch.
For the check-whitespace CI job, I specifically chose
$CI_MERGE_REQUEST_TARGET_BRANCH_SHA for this reason.j
>
> > It might be best to use $CI_MERGE_REQUEST_TARGET_BRANCH_SHA instead.
> >
>
> I actually started with $CI_MERGE_REQUEST_TARGET_BRANCH_SHA, it didn't
> work, because the value was undefined.
>
> See: https://gitlab.com/gitlab-org/git/-/jobs/7283724903
>
> This is why I also decided to fix and change the whitespace check.
I'm not seeing $CI_MERGE_REQUEST_TARGET_BRANCH_SHA as undefined in the
job. Here is a modified version on the check-style CI job printing the
environment variables:
https://gitlab.com/gitlab-org/git/-/jobs/7291792329#L2470
Do you have an example of the check-whitespace job failing in GitLab CI?
Maybe I'm missing something, but I don't see a problem.
-Justin
^ permalink raw reply [flat|nested] 127+ messages in thread
* Re: Re* [PATCH 7/8] ci: run style check on GitHub and GitLab
2024-07-08 22:52 ` Re* " Junio C Hamano
2024-07-08 23:17 ` Justin Tobler
@ 2024-07-09 0:56 ` brian m. carlson
1 sibling, 0 replies; 127+ messages in thread
From: brian m. carlson @ 2024-07-09 0:56 UTC (permalink / raw)
To: Junio C Hamano; +Cc: git, Karthik Nayak, jltobler, chriscool
[-- Attachment #1: Type: text/plain, Size: 1457 bytes --]
On 2024-07-08 at 22:52:11, Junio C Hamano wrote:
> Subject: [PATCH] ci: unify bash calling convention
>
> Under ci/ hierarchy, we run scripts under either "sh" (any Bourne
> compatible POSIX shell would work) or specifically "bash" (as they
> require features from bash, e.g., $(parameter/pattern/string}
> expansion). As we have the CI envionment under our control, we can
> expect that /bin/sh will always be fine to run the scripts that only
> require Bourne, but we may not know where "bash" gets installed
> depending on distros.
>
> So let's make sure we start these scripts with either one of these:
>
> #!/bin/sh
> #!/usr/bin/env bash
>
> Yes, the latter has to assume that everybody installs "env" at that
> path and not as /bin/env or /usr/local/bin/env, but this currently
> is the best we could do.
This seems sensible. We know that /bin/sh is not POSIX-compatible on
some proprietary Unices, but we're not targeting those in CI, and Git
for Windows, macOS, and all of the major open-source Linux and BSD
distros have /bin/sh as a POSIX-compatible shell.
/usr/bin/env bash is also safer than /bin/bash, because bash is not in
/usr/bin on most of the BSDs. Every other project I've seen writes
/usr/bin/env, so I think that's a fairly safe assumption most places,
and I agree that it's the best we can do.
So I think is the right move.
--
brian m. carlson (they/them or he/him)
Toronto, Ontario, CA
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 262 bytes --]
^ permalink raw reply [flat|nested] 127+ messages in thread
* Re: [PATCH 7/8] ci: run style check on GitHub and GitLab
2024-07-09 0:22 ` Justin Tobler
@ 2024-07-09 8:44 ` Karthik Nayak
2024-07-09 14:44 ` Justin Tobler
0 siblings, 1 reply; 127+ messages in thread
From: Karthik Nayak @ 2024-07-09 8:44 UTC (permalink / raw)
To: Justin Tobler; +Cc: git, chriscool
[-- Attachment #1: Type: text/plain, Size: 4807 bytes --]
Justin Tobler <jltobler@gmail.com> writes:
> On 24/07/08 02:16PM, Karthik Nayak wrote:
>> Justin Tobler <jltobler@gmail.com> writes:
>>
>> > On 24/07/08 11:23AM, Karthik Nayak wrote:
>> >> We don't run style checks on our CI, even though we have a
>> >> '.clang-format' setup in the repository. Let's add one, the job will
>> >> validate only against the new commits added and will only run on merge
>> >> requests. Since we're introducing it for the first time, let's allow
>> >> this job to fail, so we can validate if this is useful and eventually
>> >> enforce it.
>> >
>> > [snip]
>> >
>> >> diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
>> >> index 37b991e080..65fd261e5e 100644
>> >> --- a/.gitlab-ci.yml
>> >> +++ b/.gitlab-ci.yml
>> >> @@ -123,6 +123,18 @@ check-whitespace:
>> >> rules:
>> >> - if: $CI_PIPELINE_SOURCE == 'merge_request_event'
>> >>
>> >> +check-style:
>> >> + image: ubuntu:latest
>> >> + allow_failure: true
>> >> + variables:
>> >> + CC: clang
>> >> + before_script:
>> >> + - ./ci/install-dependencies.sh
>> >> + script:
>> >> + - ./ci/run-style-check.sh "$CI_MERGE_REQUEST_DIFF_BASE_SHA"
>> >
>> > One downside to using $CI_MERGE_REQUEST_DIFF_BASE_SHA is that for GitLab
>> > merge pipeines, commits from the merge that are not part of the MR
>> > changes are also included. This could lead to somewhat confusing
>> > failures.
>> >
>>
>> I'm not sure I follow.
>>
>> > Example failure occuring on this patch series:
>> > https://gitlab.com/gitlab-org/git/-/jobs/7284442220
>> >
>>
>> If you notice this job, it points to the commit: 1c6551488, and the
>> parent commit of that commit is: 614dff2011.
>>
>> The parent commit [1] is a test commit I added to check the failures. So
>> isn't this working as expected?
>
> Ah ok, I misunderstood the setup of that CI job, but the problem is
> still present. Here is an example CI job I've run demonstrating it:
>
> CI - https://gitlab.com/gitlab-org/git/-/jobs/7291829941
> MR - https://gitlab.com/gitlab-org/git/-/merge_requests/174
>
> For the MR that spawned this CI job, This patch series is the source
> branch and the target branch is a version of master one commit ahead
> containing a clang format error. Because this is a merge pipeline, using
> $CI_MERGE_REQUEST_DIFF_BASE_SHA will include changes from either side of
> the base commit. This means it would be possible for the CI job to fail
> due to commits ahead in the target branch, but not in the source branch.
> For the check-whitespace CI job, I specifically chose
> $CI_MERGE_REQUEST_TARGET_BRANCH_SHA for this reason.j
>
You're right indeed. I did some more reading about this and I think the
solution lies somewhere in between..
>>
>> > It might be best to use $CI_MERGE_REQUEST_TARGET_BRANCH_SHA instead.
>> >
>>
>> I actually started with $CI_MERGE_REQUEST_TARGET_BRANCH_SHA, it didn't
>> work, because the value was undefined.
>>
>> See: https://gitlab.com/gitlab-org/git/-/jobs/7283724903
>>
>> This is why I also decided to fix and change the whitespace check.
>
> I'm not seeing $CI_MERGE_REQUEST_TARGET_BRANCH_SHA as undefined in the
> job. Here is a modified version on the check-style CI job printing the
> environment variables:
>
You can see the output
$ ./ci/run-style-check.sh "$CI_MERGE_REQUEST_TARGET_BRANCH_SHA"
fatal: ambiguous argument '': unknown revision or path not in the
working tree.
Use '--' to separate paths from revisions, like this:
'git <command> [<revision>...] -- [<file>...]'
This only happens if "$CI_MERGE_REQUEST_TARGET_BRANCH_SHA" is empty.
> https://gitlab.com/gitlab-org/git/-/jobs/7291792329#L2470
>
> Do you have an example of the check-whitespace job failing in GitLab CI?
> Maybe I'm missing something, but I don't see a problem.
>
> -Justin
So I think I get the issue, GitLab has two kinds of pipelines it runs:
1. merge pipeline: Here the pipeline runs on the source branch (the
feature branch which has to be merged).
2. merged pipeline: Here the pipeline creates a merge commit using the
source and target branch and then runs the pipeline on the merged
commit.
And "$CI_MERGE_REQUEST_TARGET_BRANCH_SHA" is only defined in the 'merged
pipeline'. If you see the pipelines for my branch on GitLab [1]. You'll
see only one of them is marked as 'merge results' and the others being
marked as 'merged results'. The former includes the job I mentioned
above, where "$CI_MERGE_REQUEST_TARGET_BRANCH_SHA" is not defined.
I'm still not sure why it marked only one of the pipelines as such, but
this means there is chance that it could happen.
So I guess the best outcome is to use
"$CI_MERGE_REQUEST_TARGET_BRANCH_SHA", but fallback to
"$CI_MERGE_REQUEST_DIFF_BASE_SHA", if the former is not defined.
[1]: https://gitlab.com/gitlab-org/git/-/merge_requests/172/pipelines
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 690 bytes --]
^ permalink raw reply [flat|nested] 127+ messages in thread
* Re: [PATCH 7/8] ci: run style check on GitHub and GitLab
2024-07-09 8:44 ` Karthik Nayak
@ 2024-07-09 14:44 ` Justin Tobler
2024-07-10 13:38 ` Karthik Nayak
0 siblings, 1 reply; 127+ messages in thread
From: Justin Tobler @ 2024-07-09 14:44 UTC (permalink / raw)
To: Karthik Nayak; +Cc: git, chriscool
On 24/07/09 01:44AM, Karthik Nayak wrote:
> Justin Tobler <jltobler@gmail.com> writes:
>
> > On 24/07/08 02:16PM, Karthik Nayak wrote:
> >> Justin Tobler <jltobler@gmail.com> writes:
> >>
> >> > On 24/07/08 11:23AM, Karthik Nayak wrote:
> >> >> We don't run style checks on our CI, even though we have a
> >> >> '.clang-format' setup in the repository. Let's add one, the job will
> >> >> validate only against the new commits added and will only run on merge
> >> >> requests. Since we're introducing it for the first time, let's allow
> >> >> this job to fail, so we can validate if this is useful and eventually
> >> >> enforce it.
> >> >
> >> > [snip]
> >> >
> >> >> diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
> >> >> index 37b991e080..65fd261e5e 100644
> >> >> --- a/.gitlab-ci.yml
> >> >> +++ b/.gitlab-ci.yml
> >> >> @@ -123,6 +123,18 @@ check-whitespace:
> >> >> rules:
> >> >> - if: $CI_PIPELINE_SOURCE == 'merge_request_event'
> >> >>
> >> >> +check-style:
> >> >> + image: ubuntu:latest
> >> >> + allow_failure: true
> >> >> + variables:
> >> >> + CC: clang
> >> >> + before_script:
> >> >> + - ./ci/install-dependencies.sh
> >> >> + script:
> >> >> + - ./ci/run-style-check.sh "$CI_MERGE_REQUEST_DIFF_BASE_SHA"
> >> >
> >> > One downside to using $CI_MERGE_REQUEST_DIFF_BASE_SHA is that for GitLab
> >> > merge pipeines, commits from the merge that are not part of the MR
> >> > changes are also included. This could lead to somewhat confusing
> >> > failures.
> >> >
> >>
> >> I'm not sure I follow.
> >>
> >> > Example failure occuring on this patch series:
> >> > https://gitlab.com/gitlab-org/git/-/jobs/7284442220
> >> >
> >>
> >> If you notice this job, it points to the commit: 1c6551488, and the
> >> parent commit of that commit is: 614dff2011.
> >>
> >> The parent commit [1] is a test commit I added to check the failures. So
> >> isn't this working as expected?
> >
> > Ah ok, I misunderstood the setup of that CI job, but the problem is
> > still present. Here is an example CI job I've run demonstrating it:
> >
> > CI - https://gitlab.com/gitlab-org/git/-/jobs/7291829941
> > MR - https://gitlab.com/gitlab-org/git/-/merge_requests/174
> >
> > For the MR that spawned this CI job, This patch series is the source
> > branch and the target branch is a version of master one commit ahead
> > containing a clang format error. Because this is a merge pipeline, using
> > $CI_MERGE_REQUEST_DIFF_BASE_SHA will include changes from either side of
> > the base commit. This means it would be possible for the CI job to fail
> > due to commits ahead in the target branch, but not in the source branch.
> > For the check-whitespace CI job, I specifically chose
> > $CI_MERGE_REQUEST_TARGET_BRANCH_SHA for this reason.j
> >
>
> You're right indeed. I did some more reading about this and I think the
> solution lies somewhere in between..
>
> >>
> >> > It might be best to use $CI_MERGE_REQUEST_TARGET_BRANCH_SHA instead.
> >> >
> >>
> >> I actually started with $CI_MERGE_REQUEST_TARGET_BRANCH_SHA, it didn't
> >> work, because the value was undefined.
> >>
> >> See: https://gitlab.com/gitlab-org/git/-/jobs/7283724903
> >>
> >> This is why I also decided to fix and change the whitespace check.
> >
> > I'm not seeing $CI_MERGE_REQUEST_TARGET_BRANCH_SHA as undefined in the
> > job. Here is a modified version on the check-style CI job printing the
> > environment variables:
> >
>
> You can see the output
>
> $ ./ci/run-style-check.sh "$CI_MERGE_REQUEST_TARGET_BRANCH_SHA"
> fatal: ambiguous argument '': unknown revision or path not in the
> working tree.
> Use '--' to separate paths from revisions, like this:
> 'git <command> [<revision>...] -- [<file>...]'
>
> This only happens if "$CI_MERGE_REQUEST_TARGET_BRANCH_SHA" is empty.
Ya I noticed this failure, but was wondering if it was maybe due to
something else. I have been unable to reproduce it and in all the jobs I
was running resulted in a merge pipeline with the variable defined. But
maybe sometimes a regular pipeline gets run for some reason and
consequently $CI_MERGE_REQUEST_TARGET_BRANCH_SHA is not defined? Was the
pipeline triggered directly from the source branch?
>
> > https://gitlab.com/gitlab-org/git/-/jobs/7291792329#L2470
> >
> > Do you have an example of the check-whitespace job failing in GitLab CI?
> > Maybe I'm missing something, but I don't see a problem.
> >
> > -Justin
>
> So I think I get the issue, GitLab has two kinds of pipelines it runs:
> 1. merge pipeline: Here the pipeline runs on the source branch (the
> feature branch which has to be merged).
> 2. merged pipeline: Here the pipeline creates a merge commit using the
> source and target branch and then runs the pipeline on the merged
> commit.
>
Correct, this is my understanding.
> And "$CI_MERGE_REQUEST_TARGET_BRANCH_SHA" is only defined in the 'merged
> pipeline'. If you see the pipelines for my branch on GitLab [1]. You'll
> see only one of them is marked as 'merge results' and the others being
> marked as 'merged results'. The former includes the job I mentioned
> above, where "$CI_MERGE_REQUEST_TARGET_BRANCH_SHA" is not defined.
>
> I'm still not sure why it marked only one of the pipelines as such, but
> this means there is chance that it could happen.
Huh, I'm guessing the CI job must have been triggered from the source
branch directly. Did you manually run the CI job? I wonder if that could
have caused it.
>
> So I guess the best outcome is to use
> "$CI_MERGE_REQUEST_TARGET_BRANCH_SHA", but fallback to
> "$CI_MERGE_REQUEST_DIFF_BASE_SHA", if the former is not defined.
This is exactly what I think we should do too. For merge pipelines we
will want to use $CI_MERGE_REQUEST_TARGET_BRANCH_SHA so that only the
commits included in the MR are scanned in CI. If that variable is not
defined, it makes sense to fallback to $CI_MERGE_REQUEST_DIFF_BASE_SHA.
Since it's not a merge pipeline it will only scan commits included from
the MR and therefore work as expected.
This should handle both cases correctly. :)
-Justin
^ permalink raw reply [flat|nested] 127+ messages in thread
* Re: [PATCH 6/8] clang-format: formalize some of the spacing rules
2024-07-08 20:53 ` Eric Sunshine
@ 2024-07-10 13:36 ` Karthik Nayak
0 siblings, 0 replies; 127+ messages in thread
From: Karthik Nayak @ 2024-07-10 13:36 UTC (permalink / raw)
To: Eric Sunshine; +Cc: git, jltobler, chriscool
[-- Attachment #1: Type: text/plain, Size: 307 bytes --]
Eric Sunshine <sunshine@sunshineco.com> writes:
> On Mon, Jul 8, 2024 at 5:24 AM Karthik Nayak <karthik.188@gmail.com> wrote:
>> There are some spacing rules that we follow in the project and it makes
>> sen to formalize them:
>
> Since nobody else pointed it out: s/sen/sense/
Will fix in v2.
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 690 bytes --]
^ permalink raw reply [flat|nested] 127+ messages in thread
* Re: [PATCH 7/8] ci: run style check on GitHub and GitLab
2024-07-09 14:44 ` Justin Tobler
@ 2024-07-10 13:38 ` Karthik Nayak
0 siblings, 0 replies; 127+ messages in thread
From: Karthik Nayak @ 2024-07-10 13:38 UTC (permalink / raw)
To: Justin Tobler; +Cc: git, chriscool
[-- Attachment #1: Type: text/plain, Size: 3006 bytes --]
Justin Tobler <jltobler@gmail.com> writes:
[snip]
>>
>> You can see the output
>>
>> $ ./ci/run-style-check.sh "$CI_MERGE_REQUEST_TARGET_BRANCH_SHA"
>> fatal: ambiguous argument '': unknown revision or path not in the
>> working tree.
>> Use '--' to separate paths from revisions, like this:
>> 'git <command> [<revision>...] -- [<file>...]'
>>
>> This only happens if "$CI_MERGE_REQUEST_TARGET_BRANCH_SHA" is empty.
>
> Ya I noticed this failure, but was wondering if it was maybe due to
> something else. I have been unable to reproduce it and in all the jobs I
> was running resulted in a merge pipeline with the variable defined. But
> maybe sometimes a regular pipeline gets run for some reason and
> consequently $CI_MERGE_REQUEST_TARGET_BRANCH_SHA is not defined? Was the
> pipeline triggered directly from the source branch?
>
Just a regular push. Not sure at all why this happened. I was testing
different types of style issues on the CI and this happened once.
>>
>> > https://gitlab.com/gitlab-org/git/-/jobs/7291792329#L2470
>> >
>> > Do you have an example of the check-whitespace job failing in GitLab CI?
>> > Maybe I'm missing something, but I don't see a problem.
>> >
>> > -Justin
>>
>> So I think I get the issue, GitLab has two kinds of pipelines it runs:
>> 1. merge pipeline: Here the pipeline runs on the source branch (the
>> feature branch which has to be merged).
>> 2. merged pipeline: Here the pipeline creates a merge commit using the
>> source and target branch and then runs the pipeline on the merged
>> commit.
>>
>
> Correct, this is my understanding.
>
>> And "$CI_MERGE_REQUEST_TARGET_BRANCH_SHA" is only defined in the 'merged
>> pipeline'. If you see the pipelines for my branch on GitLab [1]. You'll
>> see only one of them is marked as 'merge results' and the others being
>> marked as 'merged results'. The former includes the job I mentioned
>> above, where "$CI_MERGE_REQUEST_TARGET_BRANCH_SHA" is not defined.
>>
>> I'm still not sure why it marked only one of the pipelines as such, but
>> this means there is chance that it could happen.
>
> Huh, I'm guessing the CI job must have been triggered from the source
> branch directly. Did you manually run the CI job? I wonder if that could
> have caused it.
>
Not that I remember.
>>
>> So I guess the best outcome is to use
>> "$CI_MERGE_REQUEST_TARGET_BRANCH_SHA", but fallback to
>> "$CI_MERGE_REQUEST_DIFF_BASE_SHA", if the former is not defined.
>
> This is exactly what I think we should do too. For merge pipelines we
> will want to use $CI_MERGE_REQUEST_TARGET_BRANCH_SHA so that only the
> commits included in the MR are scanned in CI. If that variable is not
> defined, it makes sense to fallback to $CI_MERGE_REQUEST_DIFF_BASE_SHA.
> Since it's not a merge pipeline it will only scan commits included from
> the MR and therefore work as expected.
>
> This should handle both cases correctly. :)
>
> -Justin
Yeah seems like the best solution at this point, let me implement this.
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 690 bytes --]
^ permalink raw reply [flat|nested] 127+ messages in thread
* Re: [PATCH 8/8] check-whitespace: detect if no base_commit is provided
2024-07-08 17:35 ` Junio C Hamano
@ 2024-07-10 14:06 ` Karthik Nayak
2024-07-10 16:02 ` Junio C Hamano
0 siblings, 1 reply; 127+ messages in thread
From: Karthik Nayak @ 2024-07-10 14:06 UTC (permalink / raw)
To: Junio C Hamano; +Cc: git, jltobler, chriscool
[-- Attachment #1: Type: text/plain, Size: 4251 bytes --]
Junio C Hamano <gitster@pobox.com> writes:
> Karthik Nayak <karthik.188@gmail.com> writes:
>
>> The 'check-whitespace' CI script exists gracefully if no base commit is
>
> "exists" -> "exits"
>
Will fix.
>> provided or if an invalid revision is provided...
>> ...
>> Let's fix the variable used in the GitLab CI. Let's also add a check for
>> incorrect base_commit in the 'check-whitespace.sh' script. While here,
>> fix a small typo too.
>>
>> [1]: https://docs.gitlab.com/ee/ci/variables/predefined_variables.html#predefined-variables-for-merge-request-pipelines
>>
>> Signed-off-by: Karthik Nayak <karthik.188@gmail.com>
>> ---
>> .gitlab-ci.yml | 2 +-
>> ci/check-whitespace.sh | 13 ++++++++++---
>> 2 files changed, 11 insertions(+), 4 deletions(-)
>>
>> diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
>> index 65fd261e5e..36199893d8 100644
>> --- a/.gitlab-ci.yml
>> +++ b/.gitlab-ci.yml
>> @@ -119,7 +119,7 @@ check-whitespace:
>> before_script:
>> - ./ci/install-dependencies.sh
>> script:
>> - - ./ci/check-whitespace.sh "$CI_MERGE_REQUEST_TARGET_BRANCH_SHA"
>> + - ./ci/check-whitespace.sh "$CI_MERGE_REQUEST_DIFF_BASE_SHA"
>> rules:
>> - if: $CI_PIPELINE_SOURCE == 'merge_request_event'
>>
>> diff --git a/ci/check-whitespace.sh b/ci/check-whitespace.sh
>> index db399097a5..ab023f9519 100755
>> --- a/ci/check-whitespace.sh
>> +++ b/ci/check-whitespace.sh
>> @@ -9,12 +9,19 @@ baseCommit=$1
>> outputFile=$2
>> url=$3
>>
>> -if test "$#" -ne 1 && test "$#" -ne 3
>> +if { test "$#" -ne 1 && test "$#" -ne 3; } || test -z "$1"
>
> You can just add || test -z "$1" after the existing one, making the
> thing A && B || C which evaulates left to right with the same
> precedence for && and ||.
>
Well, I prefer making it explicit so one does not have to remember the
precedence ordering, but it could just be my lack of shell knowledge.
I'm okay with this change, I'll add it in the next version.
>> then
>> echo "USAGE: $0 <BASE_COMMIT> [<OUTPUT_FILE> <URL>]"
>> exit 1
>> fi
>>
>> +gitLogOutput=$(git log --check --pretty=format:"---% h% s" "${baseCommit}"..)
>
> That is a large string to hold in a variable for a potentially large
> series with lots of breakages. I didn't quite read the reasoning
> behind this change in the proposed log message. Under what
> condition do you expect the command to exit with non-zero status?
> $basecommit being a non-empty string but does not name a valid
> commit object or something, in which case shouldn't "git log
> --oneline $baseCommit.." or something simpler should suffice?
>
Yeah, makes sense. I think I'll simply add in
if ! git rev-parse --quiet --verify "${baseCommit}"
then
echo "Invalid <BASE_COMMIT> '${baseCommit}'"
exit 1
fi
instead
>> +if test $? -ne 0
>> +then
>> + echo -n $gitLogOutput
>
> What is "-n" doing here? Why are you squashing run of spaces in the
> $gitLogOutput variable into a space by not "quoting" inside a dq-pair?
>
I actually didn't know about this. Thanks for informing.
>> + exit 1
>> +fi
>
> Looking for "--check" in
>
> $ git log --help
>
> tells me that the command exits with non-zero status if problems are
> found, so wouldn't that mean the cases with problems always exit
> early, bypassing the while loop with full of bash-ism that comes
> after this block?
>
It should exist with a non-zero code, but since we're capturing it in
the while loop, it doesn't stop the slow. A consequence of which is that
it'll print the stderr from the `git log` failing, but the script itself
will still exit with a zero exit code. This marks a success on the CI.
>> problems=()
>> commit=
>> commitText=
>> @@ -58,7 +65,7 @@ do
>> echo "${dash} ${sha} ${etc}"
>> ;;
>> esac
>> -done <<< "$(git log --check --pretty=format:"---% h% s" "${baseCommit}"..)"
>> +done <<< "$gitLogOutput"
>>
>> if test ${#problems[*]} -gt 0
>> then
>> @@ -67,7 +74,7 @@ then
>> goodParent=${baseCommit: 0:7}
>> fi
>>
>> - echo "A whitespace issue was found in onen of more of the commits."
>> + echo "A whitespace issue was found in one of more of the commits."
>> echo "Run the following command to resolve whitespace issues:"
>> echo "git rebase --whitespace=fix ${goodParent}"
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 690 bytes --]
^ permalink raw reply [flat|nested] 127+ messages in thread
* Re: [PATCH 8/8] check-whitespace: detect if no base_commit is provided
2024-07-08 17:58 ` Justin Tobler
@ 2024-07-10 14:12 ` Karthik Nayak
0 siblings, 0 replies; 127+ messages in thread
From: Karthik Nayak @ 2024-07-10 14:12 UTC (permalink / raw)
To: Justin Tobler; +Cc: git, chriscool
[-- Attachment #1: Type: text/plain, Size: 2243 bytes --]
Justin Tobler <jltobler@gmail.com> writes:
> On 24/07/08 11:23AM, Karthik Nayak wrote:
>> The 'check-whitespace' CI script exists gracefully if no base commit is
>> provided or if an invalid revision is provided. This is not good because
>> if a particular CI provides an incorrect base_commit, it would fail
>> successfully.
>
> s/exists/exits
>
> If no base commit is provided, we already fail. Here is an example
> GitLab CI job demonstrating this:
> https://gitlab.com/gitlab-org/git/-/jobs/7289543498#L2370
>
> If the base commit does not exist though, it currently prints that error occured
> but still exits with 0. Makes sense to update and fail the job accordingly.
>
This example is running on the 'edb990d9', whose parent's '8d9bcf0a'
parent '57fdb00c' contains my changes, specifically the `|| test -z "$1"`
section. You can check this on master locally though.
$ ./ci/check-whitespace.sh ""
fatal: ..: '..' is outside repository at '/home/karthik/git'
$ echo $?
0
or for invalid value:
$ ./ci/check-whitespace.sh "random"
fatal: ambiguous argument 'random..': unknown revision or path not
in the working tree.
Use '--' to separate paths from revisions, like this:
'git <command> [<revision>...] -- [<file>...]'
$ echo $status
0
[snip]
>
> I might be misunderstanding, but this additional check seems redundant to me.
>
It is required, as commented above
>> then
>> echo "USAGE: $0 <BASE_COMMIT> [<OUTPUT_FILE> <URL>]"
>> exit 1
>> fi
>>
>> +gitLogOutput=$(git log --check --pretty=format:"---% h% s" "${baseCommit}"..)
>> +if test $? -ne 0
>> +then
>> + echo -n $gitLogOutput
>> + exit 1
>> +fi
>> +
>> problems=()
>> commit=
>> commitText=
>> @@ -58,7 +65,7 @@ do
>> echo "${dash} ${sha} ${etc}"
>> ;;
>> esac
>> -done <<< "$(git log --check --pretty=format:"---% h% s" "${baseCommit}"..)"
>> +done <<< "$gitLogOutput"
>>
>> if test ${#problems[*]} -gt 0
>> then
>> @@ -67,7 +74,7 @@ then
>> goodParent=${baseCommit: 0:7}
>> fi
>>
>> - echo "A whitespace issue was found in onen of more of the commits."
>> + echo "A whitespace issue was found in one of more of the commits."
> There is another preexisting typo:
>
> s/one of/one or/
>
Thanks. will add
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 690 bytes --]
^ permalink raw reply [flat|nested] 127+ messages in thread
* Re: [PATCH 8/8] check-whitespace: detect if no base_commit is provided
2024-07-10 14:06 ` Karthik Nayak
@ 2024-07-10 16:02 ` Junio C Hamano
2024-07-11 8:27 ` Karthik Nayak
0 siblings, 1 reply; 127+ messages in thread
From: Junio C Hamano @ 2024-07-10 16:02 UTC (permalink / raw)
To: Karthik Nayak; +Cc: git, jltobler, chriscool
Karthik Nayak <karthik.188@gmail.com> writes:
> Yeah, makes sense. I think I'll simply add in
>
> if ! git rev-parse --quiet --verify "${baseCommit}"
> then
> echo "Invalid <BASE_COMMIT> '${baseCommit}'"
> exit 1
> fi
It would make the intent a lot clearer. Good.
>>> +if test $? -ne 0
>>> +then
>>> + echo -n $gitLogOutput
>>
>> What is "-n" doing here? Why are you squashing run of spaces in the
>> $gitLogOutput variable into a space by not "quoting" inside a dq-pair?
>>
>
> I actually didn't know about this. Thanks for informing.
>
>>> + exit 1
>>> +fi
>>
>> Looking for "--check" in
>>
>> $ git log --help
>>
>> tells me that the command exits with non-zero status if problems are
>> found, so wouldn't that mean the cases with problems always exit
>> early, bypassing the while loop with full of bash-ism that comes
>> after this block?
>>
>
> It should exist with a non-zero code, but since we're capturing it in
> the while loop, it doesn't stop the slow.
Sorry, but I am confused. The control would not even reach a "while
loop", I am afraid.
I was commenting on the exit status check done here:
+gitLogOutput=$(git log --check --pretty=format:"---% h% s" "${baseCommit}"..)
+if test $? -ne 0
+then
+ echo -n $gitLogOutput
+ exit 1
+fi
Even though the output is captured in a variable, the exit status of
"git log --check" is still seen by the shell and "if test $? = 0"
next line say "ah, the thing exited with non-zero status so lets
echo the whole thing and exit with 1", before it gets to the while
loop we have below the above piece of code, no?
^ permalink raw reply [flat|nested] 127+ messages in thread
* Re: [PATCH 8/8] check-whitespace: detect if no base_commit is provided
2024-07-10 16:02 ` Junio C Hamano
@ 2024-07-11 8:27 ` Karthik Nayak
2024-07-11 14:41 ` Junio C Hamano
0 siblings, 1 reply; 127+ messages in thread
From: Karthik Nayak @ 2024-07-11 8:27 UTC (permalink / raw)
To: Junio C Hamano; +Cc: git, jltobler, chriscool
[-- Attachment #1: Type: text/plain, Size: 1908 bytes --]
Junio C Hamano <gitster@pobox.com> writes:
> Karthik Nayak <karthik.188@gmail.com> writes:
>
>> Yeah, makes sense. I think I'll simply add in
>>
>> if ! git rev-parse --quiet --verify "${baseCommit}"
>> then
>> echo "Invalid <BASE_COMMIT> '${baseCommit}'"
>> exit 1
>> fi
>
> It would make the intent a lot clearer. Good.
>
>>>> +if test $? -ne 0
>>>> +then
>>>> + echo -n $gitLogOutput
>>>
>>> What is "-n" doing here? Why are you squashing run of spaces in the
>>> $gitLogOutput variable into a space by not "quoting" inside a dq-pair?
>>>
>>
>> I actually didn't know about this. Thanks for informing.
>>
>>>> + exit 1
>>>> +fi
>>>
>>> Looking for "--check" in
>>>
>>> $ git log --help
>>>
>>> tells me that the command exits with non-zero status if problems are
>>> found, so wouldn't that mean the cases with problems always exit
>>> early, bypassing the while loop with full of bash-ism that comes
>>> after this block?
>>>
>>
>> It should exist with a non-zero code, but since we're capturing it in
>> the while loop, it doesn't stop the slow.
>
> Sorry, but I am confused. The control would not even reach a "while
> loop", I am afraid.
>
> I was commenting on the exit status check done here:
>
> +gitLogOutput=$(git log --check --pretty=format:"---% h% s" "${baseCommit}"..)
> +if test $? -ne 0
> +then
> + echo -n $gitLogOutput
> + exit 1
> +fi
>
> Even though the output is captured in a variable, the exit status of
> "git log --check" is still seen by the shell and "if test $? = 0"
> next line say "ah, the thing exited with non-zero status so lets
> echo the whole thing and exit with 1", before it gets to the while
> loop we have below the above piece of code, no?
My bad, I thought you were referring to the code before my changes. Yes,
here you're right, we don't need the check since the shell would capture
the non-zero status.
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 690 bytes --]
^ permalink raw reply [flat|nested] 127+ messages in thread
* [PATCH v2 0/8] clang-format: add more rules and enable on CI
2024-07-08 9:23 [PATCH 0/8] clang-format: add more rules and enable on CI Karthik Nayak
` (8 preceding siblings ...)
2024-07-08 10:06 ` [PATCH 0/8] clang-format: add more rules and enable on CI Chris Torek
@ 2024-07-11 8:30 ` Karthik Nayak
2024-07-11 8:30 ` [PATCH v2 1/8] clang-format: indent preprocessor directives after hash Karthik Nayak
` (9 more replies)
9 siblings, 10 replies; 127+ messages in thread
From: Karthik Nayak @ 2024-07-11 8:30 UTC (permalink / raw)
To: karthik.188; +Cc: chriscool, git, jltobler
This is v2 of my series to add clang-format to the CI.
The series was mostly inspired by a patch sent recently to 'include
kh_foreach* macros in ForEachMacros' [1]. I was wondering why we don't
run the formatting on CI and reduce some of the workload of reviewers.
We have a '.clang-format' file to provide rules for code formatting.
The commits 1-6 aims to add more rules to the file while deprecating old
ones.
Commit 7 enables CI action on GitHub and GitLab to also check for the
code formatting. Currently, it is allowed to fail. This way we can build
confidence and fine tune the values as needed and finally enforce the
check in a future patch. I'm not well versed with GitHub workflows, and
I mostly tried to copy existing work there. Expecting some feedback in
that section!
Commit 8 fixes an existing issue with the 'check-whitespace' job, which
is failing as success in the GitLab CI.
1: https://lore.kernel.org/git/4e7893f5-2dd9-46cf-8a64-cf780f4e1730@web.de/
Changes against v1:
* Fixed a lot of typos.
* Added more details about the warnings specified by clang-format for
'RemoveBracesLLVM' in commit 5. Added more details too.
* The last two commits were modified to use "CI_MERGE_REQUEST_TARGET_BRANCH_SHA"
and fallback to "CI_MERGE_REQUEST_DIFF_BASE_SHA" if the former is not
available in GitLab's CI.
* Use `!/bin/sh` for the run-style-check script.
* Modified the last commit to remove block around the && check in the
whitespace script.
* Use `git rev-parse --verify --quiet` to verify the base commit.
Karthik Nayak (8):
clang-format: indent preprocessor directives after hash
clang-format: avoid spacing around bitfield colon
clang-format: ensure files end with newlines
clang-format: replace deprecated option with 'SpacesInParens'
clang-format: avoid braces on simple single-statement bodies
clang-format: formalize some of the spacing rules
ci: run style check on GitHub and GitLab
check-whitespace: detect if no base_commit is provided
.clang-format | 42 +++++++++++++++++++++++++++----
.github/workflows/check-style.yml | 29 +++++++++++++++++++++
.gitlab-ci.yml | 24 +++++++++++++++++-
ci/check-whitespace.sh | 10 ++++++--
ci/install-dependencies.sh | 2 +-
ci/run-style-check.sh | 8 ++++++
6 files changed, 106 insertions(+), 9 deletions(-)
create mode 100644 .github/workflows/check-style.yml
create mode 100755 ci/run-style-check.sh
Range-diff against v1:
1: 6cf91ffc86 = 1: 6cf91ffc86 clang-format: indent preprocessor directives after hash
2: beb002885f = 2: beb002885f clang-format: avoid spacing around bitfield colon
3: 3031be43e7 = 3: 3031be43e7 clang-format: ensure files end with newlines
4: bc1550e300 = 4: bc1550e300 clang-format: replace deprecated option with 'SpacesInParens'
5: cb6097aa22 ! 5: 840318a4c9 clang-format: avoid braces on simple single-statement bodies
@@ Commit message
Set the 'RemoveBracesLLVM' to 'true' which ensures that we avoid curly
braces for single-statement bodies in conditional blocks.
+ This option does come with two warnings:
+
+ This option will be renamed and expanded to support other styles.
+
+ and
+
+ Setting this option to true could lead to incorrect code formatting
+ due to clang-format’s lack of complete semantic information. As
+ such, extra care should be taken to review code changes made by
+ this option.
+
+ The latter seems to be of concern. But since we only use clang-format to
+ verify the format and not to apply formatting, we should be okay here.
+
Signed-off-by: Karthik Nayak <karthik.188@gmail.com>
## .clang-format ##
@@ .clang-format: IndentWrappedFunctionNames: false
PointerAlignment: Right
+# Remove optional braces of control statements (if, else, for, and while)
-+# according to the LLVM coding style
-+# This avoids braces on simple single-statement bodies of statements.
++# according to the LLVM coding style. This avoids braces on simple
++# single-statement bodies of statements but keeps braces if one side of
++# if/else if/.../else cascade has multi-statement body.
+RemoveBracesLLVM: true
+
# Don't insert a space after a cast
6: c4b6e1e82f ! 6: 0ecfd8d24b clang-format: formalize some of the spacing rules
@@ Commit message
clang-format: formalize some of the spacing rules
There are some spacing rules that we follow in the project and it makes
- sen to formalize them:
+ sense to formalize them:
* Ensure there is no space inserted after the logical not '!' operator.
- * Ensure there is no space before the case statement's color.
+ * Ensure there is no space before the case statement's colon.
* Ensure there is no space before the first bracket '[' of an array.
* Ensure there is no space in empty blocks.
7: 37f1e5c702 ! 7: 11a9ac4935 ci: run style check on GitHub and GitLab
@@ Commit message
this job to fail, so we can validate if this is useful and eventually
enforce it.
+ For GitLab, we use the 'CI_MERGE_REQUEST_TARGET_BRANCH_SHA' variable by
+ default to obtain the base SHA of the merged pipeline (which is only
+ available for merged pipelines [1]). Otherwise we use the
+ 'CI_MERGE_REQUEST_DIFF_BASE_SHA' variable.
+
+ [1]: https://docs.gitlab.com/ee/ci/variables/predefined_variables.html#predefined-variables-for-merge-request-pipelines
+
Signed-off-by: Karthik Nayak <karthik.188@gmail.com>
## .github/workflows/check-style.yml (new) ##
@@ .gitlab-ci.yml: check-whitespace:
+ before_script:
+ - ./ci/install-dependencies.sh
+ script:
-+ - ./ci/run-style-check.sh "$CI_MERGE_REQUEST_DIFF_BASE_SHA"
++ - |
++ if [ -z ${CI_MERGE_REQUEST_TARGET_BRANCH_SHA} ]; then
++ ./ci/run-style-check.sh "$CI_MERGE_REQUEST_DIFF_BASE_SHA"
++ else
++ ./ci/run-style-check.sh "$CI_MERGE_REQUEST_TARGET_BRANCH_SHA"
++ fi
+ rules:
+ - if: $CI_PIPELINE_SOURCE == 'merge_request_event'
+
@@ ci/install-dependencies.sh: ubuntu-*)
## ci/run-style-check.sh (new) ##
@@
-+#!/usr/bin/env sh
++#!/bin/sh
+#
+# Perform style check
+#
8: c6d07402af < -: ---------- check-whitespace: detect if no base_commit is provided
-: ---------- > 8: caccbf8264 check-whitespace: detect if no base_commit is provided
--
2.45.1
^ permalink raw reply [flat|nested] 127+ messages in thread
* [PATCH v2 1/8] clang-format: indent preprocessor directives after hash
2024-07-11 8:30 ` [PATCH v2 " Karthik Nayak
@ 2024-07-11 8:30 ` Karthik Nayak
2024-07-11 8:30 ` [PATCH v2 2/8] clang-format: avoid spacing around bitfield colon Karthik Nayak
` (8 subsequent siblings)
9 siblings, 0 replies; 127+ messages in thread
From: Karthik Nayak @ 2024-07-11 8:30 UTC (permalink / raw)
To: karthik.188; +Cc: chriscool, git, jltobler
We do not have a rule around the indentation of preprocessor directives.
This was also discussed on the list [1], noting how there is often
inconsistency in the styling. While there was discussion, there was no
conclusion around what is the preferred style here. One style being
indenting after the hash:
#if FOO
# if BAR
# include <foo>
# endif
#endif
The other being before the hash:
#if FOO
#if BAR
#include <foo>
#endif
#endif
Let's pick the former and add 'IndentPPDirectives: AfterHash' value to
our '.clang-format'. There is no clear reason to pick one over the
other, but it would definitely be nicer to be consistent.
[1]: https://lore.kernel.org/r/xmqqwmmm1bw6.fsf@gitster.g
Signed-off-by: Karthik Nayak <karthik.188@gmail.com>
---
.clang-format | 6 ++++++
1 file changed, 6 insertions(+)
diff --git a/.clang-format b/.clang-format
index 3ed4fac753..5e128519bf 100644
--- a/.clang-format
+++ b/.clang-format
@@ -96,6 +96,12 @@ BreakStringLiterals: false
# Switch statement body is always indented one level more than case labels.
IndentCaseLabels: false
+# Indents directives before the hash.
+# #if FOO
+# # include <foo>
+# #endif
+IndentPPDirectives: AfterHash
+
# Don't indent a function definition or declaration if it is wrapped after the
# type
IndentWrappedFunctionNames: false
--
2.45.1
^ permalink raw reply related [flat|nested] 127+ messages in thread
* [PATCH v2 2/8] clang-format: avoid spacing around bitfield colon
2024-07-11 8:30 ` [PATCH v2 " Karthik Nayak
2024-07-11 8:30 ` [PATCH v2 1/8] clang-format: indent preprocessor directives after hash Karthik Nayak
@ 2024-07-11 8:30 ` Karthik Nayak
2024-07-11 8:30 ` [PATCH v2 3/8] clang-format: ensure files end with newlines Karthik Nayak
` (7 subsequent siblings)
9 siblings, 0 replies; 127+ messages in thread
From: Karthik Nayak @ 2024-07-11 8:30 UTC (permalink / raw)
To: karthik.188; +Cc: chriscool, git, jltobler
The spacing around colons is currently not standardized and as such we
have the following practices in our code base:
- Spacing around the colon `int bf : 1`: 146 instances
- No spacing around the colon `int bf:1`: 148 instances
- Spacing before the colon `int bf :1`: 6 instances
- Spacing after the colon `int bf: 1`: 12 instances
Let's formalize this by picking the most followed pattern and add the
corresponding style to '.clang-format'.
Signed-off-by: Karthik Nayak <karthik.188@gmail.com>
---
.clang-format | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/.clang-format b/.clang-format
index 5e128519bf..803b274dd5 100644
--- a/.clang-format
+++ b/.clang-format
@@ -72,6 +72,10 @@ AlwaysBreakAfterReturnType: None
BinPackArguments: true
BinPackParameters: true
+# Add no space around the bit field
+# unsigned bf:2;
+BitFieldColonSpacing: None
+
# Attach braces to surrounding context except break before braces on function
# definitions.
# void foo()
--
2.45.1
^ permalink raw reply related [flat|nested] 127+ messages in thread
* [PATCH v2 3/8] clang-format: ensure files end with newlines
2024-07-11 8:30 ` [PATCH v2 " Karthik Nayak
2024-07-11 8:30 ` [PATCH v2 1/8] clang-format: indent preprocessor directives after hash Karthik Nayak
2024-07-11 8:30 ` [PATCH v2 2/8] clang-format: avoid spacing around bitfield colon Karthik Nayak
@ 2024-07-11 8:30 ` Karthik Nayak
2024-07-11 8:30 ` [PATCH v2 4/8] clang-format: replace deprecated option with 'SpacesInParens' Karthik Nayak
` (6 subsequent siblings)
9 siblings, 0 replies; 127+ messages in thread
From: Karthik Nayak @ 2024-07-11 8:30 UTC (permalink / raw)
To: karthik.188; +Cc: chriscool, git, jltobler
All our source files end with a newline, let's formalize in
'.clang-format'.
Signed-off-by: Karthik Nayak <karthik.188@gmail.com>
---
.clang-format | 3 +++
1 file changed, 3 insertions(+)
diff --git a/.clang-format b/.clang-format
index 803b274dd5..4c9751a9db 100644
--- a/.clang-format
+++ b/.clang-format
@@ -106,6 +106,9 @@ IndentCaseLabels: false
# #endif
IndentPPDirectives: AfterHash
+# Insert a newline at end of file if missing
+InsertNewlineAtEOF: true
+
# Don't indent a function definition or declaration if it is wrapped after the
# type
IndentWrappedFunctionNames: false
--
2.45.1
^ permalink raw reply related [flat|nested] 127+ messages in thread
* [PATCH v2 4/8] clang-format: replace deprecated option with 'SpacesInParens'
2024-07-11 8:30 ` [PATCH v2 " Karthik Nayak
` (2 preceding siblings ...)
2024-07-11 8:30 ` [PATCH v2 3/8] clang-format: ensure files end with newlines Karthik Nayak
@ 2024-07-11 8:30 ` Karthik Nayak
2024-07-11 8:30 ` [PATCH v2 5/8] clang-format: avoid braces on simple single-statement bodies Karthik Nayak
` (5 subsequent siblings)
9 siblings, 0 replies; 127+ messages in thread
From: Karthik Nayak @ 2024-07-11 8:30 UTC (permalink / raw)
To: karthik.188; +Cc: chriscool, git, jltobler
Replace the deprecated options 'SpacesInParentheses' and
'SpaceInEmptyParentheses' with the newer 'SpacesInParens' option. The
usage is the same.
Signed-off-by: Karthik Nayak <karthik.188@gmail.com>
---
.clang-format | 9 ++++-----
1 file changed, 4 insertions(+), 5 deletions(-)
diff --git a/.clang-format b/.clang-format
index 4c9751a9db..914254a29b 100644
--- a/.clang-format
+++ b/.clang-format
@@ -134,8 +134,6 @@ SpaceBeforeAssignmentOperators: true
# }
SpaceBeforeParens: ControlStatements
-# Don't insert spaces inside empty '()'
-SpaceInEmptyParentheses: false
# The number of spaces before trailing line comments (// - comments).
# This does not affect trailing block comments (/* - comments).
@@ -149,9 +147,10 @@ SpacesInCStyleCastParentheses: false
# var arr = [1, 2, 3]; not var arr = [ 1, 2, 3 ];
SpacesInContainerLiterals: false
-# Don't insert spaces after '(' or before ')'
-# f(arg); not f( arg );
-SpacesInParentheses: false
+SpacesInParens: Custom
+SpacesInParensOptions:
+ # Don't insert spaces inside empty '()'
+ InEmptyParentheses: false
# Don't insert spaces after '[' or before ']'
# int a[5]; not int a[ 5 ];
--
2.45.1
^ permalink raw reply related [flat|nested] 127+ messages in thread
* [PATCH v2 5/8] clang-format: avoid braces on simple single-statement bodies
2024-07-11 8:30 ` [PATCH v2 " Karthik Nayak
` (3 preceding siblings ...)
2024-07-11 8:30 ` [PATCH v2 4/8] clang-format: replace deprecated option with 'SpacesInParens' Karthik Nayak
@ 2024-07-11 8:30 ` Karthik Nayak
2024-07-11 16:40 ` Junio C Hamano
2024-07-11 8:30 ` [PATCH v2 6/8] clang-format: formalize some of the spacing rules Karthik Nayak
` (4 subsequent siblings)
9 siblings, 1 reply; 127+ messages in thread
From: Karthik Nayak @ 2024-07-11 8:30 UTC (permalink / raw)
To: karthik.188; +Cc: chriscool, git, jltobler
Set the 'RemoveBracesLLVM' to 'true' which ensures that we avoid curly
braces for single-statement bodies in conditional blocks.
This option does come with two warnings:
This option will be renamed and expanded to support other styles.
and
Setting this option to true could lead to incorrect code formatting
due to clang-format’s lack of complete semantic information. As
such, extra care should be taken to review code changes made by
this option.
The latter seems to be of concern. But since we only use clang-format to
verify the format and not to apply formatting, we should be okay here.
Signed-off-by: Karthik Nayak <karthik.188@gmail.com>
---
.clang-format | 6 ++++++
1 file changed, 6 insertions(+)
diff --git a/.clang-format b/.clang-format
index 914254a29b..8b75dece80 100644
--- a/.clang-format
+++ b/.clang-format
@@ -117,6 +117,12 @@ IndentWrappedFunctionNames: false
# int *a;
PointerAlignment: Right
+# Remove optional braces of control statements (if, else, for, and while)
+# according to the LLVM coding style. This avoids braces on simple
+# single-statement bodies of statements but keeps braces if one side of
+# if/else if/.../else cascade has multi-statement body.
+RemoveBracesLLVM: true
+
# Don't insert a space after a cast
# x = (int32)y; not x = (int32) y;
SpaceAfterCStyleCast: false
--
2.45.1
^ permalink raw reply related [flat|nested] 127+ messages in thread
* [PATCH v2 6/8] clang-format: formalize some of the spacing rules
2024-07-11 8:30 ` [PATCH v2 " Karthik Nayak
` (4 preceding siblings ...)
2024-07-11 8:30 ` [PATCH v2 5/8] clang-format: avoid braces on simple single-statement bodies Karthik Nayak
@ 2024-07-11 8:30 ` Karthik Nayak
2024-07-11 8:30 ` [PATCH v2 7/8] ci: run style check on GitHub and GitLab Karthik Nayak
` (3 subsequent siblings)
9 siblings, 0 replies; 127+ messages in thread
From: Karthik Nayak @ 2024-07-11 8:30 UTC (permalink / raw)
To: karthik.188; +Cc: chriscool, git, jltobler
There are some spacing rules that we follow in the project and it makes
sense to formalize them:
* Ensure there is no space inserted after the logical not '!' operator.
* Ensure there is no space before the case statement's colon.
* Ensure there is no space before the first bracket '[' of an array.
* Ensure there is no space in empty blocks.
Signed-off-by: Karthik Nayak <karthik.188@gmail.com>
---
.clang-format | 14 ++++++++++++++
1 file changed, 14 insertions(+)
diff --git a/.clang-format b/.clang-format
index 8b75dece80..68c10f03da 100644
--- a/.clang-format
+++ b/.clang-format
@@ -127,11 +127,18 @@ RemoveBracesLLVM: true
# x = (int32)y; not x = (int32) y;
SpaceAfterCStyleCast: false
+# No space is inserted after the logical not operator
+SpaceAfterLogicalNot: false
+
# Insert spaces before and after assignment operators
# int a = 5; not int a=5;
# a += 42; a+=42;
SpaceBeforeAssignmentOperators: true
+# Spaces will be removed before case colon.
+# case 1: break; not case 1 : break;
+SpaceBeforeCaseColon: false
+
# Put a space before opening parentheses only after control statement keywords.
# void f() {
# if (true) {
@@ -140,6 +147,13 @@ SpaceBeforeAssignmentOperators: true
# }
SpaceBeforeParens: ControlStatements
+# No space before first '[' in arrays
+# int a[5][5]; not int a [5][5];
+SpaceBeforeSquareBrackets: false
+
+# No space will be inserted into {}
+# while (true) {} not while (true) { }
+SpaceInEmptyBlock: false
# The number of spaces before trailing line comments (// - comments).
# This does not affect trailing block comments (/* - comments).
--
2.45.1
^ permalink raw reply related [flat|nested] 127+ messages in thread
* [PATCH v2 7/8] ci: run style check on GitHub and GitLab
2024-07-11 8:30 ` [PATCH v2 " Karthik Nayak
` (5 preceding siblings ...)
2024-07-11 8:30 ` [PATCH v2 6/8] clang-format: formalize some of the spacing rules Karthik Nayak
@ 2024-07-11 8:30 ` Karthik Nayak
2024-07-11 8:30 ` [PATCH v2 8/8] check-whitespace: detect if no base_commit is provided Karthik Nayak
` (2 subsequent siblings)
9 siblings, 0 replies; 127+ messages in thread
From: Karthik Nayak @ 2024-07-11 8:30 UTC (permalink / raw)
To: karthik.188; +Cc: chriscool, git, jltobler
We don't run style checks on our CI, even though we have a
'.clang-format' setup in the repository. Let's add one, the job will
validate only against the new commits added and will only run on merge
requests. Since we're introducing it for the first time, let's allow
this job to fail, so we can validate if this is useful and eventually
enforce it.
For GitLab, we use the 'CI_MERGE_REQUEST_TARGET_BRANCH_SHA' variable by
default to obtain the base SHA of the merged pipeline (which is only
available for merged pipelines [1]). Otherwise we use the
'CI_MERGE_REQUEST_DIFF_BASE_SHA' variable.
[1]: https://docs.gitlab.com/ee/ci/variables/predefined_variables.html#predefined-variables-for-merge-request-pipelines
Signed-off-by: Karthik Nayak <karthik.188@gmail.com>
---
.github/workflows/check-style.yml | 29 +++++++++++++++++++++++++++++
.gitlab-ci.yml | 17 +++++++++++++++++
ci/install-dependencies.sh | 2 +-
ci/run-style-check.sh | 8 ++++++++
4 files changed, 55 insertions(+), 1 deletion(-)
create mode 100644 .github/workflows/check-style.yml
create mode 100755 ci/run-style-check.sh
diff --git a/.github/workflows/check-style.yml b/.github/workflows/check-style.yml
new file mode 100644
index 0000000000..27276dfe5e
--- /dev/null
+++ b/.github/workflows/check-style.yml
@@ -0,0 +1,29 @@
+name: check-style
+
+# Get the repository with all commits to ensure that we can analyze
+# all of the commits contributed via the Pull Request.
+
+on:
+ pull_request:
+ types: [opened, synchronize]
+
+# Avoid unnecessary builds. Unlike the main CI jobs, these are not
+# ci-configurable (but could be).
+concurrency:
+ group: ${{ github.workflow }}-${{ github.ref }}
+ cancel-in-progress: true
+
+jobs:
+ check-style:
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/checkout@v4
+ with:
+ fetch-depth: 0
+
+ - name: git clang-format
+ continue-on-error: true
+ id: check_out
+ run: |
+ ./ci/run-style-check.sh \
+ "${{github.event.pull_request.base.sha}}"
diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 37b991e080..dc43fc8ba8 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -123,6 +123,23 @@ check-whitespace:
rules:
- if: $CI_PIPELINE_SOURCE == 'merge_request_event'
+check-style:
+ image: ubuntu:latest
+ allow_failure: true
+ variables:
+ CC: clang
+ before_script:
+ - ./ci/install-dependencies.sh
+ script:
+ - |
+ if [ -z ${CI_MERGE_REQUEST_TARGET_BRANCH_SHA} ]; then
+ ./ci/run-style-check.sh "$CI_MERGE_REQUEST_DIFF_BASE_SHA"
+ else
+ ./ci/run-style-check.sh "$CI_MERGE_REQUEST_TARGET_BRANCH_SHA"
+ fi
+ rules:
+ - if: $CI_PIPELINE_SOURCE == 'merge_request_event'
+
documentation:
image: ubuntu:latest
variables:
diff --git a/ci/install-dependencies.sh b/ci/install-dependencies.sh
index 6ec0f85972..46fe12a690 100755
--- a/ci/install-dependencies.sh
+++ b/ci/install-dependencies.sh
@@ -43,7 +43,7 @@ ubuntu-*)
make libssl-dev libcurl4-openssl-dev libexpat-dev wget sudo default-jre \
tcl tk gettext zlib1g-dev perl-modules liberror-perl libauthen-sasl-perl \
libemail-valid-perl libio-pty-perl libio-socket-ssl-perl libnet-smtp-ssl-perl libdbd-sqlite3-perl libcgi-pm-perl \
- ${CC_PACKAGE:-${CC:-gcc}} $PYTHON_PACKAGE
+ ${CC_PACKAGE:-${CC:-gcc}} $PYTHON_PACKAGE clang-format
mkdir --parents "$CUSTOM_PATH"
wget --quiet --directory-prefix="$CUSTOM_PATH" \
diff --git a/ci/run-style-check.sh b/ci/run-style-check.sh
new file mode 100755
index 0000000000..76dd37d22b
--- /dev/null
+++ b/ci/run-style-check.sh
@@ -0,0 +1,8 @@
+#!/bin/sh
+#
+# Perform style check
+#
+
+baseCommit=$1
+
+git clang-format --style file --diff --extensions c,h "$baseCommit"
--
2.45.1
^ permalink raw reply related [flat|nested] 127+ messages in thread
* [PATCH v2 8/8] check-whitespace: detect if no base_commit is provided
2024-07-11 8:30 ` [PATCH v2 " Karthik Nayak
` (6 preceding siblings ...)
2024-07-11 8:30 ` [PATCH v2 7/8] ci: run style check on GitHub and GitLab Karthik Nayak
@ 2024-07-11 8:30 ` Karthik Nayak
2024-07-11 14:48 ` Justin Tobler
2024-07-11 18:11 ` [PATCH v2 0/8] clang-format: add more rules and enable on CI Junio C Hamano
2024-07-13 13:45 ` [PATCH v3 " Karthik Nayak
9 siblings, 1 reply; 127+ messages in thread
From: Karthik Nayak @ 2024-07-11 8:30 UTC (permalink / raw)
To: karthik.188; +Cc: chriscool, git, jltobler
The 'check-whitespace' CI script exits gracefully if no base commit is
provided or if an invalid revision is provided. This is not good because
if a particular CI provides an incorrect base_commit, it would fail
successfully.
This is exactly the case with the GitLab CI. The CI is using the
"$CI_MERGE_REQUEST_TARGET_BRANCH_SHA" variable to get the base commit
SHA, but variable is only defined for _merged_ pipelines. So it is empty
for regular pipelines [1]. This should've failed the check-whitespace
job.
Let's fallback to 'CI_MERGE_REQUEST_DIFF_BASE_SHA' if
"CI_MERGE_REQUEST_TARGET_BRANCH_SHA" isn't available in GitLab CI,
similar to the previous commit. Let's also add a check for incorrect
base_commit in the 'check-whitespace.sh' script. While here, fix a small
typo too.
[1]: https://docs.gitlab.com/ee/ci/variables/predefined_variables.html#predefined-variables-for-merge-request-pipelines
Signed-off-by: Karthik Nayak <karthik.188@gmail.com>
---
.gitlab-ci.yml | 7 ++++++-
ci/check-whitespace.sh | 10 ++++++++--
2 files changed, 14 insertions(+), 3 deletions(-)
diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index dc43fc8ba8..c5a18f655a 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -119,7 +119,12 @@ check-whitespace:
before_script:
- ./ci/install-dependencies.sh
script:
- - ./ci/check-whitespace.sh "$CI_MERGE_REQUEST_TARGET_BRANCH_SHA"
+ - |
+ if [ -z ${CI_MERGE_REQUEST_TARGET_BRANCH_SHA} ]; then
+ ./ci/check-whitespace.sh "$CI_MERGE_REQUEST_DIFF_BASE_SHA"
+ else
+ ./ci/check-whitespace.sh "$CI_MERGE_REQUEST_TARGET_BRANCH_SHA"
+ fi
rules:
- if: $CI_PIPELINE_SOURCE == 'merge_request_event'
diff --git a/ci/check-whitespace.sh b/ci/check-whitespace.sh
index db399097a5..c40804394c 100755
--- a/ci/check-whitespace.sh
+++ b/ci/check-whitespace.sh
@@ -9,7 +9,7 @@ baseCommit=$1
outputFile=$2
url=$3
-if test "$#" -ne 1 && test "$#" -ne 3
+if test "$#" -ne 1 && test "$#" -ne 3 || test -z "$1"
then
echo "USAGE: $0 <BASE_COMMIT> [<OUTPUT_FILE> <URL>]"
exit 1
@@ -21,6 +21,12 @@ commitText=
commitTextmd=
goodParent=
+if ! git rev-parse --quiet --verify "${baseCommit}"
+then
+ echo "Invalid <BASE_COMMIT> '${baseCommit}'"
+ exit 1
+fi
+
while read dash sha etc
do
case "${dash}" in
@@ -67,7 +73,7 @@ then
goodParent=${baseCommit: 0:7}
fi
- echo "A whitespace issue was found in onen of more of the commits."
+ echo "A whitespace issue was found in one or more of the commits."
echo "Run the following command to resolve whitespace issues:"
echo "git rebase --whitespace=fix ${goodParent}"
--
2.45.1
^ permalink raw reply related [flat|nested] 127+ messages in thread
* Re: [PATCH 8/8] check-whitespace: detect if no base_commit is provided
2024-07-11 8:27 ` Karthik Nayak
@ 2024-07-11 14:41 ` Junio C Hamano
0 siblings, 0 replies; 127+ messages in thread
From: Junio C Hamano @ 2024-07-11 14:41 UTC (permalink / raw)
To: Karthik Nayak; +Cc: git, jltobler, chriscool
Karthik Nayak <karthik.188@gmail.com> writes:
>> I was commenting on the exit status check done here:
>>
>> +gitLogOutput=$(git log --check --pretty=format:"---% h% s" "${baseCommit}"..)
>> +if test $? -ne 0
>> +then
>> + echo -n $gitLogOutput
>> + exit 1
>> +fi
>>
>> Even though the output is captured in a variable, the exit status of
>> "git log --check" is still seen by the shell and "if test $? = 0"
>> next line say "ah, the thing exited with non-zero status so lets
>> echo the whole thing and exit with 1", before it gets to the while
>> loop we have below the above piece of code, no?
>
> My bad, I thought you were referring to the code before my changes. Yes,
> here you're right, we don't need the check since the shell would capture
> the non-zero status.
OK.
Because in the next round, you'd be checking the error condition
of "git rev-parse $baseCommit" or something that is specifically
designed to check the validity of user input, and not the error
result from the actual "log --check", the above becomes moot ;-)
Thanks.
^ permalink raw reply [flat|nested] 127+ messages in thread
* Re: [PATCH v2 8/8] check-whitespace: detect if no base_commit is provided
2024-07-11 8:30 ` [PATCH v2 8/8] check-whitespace: detect if no base_commit is provided Karthik Nayak
@ 2024-07-11 14:48 ` Justin Tobler
2024-07-11 16:16 ` Junio C Hamano
0 siblings, 1 reply; 127+ messages in thread
From: Justin Tobler @ 2024-07-11 14:48 UTC (permalink / raw)
To: Karthik Nayak; +Cc: chriscool, git
On 24/07/11 10:30AM, Karthik Nayak wrote:
> The 'check-whitespace' CI script exits gracefully if no base commit is
> provided or if an invalid revision is provided. This is not good because
> if a particular CI provides an incorrect base_commit, it would fail
> successfully.
>
> This is exactly the case with the GitLab CI. The CI is using the
> "$CI_MERGE_REQUEST_TARGET_BRANCH_SHA" variable to get the base commit
> SHA, but variable is only defined for _merged_ pipelines. So it is empty
> for regular pipelines [1]. This should've failed the check-whitespace
> job.
>
> Let's fallback to 'CI_MERGE_REQUEST_DIFF_BASE_SHA' if
> "CI_MERGE_REQUEST_TARGET_BRANCH_SHA" isn't available in GitLab CI,
> similar to the previous commit. Let's also add a check for incorrect
> base_commit in the 'check-whitespace.sh' script. While here, fix a small
> typo too.
>
> [1]: https://docs.gitlab.com/ee/ci/variables/predefined_variables.html#predefined-variables-for-merge-request-pipelines
>
> Signed-off-by: Karthik Nayak <karthik.188@gmail.com>
> ---
> .gitlab-ci.yml | 7 ++++++-
> ci/check-whitespace.sh | 10 ++++++++--
> 2 files changed, 14 insertions(+), 3 deletions(-)
>
> diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
> index dc43fc8ba8..c5a18f655a 100644
> --- a/.gitlab-ci.yml
> +++ b/.gitlab-ci.yml
> @@ -119,7 +119,12 @@ check-whitespace:
> before_script:
> - ./ci/install-dependencies.sh
> script:
> - - ./ci/check-whitespace.sh "$CI_MERGE_REQUEST_TARGET_BRANCH_SHA"
> + - |
> + if [ -z ${CI_MERGE_REQUEST_TARGET_BRANCH_SHA} ]; then
> + ./ci/check-whitespace.sh "$CI_MERGE_REQUEST_DIFF_BASE_SHA"
> + else
> + ./ci/check-whitespace.sh "$CI_MERGE_REQUEST_TARGET_BRANCH_SHA"
> + fi
Not worth a reroll, but it would be nice to have a comment here
explaining why we have this fallback as, to me at least, it is not very
obvious.
> rules:
> - if: $CI_PIPELINE_SOURCE == 'merge_request_event'
>
[snip]
Overall the GitLab CI changes look good to me. Thanks :)
-Justin
^ permalink raw reply [flat|nested] 127+ messages in thread
* Re: [PATCH v2 8/8] check-whitespace: detect if no base_commit is provided
2024-07-11 14:48 ` Justin Tobler
@ 2024-07-11 16:16 ` Junio C Hamano
2024-07-12 8:51 ` Karthik Nayak
0 siblings, 1 reply; 127+ messages in thread
From: Junio C Hamano @ 2024-07-11 16:16 UTC (permalink / raw)
To: Justin Tobler; +Cc: Karthik Nayak, chriscool, git
Justin Tobler <jltobler@gmail.com> writes:
>> + if [ -z ${CI_MERGE_REQUEST_TARGET_BRANCH_SHA} ]; then
>> + ./ci/check-whitespace.sh "$CI_MERGE_REQUEST_DIFF_BASE_SHA"
>> + else
>> + ./ci/check-whitespace.sh "$CI_MERGE_REQUEST_TARGET_BRANCH_SHA"
>> + fi
>
> Not worth a reroll, but it would be nice to have a comment here
> explaining why we have this fallback as, to me at least, it is not very
> obvious.
FWIW, it is not obvious to me, either ;-)
Another thing that I find somewhat disturbing is that the
conditional seems the other way around. It shouldn't be saying "If
B is not available, use A, otherwise use B", as if A is known to be
usable always. It should be more like
if test -n "$CI_MERGE_REQUEST_DIFF_BASE_SHA"
then
ci/check-whitespace.sh "$CI_MERGE_REQUEST_DIFF_BASE_SHA"
elif test -n "$CI_MERGE_REQUEST_TARGET_BRANCH_SHA"
then
ci/check-whitespace.sh "$CI_MERGE_REQUEST_TARGET_BRANCH_SHA"
else
... noop? barf? ...
fi
shouldn't it?
>> rules:
>> - if: $CI_PIPELINE_SOURCE == 'merge_request_event'
>>
> [snip]
>
> Overall the GitLab CI changes look good to me. Thanks :)
Thanks for a review. Very much appreciated.
^ permalink raw reply [flat|nested] 127+ messages in thread
* Re: [PATCH v2 5/8] clang-format: avoid braces on simple single-statement bodies
2024-07-11 8:30 ` [PATCH v2 5/8] clang-format: avoid braces on simple single-statement bodies Karthik Nayak
@ 2024-07-11 16:40 ` Junio C Hamano
2024-07-12 8:48 ` Karthik Nayak
0 siblings, 1 reply; 127+ messages in thread
From: Junio C Hamano @ 2024-07-11 16:40 UTC (permalink / raw)
To: Karthik Nayak; +Cc: chriscool, git, jltobler
Karthik Nayak <karthik.188@gmail.com> writes:
> Setting this option to true could lead to incorrect code formatting
> due to clang-format’s lack of complete semantic information. As
> such, extra care should be taken to review code changes made by
> this option.
>
> The latter seems to be of concern. But since we only use clang-format to
> verify the format and not to apply formatting, we should be okay here.
Hmph. Could you tell me where I can read more about "we tell
clang-format only to verify but not to apply"? If that is truely
the case, perhaps I shouldn't be worried to much, but it is not
clear to me how we enforce that this is to be used only for
verification with non-zero false positive, and never for
reformatting before submission.
The senario I was worried about was this. We aadd to .clang-format
that is in-tree, and not just CI jobs but our human contributors may
use it to check what they newly wrote before committing and they may
even take the differences as suggested fixes (which may end up
breaking their working code).
Thanks.
^ permalink raw reply [flat|nested] 127+ messages in thread
* Re: [PATCH v2 0/8] clang-format: add more rules and enable on CI
2024-07-11 8:30 ` [PATCH v2 " Karthik Nayak
` (7 preceding siblings ...)
2024-07-11 8:30 ` [PATCH v2 8/8] check-whitespace: detect if no base_commit is provided Karthik Nayak
@ 2024-07-11 18:11 ` Junio C Hamano
2024-07-13 13:45 ` [PATCH v3 " Karthik Nayak
9 siblings, 0 replies; 127+ messages in thread
From: Junio C Hamano @ 2024-07-11 18:11 UTC (permalink / raw)
To: Karthik Nayak; +Cc: chriscool, git, jltobler
Karthik Nayak <karthik.188@gmail.com> writes:
> This is v2 of my series to add clang-format to the CI.
Aside from a few comments, the series looked good.
Will queue. Thanks.
^ permalink raw reply [flat|nested] 127+ messages in thread
* Re: [PATCH v2 5/8] clang-format: avoid braces on simple single-statement bodies
2024-07-11 16:40 ` Junio C Hamano
@ 2024-07-12 8:48 ` Karthik Nayak
2024-07-12 15:09 ` Junio C Hamano
0 siblings, 1 reply; 127+ messages in thread
From: Karthik Nayak @ 2024-07-12 8:48 UTC (permalink / raw)
To: Junio C Hamano; +Cc: chriscool, git, jltobler
[-- Attachment #1: Type: text/plain, Size: 1962 bytes --]
Junio C Hamano <gitster@pobox.com> writes:
> Karthik Nayak <karthik.188@gmail.com> writes:
>
>> Setting this option to true could lead to incorrect code formatting
>> due to clang-format’s lack of complete semantic information. As
>> such, extra care should be taken to review code changes made by
>> this option.
>>
>> The latter seems to be of concern. But since we only use clang-format to
>> verify the format and not to apply formatting, we should be okay here.
>
> Hmph. Could you tell me where I can read more about "we tell
> clang-format only to verify but not to apply"? If that is truely
> the case, perhaps I shouldn't be worried to much, but it is not
> clear to me how we enforce that this is to be used only for
> verification with non-zero false positive, and never for
> reformatting before submission.
>
I was referring to the fact that, we expose '.clang-format' via 'make
style' which only prints the diff to the STDOUT. The user has to still
manually make these changes.
However users could be using tools to auto-format on save and this could
be an issue.
> The senario I was worried about was this. We aadd to .clang-format
> that is in-tree, and not just CI jobs but our human contributors may
> use it to check what they newly wrote before committing and they may
> even take the differences as suggested fixes (which may end up
> breaking their working code).
>
> Thanks.
I totally see your point here.
If the contributors do end up with bad formatting because clang messed
it up, that is an okay situation, since that shouldn't happen often, and
when it does, it would be the same situation as without this check,
wherein we rely on reviewers. The issue is whether it would break their
code, I couldn't find anything on this.
But overall, while I personally find this check useful, I'm happy to
drop it, My goal is to ensure we run this on CI as a first step :)
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 690 bytes --]
^ permalink raw reply [flat|nested] 127+ messages in thread
* Re: [PATCH v2 8/8] check-whitespace: detect if no base_commit is provided
2024-07-11 16:16 ` Junio C Hamano
@ 2024-07-12 8:51 ` Karthik Nayak
2024-07-12 15:12 ` Junio C Hamano
0 siblings, 1 reply; 127+ messages in thread
From: Karthik Nayak @ 2024-07-12 8:51 UTC (permalink / raw)
To: Junio C Hamano, Justin Tobler; +Cc: chriscool, git
[-- Attachment #1: Type: text/plain, Size: 1531 bytes --]
Junio C Hamano <gitster@pobox.com> writes:
> Justin Tobler <jltobler@gmail.com> writes:
>
>>> + if [ -z ${CI_MERGE_REQUEST_TARGET_BRANCH_SHA} ]; then
>>> + ./ci/check-whitespace.sh "$CI_MERGE_REQUEST_DIFF_BASE_SHA"
>>> + else
>>> + ./ci/check-whitespace.sh "$CI_MERGE_REQUEST_TARGET_BRANCH_SHA"
>>> + fi
>>
>> Not worth a reroll, but it would be nice to have a comment here
>> explaining why we have this fallback as, to me at least, it is not very
>> obvious.
>
> FWIW, it is not obvious to me, either ;-)
>
> Another thing that I find somewhat disturbing is that the
> conditional seems the other way around. It shouldn't be saying "If
> B is not available, use A, otherwise use B", as if A is known to be
> usable always. It should be more like
>
> if test -n "$CI_MERGE_REQUEST_DIFF_BASE_SHA"
> then
> ci/check-whitespace.sh "$CI_MERGE_REQUEST_DIFF_BASE_SHA"
> elif test -n "$CI_MERGE_REQUEST_TARGET_BRANCH_SHA"
> then
> ci/check-whitespace.sh "$CI_MERGE_REQUEST_TARGET_BRANCH_SHA"
> else
> ... noop? barf? ...
> fi
>
> shouldn't it?
>
Agreed, that a comment would be nice here. Will add if I reroll!
In this case A ("$CI_MERGE_REQUEST_DIFF_BASE_SHA") is known to be usable
always [1].
[1]: https://docs.gitlab.com/ee/ci/variables/predefined_variables.html
>>> rules:
>>> - if: $CI_PIPELINE_SOURCE == 'merge_request_event'
>>>
>> [snip]
>>
>> Overall the GitLab CI changes look good to me. Thanks :)
>
> Thanks for a review. Very much appreciated.
Thanks both of you!
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 690 bytes --]
^ permalink raw reply [flat|nested] 127+ messages in thread
* Re: [PATCH v2 5/8] clang-format: avoid braces on simple single-statement bodies
2024-07-12 8:48 ` Karthik Nayak
@ 2024-07-12 15:09 ` Junio C Hamano
2024-07-12 15:29 ` Phillip Wood
0 siblings, 1 reply; 127+ messages in thread
From: Junio C Hamano @ 2024-07-12 15:09 UTC (permalink / raw)
To: Karthik Nayak; +Cc: chriscool, git, jltobler
Karthik Nayak <karthik.188@gmail.com> writes:
> Junio C Hamano <gitster@pobox.com> writes:
>
>> Karthik Nayak <karthik.188@gmail.com> writes:
>>
>>> Setting this option to true could lead to incorrect code formatting
>>> due to clang-format’s lack of complete semantic information. As
>>> such, extra care should be taken to review code changes made by
>>> this option.
>>>
>>> The latter seems to be of concern. But since we only use clang-format to
>>> verify the format and not to apply formatting, we should be okay here.
>>
>> Hmph. Could you tell me where I can read more about "we tell
>> clang-format only to verify but not to apply"? If that is truely
>> the case, perhaps I shouldn't be worried to much, but it is not
>> clear to me how we enforce that this is to be used only for
>> verification with non-zero false positive, and never for
>> reformatting before submission.
>>
>
> I was referring to the fact that, we expose '.clang-format' via 'make
> style' which only prints the diff to the STDOUT. The user has to still
> manually make these changes.
>
> However users could be using tools to auto-format on save and this could
> be an issue.
Yes.
Of course if we really wanted to avoid end-user confusion and still
want to have this in CI (if only to see how well the rule fares, and
what the actual false-positive rate is), we _could_ run CI's job
with custom .clang-format file that is not visible to end-users in
their normal checkout, or something silly like that. If we are
going to use it, then we should use it everywhere, making sure
everybody is careful. If the cost of forcing everybody to be
careful is too high, we may want to retract it, but we won't know
until we try.
Thanks.
^ permalink raw reply [flat|nested] 127+ messages in thread
* Re: [PATCH v2 8/8] check-whitespace: detect if no base_commit is provided
2024-07-12 8:51 ` Karthik Nayak
@ 2024-07-12 15:12 ` Junio C Hamano
0 siblings, 0 replies; 127+ messages in thread
From: Junio C Hamano @ 2024-07-12 15:12 UTC (permalink / raw)
To: Karthik Nayak; +Cc: Justin Tobler, chriscool, git
Karthik Nayak <karthik.188@gmail.com> writes:
>> Another thing that I find somewhat disturbing is that the
>> conditional seems the other way around. It shouldn't be saying "If
>> B is not available, use A, otherwise use B", as if A is known to be
>> usable always. It should be more like ...
>> shouldn't it?
>>
>
> Agreed, that a comment would be nice here. Will add if I reroll!
>
> In this case A ("$CI_MERGE_REQUEST_DIFF_BASE_SHA") is known to be usable
> always [1].
>
> [1]: https://docs.gitlab.com/ee/ci/variables/predefined_variables.html
Ok, if so check the one you want to use, if exists, first, and then
fall back to what is supposed to exist always but is your second
choice, e.g.,
if test -n "$CI_MERGE_REQUEST_TARGET_BRANCH_SHA"
then
ci/check-whitespace.sh "$CI_MERGE_REQUEST_TARGET_BRANCH_SHA"
elif
then test -n "$CI_MERGE_REQUEST_DIFF_BASE_SHA"
ci/check-whitespace.sh "$CI_MERGE_REQUEST_DIFF_BASE_SHA"
else
BUG CI_MERGE_REQUEST_DIFF_BASE_SHA should always exist!
fi
Thanks.
^ permalink raw reply [flat|nested] 127+ messages in thread
* Re: [PATCH 5/8] clang-format: avoid braces on simple single-statement bodies
2024-07-08 20:25 ` Karthik Nayak
@ 2024-07-12 15:24 ` Phillip Wood
2024-07-13 12:30 ` Karthik Nayak
0 siblings, 1 reply; 127+ messages in thread
From: Phillip Wood @ 2024-07-12 15:24 UTC (permalink / raw)
To: Karthik Nayak, Junio C Hamano; +Cc: git, jltobler, chriscool
Hi Karthik
On 08/07/2024 21:25, Karthik Nayak wrote:
> Junio C Hamano <gitster@pobox.com> writes:
>
>> Karthik Nayak <karthik.188@gmail.com> writes:
>>
>>> Set the 'RemoveBracesLLVM' to 'true' which ensures that we avoid curly
>>> braces for single-statement bodies in conditional blocks.
>>
>> Hmph, two warnings in its documentation [*] sound ominous, especially
>> the second one that says:
>>
>> Warning
>>
>> Setting this option to true could lead to incorrect code
>> formatting due to clang-format’s lack of complete semantic
>> information. As such, extra care should be taken to review code
>> changes made by this option.
>>
>> which implies it may not necessarily a good idea to add to
>> automation without telling contributors that they may get hit with a
>> false positive (or incorrect rewrite).
>
> Agreed on this one. I'm a bit skeptical to be honest too. I think I
> should have added information about the warning in the commit too. I
> will for next round. Overall, this also contributes to the reason why I
> decided these CI jobs need to be allowed to fail.
I'm a bit confused - what does "allowed to fail" mean? We don't have any
automated requirements on the CI passing. We don't want to train
contributors to routinely ignore CI failures but if they don't get a
notification that this job failed how do they know to correct the
formatting?
>> Reading from the examples in that documentation page, it was unclear
>> how it would handle if/else if/.../else cascade where not all branches
>> are multi-statement blocks, e.g.,
>>
>> if (A) {
>> do_A_thing();
>> } else if (B) {
>> do_B_thing();
>> } else {
>> do_C_things();
>> do_other_things();
>> }
>>
>> but looking around I am getting a feeling that the tool would do the
>> right thing, i.e., to match our preference that is to use {braces}
>> around all branches, if I am not mistaken.
>>
>
> Yup, that was my understanding and what I could see from some quick
> trials that I did too.
>
> It would be a great win to have this though, because it is one of the
> things that always get me.
Yes, having the formatting automated would be really helpful. It is a
shame the documentation doesn't really explain what the issue is (i.e.
when does it generate invalid code) so we don't know how likely we are
to be affected by it.
Best Wishes
Phillip
>>
>> [Reference]
>>
>> * https://releases.llvm.org/16.0.0/tools/clang/docs/ClangFormatStyleOptions.html#:~:text=RemoveBracesLLVM
>>
>>> +# Remove optional braces of control statements (if, else, for, and while)
>>> +# according to the LLVM coding style
>>> +# This avoids braces on simple single-statement bodies of statements.
>>
>> "... but keeps braces if one side of if/else if/.../else cascade has
>> multi-statement body."
>>
>
> Makes sense, will add.
>
>>> +RemoveBracesLLVM: true
>
> Overall I must say, I'd be okay if this patch is also dropped from this
> series.
^ permalink raw reply [flat|nested] 127+ messages in thread
* Re: [PATCH v2 5/8] clang-format: avoid braces on simple single-statement bodies
2024-07-12 15:09 ` Junio C Hamano
@ 2024-07-12 15:29 ` Phillip Wood
0 siblings, 0 replies; 127+ messages in thread
From: Phillip Wood @ 2024-07-12 15:29 UTC (permalink / raw)
To: Junio C Hamano, Karthik Nayak; +Cc: chriscool, git, jltobler
On 12/07/2024 16:09, Junio C Hamano wrote:
> Of course if we really wanted to avoid end-user confusion and still
> want to have this in CI (if only to see how well the rule fares, and
> what the actual false-positive rate is), we _could_ run CI's job
> with custom .clang-format file that is not visible to end-users in
> their normal checkout, or something silly like that.
Getting some idea of how useful the auto-formatter is would be valuable
I think.
> If we are
> going to use it, then we should use it everywhere, making sure
> everybody is careful. If the cost of forcing everybody to be
> careful is too high, we may want to retract it, but we won't know
> until we try.
It would be great if we could find a way to auto-format the code without
inconveniencing contributors.
Best Wishes
Phillip
^ permalink raw reply [flat|nested] 127+ messages in thread
* Re: [PATCH 5/8] clang-format: avoid braces on simple single-statement bodies
2024-07-12 15:24 ` Phillip Wood
@ 2024-07-13 12:30 ` Karthik Nayak
2024-07-13 13:58 ` phillip.wood123
0 siblings, 1 reply; 127+ messages in thread
From: Karthik Nayak @ 2024-07-13 12:30 UTC (permalink / raw)
To: phillip.wood, Junio C Hamano; +Cc: git, jltobler, chriscool
[-- Attachment #1: Type: text/plain, Size: 1903 bytes --]
Phillip Wood <phillip.wood123@gmail.com> writes:
> Hi Karthik
>
> On 08/07/2024 21:25, Karthik Nayak wrote:
>> Junio C Hamano <gitster@pobox.com> writes:
>>
>>> Karthik Nayak <karthik.188@gmail.com> writes:
>>>
>>>> Set the 'RemoveBracesLLVM' to 'true' which ensures that we avoid curly
>>>> braces for single-statement bodies in conditional blocks.
>>>
>>> Hmph, two warnings in its documentation [*] sound ominous, especially
>>> the second one that says:
>>>
>>> Warning
>>>
>>> Setting this option to true could lead to incorrect code
>>> formatting due to clang-format’s lack of complete semantic
>>> information. As such, extra care should be taken to review code
>>> changes made by this option.
>>>
>>> which implies it may not necessarily a good idea to add to
>>> automation without telling contributors that they may get hit with a
>>> false positive (or incorrect rewrite).
>>
>> Agreed on this one. I'm a bit skeptical to be honest too. I think I
>> should have added information about the warning in the commit too. I
>> will for next round. Overall, this also contributes to the reason why I
>> decided these CI jobs need to be allowed to fail.
>
> I'm a bit confused - what does "allowed to fail" mean? We don't have any
> automated requirements on the CI passing. We don't want to train
> contributors to routinely ignore CI failures but if they don't get a
> notification that this job failed how do they know to correct the
> formatting?
>
Well, it mostly means that the CI would show the style-check job as
failed, but the overall pipeline would be successful. We want to ideally
fail the pipeline too, but I'm being careful to not disrupt things
suddenly and I think once we see what false positive rate is and once we
fine tune this settings maybe over the next release or so, we can
enforce this.
[snip]
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 690 bytes --]
^ permalink raw reply [flat|nested] 127+ messages in thread
* [PATCH v3 0/8] clang-format: add more rules and enable on CI
2024-07-11 8:30 ` [PATCH v2 " Karthik Nayak
` (8 preceding siblings ...)
2024-07-11 18:11 ` [PATCH v2 0/8] clang-format: add more rules and enable on CI Junio C Hamano
@ 2024-07-13 13:45 ` Karthik Nayak
2024-07-13 13:45 ` [PATCH v3 1/8] clang-format: indent preprocessor directives after hash Karthik Nayak
` (8 more replies)
9 siblings, 9 replies; 127+ messages in thread
From: Karthik Nayak @ 2024-07-13 13:45 UTC (permalink / raw)
To: karthik.188; +Cc: chriscool, git, jltobler, phillip.wood123
This is v3 of my series to add clang-format to the CI.
The series was mostly inspired by a patch sent recently to 'include
kh_foreach* macros in ForEachMacros' [1]. I was wondering why we don't
run the formatting on CI and reduce some of the workload of reviewers.
We have a '.clang-format' file to provide rules for code formatting.
The commits 1-5 aims to add more rules to the file while deprecating old
ones.
Commit 6 enables CI action on GitHub and GitLab to also check for the
code formatting. Currently, it is allowed to fail. This way we can build
confidence and fine tune the values as needed and finally enforce the
check in a future patch. I'm not well versed with GitHub workflows, and
I mostly tried to copy existing work there. Expecting some feedback in
that section!
Commit 7 fixes an existing issue with the 'check-whitespace' job, which
is failing as success in the GitLab CI.
Commit 8 adds the `RemoveBracesLLVM` only in the context of the CI. If we
decide against it, we could drop this commit from the series.
1: https://lore.kernel.org/git/4e7893f5-2dd9-46cf-8a64-cf780f4e1730@web.de/
Changes against v2:
* Dropped the commit to add 'RemoveBracesLLVM' to the in-tree '.clang-format'.
Now, we only add it in the CI context.
* Added comments for the reasoning and picking of the ENV variables in GitLab's
CI. Also changed the syntax to be more readable.
Karthik Nayak (8):
clang-format: indent preprocessor directives after hash
clang-format: avoid spacing around bitfield colon
clang-format: ensure files end with newlines
clang-format: replace deprecated option with 'SpacesInParens'
clang-format: formalize some of the spacing rules
ci: run style check on GitHub and GitLab
check-whitespace: detect if no base_commit is provided
ci/style-check: add `RemoveBracesLLVM` to '.clang-format'
.clang-format | 36 +++++++++++++++++++++++++----
.github/workflows/check-style.yml | 29 +++++++++++++++++++++++
.gitlab-ci.yml | 38 ++++++++++++++++++++++++++++++-
ci/check-whitespace.sh | 10 ++++++--
ci/install-dependencies.sh | 2 +-
ci/run-style-check.sh | 21 +++++++++++++++++
6 files changed, 127 insertions(+), 9 deletions(-)
create mode 100644 .github/workflows/check-style.yml
create mode 100755 ci/run-style-check.sh
Range-diff against v2:
1: 6cf91ffc86 = 1: 6cf91ffc86 clang-format: indent preprocessor directives after hash
2: beb002885f = 2: beb002885f clang-format: avoid spacing around bitfield colon
3: 3031be43e7 = 3: 3031be43e7 clang-format: ensure files end with newlines
4: bc1550e300 = 4: bc1550e300 clang-format: replace deprecated option with 'SpacesInParens'
5: 840318a4c9 < -: ---------- clang-format: avoid braces on simple single-statement bodies
6: 0ecfd8d24b ! 5: 4586c0094b clang-format: formalize some of the spacing rules
@@ Commit message
Signed-off-by: Karthik Nayak <karthik.188@gmail.com>
## .clang-format ##
-@@ .clang-format: RemoveBracesLLVM: true
+@@ .clang-format: PointerAlignment: Right
# x = (int32)y; not x = (int32) y;
SpaceAfterCStyleCast: false
7: 11a9ac4935 ! 6: c18cb23369 ci: run style check on GitHub and GitLab
@@ .gitlab-ci.yml: check-whitespace:
+ CC: clang
+ before_script:
+ - ./ci/install-dependencies.sh
++ # Since $CI_MERGE_REQUEST_TARGET_BRANCH_SHA is only defined for merged
++ # pipelines, we fallback to $CI_MERGE_REQUEST_DIFF_BASE_SHA, which should
++ # be defined in all pipelines.
+ script:
+ - |
-+ if [ -z ${CI_MERGE_REQUEST_TARGET_BRANCH_SHA} ]; then
++ if test -n "$CI_MERGE_REQUEST_TARGET_BRANCH_SHA"
++ then
++ ./ci/run-style-check.sh "$CI_MERGE_REQUEST_TARGET_BRANCH_SHA"
++ elif test -n "$CI_MERGE_REQUEST_DIFF_BASE_SHA"
++ then
+ ./ci/run-style-check.sh "$CI_MERGE_REQUEST_DIFF_BASE_SHA"
+ else
-+ ./ci/run-style-check.sh "$CI_MERGE_REQUEST_TARGET_BRANCH_SHA"
++ echo "CI_MERGE_REQUEST_DIFF_BASE_SHA should always exist!"; exit 1
+ fi
+ rules:
+ - if: $CI_PIPELINE_SOURCE == 'merge_request_event'
8: caccbf8264 ! 7: 4d08c570bb check-whitespace: detect if no base_commit is provided
@@ Commit message
## .gitlab-ci.yml ##
@@ .gitlab-ci.yml: check-whitespace:
+ image: ubuntu:latest
before_script:
- ./ci/install-dependencies.sh
++ # Since $CI_MERGE_REQUEST_TARGET_BRANCH_SHA is only defined for merged
++ # pipelines, we fallback to $CI_MERGE_REQUEST_DIFF_BASE_SHA, which should
++ # be defined in all pipelines.
script:
- - ./ci/check-whitespace.sh "$CI_MERGE_REQUEST_TARGET_BRANCH_SHA"
+ - |
-+ if [ -z ${CI_MERGE_REQUEST_TARGET_BRANCH_SHA} ]; then
++ if test -n "$CI_MERGE_REQUEST_TARGET_BRANCH_SHA"
++ then
++ ./ci/check-whitespace.sh "$CI_MERGE_REQUEST_TARGET_BRANCH_SHA"
++ elif test -n "$CI_MERGE_REQUEST_DIFF_BASE_SHA"
++ then
+ ./ci/check-whitespace.sh "$CI_MERGE_REQUEST_DIFF_BASE_SHA"
+ else
-+ ./ci/check-whitespace.sh "$CI_MERGE_REQUEST_TARGET_BRANCH_SHA"
++ echo "CI_MERGE_REQUEST_DIFF_BASE_SHA should always exist!"; exit 1
+ fi
rules:
- if: $CI_PIPELINE_SOURCE == 'merge_request_event'
-: ---------- > 8: 2b39431f93 ci/style-check: add `RemoveBracesLLVM` to '.clang-format'
--
2.45.2
^ permalink raw reply [flat|nested] 127+ messages in thread
* [PATCH v3 1/8] clang-format: indent preprocessor directives after hash
2024-07-13 13:45 ` [PATCH v3 " Karthik Nayak
@ 2024-07-13 13:45 ` Karthik Nayak
2024-07-13 13:45 ` [PATCH v3 2/8] clang-format: avoid spacing around bitfield colon Karthik Nayak
` (7 subsequent siblings)
8 siblings, 0 replies; 127+ messages in thread
From: Karthik Nayak @ 2024-07-13 13:45 UTC (permalink / raw)
To: karthik.188; +Cc: chriscool, git, jltobler, phillip.wood123
We do not have a rule around the indentation of preprocessor directives.
This was also discussed on the list [1], noting how there is often
inconsistency in the styling. While there was discussion, there was no
conclusion around what is the preferred style here. One style being
indenting after the hash:
#if FOO
# if BAR
# include <foo>
# endif
#endif
The other being before the hash:
#if FOO
#if BAR
#include <foo>
#endif
#endif
Let's pick the former and add 'IndentPPDirectives: AfterHash' value to
our '.clang-format'. There is no clear reason to pick one over the
other, but it would definitely be nicer to be consistent.
[1]: https://lore.kernel.org/r/xmqqwmmm1bw6.fsf@gitster.g
Signed-off-by: Karthik Nayak <karthik.188@gmail.com>
---
.clang-format | 6 ++++++
1 file changed, 6 insertions(+)
diff --git a/.clang-format b/.clang-format
index 3ed4fac753..5e128519bf 100644
--- a/.clang-format
+++ b/.clang-format
@@ -96,6 +96,12 @@ BreakStringLiterals: false
# Switch statement body is always indented one level more than case labels.
IndentCaseLabels: false
+# Indents directives before the hash.
+# #if FOO
+# # include <foo>
+# #endif
+IndentPPDirectives: AfterHash
+
# Don't indent a function definition or declaration if it is wrapped after the
# type
IndentWrappedFunctionNames: false
--
2.45.2
^ permalink raw reply related [flat|nested] 127+ messages in thread
* [PATCH v3 2/8] clang-format: avoid spacing around bitfield colon
2024-07-13 13:45 ` [PATCH v3 " Karthik Nayak
2024-07-13 13:45 ` [PATCH v3 1/8] clang-format: indent preprocessor directives after hash Karthik Nayak
@ 2024-07-13 13:45 ` Karthik Nayak
2024-07-13 13:45 ` [PATCH v3 3/8] clang-format: ensure files end with newlines Karthik Nayak
` (6 subsequent siblings)
8 siblings, 0 replies; 127+ messages in thread
From: Karthik Nayak @ 2024-07-13 13:45 UTC (permalink / raw)
To: karthik.188; +Cc: chriscool, git, jltobler, phillip.wood123
The spacing around colons is currently not standardized and as such we
have the following practices in our code base:
- Spacing around the colon `int bf : 1`: 146 instances
- No spacing around the colon `int bf:1`: 148 instances
- Spacing before the colon `int bf :1`: 6 instances
- Spacing after the colon `int bf: 1`: 12 instances
Let's formalize this by picking the most followed pattern and add the
corresponding style to '.clang-format'.
Signed-off-by: Karthik Nayak <karthik.188@gmail.com>
---
.clang-format | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/.clang-format b/.clang-format
index 5e128519bf..803b274dd5 100644
--- a/.clang-format
+++ b/.clang-format
@@ -72,6 +72,10 @@ AlwaysBreakAfterReturnType: None
BinPackArguments: true
BinPackParameters: true
+# Add no space around the bit field
+# unsigned bf:2;
+BitFieldColonSpacing: None
+
# Attach braces to surrounding context except break before braces on function
# definitions.
# void foo()
--
2.45.2
^ permalink raw reply related [flat|nested] 127+ messages in thread
* [PATCH v3 3/8] clang-format: ensure files end with newlines
2024-07-13 13:45 ` [PATCH v3 " Karthik Nayak
2024-07-13 13:45 ` [PATCH v3 1/8] clang-format: indent preprocessor directives after hash Karthik Nayak
2024-07-13 13:45 ` [PATCH v3 2/8] clang-format: avoid spacing around bitfield colon Karthik Nayak
@ 2024-07-13 13:45 ` Karthik Nayak
2024-07-13 13:45 ` [PATCH v3 4/8] clang-format: replace deprecated option with 'SpacesInParens' Karthik Nayak
` (5 subsequent siblings)
8 siblings, 0 replies; 127+ messages in thread
From: Karthik Nayak @ 2024-07-13 13:45 UTC (permalink / raw)
To: karthik.188; +Cc: chriscool, git, jltobler, phillip.wood123
All our source files end with a newline, let's formalize in
'.clang-format'.
Signed-off-by: Karthik Nayak <karthik.188@gmail.com>
---
.clang-format | 3 +++
1 file changed, 3 insertions(+)
diff --git a/.clang-format b/.clang-format
index 803b274dd5..4c9751a9db 100644
--- a/.clang-format
+++ b/.clang-format
@@ -106,6 +106,9 @@ IndentCaseLabels: false
# #endif
IndentPPDirectives: AfterHash
+# Insert a newline at end of file if missing
+InsertNewlineAtEOF: true
+
# Don't indent a function definition or declaration if it is wrapped after the
# type
IndentWrappedFunctionNames: false
--
2.45.2
^ permalink raw reply related [flat|nested] 127+ messages in thread
* [PATCH v3 4/8] clang-format: replace deprecated option with 'SpacesInParens'
2024-07-13 13:45 ` [PATCH v3 " Karthik Nayak
` (2 preceding siblings ...)
2024-07-13 13:45 ` [PATCH v3 3/8] clang-format: ensure files end with newlines Karthik Nayak
@ 2024-07-13 13:45 ` Karthik Nayak
2024-07-13 13:45 ` [PATCH v3 5/8] clang-format: formalize some of the spacing rules Karthik Nayak
` (4 subsequent siblings)
8 siblings, 0 replies; 127+ messages in thread
From: Karthik Nayak @ 2024-07-13 13:45 UTC (permalink / raw)
To: karthik.188; +Cc: chriscool, git, jltobler, phillip.wood123
Replace the deprecated options 'SpacesInParentheses' and
'SpaceInEmptyParentheses' with the newer 'SpacesInParens' option. The
usage is the same.
Signed-off-by: Karthik Nayak <karthik.188@gmail.com>
---
.clang-format | 9 ++++-----
1 file changed, 4 insertions(+), 5 deletions(-)
diff --git a/.clang-format b/.clang-format
index 4c9751a9db..914254a29b 100644
--- a/.clang-format
+++ b/.clang-format
@@ -134,8 +134,6 @@ SpaceBeforeAssignmentOperators: true
# }
SpaceBeforeParens: ControlStatements
-# Don't insert spaces inside empty '()'
-SpaceInEmptyParentheses: false
# The number of spaces before trailing line comments (// - comments).
# This does not affect trailing block comments (/* - comments).
@@ -149,9 +147,10 @@ SpacesInCStyleCastParentheses: false
# var arr = [1, 2, 3]; not var arr = [ 1, 2, 3 ];
SpacesInContainerLiterals: false
-# Don't insert spaces after '(' or before ')'
-# f(arg); not f( arg );
-SpacesInParentheses: false
+SpacesInParens: Custom
+SpacesInParensOptions:
+ # Don't insert spaces inside empty '()'
+ InEmptyParentheses: false
# Don't insert spaces after '[' or before ']'
# int a[5]; not int a[ 5 ];
--
2.45.2
^ permalink raw reply related [flat|nested] 127+ messages in thread
* [PATCH v3 5/8] clang-format: formalize some of the spacing rules
2024-07-13 13:45 ` [PATCH v3 " Karthik Nayak
` (3 preceding siblings ...)
2024-07-13 13:45 ` [PATCH v3 4/8] clang-format: replace deprecated option with 'SpacesInParens' Karthik Nayak
@ 2024-07-13 13:45 ` Karthik Nayak
2024-07-13 13:45 ` [PATCH v3 6/8] ci: run style check on GitHub and GitLab Karthik Nayak
` (3 subsequent siblings)
8 siblings, 0 replies; 127+ messages in thread
From: Karthik Nayak @ 2024-07-13 13:45 UTC (permalink / raw)
To: karthik.188; +Cc: chriscool, git, jltobler, phillip.wood123
There are some spacing rules that we follow in the project and it makes
sense to formalize them:
* Ensure there is no space inserted after the logical not '!' operator.
* Ensure there is no space before the case statement's colon.
* Ensure there is no space before the first bracket '[' of an array.
* Ensure there is no space in empty blocks.
Signed-off-by: Karthik Nayak <karthik.188@gmail.com>
---
.clang-format | 14 ++++++++++++++
1 file changed, 14 insertions(+)
diff --git a/.clang-format b/.clang-format
index 914254a29b..a0dd1f2eb9 100644
--- a/.clang-format
+++ b/.clang-format
@@ -121,11 +121,18 @@ PointerAlignment: Right
# x = (int32)y; not x = (int32) y;
SpaceAfterCStyleCast: false
+# No space is inserted after the logical not operator
+SpaceAfterLogicalNot: false
+
# Insert spaces before and after assignment operators
# int a = 5; not int a=5;
# a += 42; a+=42;
SpaceBeforeAssignmentOperators: true
+# Spaces will be removed before case colon.
+# case 1: break; not case 1 : break;
+SpaceBeforeCaseColon: false
+
# Put a space before opening parentheses only after control statement keywords.
# void f() {
# if (true) {
@@ -134,6 +141,13 @@ SpaceBeforeAssignmentOperators: true
# }
SpaceBeforeParens: ControlStatements
+# No space before first '[' in arrays
+# int a[5][5]; not int a [5][5];
+SpaceBeforeSquareBrackets: false
+
+# No space will be inserted into {}
+# while (true) {} not while (true) { }
+SpaceInEmptyBlock: false
# The number of spaces before trailing line comments (// - comments).
# This does not affect trailing block comments (/* - comments).
--
2.45.2
^ permalink raw reply related [flat|nested] 127+ messages in thread
* [PATCH v3 6/8] ci: run style check on GitHub and GitLab
2024-07-13 13:45 ` [PATCH v3 " Karthik Nayak
` (4 preceding siblings ...)
2024-07-13 13:45 ` [PATCH v3 5/8] clang-format: formalize some of the spacing rules Karthik Nayak
@ 2024-07-13 13:45 ` Karthik Nayak
2024-07-13 15:47 ` Junio C Hamano
2024-07-13 13:45 ` [PATCH v3 7/8] check-whitespace: detect if no base_commit is provided Karthik Nayak
` (2 subsequent siblings)
8 siblings, 1 reply; 127+ messages in thread
From: Karthik Nayak @ 2024-07-13 13:45 UTC (permalink / raw)
To: karthik.188; +Cc: chriscool, git, jltobler, phillip.wood123
We don't run style checks on our CI, even though we have a
'.clang-format' setup in the repository. Let's add one, the job will
validate only against the new commits added and will only run on merge
requests. Since we're introducing it for the first time, let's allow
this job to fail, so we can validate if this is useful and eventually
enforce it.
For GitLab, we use the 'CI_MERGE_REQUEST_TARGET_BRANCH_SHA' variable by
default to obtain the base SHA of the merged pipeline (which is only
available for merged pipelines [1]). Otherwise we use the
'CI_MERGE_REQUEST_DIFF_BASE_SHA' variable.
[1]: https://docs.gitlab.com/ee/ci/variables/predefined_variables.html#predefined-variables-for-merge-request-pipelines
Signed-off-by: Karthik Nayak <karthik.188@gmail.com>
---
.github/workflows/check-style.yml | 29 +++++++++++++++++++++++++++++
.gitlab-ci.yml | 24 ++++++++++++++++++++++++
ci/install-dependencies.sh | 2 +-
ci/run-style-check.sh | 8 ++++++++
4 files changed, 62 insertions(+), 1 deletion(-)
create mode 100644 .github/workflows/check-style.yml
create mode 100755 ci/run-style-check.sh
diff --git a/.github/workflows/check-style.yml b/.github/workflows/check-style.yml
new file mode 100644
index 0000000000..27276dfe5e
--- /dev/null
+++ b/.github/workflows/check-style.yml
@@ -0,0 +1,29 @@
+name: check-style
+
+# Get the repository with all commits to ensure that we can analyze
+# all of the commits contributed via the Pull Request.
+
+on:
+ pull_request:
+ types: [opened, synchronize]
+
+# Avoid unnecessary builds. Unlike the main CI jobs, these are not
+# ci-configurable (but could be).
+concurrency:
+ group: ${{ github.workflow }}-${{ github.ref }}
+ cancel-in-progress: true
+
+jobs:
+ check-style:
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/checkout@v4
+ with:
+ fetch-depth: 0
+
+ - name: git clang-format
+ continue-on-error: true
+ id: check_out
+ run: |
+ ./ci/run-style-check.sh \
+ "${{github.event.pull_request.base.sha}}"
diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 37b991e080..14f9d3dc8e 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -123,6 +123,30 @@ check-whitespace:
rules:
- if: $CI_PIPELINE_SOURCE == 'merge_request_event'
+check-style:
+ image: ubuntu:latest
+ allow_failure: true
+ variables:
+ CC: clang
+ before_script:
+ - ./ci/install-dependencies.sh
+ # Since $CI_MERGE_REQUEST_TARGET_BRANCH_SHA is only defined for merged
+ # pipelines, we fallback to $CI_MERGE_REQUEST_DIFF_BASE_SHA, which should
+ # be defined in all pipelines.
+ script:
+ - |
+ if test -n "$CI_MERGE_REQUEST_TARGET_BRANCH_SHA"
+ then
+ ./ci/run-style-check.sh "$CI_MERGE_REQUEST_TARGET_BRANCH_SHA"
+ elif test -n "$CI_MERGE_REQUEST_DIFF_BASE_SHA"
+ then
+ ./ci/run-style-check.sh "$CI_MERGE_REQUEST_DIFF_BASE_SHA"
+ else
+ echo "CI_MERGE_REQUEST_DIFF_BASE_SHA should always exist!"; exit 1
+ fi
+ rules:
+ - if: $CI_PIPELINE_SOURCE == 'merge_request_event'
+
documentation:
image: ubuntu:latest
variables:
diff --git a/ci/install-dependencies.sh b/ci/install-dependencies.sh
index 6ec0f85972..46fe12a690 100755
--- a/ci/install-dependencies.sh
+++ b/ci/install-dependencies.sh
@@ -43,7 +43,7 @@ ubuntu-*)
make libssl-dev libcurl4-openssl-dev libexpat-dev wget sudo default-jre \
tcl tk gettext zlib1g-dev perl-modules liberror-perl libauthen-sasl-perl \
libemail-valid-perl libio-pty-perl libio-socket-ssl-perl libnet-smtp-ssl-perl libdbd-sqlite3-perl libcgi-pm-perl \
- ${CC_PACKAGE:-${CC:-gcc}} $PYTHON_PACKAGE
+ ${CC_PACKAGE:-${CC:-gcc}} $PYTHON_PACKAGE clang-format
mkdir --parents "$CUSTOM_PATH"
wget --quiet --directory-prefix="$CUSTOM_PATH" \
diff --git a/ci/run-style-check.sh b/ci/run-style-check.sh
new file mode 100755
index 0000000000..76dd37d22b
--- /dev/null
+++ b/ci/run-style-check.sh
@@ -0,0 +1,8 @@
+#!/bin/sh
+#
+# Perform style check
+#
+
+baseCommit=$1
+
+git clang-format --style file --diff --extensions c,h "$baseCommit"
--
2.45.2
^ permalink raw reply related [flat|nested] 127+ messages in thread
* [PATCH v3 7/8] check-whitespace: detect if no base_commit is provided
2024-07-13 13:45 ` [PATCH v3 " Karthik Nayak
` (5 preceding siblings ...)
2024-07-13 13:45 ` [PATCH v3 6/8] ci: run style check on GitHub and GitLab Karthik Nayak
@ 2024-07-13 13:45 ` Karthik Nayak
2024-07-13 13:45 ` [PATCH v3 8/8] ci/style-check: add `RemoveBracesLLVM` to '.clang-format' Karthik Nayak
2024-07-15 9:30 ` [PATCH v4 0/8] clang-format: add more rules and enable on CI Karthik Nayak
8 siblings, 0 replies; 127+ messages in thread
From: Karthik Nayak @ 2024-07-13 13:45 UTC (permalink / raw)
To: karthik.188; +Cc: chriscool, git, jltobler, phillip.wood123
The 'check-whitespace' CI script exits gracefully if no base commit is
provided or if an invalid revision is provided. This is not good because
if a particular CI provides an incorrect base_commit, it would fail
successfully.
This is exactly the case with the GitLab CI. The CI is using the
"$CI_MERGE_REQUEST_TARGET_BRANCH_SHA" variable to get the base commit
SHA, but variable is only defined for _merged_ pipelines. So it is empty
for regular pipelines [1]. This should've failed the check-whitespace
job.
Let's fallback to 'CI_MERGE_REQUEST_DIFF_BASE_SHA' if
"CI_MERGE_REQUEST_TARGET_BRANCH_SHA" isn't available in GitLab CI,
similar to the previous commit. Let's also add a check for incorrect
base_commit in the 'check-whitespace.sh' script. While here, fix a small
typo too.
[1]: https://docs.gitlab.com/ee/ci/variables/predefined_variables.html#predefined-variables-for-merge-request-pipelines
Signed-off-by: Karthik Nayak <karthik.188@gmail.com>
---
.gitlab-ci.yml | 14 +++++++++++++-
ci/check-whitespace.sh | 10 ++++++++--
2 files changed, 21 insertions(+), 3 deletions(-)
diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 14f9d3dc8e..0596a01b68 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -118,8 +118,20 @@ check-whitespace:
image: ubuntu:latest
before_script:
- ./ci/install-dependencies.sh
+ # Since $CI_MERGE_REQUEST_TARGET_BRANCH_SHA is only defined for merged
+ # pipelines, we fallback to $CI_MERGE_REQUEST_DIFF_BASE_SHA, which should
+ # be defined in all pipelines.
script:
- - ./ci/check-whitespace.sh "$CI_MERGE_REQUEST_TARGET_BRANCH_SHA"
+ - |
+ if test -n "$CI_MERGE_REQUEST_TARGET_BRANCH_SHA"
+ then
+ ./ci/check-whitespace.sh "$CI_MERGE_REQUEST_TARGET_BRANCH_SHA"
+ elif test -n "$CI_MERGE_REQUEST_DIFF_BASE_SHA"
+ then
+ ./ci/check-whitespace.sh "$CI_MERGE_REQUEST_DIFF_BASE_SHA"
+ else
+ echo "CI_MERGE_REQUEST_DIFF_BASE_SHA should always exist!"; exit 1
+ fi
rules:
- if: $CI_PIPELINE_SOURCE == 'merge_request_event'
diff --git a/ci/check-whitespace.sh b/ci/check-whitespace.sh
index db399097a5..c40804394c 100755
--- a/ci/check-whitespace.sh
+++ b/ci/check-whitespace.sh
@@ -9,7 +9,7 @@ baseCommit=$1
outputFile=$2
url=$3
-if test "$#" -ne 1 && test "$#" -ne 3
+if test "$#" -ne 1 && test "$#" -ne 3 || test -z "$1"
then
echo "USAGE: $0 <BASE_COMMIT> [<OUTPUT_FILE> <URL>]"
exit 1
@@ -21,6 +21,12 @@ commitText=
commitTextmd=
goodParent=
+if ! git rev-parse --quiet --verify "${baseCommit}"
+then
+ echo "Invalid <BASE_COMMIT> '${baseCommit}'"
+ exit 1
+fi
+
while read dash sha etc
do
case "${dash}" in
@@ -67,7 +73,7 @@ then
goodParent=${baseCommit: 0:7}
fi
- echo "A whitespace issue was found in onen of more of the commits."
+ echo "A whitespace issue was found in one or more of the commits."
echo "Run the following command to resolve whitespace issues:"
echo "git rebase --whitespace=fix ${goodParent}"
--
2.45.2
^ permalink raw reply related [flat|nested] 127+ messages in thread
* [PATCH v3 8/8] ci/style-check: add `RemoveBracesLLVM` to '.clang-format'
2024-07-13 13:45 ` [PATCH v3 " Karthik Nayak
` (6 preceding siblings ...)
2024-07-13 13:45 ` [PATCH v3 7/8] check-whitespace: detect if no base_commit is provided Karthik Nayak
@ 2024-07-13 13:45 ` Karthik Nayak
2024-07-13 15:37 ` Junio C Hamano
2024-07-15 9:30 ` [PATCH v4 0/8] clang-format: add more rules and enable on CI Karthik Nayak
8 siblings, 1 reply; 127+ messages in thread
From: Karthik Nayak @ 2024-07-13 13:45 UTC (permalink / raw)
To: karthik.188; +Cc: chriscool, git, jltobler, phillip.wood123
For 'clang-format' setting 'RemoveBracesLLVM' to 'true', adds a check
to ensure we avoid curly braces for single-statement bodies in
conditional blocks.
However, the option does come with two warnings [1]:
This option will be renamed and expanded to support other styles.
and
Setting this option to true could lead to incorrect code formatting
due to clang-format’s lack of complete semantic information. As
such, extra care should be taken to review code changes made by
this option.
The latter seems to be of concern. While we want to experiment with the
rule, adding it to the in-tree '.clang-format' could affect end-users.
Let's only add it to the CI jobs for now. With time, we can evaluate
its efficacy and decide if we want to add it to '.clang-format' or
retract it entirely.
[1]: https://clang.llvm.org/docs/ClangFormatStyleOptions.html#removebracesllvm
Signed-off-by: Karthik Nayak <karthik.188@gmail.com>
---
ci/run-style-check.sh | 13 +++++++++++++
1 file changed, 13 insertions(+)
diff --git a/ci/run-style-check.sh b/ci/run-style-check.sh
index 76dd37d22b..1dce50a0ac 100755
--- a/ci/run-style-check.sh
+++ b/ci/run-style-check.sh
@@ -5,4 +5,17 @@
baseCommit=$1
+# Remove optional braces of control statements (if, else, for, and while)
+# according to the LLVM coding style. This avoids braces on simple
+# single-statement bodies of statements but keeps braces if one side of
+# if/else if/.../else cascade has multi-statement body.
+#
+# As this rule comes with a warning [1], we want to experiment with it
+# before adding it in-tree. since the CI job for the style check is allowed
+# to fail, appending the rule here allows us to validate its efficacy.
+# While also ensuring that end-users are not affected directly.
+#
+# [1]: https://clang.llvm.org/docs/ClangFormatStyleOptions.html#removebracesllvm
+echo "RemoveBracesLLVM: true" >> .clang-format
+
git clang-format --style file --diff --extensions c,h "$baseCommit"
--
2.45.2
^ permalink raw reply related [flat|nested] 127+ messages in thread
* Re: [PATCH 5/8] clang-format: avoid braces on simple single-statement bodies
2024-07-13 12:30 ` Karthik Nayak
@ 2024-07-13 13:58 ` phillip.wood123
2024-07-13 14:16 ` Karthik Nayak
0 siblings, 1 reply; 127+ messages in thread
From: phillip.wood123 @ 2024-07-13 13:58 UTC (permalink / raw)
To: Karthik Nayak, phillip.wood, Junio C Hamano; +Cc: git, jltobler, chriscool
On 13/07/2024 13:30, Karthik Nayak wrote:
> Phillip Wood <phillip.wood123@gmail.com> writes:
>
>> I'm a bit confused - what does "allowed to fail" mean? We don't have any
>> automated requirements on the CI passing. We don't want to train
>> contributors to routinely ignore CI failures but if they don't get a
>> notification that this job failed how do they know to correct the
>> formatting?
>>
>
> Well, it mostly means that the CI would show the style-check job as
> failed, but the overall pipeline would be successful.
Ah, I didn't know that was a possibility - do users still get emails
about the failed job?
> We want to ideally
> fail the pipeline too, but I'm being careful to not disrupt things
> suddenly and I think once we see what false positive rate is and once we
> fine tune this settings maybe over the next release or so, we can
> enforce this.
Starting gently to get some experience with the auto formatter sounds
sensible. Thanks for working on this, I really hope that once we've got
more experience with clang format we can figure out how to enable it
unconditionally.
Best Wishes
Phillip
^ permalink raw reply [flat|nested] 127+ messages in thread
* Re: [PATCH 5/8] clang-format: avoid braces on simple single-statement bodies
2024-07-13 13:58 ` phillip.wood123
@ 2024-07-13 14:16 ` Karthik Nayak
0 siblings, 0 replies; 127+ messages in thread
From: Karthik Nayak @ 2024-07-13 14:16 UTC (permalink / raw)
To: phillip.wood123, phillip.wood, Junio C Hamano; +Cc: git, jltobler, chriscool
[-- Attachment #1: Type: text/plain, Size: 2085 bytes --]
phillip.wood123@gmail.com writes:
> On 13/07/2024 13:30, Karthik Nayak wrote:
>> Phillip Wood <phillip.wood123@gmail.com> writes:
> >
>>> I'm a bit confused - what does "allowed to fail" mean? We don't have any
>>> automated requirements on the CI passing. We don't want to train
>>> contributors to routinely ignore CI failures but if they don't get a
>>> notification that this job failed how do they know to correct the
>>> formatting?
>>>
>>
>> Well, it mostly means that the CI would show the style-check job as
>> failed, but the overall pipeline would be successful.
>
> Ah, I didn't know that was a possibility - do users still get emails
> about the failed job?
>
I know in GitLab, users _wouldn't_ get an email. This would be a nice
intermediate step, but I think it is still okay.
>> We want to ideally
>> fail the pipeline too, but I'm being careful to not disrupt things
>> suddenly and I think once we see what false positive rate is and once we
>> fine tune this settings maybe over the next release or so, we can
>> enforce this.
>
> Starting gently to get some experience with the auto formatter sounds
> sensible. Thanks for working on this, I really hope that once we've got
> more experience with clang format we can figure out how to enable it
> unconditionally.
>
> Best Wishes
>
> Phillip
Just to clarify, enabling an auto-formatter would always be left to the
user. From the project's perspective, the goal would be to have checks
to notify us (us as in the Git project) if a particular patch series
fails to comply to our standards.
This is done by enforcing the CI rule _eventually_. Users can also
benefit from this if they use the CI for development purposes. One good
example being users of GitGitGadget, where they would be notified of
failures in the CI. Another example is contributions coming from GitLab,
where our team uses the CI before sending patches upstream.
Since the Git project already comes with a '.clang-format', users can
already enable auto-formatting on their end. I know the clangd LSP
already supports this. ;)
Thanks
Karthik
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 690 bytes --]
^ permalink raw reply [flat|nested] 127+ messages in thread
* Re: [PATCH v3 8/8] ci/style-check: add `RemoveBracesLLVM` to '.clang-format'
2024-07-13 13:45 ` [PATCH v3 8/8] ci/style-check: add `RemoveBracesLLVM` to '.clang-format' Karthik Nayak
@ 2024-07-13 15:37 ` Junio C Hamano
2024-07-13 16:46 ` Karthik Nayak
0 siblings, 1 reply; 127+ messages in thread
From: Junio C Hamano @ 2024-07-13 15:37 UTC (permalink / raw)
To: Karthik Nayak; +Cc: chriscool, git, jltobler, phillip.wood123
Karthik Nayak <karthik.188@gmail.com> writes:
> +# [1]: https://clang.llvm.org/docs/ClangFormatStyleOptions.html#removebracesllvm
> +echo "RemoveBracesLLVM: true" >> .clang-format
> +
> git clang-format --style file --diff --extensions c,h "$baseCommit"
Style: lose the SP between the redirection operator and its operand.
I know this is well intentioned, but will there be any downsides for
running the check always against a dirty working tree?
I know during a CI run, the working tree will not be completely
clean, as we create and leave build artifacts, but this is as far as
I know the first instance of us munging a tracked path, changing the
working tree in a way that "git describe --dirty" would notice.
This is done as the last (and only) step of check-style job and the
ci/run-style-check.sh script may not do anything like "git describe
--dirty" right now, but things can change. Perhaps I am worried
about this a bit too much.
I unfortunately couldn't find an option to "git clang-format" to
tell it to read from an extra file in addition to the usual
".clang-format" file---if such an option existed, we obviously could
use an untracked/ignored file to prepare the custom format file and
use it without making the working tree dirty.
So perhaps the posted change, while making us feel dirty, is the
best we could do for this step.
Thanks.
^ permalink raw reply [flat|nested] 127+ messages in thread
* Re: [PATCH v3 6/8] ci: run style check on GitHub and GitLab
2024-07-13 13:45 ` [PATCH v3 6/8] ci: run style check on GitHub and GitLab Karthik Nayak
@ 2024-07-13 15:47 ` Junio C Hamano
0 siblings, 0 replies; 127+ messages in thread
From: Junio C Hamano @ 2024-07-13 15:47 UTC (permalink / raw)
To: Karthik Nayak; +Cc: chriscool, git, jltobler, phillip.wood123
Karthik Nayak <karthik.188@gmail.com> writes:
> + # Since $CI_MERGE_REQUEST_TARGET_BRANCH_SHA is only defined for merged
> + # pipelines, we fallback to $CI_MERGE_REQUEST_DIFF_BASE_SHA, which should
> + # be defined in all pipelines.
> + script:
> + - |
> + if test -n "$CI_MERGE_REQUEST_TARGET_BRANCH_SHA"
> + then
> + ./ci/run-style-check.sh "$CI_MERGE_REQUEST_TARGET_BRANCH_SHA"
> + elif test -n "$CI_MERGE_REQUEST_DIFF_BASE_SHA"
> + then
> + ./ci/run-style-check.sh "$CI_MERGE_REQUEST_DIFF_BASE_SHA"
> + else
> + echo "CI_MERGE_REQUEST_DIFF_BASE_SHA should always exist!"; exit 1
> + fi
This is fine but we may want to reduce the repetition of the long path
to the script, e.g., by doing something like
if test -n "$CI_MERGE_REQUEST_TARGET_BRANCH_SHA"
then
R=$CI_MERGE_REQUEST_TARGET_BRANCH_SHA
elif test -n "$CI_MERGE_REQUEST_DIFF_BASE_SHA"
then
R="$CI_MERGE_REQUEST_DIFF_BASE_SHA"
fi
if test -z "$R"
then
echo "CI_MERGE_REQUEST_DIFF_BASE_SHA should always exist!"
exit 1
fi
./ci/run-style-check.sh "$R"
in a separate "after the dust settles" clean-up #leftoverbits topic.
We could replace the first 7 lines with a single-liner
R=${CI_MERGE_REQUEST_TARGET_BRANCH_SHA-${CI_MERGE_REQUEST_DIFF_BASE_SHA?}}
if we wanted to, but all of that will be mere clean-up changes.
^ permalink raw reply [flat|nested] 127+ messages in thread
* Re: [PATCH v3 8/8] ci/style-check: add `RemoveBracesLLVM` to '.clang-format'
2024-07-13 15:37 ` Junio C Hamano
@ 2024-07-13 16:46 ` Karthik Nayak
2024-07-13 23:18 ` Ramsay Jones
0 siblings, 1 reply; 127+ messages in thread
From: Karthik Nayak @ 2024-07-13 16:46 UTC (permalink / raw)
To: Junio C Hamano; +Cc: chriscool, git, jltobler, phillip.wood123
[-- Attachment #1: Type: text/plain, Size: 2944 bytes --]
Junio C Hamano <gitster@pobox.com> writes:
> Karthik Nayak <karthik.188@gmail.com> writes:
>
>> +# [1]: https://clang.llvm.org/docs/ClangFormatStyleOptions.html#removebracesllvm
>> +echo "RemoveBracesLLVM: true" >> .clang-format
>> +
>> git clang-format --style file --diff --extensions c,h "$baseCommit"
>
> Style: lose the SP between the redirection operator and its operand.
>
Will change.
> I know this is well intentioned, but will there be any downsides for
> running the check always against a dirty working tree?
>
> I know during a CI run, the working tree will not be completely
> clean, as we create and leave build artifacts, but this is as far as
> I know the first instance of us munging a tracked path, changing the
> working tree in a way that "git describe --dirty" would notice.
>
> This is done as the last (and only) step of check-style job and the
> ci/run-style-check.sh script may not do anything like "git describe
> --dirty" right now, but things can change. Perhaps I am worried
> about this a bit too much.
>
Exactly my thoughts too. I did test on GitLab's CI and all other jobs
were unaffected. So I think we're good here.
---
After reading your mail, I figured I should also check GitHub's CI for
this particular change and realized there is a slight issue with my
current series.
GitLab's CI highlights style check jobs which failed with a yellow
warning symbol [1], even with the 'ignore failing check-style'
directive. But GitHub's actions, simply marks the job as successful even
if the job failed [1]. This was an oversight on my side, since I
expected similar behavior. Seems like the required dependency wasn't
even installed on GitHub causing 'git clang-format' to fail.
Unfortunately this means all GitHub workflows for style-check will be
green even if there were style issues found. I couldn't find a way to
fix this from reading the documentation.
This will not be an issue once we enforce, but till then users cannot
rely on the job's outcome for the job's status in GitHub. They will have
to see the logs to know if style check failed.
I will re-roll with a fix, but will wait a day or so, to avoid spamming.
> I unfortunately couldn't find an option to "git clang-format" to
> tell it to read from an extra file in addition to the usual
> ".clang-format" file---if such an option existed, we obviously could
> use an untracked/ignored file to prepare the custom format file and
> use it without making the working tree dirty.
>
This was also something I looked for, but couldn't find. I should have
added that to the commit message. Will do so in the reroll.
> So perhaps the posted change, while making us feel dirty, is the
> best we could do for this step.
>
> Thanks.
Yes, I think it is okay. I'm hoping we can move it in-tree someday.
[1]: https://gitlab.com/gitlab-org/git/-/pipelines/1372326813
[2]: https://github.com/KarthikNayak/git/actions/runs/9921272597/job/27409047062
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 690 bytes --]
^ permalink raw reply [flat|nested] 127+ messages in thread
* Re: [PATCH v3 8/8] ci/style-check: add `RemoveBracesLLVM` to '.clang-format'
2024-07-13 16:46 ` Karthik Nayak
@ 2024-07-13 23:18 ` Ramsay Jones
2024-07-15 8:10 ` Karthik Nayak
0 siblings, 1 reply; 127+ messages in thread
From: Ramsay Jones @ 2024-07-13 23:18 UTC (permalink / raw)
To: Karthik Nayak, Junio C Hamano; +Cc: chriscool, git, jltobler, phillip.wood123
On 13/07/2024 17:46, Karthik Nayak wrote:
> Junio C Hamano <gitster@pobox.com> writes:
[snip]
>> I unfortunately couldn't find an option to "git clang-format" to
>> tell it to read from an extra file in addition to the usual
>> ".clang-format" file---if such an option existed, we obviously could
>> use an untracked/ignored file to prepare the custom format file and
>> use it without making the working tree dirty.
>>
>
> This was also something I looked for, but couldn't find. I should have
> added that to the commit message. Will do so in the reroll.
>
I had a need recently to try applying the git '.clang-format' file to a
different project:
$ pwd
/home/ramsay/sparse
$ clang-format --style=file:/home/ramsay/git/.clang-format sparse.c >xxx.c
$ meld sparse.c xxx.c # oh my lord :)
Note that I had to specify '/home/ramsay/' rather than just '~', since it
does not get recognized/expanded in that position:
$ clang-format --style=file:~/git/.clang-format sparse.c >xxx.c
Error reading ~/git/.clang-format: No such file or directory
$ rm xxx.c
Also, as you can see, this was 'clang-format' not 'git-clang-format' (which
is what would actually be used in this situation), but the '--help' text
claims that:
$ git-clang-format --help | grep style
clangFormat.style
--style STYLE passed to clang-format
$
.. so it should work (but I have not actually tried it, so YMMV ;) ).
[So, munging the .clang-format file with sed (say) to a temp file and
using the --style=file:tmp-file syntax should (hopefully) work]
ATB,
Ramsay Jones
^ permalink raw reply [flat|nested] 127+ messages in thread
* Re: [PATCH v3 8/8] ci/style-check: add `RemoveBracesLLVM` to '.clang-format'
2024-07-13 23:18 ` Ramsay Jones
@ 2024-07-15 8:10 ` Karthik Nayak
2024-07-15 14:46 ` Junio C Hamano
0 siblings, 1 reply; 127+ messages in thread
From: Karthik Nayak @ 2024-07-15 8:10 UTC (permalink / raw)
To: Ramsay Jones, Junio C Hamano; +Cc: chriscool, git, jltobler, phillip.wood123
[-- Attachment #1: Type: text/plain, Size: 2174 bytes --]
Ramsay Jones <ramsay@ramsayjones.plus.com> writes:
> On 13/07/2024 17:46, Karthik Nayak wrote:
>> Junio C Hamano <gitster@pobox.com> writes:
> [snip]
>
>>> I unfortunately couldn't find an option to "git clang-format" to
>>> tell it to read from an extra file in addition to the usual
>>> ".clang-format" file---if such an option existed, we obviously could
>>> use an untracked/ignored file to prepare the custom format file and
>>> use it without making the working tree dirty.
>>>
>>
>> This was also something I looked for, but couldn't find. I should have
>> added that to the commit message. Will do so in the reroll.
>>
>
> I had a need recently to try applying the git '.clang-format' file to a
> different project:
>
> $ pwd
> /home/ramsay/sparse
> $ clang-format --style=file:/home/ramsay/git/.clang-format sparse.c >xxx.c
> $ meld sparse.c xxx.c # oh my lord :)
>
> Note that I had to specify '/home/ramsay/' rather than just '~', since it
> does not get recognized/expanded in that position:
>
> $ clang-format --style=file:~/git/.clang-format sparse.c >xxx.c
> Error reading ~/git/.clang-format: No such file or directory
> $ rm xxx.c
>
> Also, as you can see, this was 'clang-format' not 'git-clang-format' (which
> is what would actually be used in this situation), but the '--help' text
> claims that:
>
> $ git-clang-format --help | grep style
> clangFormat.style
> --style STYLE passed to clang-format
> $
>
> .. so it should work (but I have not actually tried it, so YMMV ;) ).
>
> [So, munging the .clang-format file with sed (say) to a temp file and
> using the --style=file:tmp-file syntax should (hopefully) work]
>
> ATB,
> Ramsay Jones
>
>
Hello,
Providing a path does work indeed. But we were discussing the option to
provide an additional path apart from the default '.clang-format'. The
option you mentioned `--style=<file path>` will set the config to the
contents of <file path>, but we want to add on top of that. So that we
could hypothetically do something like
$ git clang-format --style file --style-append '.ci-clang-format'
--diff --extensions c,h
But seems like this is currently not possible.
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 690 bytes --]
^ permalink raw reply [flat|nested] 127+ messages in thread
* [PATCH v4 0/8] clang-format: add more rules and enable on CI
2024-07-13 13:45 ` [PATCH v3 " Karthik Nayak
` (7 preceding siblings ...)
2024-07-13 13:45 ` [PATCH v3 8/8] ci/style-check: add `RemoveBracesLLVM` to '.clang-format' Karthik Nayak
@ 2024-07-15 9:30 ` Karthik Nayak
2024-07-15 9:30 ` [PATCH v4 1/8] clang-format: indent preprocessor directives after hash Karthik Nayak
` (8 more replies)
8 siblings, 9 replies; 127+ messages in thread
From: Karthik Nayak @ 2024-07-15 9:30 UTC (permalink / raw)
To: karthik.188; +Cc: chriscool, git, jltobler, phillip.wood123, gitster
This is v3 of my series to add clang-format to the CI.
The series was mostly inspired by a patch sent recently to 'include
kh_foreach* macros in ForEachMacros' [1]. I was wondering why we don't
run the formatting on CI and reduce some of the workload of reviewers.
We have a '.clang-format' file to provide rules for code formatting.
The commits 1-5 aims to add more rules to the file while deprecating old
ones.
Commit 6 enables CI action on GitHub and GitLab to also check for the
code formatting. Currently, it is allowed to fail. This way we can build
confidence and fine tune the values as needed and finally enforce the
check in a future patch. I'm not well versed with GitHub workflows, and
I mostly tried to copy existing work there. Expecting some feedback in
that section!
Commit 7 fixes an existing issue with the 'check-whitespace' job, which
is failing as success in the GitLab CI.
Commit 8 adds the `RemoveBracesLLVM` only in the context of the CI. If we
decide against it, we could drop this commit from the series.
1: https://lore.kernel.org/git/4e7893f5-2dd9-46cf-8a64-cf780f4e1730@web.de/
Changes against v3:
- The job was actually failing on GitHub but showing a success since we added
the allow to fail clause. This was because the dependency wasn't installed.
Have fixed that in this version.
- Simplified the bash script in the GitLab job, thanks to Junio.
- Fixed a style issue with redirection.
- Added some more details to the commit messages.
Job running on:
- GitHub: https://github.com/KarthikNayak/git/actions/runs/9936188558/job/27443871938?pr=1
- GitLab: https://gitlab.com/gitlab-org/git/-/jobs/7340770469
Karthik Nayak (8):
clang-format: indent preprocessor directives after hash
clang-format: avoid spacing around bitfield colon
clang-format: ensure files end with newlines
clang-format: replace deprecated option with 'SpacesInParens'
clang-format: formalize some of the spacing rules
ci: run style check on GitHub and GitLab
check-whitespace: detect if no base_commit is provided
ci/style-check: add `RemoveBracesLLVM` to '.clang-format'
.clang-format | 36 +++++++++++++++++++++++++-----
.github/workflows/check-style.yml | 34 ++++++++++++++++++++++++++++
.gitlab-ci.yml | 37 ++++++++++++++++++++++++++++++-
ci/check-whitespace.sh | 10 +++++++--
ci/install-dependencies.sh | 6 ++++-
ci/run-style-check.sh | 21 ++++++++++++++++++
6 files changed, 135 insertions(+), 9 deletions(-)
create mode 100644 .github/workflows/check-style.yml
create mode 100755 ci/run-style-check.sh
Range-diff against v3:
1: 6cf91ffc86 = 1: 6cf91ffc86 clang-format: indent preprocessor directives after hash
2: beb002885f = 2: beb002885f clang-format: avoid spacing around bitfield colon
3: 3031be43e7 = 3: 3031be43e7 clang-format: ensure files end with newlines
4: bc1550e300 = 4: bc1550e300 clang-format: replace deprecated option with 'SpacesInParens'
5: 4586c0094b = 5: 4586c0094b clang-format: formalize some of the spacing rules
6: c18cb23369 ! 6: f8eba92c0c ci: run style check on GitHub and GitLab
@@ Commit message
this job to fail, so we can validate if this is useful and eventually
enforce it.
- For GitLab, we use the 'CI_MERGE_REQUEST_TARGET_BRANCH_SHA' variable by
- default to obtain the base SHA of the merged pipeline (which is only
- available for merged pipelines [1]). Otherwise we use the
+ For GitHub, we allow the job to pass by adding 'continue-on-error: true'
+ to the workflow. This means the job would show as passed, even if the
+ style check failed. To know the status of the job, users have to
+ manually check the logs.
+
+ For GitLab, we allow the job to pass by adding 'allow_failure: true', to
+ the job. Unlike GitHub, here the job will show as failed with a yellow
+ warning symbol, but the pipeline would still show as passed.
+
+ Also for GitLab, we use the 'CI_MERGE_REQUEST_TARGET_BRANCH_SHA'
+ variable by default to obtain the base SHA of the merged pipeline (which
+ is only available for merged pipelines [1]). Otherwise we use the
'CI_MERGE_REQUEST_DIFF_BASE_SHA' variable.
[1]: https://docs.gitlab.com/ee/ci/variables/predefined_variables.html#predefined-variables-for-merge-request-pipelines
+ Helped-by: Junio C Hamano <gitster@pobox.com>
Signed-off-by: Karthik Nayak <karthik.188@gmail.com>
## .github/workflows/check-style.yml (new) ##
@@ .github/workflows/check-style.yml (new)
+
+jobs:
+ check-style:
++ env:
++ CC: clang
++ jobname: ClangFormat
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/checkout@v4
+ with:
+ fetch-depth: 0
+
++ - run: ci/install-dependencies.sh
++
+ - name: git clang-format
+ continue-on-error: true
+ id: check_out
@@ .gitlab-ci.yml: check-whitespace:
+ allow_failure: true
+ variables:
+ CC: clang
++ jobname: ClangFormat
+ before_script:
+ - ./ci/install-dependencies.sh
+ # Since $CI_MERGE_REQUEST_TARGET_BRANCH_SHA is only defined for merged
@@ .gitlab-ci.yml: check-whitespace:
+ # be defined in all pipelines.
+ script:
+ - |
-+ if test -n "$CI_MERGE_REQUEST_TARGET_BRANCH_SHA"
-+ then
-+ ./ci/run-style-check.sh "$CI_MERGE_REQUEST_TARGET_BRANCH_SHA"
-+ elif test -n "$CI_MERGE_REQUEST_DIFF_BASE_SHA"
++ R=${CI_MERGE_REQUEST_TARGET_BRANCH_SHA-${CI_MERGE_REQUEST_DIFF_BASE_SHA?}}
++
++ if test -z "$R"
+ then
-+ ./ci/run-style-check.sh "$CI_MERGE_REQUEST_DIFF_BASE_SHA"
-+ else
-+ echo "CI_MERGE_REQUEST_DIFF_BASE_SHA should always exist!"; exit 1
++ echo "CI_MERGE_REQUEST_DIFF_BASE_SHA should always exist!"
++ exit 1
+ fi
++ ./ci/run-style-check.sh "$R"
+ rules:
+ - if: $CI_PIPELINE_SOURCE == 'merge_request_event'
+
@@ ci/install-dependencies.sh: ubuntu-*)
mkdir --parents "$CUSTOM_PATH"
wget --quiet --directory-prefix="$CUSTOM_PATH" \
+@@ ci/install-dependencies.sh: macos-*)
+ esac
+
+ case "$jobname" in
++ClangFormat)
++ sudo apt-get -q update
++ sudo apt-get -q -y install clang-format
++ ;;
+ StaticAnalysis)
+ sudo apt-get -q update
+ sudo apt-get -q -y install coccinelle libcurl4-openssl-dev libssl-dev \
## ci/run-style-check.sh (new) ##
@@
7: 4d08c570bb ! 7: 477419fc6b check-whitespace: detect if no base_commit is provided
@@ Commit message
[1]: https://docs.gitlab.com/ee/ci/variables/predefined_variables.html#predefined-variables-for-merge-request-pipelines
+ Helped-by: Junio C Hamano <gitster@pobox.com>
Signed-off-by: Karthik Nayak <karthik.188@gmail.com>
## .gitlab-ci.yml ##
@@ .gitlab-ci.yml: check-whitespace:
script:
- - ./ci/check-whitespace.sh "$CI_MERGE_REQUEST_TARGET_BRANCH_SHA"
+ - |
-+ if test -n "$CI_MERGE_REQUEST_TARGET_BRANCH_SHA"
-+ then
-+ ./ci/check-whitespace.sh "$CI_MERGE_REQUEST_TARGET_BRANCH_SHA"
-+ elif test -n "$CI_MERGE_REQUEST_DIFF_BASE_SHA"
++ R=${CI_MERGE_REQUEST_TARGET_BRANCH_SHA-${CI_MERGE_REQUEST_DIFF_BASE_SHA?}}
++
++ if test -z "$R"
+ then
-+ ./ci/check-whitespace.sh "$CI_MERGE_REQUEST_DIFF_BASE_SHA"
-+ else
-+ echo "CI_MERGE_REQUEST_DIFF_BASE_SHA should always exist!"; exit 1
++ echo "CI_MERGE_REQUEST_DIFF_BASE_SHA should always exist!"
++ exit 1
+ fi
++ ./ci/check-whitespace.sh "$R"
rules:
- if: $CI_PIPELINE_SOURCE == 'merge_request_event'
8: 2b39431f93 ! 8: 50007c17da ci/style-check: add `RemoveBracesLLVM` to '.clang-format'
@@ Commit message
its efficacy and decide if we want to add it to '.clang-format' or
retract it entirely.
+ A more ideal solution would be if 'clang-format' allowed us to append
+ rules to the existing '.clang-format' when invoked. But such an option
+ does not exist. Since modifying the in-tree '.clang-format' is only done
+ on the CI job for style-check and doesn't affect any other jobs and is
+ not persisted in any ways, this hack should be okay.
+
[1]: https://clang.llvm.org/docs/ClangFormatStyleOptions.html#removebracesllvm
Signed-off-by: Karthik Nayak <karthik.188@gmail.com>
@@ ci/run-style-check.sh
+# While also ensuring that end-users are not affected directly.
+#
+# [1]: https://clang.llvm.org/docs/ClangFormatStyleOptions.html#removebracesllvm
-+echo "RemoveBracesLLVM: true" >> .clang-format
++echo "RemoveBracesLLVM: true" >>.clang-format
+
git clang-format --style file --diff --extensions c,h "$baseCommit"
--
2.45.2
^ permalink raw reply [flat|nested] 127+ messages in thread
* [PATCH v4 1/8] clang-format: indent preprocessor directives after hash
2024-07-15 9:30 ` [PATCH v4 0/8] clang-format: add more rules and enable on CI Karthik Nayak
@ 2024-07-15 9:30 ` Karthik Nayak
2024-07-15 9:30 ` [PATCH v4 2/8] clang-format: avoid spacing around bitfield colon Karthik Nayak
` (7 subsequent siblings)
8 siblings, 0 replies; 127+ messages in thread
From: Karthik Nayak @ 2024-07-15 9:30 UTC (permalink / raw)
To: karthik.188; +Cc: chriscool, git, jltobler, phillip.wood123, gitster
We do not have a rule around the indentation of preprocessor directives.
This was also discussed on the list [1], noting how there is often
inconsistency in the styling. While there was discussion, there was no
conclusion around what is the preferred style here. One style being
indenting after the hash:
#if FOO
# if BAR
# include <foo>
# endif
#endif
The other being before the hash:
#if FOO
#if BAR
#include <foo>
#endif
#endif
Let's pick the former and add 'IndentPPDirectives: AfterHash' value to
our '.clang-format'. There is no clear reason to pick one over the
other, but it would definitely be nicer to be consistent.
[1]: https://lore.kernel.org/r/xmqqwmmm1bw6.fsf@gitster.g
Signed-off-by: Karthik Nayak <karthik.188@gmail.com>
---
.clang-format | 6 ++++++
1 file changed, 6 insertions(+)
diff --git a/.clang-format b/.clang-format
index 3ed4fac753..5e128519bf 100644
--- a/.clang-format
+++ b/.clang-format
@@ -96,6 +96,12 @@ BreakStringLiterals: false
# Switch statement body is always indented one level more than case labels.
IndentCaseLabels: false
+# Indents directives before the hash.
+# #if FOO
+# # include <foo>
+# #endif
+IndentPPDirectives: AfterHash
+
# Don't indent a function definition or declaration if it is wrapped after the
# type
IndentWrappedFunctionNames: false
--
2.45.2
^ permalink raw reply related [flat|nested] 127+ messages in thread
* [PATCH v4 2/8] clang-format: avoid spacing around bitfield colon
2024-07-15 9:30 ` [PATCH v4 0/8] clang-format: add more rules and enable on CI Karthik Nayak
2024-07-15 9:30 ` [PATCH v4 1/8] clang-format: indent preprocessor directives after hash Karthik Nayak
@ 2024-07-15 9:30 ` Karthik Nayak
2024-07-15 9:30 ` [PATCH v4 3/8] clang-format: ensure files end with newlines Karthik Nayak
` (6 subsequent siblings)
8 siblings, 0 replies; 127+ messages in thread
From: Karthik Nayak @ 2024-07-15 9:30 UTC (permalink / raw)
To: karthik.188; +Cc: chriscool, git, jltobler, phillip.wood123, gitster
The spacing around colons is currently not standardized and as such we
have the following practices in our code base:
- Spacing around the colon `int bf : 1`: 146 instances
- No spacing around the colon `int bf:1`: 148 instances
- Spacing before the colon `int bf :1`: 6 instances
- Spacing after the colon `int bf: 1`: 12 instances
Let's formalize this by picking the most followed pattern and add the
corresponding style to '.clang-format'.
Signed-off-by: Karthik Nayak <karthik.188@gmail.com>
---
.clang-format | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/.clang-format b/.clang-format
index 5e128519bf..803b274dd5 100644
--- a/.clang-format
+++ b/.clang-format
@@ -72,6 +72,10 @@ AlwaysBreakAfterReturnType: None
BinPackArguments: true
BinPackParameters: true
+# Add no space around the bit field
+# unsigned bf:2;
+BitFieldColonSpacing: None
+
# Attach braces to surrounding context except break before braces on function
# definitions.
# void foo()
--
2.45.2
^ permalink raw reply related [flat|nested] 127+ messages in thread
* [PATCH v4 3/8] clang-format: ensure files end with newlines
2024-07-15 9:30 ` [PATCH v4 0/8] clang-format: add more rules and enable on CI Karthik Nayak
2024-07-15 9:30 ` [PATCH v4 1/8] clang-format: indent preprocessor directives after hash Karthik Nayak
2024-07-15 9:30 ` [PATCH v4 2/8] clang-format: avoid spacing around bitfield colon Karthik Nayak
@ 2024-07-15 9:30 ` Karthik Nayak
2024-07-15 9:30 ` [PATCH v4 4/8] clang-format: replace deprecated option with 'SpacesInParens' Karthik Nayak
` (5 subsequent siblings)
8 siblings, 0 replies; 127+ messages in thread
From: Karthik Nayak @ 2024-07-15 9:30 UTC (permalink / raw)
To: karthik.188; +Cc: chriscool, git, jltobler, phillip.wood123, gitster
All our source files end with a newline, let's formalize in
'.clang-format'.
Signed-off-by: Karthik Nayak <karthik.188@gmail.com>
---
.clang-format | 3 +++
1 file changed, 3 insertions(+)
diff --git a/.clang-format b/.clang-format
index 803b274dd5..4c9751a9db 100644
--- a/.clang-format
+++ b/.clang-format
@@ -106,6 +106,9 @@ IndentCaseLabels: false
# #endif
IndentPPDirectives: AfterHash
+# Insert a newline at end of file if missing
+InsertNewlineAtEOF: true
+
# Don't indent a function definition or declaration if it is wrapped after the
# type
IndentWrappedFunctionNames: false
--
2.45.2
^ permalink raw reply related [flat|nested] 127+ messages in thread
* [PATCH v4 4/8] clang-format: replace deprecated option with 'SpacesInParens'
2024-07-15 9:30 ` [PATCH v4 0/8] clang-format: add more rules and enable on CI Karthik Nayak
` (2 preceding siblings ...)
2024-07-15 9:30 ` [PATCH v4 3/8] clang-format: ensure files end with newlines Karthik Nayak
@ 2024-07-15 9:30 ` Karthik Nayak
2024-07-15 9:30 ` [PATCH v4 5/8] clang-format: formalize some of the spacing rules Karthik Nayak
` (4 subsequent siblings)
8 siblings, 0 replies; 127+ messages in thread
From: Karthik Nayak @ 2024-07-15 9:30 UTC (permalink / raw)
To: karthik.188; +Cc: chriscool, git, jltobler, phillip.wood123, gitster
Replace the deprecated options 'SpacesInParentheses' and
'SpaceInEmptyParentheses' with the newer 'SpacesInParens' option. The
usage is the same.
Signed-off-by: Karthik Nayak <karthik.188@gmail.com>
---
.clang-format | 9 ++++-----
1 file changed, 4 insertions(+), 5 deletions(-)
diff --git a/.clang-format b/.clang-format
index 4c9751a9db..914254a29b 100644
--- a/.clang-format
+++ b/.clang-format
@@ -134,8 +134,6 @@ SpaceBeforeAssignmentOperators: true
# }
SpaceBeforeParens: ControlStatements
-# Don't insert spaces inside empty '()'
-SpaceInEmptyParentheses: false
# The number of spaces before trailing line comments (// - comments).
# This does not affect trailing block comments (/* - comments).
@@ -149,9 +147,10 @@ SpacesInCStyleCastParentheses: false
# var arr = [1, 2, 3]; not var arr = [ 1, 2, 3 ];
SpacesInContainerLiterals: false
-# Don't insert spaces after '(' or before ')'
-# f(arg); not f( arg );
-SpacesInParentheses: false
+SpacesInParens: Custom
+SpacesInParensOptions:
+ # Don't insert spaces inside empty '()'
+ InEmptyParentheses: false
# Don't insert spaces after '[' or before ']'
# int a[5]; not int a[ 5 ];
--
2.45.2
^ permalink raw reply related [flat|nested] 127+ messages in thread
* [PATCH v4 5/8] clang-format: formalize some of the spacing rules
2024-07-15 9:30 ` [PATCH v4 0/8] clang-format: add more rules and enable on CI Karthik Nayak
` (3 preceding siblings ...)
2024-07-15 9:30 ` [PATCH v4 4/8] clang-format: replace deprecated option with 'SpacesInParens' Karthik Nayak
@ 2024-07-15 9:30 ` Karthik Nayak
2024-07-15 9:30 ` [PATCH v4 6/8] ci: run style check on GitHub and GitLab Karthik Nayak
` (3 subsequent siblings)
8 siblings, 0 replies; 127+ messages in thread
From: Karthik Nayak @ 2024-07-15 9:30 UTC (permalink / raw)
To: karthik.188; +Cc: chriscool, git, jltobler, phillip.wood123, gitster
There are some spacing rules that we follow in the project and it makes
sense to formalize them:
* Ensure there is no space inserted after the logical not '!' operator.
* Ensure there is no space before the case statement's colon.
* Ensure there is no space before the first bracket '[' of an array.
* Ensure there is no space in empty blocks.
Signed-off-by: Karthik Nayak <karthik.188@gmail.com>
---
.clang-format | 14 ++++++++++++++
1 file changed, 14 insertions(+)
diff --git a/.clang-format b/.clang-format
index 914254a29b..a0dd1f2eb9 100644
--- a/.clang-format
+++ b/.clang-format
@@ -121,11 +121,18 @@ PointerAlignment: Right
# x = (int32)y; not x = (int32) y;
SpaceAfterCStyleCast: false
+# No space is inserted after the logical not operator
+SpaceAfterLogicalNot: false
+
# Insert spaces before and after assignment operators
# int a = 5; not int a=5;
# a += 42; a+=42;
SpaceBeforeAssignmentOperators: true
+# Spaces will be removed before case colon.
+# case 1: break; not case 1 : break;
+SpaceBeforeCaseColon: false
+
# Put a space before opening parentheses only after control statement keywords.
# void f() {
# if (true) {
@@ -134,6 +141,13 @@ SpaceBeforeAssignmentOperators: true
# }
SpaceBeforeParens: ControlStatements
+# No space before first '[' in arrays
+# int a[5][5]; not int a [5][5];
+SpaceBeforeSquareBrackets: false
+
+# No space will be inserted into {}
+# while (true) {} not while (true) { }
+SpaceInEmptyBlock: false
# The number of spaces before trailing line comments (// - comments).
# This does not affect trailing block comments (/* - comments).
--
2.45.2
^ permalink raw reply related [flat|nested] 127+ messages in thread
* [PATCH v4 6/8] ci: run style check on GitHub and GitLab
2024-07-15 9:30 ` [PATCH v4 0/8] clang-format: add more rules and enable on CI Karthik Nayak
` (4 preceding siblings ...)
2024-07-15 9:30 ` [PATCH v4 5/8] clang-format: formalize some of the spacing rules Karthik Nayak
@ 2024-07-15 9:30 ` Karthik Nayak
2024-07-15 9:30 ` [PATCH v4 7/8] check-whitespace: detect if no base_commit is provided Karthik Nayak
` (2 subsequent siblings)
8 siblings, 0 replies; 127+ messages in thread
From: Karthik Nayak @ 2024-07-15 9:30 UTC (permalink / raw)
To: karthik.188; +Cc: chriscool, git, jltobler, phillip.wood123, gitster
We don't run style checks on our CI, even though we have a
'.clang-format' setup in the repository. Let's add one, the job will
validate only against the new commits added and will only run on merge
requests. Since we're introducing it for the first time, let's allow
this job to fail, so we can validate if this is useful and eventually
enforce it.
For GitHub, we allow the job to pass by adding 'continue-on-error: true'
to the workflow. This means the job would show as passed, even if the
style check failed. To know the status of the job, users have to
manually check the logs.
For GitLab, we allow the job to pass by adding 'allow_failure: true', to
the job. Unlike GitHub, here the job will show as failed with a yellow
warning symbol, but the pipeline would still show as passed.
Also for GitLab, we use the 'CI_MERGE_REQUEST_TARGET_BRANCH_SHA'
variable by default to obtain the base SHA of the merged pipeline (which
is only available for merged pipelines [1]). Otherwise we use the
'CI_MERGE_REQUEST_DIFF_BASE_SHA' variable.
[1]: https://docs.gitlab.com/ee/ci/variables/predefined_variables.html#predefined-variables-for-merge-request-pipelines
Helped-by: Junio C Hamano <gitster@pobox.com>
Signed-off-by: Karthik Nayak <karthik.188@gmail.com>
---
.github/workflows/check-style.yml | 34 +++++++++++++++++++++++++++++++
.gitlab-ci.yml | 24 ++++++++++++++++++++++
ci/install-dependencies.sh | 6 +++++-
ci/run-style-check.sh | 8 ++++++++
4 files changed, 71 insertions(+), 1 deletion(-)
create mode 100644 .github/workflows/check-style.yml
create mode 100755 ci/run-style-check.sh
diff --git a/.github/workflows/check-style.yml b/.github/workflows/check-style.yml
new file mode 100644
index 0000000000..c052a5df23
--- /dev/null
+++ b/.github/workflows/check-style.yml
@@ -0,0 +1,34 @@
+name: check-style
+
+# Get the repository with all commits to ensure that we can analyze
+# all of the commits contributed via the Pull Request.
+
+on:
+ pull_request:
+ types: [opened, synchronize]
+
+# Avoid unnecessary builds. Unlike the main CI jobs, these are not
+# ci-configurable (but could be).
+concurrency:
+ group: ${{ github.workflow }}-${{ github.ref }}
+ cancel-in-progress: true
+
+jobs:
+ check-style:
+ env:
+ CC: clang
+ jobname: ClangFormat
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/checkout@v4
+ with:
+ fetch-depth: 0
+
+ - run: ci/install-dependencies.sh
+
+ - name: git clang-format
+ continue-on-error: true
+ id: check_out
+ run: |
+ ./ci/run-style-check.sh \
+ "${{github.event.pull_request.base.sha}}"
diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 37b991e080..817266226e 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -123,6 +123,30 @@ check-whitespace:
rules:
- if: $CI_PIPELINE_SOURCE == 'merge_request_event'
+check-style:
+ image: ubuntu:latest
+ allow_failure: true
+ variables:
+ CC: clang
+ jobname: ClangFormat
+ before_script:
+ - ./ci/install-dependencies.sh
+ # Since $CI_MERGE_REQUEST_TARGET_BRANCH_SHA is only defined for merged
+ # pipelines, we fallback to $CI_MERGE_REQUEST_DIFF_BASE_SHA, which should
+ # be defined in all pipelines.
+ script:
+ - |
+ R=${CI_MERGE_REQUEST_TARGET_BRANCH_SHA-${CI_MERGE_REQUEST_DIFF_BASE_SHA?}}
+
+ if test -z "$R"
+ then
+ echo "CI_MERGE_REQUEST_DIFF_BASE_SHA should always exist!"
+ exit 1
+ fi
+ ./ci/run-style-check.sh "$R"
+ rules:
+ - if: $CI_PIPELINE_SOURCE == 'merge_request_event'
+
documentation:
image: ubuntu:latest
variables:
diff --git a/ci/install-dependencies.sh b/ci/install-dependencies.sh
index 6ec0f85972..8b01bfb89f 100755
--- a/ci/install-dependencies.sh
+++ b/ci/install-dependencies.sh
@@ -43,7 +43,7 @@ ubuntu-*)
make libssl-dev libcurl4-openssl-dev libexpat-dev wget sudo default-jre \
tcl tk gettext zlib1g-dev perl-modules liberror-perl libauthen-sasl-perl \
libemail-valid-perl libio-pty-perl libio-socket-ssl-perl libnet-smtp-ssl-perl libdbd-sqlite3-perl libcgi-pm-perl \
- ${CC_PACKAGE:-${CC:-gcc}} $PYTHON_PACKAGE
+ ${CC_PACKAGE:-${CC:-gcc}} $PYTHON_PACKAGE clang-format
mkdir --parents "$CUSTOM_PATH"
wget --quiet --directory-prefix="$CUSTOM_PATH" \
@@ -87,6 +87,10 @@ macos-*)
esac
case "$jobname" in
+ClangFormat)
+ sudo apt-get -q update
+ sudo apt-get -q -y install clang-format
+ ;;
StaticAnalysis)
sudo apt-get -q update
sudo apt-get -q -y install coccinelle libcurl4-openssl-dev libssl-dev \
diff --git a/ci/run-style-check.sh b/ci/run-style-check.sh
new file mode 100755
index 0000000000..76dd37d22b
--- /dev/null
+++ b/ci/run-style-check.sh
@@ -0,0 +1,8 @@
+#!/bin/sh
+#
+# Perform style check
+#
+
+baseCommit=$1
+
+git clang-format --style file --diff --extensions c,h "$baseCommit"
--
2.45.2
^ permalink raw reply related [flat|nested] 127+ messages in thread
* [PATCH v4 7/8] check-whitespace: detect if no base_commit is provided
2024-07-15 9:30 ` [PATCH v4 0/8] clang-format: add more rules and enable on CI Karthik Nayak
` (5 preceding siblings ...)
2024-07-15 9:30 ` [PATCH v4 6/8] ci: run style check on GitHub and GitLab Karthik Nayak
@ 2024-07-15 9:30 ` Karthik Nayak
2024-07-15 9:30 ` [PATCH v4 8/8] ci/style-check: add `RemoveBracesLLVM` to '.clang-format' Karthik Nayak
2024-07-18 8:15 ` [PATCH v5 0/6] : add more rules and enable on CI Karthik Nayak
8 siblings, 0 replies; 127+ messages in thread
From: Karthik Nayak @ 2024-07-15 9:30 UTC (permalink / raw)
To: karthik.188; +Cc: chriscool, git, jltobler, phillip.wood123, gitster
The 'check-whitespace' CI script exits gracefully if no base commit is
provided or if an invalid revision is provided. This is not good because
if a particular CI provides an incorrect base_commit, it would fail
successfully.
This is exactly the case with the GitLab CI. The CI is using the
"$CI_MERGE_REQUEST_TARGET_BRANCH_SHA" variable to get the base commit
SHA, but variable is only defined for _merged_ pipelines. So it is empty
for regular pipelines [1]. This should've failed the check-whitespace
job.
Let's fallback to 'CI_MERGE_REQUEST_DIFF_BASE_SHA' if
"CI_MERGE_REQUEST_TARGET_BRANCH_SHA" isn't available in GitLab CI,
similar to the previous commit. Let's also add a check for incorrect
base_commit in the 'check-whitespace.sh' script. While here, fix a small
typo too.
[1]: https://docs.gitlab.com/ee/ci/variables/predefined_variables.html#predefined-variables-for-merge-request-pipelines
Helped-by: Junio C Hamano <gitster@pobox.com>
Signed-off-by: Karthik Nayak <karthik.188@gmail.com>
---
.gitlab-ci.yml | 13 ++++++++++++-
ci/check-whitespace.sh | 10 ++++++++--
2 files changed, 20 insertions(+), 3 deletions(-)
diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 817266226e..320b78b9ae 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -118,8 +118,19 @@ check-whitespace:
image: ubuntu:latest
before_script:
- ./ci/install-dependencies.sh
+ # Since $CI_MERGE_REQUEST_TARGET_BRANCH_SHA is only defined for merged
+ # pipelines, we fallback to $CI_MERGE_REQUEST_DIFF_BASE_SHA, which should
+ # be defined in all pipelines.
script:
- - ./ci/check-whitespace.sh "$CI_MERGE_REQUEST_TARGET_BRANCH_SHA"
+ - |
+ R=${CI_MERGE_REQUEST_TARGET_BRANCH_SHA-${CI_MERGE_REQUEST_DIFF_BASE_SHA?}}
+
+ if test -z "$R"
+ then
+ echo "CI_MERGE_REQUEST_DIFF_BASE_SHA should always exist!"
+ exit 1
+ fi
+ ./ci/check-whitespace.sh "$R"
rules:
- if: $CI_PIPELINE_SOURCE == 'merge_request_event'
diff --git a/ci/check-whitespace.sh b/ci/check-whitespace.sh
index db399097a5..c40804394c 100755
--- a/ci/check-whitespace.sh
+++ b/ci/check-whitespace.sh
@@ -9,7 +9,7 @@ baseCommit=$1
outputFile=$2
url=$3
-if test "$#" -ne 1 && test "$#" -ne 3
+if test "$#" -ne 1 && test "$#" -ne 3 || test -z "$1"
then
echo "USAGE: $0 <BASE_COMMIT> [<OUTPUT_FILE> <URL>]"
exit 1
@@ -21,6 +21,12 @@ commitText=
commitTextmd=
goodParent=
+if ! git rev-parse --quiet --verify "${baseCommit}"
+then
+ echo "Invalid <BASE_COMMIT> '${baseCommit}'"
+ exit 1
+fi
+
while read dash sha etc
do
case "${dash}" in
@@ -67,7 +73,7 @@ then
goodParent=${baseCommit: 0:7}
fi
- echo "A whitespace issue was found in onen of more of the commits."
+ echo "A whitespace issue was found in one or more of the commits."
echo "Run the following command to resolve whitespace issues:"
echo "git rebase --whitespace=fix ${goodParent}"
--
2.45.2
^ permalink raw reply related [flat|nested] 127+ messages in thread
* [PATCH v4 8/8] ci/style-check: add `RemoveBracesLLVM` to '.clang-format'
2024-07-15 9:30 ` [PATCH v4 0/8] clang-format: add more rules and enable on CI Karthik Nayak
` (6 preceding siblings ...)
2024-07-15 9:30 ` [PATCH v4 7/8] check-whitespace: detect if no base_commit is provided Karthik Nayak
@ 2024-07-15 9:30 ` Karthik Nayak
2024-07-15 17:01 ` Junio C Hamano
2024-07-18 8:15 ` [PATCH v5 0/6] : add more rules and enable on CI Karthik Nayak
8 siblings, 1 reply; 127+ messages in thread
From: Karthik Nayak @ 2024-07-15 9:30 UTC (permalink / raw)
To: karthik.188; +Cc: chriscool, git, jltobler, phillip.wood123, gitster
For 'clang-format' setting 'RemoveBracesLLVM' to 'true', adds a check
to ensure we avoid curly braces for single-statement bodies in
conditional blocks.
However, the option does come with two warnings [1]:
This option will be renamed and expanded to support other styles.
and
Setting this option to true could lead to incorrect code formatting
due to clang-format’s lack of complete semantic information. As
such, extra care should be taken to review code changes made by
this option.
The latter seems to be of concern. While we want to experiment with the
rule, adding it to the in-tree '.clang-format' could affect end-users.
Let's only add it to the CI jobs for now. With time, we can evaluate
its efficacy and decide if we want to add it to '.clang-format' or
retract it entirely.
A more ideal solution would be if 'clang-format' allowed us to append
rules to the existing '.clang-format' when invoked. But such an option
does not exist. Since modifying the in-tree '.clang-format' is only done
on the CI job for style-check and doesn't affect any other jobs and is
not persisted in any ways, this hack should be okay.
[1]: https://clang.llvm.org/docs/ClangFormatStyleOptions.html#removebracesllvm
Signed-off-by: Karthik Nayak <karthik.188@gmail.com>
---
ci/run-style-check.sh | 13 +++++++++++++
1 file changed, 13 insertions(+)
diff --git a/ci/run-style-check.sh b/ci/run-style-check.sh
index 76dd37d22b..16b593fa1b 100755
--- a/ci/run-style-check.sh
+++ b/ci/run-style-check.sh
@@ -5,4 +5,17 @@
baseCommit=$1
+# Remove optional braces of control statements (if, else, for, and while)
+# according to the LLVM coding style. This avoids braces on simple
+# single-statement bodies of statements but keeps braces if one side of
+# if/else if/.../else cascade has multi-statement body.
+#
+# As this rule comes with a warning [1], we want to experiment with it
+# before adding it in-tree. since the CI job for the style check is allowed
+# to fail, appending the rule here allows us to validate its efficacy.
+# While also ensuring that end-users are not affected directly.
+#
+# [1]: https://clang.llvm.org/docs/ClangFormatStyleOptions.html#removebracesllvm
+echo "RemoveBracesLLVM: true" >>.clang-format
+
git clang-format --style file --diff --extensions c,h "$baseCommit"
--
2.45.2
^ permalink raw reply related [flat|nested] 127+ messages in thread
* Re: [PATCH v3 8/8] ci/style-check: add `RemoveBracesLLVM` to '.clang-format'
2024-07-15 8:10 ` Karthik Nayak
@ 2024-07-15 14:46 ` Junio C Hamano
2024-07-15 16:07 ` Karthik Nayak
0 siblings, 1 reply; 127+ messages in thread
From: Junio C Hamano @ 2024-07-15 14:46 UTC (permalink / raw)
To: Karthik Nayak; +Cc: Ramsay Jones, chriscool, git, jltobler, phillip.wood123
Karthik Nayak <karthik.188@gmail.com> writes:
> Providing a path does work indeed. But we were discussing the option to
> provide an additional path apart from the default '.clang-format'.
But that is not a requirement. The requirement is to allow us to
use what we have in .clang-format plus one other rule.
And if that requirement is met by copying the entire contents in
.clang-format to a temporary file, adding the other one to the same
temporary file, and then using the temporary file instead of
.clang-format, that is fine, isn't it?
^ permalink raw reply [flat|nested] 127+ messages in thread
* Re: [PATCH v3 8/8] ci/style-check: add `RemoveBracesLLVM` to '.clang-format'
2024-07-15 14:46 ` Junio C Hamano
@ 2024-07-15 16:07 ` Karthik Nayak
2024-07-15 16:36 ` Junio C Hamano
0 siblings, 1 reply; 127+ messages in thread
From: Karthik Nayak @ 2024-07-15 16:07 UTC (permalink / raw)
To: Junio C Hamano; +Cc: Ramsay Jones, chriscool, git, jltobler, phillip.wood123
[-- Attachment #1: Type: text/plain, Size: 1363 bytes --]
Junio C Hamano <gitster@pobox.com> writes:
> Karthik Nayak <karthik.188@gmail.com> writes:
>
>> Providing a path does work indeed. But we were discussing the option to
>> provide an additional path apart from the default '.clang-format'.
>
> But that is not a requirement. The requirement is to allow us to
> use what we have in .clang-format plus one other rule.
>
> And if that requirement is met by copying the entire contents in
> .clang-format to a temporary file, adding the other one to the same
> temporary file, and then using the temporary file instead of
> .clang-format, that is fine, isn't it?
Ah right. Let me summarise:
- Method 1: Inject the extra config to '.clang-format' in the CI's job.
This is the current method.
- Method 2: Create '.clang-format-ci' to use in the CI
- Method 2.a: The new file contains '.clang-format' + CI specific
rules.
- Method 2.b: The new file simply contains the new rules and we inject
the rest in the CI's job.
I'd say methods '1' and '2.b' are similar, since they modify the tree on
the CI. So no real benefit of one over the other, no?
The issue with method '2.a' is that we have two sources of truth and we
need to ensure both files are updates always.
Since the former methods don't have any cons of maintenance apart from
seeming a bit hacky, I'd prefer that. But happy to go the other way too!
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 690 bytes --]
^ permalink raw reply [flat|nested] 127+ messages in thread
* Re: [PATCH v3 8/8] ci/style-check: add `RemoveBracesLLVM` to '.clang-format'
2024-07-15 16:07 ` Karthik Nayak
@ 2024-07-15 16:36 ` Junio C Hamano
2024-07-15 19:31 ` Karthik Nayak
0 siblings, 1 reply; 127+ messages in thread
From: Junio C Hamano @ 2024-07-15 16:36 UTC (permalink / raw)
To: Karthik Nayak; +Cc: Ramsay Jones, chriscool, git, jltobler, phillip.wood123
Karthik Nayak <karthik.188@gmail.com> writes:
> Ah right. Let me summarise:
> - Method 1: Inject the extra config to '.clang-format' in the CI's job.
> This is the current method.
> - Method 2: Create '.clang-format-ci' to use in the CI
> - Method 2.a: The new file contains '.clang-format' + CI specific
> rules.
> - Method 2.b: The new file simply contains the new rules and we inject
> the rest in the CI's job.
>
> I'd say methods '1' and '2.b' are similar, since they modify the tree on
> the CI. So no real benefit of one over the other, no?
Sorry, but I am not sure what you are trying to say, especially with
2.a and 2.b, your assumption on "the new file". Is it tracked?
Try running "git describe --dirty" and see if the command can tell
the difference. If you smudge .clang-format, which is a tracked
file, it will be noticed.
But you can use a temporary file and use --style=file:/... to point
at it. The temporary file can be an untracked and ignored file,
just like any *.o files we would create during a build. Then "git
describe --dirty" would not complain that you are making the working
tree dirty.
The temporary file does not even have to be inside our working tree.
If we know we can write into /tmp/clang-format-rules file, then the
CI script can do something like
{
cat .clang-format
echo echo "RemoveBracesLLVM: true"
} >/tmp/clang-format-rules
git clang-format --style=file:/tmp/clang-format-rules \
--diff --extensions c,h "$baseCommit"
right? Then "git status" would even say "there is no untracked
cruft" (although I do not know we *need* to keep the working tree
that clean, without untracked cruft).
^ permalink raw reply [flat|nested] 127+ messages in thread
* Re: [PATCH v4 8/8] ci/style-check: add `RemoveBracesLLVM` to '.clang-format'
2024-07-15 9:30 ` [PATCH v4 8/8] ci/style-check: add `RemoveBracesLLVM` to '.clang-format' Karthik Nayak
@ 2024-07-15 17:01 ` Junio C Hamano
2024-07-15 19:33 ` Karthik Nayak
0 siblings, 1 reply; 127+ messages in thread
From: Junio C Hamano @ 2024-07-15 17:01 UTC (permalink / raw)
To: Karthik Nayak; +Cc: chriscool, git, jltobler, phillip.wood123
Karthik Nayak <karthik.188@gmail.com> writes:
> A more ideal solution would be if 'clang-format' allowed us to append
> rules to the existing '.clang-format' when invoked. But such an option
> does not exist. Since modifying the in-tree '.clang-format' is only done
> on the CI job for style-check and doesn't affect any other jobs and is
> not persisted in any ways, this hack should be okay.
I think our mails crossed, but I do not know why this hack is OK.
Are there other CI jobs that muck with tracked files in the working
tree?
Thanks.
^ permalink raw reply [flat|nested] 127+ messages in thread
* Re: [PATCH v3 8/8] ci/style-check: add `RemoveBracesLLVM` to '.clang-format'
2024-07-15 16:36 ` Junio C Hamano
@ 2024-07-15 19:31 ` Karthik Nayak
2024-07-15 19:45 ` Junio C Hamano
0 siblings, 1 reply; 127+ messages in thread
From: Karthik Nayak @ 2024-07-15 19:31 UTC (permalink / raw)
To: Junio C Hamano; +Cc: Ramsay Jones, chriscool, git, jltobler, phillip.wood123
[-- Attachment #1: Type: text/plain, Size: 2025 bytes --]
Junio C Hamano <gitster@pobox.com> writes:
> Karthik Nayak <karthik.188@gmail.com> writes:
>
>> Ah right. Let me summarise:
>> - Method 1: Inject the extra config to '.clang-format' in the CI's job.
>> This is the current method.
>> - Method 2: Create '.clang-format-ci' to use in the CI
>> - Method 2.a: The new file contains '.clang-format' + CI specific
>> rules.
>> - Method 2.b: The new file simply contains the new rules and we inject
>> the rest in the CI's job.
>>
>> I'd say methods '1' and '2.b' are similar, since they modify the tree on
>> the CI. So no real benefit of one over the other, no?
>
> Sorry, but I am not sure what you are trying to say, especially with
> 2.a and 2.b, your assumption on "the new file". Is it tracked?
>
Yes. I was referring to a tracked file.
> Try running "git describe --dirty" and see if the command can tell
> the difference. If you smudge .clang-format, which is a tracked
> file, it will be noticed.
>
> But you can use a temporary file and use --style=file:/... to point
> at it. The temporary file can be an untracked and ignored file,
> just like any *.o files we would create during a build. Then "git
> describe --dirty" would not complain that you are making the working
> tree dirty.
>
> The temporary file does not even have to be inside our working tree.
I feel stupid now. I completely didn't think of this and this solves
everything. Thanks for being explicit here. The temporary file
absolutely doesn't have to be in our working tree.
> If we know we can write into /tmp/clang-format-rules file, then the
> CI script can do something like
>
> {
> cat .clang-format
> echo echo "RemoveBracesLLVM: true"
> } >/tmp/clang-format-rules
> git clang-format --style=file:/tmp/clang-format-rules \
> --diff --extensions c,h "$baseCommit"
>
> right? Then "git status" would even say "there is no untracked
> cruft" (although I do not know we *need* to keep the working tree
> that clean, without untracked cruft).
Yes this is the best solution.
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 690 bytes --]
^ permalink raw reply [flat|nested] 127+ messages in thread
* Re: [PATCH v4 8/8] ci/style-check: add `RemoveBracesLLVM` to '.clang-format'
2024-07-15 17:01 ` Junio C Hamano
@ 2024-07-15 19:33 ` Karthik Nayak
0 siblings, 0 replies; 127+ messages in thread
From: Karthik Nayak @ 2024-07-15 19:33 UTC (permalink / raw)
To: Junio C Hamano; +Cc: chriscool, git, jltobler, phillip.wood123
[-- Attachment #1: Type: text/plain, Size: 965 bytes --]
Junio C Hamano <gitster@pobox.com> writes:
> Karthik Nayak <karthik.188@gmail.com> writes:
>
>> A more ideal solution would be if 'clang-format' allowed us to append
>> rules to the existing '.clang-format' when invoked. But such an option
>> does not exist. Since modifying the in-tree '.clang-format' is only done
>> on the CI job for style-check and doesn't affect any other jobs and is
>> not persisted in any ways, this hack should be okay.
>
> I think our mails crossed, but I do not know why this hack is OK.
> Are there other CI jobs that muck with tracked files in the working
> tree?
>
> Thanks.
I mean from an operation of a CI job, the repository is discarded after
the job. So there isn't a problem with murking with the working tree.
But I agree to your latest response [1], it would be best to do this
with a temporary file outside the working tree.
Will send a new version soon! Thanks
[1]: https://lore.kernel.org/r/xmqqle224npf.fsf@gitster.g
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 690 bytes --]
^ permalink raw reply [flat|nested] 127+ messages in thread
* Re: [PATCH v3 8/8] ci/style-check: add `RemoveBracesLLVM` to '.clang-format'
2024-07-15 19:31 ` Karthik Nayak
@ 2024-07-15 19:45 ` Junio C Hamano
2024-07-18 8:18 ` Karthik Nayak
0 siblings, 1 reply; 127+ messages in thread
From: Junio C Hamano @ 2024-07-15 19:45 UTC (permalink / raw)
To: Karthik Nayak; +Cc: Ramsay Jones, chriscool, git, jltobler, phillip.wood123
Karthik Nayak <karthik.188@gmail.com> writes:
>> If we know we can write into /tmp/clang-format-rules file, then the
>> CI script can do something like
>>
>> {
>> cat .clang-format
>> echo echo "RemoveBracesLLVM: true"
>> } >/tmp/clang-format-rules
>> git clang-format --style=file:/tmp/clang-format-rules \
>> --diff --extensions c,h "$baseCommit"
>>
>> right? Then "git status" would even say "there is no untracked
>> cruft" (although I do not know we *need* to keep the working tree
>> that clean, without untracked cruft).
>
> Yes this is the best solution.
FWIW, I think an in-tree throw-away file is a better option, simply
because we _know_ that the working tree can be written (by the fact
that we can do "make" and have compilers write *.o and other cruft),
but we do not know if the CI environment allows us to write to /tmp
or /var/tmp or /usr/local/tmp and you do not want to run around and
see if there is a suitable temporary directory you can use.
^ permalink raw reply [flat|nested] 127+ messages in thread
* [PATCH v5 0/6] : add more rules and enable on CI
2024-07-15 9:30 ` [PATCH v4 0/8] clang-format: add more rules and enable on CI Karthik Nayak
` (7 preceding siblings ...)
2024-07-15 9:30 ` [PATCH v4 8/8] ci/style-check: add `RemoveBracesLLVM` to '.clang-format' Karthik Nayak
@ 2024-07-18 8:15 ` Karthik Nayak
2024-07-18 8:16 ` [PATCH v5 1/6] clang-format: indent preprocessor directives after hash Karthik Nayak
` (7 more replies)
8 siblings, 8 replies; 127+ messages in thread
From: Karthik Nayak @ 2024-07-18 8:15 UTC (permalink / raw)
To: karthik.188; +Cc: chriscool, git, gitster, jltobler, phillip.wood123
This is v5 of my series to add clang-format to the CI.
The series was mostly inspired by a patch sent recently to 'include
kh_foreach* macros in ForEachMacros' [1]. I was wondering why we don't
run the formatting on CI and reduce some of the workload of reviewers.
We have a '.clang-format' file to provide rules for code formatting.
The commits 1-3 aims to add more rules to the file.
Commit 4 enables CI action on GitHub and GitLab to also check for the
code formatting. Currently, it is allowed to fail. This way we can build
confidence and fine tune the values as needed and finally enforce the
check in a future patch. I'm not well versed with GitHub workflows, and
I mostly tried to copy existing work there. Expecting some feedback in
that section!
Commit 5 fixes an existing issue with the 'check-whitespace' job, which
is failing as success in the GitLab CI.
Commit 6 adds the `RemoveBracesLLVM` only in the context of the CI. If we
decide against it, we could drop this commit from the series.
1: https://lore.kernel.org/git/4e7893f5-2dd9-46cf-8a64-cf780f4e1730@web.de/
Changes against v4:
- While testing out temp file as source for the CI, I noticed that version
of clang-format on GitHub is much older than that of GitLab, in accordance
with that, I removed some of the rules which are newer and not supported.
- Cleaned up extra dependency addition in 'install-dependencies'.
- Instead of murking the in-tree '.clang-format', now we create a temporary
file and use that.
Test jobs:
- With error:
- GitLab: https://gitlab.com/gitlab-org/git/-/jobs/7357893486
- GitHub: https://github.com/git/git/actions/runs/9964605815/job/27533243002
- Without error:
- GitLab: https://gitlab.com/gitlab-org/git/-/jobs/7357903589
- GitHub: https://github.com/git/git/actions/runs/9964631696/job/27533328240
Karthik Nayak (6):
clang-format: indent preprocessor directives after hash
clang-format: avoid spacing around bitfield colon
clang-format: formalize some of the spacing rules
ci: run style check on GitHub and GitLab
check-whitespace: detect if no base_commit is provided
ci/style-check: add `RemoveBracesLLVM` in CI job
.clang-format | 25 +++++++++++++++++++++
.github/workflows/check-style.yml | 34 ++++++++++++++++++++++++++++
.gitlab-ci.yml | 37 ++++++++++++++++++++++++++++++-
ci/check-whitespace.sh | 10 +++++++--
ci/install-dependencies.sh | 4 ++++
ci/run-style-check.sh | 25 +++++++++++++++++++++
6 files changed, 132 insertions(+), 3 deletions(-)
create mode 100644 .github/workflows/check-style.yml
create mode 100755 ci/run-style-check.sh
Range-diff against v4:
1: 6cf91ffc86 = 1: 6cf91ffc86 clang-format: indent preprocessor directives after hash
2: beb002885f = 2: beb002885f clang-format: avoid spacing around bitfield colon
3: 3031be43e7 < -: ---------- clang-format: ensure files end with newlines
4: bc1550e300 < -: ---------- clang-format: replace deprecated option with 'SpacesInParens'
5: 4586c0094b ! 3: 3922529001 clang-format: formalize some of the spacing rules
@@ .clang-format: PointerAlignment: Right
# Put a space before opening parentheses only after control statement keywords.
# void f() {
# if (true) {
-@@ .clang-format: SpaceBeforeAssignmentOperators: true
- # }
- SpaceBeforeParens: ControlStatements
+@@ .clang-format: SpaceBeforeParens: ControlStatements
+ # Don't insert spaces inside empty '()'
+ SpaceInEmptyParentheses: false
+# No space before first '[' in arrays
+# int a[5][5]; not int a [5][5];
@@ .clang-format: SpaceBeforeAssignmentOperators: true
+# No space will be inserted into {}
+# while (true) {} not while (true) { }
+SpaceInEmptyBlock: false
-
++
# The number of spaces before trailing line comments (// - comments).
# This does not affect trailing block comments (/* - comments).
+ SpacesBeforeTrailingComments: 1
6: c18cb23369 ! 4: ae23eb5af8 ci: run style check on GitHub and GitLab
@@ Commit message
this job to fail, so we can validate if this is useful and eventually
enforce it.
- For GitLab, we use the 'CI_MERGE_REQUEST_TARGET_BRANCH_SHA' variable by
- default to obtain the base SHA of the merged pipeline (which is only
- available for merged pipelines [1]). Otherwise we use the
+ For GitHub, we allow the job to pass by adding 'continue-on-error: true'
+ to the workflow. This means the job would show as passed, even if the
+ style check failed. To know the status of the job, users have to
+ manually check the logs.
+
+ For GitLab, we allow the job to pass by adding 'allow_failure: true', to
+ the job. Unlike GitHub, here the job will show as failed with a yellow
+ warning symbol, but the pipeline would still show as passed.
+
+ Also for GitLab, we use the 'CI_MERGE_REQUEST_TARGET_BRANCH_SHA'
+ variable by default to obtain the base SHA of the merged pipeline (which
+ is only available for merged pipelines [1]). Otherwise we use the
'CI_MERGE_REQUEST_DIFF_BASE_SHA' variable.
[1]: https://docs.gitlab.com/ee/ci/variables/predefined_variables.html#predefined-variables-for-merge-request-pipelines
+ Helped-by: Junio C Hamano <gitster@pobox.com>
Signed-off-by: Karthik Nayak <karthik.188@gmail.com>
## .github/workflows/check-style.yml (new) ##
@@ .github/workflows/check-style.yml (new)
+
+jobs:
+ check-style:
++ env:
++ CC: clang
++ jobname: ClangFormat
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/checkout@v4
+ with:
+ fetch-depth: 0
+
++ - run: ci/install-dependencies.sh
++
+ - name: git clang-format
+ continue-on-error: true
+ id: check_out
@@ .gitlab-ci.yml: check-whitespace:
+ allow_failure: true
+ variables:
+ CC: clang
++ jobname: ClangFormat
+ before_script:
+ - ./ci/install-dependencies.sh
+ # Since $CI_MERGE_REQUEST_TARGET_BRANCH_SHA is only defined for merged
@@ .gitlab-ci.yml: check-whitespace:
+ # be defined in all pipelines.
+ script:
+ - |
-+ if test -n "$CI_MERGE_REQUEST_TARGET_BRANCH_SHA"
-+ then
-+ ./ci/run-style-check.sh "$CI_MERGE_REQUEST_TARGET_BRANCH_SHA"
-+ elif test -n "$CI_MERGE_REQUEST_DIFF_BASE_SHA"
++ R=${CI_MERGE_REQUEST_TARGET_BRANCH_SHA-${CI_MERGE_REQUEST_DIFF_BASE_SHA?}}
++
++ if test -z "$R"
+ then
-+ ./ci/run-style-check.sh "$CI_MERGE_REQUEST_DIFF_BASE_SHA"
-+ else
-+ echo "CI_MERGE_REQUEST_DIFF_BASE_SHA should always exist!"; exit 1
++ echo "CI_MERGE_REQUEST_DIFF_BASE_SHA should always exist!"
++ exit 1
+ fi
++ ./ci/run-style-check.sh "$R"
+ rules:
+ - if: $CI_PIPELINE_SOURCE == 'merge_request_event'
+
@@ .gitlab-ci.yml: check-whitespace:
variables:
## ci/install-dependencies.sh ##
-@@ ci/install-dependencies.sh: ubuntu-*)
- make libssl-dev libcurl4-openssl-dev libexpat-dev wget sudo default-jre \
- tcl tk gettext zlib1g-dev perl-modules liberror-perl libauthen-sasl-perl \
- libemail-valid-perl libio-pty-perl libio-socket-ssl-perl libnet-smtp-ssl-perl libdbd-sqlite3-perl libcgi-pm-perl \
-- ${CC_PACKAGE:-${CC:-gcc}} $PYTHON_PACKAGE
-+ ${CC_PACKAGE:-${CC:-gcc}} $PYTHON_PACKAGE clang-format
+@@ ci/install-dependencies.sh: macos-*)
+ esac
- mkdir --parents "$CUSTOM_PATH"
- wget --quiet --directory-prefix="$CUSTOM_PATH" \
+ case "$jobname" in
++ClangFormat)
++ sudo apt-get -q update
++ sudo apt-get -q -y install clang-format
++ ;;
+ StaticAnalysis)
+ sudo apt-get -q update
+ sudo apt-get -q -y install coccinelle libcurl4-openssl-dev libssl-dev \
## ci/run-style-check.sh (new) ##
@@
7: 4d08c570bb ! 5: a38cde03a8 check-whitespace: detect if no base_commit is provided
@@ Commit message
[1]: https://docs.gitlab.com/ee/ci/variables/predefined_variables.html#predefined-variables-for-merge-request-pipelines
+ Helped-by: Junio C Hamano <gitster@pobox.com>
Signed-off-by: Karthik Nayak <karthik.188@gmail.com>
## .gitlab-ci.yml ##
@@ .gitlab-ci.yml: check-whitespace:
script:
- - ./ci/check-whitespace.sh "$CI_MERGE_REQUEST_TARGET_BRANCH_SHA"
+ - |
-+ if test -n "$CI_MERGE_REQUEST_TARGET_BRANCH_SHA"
-+ then
-+ ./ci/check-whitespace.sh "$CI_MERGE_REQUEST_TARGET_BRANCH_SHA"
-+ elif test -n "$CI_MERGE_REQUEST_DIFF_BASE_SHA"
++ R=${CI_MERGE_REQUEST_TARGET_BRANCH_SHA-${CI_MERGE_REQUEST_DIFF_BASE_SHA?}}
++
++ if test -z "$R"
+ then
-+ ./ci/check-whitespace.sh "$CI_MERGE_REQUEST_DIFF_BASE_SHA"
-+ else
-+ echo "CI_MERGE_REQUEST_DIFF_BASE_SHA should always exist!"; exit 1
++ echo "CI_MERGE_REQUEST_DIFF_BASE_SHA should always exist!"
++ exit 1
+ fi
++ ./ci/check-whitespace.sh "$R"
rules:
- if: $CI_PIPELINE_SOURCE == 'merge_request_event'
8: 2b39431f93 ! 6: 008e77bd0a ci/style-check: add `RemoveBracesLLVM` to '.clang-format'
@@ Metadata
Author: Karthik Nayak <karthik.188@gmail.com>
## Commit message ##
- ci/style-check: add `RemoveBracesLLVM` to '.clang-format'
+ ci/style-check: add `RemoveBracesLLVM` in CI job
- For 'clang-format' setting 'RemoveBracesLLVM' to 'true', adds a check
+ For 'clang-format', setting 'RemoveBracesLLVM' to 'true', adds a check
to ensure we avoid curly braces for single-statement bodies in
conditional blocks.
@@ Commit message
rule, adding it to the in-tree '.clang-format' could affect end-users.
Let's only add it to the CI jobs for now. With time, we can evaluate
its efficacy and decide if we want to add it to '.clang-format' or
- retract it entirely.
+ retract it entirely. We do so, by adding the existing rules in
+ '.clang-format' and this rule to a temp file outside the working tree,
+ which is then used by 'git clang-format'. This ensures we don't murk
+ with files in-tree.
[1]: https://clang.llvm.org/docs/ClangFormatStyleOptions.html#removebracesllvm
@@ ci/run-style-check.sh
baseCommit=$1
+-git clang-format --style file --diff --extensions c,h "$baseCommit"
+# Remove optional braces of control statements (if, else, for, and while)
+# according to the LLVM coding style. This avoids braces on simple
+# single-statement bodies of statements but keeps braces if one side of
@@ ci/run-style-check.sh
+# While also ensuring that end-users are not affected directly.
+#
+# [1]: https://clang.llvm.org/docs/ClangFormatStyleOptions.html#removebracesllvm
-+echo "RemoveBracesLLVM: true" >> .clang-format
++{
++ cat .clang-format
++ echo "RemoveBracesLLVM: true"
++} >/tmp/clang-format-rules
+
- git clang-format --style file --diff --extensions c,h "$baseCommit"
++git clang-format --style=file:/tmp/clang-format-rules \
++ --diff --extensions c,h "$baseCommit"
--
2.45.2
^ permalink raw reply [flat|nested] 127+ messages in thread
* [PATCH v5 1/6] clang-format: indent preprocessor directives after hash
2024-07-18 8:15 ` [PATCH v5 0/6] : add more rules and enable on CI Karthik Nayak
@ 2024-07-18 8:16 ` Karthik Nayak
2024-07-18 8:16 ` [PATCH v5 2/6] clang-format: avoid spacing around bitfield colon Karthik Nayak
` (6 subsequent siblings)
7 siblings, 0 replies; 127+ messages in thread
From: Karthik Nayak @ 2024-07-18 8:16 UTC (permalink / raw)
To: karthik.188; +Cc: chriscool, git, gitster, jltobler, phillip.wood123
We do not have a rule around the indentation of preprocessor directives.
This was also discussed on the list [1], noting how there is often
inconsistency in the styling. While there was discussion, there was no
conclusion around what is the preferred style here. One style being
indenting after the hash:
#if FOO
# if BAR
# include <foo>
# endif
#endif
The other being before the hash:
#if FOO
#if BAR
#include <foo>
#endif
#endif
Let's pick the former and add 'IndentPPDirectives: AfterHash' value to
our '.clang-format'. There is no clear reason to pick one over the
other, but it would definitely be nicer to be consistent.
[1]: https://lore.kernel.org/r/xmqqwmmm1bw6.fsf@gitster.g
Signed-off-by: Karthik Nayak <karthik.188@gmail.com>
---
.clang-format | 6 ++++++
1 file changed, 6 insertions(+)
diff --git a/.clang-format b/.clang-format
index 3ed4fac753..5e128519bf 100644
--- a/.clang-format
+++ b/.clang-format
@@ -96,6 +96,12 @@ BreakStringLiterals: false
# Switch statement body is always indented one level more than case labels.
IndentCaseLabels: false
+# Indents directives before the hash.
+# #if FOO
+# # include <foo>
+# #endif
+IndentPPDirectives: AfterHash
+
# Don't indent a function definition or declaration if it is wrapped after the
# type
IndentWrappedFunctionNames: false
--
2.45.2
^ permalink raw reply related [flat|nested] 127+ messages in thread
* [PATCH v5 2/6] clang-format: avoid spacing around bitfield colon
2024-07-18 8:15 ` [PATCH v5 0/6] : add more rules and enable on CI Karthik Nayak
2024-07-18 8:16 ` [PATCH v5 1/6] clang-format: indent preprocessor directives after hash Karthik Nayak
@ 2024-07-18 8:16 ` Karthik Nayak
2024-07-18 8:16 ` [PATCH v5 3/6] clang-format: formalize some of the spacing rules Karthik Nayak
` (5 subsequent siblings)
7 siblings, 0 replies; 127+ messages in thread
From: Karthik Nayak @ 2024-07-18 8:16 UTC (permalink / raw)
To: karthik.188; +Cc: chriscool, git, gitster, jltobler, phillip.wood123
The spacing around colons is currently not standardized and as such we
have the following practices in our code base:
- Spacing around the colon `int bf : 1`: 146 instances
- No spacing around the colon `int bf:1`: 148 instances
- Spacing before the colon `int bf :1`: 6 instances
- Spacing after the colon `int bf: 1`: 12 instances
Let's formalize this by picking the most followed pattern and add the
corresponding style to '.clang-format'.
Signed-off-by: Karthik Nayak <karthik.188@gmail.com>
---
.clang-format | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/.clang-format b/.clang-format
index 5e128519bf..803b274dd5 100644
--- a/.clang-format
+++ b/.clang-format
@@ -72,6 +72,10 @@ AlwaysBreakAfterReturnType: None
BinPackArguments: true
BinPackParameters: true
+# Add no space around the bit field
+# unsigned bf:2;
+BitFieldColonSpacing: None
+
# Attach braces to surrounding context except break before braces on function
# definitions.
# void foo()
--
2.45.2
^ permalink raw reply related [flat|nested] 127+ messages in thread
* [PATCH v5 3/6] clang-format: formalize some of the spacing rules
2024-07-18 8:15 ` [PATCH v5 0/6] : add more rules and enable on CI Karthik Nayak
2024-07-18 8:16 ` [PATCH v5 1/6] clang-format: indent preprocessor directives after hash Karthik Nayak
2024-07-18 8:16 ` [PATCH v5 2/6] clang-format: avoid spacing around bitfield colon Karthik Nayak
@ 2024-07-18 8:16 ` Karthik Nayak
2024-07-18 8:16 ` [PATCH v5 4/6] ci: run style check on GitHub and GitLab Karthik Nayak
` (4 subsequent siblings)
7 siblings, 0 replies; 127+ messages in thread
From: Karthik Nayak @ 2024-07-18 8:16 UTC (permalink / raw)
To: karthik.188; +Cc: chriscool, git, gitster, jltobler, phillip.wood123
There are some spacing rules that we follow in the project and it makes
sense to formalize them:
* Ensure there is no space inserted after the logical not '!' operator.
* Ensure there is no space before the case statement's colon.
* Ensure there is no space before the first bracket '[' of an array.
* Ensure there is no space in empty blocks.
Signed-off-by: Karthik Nayak <karthik.188@gmail.com>
---
.clang-format | 15 +++++++++++++++
1 file changed, 15 insertions(+)
diff --git a/.clang-format b/.clang-format
index 803b274dd5..3c8018a1dd 100644
--- a/.clang-format
+++ b/.clang-format
@@ -118,11 +118,18 @@ PointerAlignment: Right
# x = (int32)y; not x = (int32) y;
SpaceAfterCStyleCast: false
+# No space is inserted after the logical not operator
+SpaceAfterLogicalNot: false
+
# Insert spaces before and after assignment operators
# int a = 5; not int a=5;
# a += 42; a+=42;
SpaceBeforeAssignmentOperators: true
+# Spaces will be removed before case colon.
+# case 1: break; not case 1 : break;
+SpaceBeforeCaseColon: false
+
# Put a space before opening parentheses only after control statement keywords.
# void f() {
# if (true) {
@@ -134,6 +141,14 @@ SpaceBeforeParens: ControlStatements
# Don't insert spaces inside empty '()'
SpaceInEmptyParentheses: false
+# No space before first '[' in arrays
+# int a[5][5]; not int a [5][5];
+SpaceBeforeSquareBrackets: false
+
+# No space will be inserted into {}
+# while (true) {} not while (true) { }
+SpaceInEmptyBlock: false
+
# The number of spaces before trailing line comments (// - comments).
# This does not affect trailing block comments (/* - comments).
SpacesBeforeTrailingComments: 1
--
2.45.2
^ permalink raw reply related [flat|nested] 127+ messages in thread
* [PATCH v5 4/6] ci: run style check on GitHub and GitLab
2024-07-18 8:15 ` [PATCH v5 0/6] : add more rules and enable on CI Karthik Nayak
` (2 preceding siblings ...)
2024-07-18 8:16 ` [PATCH v5 3/6] clang-format: formalize some of the spacing rules Karthik Nayak
@ 2024-07-18 8:16 ` Karthik Nayak
2024-07-18 14:56 ` Junio C Hamano
2024-07-18 8:16 ` [PATCH v5 5/6] check-whitespace: detect if no base_commit is provided Karthik Nayak
` (3 subsequent siblings)
7 siblings, 1 reply; 127+ messages in thread
From: Karthik Nayak @ 2024-07-18 8:16 UTC (permalink / raw)
To: karthik.188; +Cc: chriscool, git, gitster, jltobler, phillip.wood123
We don't run style checks on our CI, even though we have a
'.clang-format' setup in the repository. Let's add one, the job will
validate only against the new commits added and will only run on merge
requests. Since we're introducing it for the first time, let's allow
this job to fail, so we can validate if this is useful and eventually
enforce it.
For GitHub, we allow the job to pass by adding 'continue-on-error: true'
to the workflow. This means the job would show as passed, even if the
style check failed. To know the status of the job, users have to
manually check the logs.
For GitLab, we allow the job to pass by adding 'allow_failure: true', to
the job. Unlike GitHub, here the job will show as failed with a yellow
warning symbol, but the pipeline would still show as passed.
Also for GitLab, we use the 'CI_MERGE_REQUEST_TARGET_BRANCH_SHA'
variable by default to obtain the base SHA of the merged pipeline (which
is only available for merged pipelines [1]). Otherwise we use the
'CI_MERGE_REQUEST_DIFF_BASE_SHA' variable.
[1]: https://docs.gitlab.com/ee/ci/variables/predefined_variables.html#predefined-variables-for-merge-request-pipelines
Helped-by: Junio C Hamano <gitster@pobox.com>
Signed-off-by: Karthik Nayak <karthik.188@gmail.com>
---
.github/workflows/check-style.yml | 34 +++++++++++++++++++++++++++++++
.gitlab-ci.yml | 24 ++++++++++++++++++++++
ci/install-dependencies.sh | 4 ++++
ci/run-style-check.sh | 8 ++++++++
4 files changed, 70 insertions(+)
create mode 100644 .github/workflows/check-style.yml
create mode 100755 ci/run-style-check.sh
diff --git a/.github/workflows/check-style.yml b/.github/workflows/check-style.yml
new file mode 100644
index 0000000000..c052a5df23
--- /dev/null
+++ b/.github/workflows/check-style.yml
@@ -0,0 +1,34 @@
+name: check-style
+
+# Get the repository with all commits to ensure that we can analyze
+# all of the commits contributed via the Pull Request.
+
+on:
+ pull_request:
+ types: [opened, synchronize]
+
+# Avoid unnecessary builds. Unlike the main CI jobs, these are not
+# ci-configurable (but could be).
+concurrency:
+ group: ${{ github.workflow }}-${{ github.ref }}
+ cancel-in-progress: true
+
+jobs:
+ check-style:
+ env:
+ CC: clang
+ jobname: ClangFormat
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/checkout@v4
+ with:
+ fetch-depth: 0
+
+ - run: ci/install-dependencies.sh
+
+ - name: git clang-format
+ continue-on-error: true
+ id: check_out
+ run: |
+ ./ci/run-style-check.sh \
+ "${{github.event.pull_request.base.sha}}"
diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 37b991e080..817266226e 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -123,6 +123,30 @@ check-whitespace:
rules:
- if: $CI_PIPELINE_SOURCE == 'merge_request_event'
+check-style:
+ image: ubuntu:latest
+ allow_failure: true
+ variables:
+ CC: clang
+ jobname: ClangFormat
+ before_script:
+ - ./ci/install-dependencies.sh
+ # Since $CI_MERGE_REQUEST_TARGET_BRANCH_SHA is only defined for merged
+ # pipelines, we fallback to $CI_MERGE_REQUEST_DIFF_BASE_SHA, which should
+ # be defined in all pipelines.
+ script:
+ - |
+ R=${CI_MERGE_REQUEST_TARGET_BRANCH_SHA-${CI_MERGE_REQUEST_DIFF_BASE_SHA?}}
+
+ if test -z "$R"
+ then
+ echo "CI_MERGE_REQUEST_DIFF_BASE_SHA should always exist!"
+ exit 1
+ fi
+ ./ci/run-style-check.sh "$R"
+ rules:
+ - if: $CI_PIPELINE_SOURCE == 'merge_request_event'
+
documentation:
image: ubuntu:latest
variables:
diff --git a/ci/install-dependencies.sh b/ci/install-dependencies.sh
index 6ec0f85972..fb34ced8f0 100755
--- a/ci/install-dependencies.sh
+++ b/ci/install-dependencies.sh
@@ -87,6 +87,10 @@ macos-*)
esac
case "$jobname" in
+ClangFormat)
+ sudo apt-get -q update
+ sudo apt-get -q -y install clang-format
+ ;;
StaticAnalysis)
sudo apt-get -q update
sudo apt-get -q -y install coccinelle libcurl4-openssl-dev libssl-dev \
diff --git a/ci/run-style-check.sh b/ci/run-style-check.sh
new file mode 100755
index 0000000000..76dd37d22b
--- /dev/null
+++ b/ci/run-style-check.sh
@@ -0,0 +1,8 @@
+#!/bin/sh
+#
+# Perform style check
+#
+
+baseCommit=$1
+
+git clang-format --style file --diff --extensions c,h "$baseCommit"
--
2.45.2
^ permalink raw reply related [flat|nested] 127+ messages in thread
* [PATCH v5 5/6] check-whitespace: detect if no base_commit is provided
2024-07-18 8:15 ` [PATCH v5 0/6] : add more rules and enable on CI Karthik Nayak
` (3 preceding siblings ...)
2024-07-18 8:16 ` [PATCH v5 4/6] ci: run style check on GitHub and GitLab Karthik Nayak
@ 2024-07-18 8:16 ` Karthik Nayak
2024-07-18 15:00 ` Junio C Hamano
2024-07-18 8:16 ` [PATCH v5 6/6] ci/style-check: add `RemoveBracesLLVM` in CI job Karthik Nayak
` (2 subsequent siblings)
7 siblings, 1 reply; 127+ messages in thread
From: Karthik Nayak @ 2024-07-18 8:16 UTC (permalink / raw)
To: karthik.188; +Cc: chriscool, git, gitster, jltobler, phillip.wood123
The 'check-whitespace' CI script exits gracefully if no base commit is
provided or if an invalid revision is provided. This is not good because
if a particular CI provides an incorrect base_commit, it would fail
successfully.
This is exactly the case with the GitLab CI. The CI is using the
"$CI_MERGE_REQUEST_TARGET_BRANCH_SHA" variable to get the base commit
SHA, but variable is only defined for _merged_ pipelines. So it is empty
for regular pipelines [1]. This should've failed the check-whitespace
job.
Let's fallback to 'CI_MERGE_REQUEST_DIFF_BASE_SHA' if
"CI_MERGE_REQUEST_TARGET_BRANCH_SHA" isn't available in GitLab CI,
similar to the previous commit. Let's also add a check for incorrect
base_commit in the 'check-whitespace.sh' script. While here, fix a small
typo too.
[1]: https://docs.gitlab.com/ee/ci/variables/predefined_variables.html#predefined-variables-for-merge-request-pipelines
Helped-by: Junio C Hamano <gitster@pobox.com>
Signed-off-by: Karthik Nayak <karthik.188@gmail.com>
---
.gitlab-ci.yml | 13 ++++++++++++-
ci/check-whitespace.sh | 10 ++++++++--
2 files changed, 20 insertions(+), 3 deletions(-)
diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 817266226e..320b78b9ae 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -118,8 +118,19 @@ check-whitespace:
image: ubuntu:latest
before_script:
- ./ci/install-dependencies.sh
+ # Since $CI_MERGE_REQUEST_TARGET_BRANCH_SHA is only defined for merged
+ # pipelines, we fallback to $CI_MERGE_REQUEST_DIFF_BASE_SHA, which should
+ # be defined in all pipelines.
script:
- - ./ci/check-whitespace.sh "$CI_MERGE_REQUEST_TARGET_BRANCH_SHA"
+ - |
+ R=${CI_MERGE_REQUEST_TARGET_BRANCH_SHA-${CI_MERGE_REQUEST_DIFF_BASE_SHA?}}
+
+ if test -z "$R"
+ then
+ echo "CI_MERGE_REQUEST_DIFF_BASE_SHA should always exist!"
+ exit 1
+ fi
+ ./ci/check-whitespace.sh "$R"
rules:
- if: $CI_PIPELINE_SOURCE == 'merge_request_event'
diff --git a/ci/check-whitespace.sh b/ci/check-whitespace.sh
index db399097a5..c40804394c 100755
--- a/ci/check-whitespace.sh
+++ b/ci/check-whitespace.sh
@@ -9,7 +9,7 @@ baseCommit=$1
outputFile=$2
url=$3
-if test "$#" -ne 1 && test "$#" -ne 3
+if test "$#" -ne 1 && test "$#" -ne 3 || test -z "$1"
then
echo "USAGE: $0 <BASE_COMMIT> [<OUTPUT_FILE> <URL>]"
exit 1
@@ -21,6 +21,12 @@ commitText=
commitTextmd=
goodParent=
+if ! git rev-parse --quiet --verify "${baseCommit}"
+then
+ echo "Invalid <BASE_COMMIT> '${baseCommit}'"
+ exit 1
+fi
+
while read dash sha etc
do
case "${dash}" in
@@ -67,7 +73,7 @@ then
goodParent=${baseCommit: 0:7}
fi
- echo "A whitespace issue was found in onen of more of the commits."
+ echo "A whitespace issue was found in one or more of the commits."
echo "Run the following command to resolve whitespace issues:"
echo "git rebase --whitespace=fix ${goodParent}"
--
2.45.2
^ permalink raw reply related [flat|nested] 127+ messages in thread
* [PATCH v5 6/6] ci/style-check: add `RemoveBracesLLVM` in CI job
2024-07-18 8:15 ` [PATCH v5 0/6] : add more rules and enable on CI Karthik Nayak
` (4 preceding siblings ...)
2024-07-18 8:16 ` [PATCH v5 5/6] check-whitespace: detect if no base_commit is provided Karthik Nayak
@ 2024-07-18 8:16 ` Karthik Nayak
2024-07-18 15:09 ` [PATCH v5 0/6] : add more rules and enable on CI Junio C Hamano
2024-07-23 8:21 ` [PATCH v6 0/6] clang-format: " Karthik Nayak
7 siblings, 0 replies; 127+ messages in thread
From: Karthik Nayak @ 2024-07-18 8:16 UTC (permalink / raw)
To: karthik.188; +Cc: chriscool, git, gitster, jltobler, phillip.wood123
For 'clang-format', setting 'RemoveBracesLLVM' to 'true', adds a check
to ensure we avoid curly braces for single-statement bodies in
conditional blocks.
However, the option does come with two warnings [1]:
This option will be renamed and expanded to support other styles.
and
Setting this option to true could lead to incorrect code formatting
due to clang-format’s lack of complete semantic information. As
such, extra care should be taken to review code changes made by
this option.
The latter seems to be of concern. While we want to experiment with the
rule, adding it to the in-tree '.clang-format' could affect end-users.
Let's only add it to the CI jobs for now. With time, we can evaluate
its efficacy and decide if we want to add it to '.clang-format' or
retract it entirely. We do so, by adding the existing rules in
'.clang-format' and this rule to a temp file outside the working tree,
which is then used by 'git clang-format'. This ensures we don't murk
with files in-tree.
[1]: https://clang.llvm.org/docs/ClangFormatStyleOptions.html#removebracesllvm
Signed-off-by: Karthik Nayak <karthik.188@gmail.com>
---
ci/run-style-check.sh | 19 ++++++++++++++++++-
1 file changed, 18 insertions(+), 1 deletion(-)
diff --git a/ci/run-style-check.sh b/ci/run-style-check.sh
index 76dd37d22b..6cd4b1d934 100755
--- a/ci/run-style-check.sh
+++ b/ci/run-style-check.sh
@@ -5,4 +5,21 @@
baseCommit=$1
-git clang-format --style file --diff --extensions c,h "$baseCommit"
+# Remove optional braces of control statements (if, else, for, and while)
+# according to the LLVM coding style. This avoids braces on simple
+# single-statement bodies of statements but keeps braces if one side of
+# if/else if/.../else cascade has multi-statement body.
+#
+# As this rule comes with a warning [1], we want to experiment with it
+# before adding it in-tree. since the CI job for the style check is allowed
+# to fail, appending the rule here allows us to validate its efficacy.
+# While also ensuring that end-users are not affected directly.
+#
+# [1]: https://clang.llvm.org/docs/ClangFormatStyleOptions.html#removebracesllvm
+{
+ cat .clang-format
+ echo "RemoveBracesLLVM: true"
+} >/tmp/clang-format-rules
+
+git clang-format --style=file:/tmp/clang-format-rules \
+ --diff --extensions c,h "$baseCommit"
--
2.45.2
^ permalink raw reply related [flat|nested] 127+ messages in thread
* Re: [PATCH v3 8/8] ci/style-check: add `RemoveBracesLLVM` to '.clang-format'
2024-07-15 19:45 ` Junio C Hamano
@ 2024-07-18 8:18 ` Karthik Nayak
2024-07-18 14:05 ` Junio C Hamano
0 siblings, 1 reply; 127+ messages in thread
From: Karthik Nayak @ 2024-07-18 8:18 UTC (permalink / raw)
To: Junio C Hamano; +Cc: Ramsay Jones, chriscool, git, jltobler, phillip.wood123
[-- Attachment #1: Type: text/plain, Size: 1339 bytes --]
Junio C Hamano <gitster@pobox.com> writes:
> Karthik Nayak <karthik.188@gmail.com> writes:
>
>>> If we know we can write into /tmp/clang-format-rules file, then the
>>> CI script can do something like
>>>
>>> {
>>> cat .clang-format
>>> echo echo "RemoveBracesLLVM: true"
>>> } >/tmp/clang-format-rules
>>> git clang-format --style=file:/tmp/clang-format-rules \
>>> --diff --extensions c,h "$baseCommit"
>>>
>>> right? Then "git status" would even say "there is no untracked
>>> cruft" (although I do not know we *need* to keep the working tree
>>> that clean, without untracked cruft).
>>
>> Yes this is the best solution.
>
> FWIW, I think an in-tree throw-away file is a better option, simply
> because we _know_ that the working tree can be written (by the fact
> that we can do "make" and have compilers write *.o and other cruft),
> but we do not know if the CI environment allows us to write to /tmp
> or /var/tmp or /usr/local/tmp and you do not want to run around and
> see if there is a suitable temporary directory you can use.
Sorry I got a bit busy with work. But I did end up testing out writing
to a temp file and it works on both GitHub and GitLab CIs. Also I found
some of the rules are too new for the clang-format in GitHub, so I
removed some of them.
Overall, I've sent a new version with these changes.
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 690 bytes --]
^ permalink raw reply [flat|nested] 127+ messages in thread
* Re: [PATCH v3 8/8] ci/style-check: add `RemoveBracesLLVM` to '.clang-format'
2024-07-18 8:18 ` Karthik Nayak
@ 2024-07-18 14:05 ` Junio C Hamano
0 siblings, 0 replies; 127+ messages in thread
From: Junio C Hamano @ 2024-07-18 14:05 UTC (permalink / raw)
To: Karthik Nayak; +Cc: Ramsay Jones, chriscool, git, jltobler, phillip.wood123
Karthik Nayak <karthik.188@gmail.com> writes:
> Sorry I got a bit busy with work. But I did end up testing out writing
> to a temp file and it works on both GitHub and GitLab CIs. Also I found
> some of the rules are too new for the clang-format in GitHub, so I
> removed some of them.
Thanks, both are really appreciated, especially the latter about
checking the features that are available.
^ permalink raw reply [flat|nested] 127+ messages in thread
* Re: [PATCH v5 4/6] ci: run style check on GitHub and GitLab
2024-07-18 8:16 ` [PATCH v5 4/6] ci: run style check on GitHub and GitLab Karthik Nayak
@ 2024-07-18 14:56 ` Junio C Hamano
2024-07-18 16:04 ` Junio C Hamano
0 siblings, 1 reply; 127+ messages in thread
From: Junio C Hamano @ 2024-07-18 14:56 UTC (permalink / raw)
To: Karthik Nayak; +Cc: chriscool, git, jltobler, phillip.wood123
Karthik Nayak <karthik.188@gmail.com> writes:
> + # Since $CI_MERGE_REQUEST_TARGET_BRANCH_SHA is only defined for merged
> + # pipelines, we fallback to $CI_MERGE_REQUEST_DIFF_BASE_SHA, which should
> + # be defined in all pipelines.
> + script:
> + - |
> + R=${CI_MERGE_REQUEST_TARGET_BRANCH_SHA-${CI_MERGE_REQUEST_DIFF_BASE_SHA?}}
> +
> + if test -z "$R"
> + then
> + echo "CI_MERGE_REQUEST_DIFF_BASE_SHA should always exist!"
> + exit 1
> + fi
If you update the assignment to R to
R=${CI_MERGE_REQUEST_TARGET_BRANCH_SHA-${CI_MERGE_REQUEST_DIFF_BASE_SHA:?}}
an unset CI_MERGE_REQUEST_DIFF_BASE_SHA1 or an empty value in it
will be rejected there. Then you can lose the if/then/fi here.
> + ./ci/run-style-check.sh "$R"
> + rules:
> + - if: $CI_PIPELINE_SOURCE == 'merge_request_event'
> +
> documentation:
> image: ubuntu:latest
> variables:
> diff --git a/ci/install-dependencies.sh b/ci/install-dependencies.sh
> index 6ec0f85972..fb34ced8f0 100755
> --- a/ci/install-dependencies.sh
> +++ b/ci/install-dependencies.sh
> @@ -87,6 +87,10 @@ macos-*)
> esac
>
> case "$jobname" in
> +ClangFormat)
> + sudo apt-get -q update
> + sudo apt-get -q -y install clang-format
> + ;;
> StaticAnalysis)
> sudo apt-get -q update
> sudo apt-get -q -y install coccinelle libcurl4-openssl-dev libssl-dev \
> diff --git a/ci/run-style-check.sh b/ci/run-style-check.sh
> new file mode 100755
> index 0000000000..76dd37d22b
> --- /dev/null
> +++ b/ci/run-style-check.sh
> @@ -0,0 +1,8 @@
> +#!/bin/sh
> +#
> +# Perform style check
> +#
> +
> +baseCommit=$1
> +
> +git clang-format --style file --diff --extensions c,h "$baseCommit"
^ permalink raw reply [flat|nested] 127+ messages in thread
* Re: [PATCH v5 5/6] check-whitespace: detect if no base_commit is provided
2024-07-18 8:16 ` [PATCH v5 5/6] check-whitespace: detect if no base_commit is provided Karthik Nayak
@ 2024-07-18 15:00 ` Junio C Hamano
2024-07-19 8:33 ` Karthik Nayak
0 siblings, 1 reply; 127+ messages in thread
From: Junio C Hamano @ 2024-07-18 15:00 UTC (permalink / raw)
To: Karthik Nayak; +Cc: chriscool, git, jltobler, phillip.wood123
Karthik Nayak <karthik.188@gmail.com> writes:
> + - |
> + R=${CI_MERGE_REQUEST_TARGET_BRANCH_SHA-${CI_MERGE_REQUEST_DIFF_BASE_SHA?}}
> +
> + if test -z "$R"
> + then
> + echo "CI_MERGE_REQUEST_DIFF_BASE_SHA should always exist!"
> + exit 1
> + fi
The same comment applies as the previous step.
R=${A-${B:?}} || exit
should be sufficient.
A demonstration.
$ unset A; unset B; C=${A-${B:?}} && echo "C=$C"
bash: B: parameter null or not set
$ A=a; unset B; C=${A-${B:?}} && echo "C=$C"
C=a
$ unset A; B=; C=${A-${B:?}} && echo "C=$C"
bash: B: parameter null or not set
$ unset A; B=b; C=${A-${B:?}} && echo "C=$C"
C=b
$ A=a; B=b; C=${A-${B:?}} && echo "C=$C"
C=a
Note that the broken case we do not see C=<value> becaues the
assignment fails with non-zero status.
Thanks.
^ permalink raw reply [flat|nested] 127+ messages in thread
* Re: [PATCH v5 0/6] : add more rules and enable on CI
2024-07-18 8:15 ` [PATCH v5 0/6] : add more rules and enable on CI Karthik Nayak
` (5 preceding siblings ...)
2024-07-18 8:16 ` [PATCH v5 6/6] ci/style-check: add `RemoveBracesLLVM` in CI job Karthik Nayak
@ 2024-07-18 15:09 ` Junio C Hamano
2024-07-23 8:21 ` [PATCH v6 0/6] clang-format: " Karthik Nayak
7 siblings, 0 replies; 127+ messages in thread
From: Junio C Hamano @ 2024-07-18 15:09 UTC (permalink / raw)
To: Karthik Nayak; +Cc: chriscool, git, jltobler, phillip.wood123
Karthik Nayak <karthik.188@gmail.com> writes:
> Changes against v4:
> - While testing out temp file as source for the CI, I noticed that version
> of clang-format on GitHub is much older than that of GitLab, in accordance
> with that, I removed some of the rules which are newer and not supported.
Let's see what we lost relative to the previous round.
-# Insert a newline at end of file if missing
-InsertNewlineAtEOF: true
I guess we can do "git diff --check $BASE...HEAD", if we wanted to,
which will trigger 'blank-at-eol' and other whitespace checks.
+# Don't insert spaces inside empty '()'
+SpaceInEmptyParentheses: false
+
-SpacesInParens: Custom
-SpacesInParensOptions:
- # Don't insert spaces inside empty '()'
- InEmptyParentheses: false
+# Don't insert spaces after '(' or before ')'
+# f(arg); not f( arg );
+SpacesInParentheses: false
This was to express what we used an older construct to express by
using a newer construct? So we are not losing anything here.
So, I guess loss of changes to a few rules is nothing to shed tears
on.
Unrelated to the rules part, this caught my eyes, but
diff --git c/ci/install-dependencies.sh w/ci/install-dependencies.sh
index 8b01bfb89f..fb34ced8f0 100755
--- c/ci/install-dependencies.sh
+++ w/ci/install-dependencies.sh
- ${CC_PACKAGE:-${CC:-gcc}} $PYTHON_PACKAGE clang-format
+ ${CC_PACKAGE:-${CC:-gcc}} $PYTHON_PACKAGE
this is to stop installing clang-format everywhere because we are
already installing it in ClangFormat job anyway? A good change.
Thanks.
^ permalink raw reply [flat|nested] 127+ messages in thread
* Re: [PATCH v5 4/6] ci: run style check on GitHub and GitLab
2024-07-18 14:56 ` Junio C Hamano
@ 2024-07-18 16:04 ` Junio C Hamano
0 siblings, 0 replies; 127+ messages in thread
From: Junio C Hamano @ 2024-07-18 16:04 UTC (permalink / raw)
To: Karthik Nayak; +Cc: chriscool, git, jltobler, phillip.wood123
Junio C Hamano <gitster@pobox.com> writes:
> Karthik Nayak <karthik.188@gmail.com> writes:
> ...
>> + R=${CI_MERGE_REQUEST_TARGET_BRANCH_SHA-${CI_MERGE_REQUEST_DIFF_BASE_SHA?}}
>> +
>> + if test -z "$R"
>> + then
>> + echo "CI_MERGE_REQUEST_DIFF_BASE_SHA should always exist!"
>> + exit 1
>> + fi
>
> If you update the assignment to R to
>
> R=${CI_MERGE_REQUEST_TARGET_BRANCH_SHA-${CI_MERGE_REQUEST_DIFF_BASE_SHA:?}}
>
> an unset CI_MERGE_REQUEST_DIFF_BASE_SHA1 or an empty value in it
> will be rejected there. Then you can lose the if/then/fi here.
Actually, you also need to pay attention to the exit status of the
assignment, i.e.
R=${CI_MERGE_REQUEST_TARGET_BRANCH_SHA-${CI_MERGE_REQUEST_DIFF_BASE_SHA:?}} ||
exit
^ permalink raw reply [flat|nested] 127+ messages in thread
* Re: [PATCH v5 5/6] check-whitespace: detect if no base_commit is provided
2024-07-18 15:00 ` Junio C Hamano
@ 2024-07-19 8:33 ` Karthik Nayak
2024-07-19 15:03 ` Junio C Hamano
0 siblings, 1 reply; 127+ messages in thread
From: Karthik Nayak @ 2024-07-19 8:33 UTC (permalink / raw)
To: Junio C Hamano; +Cc: chriscool, git, jltobler, phillip.wood123
[-- Attachment #1: Type: text/plain, Size: 1393 bytes --]
Junio C Hamano <gitster@pobox.com> writes:
> Karthik Nayak <karthik.188@gmail.com> writes:
>
>> + - |
>> + R=${CI_MERGE_REQUEST_TARGET_BRANCH_SHA-${CI_MERGE_REQUEST_DIFF_BASE_SHA?}}
>> +
>> + if test -z "$R"
>> + then
>> + echo "CI_MERGE_REQUEST_DIFF_BASE_SHA should always exist!"
>> + exit 1
>> + fi
>
> The same comment applies as the previous step.
>
> R=${A-${B:?}} || exit
>
> should be sufficient.
>
> A demonstration.
>
> $ unset A; unset B; C=${A-${B:?}} && echo "C=$C"
> bash: B: parameter null or not set
> $ A=a; unset B; C=${A-${B:?}} && echo "C=$C"
> C=a
> $ unset A; B=; C=${A-${B:?}} && echo "C=$C"
> bash: B: parameter null or not set
> $ unset A; B=b; C=${A-${B:?}} && echo "C=$C"
> C=b
> $ A=a; B=b; C=${A-${B:?}} && echo "C=$C"
> C=a
>
> Note that the broken case we do not see C=<value> becaues the
> assignment fails with non-zero status.
>
> Thanks.
Thanks Junio for explaining with examples, really nice of you! I'm on
the fence with this, even the existing change from the previous more
verbose code. I know this is shorter, but it is always more readable to
use the longer version with 'test'. I find it hard to remember the
specifics. But I don't really care which one makes it in the end.
Let me know if you think it is worth a reroll.
Thanks
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 690 bytes --]
^ permalink raw reply [flat|nested] 127+ messages in thread
* Re: [PATCH v5 5/6] check-whitespace: detect if no base_commit is provided
2024-07-19 8:33 ` Karthik Nayak
@ 2024-07-19 15:03 ` Junio C Hamano
2024-07-22 7:22 ` Karthik Nayak
0 siblings, 1 reply; 127+ messages in thread
From: Junio C Hamano @ 2024-07-19 15:03 UTC (permalink / raw)
To: Karthik Nayak; +Cc: chriscool, git, jltobler, phillip.wood123
Karthik Nayak <karthik.188@gmail.com> writes:
> Thanks Junio for explaining with examples, really nice of you! I'm on
> the fence with this, even the existing change from the previous more
> verbose code. I know this is shorter, but it is always more readable to
> use the longer version with 'test'. I find it hard to remember the
> specifics.
You'd never remember unless you practice, but it boils down to one
question: is it reasonable to expect that most developers who need
to touch this code find it worth to learn to read and write shell
scripts well in this day and age? The answer is probably no.
As you may remember, this R=${A-${B?}} dance started at
https://lore.kernel.org/git/xmqqwmlpb8er.fsf@gitster.g/
where I said:
...
in a separate "after the dust settles" clean-up #leftoverbits topic.
We could replace the first 7 lines with a single-liner
R=${CI_MERGE_REQUEST_TARGET_BRANCH_SHA-${CI_MERGE_REQUEST_DIFF_BASE_SHA?}}
if we wanted to, but all of that will be mere clean-up changes.
Even the longhand to set a single R with if/elif cascade so that we
can have a single location that invokes ci/run-style-check.sh was
considered extra clean-up for #leftoverbits at least by me.
But after seeing you used the ${A-${B?}} dance, which is more
advanced than the #leftoverbits clean-up, I thought you were
interested in using such a construct that pursues parameter
expansion mastery, and that was the primary reason why the
demonstration in the message you are responding to was added.
I personally do not care too deeply which one to use wrt the
readability, but
R=${A-${B?}}
if test -z "$R"
then
error
fi
looks strange and inconsistent by spreading the error check to two
places. The code would be better off if it were
R=${A-$B}
if test -z "$R"
then
error
fi
(or with R=${A:-$B}) instead. Then it makes it clear that the
author wanted to take care of the error case with the if part.
^ permalink raw reply [flat|nested] 127+ messages in thread
* Re: [PATCH v5 5/6] check-whitespace: detect if no base_commit is provided
2024-07-19 15:03 ` Junio C Hamano
@ 2024-07-22 7:22 ` Karthik Nayak
0 siblings, 0 replies; 127+ messages in thread
From: Karthik Nayak @ 2024-07-22 7:22 UTC (permalink / raw)
To: Junio C Hamano; +Cc: chriscool, git, jltobler, phillip.wood123
[-- Attachment #1: Type: text/plain, Size: 2246 bytes --]
Junio C Hamano <gitster@pobox.com> writes:
> Karthik Nayak <karthik.188@gmail.com> writes:
>
>> Thanks Junio for explaining with examples, really nice of you! I'm on
>> the fence with this, even the existing change from the previous more
>> verbose code. I know this is shorter, but it is always more readable to
>> use the longer version with 'test'. I find it hard to remember the
>> specifics.
>
> You'd never remember unless you practice, but it boils down to one
> question: is it reasonable to expect that most developers who need
> to touch this code find it worth to learn to read and write shell
> scripts well in this day and age? The answer is probably no.
>
> As you may remember, this R=${A-${B?}} dance started at
>
> https://lore.kernel.org/git/xmqqwmlpb8er.fsf@gitster.g/
>
> where I said:
>
> ...
> in a separate "after the dust settles" clean-up #leftoverbits topic.
>
> We could replace the first 7 lines with a single-liner
>
> R=${CI_MERGE_REQUEST_TARGET_BRANCH_SHA-${CI_MERGE_REQUEST_DIFF_BASE_SHA?}}
>
> if we wanted to, but all of that will be mere clean-up changes.
>
> Even the longhand to set a single R with if/elif cascade so that we
> can have a single location that invokes ci/run-style-check.sh was
> considered extra clean-up for #leftoverbits at least by me.
>
> But after seeing you used the ${A-${B?}} dance, which is more
> advanced than the #leftoverbits clean-up, I thought you were
> interested in using such a construct that pursues parameter
> expansion mastery, and that was the primary reason why the
> demonstration in the message you are responding to was added.
>
> I personally do not care too deeply which one to use wrt the
> readability, but
>
> R=${A-${B?}}
> if test -z "$R"
> then
> error
> fi
>
> looks strange and inconsistent by spreading the error check to two
> places. The code would be better off if it were
>
> R=${A-$B}
> if test -z "$R"
> then
> error
> fi
>
> (or with R=${A:-$B}) instead. Then it makes it clear that the
> author wanted to take care of the error case with the if part.
Yeah fair enough, we are deep into it and might and makes sense to make
it more consistent. I'll incorporate your suggestion and send in a new
version.
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 690 bytes --]
^ permalink raw reply [flat|nested] 127+ messages in thread
* [PATCH v6 0/6] clang-format: add more rules and enable on CI
2024-07-18 8:15 ` [PATCH v5 0/6] : add more rules and enable on CI Karthik Nayak
` (6 preceding siblings ...)
2024-07-18 15:09 ` [PATCH v5 0/6] : add more rules and enable on CI Junio C Hamano
@ 2024-07-23 8:21 ` Karthik Nayak
2024-07-23 8:21 ` [PATCH v6 1/6] clang-format: indent preprocessor directives after hash Karthik Nayak
` (5 more replies)
7 siblings, 6 replies; 127+ messages in thread
From: Karthik Nayak @ 2024-07-23 8:21 UTC (permalink / raw)
To: karthik.188; +Cc: chriscool, git, gitster, jltobler, phillip.wood123
This is v6 of my series to add clang-format to the CI.
The series was mostly inspired by a patch sent recently to 'include
kh_foreach* macros in ForEachMacros' [1]. I was wondering why we don't
run the formatting on CI and reduce some of the workload of reviewers.
We have a '.clang-format' file to provide rules for code formatting.
The commits 1-3 aims to add more rules to the file.
Commit 4 enables CI action on GitHub and GitLab to also check for the
code formatting. Currently, it is allowed to fail. This way we can build
confidence and fine tune the values as needed and finally enforce the
check in a future patch. I'm not well versed with GitHub workflows, and
I mostly tried to copy existing work there. Expecting some feedback in
that section!
Commit 5 fixes an existing issue with the 'check-whitespace' job, which
is failing as success in the GitLab CI.
Commit 6 adds the `RemoveBracesLLVM` only in the context of the CI. If we
decide against it, we could drop this commit from the series.
1: https://lore.kernel.org/git/4e7893f5-2dd9-46cf-8a64-cf780f4e1730@web.de/
Changes from v5:
- Used 'C=${A-${B:?}}' instead of 'C=${A-${B?}}' for obtaining the base OID
in GitLab CI script. The difference being that the former also checks
for B being empty. With this we can simplify the script from
R=${A-${B?}}
if test -z "$R"
then
error
fi
to
R=${A-${B:?}} || exit
* CI without issues
- GitLab: https://gitlab.com/gitlab-org/git/-/jobs/7394162598
- GitHub: https://github.com/KarthikNayak/git/actions/runs/10037207688/job/27736512636?pr=1
* CI with issues detected
- GitLab: https://gitlab.com/gitlab-org/git/-/jobs/7394406605
- GitHub: https://github.com/KarthikNayak/git/actions/runs/10037229508/job/27736859486
Karthik Nayak (6):
clang-format: indent preprocessor directives after hash
clang-format: avoid spacing around bitfield colon
clang-format: formalize some of the spacing rules
ci: run style check on GitHub and GitLab
check-whitespace: detect if no base_commit is provided
ci/style-check: add `RemoveBracesLLVM` in CI job
.clang-format | 25 +++++++++++++++++++++++
.github/workflows/check-style.yml | 34 +++++++++++++++++++++++++++++++
.gitlab-ci.yml | 25 ++++++++++++++++++++++-
ci/check-whitespace.sh | 10 +++++++--
ci/install-dependencies.sh | 4 ++++
ci/run-style-check.sh | 25 +++++++++++++++++++++++
6 files changed, 120 insertions(+), 3 deletions(-)
create mode 100644 .github/workflows/check-style.yml
create mode 100755 ci/run-style-check.sh
Range-diff against v5:
1: 6cf91ffc86 = 1: 6cf91ffc86 clang-format: indent preprocessor directives after hash
2: beb002885f = 2: beb002885f clang-format: avoid spacing around bitfield colon
3: 3922529001 = 3: 3922529001 clang-format: formalize some of the spacing rules
4: ae23eb5af8 ! 4: 14718625ad ci: run style check on GitHub and GitLab
@@ .gitlab-ci.yml: check-whitespace:
+ # be defined in all pipelines.
+ script:
+ - |
-+ R=${CI_MERGE_REQUEST_TARGET_BRANCH_SHA-${CI_MERGE_REQUEST_DIFF_BASE_SHA?}}
-+
-+ if test -z "$R"
-+ then
-+ echo "CI_MERGE_REQUEST_DIFF_BASE_SHA should always exist!"
-+ exit 1
-+ fi
++ R=${CI_MERGE_REQUEST_TARGET_BRANCH_SHA-${CI_MERGE_REQUEST_DIFF_BASE_SHA:?}} || exit
+ ./ci/run-style-check.sh "$R"
+ rules:
+ - if: $CI_PIPELINE_SOURCE == 'merge_request_event'
5: a38cde03a8 ! 5: fb8c30852b check-whitespace: detect if no base_commit is provided
@@ .gitlab-ci.yml: check-whitespace:
script:
- - ./ci/check-whitespace.sh "$CI_MERGE_REQUEST_TARGET_BRANCH_SHA"
+ - |
-+ R=${CI_MERGE_REQUEST_TARGET_BRANCH_SHA-${CI_MERGE_REQUEST_DIFF_BASE_SHA?}}
-+
-+ if test -z "$R"
-+ then
-+ echo "CI_MERGE_REQUEST_DIFF_BASE_SHA should always exist!"
-+ exit 1
-+ fi
++ R=${CI_MERGE_REQUEST_TARGET_BRANCH_SHA-${CI_MERGE_REQUEST_DIFF_BASE_SHA:?}} || exit
+ ./ci/check-whitespace.sh "$R"
rules:
- if: $CI_PIPELINE_SOURCE == 'merge_request_event'
6: 008e77bd0a = 6: 08c5bb777d ci/style-check: add `RemoveBracesLLVM` in CI job
--
2.45.2
^ permalink raw reply [flat|nested] 127+ messages in thread
* [PATCH v6 1/6] clang-format: indent preprocessor directives after hash
2024-07-23 8:21 ` [PATCH v6 0/6] clang-format: " Karthik Nayak
@ 2024-07-23 8:21 ` Karthik Nayak
2024-07-24 6:50 ` Patrick Steinhardt
2024-07-23 8:21 ` [PATCH v6 2/6] clang-format: avoid spacing around bitfield colon Karthik Nayak
` (4 subsequent siblings)
5 siblings, 1 reply; 127+ messages in thread
From: Karthik Nayak @ 2024-07-23 8:21 UTC (permalink / raw)
To: karthik.188; +Cc: chriscool, git, gitster, jltobler, phillip.wood123
We do not have a rule around the indentation of preprocessor directives.
This was also discussed on the list [1], noting how there is often
inconsistency in the styling. While there was discussion, there was no
conclusion around what is the preferred style here. One style being
indenting after the hash:
#if FOO
# if BAR
# include <foo>
# endif
#endif
The other being before the hash:
#if FOO
#if BAR
#include <foo>
#endif
#endif
Let's pick the former and add 'IndentPPDirectives: AfterHash' value to
our '.clang-format'. There is no clear reason to pick one over the
other, but it would definitely be nicer to be consistent.
[1]: https://lore.kernel.org/r/xmqqwmmm1bw6.fsf@gitster.g
Signed-off-by: Karthik Nayak <karthik.188@gmail.com>
---
.clang-format | 6 ++++++
1 file changed, 6 insertions(+)
diff --git a/.clang-format b/.clang-format
index 3ed4fac753..5e128519bf 100644
--- a/.clang-format
+++ b/.clang-format
@@ -96,6 +96,12 @@ BreakStringLiterals: false
# Switch statement body is always indented one level more than case labels.
IndentCaseLabels: false
+# Indents directives before the hash.
+# #if FOO
+# # include <foo>
+# #endif
+IndentPPDirectives: AfterHash
+
# Don't indent a function definition or declaration if it is wrapped after the
# type
IndentWrappedFunctionNames: false
--
2.45.2
^ permalink raw reply related [flat|nested] 127+ messages in thread
* [PATCH v6 2/6] clang-format: avoid spacing around bitfield colon
2024-07-23 8:21 ` [PATCH v6 0/6] clang-format: " Karthik Nayak
2024-07-23 8:21 ` [PATCH v6 1/6] clang-format: indent preprocessor directives after hash Karthik Nayak
@ 2024-07-23 8:21 ` Karthik Nayak
2024-07-23 8:21 ` [PATCH v6 3/6] clang-format: formalize some of the spacing rules Karthik Nayak
` (3 subsequent siblings)
5 siblings, 0 replies; 127+ messages in thread
From: Karthik Nayak @ 2024-07-23 8:21 UTC (permalink / raw)
To: karthik.188; +Cc: chriscool, git, gitster, jltobler, phillip.wood123
The spacing around colons is currently not standardized and as such we
have the following practices in our code base:
- Spacing around the colon `int bf : 1`: 146 instances
- No spacing around the colon `int bf:1`: 148 instances
- Spacing before the colon `int bf :1`: 6 instances
- Spacing after the colon `int bf: 1`: 12 instances
Let's formalize this by picking the most followed pattern and add the
corresponding style to '.clang-format'.
Signed-off-by: Karthik Nayak <karthik.188@gmail.com>
---
.clang-format | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/.clang-format b/.clang-format
index 5e128519bf..803b274dd5 100644
--- a/.clang-format
+++ b/.clang-format
@@ -72,6 +72,10 @@ AlwaysBreakAfterReturnType: None
BinPackArguments: true
BinPackParameters: true
+# Add no space around the bit field
+# unsigned bf:2;
+BitFieldColonSpacing: None
+
# Attach braces to surrounding context except break before braces on function
# definitions.
# void foo()
--
2.45.2
^ permalink raw reply related [flat|nested] 127+ messages in thread
* [PATCH v6 3/6] clang-format: formalize some of the spacing rules
2024-07-23 8:21 ` [PATCH v6 0/6] clang-format: " Karthik Nayak
2024-07-23 8:21 ` [PATCH v6 1/6] clang-format: indent preprocessor directives after hash Karthik Nayak
2024-07-23 8:21 ` [PATCH v6 2/6] clang-format: avoid spacing around bitfield colon Karthik Nayak
@ 2024-07-23 8:21 ` Karthik Nayak
2024-07-23 8:21 ` [PATCH v6 4/6] ci: run style check on GitHub and GitLab Karthik Nayak
` (2 subsequent siblings)
5 siblings, 0 replies; 127+ messages in thread
From: Karthik Nayak @ 2024-07-23 8:21 UTC (permalink / raw)
To: karthik.188; +Cc: chriscool, git, gitster, jltobler, phillip.wood123
There are some spacing rules that we follow in the project and it makes
sense to formalize them:
* Ensure there is no space inserted after the logical not '!' operator.
* Ensure there is no space before the case statement's colon.
* Ensure there is no space before the first bracket '[' of an array.
* Ensure there is no space in empty blocks.
Signed-off-by: Karthik Nayak <karthik.188@gmail.com>
---
.clang-format | 15 +++++++++++++++
1 file changed, 15 insertions(+)
diff --git a/.clang-format b/.clang-format
index 803b274dd5..3c8018a1dd 100644
--- a/.clang-format
+++ b/.clang-format
@@ -118,11 +118,18 @@ PointerAlignment: Right
# x = (int32)y; not x = (int32) y;
SpaceAfterCStyleCast: false
+# No space is inserted after the logical not operator
+SpaceAfterLogicalNot: false
+
# Insert spaces before and after assignment operators
# int a = 5; not int a=5;
# a += 42; a+=42;
SpaceBeforeAssignmentOperators: true
+# Spaces will be removed before case colon.
+# case 1: break; not case 1 : break;
+SpaceBeforeCaseColon: false
+
# Put a space before opening parentheses only after control statement keywords.
# void f() {
# if (true) {
@@ -134,6 +141,14 @@ SpaceBeforeParens: ControlStatements
# Don't insert spaces inside empty '()'
SpaceInEmptyParentheses: false
+# No space before first '[' in arrays
+# int a[5][5]; not int a [5][5];
+SpaceBeforeSquareBrackets: false
+
+# No space will be inserted into {}
+# while (true) {} not while (true) { }
+SpaceInEmptyBlock: false
+
# The number of spaces before trailing line comments (// - comments).
# This does not affect trailing block comments (/* - comments).
SpacesBeforeTrailingComments: 1
--
2.45.2
^ permalink raw reply related [flat|nested] 127+ messages in thread
* [PATCH v6 4/6] ci: run style check on GitHub and GitLab
2024-07-23 8:21 ` [PATCH v6 0/6] clang-format: " Karthik Nayak
` (2 preceding siblings ...)
2024-07-23 8:21 ` [PATCH v6 3/6] clang-format: formalize some of the spacing rules Karthik Nayak
@ 2024-07-23 8:21 ` Karthik Nayak
2024-07-23 8:21 ` [PATCH v6 5/6] check-whitespace: detect if no base_commit is provided Karthik Nayak
2024-07-23 8:21 ` [PATCH v6 6/6] ci/style-check: add `RemoveBracesLLVM` in CI job Karthik Nayak
5 siblings, 0 replies; 127+ messages in thread
From: Karthik Nayak @ 2024-07-23 8:21 UTC (permalink / raw)
To: karthik.188; +Cc: chriscool, git, gitster, jltobler, phillip.wood123
We don't run style checks on our CI, even though we have a
'.clang-format' setup in the repository. Let's add one, the job will
validate only against the new commits added and will only run on merge
requests. Since we're introducing it for the first time, let's allow
this job to fail, so we can validate if this is useful and eventually
enforce it.
For GitHub, we allow the job to pass by adding 'continue-on-error: true'
to the workflow. This means the job would show as passed, even if the
style check failed. To know the status of the job, users have to
manually check the logs.
For GitLab, we allow the job to pass by adding 'allow_failure: true', to
the job. Unlike GitHub, here the job will show as failed with a yellow
warning symbol, but the pipeline would still show as passed.
Also for GitLab, we use the 'CI_MERGE_REQUEST_TARGET_BRANCH_SHA'
variable by default to obtain the base SHA of the merged pipeline (which
is only available for merged pipelines [1]). Otherwise we use the
'CI_MERGE_REQUEST_DIFF_BASE_SHA' variable.
[1]: https://docs.gitlab.com/ee/ci/variables/predefined_variables.html#predefined-variables-for-merge-request-pipelines
Helped-by: Junio C Hamano <gitster@pobox.com>
Signed-off-by: Karthik Nayak <karthik.188@gmail.com>
---
.github/workflows/check-style.yml | 34 +++++++++++++++++++++++++++++++
.gitlab-ci.yml | 18 ++++++++++++++++
ci/install-dependencies.sh | 4 ++++
ci/run-style-check.sh | 8 ++++++++
4 files changed, 64 insertions(+)
create mode 100644 .github/workflows/check-style.yml
create mode 100755 ci/run-style-check.sh
diff --git a/.github/workflows/check-style.yml b/.github/workflows/check-style.yml
new file mode 100644
index 0000000000..c052a5df23
--- /dev/null
+++ b/.github/workflows/check-style.yml
@@ -0,0 +1,34 @@
+name: check-style
+
+# Get the repository with all commits to ensure that we can analyze
+# all of the commits contributed via the Pull Request.
+
+on:
+ pull_request:
+ types: [opened, synchronize]
+
+# Avoid unnecessary builds. Unlike the main CI jobs, these are not
+# ci-configurable (but could be).
+concurrency:
+ group: ${{ github.workflow }}-${{ github.ref }}
+ cancel-in-progress: true
+
+jobs:
+ check-style:
+ env:
+ CC: clang
+ jobname: ClangFormat
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/checkout@v4
+ with:
+ fetch-depth: 0
+
+ - run: ci/install-dependencies.sh
+
+ - name: git clang-format
+ continue-on-error: true
+ id: check_out
+ run: |
+ ./ci/run-style-check.sh \
+ "${{github.event.pull_request.base.sha}}"
diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 37b991e080..2886f6e182 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -123,6 +123,24 @@ check-whitespace:
rules:
- if: $CI_PIPELINE_SOURCE == 'merge_request_event'
+check-style:
+ image: ubuntu:latest
+ allow_failure: true
+ variables:
+ CC: clang
+ jobname: ClangFormat
+ before_script:
+ - ./ci/install-dependencies.sh
+ # Since $CI_MERGE_REQUEST_TARGET_BRANCH_SHA is only defined for merged
+ # pipelines, we fallback to $CI_MERGE_REQUEST_DIFF_BASE_SHA, which should
+ # be defined in all pipelines.
+ script:
+ - |
+ R=${CI_MERGE_REQUEST_TARGET_BRANCH_SHA-${CI_MERGE_REQUEST_DIFF_BASE_SHA:?}} || exit
+ ./ci/run-style-check.sh "$R"
+ rules:
+ - if: $CI_PIPELINE_SOURCE == 'merge_request_event'
+
documentation:
image: ubuntu:latest
variables:
diff --git a/ci/install-dependencies.sh b/ci/install-dependencies.sh
index 6ec0f85972..fb34ced8f0 100755
--- a/ci/install-dependencies.sh
+++ b/ci/install-dependencies.sh
@@ -87,6 +87,10 @@ macos-*)
esac
case "$jobname" in
+ClangFormat)
+ sudo apt-get -q update
+ sudo apt-get -q -y install clang-format
+ ;;
StaticAnalysis)
sudo apt-get -q update
sudo apt-get -q -y install coccinelle libcurl4-openssl-dev libssl-dev \
diff --git a/ci/run-style-check.sh b/ci/run-style-check.sh
new file mode 100755
index 0000000000..76dd37d22b
--- /dev/null
+++ b/ci/run-style-check.sh
@@ -0,0 +1,8 @@
+#!/bin/sh
+#
+# Perform style check
+#
+
+baseCommit=$1
+
+git clang-format --style file --diff --extensions c,h "$baseCommit"
--
2.45.2
^ permalink raw reply related [flat|nested] 127+ messages in thread
* [PATCH v6 5/6] check-whitespace: detect if no base_commit is provided
2024-07-23 8:21 ` [PATCH v6 0/6] clang-format: " Karthik Nayak
` (3 preceding siblings ...)
2024-07-23 8:21 ` [PATCH v6 4/6] ci: run style check on GitHub and GitLab Karthik Nayak
@ 2024-07-23 8:21 ` Karthik Nayak
2024-07-23 8:21 ` [PATCH v6 6/6] ci/style-check: add `RemoveBracesLLVM` in CI job Karthik Nayak
5 siblings, 0 replies; 127+ messages in thread
From: Karthik Nayak @ 2024-07-23 8:21 UTC (permalink / raw)
To: karthik.188; +Cc: chriscool, git, gitster, jltobler, phillip.wood123
The 'check-whitespace' CI script exits gracefully if no base commit is
provided or if an invalid revision is provided. This is not good because
if a particular CI provides an incorrect base_commit, it would fail
successfully.
This is exactly the case with the GitLab CI. The CI is using the
"$CI_MERGE_REQUEST_TARGET_BRANCH_SHA" variable to get the base commit
SHA, but variable is only defined for _merged_ pipelines. So it is empty
for regular pipelines [1]. This should've failed the check-whitespace
job.
Let's fallback to 'CI_MERGE_REQUEST_DIFF_BASE_SHA' if
"CI_MERGE_REQUEST_TARGET_BRANCH_SHA" isn't available in GitLab CI,
similar to the previous commit. Let's also add a check for incorrect
base_commit in the 'check-whitespace.sh' script. While here, fix a small
typo too.
[1]: https://docs.gitlab.com/ee/ci/variables/predefined_variables.html#predefined-variables-for-merge-request-pipelines
Helped-by: Junio C Hamano <gitster@pobox.com>
Signed-off-by: Karthik Nayak <karthik.188@gmail.com>
---
.gitlab-ci.yml | 7 ++++++-
ci/check-whitespace.sh | 10 ++++++++--
2 files changed, 14 insertions(+), 3 deletions(-)
diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 2886f6e182..2589098eff 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -118,8 +118,13 @@ check-whitespace:
image: ubuntu:latest
before_script:
- ./ci/install-dependencies.sh
+ # Since $CI_MERGE_REQUEST_TARGET_BRANCH_SHA is only defined for merged
+ # pipelines, we fallback to $CI_MERGE_REQUEST_DIFF_BASE_SHA, which should
+ # be defined in all pipelines.
script:
- - ./ci/check-whitespace.sh "$CI_MERGE_REQUEST_TARGET_BRANCH_SHA"
+ - |
+ R=${CI_MERGE_REQUEST_TARGET_BRANCH_SHA-${CI_MERGE_REQUEST_DIFF_BASE_SHA:?}} || exit
+ ./ci/check-whitespace.sh "$R"
rules:
- if: $CI_PIPELINE_SOURCE == 'merge_request_event'
diff --git a/ci/check-whitespace.sh b/ci/check-whitespace.sh
index db399097a5..c40804394c 100755
--- a/ci/check-whitespace.sh
+++ b/ci/check-whitespace.sh
@@ -9,7 +9,7 @@ baseCommit=$1
outputFile=$2
url=$3
-if test "$#" -ne 1 && test "$#" -ne 3
+if test "$#" -ne 1 && test "$#" -ne 3 || test -z "$1"
then
echo "USAGE: $0 <BASE_COMMIT> [<OUTPUT_FILE> <URL>]"
exit 1
@@ -21,6 +21,12 @@ commitText=
commitTextmd=
goodParent=
+if ! git rev-parse --quiet --verify "${baseCommit}"
+then
+ echo "Invalid <BASE_COMMIT> '${baseCommit}'"
+ exit 1
+fi
+
while read dash sha etc
do
case "${dash}" in
@@ -67,7 +73,7 @@ then
goodParent=${baseCommit: 0:7}
fi
- echo "A whitespace issue was found in onen of more of the commits."
+ echo "A whitespace issue was found in one or more of the commits."
echo "Run the following command to resolve whitespace issues:"
echo "git rebase --whitespace=fix ${goodParent}"
--
2.45.2
^ permalink raw reply related [flat|nested] 127+ messages in thread
* [PATCH v6 6/6] ci/style-check: add `RemoveBracesLLVM` in CI job
2024-07-23 8:21 ` [PATCH v6 0/6] clang-format: " Karthik Nayak
` (4 preceding siblings ...)
2024-07-23 8:21 ` [PATCH v6 5/6] check-whitespace: detect if no base_commit is provided Karthik Nayak
@ 2024-07-23 8:21 ` Karthik Nayak
2025-06-19 15:16 ` Junio C Hamano
5 siblings, 1 reply; 127+ messages in thread
From: Karthik Nayak @ 2024-07-23 8:21 UTC (permalink / raw)
To: karthik.188; +Cc: chriscool, git, gitster, jltobler, phillip.wood123
For 'clang-format', setting 'RemoveBracesLLVM' to 'true', adds a check
to ensure we avoid curly braces for single-statement bodies in
conditional blocks.
However, the option does come with two warnings [1]:
This option will be renamed and expanded to support other styles.
and
Setting this option to true could lead to incorrect code formatting
due to clang-format’s lack of complete semantic information. As
such, extra care should be taken to review code changes made by
this option.
The latter seems to be of concern. While we want to experiment with the
rule, adding it to the in-tree '.clang-format' could affect end-users.
Let's only add it to the CI jobs for now. With time, we can evaluate
its efficacy and decide if we want to add it to '.clang-format' or
retract it entirely. We do so, by adding the existing rules in
'.clang-format' and this rule to a temp file outside the working tree,
which is then used by 'git clang-format'. This ensures we don't murk
with files in-tree.
[1]: https://clang.llvm.org/docs/ClangFormatStyleOptions.html#removebracesllvm
Signed-off-by: Karthik Nayak <karthik.188@gmail.com>
---
ci/run-style-check.sh | 19 ++++++++++++++++++-
1 file changed, 18 insertions(+), 1 deletion(-)
diff --git a/ci/run-style-check.sh b/ci/run-style-check.sh
index 76dd37d22b..6cd4b1d934 100755
--- a/ci/run-style-check.sh
+++ b/ci/run-style-check.sh
@@ -5,4 +5,21 @@
baseCommit=$1
-git clang-format --style file --diff --extensions c,h "$baseCommit"
+# Remove optional braces of control statements (if, else, for, and while)
+# according to the LLVM coding style. This avoids braces on simple
+# single-statement bodies of statements but keeps braces if one side of
+# if/else if/.../else cascade has multi-statement body.
+#
+# As this rule comes with a warning [1], we want to experiment with it
+# before adding it in-tree. since the CI job for the style check is allowed
+# to fail, appending the rule here allows us to validate its efficacy.
+# While also ensuring that end-users are not affected directly.
+#
+# [1]: https://clang.llvm.org/docs/ClangFormatStyleOptions.html#removebracesllvm
+{
+ cat .clang-format
+ echo "RemoveBracesLLVM: true"
+} >/tmp/clang-format-rules
+
+git clang-format --style=file:/tmp/clang-format-rules \
+ --diff --extensions c,h "$baseCommit"
--
2.45.2
^ permalink raw reply related [flat|nested] 127+ messages in thread
* Re: [PATCH v6 1/6] clang-format: indent preprocessor directives after hash
2024-07-23 8:21 ` [PATCH v6 1/6] clang-format: indent preprocessor directives after hash Karthik Nayak
@ 2024-07-24 6:50 ` Patrick Steinhardt
2024-07-24 8:55 ` Karthik Nayak
0 siblings, 1 reply; 127+ messages in thread
From: Patrick Steinhardt @ 2024-07-24 6:50 UTC (permalink / raw)
To: Karthik Nayak; +Cc: chriscool, git, gitster, jltobler, phillip.wood123
[-- Attachment #1: Type: text/plain, Size: 1215 bytes --]
On Tue, Jul 23, 2024 at 10:21:06AM +0200, Karthik Nayak wrote:
> We do not have a rule around the indentation of preprocessor directives.
> This was also discussed on the list [1], noting how there is often
> inconsistency in the styling. While there was discussion, there was no
> conclusion around what is the preferred style here. One style being
> indenting after the hash:
>
> #if FOO
> # if BAR
> # include <foo>
> # endif
> #endif
>
> The other being before the hash:
>
> #if FOO
> #if BAR
> #include <foo>
> #endif
> #endif
>
> Let's pick the former and add 'IndentPPDirectives: AfterHash' value to
> our '.clang-format'. There is no clear reason to pick one over the
> other, but it would definitely be nicer to be consistent.
>
> [1]: https://lore.kernel.org/r/xmqqwmmm1bw6.fsf@gitster.g
>
> Signed-off-by: Karthik Nayak <karthik.188@gmail.com>
This doesn't necessarily have to be part of this patch series, but I
think that we should document this as part of our CodingGuidelines, as
well. I planned to send an update to the coding guidelines soon anyway,
so I can handle that once this topic lands.
Patrick
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]
^ permalink raw reply [flat|nested] 127+ messages in thread
* Re: [PATCH v6 1/6] clang-format: indent preprocessor directives after hash
2024-07-24 6:50 ` Patrick Steinhardt
@ 2024-07-24 8:55 ` Karthik Nayak
0 siblings, 0 replies; 127+ messages in thread
From: Karthik Nayak @ 2024-07-24 8:55 UTC (permalink / raw)
To: Patrick Steinhardt; +Cc: chriscool, git, gitster, jltobler, phillip.wood123
[-- Attachment #1: Type: text/plain, Size: 1348 bytes --]
Patrick Steinhardt <ps@pks.im> writes:
> On Tue, Jul 23, 2024 at 10:21:06AM +0200, Karthik Nayak wrote:
>> We do not have a rule around the indentation of preprocessor directives.
>> This was also discussed on the list [1], noting how there is often
>> inconsistency in the styling. While there was discussion, there was no
>> conclusion around what is the preferred style here. One style being
>> indenting after the hash:
>>
>> #if FOO
>> # if BAR
>> # include <foo>
>> # endif
>> #endif
>>
>> The other being before the hash:
>>
>> #if FOO
>> #if BAR
>> #include <foo>
>> #endif
>> #endif
>>
>> Let's pick the former and add 'IndentPPDirectives: AfterHash' value to
>> our '.clang-format'. There is no clear reason to pick one over the
>> other, but it would definitely be nicer to be consistent.
>>
>> [1]: https://lore.kernel.org/r/xmqqwmmm1bw6.fsf@gitster.g
>>
>> Signed-off-by: Karthik Nayak <karthik.188@gmail.com>
>
> This doesn't necessarily have to be part of this patch series, but I
> think that we should document this as part of our CodingGuidelines, as
> well. I planned to send an update to the coding guidelines soon anyway,
> so I can handle that once this topic lands.
>
> Patrick
Yeah, that would be great indeed. I think this series is now merged to
next.
Thank Patrick
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 690 bytes --]
^ permalink raw reply [flat|nested] 127+ messages in thread
* Re: [PATCH v6 6/6] ci/style-check: add `RemoveBracesLLVM` in CI job
2024-07-23 8:21 ` [PATCH v6 6/6] ci/style-check: add `RemoveBracesLLVM` in CI job Karthik Nayak
@ 2025-06-19 15:16 ` Junio C Hamano
2025-06-19 20:25 ` Karthik Nayak
0 siblings, 1 reply; 127+ messages in thread
From: Junio C Hamano @ 2025-06-19 15:16 UTC (permalink / raw)
To: Karthik Nayak; +Cc: chriscool, git, jltobler, phillip.wood123
Karthik Nayak <karthik.188@gmail.com> writes:
> For 'clang-format', setting 'RemoveBracesLLVM' to 'true', adds a check
> to ensure we avoid curly braces for single-statement bodies in
> conditional blocks.
>
> However, the option does come with two warnings [1]:
>
> This option will be renamed and expanded to support other styles.
>
> and
>
> Setting this option to true could lead to incorrect code formatting
> due to clang-format’s lack of complete semantic information. As
> such, extra care should be taken to review code changes made by
> this option.
>
> The latter seems to be of concern. While we want to experiment with the
> rule, adding it to the in-tree '.clang-format' could affect end-users.
> Let's only add it to the CI jobs for now. With time, we can evaluate
> its efficacy and decide if we want to add it to '.clang-format' or
> retract it entirely. We do so, by adding the existing rules in
> '.clang-format' and this rule to a temp file outside the working tree,
> which is then used by 'git clang-format'. This ensures we don't murk
> with files in-tree.
>
> [1]: https://clang.llvm.org/docs/ClangFormatStyleOptions.html#removebracesllvm
>
> Signed-off-by: Karthik Nayak <karthik.188@gmail.com>
> ---
> ci/run-style-check.sh | 19 ++++++++++++++++++-
> 1 file changed, 18 insertions(+), 1 deletion(-)
Have we done enough experiment by now and don't we want to move it
to the set of rules in our tree?
How often do people use "git clang-format" before they submit their
series these days, by the way?
> diff --git a/ci/run-style-check.sh b/ci/run-style-check.sh
> index 76dd37d22b..6cd4b1d934 100755
> --- a/ci/run-style-check.sh
> +++ b/ci/run-style-check.sh
> @@ -5,4 +5,21 @@
>
> baseCommit=$1
>
> -git clang-format --style file --diff --extensions c,h "$baseCommit"
> +# Remove optional braces of control statements (if, else, for, and while)
> +# according to the LLVM coding style. This avoids braces on simple
> +# single-statement bodies of statements but keeps braces if one side of
> +# if/else if/.../else cascade has multi-statement body.
> +#
> +# As this rule comes with a warning [1], we want to experiment with it
> +# before adding it in-tree. since the CI job for the style check is allowed
> +# to fail, appending the rule here allows us to validate its efficacy.
> +# While also ensuring that end-users are not affected directly.
> +#
> +# [1]: https://clang.llvm.org/docs/ClangFormatStyleOptions.html#removebracesllvm
> +{
> + cat .clang-format
> + echo "RemoveBracesLLVM: true"
> +} >/tmp/clang-format-rules
> +
> +git clang-format --style=file:/tmp/clang-format-rules \
> + --diff --extensions c,h "$baseCommit"
^ permalink raw reply [flat|nested] 127+ messages in thread
* Re: [PATCH v6 6/6] ci/style-check: add `RemoveBracesLLVM` in CI job
2025-06-19 15:16 ` Junio C Hamano
@ 2025-06-19 20:25 ` Karthik Nayak
2025-06-20 0:02 ` Junio C Hamano
0 siblings, 1 reply; 127+ messages in thread
From: Karthik Nayak @ 2025-06-19 20:25 UTC (permalink / raw)
To: Junio C Hamano; +Cc: chriscool, git, jltobler, phillip.wood123
[-- Attachment #1: Type: text/plain, Size: 4012 bytes --]
Junio C Hamano <gitster@pobox.com> writes:
> Karthik Nayak <karthik.188@gmail.com> writes:
>
>> For 'clang-format', setting 'RemoveBracesLLVM' to 'true', adds a check
>> to ensure we avoid curly braces for single-statement bodies in
>> conditional blocks.
>>
>> However, the option does come with two warnings [1]:
>>
>> This option will be renamed and expanded to support other styles.
>>
>> and
>>
>> Setting this option to true could lead to incorrect code formatting
>> due to clang-format’s lack of complete semantic information. As
>> such, extra care should be taken to review code changes made by
>> this option.
>>
>> The latter seems to be of concern. While we want to experiment with the
>> rule, adding it to the in-tree '.clang-format' could affect end-users.
>> Let's only add it to the CI jobs for now. With time, we can evaluate
>> its efficacy and decide if we want to add it to '.clang-format' or
>> retract it entirely. We do so, by adding the existing rules in
>> '.clang-format' and this rule to a temp file outside the working tree,
>> which is then used by 'git clang-format'. This ensures we don't murk
>> with files in-tree.
>>
>> [1]: https://clang.llvm.org/docs/ClangFormatStyleOptions.html#removebracesllvm
>>
>> Signed-off-by: Karthik Nayak <karthik.188@gmail.com>
>> ---
>> ci/run-style-check.sh | 19 ++++++++++++++++++-
>> 1 file changed, 18 insertions(+), 1 deletion(-)
>
> Have we done enough experiment by now and don't we want to move it
> to the set of rules in our tree?
>
Christian and I were talking about clang-format today. So great to see
that you too were thinking about it. I think this particular rule should
be okay to move our tree. For this particular rule, I found one spot it
fails:
$ ./ci/run-style-check.sh @~1
diff --git a/builtin/receive-pack.c b/builtin/receive-pack.c
index 1809539201..341d9eac0d 100644
--- a/builtin/receive-pack.c
+++ b/builtin/receive-pack.c
@@ -1929,12 +1929,11 @@ static void
execute_commands_non_atomic(struct command *commands,
goto cleanup;
failure:
- for (cmd = commands; cmd; cmd = cmd->next) {
+ for (cmd = commands; cmd; cmd = cmd->next)
if (reported_error)
cmd->error_string = reported_error;
else if (strmap_contains(&failed_refs, cmd->ref_name))
cmd->error_string = strmap_get(&failed_refs, cmd->ref_name);
- }
cleanup:
ref_transaction_free(transaction);
We generally add brackets in such scenarios, but the style-check
suggests to use them instead.
> How often do people use "git clang-format" before they submit their
> series these days, by the way?
>
To be honest, I don't think anyone does. As far as I've seen there is
too many false positives currently.
>> diff --git a/ci/run-style-check.sh b/ci/run-style-check.sh
>> index 76dd37d22b..6cd4b1d934 100755
>> --- a/ci/run-style-check.sh
>> +++ b/ci/run-style-check.sh
>> @@ -5,4 +5,21 @@
>>
>> baseCommit=$1
>>
>> -git clang-format --style file --diff --extensions c,h "$baseCommit"
>> +# Remove optional braces of control statements (if, else, for, and while)
>> +# according to the LLVM coding style. This avoids braces on simple
>> +# single-statement bodies of statements but keeps braces if one side of
>> +# if/else if/.../else cascade has multi-statement body.
>> +#
>> +# As this rule comes with a warning [1], we want to experiment with it
>> +# before adding it in-tree. since the CI job for the style check is allowed
>> +# to fail, appending the rule here allows us to validate its efficacy.
>> +# While also ensuring that end-users are not affected directly.
>> +#
>> +# [1]: https://clang.llvm.org/docs/ClangFormatStyleOptions.html#removebracesllvm
>> +{
>> + cat .clang-format
>> + echo "RemoveBracesLLVM: true"
>> +} >/tmp/clang-format-rules
>> +
>> +git clang-format --style=file:/tmp/clang-format-rules \
>> + --diff --extensions c,h "$baseCommit"
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 690 bytes --]
^ permalink raw reply [flat|nested] 127+ messages in thread
* Re: [PATCH v6 6/6] ci/style-check: add `RemoveBracesLLVM` in CI job
2025-06-19 20:25 ` Karthik Nayak
@ 2025-06-20 0:02 ` Junio C Hamano
0 siblings, 0 replies; 127+ messages in thread
From: Junio C Hamano @ 2025-06-20 0:02 UTC (permalink / raw)
To: Karthik Nayak; +Cc: chriscool, git, jltobler, phillip.wood123
Karthik Nayak <karthik.188@gmail.com> writes:
> failure:
> - for (cmd = commands; cmd; cmd = cmd->next) {
> + for (cmd = commands; cmd; cmd = cmd->next)
> if (reported_error)
> cmd->error_string = reported_error;
> else if (strmap_contains(&failed_refs, cmd->ref_name))
> cmd->error_string = strmap_get(&failed_refs, cmd->ref_name);
> - }
>
> cleanup:
> ref_transaction_free(transaction);
>
> We generally add brackets in such scenarios, but the style-check
> suggests to use them instead.
The above falls into "once the code is written" category I mentioned
in the other thread. I do not mind the original, and I do not think
the suggested change makes it significantly worse, but there is no
significant improvement, either. If the original is in the public
tree, it is not worth the patch churn to update it to match the
suggestion, but if the original is something you are yet to send it
out to the public consumption, it would be a good idea to take the
suggestion before sending it out.
^ permalink raw reply [flat|nested] 127+ messages in thread
end of thread, other threads:[~2025-06-20 0:02 UTC | newest]
Thread overview: 127+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2024-07-08 9:23 [PATCH 0/8] clang-format: add more rules and enable on CI Karthik Nayak
2024-07-08 9:23 ` [PATCH 1/8] clang-format: indent preprocessor directives after hash Karthik Nayak
2024-07-08 10:08 ` Chris Torek
2024-07-08 16:22 ` Junio C Hamano
2024-07-08 20:33 ` Karthik Nayak
2024-07-08 16:27 ` Re* " Junio C Hamano
2024-07-08 9:23 ` [PATCH 2/8] clang-format: avoid spacing around bitfield colon Karthik Nayak
2024-07-08 9:23 ` [PATCH 3/8] clang-format: ensure files end with newlines Karthik Nayak
2024-07-08 16:32 ` Junio C Hamano
2024-07-08 9:23 ` [PATCH 4/8] clang-format: replace deprecated option with 'SpacesInParens' Karthik Nayak
2024-07-08 16:32 ` Junio C Hamano
2024-07-08 9:23 ` [PATCH 5/8] clang-format: avoid braces on simple single-statement bodies Karthik Nayak
2024-07-08 16:48 ` Junio C Hamano
2024-07-08 20:25 ` Karthik Nayak
2024-07-12 15:24 ` Phillip Wood
2024-07-13 12:30 ` Karthik Nayak
2024-07-13 13:58 ` phillip.wood123
2024-07-13 14:16 ` Karthik Nayak
2024-07-08 9:23 ` [PATCH 6/8] clang-format: formalize some of the spacing rules Karthik Nayak
2024-07-08 16:54 ` Junio C Hamano
2024-07-08 17:26 ` Karthik Nayak
2024-07-08 16:56 ` Justin Tobler
2024-07-08 17:27 ` Karthik Nayak
2024-07-08 20:53 ` Eric Sunshine
2024-07-10 13:36 ` Karthik Nayak
2024-07-08 9:23 ` [PATCH 7/8] ci: run style check on GitHub and GitLab Karthik Nayak
2024-07-08 17:15 ` Junio C Hamano
2024-07-08 21:05 ` Karthik Nayak
2024-07-08 22:52 ` Re* " Junio C Hamano
2024-07-08 23:17 ` Justin Tobler
2024-07-09 0:56 ` brian m. carlson
2024-07-08 18:10 ` Justin Tobler
2024-07-08 21:16 ` Karthik Nayak
2024-07-09 0:22 ` Justin Tobler
2024-07-09 8:44 ` Karthik Nayak
2024-07-09 14:44 ` Justin Tobler
2024-07-10 13:38 ` Karthik Nayak
2024-07-08 9:23 ` [PATCH 8/8] check-whitespace: detect if no base_commit is provided Karthik Nayak
2024-07-08 10:18 ` Chris Torek
2024-07-08 10:35 ` Georg Pfuetzenreuter
2024-07-08 10:42 ` Chris Torek
2024-07-08 17:13 ` Karthik Nayak
2024-07-08 17:19 ` Junio C Hamano
2024-07-08 17:35 ` Junio C Hamano
2024-07-10 14:06 ` Karthik Nayak
2024-07-10 16:02 ` Junio C Hamano
2024-07-11 8:27 ` Karthik Nayak
2024-07-11 14:41 ` Junio C Hamano
2024-07-08 17:58 ` Justin Tobler
2024-07-10 14:12 ` Karthik Nayak
2024-07-08 10:06 ` [PATCH 0/8] clang-format: add more rules and enable on CI Chris Torek
2024-07-11 8:30 ` [PATCH v2 " Karthik Nayak
2024-07-11 8:30 ` [PATCH v2 1/8] clang-format: indent preprocessor directives after hash Karthik Nayak
2024-07-11 8:30 ` [PATCH v2 2/8] clang-format: avoid spacing around bitfield colon Karthik Nayak
2024-07-11 8:30 ` [PATCH v2 3/8] clang-format: ensure files end with newlines Karthik Nayak
2024-07-11 8:30 ` [PATCH v2 4/8] clang-format: replace deprecated option with 'SpacesInParens' Karthik Nayak
2024-07-11 8:30 ` [PATCH v2 5/8] clang-format: avoid braces on simple single-statement bodies Karthik Nayak
2024-07-11 16:40 ` Junio C Hamano
2024-07-12 8:48 ` Karthik Nayak
2024-07-12 15:09 ` Junio C Hamano
2024-07-12 15:29 ` Phillip Wood
2024-07-11 8:30 ` [PATCH v2 6/8] clang-format: formalize some of the spacing rules Karthik Nayak
2024-07-11 8:30 ` [PATCH v2 7/8] ci: run style check on GitHub and GitLab Karthik Nayak
2024-07-11 8:30 ` [PATCH v2 8/8] check-whitespace: detect if no base_commit is provided Karthik Nayak
2024-07-11 14:48 ` Justin Tobler
2024-07-11 16:16 ` Junio C Hamano
2024-07-12 8:51 ` Karthik Nayak
2024-07-12 15:12 ` Junio C Hamano
2024-07-11 18:11 ` [PATCH v2 0/8] clang-format: add more rules and enable on CI Junio C Hamano
2024-07-13 13:45 ` [PATCH v3 " Karthik Nayak
2024-07-13 13:45 ` [PATCH v3 1/8] clang-format: indent preprocessor directives after hash Karthik Nayak
2024-07-13 13:45 ` [PATCH v3 2/8] clang-format: avoid spacing around bitfield colon Karthik Nayak
2024-07-13 13:45 ` [PATCH v3 3/8] clang-format: ensure files end with newlines Karthik Nayak
2024-07-13 13:45 ` [PATCH v3 4/8] clang-format: replace deprecated option with 'SpacesInParens' Karthik Nayak
2024-07-13 13:45 ` [PATCH v3 5/8] clang-format: formalize some of the spacing rules Karthik Nayak
2024-07-13 13:45 ` [PATCH v3 6/8] ci: run style check on GitHub and GitLab Karthik Nayak
2024-07-13 15:47 ` Junio C Hamano
2024-07-13 13:45 ` [PATCH v3 7/8] check-whitespace: detect if no base_commit is provided Karthik Nayak
2024-07-13 13:45 ` [PATCH v3 8/8] ci/style-check: add `RemoveBracesLLVM` to '.clang-format' Karthik Nayak
2024-07-13 15:37 ` Junio C Hamano
2024-07-13 16:46 ` Karthik Nayak
2024-07-13 23:18 ` Ramsay Jones
2024-07-15 8:10 ` Karthik Nayak
2024-07-15 14:46 ` Junio C Hamano
2024-07-15 16:07 ` Karthik Nayak
2024-07-15 16:36 ` Junio C Hamano
2024-07-15 19:31 ` Karthik Nayak
2024-07-15 19:45 ` Junio C Hamano
2024-07-18 8:18 ` Karthik Nayak
2024-07-18 14:05 ` Junio C Hamano
2024-07-15 9:30 ` [PATCH v4 0/8] clang-format: add more rules and enable on CI Karthik Nayak
2024-07-15 9:30 ` [PATCH v4 1/8] clang-format: indent preprocessor directives after hash Karthik Nayak
2024-07-15 9:30 ` [PATCH v4 2/8] clang-format: avoid spacing around bitfield colon Karthik Nayak
2024-07-15 9:30 ` [PATCH v4 3/8] clang-format: ensure files end with newlines Karthik Nayak
2024-07-15 9:30 ` [PATCH v4 4/8] clang-format: replace deprecated option with 'SpacesInParens' Karthik Nayak
2024-07-15 9:30 ` [PATCH v4 5/8] clang-format: formalize some of the spacing rules Karthik Nayak
2024-07-15 9:30 ` [PATCH v4 6/8] ci: run style check on GitHub and GitLab Karthik Nayak
2024-07-15 9:30 ` [PATCH v4 7/8] check-whitespace: detect if no base_commit is provided Karthik Nayak
2024-07-15 9:30 ` [PATCH v4 8/8] ci/style-check: add `RemoveBracesLLVM` to '.clang-format' Karthik Nayak
2024-07-15 17:01 ` Junio C Hamano
2024-07-15 19:33 ` Karthik Nayak
2024-07-18 8:15 ` [PATCH v5 0/6] : add more rules and enable on CI Karthik Nayak
2024-07-18 8:16 ` [PATCH v5 1/6] clang-format: indent preprocessor directives after hash Karthik Nayak
2024-07-18 8:16 ` [PATCH v5 2/6] clang-format: avoid spacing around bitfield colon Karthik Nayak
2024-07-18 8:16 ` [PATCH v5 3/6] clang-format: formalize some of the spacing rules Karthik Nayak
2024-07-18 8:16 ` [PATCH v5 4/6] ci: run style check on GitHub and GitLab Karthik Nayak
2024-07-18 14:56 ` Junio C Hamano
2024-07-18 16:04 ` Junio C Hamano
2024-07-18 8:16 ` [PATCH v5 5/6] check-whitespace: detect if no base_commit is provided Karthik Nayak
2024-07-18 15:00 ` Junio C Hamano
2024-07-19 8:33 ` Karthik Nayak
2024-07-19 15:03 ` Junio C Hamano
2024-07-22 7:22 ` Karthik Nayak
2024-07-18 8:16 ` [PATCH v5 6/6] ci/style-check: add `RemoveBracesLLVM` in CI job Karthik Nayak
2024-07-18 15:09 ` [PATCH v5 0/6] : add more rules and enable on CI Junio C Hamano
2024-07-23 8:21 ` [PATCH v6 0/6] clang-format: " Karthik Nayak
2024-07-23 8:21 ` [PATCH v6 1/6] clang-format: indent preprocessor directives after hash Karthik Nayak
2024-07-24 6:50 ` Patrick Steinhardt
2024-07-24 8:55 ` Karthik Nayak
2024-07-23 8:21 ` [PATCH v6 2/6] clang-format: avoid spacing around bitfield colon Karthik Nayak
2024-07-23 8:21 ` [PATCH v6 3/6] clang-format: formalize some of the spacing rules Karthik Nayak
2024-07-23 8:21 ` [PATCH v6 4/6] ci: run style check on GitHub and GitLab Karthik Nayak
2024-07-23 8:21 ` [PATCH v6 5/6] check-whitespace: detect if no base_commit is provided Karthik Nayak
2024-07-23 8:21 ` [PATCH v6 6/6] ci/style-check: add `RemoveBracesLLVM` in CI job Karthik Nayak
2025-06-19 15:16 ` Junio C Hamano
2025-06-19 20:25 ` Karthik Nayak
2025-06-20 0:02 ` Junio C Hamano
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).