def test_get_macros(self): rpm.addMacro('test_macro', 'test_macro value') macros = MacroHelper.dump() macros = MacroHelper.filter(macros, name='test_macro', level=-1) assert len(macros) == 1 assert macros[0]['name'] == 'test_macro' assert macros[0]['value'] == 'test_macro value' assert macros[0]['level'] == -1
def test_get_macros(self): rpm.addMacro('test_macro', 'test_macro value') macros = MacroHelper.dump() macros = MacroHelper.filter(macros, name='test_macro', level=-1) assert len(macros) == 1 assert macros[0]['name'] == 'test_macro' assert macros[0]['value'] == 'test_macro value' assert macros[0]['level'] == -1
def _correct_missing_files(cls, rebase_spec_file, files): """Adds files found in buildroot which are missing in %files sections in the SPEC file. Each file is added to a %files section with the closest matching path. """ # get %{name} macro macros = [ m for m in MacroHelper.filter(rebase_spec_file.macros, level=-3) if m['name'] == 'name' ] macros.extend(m for m in rebase_spec_file.macros if m['name'] in MacroHelper.MACROS_WHITELIST) macros = MacroHelper.expand_macros(macros) # ensure maximal greediness macros.sort(key=lambda k: len(k['value']), reverse=True) result: Dict[str, AddedFiles] = collections.defaultdict( lambda: collections.defaultdict(list)) for file in files: section = cls._get_best_matching_files_section( rebase_spec_file, file) if section is None: logger.error( 'The specfile does not contain any %files section, cannot add the missing files' ) break substituted_path = cls._sanitize_path( MacroHelper.substitute_path_with_macros(file, macros)) try: index = [ i for i, l in enumerate( rebase_spec_file.spec_content.section(section)) if l ][-1] + 1 except IndexError: # section is empty index = 0 rebase_spec_file.spec_content.section(section).insert( index, substituted_path) result['added'][section].append(substituted_path) logger.info("Added %s to '%s' section", substituted_path, section) return result
def update_setup_dirname(self, dirname): """ Update %setup or %autosetup dirname argument if needed :param dirname: new dirname to be used """ parser = self._get_setup_parser() prep = self.spec_content.section('%prep') if not prep: return for index, line in enumerate(prep): if line.startswith('%setup') or line.startswith('%autosetup'): args = shlex.split(line) macro = args[0] args = [MacroHelper.expand(a, '') for a in args[1:]] # parse macro arguments try: ns, unknown = parser.parse_known_args(args) except ParseError: continue # check if this macro instance is extracting Source0 if ns.T and ns.a != 0 and ns.b != 0: continue # check if modification is really necessary if dirname != ns.n: new_dirname = dirname # get %{name} and %{version} macros macros = [m for m in MacroHelper.filter(self.macros, level=-3) if m['name'] in ('name', 'version')] # add all macros from spec file scope macros.extend(MacroHelper.filter(self.macros, level=0)) # omit short macros macros = [m for m in macros if len(m['value']) > 1] # ensure maximal greediness macros.sort(key=lambda k: len(k['value']), reverse=True) # substitute tokens with macros for m in macros: if m['value'] and m['value'] in dirname: new_dirname = new_dirname.replace(m['value'], '%{{{}}}'.format(m['name'])) args = [macro] args.extend(['-n', new_dirname]) if ns.a != -1: args.extend(['-a', str(ns.a)]) if ns.b != -1: args.extend(['-b', str(ns.b)]) if ns.T: args.append('-T') if ns.q: args.append('-q') if ns.c: args.append('-c') if ns.D: args.append('-D') if ns.v: args.append('-v') if ns.N: args.append('-N') if ns.p != -1: args.extend(['-p', str(ns.p)]) if ns.S != '': args.extend(['-S', ns.S]) args.extend(unknown) prep[index] = ' '.join(args)