mk_format_patch 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248
  1. #!/bin/bash
  2. #
  3. # License: (MIT) <https://mit-license.org/>
  4. #
  5. # Copyright (c) 2020-2022 Leonid Gasheev aka <https://github.com/The-going>
  6. #
  7. # mkdir -p ~/tmp/kernel.org-5.10/patches.kernel.org
  8. # cd /gituser/linux-stable>
  9. # mk_format_patch . v5.10.40..v5.10.41 ~/tmp/kernel.org-5.10/patches.kernel.org
  10. #
  11. used_f ()
  12. {
  13. echo -e "$mess"
  14. echo -e "\n Used:"
  15. echo -e "\n$0 <LOCAL GIT URL> <tag..tag> <patches.name dir>\n\nor"
  16. echo -e "\n$0 <LOCAL GIT URL> <tag..tag> <patches.name dir> <prefix=PREF> <numbered=true>\n"
  17. }
  18. # intelect copy
  19. # Copy only those patches that have changed their content,
  20. # so as not to create unnecessary noise.
  21. ii_cp()
  22. {
  23. local new_p=$1
  24. local old_p=$2
  25. # Patches can be extracted in several ways.
  26. # Copy only those patches that have changes in chunks,
  27. # line numbers, or source text.
  28. # Ignore lines that may be changed by another method
  29. # of extracting (creating) the patch.
  30. if [ "$(diff -N \
  31. --ignore-matching-lines="^From [0-9a-f]\{40\}" \
  32. --ignore-matching-lines="^index [0-9a-f]\{7\}" \
  33. --ignore-matching-lines="^Subject:" \
  34. --ignore-matching-lines='/.*/* |[ ][ 1-9]' \
  35. --ignore-matching-lines='^Armbian$' \
  36. --ignore-matching-lines="^[2-3].[1-9][0-9]" \
  37. $old_p $new_p 2>/dev/null)" != "" ]
  38. then
  39. cp --backup=none -f $new_p $old_p
  40. counter=1
  41. else
  42. counter=0
  43. fi
  44. }
  45. mk_patch_series ()
  46. {
  47. local url_t="${1}"
  48. if test -d "$url_t"; then url_t="$(realpath $url_t)"; fi
  49. local range="${2:-HEAD..HEAD}"
  50. local target="${3:-~/tmp}"
  51. if test -d $target; then target="$(realpath $target)"; fi
  52. for p in ${4} ${5} ${6}
  53. do
  54. case $p in
  55. *=*) eval "local ${p}" ;;
  56. esac
  57. done
  58. local target_name
  59. local target_dir
  60. local mess=""
  61. numbered=${numbered:-false}
  62. echo -e "\nLOCAL GIT URL =: [\033[1;34m$url_t\033[0m]"
  63. echo -e "revision range =: [\033[1;34m$range\033[0m]"
  64. echo -e "target folder for patches =: [\033[1;34m$target\033[0m]"
  65. echo -e "prefix =: [\033[1;34m$prefix\033[0m]"
  66. echo -e "numbered =: [\033[1;31m${numbered}\033[0m]\n"
  67. [ -d $url_t ] || mess+=" bad url [$url_t]\n"
  68. git -C $url_t rev-parse --git-dir 2>/dev/null || mess+=" It's NOT git\n"
  69. [ $(git -C $url_t rev-list ${range%..*} -1 2>/dev/null) ] || \
  70. mess+=" bad first tag [${range%..*}]\n"
  71. [ $(git -C $url_t rev-list ${range#*..} -1 2>/dev/null) ] || \
  72. mess+=" bad second tag [${range#*..}]\n"
  73. [ -d $target ] || mess+=" bad target dir [$target]\n"
  74. if [ "$mess" == "" ]
  75. then
  76. local tmp_dir=$(mktemp -d /tmp/format_patch_XXXXXXX)
  77. local origin_url="$(git -C $url_t remote get-url origin 2>/dev/null)"
  78. echo " It's generate format-patch: "
  79. echo " In tmp folder: $tmp_dir"
  80. target_name="$(basename $target)"
  81. target_dir="$(dirname $target)"
  82. if ! $numbered
  83. then
  84. numbered=false
  85. if test "${target_name#*.}" != "$target_name"
  86. then
  87. sufix="${target_name#*.}"
  88. else
  89. sufix="conf"
  90. fi
  91. else
  92. case "$origin_url" in
  93. *linux-stable*)
  94. numbered=${numbered:-true}
  95. prefix="${range#*..v}-"
  96. sufix="kernel.org"
  97. ;;
  98. *megous*)
  99. numbered=${numbered:-false}
  100. t_branch="$(git -C $url_t branch --show-current)"
  101. prefix=${prefix:-"o${t_branch#*-}-"}
  102. #sufix="${t_branch%%-*}${t_branch#*-}"
  103. sufix="megous"
  104. ;;
  105. *linux-evl*)
  106. numbered=${numbered:-false}
  107. t_branch="$(git -C $url_t branch --show-current)"
  108. sufix='evl'
  109. ;;
  110. *)
  111. numbered=${numbered:-true}
  112. prefix=PREF
  113. sufix=SUF
  114. ;;
  115. esac
  116. fi
  117. if [ -f ${target_dir}/series.$sufix ];then
  118. mv -f ${target_dir}/series.$sufix ${target_dir}/series.${sufix}.old
  119. grep "^#.*$" ${target_dir}/series.${sufix}.old > ${target_dir}/series.$sufix
  120. else
  121. echo -e "#\n#\tAutomatically generated by the script mk_format_patch\n#" \
  122. >${target_dir}/series.$sufix
  123. [ -n "$origin_url" ] && \
  124. echo -e "#\t${origin_url}\n#" >>${target_dir}/series.$sufix
  125. fi
  126. if $numbered
  127. then
  128. $(git -C $url_t \
  129. format-patch $range \
  130. -o $tmp_dir/
  131. ) 2>/dev/null
  132. echo -e "\t\tAll generated patches: [$(ls $tmp_dir | wc -l)]"
  133. $(cd $tmp_dir
  134. for pt in $(git -C $url_t log --graph --no-merges --pretty=%H $range | awk '{print $2}' | tac | xargs -I {} grep -l {} *)
  135. do
  136. if test -s $pt
  137. then
  138. echo -e "\t$target_name/${prefix}${pt#*0}" \
  139. >> ${target_dir}/series.$sufix
  140. mv $pt ${target}/${prefix}${pt#*0}
  141. fi
  142. done
  143. )
  144. else
  145. mkdir $tmp_dir/$target_name
  146. sum_counter=0
  147. prefix=""
  148. $(git -C $url_t \
  149. format-patch --filename-max-length=75 --abbrev=12 $range \
  150. -o $tmp_dir/$target_name
  151. ) 2>/dev/null
  152. echo -e "\t\tAll generated patches: [$(cd $tmp_dir/$target_name; ls | wc -l)]"
  153. $(cd $tmp_dir/$target_name
  154. for pt in $(git -C $url_t log --graph --no-merges --pretty=%H $range | awk '{print $2}' | tac | xargs -I {} grep -l {} *)
  155. do
  156. if test -s $pt
  157. then
  158. if test -f ${prefix}${pt#*-} && test -f "2-${prefix}${pt#*-}";then
  159. $(konsole -e /usr/bin/nano "2-${prefix}${pt#*-}") & \
  160. konsole -e /usr/bin/nano ${pt} & \
  161. konsole -e /usr/bin/nano ../series.$sufix && \
  162. wait
  163. elif test -f ${prefix}${pt#*-};then
  164. echo -e "\t$target_name/2-${prefix}${pt#*-}" \
  165. >> ../series.$sufix
  166. mv $pt "2-${prefix}${pt#*-}"
  167. else
  168. echo -e "\t$target_name/${prefix}${pt#*-}" \
  169. >> ../series.$sufix
  170. mv $pt ${prefix}${pt#*-}
  171. fi
  172. else
  173. rm $pt
  174. fi
  175. done
  176. )
  177. echo -e "\t\tGood patches: [$(cd $tmp_dir/$target_name; ls | wc -l)]"
  178. # Remove non-existent patches if they have been renamed or are no longer applied.
  179. $(cd $target
  180. for pt in ./*.patch
  181. do
  182. if test ! -f $tmp_dir/$target_name/$pt;then rm $pt;fi
  183. done
  184. )
  185. # Intelligent copying
  186. $(cd $tmp_dir/$target_name
  187. for pt in ./*.patch
  188. do
  189. ii_cp $pt $target/$pt
  190. done
  191. )
  192. cat $tmp_dir/series.$sufix >>${target_dir}/series.$sufix
  193. rm -f ${target_dir}/series.${sufix}.old
  194. fi
  195. rm -rf $tmp_dir
  196. else
  197. used_f
  198. fi
  199. }
  200. ########## start ##########
  201. counter=0
  202. #echo "cmd line = [$@]"
  203. mk_patch_series ${1} ${2} ${3} ${4} ${5} ${6}
  204. ###########
  205. exit
  206. ###########