You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

113 lines
2.0 KiB

  1. #!/bin/bash
  2. #
  3. # Author: Julian Ospald <hasufell@posteo.de>
  4. # Version: 0.0.1
  5. # Date: 2018-06-08
  6. # Reason: automate digest generation
  7. #
  8. # This pre-commit hook generates digests for all packages
  9. # that have been changed and possibly adds the Manifests to the index.
  10. #
  11. # For non-interactive mode set "DIGEST_NONINTERACTIVE=y".
  12. #
  13. die() {
  14. echo "$@" 1>&2
  15. exit 1
  16. }
  17. edo() {
  18. echo "$@" 1>&2
  19. "$@" || exit 1
  20. }
  21. # all staged files
  22. file_names=( )
  23. # all touched packages (${CATEGORY}/${PN})
  24. pkgs=( )
  25. # all packages that we generated digest for
  26. pkg_digs=( )
  27. # set file_names
  28. while IFS= read -r -d '' f; do
  29. file_names+=( "${f}" )
  30. done < <(git diff --cached --name-only -z HEAD)
  31. unset f IFS
  32. # exit early
  33. if [[ -z ${file_names[@]} ]] ; then
  34. exit 0
  35. fi
  36. # name of the repository
  37. repo_name="$(cat $(git rev-parse --show-toplevel)/profiles/repo_name)"
  38. if [[ -z ${repo_name} ]] ; then
  39. die "no repository name!"
  40. fi
  41. # set pkgs
  42. for f in "${file_names[@]}" ; do
  43. ext="${f##*.}"
  44. if [[ ${ext} =~ exheres-[0-9]+ ]] ; then
  45. pkg=${f#packages/}
  46. pkg=${pkg%/*}
  47. pkgs+=( "${pkg}" )
  48. fi
  49. done
  50. unset ext pkg f
  51. # sort array
  52. IFS=$'\n' pkgs=( $(sort -u <<<"${pkgs[*]}") )
  53. unset IFS
  54. # Allows us to read user input below, assigns stdin to keyboard
  55. if [[ -z ${DIGEST_NONINTERACTIVE} ]] ; then
  56. exec < /dev/tty
  57. fi
  58. # call digest
  59. for pkg in "${pkgs[@]}" ; do
  60. if [[ -n ${DIGEST_NONINTERACTIVE} ]] ; then
  61. edo ${CAVE:-cave} digest ${pkg} ${repo_name}
  62. pkg_digs+=( "${pkg}" )
  63. else
  64. read -p "Generate digest for ${pkg}? " -n 1 -r
  65. echo
  66. if [[ $REPLY =~ ^[Yy]$ ]]
  67. then
  68. edo ${CAVE:-cave} digest ${pkg} ${repo_name}
  69. pkg_digs+=( "${pkg}" )
  70. fi
  71. fi
  72. done
  73. unset pkg
  74. # stage Manifests
  75. for pkg_dig in "${pkg_digs[@]}" ; do
  76. if [[ -n ${DIGEST_NONINTERACTIVE} ]] ; then
  77. edo git add -- packages/${pkg_dig}/Manifest
  78. else
  79. read -p "Add packages/${pkg_dig}/Manifest to commit? " -n 1 -r
  80. echo
  81. if [[ $REPLY =~ ^[Yy]$ ]]
  82. then
  83. edo git add -- packages/${pkg_dig}/Manifest
  84. fi
  85. fi
  86. done
  87. unset pkg_dig
  88. # close STDIN
  89. if [[ -z ${DIGEST_NONINTERACTIVE} ]] ; then
  90. exec <&-
  91. fi