]> git.ipfire.org Git - pakfire.git/commitdiff
Fix composing of source packages on the server.
authorMichael Tremer <michael.tremer@ipfire.org>
Sun, 24 Jul 2011 11:32:45 +0000 (13:32 +0200)
committerMichael Tremer <michael.tremer@ipfire.org>
Sun, 24 Jul 2011 11:32:45 +0000 (13:32 +0200)
13 files changed:
pakfire/api.py
pakfire/base.py
pakfire/cli.py
pakfire/packages/__init__.py
pakfire/packages/solv.py
pakfire/packages/source.py
pakfire/repository/base.py
pakfire/repository/index.py
pakfire/repository/local.py
pakfire/server.py
src/_pakfiremodule.c
src/repo.c
src/repo.h

index d61b35debd1cc11a9f34f8d70634ccf039a36f95..88698cf7870130f54d721952de69978147ee20b3 100644 (file)
@@ -69,10 +69,10 @@ def requires(patterns, **pakfire_args):
 
        return pakfire.requires(requires)
 
-def repo_create(path, input_paths, **pakfire_args):
+def repo_create(path, input_paths, type="binary", **pakfire_args):
        pakfire = Pakfire(**pakfire_args)
 
-       return pakfire.repo_create(path, input_paths)
+       return pakfire.repo_create(path, input_paths, type=type)
 
 def repo_list(**pakfire_args):
        pakfire = Pakfire(**pakfire_args)
index f0705bdae1d72063afe1f773d007b9f3214a52e1..97c4f29e7cf690151c0e329161e7212c14580b8f 100644 (file)
@@ -377,12 +377,15 @@ class Pakfire(object):
 
                return pkgs
 
-       def repo_create(self, path, input_paths):
+       def repo_create(self, path, input_paths, type="binary"):
+               assert type in ("binary", "source",)
+
                repo = repository.RepositoryDir(
                        self,
                        name="new",
                        description="New repository.",
                        path=path,
+                       type=type,
                )
 
                for input_path in input_paths:
@@ -390,6 +393,8 @@ class Pakfire(object):
 
                repo.save()
 
+               return repo
+
        def repo_list(self):
                return [r for r in self.repos]
 
index 49c60701a1dce9a49936b33e972ff5802c7452e1..62895a4c86bce58d61b877c69543c502c2a03605 100644 (file)
@@ -503,6 +503,7 @@ class CliServer(Cli):
 
                self.parse_command_build()
                self.parse_command_keepalive()
+               self.parse_command_repoupdate()
 
                # Finally parse all arguments from the command line and save them.
                self.args = self.parser.parse_args()
@@ -510,8 +511,9 @@ class CliServer(Cli):
                self.server = server.Server()
 
                self.action2func = {
-                       "build"     : self.handle_build,
-                       "keepalive" : self.handle_keepalive,
+                       "build"      : self.handle_build,
+                       "keepalive"  : self.handle_keepalive,
+                       "repoupdate" : self.handle_repoupdate,
                }
 
        @property
@@ -533,8 +535,18 @@ class CliServer(Cli):
                sub_keepalive.add_argument("action", action="store_const",
                        const="keepalive")
 
+       def parse_command_repoupdate(self):
+               # Implement the "repoupdate" command.
+               sub_repoupdate = self.sub_commands.add_parser("repoupdate",
+                       help=_("Update all repositories."))
+               sub_repoupdate.add_argument("action", action="store_const",
+                       const="repoupdate")
+
        def handle_keepalive(self):
                self.server.update_info()
 
        def handle_build(self):
                self.server.build_job()
+
+       def handle_repoupdate(self):
+               self.server.update_repositories()
index e8959f607cbca5e866b405e0808a88f4dab7e0f9..f1bc47b70c122d146ee4181e2847314d98319d5b 100644 (file)
@@ -1,5 +1,7 @@
 #!/usr/bin/python
 
+import tarfile
+
 from binary import BinaryPackage
 from file import InnerTarFile
 from installed import DatabasePackage, InstalledPackage
