-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathpulls.sh
More file actions
344 lines (315 loc) Β· 11.1 KB
/
pulls.sh
File metadata and controls
344 lines (315 loc) Β· 11.1 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
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
#!/bin/bash
# Check if we want to rollback to a specific commit
ROLLBACK_COMMIT=""
FIX_HEAD_MODE=false
FIX_CONFLICTS_MODE=false
CONFLICT_FILES=()
if [ "$1" = "--rollback" ] && [ -n "$2" ]; then
ROLLBACK_COMMIT="$2"
echo "π ROLLBACK MODE: Will checkout commit $ROLLBACK_COMMIT"
echo ""
elif [ "$1" = "--fix-conflicts" ]; then
FIX_CONFLICTS_MODE=true
shift
while [ $# -gt 0 ]; do
CONFLICT_FILES+=("$1")
shift
done
echo "π§ FIX CONFLICTS MODE: Will restore --staged and re-add files: ${CONFLICT_FILES[*]}"
echo ""
elif [ "$1" = "--help" ] || [ "$1" = "-h" ]; then
echo "========================================"
echo "PULLS.SH - Git Repository Manager"
echo "========================================"
echo ""
echo "Usage:"
echo " ./pulls.sh # Normal pull and status"
echo " ./pulls.sh --rollback <ref> # Rollback to specific commit"
echo " ./pulls.sh --fix-head # Fix detached HEAD state"
echo " ./pulls.sh --fix-conflicts file1 file2 ... # Fix merge conflicts by restore --staged and re-add"
echo " ./pulls.sh --help # Show this help"
echo ""
echo "========================================"
echo "ROLLBACK EXAMPLES"
echo "========================================"
echo "Quick rollbacks:"
echo " ./pulls.sh --rollback HEAD~1 # Previous commit"
echo " ./pulls.sh --rollback HEAD~2 # 2 commits ago"
echo " ./pulls.sh --rollback HEAD~3 # 3 commits ago"
echo ""
echo "Find commits to rollback to:"
echo " git log --oneline -10 # View last 10 commits"
echo " git log --oneline --since='1 hour ago'"
echo " git log --oneline --author='Your Name'"
echo ""
echo "Rollback to specific commit:"
echo " ./pulls.sh --rollback abc123def456"
echo ""
echo "Fix detached HEAD state:"
echo " ./pulls.sh --fix-head # Return to main branch"
echo ""
echo "Fix merge conflicts:"
echo " ./pulls.sh --fix-conflicts static/linuxreport.css static/linuxreport.js"
echo ""
echo "Return to latest version:"
echo " ./pulls.sh"
echo ""
exit 0
elif [ "$1" = "--fix-head" ]; then
echo "========================================"
echo "FIXING DETACHED HEAD STATE"
echo "========================================"
echo "This will attempt to return all repositories to their main branch."
echo ""
read -p "Continue? (y/N): " -n 1 -r
echo
if [[ $REPLY =~ ^[Yy]$ ]]; then
FIX_HEAD_MODE=true
else
echo "Aborted."
exit 1
fi
fi
# Arrays to store status information
declare -a repo_names
declare -a repo_statuses
declare -a repo_details
# Function to pull and show status for a directory
pull_and_status() {
local dir=$1
echo "Processing $dir..."
cd "$dir"
# Check if directory is a git repository
if [ ! -d ".git" ]; then
echo "β Not a git repository"
repo_names+=("$dir")
repo_statuses+=("β")
repo_details+=("Not a git repository")
cd ..
echo "----------------------------------------"
return
fi
# Get current branch
local current_branch=$(git branch --show-current 2>/dev/null)
if [ -z "$current_branch" ]; then
if [ "$FIX_HEAD_MODE" = true ]; then
echo "π Fixing detached HEAD state..."
else
echo "β οΈ Detached HEAD detected - attempting to return to main branch..."
fi
# Try to checkout main branch (or master if main doesn't exist)
if git show-ref --verify --quiet refs/remotes/origin/main; then
echo "Checking out main branch..."
git checkout main 2>&1
current_branch="main"
elif git show-ref --verify --quiet refs/remotes/origin/master; then
echo "Checking out master branch..."
git checkout master 2>&1
current_branch="master"
else
echo "β Could not find main or master branch"
repo_names+=("$dir")
repo_statuses+=("β")
repo_details+=("No main/master branch found")
cd ..
echo "----------------------------------------"
return
fi
if [ $? -ne 0 ]; then
echo "β Failed to checkout main branch"
repo_names+=("$dir")
repo_statuses+=("β")
repo_details+=("Failed to checkout main branch")
cd ..
echo "----------------------------------------"
return
fi
echo "β
Successfully returned to $current_branch branch"
fi
# Check if there are uncommitted changes
local has_changes=$(git status --porcelain 2>/dev/null | wc -l)
# Handle rollback mode
if [ -n "$ROLLBACK_COMMIT" ]; then
echo "π Rolling back to commit $ROLLBACK_COMMIT..."
git checkout "$ROLLBACK_COMMIT" 2>&1
if [ $? -eq 0 ]; then
echo "β
Rollback successful"
status_icon="π"
status_detail="Rolled back to $ROLLBACK_COMMIT"
else
echo "β Rollback failed"
repo_names+=("$dir")
repo_statuses+=("β")
repo_details+=("Rollback failed")
cd ..
echo "----------------------------------------"
return
fi
# Handle fix conflicts mode
elif [ "$FIX_CONFLICTS_MODE" = true ]; then
echo "π§ Fixing conflicts for files: ${CONFLICT_FILES[*]}..."
for file in "${CONFLICT_FILES[@]}"; do
if [ -f "$file" ]; then
echo "Restoring --staged for $file..."
git restore --staged "$file" 2>&1
if [ $? -eq 0 ]; then
echo "Re-adding $file..."
git add "$file" 2>&1
if [ $? -eq 0 ]; then
echo "β
Fixed conflict for $file"
else
echo "β Failed to re-add $file"
fi
else
echo "β Failed to restore --staged for $file"
fi
else
echo "β οΈ File $file not found"
fi
done
echo "Checking if conflicts are resolved..."
if git diff --cached --name-only | grep -q .; then
echo "β
Conflicts resolved - ready to commit"
status_icon="π§"
status_detail="Conflicts fixed for: ${CONFLICT_FILES[*]}"
else
echo "β No staged changes found"
status_icon="β"
status_detail="Failed to fix conflicts"
fi
else
# Normal pull with rebase
echo "Pulling from origin/$current_branch..."
git pull --rebase --autostash 2>&1
# Check pull result
if [ $? -eq 0 ]; then
echo "β
Pull successful"
else
echo "β Pull failed - check for conflicts"
repo_names+=("$dir")
repo_statuses+=("β")
repo_details+=("Pull failed - conflicts")
cd ..
echo "----------------------------------------"
return
fi
fi
# Show clean status summary
echo "Status summary:"
if [ "$has_changes" -gt 0 ]; then
echo "β οΈ Has uncommitted changes ($has_changes files)"
else
echo "β
Working directory clean"
fi
# Check if up to date with remote
git fetch origin 2>/dev/null
local behind=$(git rev-list HEAD..origin/$current_branch --count 2>/dev/null)
local ahead=$(git rev-list origin/$current_branch..HEAD --count 2>/dev/null)
local status_icon="β
"
local status_detail=""
# Skip status check if in rollback mode
if [ -z "$ROLLBACK_COMMIT" ]; then
if [ "$behind" -gt 0 ]; then
echo "β¬οΈ Behind origin/$current_branch by $behind commits"
status_icon="β¬οΈ"
status_detail="Behind by $behind commits"
elif [ "$ahead" -gt 0 ]; then
echo "β¬οΈ Ahead of origin/$current_branch by $ahead commits"
status_icon="β¬οΈ"
status_detail="Ahead by $ahead commits"
else
echo "β
Up to date with origin/$current_branch"
status_detail="Up to date"
fi
fi
# Store status for summary
repo_names+=("$dir")
repo_statuses+=("$status_icon")
repo_details+=("$status_detail")
cd ..
echo "----------------------------------------"
}
# Function to display summary
show_summary() {
echo ""
echo "========================================"
echo "SUMMARY OF ALL REPOSITORIES"
echo "========================================"
local total_repos=${#repo_names[@]}
local success_count=0
local warning_count=0
local error_count=0
for i in "${!repo_names[@]}"; do
local status_icon="${repo_statuses[$i]}"
local repo_name="${repo_names[$i]}"
local detail="${repo_details[$i]}"
printf "%-15s %s %s\n" "$repo_name" "$status_icon" "$detail"
case "$status_icon" in
"β
") ((success_count++)) ;;
"β οΈ"|"β¬οΈ"|"β¬οΈ") ((warning_count++)) ;;
"β") ((error_count++)) ;;
esac
done
}
# List of directories to process
directories=(
"LinuxReport2"
"CovidReport2"
"aireport"
"trumpreport"
"pvreport"
"spacereport"
"robotreport"
)
# Process each directory
for dir in "${directories[@]}"; do
pull_and_status "$dir"
done
# Show summary at the end
show_summary
# Usage instructions
if [ -n "$ROLLBACK_COMMIT" ]; then
echo ""
echo "========================================"
echo "ROLLBACK COMPLETE"
echo "========================================"
echo "To return to the latest version later, run:"
echo " ./pulls.sh"
echo ""
echo "To rollback to a different commit, run:"
echo " ./pulls.sh --rollback <commit-hash>"
echo ""
echo "========================================"
echo "USEFUL ROLLBACK COMMANDS"
echo "========================================"
echo "View recent commits:"
echo " git log --oneline -10"
echo ""
echo "Common rollback targets:"
echo " ./pulls.sh --rollback HEAD~1 # Previous commit"
echo " ./pulls.sh --rollback HEAD~2 # 2 commits ago"
echo " ./pulls.sh --rollback HEAD~3 # 3 commits ago"
echo " ./pulls.sh --rollback HEAD~5 # 5 commits ago"
echo ""
echo "Rollback to specific commit hash:"
echo " ./pulls.sh --rollback abc123def456"
echo ""
echo "Find commits by date:"
echo " git log --oneline --since='2 hours ago'"
echo " git log --oneline --since='1 day ago'"
echo ""
echo "Find commits by author:"
echo " git log --oneline --author='Your Name'"
echo ""
elif [ "$FIX_CONFLICTS_MODE" = true ]; then
echo ""
echo "========================================"
echo "CONFLICTS FIXED"
echo "========================================"
echo "To complete the merge, run:"
echo " git commit"
echo ""
echo "To abort the merge instead:"
echo " git merge --abort"
echo ""
fi