qg 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248
  1. #!/bin/sh
  2. extract()
  3. {
  4. filenums=`echo $cmds | awk -v idx=$1 '{
  5. size = split($0, a, " ");
  6. list = "";
  7. for(v = 1; v <= size; v++) {
  8. if(v > idx) {
  9. if(a[v] ~ /[0-9]/ || a[v] ~ "-" || a[v] ~ ",") {
  10. list = list a[v];
  11. }
  12. }
  13. }
  14. size = split(list, arr, ",");
  15. final="";
  16. for(i = 1; i <= size; i++) {
  17. if(arr[i] ~ "-") {
  18. split(arr[i], inner, "-");
  19. for(k = inner[1]; k <= inner[2]; k++) {
  20. final=final "," k;
  21. }
  22. } else {
  23. final=final "," arr[i]
  24. }
  25. }
  26. printf("%s", substr(final, 2));
  27. }'`
  28. }
  29. removetemp()
  30. {
  31. rm /tmp/.gt-temp* > /dev/null 2>&1
  32. }
  33. status()
  34. {
  35. cmd=`git status 2>&1 | tee /tmp/.gt-temp.txt`
  36. awk '
  37. BEGIN {
  38. num = 0;
  39. }
  40. $0 ~ "Untracked" {
  41. untracked = 1
  42. committed = 0;
  43. notcommitted = 0;
  44. first = 1;
  45. }
  46. $0 ~ "Changes not" {
  47. untracked = 0;
  48. committed = 0;
  49. notcommitted = 1;
  50. first = 1;
  51. }
  52. $0 ~ "Changes to" {
  53. untracked = 0;
  54. committed = 1;
  55. notcommitted = 0;
  56. first = 1;
  57. }
  58. {
  59. if($0 ~ "use \"git " || first) {
  60. printf("\033[38m%s\033[0m\n", $0);
  61. first = 0;
  62. } else if($0 ~ ".gt-temp") {
  63. } else if(committed && $0 ~ /[^\s\\]/) {
  64. num++;
  65. printf("\033[1m%d\033[0m.\033[32m%s\033[0m\n", num, $0)
  66. } else if((untracked || notcommitted) && $0 ~ /[^\s\\]/) {
  67. num++;
  68. printf("\033[1m%d\033[0m.\033[31m%s\033[0m\n", num, $0)
  69. } else
  70. printf("\033[38m%s\033[0m\n", $0)
  71. }' /tmp/.gt-temp.txt > /tmp/.gt-temp1.txt
  72. if test $1 = 1; then
  73. cat /tmp/.gt-temp1.txt
  74. rm /tmp/.gt-temp1.txt
  75. else
  76. awk '{ gsub("\x1B[(([0-9]{1,2})?(;)?([0-9]{1,2})?)?[m,K,H,f,J]", ""); print $0 }' /tmp/.gt-temp1.txt > /tmp/.gt-temp2.txt
  77. cat /tmp/.gt-temp2.txt > /tmp/.gt-temp1.txt
  78. rm /tmp/.gt-temp2.txt
  79. fi
  80. }
  81. # TODO: work with file names and paths
  82. make_file_list()
  83. {
  84. files=`awk -v t=$1 -v arg=$2 '
  85. BEGIN {
  86. size = split(arg, nums, ",");
  87. ff = 0;
  88. }
  89. {
  90. if($0 ~ "--staged" && ff == 0 && t == "restore") {
  91. printf("--staged ");
  92. }
  93. if($1 ~ /[\.]/) {
  94. for(i = 1; i <= size; i++) {
  95. withp = nums[i]"."
  96. gsub(/\033\[[0-9;]*m/, "", $0)
  97. if(withp == $1) {
  98. printf("%s ", $NF);
  99. ff++;
  100. }
  101. }
  102. }
  103. }
  104. ' /tmp/.gt-temp1.txt`
  105. }
  106. if test "$1" = ""; then
  107. status 1
  108. removetemp
  109. exit 1
  110. fi
  111. cmds=`echo $1 | sed 's/\(.\)/\1 /g'`
  112. shift
  113. IN_STASH=0
  114. i=0
  115. echo "$cmds" | tr ' ' '\n' | while read c;
  116. do
  117. i=${i+1}
  118. case $c in
  119. a)
  120. next=`echo $cmds | cut -d\ -f${i+2}`
  121. if test "$next" = "."; then
  122. removetemp
  123. git add .
  124. elif test "$next" = "a"; then
  125. git add $@
  126. else
  127. status 0
  128. extract $i
  129. make_file_list "add" $filenums
  130. git add $files
  131. removetemp
  132. fi
  133. ;;
  134. s)
  135. if test $IN_STASH = 1; then
  136. git stash show $@
  137. else
  138. status 1
  139. fi
  140. ;;
  141. S)
  142. next=`echo $cmds | cut -d\ -f${i+2}`
  143. if test $IN_STASH = 1; then
  144. git stash save $@
  145. elif test "$next" = "S"; then
  146. git stash
  147. else
  148. IN_STASH=1
  149. fi
  150. ;;
  151. p)
  152. if test $IN_STASH = 1; then
  153. git stash pop $@
  154. else
  155. git pull
  156. fi
  157. ;;
  158. P)
  159. cmd=`git push 2>&1 | tee /tmp/.gt-temp.txt | awk '$0 ~ "git push --set-upstream" { print $0 }'`
  160. if test "$cmd" = ""; then
  161. cat /tmp/.gt-temp.txt
  162. rm /tmp/.gt-temp.txt
  163. exit 0
  164. else
  165. echo "Running: ${cmd}"
  166. removetemp
  167. eval $cmd
  168. exit 0
  169. fi
  170. ;;
  171. c)
  172. if test $IN_STASH = 1; then
  173. git stash clear $@
  174. else
  175. git commit
  176. fi
  177. ;;
  178. C)
  179. git checkout $1
  180. shift
  181. ;;
  182. l)
  183. if test $IN_STASH = 1; then
  184. git stash list $@
  185. else
  186. git log
  187. fi
  188. ;;
  189. M)
  190. git merge $1
  191. shift
  192. ;;
  193. b)
  194. if test $IN_STASH = 1; then
  195. git stash branch $@
  196. else
  197. git branch $1
  198. shift
  199. fi
  200. ;;
  201. d)
  202. if test $IN_STASH = 1; then
  203. git stash drop $@
  204. else
  205. git diff $1
  206. fi
  207. ;;
  208. r)
  209. status 0
  210. extract $i
  211. make_file_list "restore" $filenums
  212. git restore $files
  213. status 1
  214. ;;
  215. R)
  216. next=`echo $cmds | cut -d\ -f${i+2}`
  217. if test "$next" = ""; then
  218. removetemp
  219. git rm $@
  220. else
  221. status 0
  222. extract $i
  223. make_file_list "add" $filenums
  224. git rm $files
  225. removetemp
  226. fi
  227. ;;
  228. g)
  229. git grep -n "$1"
  230. ;;
  231. q)
  232. break
  233. ;;
  234. *)
  235. ;;
  236. esac
  237. done
  238. exit 0