diff options
Diffstat (limited to 'src/script/scons-configure-cache.py')
| -rw-r--r-- | src/script/scons-configure-cache.py | 143 | 
1 files changed, 90 insertions, 53 deletions
diff --git a/src/script/scons-configure-cache.py b/src/script/scons-configure-cache.py index 9b8b737..757a79f 100644 --- a/src/script/scons-configure-cache.py +++ b/src/script/scons-configure-cache.py @@ -2,7 +2,7 @@  #  # SCons - a Software Constructor  # -# Copyright (c) 2001 - 2017 The SCons Foundation +# Copyright (c) 2001 - 2019 The SCons Foundation  #  # Permission is hereby granted, free of charge, to any person obtaining  # a copy of this software and associated documentation files (the @@ -23,102 +23,139 @@  # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +'''Show or convert the configuration of an SCons cache directory. + +A cache of derived files is stored by file signature. +The files are split into directories named by the first few +digits of the signature. The prefix length used for directory +names can be changed by this script. +''' +  from __future__ import print_function +import argparse +import glob +import json +import os -__revision__ = "src/script/scons-configure-cache.py rel_3.0.0:4395:8972f6a2f699 2017/09/18 12:59:24 bdbaddog" +__revision__ = "src/script/scons-configure-cache.py e724ae812eb96f4858a132f5b8c769724744faf6 2019-07-21 00:04:47 bdeegan" -__version__ = "3.0.0" +__version__ = "3.1.0" -__build__ = "rel_3.0.0:4395:8972f6a2f699" +__build__ = "e724ae812eb96f4858a132f5b8c769724744faf6" -__buildsys__ = "ubuntu-16" +__buildsys__ = "kufra" -__date__ = "2017/09/18 12:59:24" +__date__ = "2019-07-21 00:04:47" -__developer__ = "bdbaddog" +__developer__ = "bdeegan" -import argparse -import glob -import json -import os  def rearrange_cache_entries(current_prefix_len, new_prefix_len): -    print('Changing prefix length from', current_prefix_len, 'to', new_prefix_len) +    '''Move cache files if prefix length changed. + +    Move the existing cache files to new directories of the +    appropriate name length and clean up the old directories. +    ''' +    print('Changing prefix length from', current_prefix_len, +          'to', new_prefix_len)      dirs = set()      old_dirs = set()      for file in glob.iglob(os.path.join('*', '*')):          name = os.path.basename(file) -        dir = name[:current_prefix_len].upper() -        if dir not in old_dirs: -            print('Migrating', dir) -            old_dirs.add(dir) -        dir = name[:new_prefix_len].upper() -        if dir not in dirs: -            os.mkdir(dir) -            dirs.add(dir) -        os.rename(file, os.path.join(dir, name)) +        dname = name[:current_prefix_len].upper() +        if dname not in old_dirs: +            print('Migrating', dname) +            old_dirs.add(dname) +        dname = name[:new_prefix_len].upper() +        if dname not in dirs: +            os.mkdir(dname) +            dirs.add(dname) +        os.rename(file, os.path.join(dname, name))      # Now delete the original directories -    for dir in old_dirs: -        os.rmdir(dir) +    for dname in old_dirs: +        os.rmdir(dname) + -# This dictionary should have one entry per entry in the cache config -# Each entry should have the following: +# The configuration dictionary should have one entry per entry in the +# cache config. The value of each entry should include the following:  #   implicit - (optional) This is to allow adding a new config entry and also  #              changing the behaviour of the system at the same time. This -#              indicates the value the config entry would have had if it had been -#              specified. +#              indicates the value the config entry would have had if it had +#              been specified.  #   default - The value the config entry should have if it wasn't previously  #             specified  #   command-line - parameters to pass to ArgumentParser.add_argument -#   converter - (optional) Function to call if it's necessary to do some work +#   converter - (optional) Function to call if conversion is required  #               if this configuration entry changes  config_entries = { -    'prefix_len' : {  -        'implicit' : 1,  -        'default' : 2 , -        'command-line' : { -            'help' : 'Length of cache file name used as subdirectory prefix', -            'metavar' : '<number>', -            'type' : int -            }, -        'converter' : rearrange_cache_entries +    'prefix_len': { +        'implicit': 1, +        'default': 2, +        'command-line': { +            'help': 'Length of cache file name used as subdirectory prefix', +            'metavar': '<number>', +            'type': int +        }, +        'converter': rearrange_cache_entries      }  } +  parser = argparse.ArgumentParser( -    description = 'Modify the configuration of an scons cache directory', -    epilog = ''' -             Unless you specify an option, it will not be changed (if it is -             already set in the cache config), or changed to an appropriate -             default (it it is not set). -             ''' -    ) +    description='Modify the configuration of an scons cache directory', +    epilog=''' +           Unspecified options will not be changed unless they are not +           set at all, in which case they are set to an appropriate default. +           ''')  parser.add_argument('cache-dir', help='Path to scons cache directory')  for param in config_entries: -    parser.add_argument('--' + param.replace('_', '-'),  +    parser.add_argument('--' + param.replace('_', '-'),                          **config_entries[param]['command-line']) -parser.add_argument('--version', action='version', version='%(prog)s 1.0') +parser.add_argument('--version', +                    action='version', +                    version='%(prog)s 1.0') +parser.add_argument('--show', +                    action="store_true", +                    help="show current configuration")  # Get the command line as a dict without any of the unspecified entries.  args = dict([x for x in vars(parser.parse_args()).items() if x[1]])  # It seems somewhat strange to me, but positional arguments don't get the -  # in the name changed to _, whereas optional arguments do... -os.chdir(args['cache-dir']) +cache = args['cache-dir'] +if not os.path.isdir(cache): +    raise RuntimeError("There is no cache directory named %s" % cache) +os.chdir(cache)  del args['cache-dir']  if not os.path.exists('config'): +    # old config dirs did not have a 'config' file. Try to update.      # Validate the only files in the directory are directories 0-9, a-f -    expected = [ '{:X}'.format(x) for x in range(0, 16) ] +    expected = ['{:X}'.format(x) for x in range(0, 16)]      if not set(os.listdir('.')).issubset(expected): -        raise RuntimeError("This doesn't look like a version 1 cache directory") +        raise RuntimeError( +            "%s does not look like a valid version 1 cache directory" % cache)      config = dict()  else:      with open('config') as conf:          config = json.load(conf) -# Find any keys that aren't currently set but should be +if args.get('show', None): +    print("Current configuration in '%s':" % cache) +    print(json.dumps(config, sort_keys=True, +                     indent=4, separators=(',', ': '))) +    # in case of the show argument, emit some stats as well +    file_count = 0 +    for _, _, files in os.walk('.'): +        file_count += len(files) +    if file_count:  # skip config file if it exists +        file_count -= 1 +    print("Cache contains %s files" % file_count) +    del args['show'] + +# Find any keys that are not currently set but should be  for key in config_entries:      if key not in config:          if 'implicit' in config_entries[key]: @@ -128,10 +165,10 @@ for key in config_entries:          if key not in args:              args[key] = config_entries[key]['default'] -#Now we go through each entry in args to see if it changes an existing config -#setting. +# Now go through each entry in args to see if it changes an existing config +# setting.  for key in args: -    if args[key] != config[key]:         +    if args[key] != config[key]:          if 'converter' in config_entries[key]:              config_entries[key]['converter'](config[key], args[key])          config[key] = args[key]  | 