@@ -21,10 +23,13 @@ def open(pakfire, repo, filename):
                not.
        """
        # XXX We should make this check much better...
-       if filename.endswith(".src.%s" % PACKAGE_EXTENSION):
-               return SourcePackage(pakfire, repo, filename)
+
+       # Simply check if the given file is a tarfile.
+       if tarfile.is_tarfile(filename):
+               if filename.endswith(".src.%s" % PACKAGE_EXTENSION):
+                       return SourcePackage(pakfire, repo, filename)
+
+               return BinaryPackage(pakfire, repo, filename)
 
        elif filename.endswith(".%s" % MAKEFILE_EXTENSION):
                return Makefile(pakfire, filename)
-
-       return BinaryPackage(pakfire, repo, filename)
index 957094acba4c4286132beab26b5414f620ec7e51..2742a865c3224d2008460585f95d4113f1ac6afd 100644 (file)
@@ -7,8 +7,8 @@ import base
 import binary
 
 class SolvPackage(base.Package):
-       def __init__(self, pakfire, solvable):
-               base.Package.__init__(self, pakfire)
+       def __init__(self, pakfire, solvable, repo=None):
+               base.Package.__init__(self, pakfire, repo)
 
                # Save solvable object
                self.solvable = solvable
@@ -63,8 +63,10 @@ class SolvPackage(base.Package):
 
        @property
        def repo(self):
-               repo_name = self.solvable.get_repo_name()
+               if self._repo:
+                       return self._repo
 
+               repo_name = self.solvable.get_repo_name()
                return self.pakfire.repos.get_repo(repo_name)
 
        @property
index 67a0b48e75d28e42feaa2500fb435581726109db..3947610a5cf32091e2b6ad44ae675989a328c021 100644 (file)
@@ -13,3 +13,7 @@ class SourcePackage(FilePackage):
                        Return the requirements for the build.
                """
                return self.metadata.get("PKG_REQUIRES", "").split()
+
+       @property
+       def conflicts(self):
+               return self.metadata.get("PKG_CONFLICTS", "").split()
index 6b0b7aa04b0641a4cfe2f0c672b25e99c0ef9236..276150bf1eeac80c4e5b4ce38066094a395fb813 100644 (file)
@@ -6,6 +6,7 @@ import logging
 import re
 
 import cache
+import pakfire.packages as packages
 import pakfire.satsolver as satsolver
 
 class RepositoryFactory(object):
@@ -36,6 +37,15 @@ class RepositoryFactory(object):
        def __len__(self):
                return self.solver_repo.size()
 
+       def __iter__(self):
+               pkgs = []
+
+               for solv in self.solver_repo.get_all():
+                       pkg = packages.SolvPackage(self.pakfire, solv, self)
+                       pkgs.append(pkg)
+
+               return iter(pkgs)
+
        @property
        def pool(self):
                return self.pakfire.pool
index 3fc2cb2ab0436313f4d7190a5a7013efe5714107..9df713bd8bf2601c8c63d6f174015432ee03872d 100644 (file)
@@ -250,6 +250,16 @@ class IndexSolv(Index):
 
 
 class IndexDir(Index):
+       def init(self):
+               self.pkg_type = None
+
+               if self.repo.type == "binary":
+                       self.pkg_type = packages.BinaryPackage
+               elif self.repo.type == "source":
+                       self.pkg_type = packages.SourcePackage
+
+               assert self.pkg_type
+
        def check(self):
                pass # XXX to be done
 
@@ -302,15 +312,18 @@ class IndexDir(Index):
 
                                package = packages.open(self.pakfire, self.repo, file)
 
-                               if isinstance(package, packages.BinaryPackage):
-                                       if not package.arch in (self.repo.arch, "noarch"):
+                               # Find all packages with the given type and skip those of
+                               # the other type.
+                               if isinstance(package, self.pkg_type):
+                                       # Check for binary packages if the architecture matches.
+                                       if isinstance(package, packages.BinaryPackage) and \
+                                                       not package.arch in (self.repo.arch, "noarch"):
                                                logging.warning("Skipped package with wrong architecture: %s (%s)" \
                                                        % (package.filename, package.arch))
-                                               print package.type
                                                continue
 
                                # Skip all source packages.
-                               elif isinstance(package, packages.SourcePackage):
+                               else:
                                        continue
 
                                self.add_package(package)
index 00d3f84b519e0743815071b4ce4bfd9c76dcf546..72445a693193650ae66ebf10fff803385e16c738 100644 (file)
@@ -15,15 +15,23 @@ import pakfire.util as util
 from pakfire.constants import *
 
 class RepositoryDir(base.RepositoryFactory):
-       def __init__(self, pakfire, name, description, path):
+       def __init__(self, pakfire, name, description, path, type="binary"):
                base.RepositoryFactory.__init__(self, pakfire, name, description)
 
                # Path to files.
                self.path = path
 
+               # Save type.
+               assert type in ("binary", "source",)
+               self.type = type
+
                # Create index
                self.index = index.IndexDir(self.pakfire, self)
 
