1 |
commit: befc99fa5ff79af530be6e3126a300e182866a2f |
2 |
Author: Brian Dolbec <dolsen <AT> gentoo <DOT> org> |
3 |
AuthorDate: Sat Sep 19 02:07:27 2015 +0000 |
4 |
Commit: Brian Dolbec <dolsen <AT> gentoo <DOT> org> |
5 |
CommitDate: Mon Sep 21 23:42:46 2015 +0000 |
6 |
URL: https://gitweb.gentoo.org/proj/portage.git/commit/?id=befc99fa |
7 |
|
8 |
repoman/actions.py: Break out changes detectection into sudo vcs plugins |
9 |
|
10 |
pym/repoman/actions.py | 215 +++++++++++++++++++++++++++---------------------- |
11 |
1 file changed, 120 insertions(+), 95 deletions(-) |
12 |
|
13 |
diff --git a/pym/repoman/actions.py b/pym/repoman/actions.py |
14 |
index 611c0dd..1f70815 100644 |
15 |
--- a/pym/repoman/actions.py |
16 |
+++ b/pym/repoman/actions.py |
17 |
@@ -74,102 +74,9 @@ class Actions(object): |
18 |
|
19 |
self._vcs_deleted(mydeleted) |
20 |
|
21 |
- if self.vcs_settings.vcs == "cvs": |
22 |
- mycvstree = cvstree.getentries("./", recursive=1) |
23 |
- mychanged = cvstree.findchanged(mycvstree, recursive=1, basedir="./") |
24 |
- mynew = cvstree.findnew(mycvstree, recursive=1, basedir="./") |
25 |
- myremoved = portage.cvstree.findremoved(mycvstree, recursive=1, basedir="./") |
26 |
- bin_blob_pattern = re.compile("^-kb$") |
27 |
- no_expansion = set(portage.cvstree.findoption( |
28 |
- mycvstree, bin_blob_pattern, recursive=1, basedir="./")) |
29 |
- |
30 |
- if self.vcs_settings.vcs == "svn": |
31 |
- with repoman_popen("svn status") as f: |
32 |
- svnstatus = f.readlines() |
33 |
- mychanged = [ |
34 |
- "./" + elem.split()[-1:][0] |
35 |
- for elem in svnstatus |
36 |
- if (elem[:1] in "MR" or elem[1:2] in "M")] |
37 |
- mynew = [ |
38 |
- "./" + elem.split()[-1:][0] |
39 |
- for elem in svnstatus |
40 |
- if elem.startswith("A")] |
41 |
- myremoved = [ |
42 |
- "./" + elem.split()[-1:][0] |
43 |
- for elem in svnstatus |
44 |
- if elem.startswith("D")] |
45 |
- |
46 |
- # Subversion expands keywords specified in svn:keywords properties. |
47 |
- with repoman_popen("svn propget -R svn:keywords") as f: |
48 |
- props = f.readlines() |
49 |
- expansion = dict( |
50 |
- ("./" + prop.split(" - ")[0], prop.split(" - ")[1].split()) |
51 |
- for prop in props if " - " in prop) |
52 |
- |
53 |
- elif self.vcs_settings.vcs == "git": |
54 |
- with repoman_popen( |
55 |
- "git diff-index --name-only " |
56 |
- "--relative --diff-filter=M HEAD") as f: |
57 |
- mychanged = f.readlines() |
58 |
- mychanged = ["./" + elem[:-1] for elem in mychanged] |
59 |
- |
60 |
- with repoman_popen( |
61 |
- "git diff-index --name-only " |
62 |
- "--relative --diff-filter=A HEAD") as f: |
63 |
- mynew = f.readlines() |
64 |
- mynew = ["./" + elem[:-1] for elem in mynew] |
65 |
- |
66 |
- with repoman_popen( |
67 |
- "git diff-index --name-only " |
68 |
- "--relative --diff-filter=D HEAD") as f: |
69 |
- myremoved = f.readlines() |
70 |
- myremoved = ["./" + elem[:-1] for elem in myremoved] |
71 |
- |
72 |
- if self.vcs_settings.vcs == "bzr": |
73 |
- with repoman_popen("bzr status -S .") as f: |
74 |
- bzrstatus = f.readlines() |
75 |
- mychanged = [ |
76 |
- "./" + elem.split()[-1:][0].split('/')[-1:][0] |
77 |
- for elem in bzrstatus |
78 |
- if elem and elem[1:2] == "M"] |
79 |
- mynew = [ |
80 |
- "./" + elem.split()[-1:][0].split('/')[-1:][0] |
81 |
- for elem in bzrstatus |
82 |
- if elem and (elem[1:2] in "NK" or elem[0:1] == "R")] |
83 |
- myremoved = [ |
84 |
- "./" + elem.split()[-1:][0].split('/')[-1:][0] |
85 |
- for elem in bzrstatus |
86 |
- if elem.startswith("-")] |
87 |
- myremoved = [ |
88 |
- "./" + elem.split()[-3:-2][0].split('/')[-1:][0] |
89 |
- for elem in bzrstatus |
90 |
- if elem and (elem[1:2] == "K" or elem[0:1] == "R")] |
91 |
- # Bazaar expands nothing. |
92 |
- |
93 |
- if self.vcs_settings.vcs == "hg": |
94 |
- with repoman_popen("hg status --no-status --modified .") as f: |
95 |
- mychanged = f.readlines() |
96 |
- mychanged = ["./" + elem.rstrip() for elem in mychanged] |
97 |
- |
98 |
- with repoman_popen("hg status --no-status --added .") as f: |
99 |
- mynew = f.readlines() |
100 |
- mynew = ["./" + elem.rstrip() for elem in mynew] |
101 |
- |
102 |
- with repoman_popen("hg status --no-status --removed .") as f: |
103 |
- myremoved = f.readlines() |
104 |
- myremoved = ["./" + elem.rstrip() for elem in myremoved] |
105 |
+ changes = self.get_vcs_changed(mydeleted) |
106 |
|
107 |
- if self.vcs_settings.vcs: |
108 |
- a_file_is_changed = mychanged or mynew or myremoved |
109 |
- a_file_is_deleted_hg = self.vcs_settings.vcs == "hg" and mydeleted |
110 |
- |
111 |
- if not (a_file_is_changed or a_file_is_deleted_hg): |
112 |
- utilities.repoman_sez( |
113 |
- "\"Doing nothing is not always good for QA.\"") |
114 |
- print() |
115 |
- print("(Didn't find any changed files...)") |
116 |
- print() |
117 |
- sys.exit(1) |
118 |
+ mynew, mychanged, myremoved, no_expansion, expansion = changes |
119 |
|
120 |
# Manifests need to be regenerated after all other commits, so don't commit |
121 |
# them now even if they have changed. |
122 |
@@ -772,3 +679,121 @@ class Actions(object): |
123 |
print() |
124 |
print() |
125 |
sys.exit(1) |
126 |
+ |
127 |
+ |
128 |
+ def get_vcs_changed(self, mydeleted): |
129 |
+ '''Holding function which calls the approriate VCS module for the data''' |
130 |
+ changed = ([], [], [], [], []) |
131 |
+ if self.vcs_settings.vcs: |
132 |
+ vcs_module = getattr(self, '_get_changed_%s_' % self.vcs_settings.vcs) |
133 |
+ changed = vcs_module(mydeleted) |
134 |
+ mynew, mychanged, myremoved, no_expansion, expansion = changed |
135 |
+ |
136 |
+ a_file_is_changed = mychanged or mynew or myremoved |
137 |
+ a_file_is_deleted_hg = self.vcs_settings.vcs == "hg" and mydeleted |
138 |
+ |
139 |
+ if not (a_file_is_changed or a_file_is_deleted_hg): |
140 |
+ utilities.repoman_sez( |
141 |
+ "\"Doing nothing is not always good for QA.\"") |
142 |
+ print() |
143 |
+ print("(Didn't find any changed files...)") |
144 |
+ print() |
145 |
+ sys.exit(1) |
146 |
+ return changed |
147 |
+ |
148 |
+ |
149 |
+ def _get_changed_cvs_(self, mydeleted): |
150 |
+ mycvstree = cvstree.getentries("./", recursive=1) |
151 |
+ mychanged = cvstree.findchanged(mycvstree, recursive=1, basedir="./") |
152 |
+ mynew = cvstree.findnew(mycvstree, recursive=1, basedir="./") |
153 |
+ myremoved = portage.cvstree.findremoved(mycvstree, recursive=1, basedir="./") |
154 |
+ bin_blob_pattern = re.compile("^-kb$") |
155 |
+ no_expansion = set(portage.cvstree.findoption( |
156 |
+ mycvstree, bin_blob_pattern, recursive=1, basedir="./")) |
157 |
+ expansion = {} |
158 |
+ return (mynew, mychanged, myremoved, no_expansion, expansion) |
159 |
+ |
160 |
+ def _get_changed_svn_(self, mydeleted): |
161 |
+ with repoman_popen("svn status") as f: |
162 |
+ svnstatus = f.readlines() |
163 |
+ mychanged = [ |
164 |
+ "./" + elem.split()[-1:][0] |
165 |
+ for elem in svnstatus |
166 |
+ if (elem[:1] in "MR" or elem[1:2] in "M")] |
167 |
+ mynew = [ |
168 |
+ "./" + elem.split()[-1:][0] |
169 |
+ for elem in svnstatus |
170 |
+ if elem.startswith("A")] |
171 |
+ myremoved = [ |
172 |
+ "./" + elem.split()[-1:][0] |
173 |
+ for elem in svnstatus |
174 |
+ if elem.startswith("D")] |
175 |
+ # Subversion expands keywords specified in svn:keywords properties. |
176 |
+ with repoman_popen("svn propget -R svn:keywords") as f: |
177 |
+ props = f.readlines() |
178 |
+ expansion = dict( |
179 |
+ ("./" + prop.split(" - ")[0], prop.split(" - ")[1].split()) |
180 |
+ for prop in props if " - " in prop) |
181 |
+ no_expansion = set() |
182 |
+ return (mynew, mychanged, myremoved, no_expansion, expansion) |
183 |
+ |
184 |
+ def _get_changed_git_(self, mydeleted): |
185 |
+ with repoman_popen( |
186 |
+ "git diff-index --name-only " |
187 |
+ "--relative --diff-filter=M HEAD") as f: |
188 |
+ mychanged = f.readlines() |
189 |
+ mychanged = ["./" + elem[:-1] for elem in mychanged] |
190 |
+ with repoman_popen( |
191 |
+ "git diff-index --name-only " |
192 |
+ "--relative --diff-filter=A HEAD") as f: |
193 |
+ mynew = f.readlines() |
194 |
+ mynew = ["./" + elem[:-1] for elem in mynew] |
195 |
+ with repoman_popen( |
196 |
+ "git diff-index --name-only " |
197 |
+ "--relative --diff-filter=D HEAD") as f: |
198 |
+ myremoved = f.readlines() |
199 |
+ myremoved = ["./" + elem[:-1] for elem in myremoved] |
200 |
+ no_expansion = set() |
201 |
+ expansion = {} |
202 |
+ return (mynew, mychanged, myremoved, no_expansion, expansion) |
203 |
+ |
204 |
+ def _get_changed_bzr_(self, mydeleted): |
205 |
+ with repoman_popen("bzr status -S .") as f: |
206 |
+ bzrstatus = f.readlines() |
207 |
+ mychanged = [ |
208 |
+ "./" + elem.split()[-1:][0].split('/')[-1:][0] |
209 |
+ for elem in bzrstatus |
210 |
+ if elem and elem[1:2] == "M"] |
211 |
+ mynew = [ |
212 |
+ "./" + elem.split()[-1:][0].split('/')[-1:][0] |
213 |
+ for elem in bzrstatus |
214 |
+ if elem and (elem[1:2] in "NK" or elem[0:1] == "R")] |
215 |
+ myremoved = [ |
216 |
+ "./" + elem.split()[-1:][0].split('/')[-1:][0] |
217 |
+ for elem in bzrstatus |
218 |
+ if elem.startswith("-")] |
219 |
+ myremoved = [ |
220 |
+ "./" + elem.split()[-3:-2][0].split('/')[-1:][0] |
221 |
+ for elem in bzrstatus |
222 |
+ if elem and (elem[1:2] == "K" or elem[0:1] == "R")] |
223 |
+ # Bazaar expands nothing. |
224 |
+ no_expansion = set() |
225 |
+ expansion = {} |
226 |
+ return (mynew, mychanged, myremoved, no_expansion, expansion) |
227 |
+ |
228 |
+ def _get_changed_hg_(self, mydeleted): |
229 |
+ with repoman_popen("hg status --no-status --modified .") as f: |
230 |
+ mychanged = f.readlines() |
231 |
+ mychanged = ["./" + elem.rstrip() for elem in mychanged] |
232 |
+ |
233 |
+ with repoman_popen("hg status --no-status --added .") as f: |
234 |
+ mynew = f.readlines() |
235 |
+ mynew = ["./" + elem.rstrip() for elem in mynew] |
236 |
+ |
237 |
+ with repoman_popen("hg status --no-status --removed .") as f: |
238 |
+ myremoved = f.readlines() |
239 |
+ myremoved = ["./" + elem.rstrip() for elem in myremoved] |
240 |
+ no_expansion = set() |
241 |
+ expansion = {} |
242 |
+ return (mynew, mychanged, myremoved, no_expansion, expansion) |
243 |
+ |