#!/bin/sh USAGE=" [commit-ish...]" LONG_USAGE="COMMIT RANGE A commit range is usually specified as .. COMMIT-ISH A commit-ish is anything which can recursively be resolved to a commit; see 'gitglossary(7)'. EXAMPLE git is-in-range HEAD~4..HEAD~2 HEAD~5 HEAD~4 HEAD~3 HEAD~2 HEAD~1 < HEAD~5 = HEAD~4 = HEAD~3 = HEAD~2 > HEAD~1 " SUBDIRECTORY_OK="1" source "$(git --exec-path)/git-sh-setup" function _is_in_range() { range_start="$1" range_end="$2" target_commit="$( git rev-parse --verify --quiet $3 )" if [[ -z "$target_commit" ]]; then die "Commit '$1' is not a valid commit" fi target_commit_array=($target_commit) if [[ "${#target_commit_array[@]}" -ne 1 ]]; then die "Commit '$1' does not specify a single commit" fi # Note that the provided range is inclusive, so decrement the range_end by one to make it exclusive. is_ancestor_of_1=$( git merge-base --is-ancestor "$target_commit" "$range_start" ; echo $? ) is_ancestor_of_2=$( git merge-base --is-ancestor "$target_commit" "$range_end~" ; echo $? ) if [[ "$is_ancestor_of_1" -ne "$is_ancestor_of_2" ]]; then echo "=" elif [[ "$is_ancestor_of_1" -ne 0 ]]; then echo ">" else echo "<" fi } if [[ $# -ge "2" ]]; then range_commits="$( git rev-parse --verify --quiet $1 )" if [[ -z "$range_commits" ]]; then die "Range '$2' is not a valid range" fi range_commits_array=($range_commits) if [[ "${#range_commits_array[@]}" != 2 ]]; then die "Range '$2' does not specify a range" fi for target_commit in "${@:2}"; do echo $(_is_in_range "${range_commits_array[0]#^}" "${range_commits_array[1]#^}" "$target_commit") "$target_commit" done else usage fi