git-jump 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. #!/bin/sh
  2. usage() {
  3. cat <<\EOF
  4. usage: git jump <mode> [<args>]
  5. Jump to interesting elements in an editor.
  6. The <mode> parameter is one of:
  7. diff: elements are diff hunks. Arguments are given to diff.
  8. merge: elements are merge conflicts. Arguments are ignored.
  9. grep: elements are grep hits. Arguments are given to grep.
  10. EOF
  11. }
  12. open_editor() {
  13. editor=`git var GIT_EDITOR`
  14. eval "$editor -q \$1"
  15. }
  16. mode_diff() {
  17. git diff --no-prefix --relative "$@" |
  18. perl -ne '
  19. if (m{^\+\+\+ (.*)}) { $file = $1; next }
  20. defined($file) or next;
  21. if (m/^@@ .*\+(\d+)/) { $line = $1; next }
  22. defined($line) or next;
  23. if (/^ /) { $line++; next }
  24. if (/^[-+]\s*(.*)/) {
  25. print "$file:$line: $1\n";
  26. $line = undef;
  27. }
  28. '
  29. }
  30. mode_merge() {
  31. git ls-files -u |
  32. perl -pe 's/^.*?\t//' |
  33. sort -u |
  34. while IFS= read fn; do
  35. grep -Hn '^<<<<<<<' "$fn"
  36. done
  37. }
  38. # Grep -n generates nice quickfix-looking lines by itself,
  39. # but let's clean up extra whitespace, so they look better if the
  40. # editor shows them to us in the status bar.
  41. mode_grep() {
  42. git grep -n "$@" |
  43. perl -pe '
  44. s/[ \t]+/ /g;
  45. s/^ *//;
  46. '
  47. }
  48. if test $# -lt 1; then
  49. usage >&2
  50. exit 1
  51. fi
  52. mode=$1; shift
  53. trap 'rm -f "$tmp"' 0 1 2 3 15
  54. tmp=`mktemp -t git-jump.XXXXXX` || exit 1
  55. type "mode_$mode" >/dev/null 2>&1 || { usage >&2; exit 1; }
  56. "mode_$mode" "$@" >"$tmp"
  57. test -s "$tmp" || exit 0
  58. open_editor "$tmp"