[U-Boot] [PATCH] moveconfig: Add a new --git-ref option

Joe Hershberger joe.hershberger at gmail.com
Tue Jun 2 15:42:43 CEST 2015


Hey guys,

On Fri, May 29, 2015 at 4:23 PM, Joe Hershberger <joe.hershberger at ni.com> wrote:
> This option allows the 'make *_defconfig' step to run against a former
> repo state, while the savedefconfig step runs against the current repo
> state. This is convenient for the case where something in the Kconfig
> has changed such that the defconfig is no longer complete with the new
> Kconfigs. This feature allows the .config to be built assuming those old
> Kconfigs, but then savedefconfig based on the new state of the Kconfigs.
>
> Signed-off-by: Joe Hershberger <joe.hershberger at ni.com>
> ---

I forgot the Cc's on this...

>  tools/moveconfig.py     | 60 +++++++++++++++++++++++++++++++++++++++++++++----
>  tools/patman/gitutil.py | 15 +++++++++++++
>  2 files changed, 71 insertions(+), 4 deletions(-)
>
> diff --git a/tools/moveconfig.py b/tools/moveconfig.py
> index 496c90a..eeb9c0e 100755
> --- a/tools/moveconfig.py
> +++ b/tools/moveconfig.py
> @@ -153,6 +153,10 @@ Available options
>     Specify the number of threads to run simultaneously.  If not specified,
>     the number of threads is the same as the number of CPU cores.
>
> + -r, --git-ref
> +   Specify the git ref to clone for the make *_defconfig step. If unspecified
> +   use the CWD.
> +
>   -v, --verbose
>     Show any build errors as boards are built
>
> @@ -173,6 +177,12 @@ import sys
>  import tempfile
>  import time
>
> +# Bring in the patman libraries
> +our_path = os.path.dirname(os.path.realpath(__file__))
> +sys.path.append(os.path.join(our_path, 'patman'))
> +
> +import gitutil
> +
>  SHOW_GNU_MAKE = 'scripts/show-gnu-make'
>  SLEEP_TIME=0.03
>
> @@ -526,7 +536,7 @@ class Slot:
>      for faster processing.
>      """
>
> -    def __init__(self, config_attrs, options, devnull, make_cmd):
> +    def __init__(self, config_attrs, options, devnull, make_cmd, defconfig_src_dir):
>          """Create a new process slot.
>
>          Arguments:
> @@ -540,6 +550,7 @@ class Slot:
>          self.build_dir = tempfile.mkdtemp()
>          self.devnull = devnull
>          self.make_cmd = (make_cmd, 'O=' + self.build_dir)
> +        self.defconfig_src_dir = defconfig_src_dir
>          self.parser = KconfigParser(config_attrs, options, self.build_dir)
>          self.state = STATE_IDLE
>          self.failed_boards = []
> @@ -576,6 +587,9 @@ class Slot:
>              return False
>          cmd = list(self.make_cmd)
>          cmd.append(defconfig)
> +        if self.options.git_ref:
> +            cmd.append('-C')
> +            cmd.append(self.defconfig_src_dir)
>          self.ps = subprocess.Popen(cmd, stdout=self.devnull,
>                                     stderr=subprocess.PIPE)
>          self.defconfig = defconfig
> @@ -658,6 +672,9 @@ class Slot:
>          cmd.append('include/config/auto.conf')
>          """This will be screen-scraped, so be sure the expected text will be
>          returned consistently on every machine by setting LANG=C"""
> +        if self.options.git_ref:
> +            cmd.append('-C')
> +            cmd.append(self.defconfig_src_dir)
>          self.ps = subprocess.Popen(cmd, stdout=self.devnull,
>                                     env=dict(os.environ, LANG='C'),
>                                     stderr=subprocess.PIPE)
> @@ -673,7 +690,7 @@ class Slots:
>
>      """Controller of the array of subprocess slots."""
>
> -    def __init__(self, config_attrs, options):
> +    def __init__(self, config_attrs, options, defconfig_src_dir):
>          """Create a new slots controller.
>
>          Arguments:
> @@ -686,7 +703,8 @@ class Slots:
>          devnull = get_devnull()
>          make_cmd = get_make_cmd()
>          for i in range(options.jobs):
> -            self.slots.append(Slot(config_attrs, options, devnull, make_cmd))
> +            self.slots.append(Slot(config_attrs, options, devnull, make_cmd,
> +                                   defconfig_src_dir))
>
>      def add(self, defconfig, num, total):
>          """Add a new subprocess if a vacant slot is found.
> @@ -743,6 +761,24 @@ class Slots:
>                  for board in failed_boards:
>                      f.write(board + '\n')
>
> +class WorkDir:
> +    def __init__(self):
> +        """Create a new working directory."""
> +        self.work_dir = tempfile.mkdtemp()
> +
> +    def __del__(self):
> +        """Delete the working directory
> +
> +        This function makes sure the temporary directory is cleaned away
> +        even if Python suddenly dies due to error.  It should be done in here
> +        because it is guaranteed the destructor is always invoked when the
> +        instance of the class gets unreferenced.
> +        """
> +        shutil.rmtree(self.work_dir)
> +
> +    def get(self):
> +        return self.work_dir
> +
>  def move_config(config_attrs, options):
>      """Move config options to defconfig files.
>
> @@ -755,6 +791,20 @@ def move_config(config_attrs, options):
>          print 'Nothing to do. exit.'
>          sys.exit(0)
>
> +    defconfig_src_dir = ''
> +
> +    if options.git_ref:
> +        work_dir = WorkDir()
> +        defconfig_src_dir = work_dir.get()
> +        cwd = os.getcwd()
> +        print 'Cloning git repo for \'make *_defconfig\' step...'
> +        gitutil.Clone(cwd, defconfig_src_dir)
> +        print 'Checkout \'%s\' to find original configs.' % \
> +            gitutil.CommitHash(options.git_ref)
> +        os.chdir(defconfig_src_dir)
> +        gitutil.Checkout(options.git_ref)
> +        os.chdir(cwd)
> +
>      print 'Move the following CONFIG options (jobs: %d)' % options.jobs
>      for config_attr in config_attrs:
>          print '  %s (type: %s, default: %s)' % (config_attr['config'],
> @@ -777,7 +827,7 @@ def move_config(config_attrs, options):
>              for filename in fnmatch.filter(filenames, '*_defconfig'):
>                  defconfigs.append(os.path.join(dirpath, filename))
>
> -    slots = Slots(config_attrs, options)
> +    slots = Slots(config_attrs, options, defconfig_src_dir)
>
>      # Main loop to process defconfig files:
>      #  Add a new subprocess into a vacant slot.
> @@ -887,6 +937,8 @@ def main():
>                        help='only cleanup the headers')
>      parser.add_option('-j', '--jobs', type='int', default=cpu_count,
>                        help='the number of jobs to run simultaneously')
> +    parser.add_option('-r', '--git-ref', type='string',
> +                      help='the git ref to clone for the make *_defconfig step')
>      parser.add_option('-v', '--verbose', action='store_true', default=False,
>                        help='show any build errors as boards are built')
>      parser.usage += ' recipe_file\n\n' + \
> diff --git a/tools/patman/gitutil.py b/tools/patman/gitutil.py
> index 9e739d8..138f989 100644
> --- a/tools/patman/gitutil.py
> +++ b/tools/patman/gitutil.py
> @@ -61,6 +61,21 @@ def CountCommitsToBranch():
>      patch_count = int(stdout)
>      return patch_count
>
> +def CommitHash(commit_ref):
> +    """Gets the hash for a commit
> +
> +    Args:
> +        commit_ref: Commit ref to look up
> +
> +    Return:
> +        Hash of revision, if any, else None
> +    """
> +    pipe = ['git', 'rev-parse', '--short', commit_ref]
> +    stdout = command.RunPipe([pipe], capture=True, oneline=True).stdout
> +
> +    hash = stdout.strip()
> +    return hash
> +
>  def NameRevision(commit_hash):
>      """Gets the revision name for a commit
>
> --
> 1.7.11.5
>
> _______________________________________________
> U-Boot mailing list
> U-Boot at lists.denx.de
> http://lists.denx.de/mailman/listinfo/u-boot


More information about the U-Boot mailing list