def spec_show(request, spec): tasks = BuildTask.objects.filter(specification=spec).select_related() packages = Package.objects.filter(specification=spec) # Combined build and task logs logs = [] logs += [(log.created, '', str(log), 'spec', log) for log in SpecificationLog.objects.filter(spec=spec)] logs += [(log.created, getattr(log.task.builder, 'name', None), str(log), 'task', log) for log in BuildTaskLog.objects.filter(task__specification=spec) \ .select_related(depth=3)] logs = reversed(sorted(logs)) task_logs = BuildTaskLog.objects.filter(task__specification=spec) # Source files sources = [] dsc = spec.dsc() if dsc is not None: dsc_path = os.path.join(settings.DOWNLOAD_TARGET, str(spec.id), dsc) if os.path.exists(dsc_path): dsc_size = os.stat(dsc_path).st_size sources.append((reverse('build_spec_source', args=[spec.id, dsc]), dsc, dsc_size)) src = Sources(open(dsc_path)) for info in src['Files']: fname = info['name'] size = int(info['size']) path = os.path.join(settings.DOWNLOAD_TARGET, str(spec.id), fname) if os.path.exists(path): sources.append((reverse('build_spec_source', args=[spec.id, fname]), fname, size)) context = { 'build': spec, 'tasks': tasks, 'packages': packages, 'logs': logs, 'sources': sources } return render_to_response('build/spec_show.html', context, context_instance=RequestContext(request))
def download(self, target): dsc = os.path.basename(self.source) dsc_path = os.path.join(target, dsc) # Download .dsc file self.log.debug('Downloading dsc file: %s' % self.source) tmp, headers = urlretrieve(self.source) shutil.move(tmp, dsc_path) # Download required files src = Sources(open(dsc_path)) files = [info['name'] for info in src['Files']] for fname in files: url = os.path.join(self.base, fname) self.log.debug('Downloading source file: %s' % url) tmp, headers = urlretrieve(url) path = os.path.join(target, fname) shutil.move(tmp, path) self.log.debug('All files downloaded') return dsc
def download(self): # Prepare source package builder from irgsh.source import SourcePackageBuilder spec = self.spec srcpkg = SourcePackageBuilder( spec.source, spec.source_type, spec.source_opts, spec.orig, spec.extraorig_set.all().values_list('orig', flat=True)) orig_path = None logger = None try: # Download source and build source package build_dir = tempfile.mkdtemp('-irgsh-build') source_dir = tempfile.mkdtemp('-irgsh-build-source') # Prepare logger logdir = os.path.dirname(self.spec.source_log_path()) if not os.path.exists(logdir): os.makedirs(logdir) logname = os.path.join(logdir, 'source.log') logger = open(logname, 'wb') # Build source package spec.add_log(_('Downloading source code')) self.log.debug('[%s] Downloading source code' % (self.spec_id, )) self.set_status(101) self.dsc = srcpkg.build(build_dir, logger) spec.add_log(_('Source code downloaded')) self.log.debug('[%s] Source code downloaded' % (self.spec_id, )) # Extract source package and send package description dsc_file = os.path.join(build_dir, self.dsc) source = os.path.join(source_dir, 'source') cmd = 'dpkg-source -x %s %s' % (dsc_file, source) logger.write('# Extracting source package\n') logger.write('# Command: %s\n' % cmd) logger.flush() p = Popen(cmd.split(), stdout=logger, stderr=STDOUT) p.communicate() logger.write('\n') changelog = os.path.join(source, 'debian', 'changelog') control = os.path.join(source, 'debian', 'control') self.send_description(changelog, control) # Copy source packages logger.write('# Copying source files:\n') src = Sources(open(dsc_file)) files = [self.dsc] + [info['name'] for info in src['Files']] for fname in files: logger.write('# - %s\n' % os.path.basename(fname)) target = os.path.join(self.target, fname) if os.path.exists(target): os.unlink(target) shutil.move(os.path.join(build_dir, fname), target) os.chmod(target, 0644) return files except StandardError, e: import traceback traceback.print_stack() logger.write('# Exception happened: %s: %s' % (type(e), str(e))) send_tweet(self.spec, 'Failed to initialize') raise
def build(self, target, logger=None): '''Build source package. This function returns the .dsc filename ''' try: cwd = os.getcwd() build_path = tempfile.mkdtemp('-irgsh-srcpkg') # Prepare source directory self.slog(logger, '# Preparing source code directory') package, version = self.prepare_source(build_path, logger) source = '%s-%s' % (package, version) self.slog(logger) os.chdir(build_path) self.slog(logger, '# File listing') cmd = 'find -ls' p = Popen(cmd.split(), stdout=logger, stderr=STDOUT, preexec_fn=os.setsid) out, err = p.communicate() self.slog(logger) # Build self.log.debug('Building source package: ' \ 'source=%s type=%s opts=%s orig=%s extra_orig=%s' % \ (self.source, self.source_type, \ self.source_opts, self.orig, self.extra_orig)) self.slog(logger, '# Building source package') cmd = 'dpkg-source -b %s' % source self.slog(logger, '# Command:', cmd) p = Popen(cmd.split(), stdout=logger, stderr=STDOUT, preexec_fn=os.setsid) out, err = p.communicate() self.slog(logger, '# Return code:', p.returncode, '\n') if p.returncode != 0: raise SourcePackageBuildError(p.returncode, out, err) # Move result to the given target directory, # existing files will be replaced dsc = '%s_%s.dsc' % (package, version) files = [dsc] dsc_path = os.path.join(build_path, dsc) src = Sources(open(dsc_path)) if not src.has_key('Files'): raise KeyError, 'Invalid source package' files += [item['name'] for item in src['Files']] self.log.debug('Moving source package files: %s' % ', '.join(files)) for fname in files: target_path = os.path.join(target, fname) if os.path.exists(target_path): os.unlink(target_path) shutil.move(os.path.join(build_path, fname), target_path) os.chmod(target_path, 0644) self.log.debug('Source package built: %s' % dsc) return dsc finally: shutil.rmtree(build_path) os.chdir(cwd)