doc_upgrade_git.sh 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. #!/bin/bash
  2. set -eu
  3. TARGET_INFO_FILE="$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. GIT_FROM=${FROM#$GIT_ROOT/}
  19. echo "$HEAD;$GIT_FROM" > $TARGET_INFO_FILE
  20. echo "Filled in $TARGET_INFO_FILE"
  21. exit
  22. fi
  23. TARGET_INFO_FILE="$(realpath $TARGET_INFO_FILE)"
  24. IFS=';' read -r BASE_REV GIT_FROM < "$TARGET_INFO_FILE"
  25. TO=$(dirname $(realpath "$TARGET_INFO_FILE"))
  26. HEAD_REV=$(cd $TO; git rev-parse HEAD)
  27. GIT_ROOT=$(cd $TO; git rev-parse --show-toplevel)
  28. FROM="$GIT_ROOT/$GIT_FROM"
  29. GIT_TO=${TO#$GIT_ROOT/}
  30. DATETIME=$(date '+%Y-%m-%d-%H-%M-%S')
  31. echo "Base revision: $BASE_REV"
  32. echo "Head revision: $HEAD_REV"
  33. echo "Git root: $GIT_ROOT"
  34. echo "Source: $GIT_FROM"
  35. echo "Target: $GIT_TO"
  36. if [ "$(cd $TO; git status -s -u | wc -l)" != "0" ]; then
  37. echo "Target $TO has uncommited changes" >&2
  38. exit
  39. fi
  40. cd $GIT_ROOT
  41. PATCH_FILE=$(mktemp)
  42. EXPORT_DIR=$(mktemp -d)
  43. echo "Use $EXPORT_DIR export dir"
  44. git clone --no-hardlinks "$GIT_ROOT/.git" "$EXPORT_DIR"
  45. (cd $EXPORT_DIR; git reset --hard $BASE_REV)
  46. rsync -r --delete --filter='. -' "$EXPORT_DIR/$GIT_FROM/" "$TO" << EOF
  47. + /*/
  48. + *.md
  49. + toc_*.yaml
  50. - /*
  51. EOF
  52. rm -rf "$EXPORT_DIR" || true
  53. git add -A $GIT_TO
  54. git diff --cached --binary -R --relative=$GIT_TO > $PATCH_FILE
  55. git reset --hard
  56. git clean -d -f
  57. git status
  58. rsync -r --delete --filter='. -' "$FROM/" "$TO" << EOF
  59. + /*/
  60. + *.md
  61. + toc_*.yaml
  62. P _assets/*
  63. - /*
  64. EOF
  65. patch -d "$TO" -p1 -N -E --no-backup-if-mismatch --merge -i $PATCH_FILE -t || echo "Patch has conflicts. Consider to review them before commit"
  66. if [ "$(cd $TO; git status -s -u | wc -l)" != "0" ]; then
  67. echo "$HEAD_REV;$GIT_FROM" > $TARGET_INFO_FILE
  68. else
  69. echo "Nothing changed"
  70. fi
  71. if [ -v KEEP_PATCH ]; then
  72. mv "$PATCH_FILE" "$TO/$DATETIME.patch"
  73. else
  74. rm "$PATCH_FILE"
  75. fi