summaryrefslogtreecommitdiff
path: root/scripts/patch_git.sh
AgeCommit message (Collapse)Author
2021-11-04scripts: Review patch_git.sh and update-patches-gitPhil Sutter
Fix git-backed package patching and patch updating scripts: * patch_git.sh was entirely broken (since forever?!) due to a missing 'cd' call * update-patches-git formatted the marker commit as patch instead of ignoring it The major improvement of this review is the elimination of the mandatory final marker commit. Putting it before the series being applied works well and allows to add a patch to the series without demanding a git-rebase call to get the marker back on top. While being at it: * Call 'git am --abort' only if there was a git repo already * Call git-commit and git-format-patch with extra options to avoid side-effects from a user's .gitconfig * Explicitly specify output format in git-log to avoid surprises, also split output properly with 'read' * Eliminate fake_hdr variable Signed-off-by: Phil Sutter <phil@nwl.cc>
2016-03-27reimplement package patching and update-patches logicPhil Sutter
This works by using git as backend for all the dirty work. This means that patches are not just applied, but committed separately on top of the base sources (which are put into an initial commit). A final empty commit marks the end of the applied patch series, which allows to have multiple sets of patches to apply on top of each other. So a git history might look like this: - OpenADK patch marker: 0000 (this is the initial commit, containing the unpatched sources) - patch 1 of series 1 - patch 2 of series 1 - patch 3 of series 1 - OpenADK patch marker: 0001 - patch 1 of series 2 - patch 2 of series 2 - OpenADK patch marker: 0002 In addition to the separating empty commits, for every patch series metadata files are added (which are used for update-patches): __patchfiles__: A list of the patches' file names __patchdir__: The directory containing the applied patches Since patches might have to be unzipped first and in order to allow calling git-am just once for each patch series, the patches (along with above metadata files) are cached in dedicated directories: .git/patch_tmp/NNNN (where NNNN is the series number with leading zeroes [so shell globbing returns them in the right order]). In case update-patches is called later, update_patches.sh works it's way reverse through the git history, searching for commits named 'OpenADK patch marker: NNNN'. For each one it finds, it uses the metadata info to first remove all source patch files, then export the history in between using git-format-patch. To change patches or add new ones, the user has to use git-rebase in order to get things where they need to be for update_patches.sh to put stuff at the right place. For an example, here is how to change patch 3 of series 1 in the sample history above: - make desired code changes - commit them, ideally using --fixup option - call 'git rebase -i --autosquash <hash of OpenADK patch marker: 0000>' Using --fixup and --autosquash is convenient, since it automatically edits the rebase todo as intended. It's optional though, editing the todo manually will do just fine as well. Signed-off-by: Phil Sutter <phil@nwl.cc>