1 |
From f47e3589761cf27722bae9da55adf022b915b176 Mon Sep 17 00:00:00 2001 |
2 |
From: Brian Dolbec <dolsen@g.o> |
3 |
Date: Tue, 29 Nov 2016 18:25:36 -0800 |
4 |
Subject: [PATCH] egencache: Migrate _special_filename class to |
5 |
portage.utils.changelog for api use |
6 |
|
7 |
Requested move by Robin <robbat2@g.o> for the new split changelog repo scripts. |
8 |
Rename the class more appropriately. |
9 |
Magke the file_type_lt() private. |
10 |
--- |
11 |
bin/egencache | 76 +++---------------------------------------- |
12 |
pym/portage/util/changelog.py | 69 +++++++++++++++++++++++++++++++++++++++ |
13 |
2 files changed, 74 insertions(+), 71 deletions(-) |
14 |
create mode 100644 pym/portage/util/changelog.py |
15 |
|
16 |
diff --git a/bin/egencache b/bin/egencache |
17 |
index 80738cf..e994b4a 100755 |
18 |
--- a/bin/egencache |
19 |
+++ b/bin/egencache |
20 |
@@ -52,16 +52,16 @@ from _emerge.MetadataRegen import MetadataRegen |
21 |
from portage.cache.cache_errors import CacheError, StatCollision |
22 |
from portage.cache.index.pkg_desc_index import pkg_desc_index_line_format |
23 |
from portage.const import TIMESTAMP_FORMAT |
24 |
-from portage.manifest import guessManifestFileType |
25 |
from portage.package.ebuild._parallel_manifest.ManifestScheduler import ManifestScheduler |
26 |
from portage.util import cmp_sort_key, writemsg_level |
27 |
from portage.util._async.AsyncFunction import AsyncFunction |
28 |
from portage.util._async.run_main_scheduler import run_main_scheduler |
29 |
from portage.util._async.TaskScheduler import TaskScheduler |
30 |
from portage.util._eventloop.global_event_loop import global_event_loop |
31 |
+from portage.util.changelog import ChangeLogTypeSort |
32 |
from portage import cpv_getkey |
33 |
from portage.dep import Atom, isjustname |
34 |
-from portage.versions import pkgsplit, vercmp, _pkg_str |
35 |
+from portage.versions import vercmp |
36 |
|
37 |
try: |
38 |
from xml.etree import ElementTree |
39 |
@@ -668,72 +668,6 @@ class GenUseLocalDesc(object): |
40 |
os.utime(desc_path, (mtime, mtime)) |
41 |
|
42 |
|
43 |
-if sys.hexversion < 0x3000000: |
44 |
- _filename_base = unicode |
45 |
-else: |
46 |
- _filename_base = str |
47 |
- |
48 |
-class _special_filename(_filename_base): |
49 |
- """ |
50 |
- Helps to sort file names by file type and other criteria. |
51 |
- """ |
52 |
- def __new__(cls, status_change, file_name): |
53 |
- return _filename_base.__new__(cls, status_change + file_name) |
54 |
- |
55 |
- def __init__(self, status_change, file_name): |
56 |
- _filename_base.__init__(status_change + file_name) |
57 |
- self.status_change = status_change |
58 |
- self.file_name = file_name |
59 |
- self.file_type = guessManifestFileType(file_name) |
60 |
- |
61 |
- @staticmethod |
62 |
- def file_type_lt(a, b): |
63 |
- """ |
64 |
- Defines an ordering between file types. |
65 |
- """ |
66 |
- first = a.file_type |
67 |
- second = b.file_type |
68 |
- if first == second: |
69 |
- return False |
70 |
- |
71 |
- if first == "EBUILD": |
72 |
- return True |
73 |
- elif first == "MISC": |
74 |
- return second in ("EBUILD",) |
75 |
- elif first == "AUX": |
76 |
- return second in ("EBUILD", "MISC") |
77 |
- elif first == "DIST": |
78 |
- return second in ("EBUILD", "MISC", "AUX") |
79 |
- elif first is None: |
80 |
- return False |
81 |
- else: |
82 |
- raise ValueError("Unknown file type '%s'" % first) |
83 |
- |
84 |
- def __lt__(self, other): |
85 |
- """ |
86 |
- Compare different file names, first by file type and then |
87 |
- for ebuilds by version and lexicographically for others. |
88 |
- EBUILD < MISC < AUX < DIST < None |
89 |
- """ |
90 |
- if self.__class__ != other.__class__: |
91 |
- raise NotImplementedError |
92 |
- |
93 |
- # Sort by file type as defined by file_type_lt(). |
94 |
- if self.file_type_lt(self, other): |
95 |
- return True |
96 |
- elif self.file_type_lt(other, self): |
97 |
- return False |
98 |
- |
99 |
- # Files have the same type. |
100 |
- if self.file_type == "EBUILD": |
101 |
- # Sort by version. Lowest first. |
102 |
- ver = "-".join(pkgsplit(self.file_name[:-7])[1:3]) |
103 |
- other_ver = "-".join(pkgsplit(other.file_name[:-7])[1:3]) |
104 |
- return vercmp(ver, other_ver) < 0 |
105 |
- else: |
106 |
- # Sort lexicographically. |
107 |
- return self.file_name < other.file_name |
108 |
- |
109 |
class GenChangeLogs(object): |
110 |
def __init__(self, portdb, changelog_output, changelog_reversed, |
111 |
max_jobs=None, max_load=None): |
112 |
@@ -853,11 +787,11 @@ class GenChangeLogs(object): |
113 |
elif f[1].startswith('ChangeLog'): |
114 |
pass |
115 |
elif f[0].startswith('A'): |
116 |
- changed.append(_special_filename("+", f[1])) |
117 |
+ changed.append(ChangeLogTypeSort("+", f[1])) |
118 |
elif f[0].startswith('D'): |
119 |
- changed.append(_special_filename("-", f[1])) |
120 |
+ changed.append(ChangeLogTypeSort("-", f[1])) |
121 |
elif f[0].startswith('M'): |
122 |
- changed.append(_special_filename("", f[1])) |
123 |
+ changed.append(ChangeLogTypeSort("", f[1])) |
124 |
else: |
125 |
writemsg_level( |
126 |
"ERROR: unexpected git file status for %s: %s\n" % (cp,f,), |
127 |
diff --git a/pym/portage/util/changelog.py b/pym/portage/util/changelog.py |
128 |
new file mode 100644 |
129 |
index 0000000..2b46bc3 |
130 |
--- /dev/null |
131 |
+++ b/pym/portage/util/changelog.py |
132 |
@@ -0,0 +1,69 @@ |
133 |
+#!/usr/bin/python -b |
134 |
+# Copyright 2009-2015 Gentoo Foundation |
135 |
+# Distributed under the terms of the GNU General Public License v2 |
136 |
+ |
137 |
+ |
138 |
+from portage.manifest import guessManifestFileType |
139 |
+from portage.versions import _unicode, pkgsplit, vercmp |
140 |
+ |
141 |
+ |
142 |
+class ChangeLogTypeSort(_unicode): |
143 |
+ """ |
144 |
+ Helps to sort file names by file type and other criteria. |
145 |
+ """ |
146 |
+ def __new__(cls, status_change, file_name): |
147 |
+ return _unicode.__new__(cls, status_change + file_name) |
148 |
+ |
149 |
+ def __init__(self, status_change, file_name): |
150 |
+ _unicode.__init__(status_change + file_name) |
151 |
+ self.status_change = status_change |
152 |
+ self.file_name = file_name |
153 |
+ self.file_type = guessManifestFileType(file_name) |
154 |
+ |
155 |
+ @staticmethod |
156 |
+ def _file_type_lt(a, b): |
157 |
+ """ |
158 |
+ Defines an ordering between file types. |
159 |
+ """ |
160 |
+ first = a.file_type |
161 |
+ second = b.file_type |
162 |
+ if first == second: |
163 |
+ return False |
164 |
+ |
165 |
+ if first == "EBUILD": |
166 |
+ return True |
167 |
+ elif first == "MISC": |
168 |
+ return second in ("EBUILD",) |
169 |
+ elif first == "AUX": |
170 |
+ return second in ("EBUILD", "MISC") |
171 |
+ elif first == "DIST": |
172 |
+ return second in ("EBUILD", "MISC", "AUX") |
173 |
+ elif first is None: |
174 |
+ return False |
175 |
+ else: |
176 |
+ raise ValueError("Unknown file type '%s'" % first) |
177 |
+ |
178 |
+ def __lt__(self, other): |
179 |
+ """ |
180 |
+ Compare different file names, first by file type and then |
181 |
+ for ebuilds by version and lexicographically for others. |
182 |
+ EBUILD < MISC < AUX < DIST < None |
183 |
+ """ |
184 |
+ if self.__class__ != other.__class__: |
185 |
+ raise NotImplementedError |
186 |
+ |
187 |
+ # Sort by file type as defined by file_type_lt(). |
188 |
+ if self.file_type_lt(self, other): |
189 |
+ return True |
190 |
+ elif self.file_type_lt(other, self): |
191 |
+ return False |
192 |
+ |
193 |
+ # Files have the same type. |
194 |
+ if self.file_type == "EBUILD": |
195 |
+ # Sort by version. Lowest first. |
196 |
+ ver = "-".join(pkgsplit(self.file_name[:-7])[1:3]) |
197 |
+ other_ver = "-".join(pkgsplit(other.file_name[:-7])[1:3]) |
198 |
+ return vercmp(ver, other_ver) < 0 |
199 |
+ else: |
200 |
+ # Sort lexicographically. |
201 |
+ return self.file_name < other.file_name |
202 |
-- |
203 |
2.9.3 |
204 |
|
205 |
|
206 |
-- |
207 |
Brian Dolbec <dolsen> |