summaryrefslogtreecommitdiffstats
path: root/meta/lib/oe/recipeutils.py
diff options
context:
space:
mode:
authorPaul Eggleton <paul.eggleton@linux.intel.com>2017-11-01 11:56:18 +1300
committerRichard Purdie <richard.purdie@linuxfoundation.org>2017-11-11 12:14:27 +0000
commit9a80078e4b8e01d9bb49288f214f40e8497aa3ac (patch)
treead8387c4352dd3e0d81cda000ad9452e0449d4e7 /meta/lib/oe/recipeutils.py
parentd906d7cea814de917baf70eb3ecb568862fbc363 (diff)
downloadpoky-9a80078e4b8e01d9bb49288f214f40e8497aa3ac.tar.gz
devtool: finish: add dry-run option
If you're not sure what changes devtool finish is going to make, or you're not sure you're finished with your modifications, it is useful to be able to see what devtool finish is going to do beforehand, so add a -N/--dry-run option to make that possible. (It's also very useful for debugging devtool finish itself.) (From OE-Core rev: 05f2d5d2ce00c53825ccea5cd9c2262f9d27a638) 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>
Diffstat (limited to 'meta/lib/oe/recipeutils.py')
-rw-r--r--meta/lib/oe/recipeutils.py48
1 files changed, 36 insertions, 12 deletions
diff --git a/meta/lib/oe/recipeutils.py b/meta/lib/oe/recipeutils.py
index cab94b1350..a1e191afc7 100644
--- a/meta/lib/oe/recipeutils.py
+++ b/meta/lib/oe/recipeutils.py
@@ -251,7 +251,7 @@ def patch_recipe_lines(fromlines, values, trailing_newline=True):
251 return changed, tolines 251 return changed, tolines
252 252
253 253
254def patch_recipe_file(fn, values, patch=False, relpath=''): 254def patch_recipe_file(fn, values, patch=False, relpath='', redirect_output=None):
255 """Update or insert variable values into a recipe file (assuming you 255 """Update or insert variable values into a recipe file (assuming you
256 have already identified the exact file you want to update.) 256 have already identified the exact file you want to update.)
257 Note that some manual inspection/intervention may be required 257 Note that some manual inspection/intervention may be required
@@ -263,7 +263,11 @@ def patch_recipe_file(fn, values, patch=False, relpath=''):
263 263
264 _, tolines = patch_recipe_lines(fromlines, values) 264 _, tolines = patch_recipe_lines(fromlines, values)
265 265
266 if patch: 266 if redirect_output:
267 with open(os.path.join(redirect_output, os.path.basename(fn)), 'w') as f:
268 f.writelines(tolines)
269 return None
270 elif patch:
267 relfn = os.path.relpath(fn, relpath) 271 relfn = os.path.relpath(fn, relpath)
268 diff = difflib.unified_diff(fromlines, tolines, 'a/%s' % relfn, 'b/%s' % relfn) 272 diff = difflib.unified_diff(fromlines, tolines, 'a/%s' % relfn, 'b/%s' % relfn)
269 return diff 273 return diff
@@ -313,7 +317,7 @@ def localise_file_vars(fn, varfiles, varlist):
313 317
314 return filevars 318 return filevars
315 319
316def patch_recipe(d, fn, varvalues, patch=False, relpath=''): 320def patch_recipe(d, fn, varvalues, patch=False, relpath='', redirect_output=None):
317 """Modify a list of variable values in the specified recipe. Handles inc files if 321 """Modify a list of variable values in the specified recipe. Handles inc files if
318 used by the recipe. 322 used by the recipe.
319 """ 323 """
@@ -323,7 +327,7 @@ def patch_recipe(d, fn, varvalues, patch=False, relpath=''):
323 patches = [] 327 patches = []
324 for f,v in locs.items(): 328 for f,v in locs.items():
325 vals = {k: varvalues[k] for k in v} 329 vals = {k: varvalues[k] for k in v}
326 patchdata = patch_recipe_file(f, vals, patch, relpath) 330 patchdata = patch_recipe_file(f, vals, patch, relpath, redirect_output)
327 if patch: 331 if patch:
328 patches.append(patchdata) 332 patches.append(patchdata)
329 333
@@ -584,7 +588,7 @@ def get_bbappend_path(d, destlayerdir, wildcardver=False):
584 return (appendpath, pathok) 588 return (appendpath, pathok)
585 589
586 590
587def bbappend_recipe(rd, destlayerdir, srcfiles, install=None, wildcardver=False, machine=None, extralines=None, removevalues=None): 591def bbappend_recipe(rd, destlayerdir, srcfiles, install=None, wildcardver=False, machine=None, extralines=None, removevalues=None, redirect_output=None):
588 """ 592 """
589 Writes a bbappend file for a recipe 593 Writes a bbappend file for a recipe
590 Parameters: 594 Parameters:
@@ -611,6 +615,9 @@ def bbappend_recipe(rd, destlayerdir, srcfiles, install=None, wildcardver=False,
611 value pairs, or simply a list of the lines. 615 value pairs, or simply a list of the lines.
612 removevalues: 616 removevalues:
613 Variable values to remove - a dict of names/values. 617 Variable values to remove - a dict of names/values.
618 redirect_output:
619 If specified, redirects writing the output file to the
620 specified directory (for dry-run purposes)
614 """ 621 """
615 622
616 if not removevalues: 623 if not removevalues:
@@ -625,7 +632,8 @@ def bbappend_recipe(rd, destlayerdir, srcfiles, install=None, wildcardver=False,
625 bb.warn('Unable to determine correct subdirectory path for bbappend file - check that what %s adds to BBFILES also matches .bbappend files. Using %s for now, but until you fix this the bbappend will not be applied.' % (os.path.join(destlayerdir, 'conf', 'layer.conf'), os.path.dirname(appendpath))) 632 bb.warn('Unable to determine correct subdirectory path for bbappend file - check that what %s adds to BBFILES also matches .bbappend files. Using %s for now, but until you fix this the bbappend will not be applied.' % (os.path.join(destlayerdir, 'conf', 'layer.conf'), os.path.dirname(appendpath)))
626 633
627 appenddir = os.path.dirname(appendpath) 634 appenddir = os.path.dirname(appendpath)
628 bb.utils.mkdirhier(appenddir) 635 if not redirect_output:
636 bb.utils.mkdirhier(appenddir)
629 637
630 # FIXME check if the bbappend doesn't get overridden by a higher priority layer? 638 # FIXME check if the bbappend doesn't get overridden by a higher priority layer?
631 639
@@ -702,9 +710,18 @@ def bbappend_recipe(rd, destlayerdir, srcfiles, install=None, wildcardver=False,
702 if instfunclines: 710 if instfunclines:
703 bbappendlines.append(('do_install_append%s()' % appendoverride, '', instfunclines)) 711 bbappendlines.append(('do_install_append%s()' % appendoverride, '', instfunclines))
704 712
705 bb.note('Writing append file %s' % appendpath) 713 if redirect_output:
714 bb.note('Writing append file %s (dry-run)' % appendpath)
715 outfile = os.path.join(redirect_output, os.path.basename(appendpath))
716 # Only take a copy if the file isn't already there (this function may be called
717 # multiple times per operation when we're handling overrides)
718 if os.path.exists(appendpath) and not os.path.exists(outfile):
719 shutil.copy2(appendpath, outfile)
720 else:
721 bb.note('Writing append file %s' % appendpath)
722 outfile = appendpath
706 723
707 if os.path.exists(appendpath): 724 if os.path.exists(outfile):
708 # Work around lack of nonlocal in python 2 725 # Work around lack of nonlocal in python 2
709 extvars = {'destsubdir': destsubdir} 726 extvars = {'destsubdir': destsubdir}
710 727
@@ -776,7 +793,7 @@ def bbappend_recipe(rd, destlayerdir, srcfiles, install=None, wildcardver=False,
776 if removevalues: 793 if removevalues:
777 varnames.extend(list(removevalues.keys())) 794 varnames.extend(list(removevalues.keys()))
778 795
779 with open(appendpath, 'r') as f: 796 with open(outfile, 'r') as f:
780 (updated, newlines) = bb.utils.edit_metadata(f, varnames, appendfile_varfunc) 797 (updated, newlines) = bb.utils.edit_metadata(f, varnames, appendfile_varfunc)
781 798
782 destsubdir = extvars['destsubdir'] 799 destsubdir = extvars['destsubdir']
@@ -793,20 +810,27 @@ def bbappend_recipe(rd, destlayerdir, srcfiles, install=None, wildcardver=False,
793 updated = True 810 updated = True
794 811
795 if updated: 812 if updated:
796 with open(appendpath, 'w') as f: 813 with open(outfile, 'w') as f:
797 f.writelines(newlines) 814 f.writelines(newlines)
798 815
799 if copyfiles: 816 if copyfiles:
800 if machine: 817 if machine:
801 destsubdir = os.path.join(destsubdir, machine) 818 destsubdir = os.path.join(destsubdir, machine)
819 if redirect_output:
820 outdir = redirect_output
821 else:
822 outdir = appenddir
802 for newfile, srcfile in copyfiles.items(): 823 for newfile, srcfile in copyfiles.items():
803 filedest = os.path.join(appenddir, destsubdir, os.path.basename(srcfile)) 824 filedest = os.path.join(outdir, destsubdir, os.path.basename(srcfile))
804 if os.path.abspath(newfile) != os.path.abspath(filedest): 825 if os.path.abspath(newfile) != os.path.abspath(filedest):
805 if newfile.startswith(tempfile.gettempdir()): 826 if newfile.startswith(tempfile.gettempdir()):
806 newfiledisp = os.path.basename(newfile) 827 newfiledisp = os.path.basename(newfile)
807 else: 828 else:
808 newfiledisp = newfile 829 newfiledisp = newfile
809 bb.note('Copying %s to %s' % (newfiledisp, filedest)) 830 if redirect_output:
831 bb.note('Copying %s to %s (dry-run)' % (newfiledisp, os.path.join(appenddir, destsubdir, os.path.basename(srcfile))))
832 else:
833 bb.note('Copying %s to %s' % (newfiledisp, filedest))
810 bb.utils.mkdirhier(os.path.dirname(filedest)) 834 bb.utils.mkdirhier(os.path.dirname(filedest))
811 shutil.copyfile(newfile, filedest) 835 shutil.copyfile(newfile, filedest)
812 836