git / moonbite-core / test/lint/git-subtree-check.sh · raw
#!/bin/sh# Copyright (c) 2015-2019 The Bitcoin Core developers# Distributed under the MIT software license, see the accompanying# file COPYING or http://www.opensource.org/licenses/mit-license.php.export LC_ALL=C# Strip trailing / from directory path (in case it was added by autocomplete)DIR="${1%/}"COMMIT="$2"if [ -z "$COMMIT" ]; then COMMIT=HEADfi# Taken from git-subtree (Copyright (C) 2009 Avery Pennarun <apenwarr@gmail.com>)find_latest_squash(){ dir="$1" sq= main= sub= git log --grep="^git-subtree-dir: $dir/*\$" \ --pretty=format:'START %H%n%s%n%n%b%nEND%n' "$COMMIT" | while read a b _; do case "$a" in START) sq="$b" ;; git-subtree-mainline:) main="$b" ;; git-subtree-split:) sub="$b" ;; END) if [ -n "$sub" ]; then if [ -n "$main" ]; then # a rejoin commit? # Pretend its sub was a squash. sq="$sub" fi echo "$sq" "$sub" break fi sq= main= sub= ;; esac done}# find latest subtree updatelatest_squash="$(find_latest_squash "$DIR")"if [ -z "$latest_squash" ]; then echo "ERROR: $DIR is not a subtree" >&2 exit 2fiset $latest_squashold=$1rev=$2# get the tree in the current committree_actual=$(git ls-tree -d "$COMMIT" "$DIR" | head -n 1)if [ -z "$tree_actual" ]; then echo "FAIL: subtree directory $DIR not found in $COMMIT" >&2 exit 1fiset $tree_actualtree_actual_type=$2tree_actual_tree=$3echo "$DIR in $COMMIT currently refers to $tree_actual_type $tree_actual_tree"if [ "d$tree_actual_type" != "dtree" ]; then echo "FAIL: subtree directory $DIR is not a tree in $COMMIT" >&2 exit 1fi# get the tree at the time of the last subtree updatetree_commit=$(git show -s --format="%T" $old)echo "$DIR in $COMMIT was last updated in commit $old (tree $tree_commit)"# ... and compare the actual tree with itif [ "$tree_actual_tree" != "$tree_commit" ]; then git diff $tree_commit $tree_actual_tree >&2 echo "FAIL: subtree directory was touched without subtree merge" >&2 exit 1fi# get the tree in the subtree commit referred toif [ "d$(git cat-file -t $rev 2>/dev/null)" != dcommit ]; then echo "subtree commit $rev unavailable: cannot compare. Did you add and fetch the remote?" >&2 exitfitree_subtree=$(git show -s --format="%T" $rev)echo "$DIR in $COMMIT was last updated to upstream commit $rev (tree $tree_subtree)"# ... and compare the actual tree with itif [ "$tree_actual_tree" != "$tree_subtree" ]; then echo "FAIL: subtree update commit differs from upstream tree!" >&2 exit 1fiecho "GOOD"