summaryrefslogtreecommitdiffstats
path: root/rpmci/rpmci_srpm_builder_main.py
diff options
context:
space:
mode:
Diffstat (limited to 'rpmci/rpmci_srpm_builder_main.py')
-rw-r--r--rpmci/rpmci_srpm_builder_main.py49
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():