* implement a database of files
* implement a search-file command, not tested yet
This commit is contained in:
@@ -61,6 +61,7 @@ def init(database = True, options = None, ui = None, comar = True):
|
|||||||
if database:
|
if database:
|
||||||
ctx.repodb = pisi.repodb.init()
|
ctx.repodb = pisi.repodb.init()
|
||||||
ctx.installdb = pisi.installdb.init()
|
ctx.installdb = pisi.installdb.init()
|
||||||
|
ctx.filesdb = pisi.files.FilesDB()
|
||||||
|
|
||||||
# TODO: bunun da ctx'de olmasi gerek, global hesabi
|
# TODO: bunun da ctx'de olmasi gerek, global hesabi
|
||||||
packagedb.init()
|
packagedb.init()
|
||||||
|
|||||||
+50
-1
@@ -142,7 +142,8 @@ class Command(object):
|
|||||||
def help(self):
|
def help(self):
|
||||||
"""print help for the command"""
|
"""print help for the command"""
|
||||||
ctx.ui.info(self.format_name() + ': ')
|
ctx.ui.info(self.format_name() + ': ')
|
||||||
ctx.ui.info(__trans.ugettext(__doc__) + '\n')
|
trans = gettext.translation('pisi', fallback=True)
|
||||||
|
ctx.ui.info(trans.ugettext(self.__doc__) + '\n')
|
||||||
ctx.ui.info(self.parser.format_option_help())
|
ctx.ui.info(self.parser.format_option_help())
|
||||||
|
|
||||||
def die(self):
|
def die(self):
|
||||||
@@ -788,6 +789,54 @@ Usage: search <search pattern>
|
|||||||
"""
|
"""
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
class SearchFile(Command):
|
||||||
|
"""Search for a file
|
||||||
|
|
||||||
|
Usage: search-file <path1> <path2> ... <pathn>
|
||||||
|
|
||||||
|
Finds the installed package which contains the specified file.
|
||||||
|
"""
|
||||||
|
__metaclass__ = autocommand
|
||||||
|
|
||||||
|
def __init__(self):
|
||||||
|
super(SearchFile, self).__init__()
|
||||||
|
|
||||||
|
name = ("search-file", "sf")
|
||||||
|
|
||||||
|
def options(self):
|
||||||
|
self.parser.add_option("-l", "--long", action="store_true",
|
||||||
|
default=False, help="show in long format")
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def search_exact(path):
|
||||||
|
if ctx.filesdb.has_file(path):
|
||||||
|
(pkg_name, file_info) = ctx.filesdb.get_info(path)
|
||||||
|
ctx.ui.info(_('Package: %s') % pkg_name)
|
||||||
|
if ctx.options.long:
|
||||||
|
ctx.ui.info(_('Type: %s, Hash: %s') % (file_info.type,
|
||||||
|
file_info.hash) )
|
||||||
|
else:
|
||||||
|
ctx.ui.error(_('Path %s does not belong to an installed package') % path)
|
||||||
|
|
||||||
|
def run(self):
|
||||||
|
|
||||||
|
self.init(True)
|
||||||
|
|
||||||
|
if not self.args:
|
||||||
|
self.help()
|
||||||
|
return
|
||||||
|
|
||||||
|
# search among existing files
|
||||||
|
for path in self.args:
|
||||||
|
ctx.ui.info(_('Searching for %s') % path)
|
||||||
|
if os.path.exists(path):
|
||||||
|
search_exact(os.path.realpath(path))
|
||||||
|
else:
|
||||||
|
pisi.api.error(_('%s cannot be found'))
|
||||||
|
|
||||||
|
self.finalize()
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# Partial build commands
|
# Partial build commands
|
||||||
|
|
||||||
|
|||||||
@@ -16,6 +16,7 @@
|
|||||||
from pisi.xmlext import *
|
from pisi.xmlext import *
|
||||||
from pisi.xmlfile import XmlFile
|
from pisi.xmlfile import XmlFile
|
||||||
from pisi.util import Checks
|
from pisi.util import Checks
|
||||||
|
import pisi.lockeddbshelve as shelve
|
||||||
|
|
||||||
class FileInfo:
|
class FileInfo:
|
||||||
"""FileInfo holds the information for a File node/tag in files.xml"""
|
"""FileInfo holds the information for a File node/tag in files.xml"""
|
||||||
@@ -95,3 +96,22 @@ class Files(XmlFile):
|
|||||||
for finfo in self.list:
|
for finfo in self.list:
|
||||||
err.join(finfo.has_errors())
|
err.join(finfo.has_errors())
|
||||||
return err.list
|
return err.list
|
||||||
|
|
||||||
|
class FilesDB(shelve.LockedDBShelf):
|
||||||
|
|
||||||
|
def __init__(self):
|
||||||
|
shelve.LockedDBShelf.__init__(self, 'files')
|
||||||
|
#self.files_dir = pisi.util.join_path(ctx.config.db_dir(), 'files')
|
||||||
|
|
||||||
|
def add_files(pkg_name, files):
|
||||||
|
for x in files.list:
|
||||||
|
self[x.path] = (pkg_name, x)
|
||||||
|
|
||||||
|
def has_file(path):
|
||||||
|
return self.has_key(path)
|
||||||
|
|
||||||
|
def get_file_info(path):
|
||||||
|
if not self.has_key(path):
|
||||||
|
return None
|
||||||
|
else:
|
||||||
|
return self[path]
|
||||||
|
|||||||
Reference in New Issue
Block a user