mirror of
https://github.com/cuberite/libevent.git
synced 2025-09-10 13:04:23 -04:00
Merge branch 'contrib-guide-v2'
Something that should help with reviewing patches. * contrib-guide-v2: Add CONTRIBUTING.md (with checkpatch.sh examples) Add checkpatch script Add config for clang-format Add config for uncrustify Refs: #301
This commit is contained in:
commit
b9c5077e99
63
.clang-format
Normal file
63
.clang-format
Normal file
@ -0,0 +1,63 @@
|
|||||||
|
---
|
||||||
|
Language: Cpp
|
||||||
|
BasedOnStyle: LLVM
|
||||||
|
|
||||||
|
AccessModifierOffset: -4
|
||||||
|
|
||||||
|
AlignAfterOpenBracket: DontAlign
|
||||||
|
AlignEscapedNewlinesLeft: true
|
||||||
|
# AlignOperands: true
|
||||||
|
AlignTrailingComments: true
|
||||||
|
|
||||||
|
AllowAllParametersOfDeclarationOnNextLine: true
|
||||||
|
AllowShortBlocksOnASingleLine: false
|
||||||
|
AllowShortCaseLabelsOnASingleLine: false
|
||||||
|
AllowShortFunctionsOnASingleLine: All
|
||||||
|
AllowShortIfStatementsOnASingleLine: false
|
||||||
|
AllowShortLoopsOnASingleLine: false
|
||||||
|
|
||||||
|
AlwaysBreakAfterDefinitionReturnType: All
|
||||||
|
AlwaysBreakBeforeMultilineStrings: false
|
||||||
|
AlwaysBreakTemplateDeclarations: false
|
||||||
|
|
||||||
|
# BinPackArguments: false
|
||||||
|
# BinPackParameters: true
|
||||||
|
|
||||||
|
BreakBeforeBinaryOperators: false
|
||||||
|
BreakBeforeBraces: Custom
|
||||||
|
BraceWrapping: { AfterFunction: true }
|
||||||
|
BreakBeforeTernaryOperators: true
|
||||||
|
BreakConstructorInitializersBeforeComma: true
|
||||||
|
|
||||||
|
ColumnLimit: 80
|
||||||
|
|
||||||
|
ContinuationIndentWidth: 4
|
||||||
|
|
||||||
|
DerivePointerAlignment: false #XXX
|
||||||
|
DisableFormat: false
|
||||||
|
ExperimentalAutoDetectBinPacking: false #XXX
|
||||||
|
ForEachMacros: [ LIST_FOREACH, SIMPLEQ_FOREACH, CIRCLEQ_FOREACH, TAILQ_FOREACH, TAILQ_FOREACH_REVERSE, HT_FOREACH ]
|
||||||
|
|
||||||
|
IndentCaseLabels: false
|
||||||
|
IndentFunctionDeclarationAfterType: false
|
||||||
|
IndentWidth: 4
|
||||||
|
IndentWrappedFunctionNames: false
|
||||||
|
|
||||||
|
KeepEmptyLinesAtTheStartOfBlocks: true
|
||||||
|
MaxEmptyLinesToKeep: 2
|
||||||
|
|
||||||
|
PointerAlignment: Right #XXX
|
||||||
|
|
||||||
|
# SpaceAfterCStyleCast: false
|
||||||
|
SpaceBeforeAssignmentOperators: true
|
||||||
|
SpaceBeforeParens: ControlStatements
|
||||||
|
SpaceInEmptyParentheses: false
|
||||||
|
SpacesBeforeTrailingComments: 1
|
||||||
|
SpacesInAngles: false
|
||||||
|
SpacesInCStyleCastParentheses: false
|
||||||
|
SpacesInParentheses: false
|
||||||
|
Standard: Cpp03
|
||||||
|
TabWidth: 4
|
||||||
|
UseTab: Always
|
||||||
|
SortIncludes: false
|
||||||
|
...
|
55
.uncrustify
Normal file
55
.uncrustify
Normal file
@ -0,0 +1,55 @@
|
|||||||
|
input_tab_size = 8
|
||||||
|
output_tab_size = 8
|
||||||
|
indent_with_tabs = 2
|
||||||
|
indent_cmt_with_tabs = false
|
||||||
|
indent_brace_parent = false
|
||||||
|
indent_func_call_param = true
|
||||||
|
indent_func_def_param = true
|
||||||
|
sp_enum_before_assign = add
|
||||||
|
sp_enum_after_assign = add
|
||||||
|
sp_inside_paren = remove
|
||||||
|
sp_paren_brace = add
|
||||||
|
sp_before_ptr_star = add
|
||||||
|
sp_before_unnamed_ptr_star = add
|
||||||
|
sp_between_ptr_star = remove
|
||||||
|
sp_after_ptr_star = remove
|
||||||
|
sp_after_ptr_star_func = add
|
||||||
|
sp_before_ptr_star_func = add
|
||||||
|
sp_before_sparen = add
|
||||||
|
sp_inside_sparen = remove
|
||||||
|
sp_inside_sparen_close = remove
|
||||||
|
sp_after_sparen = add
|
||||||
|
sp_sparen_brace = add
|
||||||
|
sp_special_semi = remove
|
||||||
|
sp_before_semi_for = remove
|
||||||
|
sp_after_comma = add
|
||||||
|
sp_after_cast = remove
|
||||||
|
sp_inside_braces_struct = add
|
||||||
|
sp_type_func = remove
|
||||||
|
sp_func_def_paren = remove
|
||||||
|
sp_inside_fparen = remove
|
||||||
|
sp_fparen_brace = add
|
||||||
|
sp_func_call_paren = remove
|
||||||
|
sp_else_brace = add
|
||||||
|
sp_after_oc_block_caret = remove
|
||||||
|
align_keep_tabs = true
|
||||||
|
align_with_tabs = true
|
||||||
|
align_on_tabstop = true
|
||||||
|
nl_fcall_brace = remove
|
||||||
|
nl_enum_brace = remove
|
||||||
|
nl_struct_brace = remove
|
||||||
|
nl_union_brace = remove
|
||||||
|
nl_if_brace = remove
|
||||||
|
nl_brace_else = remove
|
||||||
|
nl_elseif_brace = remove
|
||||||
|
nl_else_brace = remove
|
||||||
|
nl_else_if = remove
|
||||||
|
nl_for_brace = remove
|
||||||
|
sp_after_semi_for_empty = remove
|
||||||
|
nl_while_brace = remove
|
||||||
|
nl_do_brace = remove
|
||||||
|
nl_brace_while = remove
|
||||||
|
nl_switch_brace = remove
|
||||||
|
nl_func_type_name = add
|
||||||
|
nl_fdef_brace = add
|
||||||
|
mod_paren_on_return = ignore
|
35
CONTRIBUTING.md
Normal file
35
CONTRIBUTING.md
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
# Contributing to the libevent
|
||||||
|
|
||||||
|
## Coding style
|
||||||
|
|
||||||
|
First and most generic rule: **just look around**.
|
||||||
|
|
||||||
|
But, we have a script for checking patches/files/git-refs:
|
||||||
|
```shell
|
||||||
|
# Chech HEAD git ref
|
||||||
|
./checkpatch.sh -r
|
||||||
|
./checkpatch.sh -r HEAD
|
||||||
|
|
||||||
|
# Check patch
|
||||||
|
git format-patch --stdout -1 | ./checkpatch.sh -p
|
||||||
|
git show -1 | ./checkpatch.sh -p
|
||||||
|
|
||||||
|
# Or via regular files
|
||||||
|
git format-patch --stdout -2
|
||||||
|
./checkpatch.sh *.patch
|
||||||
|
|
||||||
|
# Over a file
|
||||||
|
./checkpatch.sh -d event.c
|
||||||
|
./checkpatch.sh -d < event.c
|
||||||
|
|
||||||
|
# And print the whole file not only summary
|
||||||
|
./checkpatch.sh -f event.c
|
||||||
|
./checkpatch.sh -f < event.c
|
||||||
|
|
||||||
|
# See
|
||||||
|
./checkpatch.sh -h
|
||||||
|
```
|
||||||
|
|
||||||
|
## Testing
|
||||||
|
- Write new unit test in `test/regress_{MORE_SUITABLE_FOR_YOU}.c`
|
||||||
|
- `make verify`
|
299
checkpatch.sh
Executable file
299
checkpatch.sh
Executable file
@ -0,0 +1,299 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
# TODO:
|
||||||
|
# - inline replace
|
||||||
|
# - clang-format-diff replacement
|
||||||
|
# - uncrustify for patches (not git refs)
|
||||||
|
# - maybe integrate into travis-ci?
|
||||||
|
|
||||||
|
function usage()
|
||||||
|
{
|
||||||
|
cat <<EOL
|
||||||
|
$0 [ OPTS ] [ file-or-gitref [ ... ] ]
|
||||||
|
|
||||||
|
Example:
|
||||||
|
# Chech HEAD git ref
|
||||||
|
$ $0 -r
|
||||||
|
$ $0 -r HEAD
|
||||||
|
|
||||||
|
# Check patch
|
||||||
|
$ git format-patch --stdout -1 | $0 -p
|
||||||
|
$ git show -1 | $0 -p
|
||||||
|
|
||||||
|
# Or via regular files
|
||||||
|
$ git format-patch --stdout -2
|
||||||
|
$ $0 *.patch
|
||||||
|
|
||||||
|
# Over a file
|
||||||
|
$ $0 -d event.c
|
||||||
|
$ $0 -d < event.c
|
||||||
|
|
||||||
|
# And print the whole file not only summary
|
||||||
|
$ $0 -f event.c
|
||||||
|
$ $0 -f < event.c
|
||||||
|
|
||||||
|
OPTS:
|
||||||
|
-p - treat as patch
|
||||||
|
-f - treat as regular file
|
||||||
|
-f - treat as regular file and print diff
|
||||||
|
-r - treat as git revision (default)
|
||||||
|
-C - check using clang-format (default)
|
||||||
|
-U - check with uncrustify
|
||||||
|
-c - config for clang-format/uncrustify
|
||||||
|
-h - print this message
|
||||||
|
EOL
|
||||||
|
}
|
||||||
|
function cfg()
|
||||||
|
{
|
||||||
|
[ -z "${options[cfg]}" ] || {
|
||||||
|
echo "${options[cfg]}"
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
local dir="$(dirname "${BASH_SOURCE[0]}")"
|
||||||
|
[ "${options[clang]}" -eq 0 ] || {
|
||||||
|
echo "$dir/.clang-format"
|
||||||
|
return
|
||||||
|
}
|
||||||
|
[ "${options[uncrustify]}" -eq 0 ] || {
|
||||||
|
echo "$dir/.uncrustify"
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
function abort()
|
||||||
|
{
|
||||||
|
local msg="$1"
|
||||||
|
shift
|
||||||
|
|
||||||
|
printf "$msg\n" "$@" >&2
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
function default_arg()
|
||||||
|
{
|
||||||
|
if [ "${options[ref]}" -eq 1 ]; then
|
||||||
|
echo "HEAD"
|
||||||
|
else
|
||||||
|
[ ! -t 0 ] || abort "<stdin> is a tty"
|
||||||
|
echo "/dev/stdin"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
function parse_options()
|
||||||
|
{
|
||||||
|
options[patch]=0
|
||||||
|
options[file]=0
|
||||||
|
options[file_diff]=0
|
||||||
|
options[ref]=1
|
||||||
|
options[clang]=1
|
||||||
|
options[uncrustify]=0
|
||||||
|
options[cfg]=
|
||||||
|
|
||||||
|
local OPTARG OPTIND c
|
||||||
|
while getopts "pfrdCUc:h?" c; do
|
||||||
|
case "$c" in
|
||||||
|
p)
|
||||||
|
options[patch]=1
|
||||||
|
options[ref]=0
|
||||||
|
options[file]=0
|
||||||
|
options[file_diff]=0
|
||||||
|
;;
|
||||||
|
f)
|
||||||
|
options[file]=1
|
||||||
|
options[ref]=0
|
||||||
|
options[patch]=0
|
||||||
|
options[file_diff]=0
|
||||||
|
;;
|
||||||
|
r)
|
||||||
|
options[ref]=1
|
||||||
|
options[file]=0
|
||||||
|
options[patch]=0
|
||||||
|
options[file_diff]=0
|
||||||
|
;;
|
||||||
|
d)
|
||||||
|
options[file_diff]=1
|
||||||
|
options[file]=0
|
||||||
|
options[patch]=0
|
||||||
|
options[ref]=0
|
||||||
|
;;
|
||||||
|
C)
|
||||||
|
options[clang]=1
|
||||||
|
options[uncrustify]=0
|
||||||
|
;;
|
||||||
|
U)
|
||||||
|
options[uncrustify]=1
|
||||||
|
options[clang]=0
|
||||||
|
;;
|
||||||
|
c) options[cfg]="$OPTIND" ;;
|
||||||
|
?|h)
|
||||||
|
usage
|
||||||
|
exit 0
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
usage
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
|
||||||
|
options[cfg]="$(cfg)"
|
||||||
|
|
||||||
|
[ -f "${options[cfg]}" ] || \
|
||||||
|
abort "Config '%s' does not exist" "${options[cfg]}"
|
||||||
|
|
||||||
|
shift $((OPTIND - 1))
|
||||||
|
args=( "$@" )
|
||||||
|
|
||||||
|
if [ ${#args[@]} -eq 0 ]; then
|
||||||
|
# exit on error globally, not only in subshell
|
||||||
|
default_arg > /dev/null
|
||||||
|
args=( "$(default_arg)" )
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ "${args[0]}" = "/dev/stdin" ]; then
|
||||||
|
TMP_FILE="/tmp/libevent.checkpatch.$RANDOM"
|
||||||
|
cat > "$TMP_FILE"
|
||||||
|
trap "rm '$TMP_FILE'" EXIT
|
||||||
|
|
||||||
|
args[0]="$TMP_FILE"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
function diff() { command diff --color=always "$@"; }
|
||||||
|
|
||||||
|
function clang_style()
|
||||||
|
{
|
||||||
|
local c="${options[cfg]}"
|
||||||
|
echo "{ $(sed -e 's/#.*//' -e '/---/d' -e '/\.\.\./d' "$c" | tr $'\n' ,) }"
|
||||||
|
}
|
||||||
|
function clang_format() { clang-format --style="$(clang_style)" "$@"; }
|
||||||
|
function clang_format_diff() { clang-format-diff --style="$(clang_style)" "$@"; }
|
||||||
|
# for non-bare repo will work
|
||||||
|
function clang_format_git()
|
||||||
|
{ git format-patch --stdout "$@" -1 | clang_format_diff; }
|
||||||
|
|
||||||
|
function uncrustify() { command uncrustify -c "${options[cfg]}" "$@"; }
|
||||||
|
function uncrustify_frag() { uncrustify -l C --frag "$@"; }
|
||||||
|
function uncrustify_indent_off() { echo '/* *INDENT-OFF* */'; }
|
||||||
|
function uncrustify_indent_on() { echo '/* *INDENT-ON* */'; }
|
||||||
|
function git_hunk()
|
||||||
|
{
|
||||||
|
local ref=$1 f=$2
|
||||||
|
shift 2
|
||||||
|
git cat-file -p $ref:$f
|
||||||
|
}
|
||||||
|
function uncrustify_git_indent_hunk()
|
||||||
|
{
|
||||||
|
local start=$1 end=$2
|
||||||
|
shift 2
|
||||||
|
|
||||||
|
# Will be beatier with tee(1), but doh bash async substitution
|
||||||
|
{ uncrustify_indent_off; git_hunk "$@" | head -n$((start - 1)); }
|
||||||
|
{ uncrustify_indent_on; git_hunk "$@" | head -n$((end - 1)) | tail -n+$start; }
|
||||||
|
{ uncrustify_indent_off; git_hunk "$@" | tail -n+$((end + 1)); }
|
||||||
|
}
|
||||||
|
function strip()
|
||||||
|
{
|
||||||
|
local start=$1 end=$2
|
||||||
|
shift 2
|
||||||
|
|
||||||
|
# seek indent_{on,off}()
|
||||||
|
let start+=2
|
||||||
|
head -n$end | tail -n+$start
|
||||||
|
}
|
||||||
|
function patch_ranges()
|
||||||
|
{
|
||||||
|
egrep -o '^@@ -[0-9]+(,[0-9]+|) \+[0-9]+(,[0-9]+|) @@' | \
|
||||||
|
cut -d' ' -f3
|
||||||
|
}
|
||||||
|
function git_ranges()
|
||||||
|
{
|
||||||
|
local ref=$1 f=$2
|
||||||
|
shift 2
|
||||||
|
|
||||||
|
git diff -W $ref^..$ref -- $f | patch_ranges
|
||||||
|
}
|
||||||
|
function diff_substitute()
|
||||||
|
{
|
||||||
|
local f="$1"
|
||||||
|
shift
|
||||||
|
|
||||||
|
sed \
|
||||||
|
-e "s#^--- /dev/fd.*\$#--- a/$f#" \
|
||||||
|
-e "s#^+++ /dev/fd.*\$#+++ b/$f#"
|
||||||
|
}
|
||||||
|
function uncrustify_git()
|
||||||
|
{
|
||||||
|
local ref=$1 r f start end length
|
||||||
|
shift
|
||||||
|
|
||||||
|
local files=( $(git diff --name-only $ref^..$ref | egrep "\.(c|h)$") )
|
||||||
|
for f in "${files[@]}"; do
|
||||||
|
local ranges=( $(git_ranges $ref "$f") )
|
||||||
|
for r in "${ranges[@]}"; do
|
||||||
|
[[ ! "$r" =~ ^\+([0-9]+)(,([0-9]+)|)$ ]] && continue
|
||||||
|
start=${BASH_REMATCH[1]}
|
||||||
|
[ -n "${BASH_REMATCH[3]}" ] && \
|
||||||
|
length=${BASH_REMATCH[3]} || \
|
||||||
|
length=1
|
||||||
|
end=$((start + length))
|
||||||
|
echo "Range: $start:$end ($length)" >&2
|
||||||
|
|
||||||
|
diff -u \
|
||||||
|
<(uncrustify_git_indent_hunk $start $end $ref "$f" | strip $start $end) \
|
||||||
|
<(uncrustify_git_indent_hunk $start $end $ref "$f" | uncrustify_frag | strip $start $end) \
|
||||||
|
| diff_substitute "$f"
|
||||||
|
done
|
||||||
|
done
|
||||||
|
}
|
||||||
|
function uncrustify_diff() { abort "Not implemented"; }
|
||||||
|
function uncrustify_file() { uncrustify -f "$@"; }
|
||||||
|
|
||||||
|
function checker()
|
||||||
|
{
|
||||||
|
local c=$1 u=$2
|
||||||
|
shift 2
|
||||||
|
|
||||||
|
[ "${options[clang]}" -eq 0 ] || {
|
||||||
|
$c "$@"
|
||||||
|
return
|
||||||
|
}
|
||||||
|
[ "${options[uncrustify]}" -eq 0 ] || {
|
||||||
|
$u "$@"
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
function check_patch() { checker clang_format_diff uncrustify_diff "$@"; }
|
||||||
|
function check_file() { checker clang_format uncrustify_file "$@"; }
|
||||||
|
function check_ref() { checker clang_format_git uncrustify_git "$@"; }
|
||||||
|
|
||||||
|
function check_arg()
|
||||||
|
{
|
||||||
|
[ "${options[patch]}" -eq 0 ] || {
|
||||||
|
check_patch "$@"
|
||||||
|
return
|
||||||
|
}
|
||||||
|
[ "${options[file]}" -eq 0 ] || {
|
||||||
|
check_file "$@"
|
||||||
|
return
|
||||||
|
}
|
||||||
|
[ "${options[file_diff]}" -eq 0 ] || {
|
||||||
|
diff -u "$@" <(check_file "$@") | diff_substitute "$@"
|
||||||
|
return
|
||||||
|
}
|
||||||
|
[ "${options[ref]}" -eq 0 ] || {
|
||||||
|
check_ref "$@"
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function main()
|
||||||
|
{
|
||||||
|
local a
|
||||||
|
for a in "${args}"; do
|
||||||
|
check_arg "$a"
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
declare -A options
|
||||||
|
parse_options "$@"
|
||||||
|
|
||||||
|
main "$@" | less -FRSX
|
Loading…
x
Reference in New Issue
Block a user