[PATCH mock] Enhancements of the config_opts['macros'] handling

Michael E Brown Michael_E_Brown at dell.com
Mon May 7 18:58:08 UTC 2007


On Mon, May 07, 2007 at 08:13:35PM +0200, Enrico Scholz wrote:
> Michael E Brown <Michael_E_Brown at dell.com> writes:
> 
> >> +    def _expand_macro_string(self, macros):
> >> +        res = []
> >> +        if isinstance(macros, dict):
> >> +            for (key,v) in macros.items():
> >> +                res.append('%s\t%s' % (key,v))
> >> +        elif isinstance(macros,  basestring):
> >> +            res = [macros]
> >> +        else:
> >> +            for v in macros:
> >> +                res.append(self._expand_macro_string(v))
> >> +
> >> +        return '\n'.join(res) + '\n'
> >
> > How does this affect the ability to overwrite config from a config file
> > higher in the heirarchy?
> 
> You can write e.g.
> 
> | -- defaults.cfg --
> | config_opts['macros'] = "%foo 1"

If something like this goes in, I expect that to become the defualt for
everything we ship. In this case:
    - setup_default_config_opts() would set up defaults using new format.
    - defaults.cfg probably wouldnt have this option
    - get rid of the recursive processing. If the option is a string,
      return it. If it is not a string, use dict processing model.

This means:
    - everything we ship uses new format
    - old users of this option still work but are encouraged to switch
      to the new format

Additionally:
    - We need a way to override options in subconfig files.

Suggestion:
    - We should use a dict for the option. If the hash value is None, or
      some variation thereof, dont

defaults.conf:
  config_opts['macros'] = { '%foo': "xyz", "%bar": "123", "%baz": "quux" }

my-root.conf:  # completely override all defaults
  config_opts['macros'] = { "%someopt": "someval" }

my-root.conf:  # only override some
  config_opts['macros']['%foo'] = "myvalue"
  config_opts['macros']['%bar'] = None      #dont output this in final
                                            #  .rpmmacros

--
Michael



> | 
> | -- my-root.cfg ==
> | config_opts['macros'] = [
> |   config_opts['macros'],
> |   {
> |     '%bar' : 2
> |   }
> | ]
> 
> Overwriting is not possible/easy when we want to retain backward
> compatibility.  When implemented from scratch, I would have implemented
> this option completely as a dictionary (I do not think that order of
> macros is for much interest).
> 
> 
> >
> >> +
> >>      def _build_dir_setup(self):
> >>          # purge the builddir, if it exists
> >>          bd_out = '%s%s' % (self.rootdir, self.builddir)
> >> @@ -788,8 +801,12 @@ class Root:
> >>          macrofile_out = '%s%s/.rpmmacros' % (self.rootdir, self.homedir)
> >>          if not os.path.exists(macrofile_out):
> >>              rpmmacros = open(macrofile_out, 'w')
> >> -            self.config['macros'] = self.config['macros'] + "\n%%_rpmlock_path	%s/var/lib/rpm/__db.000" % self.basedir
> >> -            rpmmacros.write(self.config['macros'])
> >> +
> >> +            rpmmacros.write(self._expand_macro_string(self.config['macros']))
> >> +            rpmmacros.write(self._expand_macro_string(
> >> +                {"%_rpmlock_path" : "%s/var/lib/rpm/__db.000" % self.basedir}
> >> +                ))
> >
> > This should go into the default config section, rather than hidden
> > here.
> 
> I just rewrote this hunk of code. In a later version of my mock
> modifications I removed this completely and replaced it by bind-mounting
> the chrooted /var/lib/rpm directory into toplevel /var/lib/rpm.
> 
> 
> > You need to convert the setup functions to use the new format by
> > default, as well as any existing config file references in the
> > default supplied configs.
> 
> See above for statement regarding backward compatibility; as long as
> you do not change the default string-type, old/existing configurations
> should still work.
> 
> When defaults would be dictionaries or vectors, overwriting can fail
> when people append an string.
> 
> 
> 
> 
> Enrico



> --
> Fedora-buildsys-list mailing list
> Fedora-buildsys-list at redhat.com
> https://www.redhat.com/mailman/listinfo/fedora-buildsys-list




More information about the buildsys mailing list