smart-apply-patch.sh 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  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. # if all of the lines start with common/, hdfs/, or mapreduce/, this is
  48. # relative to the hadoop root instead of the subproject root, so we need
  49. # to chop off another layer
  50. PREFIX_DIRS=$(cut -d '/' -f 1 $TMP | sort | uniq)
  51. if [[ "$PREFIX_DIRS" =~ ^(hdfs|common|mapreduce)$ ]]; then
  52. echo Looks like this is relative to project root. Increasing PLEVEL
  53. PLEVEL=$[$PLEVEL + 1]
  54. elif ! echo "$PREFIX_DIRS" | grep -vxq 'common\|hdfs\|mapreduce' ; then
  55. echo Looks like this is a cross-subproject patch. Not supported!
  56. exit 1
  57. fi
  58. echo Going to apply patch with: $PATCH -p$PLEVEL
  59. $PATCH -p$PLEVEL -E < $PATCH_FILE
  60. cleanup 0