[PATCH v2] dim: Make dim sparse check each commit in the range-ish
Arkadiusz Hiler
arkadiusz.hiler at intel.com
Mon Dec 11 08:51:23 UTC 2017
On Mon, Dec 11, 2017 at 10:38:35AM +0200, Arkadiusz Hiler wrote:
> Previously 'dim sparse' just touched all the files affected by the range
> and run sparse against that. Since this may show issues from included
> headers and sparse-compliance does not seem to be strongly enforced the
> output is rather unhelpful.
>
> With this change the repo is checkout at each commit, sparse is run on
> incrementally, on every file that was changed.
>
> Each result is compared to it's parent's result using remap-log to
> adjust for potential line numbering changes.
>
> Only the difference is reported.
>
> v2:
> Clearer wording on remap-log check.
> Use the incremental build.
> Reset ref on exit.
>
> Signed-off-by: Arkadiusz Hiler <arkadiusz.hiler at intel.com>
> ---
> dim | 57 +++++++++++++++++++++++++++++++++++++++++++++++++++++----
> 1 file changed, 53 insertions(+), 4 deletions(-)
>
> diff --git a/dim b/dim
> index ee958be231ab..44b4daa5fabe 100755
> --- a/dim
> +++ b/dim
> @@ -1468,15 +1468,64 @@ function dim_checkpatch
> return $rv
> }
>
> +function _restore_head_on_exit
> +{
> + local original_ref
> +
> + original_ref="$(git rev-parse --abbrev-ref HEAD)"
> +
> + if [ "$original_ref" == "HEAD" ]; then
> + original_ref="$(git rev-parse HEAD)"
> + fi
> +
> + trap "git checkout -q $original_ref" EXIT
> +}
^ Here we set a trap that resets the tree to the original state.
Daniel suggested using separate worktree instead. I am not very fond of
that approach though.
It would make sense if I had full dim prefix set up, so we can create,
let's say, $DIM_PREFIX/sparse-check-tree, and reuse it.
But we don't want the whole prefix for CI. We just want to run couple of
check in $PWD (many trees), without the setup overhead.
Other way to address that is to provide path to the worktree as a
parameter (ugly) or mktemp -d (bad, you pay penalty of constant
recreation and recompilation of the worktree).
Any idea on how we can juggle the two?
- Arek
> +
> function dim_sparse
> {
> - local range
> + local range rv sr prev_sr prev_remapped diff_result remap_log commits
>
> range=$(rangeish "${1:-}")
> + remap_log=$DIM_PREFIX/maintainer-tools/remap-log
>
> - make $DIM_MAKE_OPTIONS
> - touch --no-create $(git diff --name-only $range) $(git diff --name-only)
> - make C=1
> + if [ ! -e $remap_log ]; then
> + echo "$remap_log is not compailed, please run make in maintainer-tools dir!"
> + exit 1
> + fi
> +
> + _restore_head_on_exit
> +
> + # make the initial reference build
> + commits=( $(git rev-list --reverse $range) )
> + git checkout --detach ${commits[0]}~ > /dev/null 2>&1
> + make -j8 drivers/gpu/drm/ > /dev/null 2>&1
> +
> + for commit in ${commits[@]}; do
> + touch --no-create $(git diff --name-only $commit~...$commit)
> + prev_sr="$(make C=1 -j$(nproc) drivers/gpu/drm/ 2>&1 1>/dev/null | sort)"
> +
> + git checkout --detach $commit >/dev/null 2>&1
> + sr="$(make C=1 -j$(nproc) drivers/gpu/drm/ 2>&1 1>/dev/null | sort)"
> +
> + prev_remapped="$(echo "$prev_sr" | $remap_log <(git diff HEAD~ | $remap_log))"
> + diff_result="$(diff -u <(echo "$prev_remapped") <(echo "$sr") || true)"
> +
> + echo "Commit: $(git log -n1 --format='%s' $commit)"
> + if [ -n "$diff_result" ]; then
> + echo "$diff_result" | egrep '^[+-]' | egrep -v '^[+-]{3}'
> + else
> + echo "Okay!"
> + fi
> + echo
> +
> + if (echo "$diff_result" | grep -q '^+'); then
> + rv=1
> + fi
> +
> + prev_sr="$sr"
> + done
> +
> + return $rv
> }
>
> function dim_checker
> --
> 2.13.6
>
> _______________________________________________
> dim-tools mailing list
> dim-tools at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/dim-tools
More information about the dim-tools
mailing list