[PATCH 2/2] dim: Make dim sparse check each commit in the range-ish

Arkadiusz Hiler arkadiusz.hiler at intel.com
Tue Nov 28 12:25:58 UTC 2017


On Mon, Nov 27, 2017 at 04:39:57PM +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
> the whole drivers/gpu/drm/ directory for each step.
> 
> 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.
> 
> Signed-off-by: Arkadiusz Hiler <arkadiusz.hiler at intel.com>
> ---
>  dim | 40 ++++++++++++++++++++++++++++++++++++----
>  1 file changed, 36 insertions(+), 4 deletions(-)
> 
> diff --git a/dim b/dim
> index ee958be231ab..c586883363e8 100755
> --- a/dim
> +++ b/dim
> @@ -1398,6 +1398,13 @@ function checkpatch_commit
>  	return $rv
>  }
>  
> +# $1 is the git sha1 to check
> +function sparse_commit
> +{
> +    git checkout --detach $1 >/dev/null 2>&1
> +    make C=2 -j$(nproc) drivers/gpu/drm/ 2>&1 1>/dev/null | sort
> +}

<ivyl> danvet: also do we want to have the sparse checks just for i915.ko,
       whole i915/ or whole drm/ ?
<danvet> ivyl, all that's changed?
<danvet> for dim sparse $commit-ish
<danvet> well $commit|range-ish

The sequence would look something like that:

------------------------------------------------------------
git checkout ${commits[0]}~
make

for commit in commits:
    # get reference from parent just for the changed files
    touch --no-create $(git diff --name-only $commit)
    prev_sr="$(make C=1)"

    # now get the state after the commit is applied
    git checkout $commit
    sr="$(make C=1)"

    # and compare
    prev_remapped="$(remap_log ... prev_sr)"
    diff <(echo $prev_remapped) <(echo $sr)
------------------------------------------------------------

For N patches that means 2*N spare runs, while the current
implementation (seen below) is N+1 but checks the whole drm dir.

It does not look that bad, but I have to check how much longer does it
take.

BTW, excerpt from the kernel's Docs:
Do a kernel make with "make C=1" to run sparse on all the C files that
get recompiled, or use "make C=2" to run sparse on the files whether
they need to be recompiled or not.  The latter is a fast way to check
the whole tree if you have already built it.

>  # turn $1 in to a git commit range
>  function rangeish()
>  {
> @@ -1470,13 +1477,38 @@ function dim_checkpatch
>  
>  function dim_sparse
>  {
> -	local range
> +	local range rv sr prev_sr prev_remapped diff_result remap_log
>  
>  	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 [ ! -x  $remap_log ]; then
> +        echo "$remap_log is not an executable, please run make in maintainer-tools dir!"
> +        exit 1
> +    fi

https://github.com/zsh-users/zsh/blob/master/Functions/VCS_Info/Backends/VCS_INFO_get_data_git#L73
We can use something like that to get the current ref here (whether it
is a branch or detached head or anything else).

trap "git checkout $original_ref" 0

to restore the HEAD to it's original state after we are done here.

> +	for commit in $(git rev-list --reverse $range); do
> +        if [ -z "$prev_sr" ]; then prev_sr="$(sparse_commit $commit~)"; fi
> +        sr="$(sparse_commit $commit)"
> +        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