Merge lp:~sergiusens/snapcraft/split-up-collect into lp:~snappy-dev/snapcraft/core

Proposed by Sergio Schvezov
Status: Merged
Approved by: Leo Arias
Approved revision: 144
Merged at revision: 144
Proposed branch: lp:~sergiusens/snapcraft/split-up-collect
Merge into: lp:~snappy-dev/snapcraft/core
Diff against target: 106 lines (+56/-34)
1 file modified
snapcraft/plugin.py (+56/-34)
To merge this branch: bzr merge lp:~sergiusens/snapcraft/split-up-collect
Reviewer Review Type Date Requested Status
Leo Arias (community) Approve
Review via email: mp+269519@code.launchpad.net

Commit message

Reducing mccabe complexity from 10 to 3 for PluginHandler.collect_snap_files

Description of the change

From
python3 -m mccabe --min 10 snapcraft/plugin.py
215:1: 'PluginHandler.collect_snap_files' 10

To
python3 -m mccabe --min 3 snapcraft/plugin.py
215:1: 'PluginHandler.collect_snap_files' 3

The split out functions are at 5 for the highest.

This is all tested by collect_snap_files' tests

To post a comment you must log in.
Revision history for this message
Leo Arias (elopio) :
review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'snapcraft/plugin.py'
--- snapcraft/plugin.py 2015-08-26 08:52:09 +0000
+++ snapcraft/plugin.py 2015-08-28 15:41:33 +0000
@@ -214,42 +214,16 @@
214214
215 def collect_snap_files(self, includes, excludes):215 def collect_snap_files(self, includes, excludes):
216 # validate216 # validate
217 for d in includes + excludes:217 _validate_relative_paths(includes + excludes)
218 if os.path.isabs(d):218
219 raise PluginError("path '{}' must be relative".format(d))219 source_files = _generate_source_set(self.installdir)
220220 include_files = _generate_include_set(self.stagedir, includes)
221 sourceFiles = set()221 exclude_files, exclude_dirs = _generate_exclude_set(self.stagedir, excludes)
222 for root, dirs, files in os.walk(self.installdir):
223 sourceFiles |= set([os.path.join(root, d) for d in dirs])
224 sourceFiles |= set([os.path.join(root, f) for f in files])
225 sourceFiles = set([os.path.relpath(x, self.installdir) for x in sourceFiles])
226
227 includeFiles = set()
228 for include in includes:
229 matches = glob.glob(os.path.join(self.stagedir, include))
230 includeFiles |= set(matches)
231 includeDirs = [x for x in includeFiles if os.path.isdir(x)]
232 includeFiles = set([os.path.relpath(x, self.stagedir) for x in includeFiles])
233
234 # Expand includeFiles, so that an exclude like '*/*.so' will still match
235 # files from an include like 'lib'
236 for includeDir in includeDirs:
237 for root, dirs, files in os.walk(includeDir):
238 includeFiles |= set([os.path.relpath(os.path.join(root, d), self.stagedir) for d in dirs])
239 includeFiles |= set([os.path.relpath(os.path.join(root, f), self.stagedir) for f in files])
240
241 # Grab exclude list
242 excludeFiles = set()
243 for exclude in excludes:
244 matches = glob.glob(os.path.join(self.stagedir, exclude))
245 excludeFiles |= set(matches)
246 excludeDirs = [os.path.relpath(x, self.stagedir) for x in excludeFiles if os.path.isdir(x)]
247 excludeFiles = set([os.path.relpath(x, self.stagedir) for x in excludeFiles])
248222
249 # And chop files, including whole trees if any dirs are mentioned223 # And chop files, including whole trees if any dirs are mentioned
250 snap_files = (includeFiles & sourceFiles) - excludeFiles224 snap_files = (include_files & source_files) - exclude_files
251 for excludeDir in excludeDirs:225 for exclude_dir in exclude_dirs:
252 snap_files = set([x for x in snap_files if not x.startswith(excludeDir + '/')])226 snap_files = set([x for x in snap_files if not x.startswith(exclude_dir + '/')])
253227
254 # Separate dirs from files228 # Separate dirs from files
255 snap_dirs = set([x for x in snap_files if os.path.isdir(os.path.join(self.stagedir, x)) and not os.path.islink(os.path.join(self.stagedir, x))])229 snap_dirs = set([x for x in snap_files if os.path.isdir(os.path.join(self.stagedir, x)) and not os.path.islink(os.path.join(self.stagedir, x))])
@@ -269,3 +243,51 @@
269 logger.error('Could not load part %s', plugin_name)243 logger.error('Could not load part %s', plugin_name)
270 sys.exit(1)244 sys.exit(1)
271 return part245 return part
246
247
248def _generate_source_set(installdir):
249 source_files = set()
250 for root, dirs, files in os.walk(installdir):
251 source_files |= set([os.path.join(root, d) for d in dirs])
252 source_files |= set([os.path.join(root, f) for f in files])
253 source_files = set([os.path.relpath(x, installdir) for x in source_files])
254
255 return source_files
256
257
258def _generate_include_set(stagedir, includes):
259 include_files = set()
260 for include in includes:
261 matches = glob.glob(os.path.join(stagedir, include))
262 include_files |= set(matches)
263
264 include_dirs = [x for x in include_files if os.path.isdir(x)]
265 include_files = set([os.path.relpath(x, stagedir) for x in include_files])
266
267 # Expand includeFiles, so that an exclude like '*/*.so' will still match
268 # files from an include like 'lib'
269 for include_dir in include_dirs:
270 for root, dirs, files in os.walk(include_dir):
271 include_files |= set([os.path.relpath(os.path.join(root, d), stagedir) for d in dirs])
272 include_files |= set([os.path.relpath(os.path.join(root, f), stagedir) for f in files])
273
274 return include_files
275
276
277def _generate_exclude_set(stagedir, excludes):
278 exclude_files = set()
279
280 for exclude in excludes:
281 matches = glob.glob(os.path.join(stagedir, exclude))
282 exclude_files |= set(matches)
283
284 exclude_dirs = [os.path.relpath(x, stagedir) for x in exclude_files if os.path.isdir(x)]
285 exclude_files = set([os.path.relpath(x, stagedir) for x in exclude_files])
286
287 return exclude_files, exclude_dirs
288
289
290def _validate_relative_paths(files):
291 for d in files:
292 if os.path.isabs(d):
293 raise PluginError("path '{}' must be relative".format(d))

Subscribers

People subscribed via source and target branches