doc_upgrade_git.sh 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. #!/bin/bash
  2. set -eux
  3. TARGET_INFO_FILE="$(realpath $1)"
  4. if [ ! -f $TARGET_INFO_FILE ]; then
  5. echo "File $TARGET_INFO_FILE doesn't exist. Creating new one"
  6. if [ "$2" == "" ]; then
  7. echo "Expected source folder as the second argument" >&2
  8. exit
  9. fi
  10. if [ ! -d "$2" ]; then
  11. echo "Expected $2 to be a directory" >&2
  12. exit
  13. fi
  14. FROM=$(realpath $2)
  15. GIT_ROOT=$(cd $FROM; git rev-parse --show-toplevel)
  16. HEAD=$(cd $FROM; git rev-parse HEAD)
  17. # Normalize FROM relativly to the git root
  18. FROM=${FROM#$GIT_ROOT/}
  19. echo "$HEAD;$FROM" > $TARGET_INFO_FILE
  20. echo "Filled in $TARGET_INFO_FILE"
  21. exit
  22. fi
  23. IFS=';' read -r BASE_REV INFO_FROM < "$TARGET_INFO_FILE"
  24. TO=$(dirname $(realpath "$TARGET_INFO_FILE"))
  25. HEAD_REV=$(cd $TO; git rev-parse HEAD)
  26. GIT_ROOT=$(cd $TO; git rev-parse --show-toplevel)
  27. FROM="$GIT_ROOT/$INFO_FROM"
  28. echo "Base revision: $BASE_REV"
  29. echo "Head revision: $HEAD_REV"
  30. echo "Git root: $GIT_ROOT"
  31. echo "Source: $FROM"
  32. echo "Target: $TO"
  33. if [ "$(cd $TO; git status -s -u | wc -l)" != "0" ]; then
  34. echo "Target $TO has uncommited changes" >&2
  35. exit
  36. fi
  37. cd $GIT_ROOT
  38. CURRENT_BRANCH=$(git branch --show-current)
  39. PATCH_FILE=$(mktemp)
  40. BRANCH=upgrade-$(date '+%Y-%m-%d-%H-%M-%S')
  41. clean_up () {
  42. ARG=$?
  43. echo "Deleting patch file"
  44. rm $PATCH_FILE
  45. exit $ARG
  46. }
  47. trap clean_up EXIT
  48. echo "Use $BRANCH temporary branch, $PATCH_FILE patch file"
  49. git checkout -b $BRANCH $BASE_REV
  50. rsync -r --delete --filter='. -' -v $TO/ $FROM << EOF
  51. + /*/
  52. + *.md
  53. + toc_*.yaml
  54. - /*
  55. EOF
  56. git add -A $INFO_FROM
  57. git diff --cached --binary --relative=$INFO_FROM > $PATCH_FILE
  58. git reset --hard
  59. git clean -d -f
  60. git status
  61. git checkout "$CURRENT_BRANCH"
  62. git branch -D $BRANCH
  63. rsync -r --delete --filter='. -' -v $FROM/ $TO << EOF
  64. + /*/
  65. + *.md
  66. + toc_*.yaml
  67. - /*
  68. EOF
  69. patch -d $TO -p1 -N -E --no-backup-if-mismatch --merge -i $PATCH_FILE -t
  70. #git apply --whitespace=nowarn --directory=$TO --reject $PATCH_FILE
  71. echo "$HEAD_REV;$INFO_FROM" > $TARGET_INFO_FILE