Skip to content

Commit ecbbb08

Browse files
committed
update branch diff with improved logic, logging, and help
1 parent 6481e31 commit ecbbb08

1 file changed

Lines changed: 82 additions & 22 deletions

File tree

src/git_branch_diff.sh

Lines changed: 82 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,44 +1,104 @@
11
#!/usr/bin/env bash
22
set -euo pipefail
33

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+
# -------------------------------------------------------------------------------------
439
function update_branches() {
540
git fetch origin >/dev/null 2>&1 || true
641
}
742

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
1248

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
1759

1860
update_branches
1961

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")
2164

22-
if [ -z "${FILES}" ]; then
23-
echo "No changes detected between branches."
65+
if [[ -z "${FILES}" ]]; then
66+
log_info "No changes detected."
2467
return
2568
fi
2669

27-
echo "Files changed..."
70+
echo
71+
log_info "Files changed:"
2872
echo "${FILES}"
2973
echo
3074

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"
3377
}
3478

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"
4082

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
43103

44-
main "$@"
104+
generate_branch_diff "${BASE_BRANCH}"

0 commit comments

Comments
 (0)