Vous ne pouvez pas sélectionner plus de 25 sujets Les noms de sujets doivent commencer par une lettre ou un nombre, peuvent contenir des tirets ('-') et peuvent comporter jusqu'à 35 caractères.

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151
  1. #!/bin/bash
  2. FROM=7.0
  3. TO=7.1
  4. FROM_HEAD=origin/$FROM
  5. PUSH="origin HEAD:refs/for/$TO"
  6. show() {
  7. sCommit=$1
  8. if [ "$sCommit" == "" ]
  9. then
  10. echo "show() missing commit id"
  11. exit 1
  12. fi
  13. git show -s $sCommit
  14. }
  15. merge() {
  16. mCommit=$1
  17. if [ "$mCommit" == "" ]
  18. then
  19. echo "merge() missing commit id"
  20. exit 1
  21. fi
  22. # echo "merge($mCommit)"
  23. git merge -m "Should be overwritten by merge script" $mCommit $2
  24. if [ "$?" != "0" ]
  25. then
  26. echo "Merge failed for commit $mCommit"
  27. echo "Manual merge is needed"
  28. exit 2
  29. fi
  30. # Add a change id using git hook
  31. git commit --amend --no-edit
  32. }
  33. pushMerged() {
  34. # echo "pushMerged()"
  35. git push $PUSH
  36. if [ "$?" != "0" ]
  37. then
  38. echo "Push failed!"
  39. exit 2
  40. fi
  41. }
  42. maybe_commit_and_push() {
  43. # echo "maybe_commit_and_push()"
  44. cpCommit=$1
  45. if [ "$cpCommit" == "" ]
  46. then
  47. # Nothing to merge currently
  48. return
  49. fi
  50. cpCommitMsg=$2
  51. if [ "$cpCommitMsg" == "" ]
  52. then
  53. echo "Internal error, no commit message passed to maybe_commit_and_push()"
  54. exit 1;
  55. fi
  56. # echo "maybe_commit_and_push: Merging $cpCommit"
  57. merge $cpCommit
  58. echo -e "Merge changes from $FROM_HEAD\n\n$cpCommitMsg"|git commit --amend -F -
  59. pushMerged
  60. }
  61. can_merge() {
  62. commit=$1
  63. git merge --no-commit --no-ff $commit > /dev/null 2>&1
  64. result=$?
  65. git reset --hard HEAD > /dev/null 2>&1
  66. return $result
  67. }
  68. nothingToCommit=`git status | grep "nothing to commit"`
  69. if [ "$nothingToCommit" == "" ]
  70. then
  71. git status
  72. echo "Can not merge when there are unstaged changes."
  73. exit 1;
  74. fi
  75. git checkout $TO
  76. git fetch
  77. pending=`git log $TO..$FROM_HEAD --reverse|grep "^commit "|sed "s/commit //"`
  78. pendingCommit=
  79. pendingCommitMessage=
  80. for commit in $pending
  81. do
  82. echo "Checking $commit..."
  83. mergeDirective=`git log -n 1 --format=%B $commit|grep "^Merge:"|sed "s/Merge: //"`
  84. commitMsg=`git log -n 1 --format=oneline --abbrev-commit $commit`
  85. if [ "$mergeDirective" == "" ]
  86. then
  87. if can_merge $commit
  88. then
  89. pendingCommit=$commit
  90. pendingCommitMessage=$pendingCommitMessage"$commitMsg\n"
  91. echo pendingCommitMessage: $pendingCommitMessage
  92. else
  93. maybe_commit_and_push $pendingCommit "$pendingCommitMessage"
  94. pendingCommit=
  95. pendingCommitMessage=
  96. echo
  97. echo "Stopping merge because $commit because of merge conflicts"
  98. echo "The following commit must be manually merged."
  99. show $commit
  100. exit 3
  101. fi
  102. elif [ "$mergeDirective" == "no" ]
  103. then
  104. maybe_commit_and_push $pendingCommit "$pendingCommitMessage"
  105. pendingCommit=
  106. pendingCommitMessage=
  107. echo
  108. echo "Doing a no-op merge because of Merge: no for $commit"
  109. git log -n 1 --format=%B $commit
  110. echo
  111. # Do a no-op merge
  112. git merge $commit -s ours
  113. echo -e "No-op merge from $FROM_HEAD\n\n$commitMsg"|git commit --amend -F -
  114. pushMerged
  115. elif [ "$mergeDirective" == "manual" ]
  116. then
  117. maybe_commit_and_push $pendingCommit "$pendingCommitMessage"
  118. pendingCommit=
  119. pendingCommitMessage=
  120. echo
  121. echo "Stopping merge at $commit (merge: manual)"
  122. echo "The following commit must be manually merged."
  123. show $commit
  124. exit 3
  125. else
  126. maybe_commit_and_push $pendingCommit "$pendingCommitMessage"
  127. pendingCommit=
  128. pendingCommitMessage=
  129. echo
  130. echo "Commit $commit contains an unknown merge directive, Merge: $mergeDirective"
  131. echo "Stopping merge."
  132. show $commit
  133. exit 3
  134. fi
  135. done
  136. # Push any pending merges
  137. maybe_commit_and_push $pendingCommit "$pendingCommitMessage"