summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--meta/lib/oe/patch.py57
1 files changed, 44 insertions, 13 deletions
diff --git a/meta/lib/oe/patch.py b/meta/lib/oe/patch.py
index b2dc8d0a90..d047b3b947 100644
--- a/meta/lib/oe/patch.py
+++ b/meta/lib/oe/patch.py
@@ -499,6 +499,36 @@ class GitApplyTree(PatchTree):
499 finally: 499 finally:
500 shutil.rmtree(tempdir) 500 shutil.rmtree(tempdir)
501 501
502 def _need_dirty_check(self):
503 fetch = bb.fetch2.Fetch([], self.d)
504 check_dirtyness = False
505 for url in fetch.urls:
506 url_data = fetch.ud[url]
507 parm = url_data.parm
508 # a git url with subpath param will surely be dirty
509 # since the git tree from which we clone will be emptied
510 # from all files that are not in the subpath
511 if url_data.type == 'git' and parm.get('subpath'):
512 check_dirtyness = True
513 return check_dirtyness
514
515 def _commitpatch(self, patch, patchfilevar):
516 output = ""
517 # Add all files
518 shellcmd = ["git", "add", "-f", "-A", "."]
519 output += runcmd(["sh", "-c", " ".join(shellcmd)], self.dir)
520 # Exclude the patches directory
521 shellcmd = ["git", "reset", "HEAD", self.patchdir]
522 output += runcmd(["sh", "-c", " ".join(shellcmd)], self.dir)
523 # Commit the result
524 (tmpfile, shellcmd) = self.prepareCommit(patch['file'], self.commituser, self.commitemail)
525 try:
526 shellcmd.insert(0, patchfilevar)
527 output += runcmd(["sh", "-c", " ".join(shellcmd)], self.dir)
528 finally:
529 os.remove(tmpfile)
530 return output
531
502 def _applypatch(self, patch, force = False, reverse = False, run = True): 532 def _applypatch(self, patch, force = False, reverse = False, run = True):
503 import shutil 533 import shutil
504 534
@@ -534,6 +564,19 @@ class GitApplyTree(PatchTree):
534 shutil.copy2(commithook, applyhook) 564 shutil.copy2(commithook, applyhook)
535 try: 565 try:
536 patchfilevar = 'PATCHFILE="%s"' % os.path.basename(patch['file']) 566 patchfilevar = 'PATCHFILE="%s"' % os.path.basename(patch['file'])
567 if self._need_dirty_check():
568 # Check dirtyness of the tree
569 try:
570 output = runcmd(["git", "--work-tree=%s" % reporoot, "status", "--short"])
571 except CmdError:
572 pass
573 else:
574 if output:
575 # The tree is dirty, not need to try to apply patches with git anymore
576 # since they fail, fallback directly to patch
577 output = PatchTree._applypatch(self, patch, force, reverse, run)
578 output += self._commitpatch(patch, patchfilevar)
579 return output
537 try: 580 try:
538 shellcmd = [patchfilevar, "git", "--work-tree=%s" % reporoot] 581 shellcmd = [patchfilevar, "git", "--work-tree=%s" % reporoot]
539 self.gitCommandUserOptions(shellcmd, self.commituser, self.commitemail) 582 self.gitCommandUserOptions(shellcmd, self.commituser, self.commitemail)
@@ -560,19 +603,7 @@ class GitApplyTree(PatchTree):
560 except CmdError: 603 except CmdError:
561 # Fall back to patch 604 # Fall back to patch
562 output = PatchTree._applypatch(self, patch, force, reverse, run) 605 output = PatchTree._applypatch(self, patch, force, reverse, run)
563 # Add all files 606 output += self._commitpatch(patch, patchfilevar)
564 shellcmd = ["git", "add", "-f", "-A", "."]
565 output += runcmd(["sh", "-c", " ".join(shellcmd)], self.dir)
566 # Exclude the patches directory
567 shellcmd = ["git", "reset", "HEAD", self.patchdir]
568 output += runcmd(["sh", "-c", " ".join(shellcmd)], self.dir)
569 # Commit the result
570 (tmpfile, shellcmd) = self.prepareCommit(patch['file'], self.commituser, self.commitemail)
571 try:
572 shellcmd.insert(0, patchfilevar)
573 output += runcmd(["sh", "-c", " ".join(shellcmd)], self.dir)
574 finally:
575 os.remove(tmpfile)
576 return output 607 return output
577 finally: 608 finally:
578 shutil.rmtree(hooks_dir) 609 shutil.rmtree(hooks_dir)