* fix: don't change uri file to a wrong value while rebuilding repo,

use the new "read" function of Index to achieve this, wasn't too 
  easy to test
* add an "auto" value as compression choice to File to simplify index
  code, for the above fix
This commit is contained in:
Eray Özkural
2006-05-30 11:17:32 +00:00
parent e925a921af
commit 22f39e05c5
3 changed files with 46 additions and 40 deletions
+22 -27
View File
@@ -383,36 +383,31 @@ def update_repo(repo, force=False):
else: else:
raise Error(_('No repository named %s found.') % repo) raise Error(_('No repository named %s found.') % repo)
def rebuild_repo(repo):
ctx.ui.info(_('* Rebuilding \'%s\' named repo... ') % repo, noln=True)
index = Index()
if ctx.repodb.has_repo(repo):
repouri = URI(ctx.repodb.get_repo(repo).indexuri.get_uri())
indexname = repouri.filename()
indexpath = pisi.util.join_path(ctx.config.lib_dir(), 'index', repo, indexname)
uri_str = repouri.get_uri()
if os.path.exists(indexpath):
uri_str = indexpath
try:
index.read_uri(uri_str, repo, force = True)
except IOError:
ctx.ui.warning(_("Repo index file \'%s\' not found.") % uri_str)
return
else:
raise Error(_('No repository named %s found.') % repo)
ctx.txn_proc(lambda txn : index.update_db(repo, txn=txn))
ctx.ui.info(_('OK.'))
def delete_cache(): def delete_cache():
util.clean_dir(ctx.config.packages_dir()) util.clean_dir(ctx.config.packages_dir())
util.clean_dir(ctx.config.archives_dir()) util.clean_dir(ctx.config.archives_dir())
util.clean_dir(ctx.config.tmp_dir()) util.clean_dir(ctx.config.tmp_dir())
def rebuild_repo(repo):
ctx.ui.info(_('* Rebuilding \'%s\' named repo... ') % repo, noln=True)
if ctx.repodb.has_repo(repo):
repouri = URI(ctx.repodb.get_repo(repo).indexuri.get_uri())
indexname = repouri.filename()
index = Index()
indexpath = pisi.util.join_path(ctx.config.index_dir(), repo, indexname)
tmpdir = os.path.join(ctx.config.tmp_dir(), 'index')
pisi.util.clean_dir(tmpdir)
try:
index.read(indexpath, tmpdir)
except IOError:
ctx.ui.warning(_("Repo index file '%s' not found.") % uri_str)
return
ctx.txn_proc(lambda txn : index.update_db(repo, txn=txn))
ctx.ui.info(_('OK.'))
else:
raise Error(_('No repository named %s found.') % repo)
def rebuild_db(files=False): def rebuild_db(files=False):
assert ctx.database == False assert ctx.database == False
@@ -465,7 +460,7 @@ def rebuild_db(files=False):
ctx.ui.debug('Resurrecting %s' % package_fn) ctx.ui.debug('Resurrecting %s' % package_fn)
pisi.api.resurrect_package(package_fn, files, txn) pisi.api.resurrect_package(package_fn, files, txn)
def reload_indexes(txn): def reload_indices(txn):
index_dir = ctx.config.index_dir() index_dir = ctx.config.index_dir()
if os.path.exists(index_dir): # it may have been erased, or we may be upgrading from a previous version -- exa if os.path.exists(index_dir): # it may have been erased, or we may be upgrading from a previous version -- exa
for repo in os.listdir(index_dir): for repo in os.listdir(index_dir):
@@ -493,4 +488,4 @@ def rebuild_db(files=False):
#ctx.txn_proc(reload) #ctx.txn_proc(reload)
clean_duplicates() clean_duplicates()
reload_packages(files, None) reload_packages(files, None)
reload_indexes(None) reload_indices(None)
+19 -7
View File
@@ -55,8 +55,7 @@ class InvalidSignature(pisi.Error):
class File: class File:
(read, write) = range(2) # modes (read, write) = range(2) # modes
(bz2, zip) = range(2) # compress enums (bz2, gzip, auto) = range(3) # compress enums
(detached, whatelse) = range(2) (detached, whatelse) = range(2)
@staticmethod @staticmethod
@@ -67,15 +66,28 @@ class File:
elif not isinstance(uri, URI): elif not isinstance(uri, URI):
raise Error(_("uri must have type either URI or string")) raise Error(_("uri must have type either URI or string"))
return uri return uri
@staticmethod
def choose_method(filename, compress):
# this is really simple (^_^) -- exa
if compress == File.auto:
if filename.endswith('.bz2'):
return File.bz2
elif filename.endswith('.gz'):
return File.gzip
else:
return None
else:
return compress
@staticmethod @staticmethod
def decompress(localfile, compress): def decompress(localfile, compress):
compress = File.choose_method(localfile, compress)
if compress == File.bz2: if compress == File.bz2:
open(localfile[:-4], "w").write(bz2.BZ2File(localfile).read()) open(localfile[:-4], "w").write(bz2.BZ2File(localfile).read())
localfile = localfile[:-4] localfile = localfile[:-4]
elif compress == File.zip: elif compress == File.gzip:
raise Error(_("zip compression not supported yet")) raise Error(_("zip compression not supported yet"))
return localfile return localfile
@staticmethod @staticmethod
@@ -113,7 +125,7 @@ class File:
else: else:
localfile = uri.get_uri() #TODO: use a special function here? localfile = uri.get_uri() #TODO: use a special function here?
if not os.path.exists(localfile): if not os.path.exists(localfile):
raise IOError(_("File \'%s\' not found.") % localfile) raise IOError(_("File '%s' not found.") % localfile)
if not os.access(localfile, os.W_OK): if not os.access(localfile, os.W_OK):
oldfn = localfile oldfn = localfile
localfile = join(transfer_dir, os.path.basename(localfile)) localfile = join(transfer_dir, os.path.basename(localfile))
@@ -174,8 +186,8 @@ class File:
compressed_file = self.localfile + ".bz2" compressed_file = self.localfile + ".bz2"
bz2.BZ2File(compressed_file, "w").write(open(self.localfile, "r").read()) bz2.BZ2File(compressed_file, "w").write(open(self.localfile, "r").read())
elif self.compress == File.zip: elif self.compress == File.gzip:
raise Error(_("zip compression not supported yet")) raise Error(_("gzip compression not supported yet"))
if self.sha1sum: if self.sha1sum:
sha1 = pisi.util.sha1_file(self.localfile) sha1 = pisi.util.sha1_file(self.localfile)
+5 -6
View File
@@ -54,6 +54,10 @@ class Index(XmlFile):
def name(): def name():
return self.distribution.name + self.distribution.repositoryname return self.distribution.name + self.distribution.repositoryname
def read(filename, tmpdir):
XmlFile.read(filename, tmpDir=tmpdir, sha1sum=not force,
compress=File.auto, sign=File.detached, copylocal = True)
# read index for a given repo, force means download even if remote not updated # read index for a given repo, force means download even if remote not updated
def read_uri(self, filename, repo = None, force = False): def read_uri(self, filename, repo = None, force = False):
"""Read PSPEC file""" """Read PSPEC file"""
@@ -68,12 +72,7 @@ class Index(XmlFile):
urlfile = file(pisi.util.join_path(tmpdir, 'uri'), 'w') urlfile = file(pisi.util.join_path(tmpdir, 'uri'), 'w')
urlfile.write(filename) # uri urlfile.write(filename) # uri
if filename.endswith(".bz2"): self.read(filename, tmpdir)
self.read(filename, tmpDir=tmpdir, sha1sum=not force,
compress=File.bz2, sign=File.detached, copylocal = True)
else:
self.read(filename, tmpDir=tmpdir, sha1sum=not force,
compress=None, sign=File.detached, copylocal = True)
if not repo: if not repo:
repo = self.distribution.name() repo = self.distribution.name()