diff options
Diffstat (limited to 'rpmci/rpmci_srpm_builder_main.py')
-rw-r--r-- | rpmci/rpmci_srpm_builder_main.py | 49 |
1 files changed, 43 insertions, 6 deletions
diff --git a/rpmci/rpmci_srpm_builder_main.py b/rpmci/rpmci_srpm_builder_main.py index 5efd903..32cbbd8 100644 --- a/rpmci/rpmci_srpm_builder_main.py +++ b/rpmci/rpmci_srpm_builder_main.py @@ -27,6 +27,7 @@ from . import subtask from . import versioned_repos from . import artifact from . import spec +from . import rpmutils from . import lame_vcs_abstraction class SRPMBuilder(object): @@ -68,6 +69,26 @@ class SRPMBuilder(object): '--define', '_builddir ' + src_dirpath, '--define', '_srcrpmdir ' + src_dirpath, '--define', '_rpmdir ' + src_dirpath] + + def _extract_specfile_from_srpm(self, srpm_path, destpath): + tmpdir = tempfile.mkdtemp('', 'extract-srpm-spec-tmp') + name = rpmutils.get_rpm_name(os.path.basename(srpm_path)) + task_logpath = subtask.prepare_task_logfile('extract-srpm-%s' % (name, )) + logf = open(task_logpath, 'w') + devnull = open(os.devnull, 'w') + rpm2cpio = subprocess.Popen(['rpm2cpio', srpm_path], stdout=subprocess.PIPE, + stderr=logf) + cpio = subprocess.Popen(['cpio', '--quiet', '-i', '*.spec'], cwd=tmpdir, + stdin=rpm2cpio.stdout, stdout=devnull, + stderr=devnull) + cpio.wait() + for filename in os.listdir(tmpdir): + if filename.endswith('.spec'): + shutil.move(os.path.join(tmpdir, filename), destpath) + shutil.rmtree(tmpdir) + return True + shutil.rmtree(tmpdir) + return False def _on_vcs_message(self, q, messages): msg_list = list(messages) @@ -107,11 +128,19 @@ class SRPMBuilder(object): target_spec_obj = spec.Spec(target_spec_path) latest_repopath = self._srcrepo.get_latest_path() - if latest_repopath: - orig_spec_path = os.path.join(latest_repopath, specname) - else: - orig_spec_path = None - if orig_spec_path is not None and os.path.isfile(orig_spec_path): + latest_repo = self._srcrepo.get_latest_version() + orig_spec_path = None + if latest_repo: + for rpmpath in latest_repo.iter_rpms(): + filename = os.path.basename(rpmpath) + assert filename.endswith('.src.rpm') + name = rpmutils.get_rpm_name(filename) + if name == target.module: + orig_spec_path = os.path.join(work_dir, specname) + if not self._extract_specfile_from_srpm(rpmpath, orig_spec_path): + raise ValueError("Failed to extract specfile from %r" % (rpmpath, )) + break + if orig_spec_path is not None: # Okay, we have a previous build, so now we "merge" by taking everything # from the new spec file, except we use the Version/Release from the old # one. This is necessary to pacify RPM's insistence on globally @@ -120,6 +149,8 @@ class SRPMBuilder(object): orig_version = orig_spec_obj.get_key('Version') orig_release = orig_spec_obj.get_key('Release') + logging.info("Will update %r from version=%r release=%r" % (target.module, orig_version, orig_release)) + target_spec_obj.set_key('Version', orig_version) target_spec_obj.set_key('Release', orig_release) target_spec_obj.save() @@ -131,6 +162,11 @@ class SRPMBuilder(object): 'set-revision', 'HEAD'] subtask.spawn_sync('rpmci-spec-vcs-%s' % (target.module, ), args, cwd=fedora_dir) + target_spec_obj = spec.Spec(target_spec_path) + new_version = target_spec_obj.get_key('Version') + new_release = target_spec_obj.get_key('Release') + + logging.info("Updated %r to version=%r release=%r" % (target.module, new_version, new_release)) args = ['rpmbuild'] args.extend(self._get_base_rpmbuild_args(fedora_dir)) @@ -145,7 +181,8 @@ class SRPMBuilder(object): srpm_path = os.path.join(fedora_dir, filename) break assert srpm_path is not None - self._srcrepo.commit([srpm_path]) + self._srcrepo.commit_sync([srpm_path]) + shutil.rmtree(work_dir) self._srpm_msgqueue.append(msgqueue.Message(None, {'type': 'srpm'}, {'version': srpm_basename})) def main(): |