[Android Software/Hacking General [Developers Only]] laufersteppenwolf:
Those of you maintaining unofficial ROMs that need some device specific patches to the android platform that are not (yet) merged into the official sources often face the same problem: When syncing with upstream you either have to cherry-pick your patches again manually, or for those changes that are not committed there may be merge errors.

Additionally, when there are many patches in various repos it can get hard to keep track of them.

I faced the same situation while working on my phone, which needs changes not merges into any official sources except for NamelessROM. And those of you who know me, know that I like scripts doing the work for me. ;)

So I decided to write a tiny script to do all that for me.

Sure, I could have written a script like

cd frameworks/base
git cherry-pick <blah>
git cherry-pick <blah2>
cd ../../system/core
git cherry-pick <blah3>

But I just don't like hardcoding, and maintaining the script would also be way, way harder.

So I came up with this solution:

Storing the fetch URLs as well as the commit IDs in arrays. Then I can call one after another fully automatic via for-loops.

One issue remained, though: if a cherry-pick fails the next commits would also fail. Which is why the repo gets automatically reset if a cherry-pick doesn't apply properly.

An example script can be found HERE or in the attachments.

Now, the most important part for you: How do you make the script compatible with your ROMs sources?

There are just a few values you have to take care of:

##### Definable values
remote_name="p880-dev_autofetch"

paths="frameworks/native frameworks/base frameworks/opt/telephony"

commit_id[frameworks_native]='8465cdba74a038bb29598cfb4f48754b83124f48 208b1fcc0df405dc15582798c4e5406ba16201a9 49beaf826eb1c4eae3fe3202ef682a5973213c2d c83b9661c0fca41a5f43473def58379c7d7ae7d7 0c880a230ef4331cc071d45b6b06a8b0572c5a8f'
commit_id[frameworks_base]='45b92f41db68285e87980fafaa263511a6568705'
commit_id[frameworks_opt_telephony]='e7490c2c565d388212d84f627fb59c2bcccf8d61'

repo_url[frameworks_native]='git@bitbucket.org:laufersteppenwolf/android_frameworks_native.git'
repo_url[frameworks_base]='git@github.com:laufersteppenwolf/android_frameworks_base-1.git'
repo_url[frameworks_opt_telephony]='git@bitbucket.org:laufersteppenwolf/android_frameworks_opt_telephony.git'

#####

remote_name specifies the name that should be used for fetching (doesn't really matter, it just helps keeping track of what this remote is)

paths specifies the paths to the repos the script is gonna cycle through.

commit_id[name] specifies the commit IDs of the repo "name". While "name" is the path to the repo, but with underscores instead of slashes. Example: if your path is "system/core", the name you have to specify would be "system_core".

repo_url[name] specifies the URL of the repo to fetch. The naming is the same as in commit_id with underscores.

That's it. You can specify as many repos as you need, the script will cycle one after the other.

For an example on how to update the script with more repos, you may want to take a look at THIS commit

Now, how to use the script?

It's as simple as it could be:

Set up the build environment (. build/envsetup.sh)

Execute the script from whereever you want (. cherry-pick.sh)

If you're running the script for the first time or the fetched repo needs an update, you have to add the --fetch argument to (re-)fetch the repo again. (. cherry-pick.sh --fetch)

If you happen to have questions or suggestions, please feel free to let me know!