+       def remove(self):
+               self.index.clear()
+               util.rm(self.path)
+
        @property
        def priority(self):
                """
index 5a98f445cd4a351d6c7422455992cdfb26c9ca3a..79c0c33826b792ab07c7abf9a794f1c39ac2d23c 100644 (file)
@@ -2,6 +2,7 @@
 
 import hashlib
 import logging
+import os
 import random
 import socket
 import subprocess
@@ -116,13 +117,14 @@ class Source(object):
                pakfire.api.dist(pkgs, resultdirs=[tmpdir,], **pakfire_args)
 
                # Create a kind of dummy repository to link the packages against it.
-               repo = pakfire.repository.LocalSourceRepository(self.pakfire,
-                       "source-%s" % rnd, "Source packages", tmpdir, idx="directory")
-               repo.update(force=True)
+               if pakfire_args.has_key("build_id"):
+                       del pakfire_args["build_id"]
+               pakfire_args["mode"] = "server"
 
-               return repo
+               repo = pakfire.api.repo_create("source-%s" % rnd, [tmpdir,], type="source",
+                       **pakfire_args)
 
-               # XXX don't forget to remove the repository.
+               return repo
 
        def update_all(self):
                _files = []
@@ -395,8 +397,22 @@ class Server(object):
 
                repo = source.update_revision(build["revision"], build_id=build_id)
 
-               # Upload all files in the repository.
-               for pkg in repo.get_all():
-                       self.upload_file(pkg.filename, build_id)
+               try:
+                       # Upload all files in the repository.
+                       for pkg in repo:
+                               path = os.path.join(pkg.repo.path, pkg.filename)
+                               self.upload_file(path, build_id)
+               finally:
+                       repo.remove()
+
+       def update_repositories(self, limit=2):
+               repos = self.conn.get_repos(limit)
+
+               for repo in repos:
+                       files = self.conn.get_repo_packages(repo["id"])
+
+                       for arch in repo["arches"]:
+                               path = "/pakfire/repositories/%s/%s/%s" % \
+                                       (repo["distro"]["sname"], repo["name"], arch)
 
-               repo.remove()
+                               pakfire.api.repo_create(path, files)
index 0c3b1fe025a7819d8390cc969b3d3f7fcb5f457c..959ccd04257937ca8ae3fe1f3c8e5db511e0259d 100644 (file)
@@ -58,6 +58,7 @@ static PyMethodDef Repo_methods[] = {
        {"write", (PyCFunction)Repo_write, METH_VARARGS, NULL},
        {"read", (PyCFunction)Repo_read, METH_VARARGS, NULL},
        {"clear", (PyCFunction)Repo_clear, METH_NOARGS, NULL},
+       {"get_all", (PyCFunction)Repo_get_all, METH_NOARGS, NULL},
        { NULL, NULL, 0, NULL }
 };
 
index f08b67d1083ab7a6cccd0c7dc7b07b804f594bea..db47c2b017229c1008cd7a532c6824f6ab1c62a9 100644 (file)
@@ -1,10 +1,13 @@
 
+#include <Python.h>
 #include <stdbool.h>
+#include <satsolver/repo.h>
 #include <satsolver/repo_solv.h>
 #include <satsolver/repo_write.h>
 
 #include "pool.h"
 #include "repo.h"
+#include "solvable.h"
 
 PyTypeObject RepoType = {
        PyObject_HEAD_INIT(NULL)
@@ -145,3 +148,27 @@ PyObject *Repo_clear(RepoObject *self) {
 
        Py_RETURN_NONE;
 }
+
+PyObject *Repo_get_all(RepoObject *self) {
+       Solvable *s;
+       Id p;
+       Repo *r = self->_repo;
+
+       PyObject *list = PyList_New(0);
+
+       FOR_REPO_SOLVABLES(r, p, s) {
+               SolvableObject *solv;
+
+               solv = PyObject_New(SolvableObject, &SolvableType);
+               if (solv == NULL)
+                       return NULL;
+
+               solv->_pool = self->_repo->pool;
+               solv->_id = p;
+
+               PyList_Append(list, (PyObject *)solv);
+       }
+
+       Py_INCREF(list);
+       return list;
+}
index c790ed5c97c8f5d99b802ba43acd6f3603f0a75c..2b89a3282dacf01743f010d381514faf9829ff4b 100644 (file)
@@ -23,6 +23,7 @@ extern PyObject *Repo_set_priority(RepoObject *self, PyObject *args);
 extern PyObject *Repo_write(RepoObject *self, PyObject *args);
 extern PyObject *Repo_read(RepoObject *self, PyObject *args);
 extern PyObject *Repo_clear(RepoObject *self);
+extern PyObject *Repo_get_all(RepoObject *self);
 
 extern PyTypeObject RepoType;