Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

scripts: add todo_diff.sh #70871

Merged
merged 1 commit into from
Sep 29, 2021
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
78 changes: 78 additions & 0 deletions scripts/todo_diff.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
#!/bin/bash

# The command runs git diff between two refspecs to find all instances of TODO
# added between them.

cmd=$(basename "$0")
__usage="${cmd} finds TODOs in pkg added in a release branch since a release tag.
It prints the results to stdout. The optional third argument represents the
directory within the repo to search.

Usage: ${cmd} <release-tag> <release-branch> [<diff-path>]"

set -euo pipefail

SEARCH_DIR="pkg"

case $# in
2) ;;
3) SEARCH_DIR="$3" ;;
*)
echo >&2 "${__usage}"
exit 1
;;
esac

ORIGINAL_BRANCH=$(git branch --show-current)
TAG=$1
BRANCH=$2
UPSTREAM=$(git remote -v | grep 'cockroachdb/cockroach' | { read -r UPSTREAM rest; echo "${UPSTREAM}"; } )

setup() {

# Pull latest upstream.
git fetch --quiet "${UPSTREAM}"

# Checkout the old release tag.
git checkout --quiet "tags/${TAG}"

# Checkout the new files for the search directory.
git checkout --quiet "${UPSTREAM}/${BRANCH}" "${SEARCH_DIR}"

# Reset.
git reset --quiet HEAD "${SEARCH_DIR}"

# Add all untracked files to the index so they will show results with git diff.
git add -AN "${SEARCH_DIR}"
}

cleanup() {
git restore --quiet --staged "${SEARCH_DIR}"
git restore --quiet "${SEARCH_DIR}"
git clean --quiet -f "${SEARCH_DIR}"
git checkout --quiet --no-recurse-submodules "${ORIGINAL_BRANCH}"
}

diff_file() {
__file="$1"
git diff -G'TODO' "${__file}" \
| {
# Use a subshell because grep returns a non-zero exit code with no matches.
# The pattern will match a leading + and then anything such that there is
# a subsequent TODO and the character preceding it is either a whitespace,
# #, or /.
grep -E '^\+(.*[[:space:]#/])?TODO' || true
} \
| sed 's|^\+[[:space:]]*\(.*\)|'"${__file}"': \1|g'
}

run() {
while read -r -s p || [[ -n "${p}" ]]
do
diff_file "${p}"
done < <( git diff -G'TODO' --name-only "${SEARCH_DIR}" )
}

trap cleanup >&2 EXIT
setup >&2
run