|
21 | 21 | from __future__ import absolute_import
|
22 | 22 | from __future__ import print_function
|
23 | 23 | from __future__ import unicode_literals
|
24 |
| -from dnf.util import is_glob_pattern, logger |
25 |
| -from dnf.i18n import _ |
| 24 | +from hawkey import Subject |
26 | 25 |
|
27 |
| -import dnf.base |
28 |
| -import dnf.selector |
29 |
| -import hawkey |
30 |
| - |
31 |
| - |
32 |
| -class Subject(object): |
33 |
| - # :api |
34 |
| - |
35 |
| - def __init__(self, pkg_spec, ignore_case=False): |
36 |
| - self.subj = hawkey.Subject(pkg_spec) # internal subject |
37 |
| - self.icase = ignore_case |
38 |
| - |
39 |
| - @property |
40 |
| - def _filename_pattern(self): |
41 |
| - return self.subj.pattern.startswith('/') or self.subj.pattern.startswith('*/') |
42 |
| - |
43 |
| - @property |
44 |
| - def _pattern(self): |
45 |
| - return self.subj.pattern |
46 |
| - |
47 |
| - def _is_arch_specified(self, solution): |
48 |
| - if solution['nevra'] and solution['nevra'].arch: |
49 |
| - return is_glob_pattern(solution['nevra'].arch) |
50 |
| - return False |
51 |
| - |
52 |
| - def get_nevra_possibilities(self, forms=None): |
53 |
| - # :api |
54 |
| - """ |
55 |
| - :param forms: list of hawkey NEVRA forms like [hawkey.FORM_NEVRA, hawkey.FORM_NEVR] |
56 |
| - :return: generator for every possible nevra. Each possible nevra is represented by Class |
57 |
| - NEVRA object (libdnf) that have attributes name, epoch, version, release, arch |
58 |
| - """ |
59 |
| - |
60 |
| - kwargs = {} |
61 |
| - if forms: |
62 |
| - kwargs['form'] = forms |
63 |
| - return self.subj.nevra_possibilities(**kwargs) |
64 |
| - |
65 |
| - def _get_nevra_solution(self, sack, with_nevra=True, with_provides=True, with_filenames=True, |
66 |
| - forms=None): |
67 |
| - """ |
68 |
| - Try to find first real solution for subject if it is NEVRA |
69 |
| - @param sack: |
70 |
| - @param forms: |
71 |
| - @return: dict with keys nevra and query |
72 |
| - """ |
73 |
| - kwargs = {} |
74 |
| - if forms: |
75 |
| - kwargs['form'] = forms |
76 |
| - solution = self.subj.get_best_solution(sack, icase=self.icase, with_nevra=with_nevra, |
77 |
| - with_provides=with_provides, |
78 |
| - with_filenames=with_filenames, **kwargs) |
79 |
| - solution['query'] = dnf.query.Query(query=solution['query']) |
80 |
| - return solution |
81 |
| - |
82 |
| - def get_best_query(self, sack, with_nevra=True, with_provides=True, with_filenames=True, |
83 |
| - forms=None): |
84 |
| - # :api |
85 |
| - |
86 |
| - solution = self._get_nevra_solution(sack, with_nevra=with_nevra, |
87 |
| - with_provides=with_provides, |
88 |
| - with_filenames=with_filenames, |
89 |
| - forms=forms) |
90 |
| - return solution['query'] |
91 |
| - |
92 |
| - def get_best_selector(self, sack, forms=None, obsoletes=True, reponame=None, reports=False): |
93 |
| - # :api |
94 |
| - |
95 |
| - solution = self._get_nevra_solution(sack, forms=forms) |
96 |
| - if solution['query']: |
97 |
| - q = solution['query'] |
98 |
| - q = q.filter(arch__neq="src") |
99 |
| - if obsoletes and solution['nevra'] and solution['nevra'].has_just_name(): |
100 |
| - q = q.union(sack.query().filter(obsoletes=q)) |
101 |
| - installed_query = q.installed() |
102 |
| - if reports: |
103 |
| - self._report_installed(installed_query) |
104 |
| - if reponame: |
105 |
| - q = q.filter(reponame=reponame).union(installed_query) |
106 |
| - if q: |
107 |
| - return self._list_or_query_to_selector(sack, q) |
108 |
| - |
109 |
| - return dnf.selector.Selector(sack) |
110 |
| - |
111 |
| - def _get_best_selectors(self, base, forms=None, obsoletes=True, reponame=None, reports=False, |
112 |
| - solution=None): |
113 |
| - if solution is None: |
114 |
| - solution = self._get_nevra_solution(base.sack, forms=forms) |
115 |
| - q = solution['query'] |
116 |
| - q = q.filter(arch__neq="src") |
117 |
| - if len(q) == 0: |
118 |
| - if reports and not self.icase: |
119 |
| - base._report_icase_hint(self._pattern) |
120 |
| - return [] |
121 |
| - q = self._apply_security_filters(q, base) |
122 |
| - if not q: |
123 |
| - return [] |
124 |
| - |
125 |
| - if not self._filename_pattern and is_glob_pattern(self._pattern) \ |
126 |
| - or solution['nevra'] and solution['nevra'].name is None: |
127 |
| - with_obsoletes = False |
128 |
| - |
129 |
| - if obsoletes and solution['nevra'] and solution['nevra'].has_just_name(): |
130 |
| - with_obsoletes = True |
131 |
| - installed_query = q.installed() |
132 |
| - if reponame: |
133 |
| - q = q.filter(reponame=reponame) |
134 |
| - available_query = q.available() |
135 |
| - installed_relevant_query = installed_query.filter( |
136 |
| - name=[pkg.name for pkg in available_query]) |
137 |
| - if reports: |
138 |
| - self._report_installed(installed_relevant_query) |
139 |
| - q = available_query.union(installed_relevant_query) |
140 |
| - sltrs = [] |
141 |
| - for name, pkgs_list in q._name_dict().items(): |
142 |
| - if with_obsoletes: |
143 |
| - pkgs_list = pkgs_list + base.sack.query().filter( |
144 |
| - obsoletes=pkgs_list).run() |
145 |
| - sltrs.append(self._list_or_query_to_selector(base.sack, pkgs_list)) |
146 |
| - return sltrs |
147 |
| - else: |
148 |
| - if obsoletes and solution['nevra'] and solution['nevra'].has_just_name(): |
149 |
| - q = q.union(base.sack.query().filter(obsoletes=q)) |
150 |
| - installed_query = q.installed() |
151 |
| - |
152 |
| - if reports: |
153 |
| - self._report_installed(installed_query) |
154 |
| - if reponame: |
155 |
| - q = q.filter(reponame=reponame).union(installed_query) |
156 |
| - if not q: |
157 |
| - return [] |
158 |
| - |
159 |
| - return [self._list_or_query_to_selector(base.sack, q)] |
160 |
| - |
161 |
| - def _apply_security_filters(self, query, base): |
162 |
| - query = base._merge_update_filters(query, warning=False) |
163 |
| - if not query: |
164 |
| - logger.warning(_('No security updates for argument "{}"').format(self._pattern)) |
165 |
| - return query |
166 |
| - |
167 |
| - @staticmethod |
168 |
| - def _report_installed(iterable_packages): |
169 |
| - for pkg in iterable_packages: |
170 |
| - dnf.base._msg_installed(pkg) |
171 |
| - |
172 |
| - @staticmethod |
173 |
| - def _list_or_query_to_selector(sack, list_or_query): |
174 |
| - sltr = dnf.selector.Selector(sack) |
175 |
| - return sltr.set(pkg=list_or_query) |
0 commit comments