vlc | branch: master | Steve Lhomme <[email protected]> | Wed Jun 17 07:53:00 
2020 +0200| [ded943ccb19202c9d09174639ed348332ee3971a] | committer: Steve Lhomme

extras: add a script to verify that cherry-pick commits are "properly" formatted

Cherry picks must:
- have the (cherry picked from commit <hash>) line
- have a Signed-off-by: line
- mention if the patch has been rebased (same changes, differing code around
  the patch) or edited (modified to adapt to this branch)
  (edited) or (rebased) text is added after the (cherry picked from commit 
<hash>) text
  edited: or rebased: is added to explain what was differs from the original 
commit

When mismatching are detected the patches are put in patches-orig/ and
patches-new/ folder.

> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=ded943ccb19202c9d09174639ed348332ee3971a
---

 extras/misc/cherry-test.sh | 128 +++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 128 insertions(+)

diff --git a/extras/misc/cherry-test.sh b/extras/misc/cherry-test.sh
new file mode 100755
index 0000000000..f9ebf99fbd
--- /dev/null
+++ b/extras/misc/cherry-test.sh
@@ -0,0 +1,128 @@
+#!/bin/sh
+
+usage()
+{
+cat << EOF
+usage: $0 <original_branch> [commit_range]
+
+Check that cherry pick commits are properly formatted/documented.
+Differing patches are put in patches-new/ and patches-orig/
+
+original_branch:  the branch where the cherry-picked commits come from
+commit_range   :  the commits to check (master..HEAD if not specified)
+
+- edits are marked as
+(cherry picked from commit <hash>) (edited)
+edited:
+
+- rebases (unmodified code) are marked as
+(cherry picked from commit <hash>) (rebased)
+rebased:
+EOF
+}
+
+if test -z "$1"; then
+    echo "Missing original branch"
+    usage
+    exit 1
+fi
+ORIGINAL_BRANCH=$1
+
+if test -n "$2"; then
+    COMMIT_RANGE=$2
+else
+    COMMIT_RANGE="master..HEAD"
+fi
+
+CHERY_PICK_DETECT="cherry picked from commit "
+
+NOT_CHERRY_PICKED=`git log --invert-grep --grep "$CHERY_PICK_DETECT" 
--pretty=%h $COMMIT_RANGE`
+if test -n "$NOT_CHERRY_PICKED"; then
+    echo "ERROR: some commits are not cherry-picked:"
+    git log --invert-grep --grep "$CHERY_PICK_DETECT" --pretty=oneline 
$COMMIT_RANGE
+    exit 1
+fi
+
+CHERRY_PICKED=`git log --grep "$CHERY_PICK_DETECT" --pretty=%H $COMMIT_RANGE`
+mkdir -p patches-new
+mkdir -p patches-orig
+
+EXIT_CODE=0
+for l in $CHERRY_PICKED; do
+    GIT_LOG=`git log -n 1 $l~1..$l`
+
+    h=`echo "$GIT_LOG" | grep "$CHERY_PICK_DETECT" | sed -e "s/cherry picked 
from commit//" -e "s/Edited and //" -e "s/(//" | cut -c6-45`
+
+    # Check that the cherry picked hash exist in the original branch
+    HASH_EXISTS=`git merge-base --is-ancestor $h $ORIGINAL_BRANCH 2> /dev/null 
|| echo FAIL`
+    if test -n "$HASH_EXISTS"; then
+        echo "Invalid Hash for:"
+        git log -n 1 $l
+        exit 1
+    fi
+
+    # Check the cherry picked commit has a Signed Off mark
+    SIGNED_OFF=`echo "$GIT_LOG" | grep "Signed-off-by: "`
+    if test -z "$SIGNED_OFF"; then
+        echo "Missing signed off for:"
+        git log -n 1 $l
+    fi
+
+    IS_MARKED_REBASED=`echo "$GIT_LOG" | grep "(cherry picked from commit $h) 
(rebased)"`
+    IS_MARKED_EDITED=`echo "$GIT_LOG" | grep "(cherry picked from commit $h) 
(edited)"`
+
+    git diff --no-color --minimal --ignore-all-space $l~1..$l | sed -e "/index 
/d" -e "s/@@ .*/@@/" > patches-new/$h.diff
+    git diff --no-color --minimal --ignore-all-space $h~1..$h | sed -e "/index 
/d" -e "s/@@ .*/@@/" > patches-orig/$h.diff
+    PATCH_DIFF=`diff -t -w patches-new/$h.diff patches-orig/$h.diff | sed -e 
'/^> --- /d' -e '/^> +++ /d' -e '/^---/d' -e '/^> @@/d' -e '/^< @@/d' -e 
'/^[0-9]\+/d'`
+    if test -z "$PATCH_DIFF"; then
+        if test -n "$IS_MARKED_EDITED"; then
+            echo "Incorrectly marked edited: $(git log $l~1..$l --oneline)"
+            EXIT_CODE=1
+        fi
+        if test -n "$IS_MARKED_REBASED"; then
+            echo "Incorrectly marked rebased: $(git log $l~1..$l --oneline)"
+            EXIT_CODE=1
+        fi
+        rm -rf patches-new/$h.diff patches-orig/$h.diff
+        continue
+    fi
+
+    PATCH_DIFF2=`echo "$PATCH_DIFF" | sed -e "/\(> -\|> +\| diff \)/!d" | sed 
-e "/> +$/d" -e "/> -$/d"`
+
+    if test -n "$IS_MARKED_REBASED"; then
+        if test -n "$PATCH_DIFF2"; then
+            echo "Edit marked as rebase: $(git log $l~1..$l)"
+            EXIT_CODE=1
+            continue
+        fi
+
+        IS_EXPLAINED=`echo "$GIT_LOG" | grep "rebased:"`
+        if test -z "$IS_EXPLAINED"; then
+            echo "Unexplained rebase: $(git log $l~1..$l)"
+            EXIT_CODE=1
+        else
+            rm -rf patches-new/$h.diff patches-orig/$h.diff
+        fi
+    else
+        if test -z "$PATCH_DIFF2"; then
+            echo "Rebase marked as edit: $(git log $l~1..$l)"
+            EXIT_CODE=1
+            continue
+        fi
+
+        if test -z "$IS_MARKED_EDITED"; then
+            echo "Unmarked edit: $(git log $l~1..$l)"
+            EXIT_CODE=1
+        else
+            IS_EXPLAINED=`echo "$GIT_LOG" | grep "edited:"`
+            if test -z "$IS_EXPLAINED"; then
+                echo "Unexplained edit: $(git log $l~1..$l)"
+                EXIT_CODE=1
+            else
+                rm -rf patches-new/$h.diff patches-orig/$h.diff
+            fi
+        fi
+    fi
+done
+
+exit $EXIT_CODE

_______________________________________________
vlc-commits mailing list
[email protected]
https://mailman.videolan.org/listinfo/vlc-commits

Reply via email to