doc_upgrade_arc.sh 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  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 1
  9. fi
  10. if [ ! -d "$2" ]; then
  11. echo "Expected $2 to be a directory" >&2
  12. exit 1
  13. fi
  14. FROM=$(realpath $2)
  15. ARC_ROOT=$(cd $FROM; arc root)
  16. HEAD=$(cd $FROM; arc rev-parse HEAD)
  17. # Normalize FROM relativly to the arc root
  18. ARC_FROM=${FROM#$ARC_ROOT/}
  19. echo "$HEAD;$ARC_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 ARC_FROM < "$TARGET_INFO_FILE"
  25. TO=$(dirname $(realpath "$TARGET_INFO_FILE"))
  26. HEAD_REV=$(cd $TO; arc rev-parse HEAD)
  27. ARC_ROOT=$(cd $TO; arc root)
  28. FROM="$ARC_ROOT/$ARC_FROM"
  29. ARC_TO=${TO#$ARC_ROOT/}
  30. DATETIME=$(date '+%Y-%m-%d-%H-%M-%S')
  31. echo "Base revision: $BASE_REV"
  32. echo "Head revision: $HEAD_REV"
  33. echo "Arc root: $ARC_ROOT"
  34. echo "Source: $ARC_FROM"
  35. echo "Target: $ARC_TO"
  36. if [ "$(cd $TO; arc status -s -u all | wc -l)" != "0" ]; then
  37. echo "Target $TO has uncommited changes" >&2
  38. exit
  39. fi
  40. cd $ARC_ROOT
  41. PATCH_FILE=$(mktemp)
  42. EXPORT_DIR=$(mktemp -d)
  43. echo "Use $EXPORT_DIR export dir"
  44. arc export $BASE_REV "$ARC_FROM" --to "$EXPORT_DIR"
  45. rsync -r --delete --filter='. -' "$EXPORT_DIR/$ARC_FROM/" "$TO" << EOF
  46. + /*/
  47. + *.md
  48. + toc_*.yaml
  49. - /*
  50. EOF
  51. rm -rf "$EXPORT_DIR" || true
  52. arc add -A $ARC_TO
  53. arc diff --cached --reverse --relative=$ARC_TO > $PATCH_FILE
  54. arc reset --hard
  55. arc clean -d
  56. arc status
  57. rsync -r --delete --filter='. -' "$FROM/" "$TO" << EOF
  58. + /*/
  59. + *.md
  60. + toc_*.yaml
  61. P _assets/*
  62. - /*
  63. EOF
  64. patch -d "$TO" -p0 -N -E --no-backup-if-mismatch --merge -i $PATCH_FILE -t || echo "Patch has conflicts. Consider to review them before commit"
  65. if [ "$(cd $TO; arc status -s -u all | wc -l)" != "0" ]; then
  66. echo "$HEAD_REV;$ARC_FROM" > $TARGET_INFO_FILE
  67. else
  68. echo "Nothing changed"
  69. fi
  70. if [ -v KEEP_PATCH ]; then
  71. mv "$PATCH_FILE" "$TO/$DATETIME.patch"
  72. else
  73. rm "$PATCH_FILE"
  74. fi