-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathexplain-commit.sh
More file actions
executable file
·154 lines (131 loc) · 5.53 KB
/
Copy pathexplain-commit.sh
File metadata and controls
executable file
·154 lines (131 loc) · 5.53 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
#!/bin/bash
# Explain changes in a specific commit
# Usage: ./explain-commit.sh <repo-name> <COMMIT_HASH>
# Example: ./explain-commit.sh guide abc1234
set -e
# Load configuration
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" 2>/dev/null && pwd || pwd)"
LEARNING_DIR="$(cd "$SCRIPT_DIR/.." 2>/dev/null && pwd || pwd)"
source "$SCRIPT_DIR/config-loader.sh"
if [ $# -lt 2 ]; then
echo "Usage: $0 <repo-name> <COMMIT_HASH>"
echo "Example: $0 guide abc1234"
echo ""
echo "You can use a full or partial commit hash"
exit 1
fi
REPO_NAME=$1
COMMIT_HASH=$2
REPO_DIR="$BASE_DIR/$REPO_NAME"
UPSTREAM_REPO="${UPSTREAM_ORG}/$REPO_NAME"
if [ ! -d "$REPO_DIR" ] || [ ! -d "$REPO_DIR/.git" ]; then
echo -e "${RED}❌ Repository not found: $REPO_DIR${NC}"
echo "Make sure the repository is cloned to $BASE_DIR"
exit 1
fi
GREEN='\033[0;32m'
BLUE='\033[0;34m'
YELLOW='\033[1;33m'
RED='\033[0;31m'
CYAN='\033[0;36m'
GRAY='\033[0;90m'
NC='\033[0m'
cd "$REPO_DIR"
# Fetch latest to ensure we have the commit
echo -e "${GRAY}Fetching latest changes...${NC}"
git fetch upstream 2>/dev/null || git fetch origin 2>/dev/null
echo ""
# Check if commit exists
if ! git cat-file -e "$COMMIT_HASH" 2>/dev/null; then
echo -e "${RED}Error: Commit $COMMIT_HASH not found in local repository${NC}"
echo -e "${YELLOW}Try fetching first: git fetch upstream${NC}"
exit 1
fi
# Get commit details
COMMIT_MSG=$(git log -1 --pretty=format:"%s" "$COMMIT_HASH")
COMMIT_AUTHOR=$(git log -1 --pretty=format:"%an <%ae>" "$COMMIT_HASH")
COMMIT_DATE=$(git log -1 --pretty=format:"%ad" --date=format:"%Y-%m-%d %H:%M:%S" "$COMMIT_HASH")
FULL_HASH=$(git rev-parse "$COMMIT_HASH")
echo -e "${BLUE}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}"
echo -e "${BLUE}📝 Commit Explanation${NC}"
echo -e "${BLUE}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}\n"
# Commit header
echo -e "${CYAN}Commit:${NC} $COMMIT_MSG"
echo -e "${CYAN}Hash:${NC} $FULL_HASH"
echo -e "${CYAN}Author:${NC} $COMMIT_AUTHOR"
echo -e "${CYAN}Date:${NC} $COMMIT_DATE"
echo ""
# File changes summary
echo -e "${YELLOW}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}"
echo -e "${YELLOW}📊 Files Changed${NC}"
echo -e "${YELLOW}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}\n"
git show "$COMMIT_HASH" --stat --format=""
echo ""
# Detailed file breakdown
echo -e "${YELLOW}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}"
echo -e "${YELLOW}📁 Files Breakdown${NC}"
echo -e "${YELLOW}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}\n"
git show "$COMMIT_HASH" --name-status --format="" | while read -r status file; do
case "$status" in
A)
echo -e " ${GREEN}+ Added:${NC} $file"
;;
M)
echo -e " ${YELLOW}~ Modified:${NC} $file"
;;
D)
echo -e " ${RED}- Deleted:${NC} $file"
;;
R*)
OLD_FILE=$(echo "$status" | cut -f2)
NEW_FILE="$file"
echo -e " ${CYAN}→ Renamed:${NC} $OLD_FILE → $NEW_FILE"
;;
*)
echo -e " ${GRAY}? $status:${NC} $file"
;;
esac
done
echo ""
# Key changes summary (more friendly than full diff)
echo -e "${YELLOW}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}"
echo -e "${YELLOW}🔍 Key Changes${NC}"
echo -e "${YELLOW}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}\n"
# Show a concise diff summary (no pager)
echo -e "${GRAY}Summary of code changes:${NC}\n"
git show "$COMMIT_HASH" --format="" --stat
echo ""
echo -e "${GRAY}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}"
echo -e "${GRAY}💡 To see full diff, run: git show $COMMIT_HASH${NC}"
echo -e "${GRAY}💡 Or copy the commit info above and ask Cursor to explain the changes${NC}"
echo ""
echo -e "${GREEN}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}"
echo -e "${GREEN}💡 Quick Reference${NC}"
echo -e "${GREEN}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}\n"
# Get stats
STATS=$(git show "$COMMIT_HASH" --shortstat --format="" | tail -1)
echo -e "${CYAN}Summary:${NC} $STATS"
echo ""
# Show parent commit if available
PARENT=$(git rev-parse "$COMMIT_HASH^" 2>/dev/null || echo "")
if [ -n "$PARENT" ]; then
PARENT_MSG=$(git log -1 --pretty=format:"%s" "$PARENT")
echo -e "${CYAN}Parent commit:${NC} ${PARENT:0:8} - $PARENT_MSG"
echo ""
fi
# Show branch info
BRANCHES=$(git branch -a --contains "$COMMIT_HASH" 2>/dev/null | head -5 | sed 's/^/ /')
if [ -n "$BRANCHES" ]; then
echo -e "${CYAN}Contained in branches:${NC}"
echo "$BRANCHES"
echo ""
fi
echo -e "${GRAY}View on GitHub:${NC}"
echo -e " gh browse --commit $COMMIT_HASH --repo $UPSTREAM_REPO"
echo ""
echo -e "${GRAY}Compare with parent:${NC}"
echo -e " git diff ${COMMIT_HASH}^..${COMMIT_HASH}"
echo ""
echo -e "${GRAY}Show specific file:${NC}"
echo -e " git show $COMMIT_HASH -- <file_path>"
echo ""