push.bash 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. #!/usr/bin/env bash
  2. usage='usage: push.bash [<options>] [--] <dest>
  3. Options:
  4. --dir <dir> Specify subdirectory under destination.
  5. Defaults to "v<version>".
  6. --version <ver> CMake <major>.<minor> version number to push.
  7. Defaults to version of source tree.
  8. '
  9. die() {
  10. echo "$@" 1>&2; exit 1
  11. }
  12. cmake_source_dir="${BASH_SOURCE%/*}/../.."
  13. cmake_version_component()
  14. {
  15. sed -n "
  16. /^set(CMake_VERSION_${1}/ {s/set(CMake_VERSION_${1} *\([0-9]*\))/\1/;p;}
  17. " "${cmake_source_dir}/Source/CMakeVersion.cmake"
  18. }
  19. version=''
  20. dir=''
  21. while test "$#" != 0; do
  22. case "$1" in
  23. --dir) shift; dir="$1" ;;
  24. --version) shift; version="$1" ;;
  25. --) shift ; break ;;
  26. -*) die "$usage" ;;
  27. *) break ;;
  28. esac
  29. shift
  30. done
  31. test "$#" = 1 || die "$usage"
  32. readonly dest="$1"
  33. if test -z "$version"; then
  34. cmake_version_major="$(cmake_version_component MAJOR)"
  35. cmake_version_minor="$(cmake_version_component MINOR)"
  36. version="${cmake_version_major}.${cmake_version_minor}"
  37. fi
  38. readonly version
  39. if test -z "$dir"; then
  40. dir="v${version}"
  41. fi
  42. readonly dir
  43. if ! test -d "${dest}/${dir}"; then
  44. mkdir "${dest}/${dir}"
  45. fi
  46. for f in cmake-${version}*; do
  47. if ! test -f "${f}"; then
  48. continue
  49. fi
  50. echo "pushing '${f}'"
  51. # Make a copy with a new timestamp and atomically rename into place.
  52. tf="${dest}/${dir}/.tmp.${f}"
  53. df="${dest}/${dir}/${f}"
  54. cp "${f}" "${tf}"
  55. mv "${tf}" "${df}"
  56. # Pause to give each file a distinct time stamp even with 1s resolution
  57. # so that sorting by time also sorts alphabetically.
  58. sleep 1.1
  59. done