@san-siva/gitsy 1.0.7 → 1.0.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin/g-db +2 -1
- package/bin/g-diff +30 -15
- package/bin/g-pull +1 -1
- package/bin/g-push +3 -1
- package/bin/g-rto +1 -1
- package/bin/g-s +2 -1
- package/bin/g-wa +129 -71
- package/bin/g-wr +19 -10
- package/bin/utils +71 -22
- package/package.json +1 -1
package/bin/g-db
CHANGED
|
@@ -70,7 +70,8 @@ delete_local_branch() {
|
|
|
70
70
|
return 0
|
|
71
71
|
fi
|
|
72
72
|
|
|
73
|
-
current_branch
|
|
73
|
+
local current_branch
|
|
74
|
+
get_current_branch current_branch
|
|
74
75
|
if [ "${branch}" = "${current_branch}" ]; then
|
|
75
76
|
print_message "" -1
|
|
76
77
|
print_message "${RED}Cannot delete the branch you are currently on.${NC}" -1
|
package/bin/g-diff
CHANGED
|
@@ -105,11 +105,16 @@ format_diff_output() {
|
|
|
105
105
|
current_file="${BASH_REMATCH[1]}"
|
|
106
106
|
echo "${BLUE}file:${NC} ${current_file}"
|
|
107
107
|
|
|
108
|
-
|
|
109
|
-
local adds
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
108
|
+
# Get stats for this file
|
|
109
|
+
local adds dels numstat_output
|
|
110
|
+
numstat_output=$(git diff --numstat "origin/${target_branch}..${source_branch}" -- "$current_file" 2>&1)
|
|
111
|
+
local numstat_exit=$?
|
|
112
|
+
if [ $numstat_exit -eq 0 ]; then
|
|
113
|
+
adds=$(echo "$numstat_output" | awk '{print $1}')
|
|
114
|
+
dels=$(echo "$numstat_output" | awk '{print $2}')
|
|
115
|
+
if [ -n "$adds" ] && [ -n "$dels" ]; then
|
|
116
|
+
echo "${BLUE}stats:${NC} ${GREEN}+${adds}${NC} ${RED}-${dels}${NC}"
|
|
117
|
+
fi
|
|
113
118
|
fi
|
|
114
119
|
echo "${BLUE}changes:${NC}"
|
|
115
120
|
echo ""
|
|
@@ -149,12 +154,22 @@ has_changes() {
|
|
|
149
154
|
show_full_diff() {
|
|
150
155
|
if has_changes; then
|
|
151
156
|
# Capture and display formatted output
|
|
152
|
-
local formatted_output
|
|
157
|
+
local formatted_output
|
|
158
|
+
formatted_output=$(format_diff_output)
|
|
159
|
+
local format_exit=$?
|
|
160
|
+
if [ $format_exit -ne 0 ]; then
|
|
161
|
+
print_message "" -1
|
|
162
|
+
print_message "${RED}Failed to format diff output. [Fail]${NC}" -1
|
|
163
|
+
return 1
|
|
164
|
+
fi
|
|
153
165
|
echo "$formatted_output" | indent
|
|
154
166
|
|
|
155
167
|
# Copy formatted output to clipboard (strip color codes)
|
|
156
|
-
local clipboard_content
|
|
157
|
-
|
|
168
|
+
local clipboard_content
|
|
169
|
+
clipboard_content=$(sed $'s/\033\[[0-9;]*m//g' <<< "${formatted_output}")
|
|
170
|
+
if [ $? -eq 0 ]; then
|
|
171
|
+
copy_to_clipboard "$clipboard_content" "Formatted diff copied to clipboard."
|
|
172
|
+
fi
|
|
158
173
|
else
|
|
159
174
|
print_message "${BLUE}No changes found between ${NC}${source_branch}${BLUE} and ${NC}${target_branch}${BLUE}.${NC}"
|
|
160
175
|
fi
|
|
@@ -190,7 +205,12 @@ show_stat_summary() {
|
|
|
190
205
|
echo "$result" | indent
|
|
191
206
|
|
|
192
207
|
# Copy stats to clipboard (strip color codes)
|
|
193
|
-
local stats_content
|
|
208
|
+
local stats_content
|
|
209
|
+
if ! stats_content=$(git diff --stat "origin/${target_branch}..${source_branch}" 2>&1); then
|
|
210
|
+
print_message "" -1
|
|
211
|
+
print_message "${RED}Failed to generate stats for clipboard. [Fail]${NC}" -1
|
|
212
|
+
return 1
|
|
213
|
+
fi
|
|
194
214
|
copy_to_clipboard "$stats_content" "Stats copied to clipboard."
|
|
195
215
|
else
|
|
196
216
|
print_message "${BLUE}No changes found between ${NC}${source_branch}${BLUE} and ${NC}${target_branch}${BLUE}.${NC}"
|
|
@@ -202,12 +222,7 @@ compare_branches() {
|
|
|
202
222
|
|
|
203
223
|
if [ -z "$source_branch" ]; then
|
|
204
224
|
print_message "${BLUE}Source branch not specified, using current branch...${NC}" $step_number
|
|
205
|
-
|
|
206
|
-
if [ -z "$source_branch" ]; then
|
|
207
|
-
print_message "" -1
|
|
208
|
-
print_message "${RED}Failed to get current branch.${NC}" -1
|
|
209
|
-
exit 1
|
|
210
|
-
fi
|
|
225
|
+
get_current_branch source_branch
|
|
211
226
|
step_number=$((step_number + 1))
|
|
212
227
|
fi
|
|
213
228
|
|
package/bin/g-pull
CHANGED
package/bin/g-push
CHANGED
|
@@ -65,7 +65,9 @@ main() {
|
|
|
65
65
|
validate_dependencies
|
|
66
66
|
print_banner
|
|
67
67
|
if [ -z "$target_branch" ]; then
|
|
68
|
-
|
|
68
|
+
local current_branch
|
|
69
|
+
get_current_branch current_branch
|
|
70
|
+
push_changes "$current_branch" $should_force_push 1
|
|
69
71
|
exit 0
|
|
70
72
|
fi
|
|
71
73
|
push_changes "$target_branch" $should_force_push 1
|
package/bin/g-rto
CHANGED
package/bin/g-s
CHANGED
|
@@ -44,7 +44,8 @@ main() {
|
|
|
44
44
|
print_banner
|
|
45
45
|
print_message "${BLUE}Fetching git status...${NC}" 1
|
|
46
46
|
|
|
47
|
-
current_branch
|
|
47
|
+
local current_branch
|
|
48
|
+
get_current_branch current_branch
|
|
48
49
|
|
|
49
50
|
if ! git -c color.ui=always status 2>&1 | indent; then
|
|
50
51
|
print_message "${PROMPT}Failed to get git status. Are you in a git repository?${NC}"
|
package/bin/g-wa
CHANGED
|
@@ -66,8 +66,7 @@ set_flags() {
|
|
|
66
66
|
}
|
|
67
67
|
|
|
68
68
|
try_fetching_branch() {
|
|
69
|
-
|
|
70
|
-
if [ "${fetch_success}" = "false" ]; then
|
|
69
|
+
if ! fetch_changes "${target_branch}"; then
|
|
71
70
|
print_message "" -1
|
|
72
71
|
print_message "${RED}Failed to fetch changes for branch ${target_branch}. [Fail]${NC}" -1
|
|
73
72
|
exit 1
|
|
@@ -81,7 +80,13 @@ check_branch_in_worktree() {
|
|
|
81
80
|
print_message "${BLUE}Checking if ${NC}${branch}${BLUE} branch exists...${NC}" $step_number
|
|
82
81
|
|
|
83
82
|
# Check if branch is already checked out in another worktree
|
|
84
|
-
local existing_worktree
|
|
83
|
+
local existing_worktree
|
|
84
|
+
existing_worktree=$(git worktree list 2>/dev/null | grep -F "[${branch}]" | awk '{print $1}')
|
|
85
|
+
if [ $? -ne 0 ]; then
|
|
86
|
+
print_message "" -1
|
|
87
|
+
print_message "${RED}Failed to check worktree list. [Fail]${NC}" -1
|
|
88
|
+
exit 1
|
|
89
|
+
fi
|
|
85
90
|
if [ -n "$existing_worktree" ]; then
|
|
86
91
|
print_message "${RED}Branch ${NC}${branch}${RED} is already checked out in worktree:${NC}"
|
|
87
92
|
print_message "${GREEN}${existing_worktree}${NC}"
|
|
@@ -92,6 +97,7 @@ check_branch_in_worktree() {
|
|
|
92
97
|
|
|
93
98
|
generate_worktree_path() {
|
|
94
99
|
local target_branch=$1
|
|
100
|
+
local -n result_var=$2
|
|
95
101
|
|
|
96
102
|
# Determine worktree directory based on current location
|
|
97
103
|
local worktree_dir
|
|
@@ -111,22 +117,50 @@ generate_worktree_path() {
|
|
|
111
117
|
fi
|
|
112
118
|
|
|
113
119
|
# Sanitize branch name for worktree directory
|
|
114
|
-
local worktree_name
|
|
115
|
-
|
|
120
|
+
local worktree_name
|
|
121
|
+
sanitize_branch_name "$target_branch" worktree_name
|
|
122
|
+
if [ $? -ne 0 ]; then
|
|
123
|
+
return 1
|
|
124
|
+
fi
|
|
125
|
+
local result_path="${worktree_dir}${worktree_name}"
|
|
116
126
|
|
|
117
127
|
# Convert to absolute path
|
|
118
|
-
|
|
128
|
+
local abs_path
|
|
129
|
+
abs_path=$(cd "${result_path%/*}" 2>/dev/null && echo "$(pwd)/${result_path##*/}")
|
|
130
|
+
local abs_path_exit=$?
|
|
131
|
+
if [ $abs_path_exit -ne 0 ] || [ -z "$abs_path" ]; then
|
|
132
|
+
print_message "" -1
|
|
133
|
+
print_message "${RED}Failed to resolve absolute path. [Fail]${NC}" -1
|
|
134
|
+
return 1
|
|
135
|
+
fi
|
|
136
|
+
result_path="$abs_path"
|
|
119
137
|
|
|
120
138
|
# If path exists, generate a unique path
|
|
121
|
-
if [ -d "$
|
|
122
|
-
print_message "${
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
139
|
+
if [ -d "$result_path" ]; then
|
|
140
|
+
print_message "${PROMPT}Worktree path already exists.${NC}"
|
|
141
|
+
local parent_dir="${result_path%/*}"
|
|
142
|
+
local no_of_identical_dirs
|
|
143
|
+
no_of_identical_dirs=$(find "$parent_dir" -maxdepth 1 -type d -name "${worktree_name}*" 2>/dev/null | wc -l)
|
|
144
|
+
local find_exit=$?
|
|
145
|
+
if [ $find_exit -ne 0 ]; then
|
|
146
|
+
print_message "" -1
|
|
147
|
+
print_message "${RED}Failed to count existing directories. [Fail]${NC}" -1
|
|
148
|
+
return 1
|
|
149
|
+
fi
|
|
150
|
+
result_path="${parent_dir}/${worktree_name}_$(($no_of_identical_dirs + 1))"
|
|
151
|
+
print_message "${BLUE}Using new path: ${NC}${result_path}${NC}"
|
|
152
|
+
|
|
153
|
+
# Validate the new path
|
|
154
|
+
if [ -z "$result_path" ]; then
|
|
155
|
+
print_message "" -1
|
|
156
|
+
print_message "${RED}Failed to generate unique worktree path. [Fail]${NC}" -1
|
|
157
|
+
return 1
|
|
158
|
+
fi
|
|
126
159
|
fi
|
|
127
160
|
|
|
128
|
-
#
|
|
129
|
-
|
|
161
|
+
# Set the result via nameref
|
|
162
|
+
result_var="$result_path"
|
|
163
|
+
return 0
|
|
130
164
|
}
|
|
131
165
|
|
|
132
166
|
checkout_or_create_branch() {
|
|
@@ -136,7 +170,13 @@ checkout_or_create_branch() {
|
|
|
136
170
|
check_branch_in_worktree "${target_branch}" $step_number
|
|
137
171
|
|
|
138
172
|
# Generate worktree path
|
|
139
|
-
local path
|
|
173
|
+
local path
|
|
174
|
+
generate_worktree_path "${target_branch}" path
|
|
175
|
+
if [ $? -ne 0 ]; then
|
|
176
|
+
print_message "" -1
|
|
177
|
+
print_message "${RED}Failed to generate worktree path. [Fail]${NC}" -1
|
|
178
|
+
exit 1
|
|
179
|
+
fi
|
|
140
180
|
|
|
141
181
|
# Check if branch exists locally
|
|
142
182
|
if git show-ref --verify --quiet "refs/heads/${target_branch}"; then
|
|
@@ -160,9 +200,15 @@ checkout_or_create_branch() {
|
|
|
160
200
|
print_message "${RED}Branch not found on remote.${NC}"
|
|
161
201
|
|
|
162
202
|
# Get current branch and repo info for the "Will create" message
|
|
163
|
-
local current_branch
|
|
164
|
-
|
|
165
|
-
|
|
203
|
+
local current_branch repo_name sanitized_target
|
|
204
|
+
get_current_branch current_branch
|
|
205
|
+
get_repo_name repo_name
|
|
206
|
+
sanitize_branch_name "$target_branch" sanitized_target
|
|
207
|
+
if [ $? -ne 0 ]; then
|
|
208
|
+
print_message "" -1
|
|
209
|
+
print_message "${RED}Failed to sanitize branch name. [Fail]${NC}" -1
|
|
210
|
+
exit 1
|
|
211
|
+
fi
|
|
166
212
|
|
|
167
213
|
print_message "" -1
|
|
168
214
|
print_message "${BLUE}Will create ${NC}${target_branch}${BLUE} worktree (cut from ${NC}${current_branch}${BLUE})${NC}" -1
|
|
@@ -189,49 +235,46 @@ prompt_restructure_confirmation() {
|
|
|
189
235
|
local target_branch=$5
|
|
190
236
|
|
|
191
237
|
# Save the current branch before restructuring
|
|
192
|
-
local original_branch
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
print_message "${
|
|
199
|
-
print_message "
|
|
200
|
-
print_message "" 0
|
|
201
|
-
print_message "
|
|
202
|
-
print_message "
|
|
203
|
-
print_message "Current branch: ${BLUE}${original_branch}${NC}" 0 >&2
|
|
204
|
-
print_message "" 0 >&2
|
|
205
|
-
print_message "This structure allows you to work on multiple branches simultaneously" 0 >&2
|
|
206
|
-
print_message "by creating worktrees in separate directories" 0 >&2
|
|
238
|
+
local original_branch
|
|
239
|
+
get_current_branch original_branch
|
|
240
|
+
print_message "${step_number}. ${BLUE}Repository Reorganization Required${NC}" -1
|
|
241
|
+
print_message "Your repository will be moved into a 'main' subdirectory to enable worktree support" 0
|
|
242
|
+
print_message "" 0
|
|
243
|
+
print_message "Current location: ${BLUE}${git_root}${NC}" 0
|
|
244
|
+
print_message "New location: ${BLUE}${git_root}/main${NC}" 0
|
|
245
|
+
print_message "Current branch: ${BLUE}${original_branch}${NC}" 0
|
|
246
|
+
print_message "" 0
|
|
247
|
+
print_message "This structure allows you to work on multiple branches simultaneously" 0
|
|
248
|
+
print_message "by creating worktrees in separate directories" 0
|
|
207
249
|
|
|
208
250
|
# If not on default branch, mention worktree will be created
|
|
209
251
|
if [ "$original_branch" != "$default_branch" ]; then
|
|
210
|
-
local sanitized_original
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
print_message "
|
|
252
|
+
local sanitized_original sanitized_target
|
|
253
|
+
sanitize_branch_name "$original_branch" sanitized_original
|
|
254
|
+
sanitize_branch_name "$target_branch" sanitized_target
|
|
255
|
+
print_message "" 0
|
|
256
|
+
print_message "Note: You're currently on ${BLUE}${original_branch}${NC} (not ${BLUE}${default_branch}${NC})" 0
|
|
214
257
|
|
|
215
258
|
# Check if target branch is the same as original branch
|
|
216
259
|
if [ "$target_branch" = "$original_branch" ]; then
|
|
217
|
-
print_message "Two directories will be created:" 0
|
|
218
|
-
print_message "" 0
|
|
219
|
-
print_message "• ${BLUE}${repo_name}/main${NC} → ${BLUE}${default_branch}${NC} branch" 0
|
|
220
|
-
print_message "• ${BLUE}${repo_name}/worktrees/${sanitized_original}${NC} → ${BLUE}${original_branch}${NC} branch" 0
|
|
260
|
+
print_message "Two directories will be created:" 0
|
|
261
|
+
print_message "" 0
|
|
262
|
+
print_message "• ${BLUE}${repo_name}/main${NC} → ${BLUE}${default_branch}${NC} branch" 0
|
|
263
|
+
print_message "• ${BLUE}${repo_name}/worktrees/${sanitized_original}${NC} → ${BLUE}${original_branch}${NC} branch" 0
|
|
221
264
|
else
|
|
222
|
-
print_message "Three directories will be created:" 0
|
|
223
|
-
print_message "" 0
|
|
224
|
-
print_message "• ${BLUE}${repo_name}/main${NC} → ${BLUE}${default_branch}${NC} branch" 0
|
|
225
|
-
print_message "• ${BLUE}${repo_name}/worktrees/${sanitized_original}${NC} → ${BLUE}${original_branch}${NC} branch" 0
|
|
226
|
-
print_message "• ${BLUE}${repo_name}/worktrees/${sanitized_target}${NC} → ${BLUE}${target_branch}${NC} branch (cut from ${BLUE}${original_branch}${NC})" 0
|
|
265
|
+
print_message "Three directories will be created:" 0
|
|
266
|
+
print_message "" 0
|
|
267
|
+
print_message "• ${BLUE}${repo_name}/main${NC} → ${BLUE}${default_branch}${NC} branch" 0
|
|
268
|
+
print_message "• ${BLUE}${repo_name}/worktrees/${sanitized_original}${NC} → ${BLUE}${original_branch}${NC} branch" 0
|
|
269
|
+
print_message "• ${BLUE}${repo_name}/worktrees/${sanitized_target}${NC} → ${BLUE}${target_branch}${NC} branch (cut from ${BLUE}${original_branch}${NC})" 0
|
|
227
270
|
fi
|
|
228
271
|
fi
|
|
229
272
|
|
|
230
273
|
# Prompt user for confirmation
|
|
231
274
|
local proceed=$(prompt_user false "Proceed with restructuring?" "$step_number")
|
|
232
275
|
if [ "$proceed" != "y" ]; then
|
|
233
|
-
print_message "" -1
|
|
234
|
-
print_message "${RED}Restructuring cancelled by user.${NC}" -1
|
|
276
|
+
print_message "" -1
|
|
277
|
+
print_message "${RED}Restructuring cancelled by user.${NC}" -1
|
|
235
278
|
exit 1
|
|
236
279
|
fi
|
|
237
280
|
}
|
|
@@ -240,18 +283,19 @@ create_main_dir() {
|
|
|
240
283
|
local git_root=$1
|
|
241
284
|
local temp_dir=$2
|
|
242
285
|
local step_number=$3
|
|
286
|
+
local -n result_var=$4
|
|
243
287
|
|
|
244
288
|
# Create temp directory and move everything there
|
|
245
289
|
if ! mkdir -p "$temp_dir"; then
|
|
246
|
-
print_message "" -1
|
|
247
|
-
print_message "${RED}Failed to create temporary directory. [Fail]${NC}" -1
|
|
290
|
+
print_message "" -1
|
|
291
|
+
print_message "${RED}Failed to create temporary directory. [Fail]${NC}" -1
|
|
248
292
|
exit 1
|
|
249
293
|
fi
|
|
250
294
|
|
|
251
|
-
print_message "${BLUE}Moving repository contents to temporary location...${NC}" $step_number
|
|
295
|
+
print_message "${BLUE}Moving repository contents to temporary location...${NC}" $step_number
|
|
252
296
|
if ! (shopt -s dotglob && mv "$git_root"/* "$temp_dir/" 2>&1); then
|
|
253
|
-
print_message "" -1
|
|
254
|
-
print_message "${RED}Failed to move contents to temporary directory. [Fail]${NC}" -1
|
|
297
|
+
print_message "" -1
|
|
298
|
+
print_message "${RED}Failed to move contents to temporary directory. [Fail]${NC}" -1
|
|
255
299
|
rm -rf "$temp_dir"
|
|
256
300
|
exit 1
|
|
257
301
|
fi
|
|
@@ -259,8 +303,8 @@ create_main_dir() {
|
|
|
259
303
|
# Create main directory
|
|
260
304
|
local main_dir="${git_root}/main"
|
|
261
305
|
if ! mkdir -p "$main_dir"; then
|
|
262
|
-
print_message "" -1
|
|
263
|
-
print_message "${RED}Failed to create main directory. [Fail]${NC}" -1
|
|
306
|
+
print_message "" -1
|
|
307
|
+
print_message "${RED}Failed to create main directory. [Fail]${NC}" -1
|
|
264
308
|
# Restore from temp
|
|
265
309
|
(shopt -s dotglob && mv "$temp_dir"/* "$git_root/")
|
|
266
310
|
rm -rf "$temp_dir"
|
|
@@ -269,15 +313,16 @@ create_main_dir() {
|
|
|
269
313
|
|
|
270
314
|
# Move everything from temp to main
|
|
271
315
|
if ! (shopt -s dotglob && mv "$temp_dir"/* "$main_dir/" 2>&1); then
|
|
272
|
-
print_message "" -1
|
|
273
|
-
print_message "${RED}Failed to move contents to main directory. [Fail]${NC}" -1
|
|
316
|
+
print_message "" -1
|
|
317
|
+
print_message "${RED}Failed to move contents to main directory. [Fail]${NC}" -1
|
|
274
318
|
exit 1
|
|
275
319
|
fi
|
|
276
320
|
|
|
277
321
|
# Clean up temp directory
|
|
278
322
|
rm -rf "$temp_dir"
|
|
279
323
|
|
|
280
|
-
|
|
324
|
+
result_var="$main_dir"
|
|
325
|
+
return 0
|
|
281
326
|
}
|
|
282
327
|
|
|
283
328
|
checkout_main_in_main_branch() {
|
|
@@ -316,7 +361,13 @@ checkout_current_branch() {
|
|
|
316
361
|
return 0
|
|
317
362
|
fi
|
|
318
363
|
|
|
319
|
-
local path
|
|
364
|
+
local path
|
|
365
|
+
generate_worktree_path "$original_branch" path
|
|
366
|
+
if [ $? -ne 0 ]; then
|
|
367
|
+
print_message "" -1
|
|
368
|
+
print_message "${RED}Failed to generate worktree path. [Fail]${NC}" -1
|
|
369
|
+
exit 1
|
|
370
|
+
fi
|
|
320
371
|
print_message "${BLUE}Creating ${NC}${original_branch}${BLUE} worktree...${NC}" $step_number
|
|
321
372
|
create_worktree "$original_branch" "$path"
|
|
322
373
|
|
|
@@ -349,27 +400,31 @@ create_main_dir_if_necessary() {
|
|
|
349
400
|
step_number=0
|
|
350
401
|
fi
|
|
351
402
|
|
|
352
|
-
local git_root
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
403
|
+
local git_root current_dir parent_dir repo_name
|
|
404
|
+
if ! get_repo_info git_root current_dir parent_dir repo_name; then
|
|
405
|
+
print_message "" -1
|
|
406
|
+
print_message "${RED}Failed to get repository information. [Fail]${NC}" -1
|
|
407
|
+
exit 1
|
|
408
|
+
fi
|
|
356
409
|
|
|
357
410
|
if already_restructured; then
|
|
358
411
|
return 0
|
|
359
412
|
fi
|
|
360
413
|
|
|
361
414
|
# Save original branch before restructuring
|
|
362
|
-
local original_branch
|
|
415
|
+
local original_branch
|
|
416
|
+
get_current_branch original_branch
|
|
363
417
|
|
|
364
418
|
# Prompt user for restructuring
|
|
365
419
|
prompt_restructure_confirmation "$git_root" "$repo_name" "$default_branch" "$step_number" "$target_branch"
|
|
366
420
|
|
|
367
421
|
# Get parent directory path
|
|
368
|
-
local parent_path
|
|
422
|
+
local parent_path="${git_root%/*}"
|
|
369
423
|
local temp_dir="${parent_path}/.temp-${repo_name}-$$"
|
|
370
424
|
|
|
371
425
|
# Create main directory and restructure
|
|
372
|
-
local main_dir
|
|
426
|
+
local main_dir
|
|
427
|
+
create_main_dir "$git_root" "$temp_dir" $((step_number + 1)) main_dir
|
|
373
428
|
|
|
374
429
|
# Navigate to main directory using direct path
|
|
375
430
|
if ! navigate_to_dir "$main_dir"; then
|
|
@@ -410,8 +465,9 @@ main() {
|
|
|
410
465
|
exit 1
|
|
411
466
|
fi
|
|
412
467
|
|
|
413
|
-
local default_branch
|
|
414
|
-
|
|
468
|
+
local default_branch current_branch
|
|
469
|
+
get_default_branch default_branch
|
|
470
|
+
get_current_branch current_branch
|
|
415
471
|
|
|
416
472
|
local step_number=2
|
|
417
473
|
if [ "$stash" = true ]; then
|
|
@@ -419,10 +475,12 @@ main() {
|
|
|
419
475
|
fi
|
|
420
476
|
|
|
421
477
|
# Check if we need to restructure (to calculate proper step numbers)
|
|
422
|
-
local git_root
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
478
|
+
local git_root current_dir parent_dir repo_name
|
|
479
|
+
if ! get_repo_info git_root current_dir parent_dir repo_name; then
|
|
480
|
+
print_message "" -1
|
|
481
|
+
print_message "${RED}Failed to get repository information. [Fail]${NC}" -1
|
|
482
|
+
exit 1
|
|
483
|
+
fi
|
|
426
484
|
create_main_dir_if_necessary "$default_branch" $step_number
|
|
427
485
|
local needs_restructure=$?
|
|
428
486
|
|
package/bin/g-wr
CHANGED
|
@@ -88,15 +88,21 @@ set_flags() {
|
|
|
88
88
|
|
|
89
89
|
cd_to_worktrees_dir() {
|
|
90
90
|
# Get git root and navigate to repo root's worktrees directory
|
|
91
|
-
local git_root
|
|
91
|
+
local git_root
|
|
92
|
+
git_root=$(git rev-parse --show-toplevel 2>&1)
|
|
93
|
+
if [ $? -ne 0 ] || [ -z "$git_root" ]; then
|
|
94
|
+
print_message "" -1
|
|
95
|
+
print_message "${RED}Failed to get git root directory. [Fail]${NC}" -1
|
|
96
|
+
exit 1
|
|
97
|
+
fi
|
|
92
98
|
local git_root_parent=$(dirname "$git_root")
|
|
93
99
|
local git_root_parent_name=$(basename "$git_root_parent")
|
|
94
100
|
|
|
95
101
|
# If we're in a worktree (parent is "worktrees"), use that directory
|
|
96
102
|
if [ "$git_root_parent_name" = "worktrees" ]; then
|
|
97
103
|
if ! navigate_to_dir "$git_root_parent"; then
|
|
98
|
-
print_message "" -1
|
|
99
|
-
print_message "${RED}Failed to navigate to worktrees directory. [Fail]${NC}" -1
|
|
104
|
+
print_message "" -1
|
|
105
|
+
print_message "${RED}Failed to navigate to worktrees directory. [Fail]${NC}" -1
|
|
100
106
|
exit 1
|
|
101
107
|
fi
|
|
102
108
|
return 0
|
|
@@ -105,14 +111,14 @@ cd_to_worktrees_dir() {
|
|
|
105
111
|
# Otherwise, we're in main, so look for ../worktrees
|
|
106
112
|
local worktrees_dir="$git_root_parent/worktrees"
|
|
107
113
|
if [ ! -d "$worktrees_dir" ]; then
|
|
108
|
-
print_message "" -1
|
|
109
|
-
print_message "${RED}Worktrees directory not found at ${NC}${worktrees_dir}${RED}. [Fail]${NC}" -1
|
|
114
|
+
print_message "" -1
|
|
115
|
+
print_message "${RED}Worktrees directory not found at ${NC}${worktrees_dir}${RED}. [Fail]${NC}" -1
|
|
110
116
|
exit 1
|
|
111
117
|
fi
|
|
112
118
|
|
|
113
119
|
if ! navigate_to_dir "$worktrees_dir"; then
|
|
114
|
-
print_message "" -1
|
|
115
|
-
print_message "${RED}Failed to navigate to worktrees directory. [Fail]${NC}" -1
|
|
120
|
+
print_message "" -1
|
|
121
|
+
print_message "${RED}Failed to navigate to worktrees directory. [Fail]${NC}" -1
|
|
116
122
|
exit 1
|
|
117
123
|
fi
|
|
118
124
|
}
|
|
@@ -155,8 +161,10 @@ find_worktree_by_branch() {
|
|
|
155
161
|
continue
|
|
156
162
|
fi
|
|
157
163
|
|
|
158
|
-
local branch
|
|
159
|
-
|
|
164
|
+
local branch
|
|
165
|
+
branch=$(git rev-parse --abbrev-ref HEAD 2>/dev/null)
|
|
166
|
+
local branch_exit=$?
|
|
167
|
+
if [ $branch_exit -ne 0 ] || [ -z "$branch" ]; then
|
|
160
168
|
continue
|
|
161
169
|
fi
|
|
162
170
|
|
|
@@ -247,8 +255,9 @@ main() {
|
|
|
247
255
|
print_message "${BLUE}Searching for worktree with branch ${NC}${target_branch}${BLUE}...${NC}" $step_number
|
|
248
256
|
fi
|
|
249
257
|
|
|
258
|
+
local worktree_path
|
|
250
259
|
worktree_path=$(find_dir_to_remove)
|
|
251
|
-
if [ -z "$worktree_path" ]; then
|
|
260
|
+
if [ $? -ne 0 ] || [ -z "$worktree_path" ]; then
|
|
252
261
|
print_message "" -1
|
|
253
262
|
if [ -n "$worktree_name" ]; then
|
|
254
263
|
print_message "${RED}No worktree found with name ${NC}${worktree_name}${RED}. [Fail]${NC}" -1
|
package/bin/utils
CHANGED
|
@@ -116,56 +116,67 @@ prompt_user() {
|
|
|
116
116
|
}
|
|
117
117
|
|
|
118
118
|
get_current_branch() {
|
|
119
|
-
|
|
120
|
-
|
|
119
|
+
local -n result=$1
|
|
120
|
+
result=$(git rev-parse --abbrev-ref HEAD 2>&1)
|
|
121
|
+
local get_branch_exit=$?
|
|
122
|
+
if [ $get_branch_exit -ne 0 ] || [ -z "$result" ]; then
|
|
121
123
|
print_message "" -1
|
|
122
124
|
print_message "${RED}Failed to get current branch. [Fail]${NC}" -1
|
|
123
125
|
exit 1
|
|
124
126
|
fi
|
|
125
|
-
|
|
127
|
+
return 0
|
|
126
128
|
}
|
|
127
129
|
|
|
128
130
|
get_default_branch() {
|
|
131
|
+
local -n result=$1
|
|
129
132
|
local default_branch=""
|
|
130
133
|
|
|
131
134
|
# Try to get from remote HEAD
|
|
132
135
|
default_branch=$(git symbolic-ref refs/remotes/origin/HEAD 2>/dev/null | sed 's@^refs/remotes/origin/@@')
|
|
136
|
+
local exit_code=$?
|
|
133
137
|
|
|
134
|
-
if [ -n "$default_branch" ]; then
|
|
135
|
-
|
|
138
|
+
if [ $exit_code -eq 0 ] && [ -n "$default_branch" ]; then
|
|
139
|
+
result="$default_branch"
|
|
136
140
|
return 0
|
|
137
141
|
fi
|
|
138
142
|
|
|
139
143
|
# Check if main exists locally
|
|
140
144
|
if git show-ref --verify --quiet "refs/heads/main"; then
|
|
141
|
-
|
|
145
|
+
result="main"
|
|
142
146
|
return 0
|
|
143
147
|
fi
|
|
144
148
|
|
|
145
149
|
# Check if master exists locally
|
|
146
150
|
if git show-ref --verify --quiet "refs/heads/master"; then
|
|
147
|
-
|
|
151
|
+
result="master"
|
|
148
152
|
return 0
|
|
149
153
|
fi
|
|
150
154
|
|
|
151
155
|
# Fallback to main
|
|
152
|
-
|
|
156
|
+
result="main"
|
|
153
157
|
return 0
|
|
154
158
|
}
|
|
155
159
|
|
|
156
160
|
sanitize_branch_name() {
|
|
157
161
|
local branch_name=$1
|
|
158
|
-
local
|
|
162
|
+
local -n result=$2
|
|
163
|
+
local max_length=${3:-30} # Default max length is 30
|
|
159
164
|
|
|
160
165
|
# Replace non-alphanumeric characters with underscores and convert to lowercase
|
|
161
|
-
local sanitized
|
|
166
|
+
local sanitized
|
|
167
|
+
sanitized=$(echo "$branch_name" | sed -E 's/[^[:alnum:]]/_/g' | tr '[:upper:]' '[:lower:]')
|
|
168
|
+
local sanitize_exit=$?
|
|
169
|
+
if [ $sanitize_exit -ne 0 ]; then
|
|
170
|
+
return 1
|
|
171
|
+
fi
|
|
162
172
|
|
|
163
173
|
# Truncate if longer than max_length
|
|
164
174
|
if [ ${#branch_name} -gt $max_length ]; then
|
|
165
175
|
sanitized="${sanitized:0:$max_length}.."
|
|
166
176
|
fi
|
|
167
177
|
|
|
168
|
-
|
|
178
|
+
result="$sanitized"
|
|
179
|
+
return 0
|
|
169
180
|
}
|
|
170
181
|
|
|
171
182
|
stash_changes() {
|
|
@@ -187,7 +198,13 @@ stash_changes() {
|
|
|
187
198
|
fi
|
|
188
199
|
|
|
189
200
|
local stash_message
|
|
190
|
-
local branch_name
|
|
201
|
+
local branch_name
|
|
202
|
+
branch_name=$(git rev-parse --abbrev-ref HEAD 2>&1)
|
|
203
|
+
if [ $? -ne 0 ] || [ -z "$branch_name" ]; then
|
|
204
|
+
print_message "" -1
|
|
205
|
+
print_message "${RED}Failed to get current branch name for stash. [Fail]${NC}" -1
|
|
206
|
+
exit 1
|
|
207
|
+
fi
|
|
191
208
|
local stash_date=$(date '+%Y-%m-%d %H:%M:%S')
|
|
192
209
|
|
|
193
210
|
if [ -n "$tag_message" ]; then
|
|
@@ -276,12 +293,8 @@ create_worktree() {
|
|
|
276
293
|
exit 1
|
|
277
294
|
fi
|
|
278
295
|
|
|
279
|
-
base_branch
|
|
280
|
-
|
|
281
|
-
print_message "" -1
|
|
282
|
-
print_message "${RED}Failed to get current branch. [Fail]${NC}" -1
|
|
283
|
-
exit 1
|
|
284
|
-
fi
|
|
296
|
+
local base_branch
|
|
297
|
+
get_current_branch base_branch
|
|
285
298
|
|
|
286
299
|
if [ "$new_branch" = "true" ]; then
|
|
287
300
|
# Make sure the source branch exists remotely!
|
|
@@ -436,7 +449,8 @@ already_on_branch() {
|
|
|
436
449
|
step_number=1
|
|
437
450
|
fi
|
|
438
451
|
print_message "${BLUE}Checking current branch...${NC}" $step_number
|
|
439
|
-
current_branch
|
|
452
|
+
local current_branch
|
|
453
|
+
get_current_branch current_branch
|
|
440
454
|
if [ "${target_branch}" = "${current_branch}" ]; then
|
|
441
455
|
print_message "${GREEN}Already on branch ${NC}${target_branch}${GREEN}. [DONE]${NC}"
|
|
442
456
|
exit 1
|
|
@@ -586,14 +600,49 @@ copy_to_clipboard() {
|
|
|
586
600
|
}
|
|
587
601
|
|
|
588
602
|
get_repo_name() {
|
|
603
|
+
local -n result=$1
|
|
604
|
+
|
|
589
605
|
# Try to get repo name from git remote
|
|
590
|
-
local remote_url
|
|
606
|
+
local remote_url
|
|
607
|
+
remote_url=$(git config --get remote.origin.url 2>/dev/null)
|
|
591
608
|
if [ -n "$remote_url" ]; then
|
|
592
609
|
# Extract repo name from URL (handles both https and ssh)
|
|
593
|
-
echo "$remote_url" | sed -E 's#.*/([^/]+)(\.git)?$#\1#' | sed 's/\.git$//'
|
|
610
|
+
result=$(echo "$remote_url" | sed -E 's#.*/([^/]+)(\.git)?$#\1#' | sed 's/\.git$//')
|
|
611
|
+
local extract_exit=$?
|
|
612
|
+
if [ $extract_exit -ne 0 ]; then
|
|
613
|
+
return 1
|
|
614
|
+
fi
|
|
594
615
|
return 0
|
|
595
616
|
fi
|
|
596
617
|
|
|
597
618
|
# Fallback to directory name
|
|
598
|
-
|
|
619
|
+
local toplevel
|
|
620
|
+
toplevel=$(git rev-parse --show-toplevel 2>/dev/null || pwd)
|
|
621
|
+
result="${toplevel##*/}"
|
|
622
|
+
return 0
|
|
623
|
+
}
|
|
624
|
+
|
|
625
|
+
get_repo_info() {
|
|
626
|
+
local -n git_root_ref=$1
|
|
627
|
+
local -n current_dir_ref=$2
|
|
628
|
+
local -n parent_dir_ref=$3
|
|
629
|
+
local -n repo_name_ref=$4
|
|
630
|
+
|
|
631
|
+
# Get git root
|
|
632
|
+
git_root_ref=$(git rev-parse --show-toplevel)
|
|
633
|
+
local git_root_exit=$?
|
|
634
|
+
if [ $git_root_exit -ne 0 ] || [ -z "$git_root_ref" ]; then
|
|
635
|
+
return 1
|
|
636
|
+
fi
|
|
637
|
+
|
|
638
|
+
# Get current directory name (basename of git root)
|
|
639
|
+
current_dir_ref="${git_root_ref##*/}"
|
|
640
|
+
|
|
641
|
+
# Get parent directory (dirname of git root, then basename of that)
|
|
642
|
+
local parent_path="${git_root_ref%/*}"
|
|
643
|
+
parent_dir_ref="${parent_path##*/}"
|
|
644
|
+
|
|
645
|
+
# Get repo name
|
|
646
|
+
get_repo_name repo_name_ref
|
|
647
|
+
return 0
|
|
599
648
|
}
|