git-jira-shortcuts 1.0.9 → 1.0.11

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "git-jira-shortcuts",
3
- "version": "1.0.9",
3
+ "version": "1.0.11",
4
4
  "description": "Git + Jira workflow shortcuts for zsh — interactive branch switching, auto-prefixed commits, Jira integration, and more.",
5
5
  "author": "chipallen2",
6
6
  "license": "MIT",
@@ -953,7 +953,6 @@ alias tj='testJira' # testJira | Test Jira API connection
953
953
 
954
954
  gclean() { # gclean [--dry-run] | Delete local branches already merged to master (skips recent)
955
955
  local dry_run=0
956
- local days_recent=7
957
956
 
958
957
  for arg in "$@"; do
959
958
  case "$arg" in
@@ -962,6 +961,17 @@ gclean() { # gclean [--dry-run] | Delete local branches already merged to master
962
961
  ;;
963
962
  esac
964
963
  done
964
+
965
+ if ! git rev-parse --git-dir >/dev/null 2>&1; then
966
+ echo "❌ Not a git repository."
967
+ return 1
968
+ fi
969
+
970
+ # Safety: refresh remote refs first so merge checks are based on current origin state.
971
+ if ! git fetch --quiet origin --prune 2>/dev/null; then
972
+ echo "❌ Could not fetch origin. Aborting to avoid deleting against stale refs."
973
+ return 1
974
+ fi
965
975
 
966
976
  # Default protected branches
967
977
  local -a protected=("master" "main" "develop" "development")
@@ -1020,12 +1030,7 @@ gclean() { # gclean [--dry-run] | Delete local branches already merged to master
1020
1030
  local deleted=0
1021
1031
  local skipped_protected=0
1022
1032
  local skipped_recent=0
1023
-
1024
- # Build grep pattern for protected branches
1025
- local grep_pattern="^\s*\*"
1026
- for p in "${protected[@]}"; do
1027
- grep_pattern="$grep_pattern|^\s*$p\$"
1028
- done
1033
+ local skipped_not_merged=0
1029
1034
 
1030
1035
  while IFS= read -r branch; do
1031
1036
  branch=$(echo "$branch" | sed 's/^[[:space:]]*//;s/[[:space:]]*$//')
@@ -1058,6 +1063,13 @@ gclean() { # gclean [--dry-run] | Delete local branches already merged to master
1058
1063
  [[ $dry_run -eq 1 ]] && echo " ⏭️ Skip (recent): $branch"
1059
1064
  continue
1060
1065
  fi
1066
+
1067
+ # Extra safety: branch tip must still be an ancestor of merge target right before delete.
1068
+ if ! git merge-base --is-ancestor "$branch" "$merge_target" 2>/dev/null; then
1069
+ ((skipped_not_merged++))
1070
+ [[ $dry_run -eq 1 ]] && echo " ⏭️ Skip (not merged): $branch"
1071
+ continue
1072
+ fi
1061
1073
 
1062
1074
  # Delete the branch
1063
1075
  if [[ $dry_run -eq 1 ]]; then
@@ -1076,6 +1088,8 @@ gclean() { # gclean [--dry-run] | Delete local branches already merged to master
1076
1088
  else
1077
1089
  echo "✅ Deleted $deleted branch(es)."
1078
1090
  fi
1091
+ [[ $skipped_protected -gt 0 ]] && echo " Skipped $skipped_protected protected branch(es)."
1079
1092
  [[ $skipped_recent -gt 0 ]] && echo " Skipped $skipped_recent recent branch(es)."
1093
+ [[ $skipped_not_merged -gt 0 ]] && echo " Skipped $skipped_not_merged not-merged branch(es)."
1080
1094
  }
1081
1095
  alias gc_clean='gclean' # gclean | Alias for gclean