smart-apply-patch.sh 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. #!/usr/bin/env bash
  2. # Licensed under the Apache License, Version 2.0 (the "License");
  3. # you may not use this file except in compliance with the License.
  4. # You may obtain a copy of the License at
  5. #
  6. # http://www.apache.org/licenses/LICENSE-2.0
  7. #
  8. # Unless required by applicable law or agreed to in writing, software
  9. # distributed under the License is distributed on an "AS IS" BASIS,
  10. # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  11. # See the License for the specific language governing permissions and
  12. # limitations under the License.
  13. set -e
  14. PATCH_FILE=$1
  15. if [ -z "$PATCH_FILE" ]; then
  16. echo usage: $0 patch-file
  17. exit 1
  18. fi
  19. PATCH=${PATCH:-patch} # allow overriding patch binary
  20. # Cleanup handler for temporary files
  21. TOCLEAN=""
  22. cleanup() {
  23. rm $TOCLEAN
  24. exit $1
  25. }
  26. trap "cleanup 1" HUP INT QUIT TERM
  27. # Allow passing "-" for stdin patches
  28. if [ "$PATCH_FILE" == "-" ]; then
  29. PATCH_FILE=/tmp/tmp.in.$$
  30. cat /dev/fd/0 > $PATCH_FILE
  31. TOCLEAN="$TOCLEAN $PATCH_FILE"
  32. fi
  33. # Come up with a list of changed files into $TMP
  34. TMP=/tmp/tmp.paths.$$
  35. TOCLEAN="$TOCLEAN $TMP"
  36. grep '^+++\|^---' $PATCH_FILE | cut -c '5-' | grep -v /dev/null | sort | uniq > $TMP
  37. # Assume p0 to start
  38. PLEVEL=0
  39. # if all of the lines start with a/ or b/, then this is a git patch that
  40. # was generated without --no-prefix
  41. if ! grep -qv '^a/\|^b/' $TMP ; then
  42. echo Looks like this is a git patch. Stripping a/ and b/ prefixes
  43. echo and incrementing PLEVEL
  44. PLEVEL=$[$PLEVEL + 1]
  45. sed -i -e 's,^[ab]/,,' $TMP
  46. fi
  47. PREFIX_DIRS=$(cut -d '/' -f 1 $TMP | sort | uniq)
  48. # if we are at the project root then nothing more to do
  49. if [[ -d hadoop-common ]]; then
  50. echo Looks like this is being run at project root
  51. # if all of the lines start with hadoop-common/, hdfs/, or mapreduce/, this is
  52. # relative to the hadoop root instead of the subproject root, so we need
  53. # to chop off another layer
  54. elif [[ "$PREFIX_DIRS" =~ ^(hdfs|hadoop-common|mapreduce)$ ]]; then
  55. echo Looks like this is relative to project root. Increasing PLEVEL
  56. PLEVEL=$[$PLEVEL + 1]
  57. elif ! echo "$PREFIX_DIRS" | grep -vxq 'hadoop-common\|hdfs\|mapreduce' ; then
  58. echo Looks like this is a cross-subproject patch. Try applying from the project root
  59. exit 1
  60. fi
  61. echo Going to apply patch with: $PATCH -p$PLEVEL
  62. $PATCH -p$PLEVEL -E < $PATCH_FILE
  63. cleanup 0