diff --git a/build-tools/branching/create_branches_and_tags.sh b/build-tools/branching/create_branches_and_tags.sh index 27c820c4..09407368 100755 --- a/build-tools/branching/create_branches_and_tags.sh +++ b/build-tools/branching/create_branches_and_tags.sh @@ -38,7 +38,7 @@ usage () { echo "If lockdown is requested, all other projects get the current" echo "HEAD's sha set as the revision." echo "If default-revision is selected, then the manifest default revision" - wcho "will be set." + echo "will be set." echo "" echo "If a gitreview-default is selected, then all branched projects" echo "with a .gitreview file will have a defaultbranch entry added" diff --git a/build-tools/branching/create_tags.sh b/build-tools/branching/create_tags.sh index 0716ae65..99281c65 100755 --- a/build-tools/branching/create_tags.sh +++ b/build-tools/branching/create_tags.sh @@ -23,7 +23,7 @@ CREATE_TAGS_SH_DIR="$(dirname "$(readlink -f "${BASH_SOURCE[0]}" )" )" source "${CREATE_TAGS_SH_DIR}/../git-repo-utils.sh" usage () { - echo "create_tags.sh --tag= [ --remotes= ] [ --projects= ] [ --manifest [ --manifest-prefix ] [ --lock-down ]]" + echo "create_tags.sh --tag= [ --remotes= ] [ --projects= ] [ --manifest [ --manifest-prefix ] [ --lock-down | --soft-lock-down ] [ --default-revision ]]" echo " " echo "Create a git tag in all listed projects, and all projects" echo "hosted by all listed remotes. Lists are comma separated." @@ -32,9 +32,11 @@ usage () { echo "it will specify the tag as the revision for all tagged projects." echo "If lockdown is requested, all non-tagged projects get the current" echo "HEAD's sha set as the revision." + echo "If default-revision is selected, then the manifest default revision" + echo "will be set." } -TEMP=$(getopt -o h --long remotes:,projects:,tag:,manifest,manifest-prefix:,lock-down,help -n 'create_tags.sh' -- "$@") +TEMP=$(getopt -o h --long remotes:,projects:,tag:,manifest,manifest-prefix:,lock-down,hard-lock-down,soft-lock-down,default-revision,help -n 'create_tags.sh' -- "$@") if [ $? -ne 0 ]; then usage exit 1 @@ -44,6 +46,7 @@ eval set -- "$TEMP" HELP=0 MANIFEST=0 LOCK_DOWN=0 +SET_DEFAULT_REVISION=0 remotes="" projects="" tag="" @@ -54,15 +57,18 @@ repo_root_dir="" while true ; do case "$1" in - -h|--help) HELP=1 ; shift ;; - --remotes) remotes+=$(echo "$2 " | tr ',' ' '); shift 2;; - --projects) projects+=$(echo "$2 " | tr ',' ' '); shift 2;; - --tag) tag=$2; shift 2;; - --manifest) MANIFEST=1 ; shift ;; - --manifest-prefix) manifest_prefix=$2; shift 2;; - --lock-down) LOCK_DOWN=1 ; shift ;; - --) shift ; break ;; - *) usage; exit 1 ;; + -h|--help) HELP=1 ; shift ;; + --remotes) remotes+=$(echo "$2 " | tr ',' ' '); shift 2;; + --projects) projects+=$(echo "$2 " | tr ',' ' '); shift 2;; + --tag) tag=$2; shift 2;; + --manifest) MANIFEST=1 ; shift ;; + --manifest-prefix) manifest_prefix=$2; shift 2;; + --lock-down) LOCK_DOWN=2 ; shift ;; + --hard-lock-down) LOCK_DOWN=2 ; shift ;; + --soft-lock-down) LOCK_DOWN=1 ; shift ;; + --default-revision) SET_DEFAULT_REVISION=1 ; shift ;; + --) shift ; break ;; + *) usage; exit 1 ;; esac done @@ -218,7 +224,7 @@ if [ $MANIFEST -eq 1 ]; then fi echo "Creating manifest ${new_manifest_name}" - manifest_set_revision "${manifest}" "${new_manifest}" "refs/tags/$tag" ${LOCK_DOWN} $projects || exit 1 + manifest_set_revision "${manifest}" "${new_manifest}" "refs/tags/$tag" ${LOCK_DOWN} ${SET_DEFAULT_REVISION} $projects || exit 1 echo "Committing ${new_manifest_name} in ${new_manifest_dir}" git add ${new_manifest_name} || exit 1 diff --git a/build-tools/branching/push_branches_tags.sh b/build-tools/branching/push_branches_tags.sh index baa73bb6..e570ac42 100755 --- a/build-tools/branching/push_branches_tags.sh +++ b/build-tools/branching/push_branches_tags.sh @@ -20,7 +20,7 @@ source "${PUSH_BRANCHES_TAGS_SH_DIR}/../git-repo-utils.sh" source "${PUSH_BRANCHES_TAGS_SH_DIR}/../url_utils.sh" usage () { - echo "push_branches_tags.sh --branch= [--tag=] [ --remotes= ] [ --projects= ] [ --manifest ]" + echo "push_branches_tags.sh --branch= [--tag=] [ --remotes= ] [ --projects= ] [ --manifest ] [ --bypass-gerrit ]" echo "" echo "Push a pre-existing branch and tag into all listed projects, and all" echo "projects hosted by all listed remotes. Lists are comma separated." @@ -32,7 +32,7 @@ usage () { echo "A manifest push can also be requested.vision." } -TEMP=$(getopt -o h --long remotes:,projects:,branch:,tag:,manifest,help -n 'push_branches_tags.sh' -- "$@") +TEMP=$(getopt -o h --long remotes:,projects:,branch:,tag:,bypass-gerrit,manifest,help -n 'push_branches_tags.sh' -- "$@") if [ $? -ne 0 ]; then usage exit 1 @@ -41,6 +41,7 @@ eval set -- "$TEMP" HELP=0 MANIFEST=0 +BYPASS_GERRIT=0 remotes="" projects="" branch="" @@ -51,6 +52,7 @@ repo_root_dir="" while true ; do case "$1" in -h|--help) HELP=1 ; shift ;; + --bypass-gerrit) BYPASS_GERRIT=1 ; shift ;; --remotes) remotes+=$(echo "$2 " | tr ',' ' '); shift 2;; --projects) projects+=$(echo "$2 " | tr ',' ' '); shift 2;; --branch) branch=$2; shift 2;; @@ -196,7 +198,7 @@ for subgit in $SUBGITS; do fi echo "Pushing branch $branch in ${subgit}" - if [ "${review_method}" == "gerrit" ]; then + if [ "${review_method}" == "gerrit" ] && [ $BYPASS_GERRIT -eq 0 ]; then url=$(git_repo_review_url) if [ "${review_remote}" == "" ]; then echo_stderr "ERROR: Failed to determine review_url in ${subgit}" @@ -212,8 +214,8 @@ for subgit in $SUBGITS; do git config --local --replace-all "branch.${branch}.merge" refs/heads/${branch} && \ git review --topic="${branch}" else - echo "git push --tags ${remote} ${branch}" - git push --tags ${remote} ${branch} + echo "git push --tags ${review_remote} ${branch}" + git push --tags ${review_remote} ${branch} fi else echo "git push --tags --set-upstream ${remote} ${branch}" @@ -276,7 +278,7 @@ if [ $MANIFEST -eq 1 ]; then fi echo "Pushing branch $branch in ${manifest_dir}" - if [ "${review_method}" == "gerrit" ]; then + if [ "${review_method}" == "gerrit" ] && [ $BYPASS_GERRIT -eq 0 ]; then # Is a reviewless push possible as part of creating a new branch in gerrit? url=$(git_review_url) if [ "${review_remote}" == "" ]; then diff --git a/build-tools/branching/push_tags.sh b/build-tools/branching/push_tags.sh index ef4edd90..3ed6aae0 100755 --- a/build-tools/branching/push_tags.sh +++ b/build-tools/branching/push_tags.sh @@ -19,7 +19,7 @@ PUSH_TAGS_SH_DIR="$(dirname "$(readlink -f "${BASH_SOURCE[0]}" )" )" source "${PUSH_TAGS_SH_DIR}/../git-repo-utils.sh" usage () { - echo "push_tags.sh --tag= [ --remotes= ] [ --projects= ] [ --manifest [--manifest-prefix ]]" + echo "push_tags.sh --tag= [ --remotes= ] [ --projects= ] [ --manifest [--manifest-prefix ]] [ --bypass-gerrit ]" echo " " echo "Push a pre-existing git tag into all listed projects, and all projects" echo "hosted by all listed remotes. Lists are comma separated." @@ -27,7 +27,7 @@ usage () { echo "A manifest push can also be requested." } -TEMP=$(getopt -o h --long remotes:,projects:,tag:,manifest,manifest-prefix:,help -n 'push_tags.sh' -- "$@") +TEMP=$(getopt -o h --long remotes:,projects:,tag:,manifest,manifest-prefix:,bypass-gerrit,help -n 'push_tags.sh' -- "$@") if [ $? -ne 0 ]; then usage exit 1 @@ -36,6 +36,7 @@ eval set -- "$TEMP" HELP=0 MANIFEST=0 +BYPASS_GERRIT=0 remotes="" projects="" tag="" @@ -47,6 +48,7 @@ repo_root_dir="" while true ; do case "$1" in -h|--help) HELP=1 ; shift ;; + --bypass-gerrit) BYPASS_GERRIT=1 ; shift ;; --remotes) remotes+=$(echo "$2 " | tr ',' ' '); shift 2;; --projects) projects+=$(echo "$2 " | tr ',' ' '); shift 2;; --tag) tag=$2; shift 2;; @@ -145,21 +147,27 @@ for subgit in $SUBGITS; do exit 1 fi - if [ "${review_method}" == "gerrit" ]; then - remote=$(git_repo_review_remote) - else - remote=$(git_repo_remote) - fi - + remote=$(git_repo_review_remote) if [ "${remote}" == "" ]; then echo_stderr "ERROR: Failed to determine remote in ${subgit}" exit 1 fi - echo "Pushing tag $tag in ${subgit}" if [ "${review_method}" == "gerrit" ]; then - echo "git push ${remote} ${tag}" - git push ${remote} ${tag} + review_remote=$(git_repo_review_remote) + else + review_remote=${remote} + fi + + if [ "${review_remote}" == "" ]; then + echo_stderr "ERROR: Failed to determine review_remote in ${subgit}" + exit 1 + fi + + echo "Pushing tag $tag in ${subgit}" + if [ "${review_method}" == "gerrit" ] && [ $BYPASS_GERRIT -eq 0 ]; then + echo "git push ${review_remote} ${tag}" + git push ${review_remote} ${tag} else echo "git push ${remote} ${tag}" git push ${remote} ${tag} @@ -209,14 +217,20 @@ if [ $MANIFEST -eq 1 ]; then exit 1 fi - remote=$(git_review_remote) + remote=$(git_remote) if [ "${remote}" == "" ]; then echo_stderr "ERROR: Failed to determine remote in ${new_manifest_dir}" exit 1 fi + review_remote=$(git_review_remote) + if [ "${review_remote}" == "" ]; then + echo_stderr "ERROR: Failed to determine review remote in ${new_manifest_dir}" + exit 1 + fi + echo "Pushing tag $tag in ${new_manifest_dir}" - if [ "${review_method}" == "gerrit" ]; then + if [ "${review_method}" == "gerrit" ] && [ $BYPASS_GERRIT -eq 0 ]; then git review if [ $? != 0 ] ; then echo_stderr "ERROR: Failed to create git review from ${new_manifest_dir}" @@ -224,7 +238,7 @@ if [ $MANIFEST -eq 1 ]; then fi echo "When review is merged: please run ..." echo " cd ${new_manifest_dir}" - echo " git push ${remote} ${tag}" + echo " git push ${review_remote} ${tag}" else git push ${remote} ${local_branch}:${remote_branch} git push ${remote} ${tag}:${tag} diff --git a/build-tools/git-utils.sh b/build-tools/git-utils.sh index d6c65261..be21b91a 100755 --- a/build-tools/git-utils.sh +++ b/build-tools/git-utils.sh @@ -397,12 +397,41 @@ git_test_context () { git_local_branch () { local result="" + local sha="" + + # Older gits don't support this + result=$(git branch --show-current 2> /dev/null) + if [ "$result" != "" ]; then + echo $result + return 0 + fi + + # Might not work if detached and there are local commits + result=$(git branch | grep '^[*] ' | cut -b 3- | grep -v HEAD) + if [ "$result" != "" ]; then + echo $result + return 0 + fi + + # Find 'nearest' local branch that we detached from and/or added commits to + sha=$(git rev-parse HEAD) + while [ $? -eq 0 ]; do + result=$(git show-ref --head | grep -e "$sha refs/heads/" | sed "s#$sha refs/heads/##" | head -n 1) + if [ "$result" != "" ]; then + echo $result + return 0 + fi + + sha=$(git rev-parse $sha^ 2> /dev/null) + done + + # This used to work on older git versions result=$(git name-rev --name-only HEAD) if [ "$result" == "" ] || [ "$result" == "undefined" ]; then return 1 fi - # handle the case where a tag is returned by looking at the parent. + # Handle the case where a tag is returned by looking at the parent. # This weird case when a local commit is tagged and we were in # detached head state, or on 'default' branch. while git_is_tag $result; do