| #!/bin/sh |
| |
| USAGE="<commit range> <commit-ish> [commit-ish...]" |
| LONG_USAGE="COMMIT RANGE |
| A commit range is usually specified as <older commitish>..<newer commitish> |
| |
| 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 |