예제 #1
0
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))
예제 #2
0
    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
예제 #3
0
    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
예제 #4
0
    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)