|
1 | 1 | #!/usr/bin/env bash |
2 | 2 | set -euo pipefail |
3 | 3 |
|
| 4 | +CURR_SCRIPT=$(readlink -f "$0") |
| 5 | +CURR_SCRIPT_PATH=$(dirname "${CURR_SCRIPT}") |
| 6 | + |
| 7 | +# help |
| 8 | +# ------------------------------------------------------------------------------------- |
| 9 | +function help() { |
| 10 | + echo |
| 11 | + echo "Generate diff between current branch and a base branch." |
| 12 | + echo |
| 13 | + echo "Usage:" |
| 14 | + echo " ${0} [OPTION]" |
| 15 | + echo |
| 16 | + echo "Options:" |
| 17 | + echo " -b <branch> generate diff against base branch (default: main)" |
| 18 | + echo " -h show this help message" |
| 19 | + echo |
| 20 | + echo "Examples:" |
| 21 | + echo " ${0}" |
| 22 | + echo " ${0} -b main" |
| 23 | + echo |
| 24 | +} |
| 25 | + |
| 26 | +# logging |
| 27 | +# ------------------------------------------------------------------------------------- |
| 28 | +function logger() { |
| 29 | + local LEVEL=$1 |
| 30 | + shift |
| 31 | + printf "%s [%5s] %s\n" "$(date +'%F %T.%3N')" "${LEVEL}" "$*" |
| 32 | +} |
| 33 | +log_info() { logger INFO "$@"; } |
| 34 | +log_warn() { logger WARN "$@"; } |
| 35 | +log_error() { logger ERROR "$@" 1>&2; } |
| 36 | + |
| 37 | +# update branches |
| 38 | +# ------------------------------------------------------------------------------------- |
4 | 39 | function update_branches() { |
5 | 40 | git fetch origin >/dev/null 2>&1 || true |
6 | 41 | } |
7 | 42 |
|
8 | | -function get_branch_diff() { |
9 | | - local COMPARE_WITH_BRANCH="${1}" |
10 | | - local BRANCH_TO_COMPARE="HEAD" |
11 | | - local FILES |
| 43 | +# generate branch diff |
| 44 | +# ------------------------------------------------------------------------------------- |
| 45 | +function generate_branch_diff() { |
| 46 | + local BASE_BRANCH=$1 |
| 47 | + local CURRENT_BRANCH |
12 | 48 |
|
13 | | - echo "Running branch diff" |
14 | | - echo "Comparing: ${BRANCH_TO_COMPARE}" |
15 | | - echo "with : ${COMPARE_WITH_BRANCH}" |
16 | | - echo |
| 49 | + CURRENT_BRANCH=$(git rev-parse --abbrev-ref HEAD) |
| 50 | + |
| 51 | + log_info "Current branch : ${CURRENT_BRANCH}" |
| 52 | + log_info "Base branch : ${BASE_BRANCH}" |
| 53 | + |
| 54 | + if ! git show-ref --verify --quiet "refs/heads/${BASE_BRANCH}" && |
| 55 | + ! git show-ref --verify --quiet "refs/remotes/origin/${BASE_BRANCH}"; then |
| 56 | + log_error "Base branch '${BASE_BRANCH}' does not exist" |
| 57 | + exit 1 |
| 58 | + fi |
17 | 59 |
|
18 | 60 | update_branches |
19 | 61 |
|
20 | | - FILES=$(git diff --name-only "${BRANCH_TO_COMPARE}...${COMPARE_WITH_BRANCH}") |
| 62 | + local FILES |
| 63 | + FILES=$(git --no-pager diff --name-status "${BASE_BRANCH}...HEAD") |
21 | 64 |
|
22 | | - if [ -z "${FILES}" ]; then |
23 | | - echo "No changes detected between branches." |
| 65 | + if [[ -z "${FILES}" ]]; then |
| 66 | + log_info "No changes detected." |
24 | 67 | return |
25 | 68 | fi |
26 | 69 |
|
27 | | - echo "Files changed..." |
| 70 | + echo |
| 71 | + log_info "Files changed:" |
28 | 72 | echo "${FILES}" |
29 | 73 | echo |
30 | 74 |
|
31 | | - echo "Generating branch diff..." |
32 | | - git diff --unified=5 "${BRANCH_TO_COMPARE}...${COMPARE_WITH_BRANCH}" |
| 75 | + log_info "Generating diff..." |
| 76 | + git --no-pager diff --unified=5 "${BASE_BRANCH}...HEAD" |
33 | 77 | } |
34 | 78 |
|
35 | | -function main() { |
36 | | - if [[ $# -lt 1 ]]; then |
37 | | - echo "Usage: $0 BRANCH_TO_COMPARE_WITH" |
38 | | - exit 1 |
39 | | - fi |
| 79 | +# driver code |
| 80 | +# ------------------------------------------------------------------------------------- |
| 81 | +BASE_BRANCH="main" |
40 | 82 |
|
41 | | - get_branch_diff "$@" |
42 | | -} |
| 83 | +while getopts ":hb:" opt; do |
| 84 | + case "${opt}" in |
| 85 | + h) |
| 86 | + help |
| 87 | + exit 0 |
| 88 | + ;; |
| 89 | + b) |
| 90 | + BASE_BRANCH="${OPTARG}" |
| 91 | + ;; |
| 92 | + \?) |
| 93 | + log_error "Invalid option" |
| 94 | + help |
| 95 | + exit 1 |
| 96 | + ;; |
| 97 | + :) |
| 98 | + log_error "Option -${OPTARG} requires an argument" |
| 99 | + exit 1 |
| 100 | + ;; |
| 101 | + esac |
| 102 | +done |
43 | 103 |
|
44 | | -main "$@" |
| 104 | +generate_branch_diff "${BASE_BRANCH}" |
0 commit comments