Skip to content

Commit

Permalink
Bug 1392795 - [yamllint] Group paths to lint by their closest config …
Browse files Browse the repository at this point in the history
…and run each config group separately, r=dustin

This makes configuration files for yamllint work a bit better. It's still not perfect, but it's an improvement
on the current situation.

MozReview-Commit-ID: IKxgQm1a7bP

--HG--
extra : rebase_source : 051fafe21337f0557ee39ec71c90e74fd61d3da7
  • Loading branch information
ahal committed Aug 23, 2017
1 parent fff5992 commit 115f346
Show file tree
Hide file tree
Showing 3 changed files with 38 additions and 13 deletions.
5 changes: 5 additions & 0 deletions .yamllint
@@ -0,0 +1,5 @@
---
ignore: |
*node_modules*

extends: default
2 changes: 2 additions & 0 deletions taskcluster/.yamllint
@@ -1,4 +1,6 @@
---
ignore: |
*node_modules*

extends: default

Expand Down
44 changes: 31 additions & 13 deletions tools/lint/yamllint_/__init__.py
Expand Up @@ -6,6 +6,7 @@
import os
import signal
import subprocess
from collections import defaultdict

import which
from mozprocess import ProcessHandlerMixin
Expand Down Expand Up @@ -114,13 +115,35 @@ def gen_yamllint_args(cmdargs, paths=None, conf_file=None):
args = cmdargs[:]
if isinstance(paths, basestring):
paths = [paths]
if conf_file:
if conf_file and conf_file != 'default':
return args + ['-c', conf_file] + paths
return args + paths


def lint(files, config, **lintargs):
def ancestors(path):
while path:
yield path
(path, child) = os.path.split(path)
if child == "":
break


def get_relevant_configs(name, path, root):
"""Returns a list of configuration files that exist in `path`'s ancestors,
sorted from closest->furthest.
"""
configs = []
for path in ancestors(path):
if path == root:
break

config = os.path.join(path, name)
if os.path.isfile(config):
configs.append(config)
return configs


def lint(files, config, **lintargs):
if not reinstall_yamllint():
print(YAMLLINT_INSTALL_ERROR)
return 1
Expand All @@ -138,17 +161,12 @@ def lint(files, config, **lintargs):
# Run any paths with a .yamllint file in the directory separately so
# it gets picked up. This means only .yamllint files that live in
# directories that are explicitly included will be considered.
no_config = []
paths_by_config = defaultdict(list)
for f in files:
yamllint_config = os.path.join(f, '.yamllint')
if not os.path.isfile(yamllint_config):
no_config.append(f)
continue
run_process(config,
gen_yamllint_args(cmdargs, conf_file=yamllint_config, paths=f))

if no_config:
run_process(config,
gen_yamllint_args(cmdargs, paths=no_config))
conf_files = get_relevant_configs('.yamllint', f, config['root'])
paths_by_config[conf_files[0] if conf_files else 'default'].append(f)

for conf_file, paths in paths_by_config.items():
run_process(config, gen_yamllint_args(cmdargs, conf_file=conf_file, paths=paths))

return results

0 comments on commit 115f346

Please sign in to comment.