def prepare(self): """prepare task. Prebuild the package and run rpmbuild -bp on it.""" srpm = self.prebuild() utils.safe_makedirs(self.results_dir) shutil.copy(srpm, self.results_dir) for dname in ['BUILD', 'tmp']: utils.safe_makedirs(os.path.join(self.results_dir, dname)) rpm_cmd = (["rpm"] + self.get_rpmbuild_defines(prebuild=False) + ["-i", srpm]) ret = utils.unchecked_call(rpm_cmd) if ret != 0: raise Error("Unable to unpack SRPM: rpm -i returned %d" % ret) rpmbuild_cmd = (["rpmbuild", "-bp", "--nodeps"] + self.get_rpmbuild_defines(prebuild=False) + glob.glob(os.path.join(self.results_dir, "*.spec"))) if self.buildopts['target_arch'] is not None: rpmbuild_cmd += ["--target", self.buildopts['target_arch']] ret = utils.unchecked_call(rpmbuild_cmd) if ret != 0: raise Error( "Unable to prepare the package: rpmbuild -bp returned %d" % ret) log.info("Files prepared in: " + os.path.join(self.results_dir, "BUILD"))
def rpmbuild(self): """rpmbuild task. Build the package using rpmbuild on the local machine. """ srpm = self.prebuild() utils.safe_makedirs(self.results_dir) shutil.copy(srpm, self.results_dir) for d in ['BUILD', 'tmp']: utils.safe_makedirs(os.path.join(self.results_dir, d)) cmd = (["rpmbuild"] + self.get_rpmbuild_defines(prebuild=False) + ["--rebuild", srpm]) if self.buildopts['target_arch'] is not None: cmd += ["--target", self.buildopts['target_arch']] err = utils.unchecked_call(cmd) # TODO Parse rpmbuild output instead of using glob if err: raise OSGBuildError('Making RPM failed (command was: ' + " ".join(cmd) +')') else: rpms = [x for x in glob.glob(os.path.join(self.results_dir, "*.rpm")) if not fnmatch.fnmatch(x, '*.src.rpm')] if not rpms: raise OSGBuildError("No RPMs found. Making RPMs failed?") log.info("The following RPM(s) have been created:\n" + "\n".join(rpms))
def mock(self): """mock task. Build the package using mock on the local machine.""" srpm = self.prebuild() utils.safe_makedirs(self.results_dir) rpms = self.mock_obj.rebuild(self.results_dir, srpm) if self.buildopts['mock_clean']: self.mock_obj.clean() log.info("The following RPM(s) have been created:\n" + "\n".join(rpms))
def extract_srpms(srpms_downloaded, destdir): """Extract SRPMs to destdir""" abs_srpms_downloaded = [os.path.abspath(x) for x in srpms_downloaded] utils.safe_makedirs(destdir) old_dir = os.getcwd() os.chdir(destdir) for srpm in abs_srpms_downloaded: log.info("Unpacking SRPM " + srpm) utils.super_unpack(srpm) os.chdir(old_dir)
def koji(self): """koji task. Submit a build to koji; add the package first if necessary. """ if not self.buildopts['scratch']: self.koji_obj.add_pkg(self.package_name) utils.safe_makedirs(self.results_dir) srpm = self.prebuild() task_id = self.koji_obj.build_srpm(srpm) return task_id
def move_to_cache(srpm, upstream_root): """Move the srpm to the upstream cache. Return the path to the file in the cache.""" name, version = srpm_nvr(srpm)[0:2] base_srpm = os.path.basename(srpm) upstream_dir = os.path.join(upstream_root, name, version) utils.safe_makedirs(upstream_dir) dest_file = os.path.join(upstream_dir, base_srpm) if os.path.exists(dest_file): os.unlink(dest_file) shutil.move(srpm, dest_file) return dest_file
def full_extract(unpacked_dir, archives_downloaded, destdir): """Extract downloaded archives plus archives inside downloaded SRPMs""" archives_in_srpm = [] if os.path.isdir(unpacked_dir): for fname in glob.glob(os.path.join(unpacked_dir, '*')): if os.path.isfile(fname): archives_in_srpm.append(os.path.abspath(fname)) utils.safe_makedirs(destdir) old_dir = os.getcwd() os.chdir(destdir) for fname in archives_downloaded + archives_in_srpm: log.info("Extracting " + fname) utils.super_unpack(fname) os.chdir(old_dir) log.info('Extracted files to ' + destdir)
def prebuild(self): """prebuild task. Create an SRPM containing upstream sources (if any) plus our changes (if any) plus a spec file. Return the name of the SRPM created. """ utils.safe_makedirs(self.prebuild_dir) spec_filename = self.prebuild_external_sources() result_srpm = self.make_srpm(spec_filename) if result_srpm: log.info("Files have been prepared in %s.", self.prebuild_dir) return os.path.abspath(result_srpm)
def download_koji_file(task_id, filename, destdir): """Download a the file 'filename' for task number 'task_id' and place it in destdir/task_id/filename """ url = "http://koji-hub.batlab.org/koji/getfile?taskID=%d&name=%s" % ( task_id, filename) log.debug('Retrieving ' + url) handle = urllib2.urlopen(url) utils.safe_makedirs(destdir) full_filename = os.path.join(destdir, filename) desthandle = open(full_filename, 'w') try: desthandle.write(handle.read()) finally: desthandle.close()
def process_dot_source(cache_prefix, sfilename, destdir): """Read a .source file, fetch any files mentioned in it from the cache. """ utils.safe_makedirs(destdir) downloaded = [] try: sfile = open(sfilename, 'r') for lineno, line in enumerate(sfile): line = line.strip() if line.startswith('#'): continue if line == '': continue basename = os.path.basename(line) if line.startswith('/'): uri = "file://" + line log.warning( "An absolute path has been given in %s line %d. " "It is recommended to use only paths relative to %s" "in your source files.", sfilename, lineno + 1, cache_prefix) elif not re.match(r'/|\w+://', line): # relative path uri = os.path.join(cache_prefix, line) else: uri = line log.info('Retrieving ' + uri) try: handle = urllib2.urlopen(uri) except urllib2.URLError, err: raise Error("Unable to download %s\n%s" % (uri, str(err))) filename = os.path.join(destdir, basename) try: desthandle = open(filename, 'w') desthandle.write(handle.read()) except EnvironmentError, err: raise Error("Unable to save downloaded file to %s\n%s" % (filename, str(err))) downloaded.append(filename)
def process_dot_source(cache_prefix, sfilename, destdir): """Read a .source file, fetch any files mentioned in it from the cache. """ utils.safe_makedirs(destdir) downloaded = [] try: sfile = open(sfilename, 'r') for lineno, line in enumerate(sfile): line = line.strip() if line.startswith('#'): continue if line == '': continue basename = os.path.basename(line) if line.startswith('/'): uri = "file://" + line log.warning( "An absolute path has been given in %s line %d. " "It is recommended to use only paths relative to %s" "in your source files.", sfilename, lineno+1, cache_prefix) elif not re.match(r'/|\w+://', line): # relative path uri = os.path.join(cache_prefix, line) else: uri = line log.info('Retrieving ' + uri) try: handle = urllib2.urlopen(uri) except urllib2.URLError, err: raise Error("Unable to download %s\n%s" % (uri, str(err))) filename = os.path.join(destdir, basename) try: desthandle = open(filename, 'w') desthandle.write(handle.read()) except EnvironmentError, err: raise Error("Unable to save downloaded file to %s\n%s" % (filename, str(err))) downloaded.append(filename)
def quilt(self): """quilt task. Prebuild the package (except for making the SRPM) and run 'quilt setup' on the spec file. """ if not utils.which("quilt"): raise ProgramNotFoundError("quilt") if self.buildopts['autoclean']: if os.path.exists(self.quilt_dir): log.debug("autoclean removing " + self.quilt_dir) shutil.rmtree(self.quilt_dir) utils.safe_makedirs(self.quilt_dir) spec_filename = self.prebuild_external_sources(destdir=self.quilt_dir) os.chdir(self.quilt_dir) ret = utils.unchecked_call(["quilt", "-v", "setup", spec_filename]) if ret != 0: raise Error("Error running 'quilt setup' on the spec file.") log.info("quilt files ready in %s", self.quilt_dir)