diff options
author | Julien Stephan <jstephan@baylibre.com> | 2023-11-22 12:08:16 +0100 |
---|---|---|
committer | Richard Purdie <richard.purdie@linuxfoundation.org> | 2023-12-01 11:48:25 +0000 |
commit | 89f16624842a91e063dc9e6b98787d44c55e4900 (patch) | |
tree | c22ebb7b7f5ff89d3ed8431e8dcace59678b9ed3 /meta/lib/oe | |
parent | 17427db136491f13b0c9f187906ce9e3f6c85b29 (diff) | |
download | poky-89f16624842a91e063dc9e6b98787d44c55e4900.tar.gz |
devtool: add support for git submodules
Adding the support of submodules required a lot of changes on the
internal data structures:
* initial_rev/startcommit used as a starting point for looking at new
/ updated commits was replaced by a dictionary where the keys are the
submodule name ("." for main repo) and the values are the
initial_rev/startcommit
* the extractPatches function now extracts patch for the main repo and
for all submodules and stores them in a hierarchical way describing the
submodule path
* store initial_rev/commit also for all submodules inside the recipe
bbappend file
* _export_patches now returns dictionaries that contains the 'patchdir'
parameter (if any). This parameter is used to add the correct
'patchdir=' parameter on the recipe
Also, recipe can extract a secondary git tree inside the workdir.
By default, at the end of the do_patch function, there is a hook in
devtool that commits everything that was modified to have a clean
repository. It uses the command: "git add .; git commit ..."
The issue here is that, it adds the secondary git tree as a submodule
but in a wrong way. Doing "git add <git dir>" declares a submodule but do
not adds a url associated to it, and all following "git submodule foreach"
commands will fail.
So detect that a git tree was extracted inside S and correctly add it
using "git submodule add <url> <path>", so that it will be considered as a
regular git submodule
(From OE-Core rev: 900129cbdf25297a42ab5dbd02d1adbea405c935)
Signed-off-by: Julien Stephan <jstephan@baylibre.com>
Signed-off-by: Alexandre Belloni <alexandre.belloni@bootlin.com>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
Diffstat (limited to 'meta/lib/oe')
-rw-r--r-- | meta/lib/oe/patch.py | 64 | ||||
-rw-r--r-- | meta/lib/oe/recipeutils.py | 27 |
2 files changed, 50 insertions, 41 deletions
diff --git a/meta/lib/oe/patch.py b/meta/lib/oe/patch.py index 9b480b2b28..e4bb5a7839 100644 --- a/meta/lib/oe/patch.py +++ b/meta/lib/oe/patch.py | |||
@@ -461,41 +461,43 @@ class GitApplyTree(PatchTree): | |||
461 | return (tmpfile, cmd) | 461 | return (tmpfile, cmd) |
462 | 462 | ||
463 | @staticmethod | 463 | @staticmethod |
464 | def extractPatches(tree, startcommit, outdir, paths=None): | 464 | def extractPatches(tree, startcommits, outdir, paths=None): |
465 | import tempfile | 465 | import tempfile |
466 | import shutil | 466 | import shutil |
467 | tempdir = tempfile.mkdtemp(prefix='oepatch') | 467 | tempdir = tempfile.mkdtemp(prefix='oepatch') |
468 | try: | 468 | try: |
469 | shellcmd = ["git", "format-patch", "--no-signature", "--no-numbered", startcommit, "-o", tempdir] | 469 | for name, rev in startcommits.items(): |
470 | if paths: | 470 | shellcmd = ["git", "format-patch", "--no-signature", "--no-numbered", rev, "-o", tempdir] |
471 | shellcmd.append('--') | 471 | if paths: |
472 | shellcmd.extend(paths) | 472 | shellcmd.append('--') |
473 | out = runcmd(["sh", "-c", " ".join(shellcmd)], tree) | 473 | shellcmd.extend(paths) |
474 | if out: | 474 | out = runcmd(["sh", "-c", " ".join(shellcmd)], os.path.join(tree, name)) |
475 | for srcfile in out.split(): | 475 | if out: |
476 | for encoding in ['utf-8', 'latin-1']: | 476 | for srcfile in out.split(): |
477 | patchlines = [] | 477 | for encoding in ['utf-8', 'latin-1']: |
478 | outfile = None | 478 | patchlines = [] |
479 | try: | 479 | outfile = None |
480 | with open(srcfile, 'r', encoding=encoding) as f: | 480 | try: |
481 | for line in f: | 481 | with open(srcfile, 'r', encoding=encoding) as f: |
482 | if line.startswith(GitApplyTree.patch_line_prefix): | 482 | for line in f: |
483 | outfile = line.split()[-1].strip() | 483 | if line.startswith(GitApplyTree.patch_line_prefix): |
484 | continue | 484 | outfile = line.split()[-1].strip() |
485 | if line.startswith(GitApplyTree.ignore_commit_prefix): | 485 | continue |
486 | continue | 486 | if line.startswith(GitApplyTree.ignore_commit_prefix): |
487 | patchlines.append(line) | 487 | continue |
488 | except UnicodeDecodeError: | 488 | patchlines.append(line) |
489 | continue | 489 | except UnicodeDecodeError: |
490 | break | 490 | continue |
491 | else: | 491 | break |
492 | raise PatchError('Unable to find a character encoding to decode %s' % srcfile) | 492 | else: |
493 | 493 | raise PatchError('Unable to find a character encoding to decode %s' % srcfile) | |
494 | if not outfile: | 494 | |
495 | outfile = os.path.basename(srcfile) | 495 | if not outfile: |
496 | with open(os.path.join(outdir, outfile), 'w') as of: | 496 | outfile = os.path.basename(srcfile) |
497 | for line in patchlines: | 497 | bb.utils.mkdirhier(os.path.join(outdir, name)) |
498 | of.write(line) | 498 | with open(os.path.join(outdir, name, outfile), 'w') as of: |
499 | for line in patchlines: | ||
500 | of.write(line) | ||
499 | finally: | 501 | finally: |
500 | shutil.rmtree(tempdir) | 502 | shutil.rmtree(tempdir) |
501 | 503 | ||
diff --git a/meta/lib/oe/recipeutils.py b/meta/lib/oe/recipeutils.py index 695e981623..25b159bc1b 100644 --- a/meta/lib/oe/recipeutils.py +++ b/meta/lib/oe/recipeutils.py | |||
@@ -672,11 +672,11 @@ def bbappend_recipe(rd, destlayerdir, srcfiles, install=None, wildcardver=False, | |||
672 | destlayerdir: base directory of the layer to place the bbappend in | 672 | destlayerdir: base directory of the layer to place the bbappend in |
673 | (subdirectory path from there will be determined automatically) | 673 | (subdirectory path from there will be determined automatically) |
674 | srcfiles: dict of source files to add to SRC_URI, where the value | 674 | srcfiles: dict of source files to add to SRC_URI, where the value |
675 | is the full path to the file to be added, and the value is the | 675 | is the full path to the file to be added, and the value is a |
676 | original filename as it would appear in SRC_URI or None if it | 676 | dict with 'path' key containing the original filename as it |
677 | isn't already present. You may pass None for this parameter if | 677 | would appear in SRC_URI or None if it isn't already present. |
678 | you simply want to specify your own content via the extralines | 678 | You may pass None for this parameter if you simply want to specify |
679 | parameter. | 679 | your own content via the extralines parameter. |
680 | install: dict mapping entries in srcfiles to a tuple of two elements: | 680 | install: dict mapping entries in srcfiles to a tuple of two elements: |
681 | install path (*without* ${D} prefix) and permission value (as a | 681 | install path (*without* ${D} prefix) and permission value (as a |
682 | string, e.g. '0644'). | 682 | string, e.g. '0644'). |
@@ -763,10 +763,9 @@ def bbappend_recipe(rd, destlayerdir, srcfiles, install=None, wildcardver=False, | |||
763 | copyfiles = {} | 763 | copyfiles = {} |
764 | if srcfiles: | 764 | if srcfiles: |
765 | instfunclines = [] | 765 | instfunclines = [] |
766 | for i, (newfile, origsrcfile) in enumerate(srcfiles.items()): | 766 | for i, (newfile, param) in enumerate(srcfiles.items()): |
767 | srcfile = origsrcfile | ||
768 | srcurientry = None | 767 | srcurientry = None |
769 | if not srcfile: | 768 | if not 'path' in param or not param['path']: |
770 | srcfile = os.path.basename(newfile) | 769 | srcfile = os.path.basename(newfile) |
771 | srcurientry = 'file://%s' % srcfile | 770 | srcurientry = 'file://%s' % srcfile |
772 | if params and params[i]: | 771 | if params and params[i]: |
@@ -778,7 +777,10 @@ def bbappend_recipe(rd, destlayerdir, srcfiles, install=None, wildcardver=False, | |||
778 | appendline('SRC_URI:append%s' % appendoverride, '=', ' ' + srcurientry) | 777 | appendline('SRC_URI:append%s' % appendoverride, '=', ' ' + srcurientry) |
779 | else: | 778 | else: |
780 | appendline('SRC_URI', '+=', srcurientry) | 779 | appendline('SRC_URI', '+=', srcurientry) |
781 | copyfiles[newfile] = srcfile | 780 | param['path'] = srcfile |
781 | else: | ||
782 | srcfile = param['path'] | ||
783 | copyfiles[newfile] = param | ||
782 | if install: | 784 | if install: |
783 | institem = install.pop(newfile, None) | 785 | institem = install.pop(newfile, None) |
784 | if institem: | 786 | if institem: |
@@ -901,7 +903,12 @@ def bbappend_recipe(rd, destlayerdir, srcfiles, install=None, wildcardver=False, | |||
901 | outdir = redirect_output | 903 | outdir = redirect_output |
902 | else: | 904 | else: |
903 | outdir = appenddir | 905 | outdir = appenddir |
904 | for newfile, srcfile in copyfiles.items(): | 906 | for newfile, param in copyfiles.items(): |
907 | srcfile = param['path'] | ||
908 | patchdir = param.get('patchdir', ".") | ||
909 | |||
910 | if patchdir != ".": | ||
911 | newfile = os.path.join(os.path.split(newfile)[0], patchdir, os.path.split(newfile)[1]) | ||
905 | filedest = os.path.join(outdir, destsubdir, os.path.basename(srcfile)) | 912 | filedest = os.path.join(outdir, destsubdir, os.path.basename(srcfile)) |
906 | if os.path.abspath(newfile) != os.path.abspath(filedest): | 913 | if os.path.abspath(newfile) != os.path.abspath(filedest): |
907 | if newfile.startswith(tempfile.gettempdir()): | 914 | if newfile.startswith(tempfile.gettempdir()): |