classes/patch: move in logic to commit for additional tasks

If PATCHTOOL is "git", and PATCH_COMMIT_FUNCTIONS is set to "1", for
additional tasks between do_unpack and do_patch, make a git commit. This
logic was previously implemented in devtool itself, but it makes more
sense for it to be implemented in the patch class since that's where the
rest of the logic is for this (or in lib/oe/patch.py). It also makes
it possible for this to work with tinfoil2.

(From OE-Core rev: f24f59ea1d8bc335ea8576f6a346d0935f4a3548)

Signed-off-by: Paul Eggleton <paul.eggleton@linux.intel.com>
Signed-off-by: Ross Burton <ross.burton@intel.com>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
This commit is contained in:
Paul Eggleton 2016-12-13 20:09:38 +13:00 committed by Richard Purdie
parent 5942a8dc7c
commit 45adbe3709
2 changed files with 70 additions and 36 deletions

View File

@ -10,6 +10,75 @@ PATCH_GIT_USER_EMAIL ?= "oe.patch@oe"
inherit terminal
python () {
if d.getVar('PATCHTOOL', True) == 'git' and d.getVar('PATCH_COMMIT_FUNCTIONS', True) == '1':
tasks = list(filter(lambda k: d.getVarFlag(k, "task", True), d.keys()))
extratasks = []
def follow_chain(task, endtask, chain=None):
if not chain:
chain = []
chain.append(task)
for othertask in tasks:
if othertask == task:
continue
if task == endtask:
for ctask in chain:
if ctask not in extratasks:
extratasks.append(ctask)
else:
deps = d.getVarFlag(othertask, 'deps', False)
if task in deps:
follow_chain(othertask, endtask, chain)
chain.pop()
follow_chain('do_unpack', 'do_patch')
try:
extratasks.remove('do_unpack')
except ValueError:
# For some recipes do_unpack doesn't exist, ignore it
pass
d.appendVarFlag('do_patch', 'prefuncs', ' patch_task_patch_prefunc')
for task in extratasks:
d.appendVarFlag(task, 'postfuncs', ' patch_task_postfunc')
}
python patch_task_patch_prefunc() {
# Prefunc for do_patch
func = d.getVar('BB_RUNTASK', True)
srcsubdir = d.getVar('S', True)
patchdir = os.path.join(srcsubdir, 'patches')
if os.path.exists(patchdir):
if os.listdir(patchdir):
d.setVar('PATCH_HAS_PATCHES_DIR', '1')
else:
os.rmdir(patchdir)
}
python patch_task_postfunc() {
# Prefunc for task functions between do_unpack and do_patch
import oe.patch
import shutil
func = d.getVar('BB_RUNTASK', True)
srcsubdir = d.getVar('S', True)
if os.path.exists(srcsubdir):
if func == 'do_patch':
haspatches = (d.getVar('PATCH_HAS_PATCHES_DIR', True) == '1')
patchdir = os.path.join(srcsubdir, 'patches')
if os.path.exists(patchdir):
shutil.rmtree(patchdir)
if haspatches:
stdout, _ = bb.process.run('git status --porcelain patches', cwd=srcsubdir)
if stdout:
bb.process.run('git checkout patches', cwd=srcsubdir)
stdout, _ = bb.process.run('git status --porcelain .', cwd=srcsubdir)
if stdout:
useroptions = []
oe.patch.GitApplyTree.gitCommandUserOptions(useroptions, d=d)
bb.process.run('git add .; git %s commit -a -m "Committing changes from %s\n\n%s"' % (' '.join(useroptions), func, oe.patch.GitApplyTree.ignore_commit_prefix + ' - from %s' % func), cwd=srcsubdir)
}
def src_patches(d, all=False, expand=True):
workdir = d.getVar('WORKDIR', True)
fetch = bb.fetch2.Fetch([], d)

View File

@ -442,41 +442,6 @@ class BbTaskExecutor(object):
self.executed.append(func)
class PatchTaskExecutor(BbTaskExecutor):
def __init__(self, rdata):
import oe.patch
self.check_git = False
self.useroptions = []
oe.patch.GitApplyTree.gitCommandUserOptions(self.useroptions, d=rdata)
super(PatchTaskExecutor, self).__init__(rdata)
def exec_func(self, func, report):
from oe.patch import GitApplyTree
srcsubdir = self.rdata.getVar('S', True)
haspatches = False
if func == 'do_patch':
patchdir = os.path.join(srcsubdir, 'patches')
if os.path.exists(patchdir):
if os.listdir(patchdir):
haspatches = True
else:
os.rmdir(patchdir)
super(PatchTaskExecutor, self).exec_func(func, report)
if self.check_git and os.path.exists(srcsubdir):
if func == 'do_patch':
if os.path.exists(patchdir):
shutil.rmtree(patchdir)
if haspatches:
stdout, _ = bb.process.run('git status --porcelain patches', cwd=srcsubdir)
if stdout:
bb.process.run('git checkout patches', cwd=srcsubdir)
stdout, _ = bb.process.run('git status --porcelain', cwd=srcsubdir)
if stdout:
bb.process.run('git add .; git %s commit -a -m "Committing changes from %s\n\n%s"' % (' '.join(self.useroptions), func, GitApplyTree.ignore_commit_prefix + ' - from %s' % func), cwd=srcsubdir)
def _prep_extract_operation(config, basepath, recipename, tinfoil=None):
"""HACK: Ugly workaround for making sure that requirements are met when
trying to extract a package. Returns the tinfoil instance to be used."""
@ -563,7 +528,7 @@ def _extract_source(srctree, keep_temp, devbranch, sync, d):
# We don't want to move the source to STAGING_KERNEL_DIR here
crd.setVar('STAGING_KERNEL_DIR', '${S}')
task_executor = PatchTaskExecutor(crd)
task_executor = BbTaskExecutor(crd)
crd.setVar('EXTERNALSRC_forcevariable', '')