From: Michael Tremer Date: Sun, 20 Feb 2011 09:54:43 +0000 (+0100) Subject: Add tagging of database when creating a repository. X-Git-Tag: 0.9.3~157 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=8ba01c0a843c1c448acb432fbd5fd06dd994f0d8;p=pakfire.git Add tagging of database when creating a repository. --- diff --git a/pakfire/__init__.py b/pakfire/__init__.py index 57f9b78f9..f8378dcd9 100644 --- a/pakfire/__init__.py +++ b/pakfire/__init__.py @@ -202,3 +202,4 @@ class Pakfire(object): for input_path in input_paths: repo._collect_packages(input_path) + repo.index.tag_db() diff --git a/pakfire/index.py b/pakfire/index.py index 63f698ac1..87532f1ea 100644 --- a/pakfire/index.py +++ b/pakfire/index.py @@ -2,10 +2,13 @@ import logging import os +import random +import shutil import database import packages import repository +import util from constants import * @@ -59,6 +62,9 @@ class Index(object): def add_package(self, pkg): raise NotImplementedError + def tag_db(self): + raise NotImplementedError + class DirectoryIndex(Index): def __init__(self, pakfire, repo, path): @@ -124,7 +130,7 @@ class DatabaseIndex(Index): else: # Generate path to database file. - filename = os.path.join(repo.path, "XXX-to-be-renamed.db") + filename = os.path.join(repo.path, ".index.db.%s" % random.randint(0, 1024)) self.db = database.RemotePackageDatabase(self.pakfire, filename) @property @@ -169,6 +175,19 @@ class DatabaseIndex(Index): def add_package(self, pkg, reason=None): return self.db.add_package(pkg, reason) + def tag_db(self): + self.db.close() + + # Calculate a filename that is based on the hash of the file + # (just to trick proxies, etc.) + filename = util.calc_hash1(self.db.filename) + "-packages.db" + + # Copy the database to the right place. + shutil.copy2(self.db.filename, os.path.join(self.repo.path, filename)) + + # Reopen the database. + self.db = database.RemotePackageDatabase(self.pakfire, self.db.filename) + # XXX maybe this can be removed later? class InstalledIndex(DatabaseIndex): diff --git a/pakfire/repository.py b/pakfire/repository.py index 23688a758..fea2a6801 100644 --- a/pakfire/repository.py +++ b/pakfire/repository.py @@ -281,6 +281,9 @@ class LocalRepository(RepositoryFactory): repo_filename = os.path.join(self.path, pkg.arch, os.path.basename(pkg.filename)) + # Do we need to copy the package files? + copy = True + pkg_exists = None if os.path.exists(repo_filename): pkg_exists = packages.BinaryPackage(self.pakfire, self, repo_filename) @@ -289,14 +292,15 @@ class LocalRepository(RepositoryFactory): # skip any further processing. if pkg == pkg_exists: logging.debug("The package does already exist in this repo: %s" % pkg.friendly_name) - return + copy = False - logging.debug("Copying package '%s' to repository." % pkg.friendly_name) - repo_dirname = os.path.dirname(repo_filename) - if not os.path.exists(repo_dirname): - os.makedirs(repo_dirname) + if copy: + logging.debug("Copying package '%s' to repository." % pkg.friendly_name) + repo_dirname = os.path.dirname(repo_filename) + if not os.path.exists(repo_dirname): + os.makedirs(repo_dirname) - os.link(pkg.filename, repo_filename) + os.link(pkg.filename, repo_filename) # Create new package object, that is connected to this repository # and so we can do stuff. diff --git a/pakfire/util.py b/pakfire/util.py index 48d67f1cc..1e03ad9ee 100644 --- a/pakfire/util.py +++ b/pakfire/util.py @@ -12,7 +12,7 @@ import sys import time from errors import Error -from packages.util import format_size +from packages.util import calc_hash1, format_size _libc = ctypes.cdll.LoadLibrary(None) _errno = ctypes.c_int.in_dll(_libc, "errno")