Gentoo Archives: gentoo-portage-dev

From: Brian Dolbec <dolsen@g.o>
To: gentoo-portage-dev@l.g.o
Subject: [gentoo-portage-dev] [PATCH] egencache: Migrate _special_filename class to portage.utils.changelog for api use
Date: Sat, 03 Dec 2016 21:50:10
Message-Id: 20161203134958.03789579.dolsen@gentoo.org
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>

Replies