Pakfire = base.Pakfire
-def install(requires, **pakfire_args):
+def install(requires, ignore_recommended=False, **pakfire_args):
pakfire = Pakfire(**pakfire_args)
- return pakfire.install(requires)
+ return pakfire.install(requires, ignore_recommended=ignore_recommended)
def resolvdep(pkgs, **pakfire_args):
pakfire = Pakfire(**pakfire_args)
help=_("Install one or more packages to the system."))
sub_install.add_argument("package", nargs="+",
help=_("Give name of at least one package to install."))
+ sub_install.add_argument("--without-recommends", action="store_true",
+ help=_("Don't install recommended packages."))
sub_install.add_argument("action", action="store_const", const="install")
def parse_command_reinstall(self):
**args)
def handle_install(self):
- pakfire.install(self.args.package, **self.pakfire_args)
+ pakfire.install(self.args.package,
+ ignore_recommended=self.args.without_recommends,
+ **self.pakfire_args)
def handle_reinstall(self):
pakfire.reinstall(self.args.package, **self.pakfire_args)
PACKAGE_EXTENSION = "pfm"
MAKEFILE_EXTENSION = "nm"
-DATABASE_FORMAT = 3
-DATABASE_FORMATS_SUPPORTED = [0, 1, 2, 3]
+DATABASE_FORMAT = 4
+DATABASE_FORMATS_SUPPORTED = [0, 1, 2, 3, 4]
PACKAGE_FILENAME_FMT = "%(name)s-%(version)s-%(release)s.%(arch)s.%(ext)s"
def obsoletes
%(obsoletes)s
end
+
+ def recommends
+%(recommends)s
+ end
+
+ def suggests
+%(suggests)s
+ end
end
# EOF
items.append((caption, req))
caption = ""
+ caption = _("Recommends")
+ for req in sorted(self.recommends):
+ items.append((caption, req))
+ caption = ""
+
+ caption = _("Suggests")
+ for req in sorted(self.suggests):
+ items.append((caption, req))
+ caption = ""
+
# Append filelist if requested.
if filelist:
for file in self.filelist:
def obsoletes(self):
return self.metadata.get("PKG_OBSOLETES", "").splitlines()
+ @property
+ def recommends(self):
+ return []
+
+ @property
+ def suggests(self):
+ return []
+
@property
def scriptlets(self):
return self.metadata.get("PKG_SCRIPTLETS", "").splitlines()
conflicts = conflicts.splitlines()
return self.filter_deps(conflicts)
+ @property
+ def recommends(self):
+ recommends = self.lexer.deps.get_var("recommends")
+
+ if not recommends:
+ return []
+
+ recommends = recommends.splitlines()
+ return self.filter_deps(recommends)
+
+ @property
+ def suggests(self):
+ suggests = self.lexer.deps.get_var("suggests")
+
+ if not suggests:
+ return []
+
+ suggests = suggests.splitlines()
+ return self.filter_deps(suggests)
+
class SourcePackage(FilePackage):
_type = "source"
def obsoletes(self):
return self.metadata.get("obsoletes", "").splitlines()
+ @property
+ def recommends(self):
+ recommends = self.metadata.get("recommends", None)
+
+ if recommends:
+ return recommends.splitlines()
+
+ return []
+
+ @property
+ def suggests(self):
+ suggests = self.metadata.get("suggests", None)
+
+ if suggests:
+ return suggests.splitlines()
+
+ return []
+
@property
def hash1(self):
return self.metadata.get("hash1")
raise LexerUnhandledLine, "%d: %s" % (self.lineno, line)
- DEP_DEFINITIONS = ("prerequires", "requires", "provides", "conflicts", "obsoletes",)
+ DEP_DEFINITIONS = ("prerequires", "requires", "provides", "conflicts", "obsoletes", "recommends", "suggests")
def parse_definition(self, pattern=LEXER_DEFINITION):
line = self.get_line(self._lineno)
def conflicts(self):
return []
+ @property
+ def recommends(self):
+ return []
+
+ @property
+ def suggests(self):
+ return []
+
@property
def files(self):
files = []
def conflicts(self):
return self.get_deps("conflicts")
+ @property
+ def recommends(self):
+ return self.get_deps("recommends")
+
+ @property
+ def suggests(self):
+ return self.get_deps("suggests")
+
def get_scriptlet(self, type):
return self.lexer.get_scriptlet(type)
for d in self.pkg.conflicts]),
"obsoletes" : "\n".join([PACKAGE_INFO_DEPENDENCY_LINE % d \
for d in self.pkg.obsoletes]),
+ "recommends" : "\n".join([PACKAGE_INFO_DEPENDENCY_LINE % d \
+ for d in self.pkg.recommends]),
+ "suggests" : "\n".join([PACKAGE_INFO_DEPENDENCY_LINE % d \
+ for d in self.pkg.suggests]),
})
# Format description.
def conflicts(self):
return self.solvable.get_conflicts()
+ @property
+ def recommends(self):
+ return self.solvable.get_recommends()
+
+ @property
+ def suggests(self):
+ return self.solvable.get_suggests()
+
@property
def filename(self):
return self.solvable.get_filename()
requires TEXT,
conflicts TEXT,
obsoletes TEXT,
+ recommends TEXT,
+ suggests TEXT,
license TEXT,
summary TEXT,
description TEXT,
if self.format < 3:
c.execute("ALTER TABLE files ADD COLUMN `capabilities` TEXT")
+ if self.format < 4:
+ c.execute("ALTER TABLE packages ADD COLUMN recommends TEXT AFTER obsoletes")
+ c.execute("ALTER TABLE packages ADD COLUMN suggests TEXT AFTER recommends")
+
# In the end, we can easily update the version of the database.
c.execute("UPDATE settings SET val = ? WHERE key = 'version'", (DATABASE_FORMAT,))
self.__format = DATABASE_FORMAT
requires,
conflicts,
obsoletes,
+ recommends,
+ suggests,
license,
summary,
description,
installed,
repository,
reason
- ) VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)""",
+ ) VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)""",
(
pkg.name,
pkg.epoch,
"\n".join(pkg.requires),
"\n".join(pkg.conflicts),
"\n".join(pkg.obsoletes),
+ "\n".join(pkg.recommends),
+ "\n".join(pkg.suggests),
pkg.license,
pkg.summary,
pkg.description,
rel = self.create_relation(file)
solvable.add_provides(rel)
+ # Import all recommends.
+ for reco in pkg.recommends:
+ rel = self.create_relation(reco)
+ solvable.add_recommends(rel)
+
+ # Import all suggests.
+ for sugg in pkg.suggests:
+ rel = self.create_relation(sugg)
+ solvable.add_suggests(rel)
+
def rem_package(self, pkg):
"""
Delete the solvable from the index.
"allow_downgrade" : SOLVER_FLAG_ALLOW_DOWNGRADE,
"allow_uninstall" : SOLVER_FLAG_ALLOW_UNINSTALL,
"allow_vendorchange" : SOLVER_FLAG_ALLOW_VENDORCHANGE,
+ "ignore_recommended" : SOLVER_FLAG_IGNORE_RECOMMENDED,
}
def __init__(self, pakfire, request, logger=None):
{"get_obsoletes", (PyCFunction)Solvable_get_obsoletes, METH_NOARGS, NULL},
{"add_conflicts", (PyCFunction)Solvable_add_conflicts, METH_VARARGS, NULL},
{"get_conflicts", (PyCFunction)Solvable_get_conflicts, METH_NOARGS, NULL},
+ {"add_recommends", (PyCFunction)Solvable_add_recommends, METH_VARARGS, NULL},
+ {"get_recommends", (PyCFunction)Solvable_get_recommends, METH_NOARGS, NULL},
+ {"add_suggests", (PyCFunction)Solvable_add_suggests, METH_VARARGS, NULL},
+ {"get_suggests", (PyCFunction)Solvable_get_suggests, METH_NOARGS, NULL},
{ NULL, NULL, 0, NULL }
};
PyDict_SetItemString(d, "SOLVER_FLAG_ALLOW_UNINSTALL", Py_BuildValue("i", SOLVER_FLAG_ALLOW_UNINSTALL));
PyDict_SetItemString(d, "SOLVER_FLAG_NO_UPDATEPROVIDE", Py_BuildValue("i", SOLVER_FLAG_NO_UPDATEPROVIDE));
PyDict_SetItemString(d, "SOLVER_FLAG_SPLITPROVIDES", Py_BuildValue("i", SOLVER_FLAG_SPLITPROVIDES));
+ PyDict_SetItemString(d, "SOLVER_FLAG_IGNORE_RECOMMENDED", Py_BuildValue("i", SOLVER_FLAG_IGNORE_RECOMMENDED));
}
}
void _Request_solvable(RequestObject *self, Id what, Id solvable) {
- queue_push2(&self->_queue, what|SOLVER_SOLVABLE, solvable);
+ queue_push2(&self->_queue, what|SOLVER_SOLVABLE|SOLVER_WEAK, solvable);
}
void _Request_relation(RequestObject *self, Id what, Id relation) {
- queue_push2(&self->_queue, what|SOLVER_SOLVABLE_PROVIDES, relation);
+ queue_push2(&self->_queue, what|SOLVER_SOLVABLE_PROVIDES|SOLVER_WEAK, relation);
}
void _Request_name(RequestObject *self, Id what, Id provides) {
- queue_push2(&self->_queue, what|SOLVER_SOLVABLE_NAME, provides);
+ queue_push2(&self->_queue, what|SOLVER_SOLVABLE_NAME|SOLVER_WEAK, provides);
}
PyObject *Request_install_solvable(RequestObject *self, PyObject *args) {
return _Solvable_get_dependencies(solv, solv->conflicts);
}
+PyObject *Solvable_add_recommends(SolvableObject *self, PyObject *args) {
+ Solvable *solv = pool_id2solvable(self->_pool, self->_id);
+
+ RelationObject *rel;
+ if (!PyArg_ParseTuple(args, "O", &rel)) {
+ return NULL;
+ }
+
+ solv->recommends = repo_addid_dep(solv->repo, solv->recommends, rel->_id, 0);
+ Py_RETURN_NONE;
+}
+
+PyObject *Solvable_get_recommends(SolvableObject *self) {
+ Solvable *solv = pool_id2solvable(self->_pool, self->_id);
+
+ return _Solvable_get_dependencies(solv, solv->recommends);
+}
+
+PyObject *Solvable_add_suggests(SolvableObject *self, PyObject *args) {
+ Solvable *solv = pool_id2solvable(self->_pool, self->_id);
+
+ RelationObject *rel;
+ if (!PyArg_ParseTuple(args, "O", &rel)) {
+ return NULL;
+ }
+
+ solv->suggests = repo_addid_dep(solv->repo, solv->suggests, rel->_id, 0);
+ Py_RETURN_NONE;
+}
+
+PyObject *Solvable_get_suggests(SolvableObject *self) {
+ Solvable *solv = pool_id2solvable(self->_pool, self->_id);
+
+ return _Solvable_get_dependencies(solv, solv->suggests);
+}
+
PyObject *Solvable_set_uuid(SolvableObject *self, PyObject *args) {
Solvable *solv = pool_id2solvable(self->_pool, self->_id);
extern PyObject *Solvable_add_conflicts(SolvableObject *self, PyObject *args);
extern PyObject *Solvable_get_conflicts(SolvableObject *self);
+extern PyObject *Solvable_add_recommends(SolvableObject *self, PyObject *args);
+extern PyObject *Solvable_get_recommends(SolvableObject *self);
+
+extern PyObject *Solvable_add_suggests(SolvableObject *self, PyObject *args);
+extern PyObject *Solvable_get_suggests(SolvableObject *self);
+
extern PyTypeObject SolvableType;
#endif