diff --git a/aosp-merger/README.md b/aosp-merger/README.md new file mode 100644 index 0000000..8ec1e08 --- /dev/null +++ b/aosp-merger/README.md @@ -0,0 +1,33 @@ +# Rough workflow + +1. Snapshot the names of your current working branches to `branches.list` file: + + ./lineage/scripts/aosp-merge/branches_save.sh + +2. Note current aosp tag in `.repo/manifests/default.xml`, update it to desired new tag and then create a local commit for the change (aosp-merge script checks for any uncommitted changes in the `.repo/manifests` git repo). +3. Create a staging branch and merge in the new AOSP tag: + + ./lineage/scripts/aosp-merge/aosp-merge.sh merge \ \ + (where oldaosptag is the original AOSP tag that was in `.repo/manifests/default.xml`) + * Example invocation: + + ./lineage/scripts/aosp-merge/aosp-merge.sh merge android-8.0.0_r3 android-8.0.0_r30 + +4. Every project in your tree should now be one of: + * \ if the project was tracking AOSP + * a staging branch if the project was a LineageOS fork from AOSP (check `merged_repos.txt` for status and whether there are conflicts to resolve) + * the default repo lineage branch for `.repo/manifests/snippets.xml` projects +5. Restore your local branches and merge in the staging branch: + + ./lineage/scripts/aosp-merge/branches_rebase.sh \ + * Example invocation: + + ./lineage/scripts/aosp-merge/branches_rebase.sh staging/lineage-15.0_merge-android-8.0.0_r30 +6. Build, install, boot, verify, etc. + +# TODO + +* Make it work for rebase (I'm sure it'll need fixups). +* Create squashed gerrits for each merge. +* Abandon squashed gerrits and push each merge automatically. +* DONE. Instead of merging the staging branch into your local branch (if you have one), create a new branch for the local+staging merge. diff --git a/aosp-merger/aosp-merger.sh b/aosp-merger/aosp-merger.sh new file mode 100755 index 0000000..1542ae7 --- /dev/null +++ b/aosp-merger/aosp-merger.sh @@ -0,0 +1,124 @@ +#!/bin/bash +# +# Copyright (C) 2017 The LineageOS Project +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +usage() { + echo "Usage ${0} " +} + +# Verify argument count +if [ "$#" -ne 3 ]; then + usage + exit 1 +fi + +OPERATION="${1}" +OLDTAG="${2}" +NEWTAG="${3}" + +if [ "${OPERATION}" != "merge" -a "${OPERATION}" != "rebase" ]; then + usage + exit 1 +fi + +# Check to make sure this is being run from the top level repo dir +if [ ! -e "build/envsetup.sh" ]; then + echo "Must be run from the top level repo dir" + exit 1 +fi + +# Source build environment (needed for aospremote) +. build/envsetup.sh + +TOP="${ANDROID_BUILD_TOP}" +MERGEDREPOS="${TOP}/merged_repos.txt" +MANIFEST="${TOP}/.repo/manifest.xml" +BRANCH=$(grep "default revision" "${MANIFEST}" \ + | sed 's/^ *//g;s/" + exit 1 +fi +REBASEONTO="${1}" + +TOP="${PWD}" +BRANCHLIST="${TOP}/branches.list" + +cat "${BRANCHLIST}" | while read l; do + set ${l} + PROJECTPATH="${1}" + BRANCH="${2}" + NEWBRANCH="${2}-rebase" + cd "${TOP}/${PROJECTPATH}" + + # Sanity check + [[ -n "$(git status --porcelain)" ]]; then + echo -n "!!!! Project ${PROJECTPATH} has uncommitted files, " + echo "not switching to branch ${BRANCH} (skipping) !!!!" + continue + fi + + # Check the $REBASEONTO branch actually exists + git show-ref "refs/heads/${REBASEONTO}" >/dev/null + if [ "$?" -ne 0 ]; then + # Nope + echo -n "#### Project ${PROJECTPATH} branch ${REBASEONTO} does not exist, " + echo "switching to ${BRANCH} instead ####" + git checkout "${BRANCH}" + else + echo "#### Creating ${PROJECTPATH} branch ${NEWBRANCH} from ${BRANCH} ####" + repo abandon "${NEWBRANCH}" . + repo start "${NEWBRANCH}" . + git reset --hard "${BRANCH}" + echo -n "#### Project ${PROJECTPATH} Rebasing branch ${NEWBRANCH} " + echo "on top of ${REBASEONTO} ####" + git rebase --onto "${REBASEONTO}" + fi +done diff --git a/aosp-merger/branches_restore.sh b/aosp-merger/branches_restore.sh new file mode 100755 index 0000000..c10d626 --- /dev/null +++ b/aosp-merger/branches_restore.sh @@ -0,0 +1,48 @@ +#!/bin/bash +# +# Copyright (C) 2017 The LineageOS Project +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +if [ ! -e "build/envsetup.sh" ]; then + echo "Must run from root of repo" + exit 1 +fi + +TOP="${PWD}" +BRANCHLIST="${TOP}/branches.list" + +cat "${BRANCHLIST}" | while read l; do + set ${l} + PROJECTPATH="${1}" + BRANCH="${2}" + cd "${TOP}/${PROJECTPATH}" + + # Check if we're on this branch already + CURBRANCH=$(git status -b --porcelain | head -1 | awk '{print $2}' | sed 's/\.\.\..*//') + if [ "${CURBRANCH}" == "${BRANCH}" ]; then + echo "#### Project ${PROJECTPATH} is already on branch ${BRANCH} ####" + continue + fi + + # Sanity check + if [[ -n "$(git status --porcelain)" ]]; then + echo -n "#!#! Project ${PROJECTPATH} has uncommitted files, " + echo "not switching to branch ${BRANCH} #!#!" + exit 1 + fi + + echo "#### Project ${PROJECTPATH} Switching to branch ${BRANCH} ####" + git checkout "${BRANCH}" +done diff --git a/aosp-merger/branches_save.sh b/aosp-merger/branches_save.sh new file mode 100755 index 0000000..a806430 --- /dev/null +++ b/aosp-merger/branches_save.sh @@ -0,0 +1,35 @@ +#!/bin/bash +# +# Copyright (C) 2017 The LineageOS Project +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +if [ ! -e "build/envsetup.sh" ]; then + echo "Must run from root of repo" + exit 1 +fi + +TOP="${PWD}" +BRANCHLIST="${TOP}/branches.list" + +# Example repo status output: +#project build/make/ branch x +#project device/huawei/angler/ branch x + +repo status | grep '^project ' | while read l; do + set ${l} + PROJECTPATH=$(echo ${2} | sed 's|/$||') + BRANCH="${4}" + echo "${PROJECTPATH} ${BRANCH}" +done | sort > "${BRANCHLIST}"