aboutsummaryrefslogtreecommitdiff
path: root/mesonbuild/scripts
diff options
context:
space:
mode:
authorXavier Claessens <xavier.claessens@collabora.com>2021-03-09 13:15:06 -0500
committerXavier Claessens <xclaesse@gmail.com>2021-03-16 21:01:54 -0400
commitf55868927721f273640a3ba7a8e703d418a352b6 (patch)
tree813740324e90910f74f57a797b7f933b3ebc2776 /mesonbuild/scripts
parenta45f939092cc2c60d49040bdb0147758a1403f61 (diff)
downloadmeson-f55868927721f273640a3ba7a8e703d418a352b6.zip
meson-f55868927721f273640a3ba7a8e703d418a352b6.tar.gz
meson-f55868927721f273640a3ba7a8e703d418a352b6.tar.bz2
clangformat: Add include and ignore files
Diffstat (limited to 'mesonbuild/scripts')
-rw-r--r--mesonbuild/scripts/clangformat.py50
1 files changed, 39 insertions, 11 deletions
diff --git a/mesonbuild/scripts/clangformat.py b/mesonbuild/scripts/clangformat.py
index 062cb43..2cf757f 100644
--- a/mesonbuild/scripts/clangformat.py
+++ b/mesonbuild/scripts/clangformat.py
@@ -12,38 +12,66 @@
# See the License for the specific language governing permissions and
# limitations under the License.
-import pathlib
import subprocess
+import itertools
+import fnmatch
+from pathlib import Path
from concurrent.futures import ThreadPoolExecutor
from ..environment import detect_clangformat
from ..compilers import lang_suffixes
import typing as T
-def clangformat(exelist: T.List[str], srcdir_name: str, builddir_name: str) -> int:
- srcdir = pathlib.Path(srcdir_name)
+def parse_pattern_file(fname: Path) -> T.List[str]:
+ patterns = []
+ try:
+ with fname.open(encoding='utf-8') as f:
+ for line in f:
+ pattern = line.strip()
+ if pattern and not pattern.startswith('#'):
+ patterns.append(pattern)
+ except FileNotFoundError:
+ pass
+ return patterns
+
+def run_clang_format(exelist: T.List[str], fname: Path) -> subprocess.CompletedProcess:
+ before = fname.stat().st_mtime
+ ret = subprocess.run(exelist + ['-style=file', '-i', str(fname)])
+ after = fname.stat().st_mtime
+ if before != after:
+ print('File reformatted: ', fname)
+ return ret
+
+def clangformat(exelist: T.List[str], srcdir: Path, builddir: Path) -> int:
+ patterns = parse_pattern_file(srcdir / '.clang-format-include')
+ if not patterns:
+ patterns = ['**/*']
+ globs = [srcdir.glob(p) for p in patterns]
+ patterns = parse_pattern_file(srcdir / '.clang-format-ignore')
+ ignore = [str(builddir / '*')]
+ ignore.extend([str(srcdir / p) for p in patterns])
suffixes = set(lang_suffixes['c']).union(set(lang_suffixes['cpp']))
suffixes.add('h')
+ suffixes = set([f'.{s}' for s in suffixes])
futures = []
returncode = 0
with ThreadPoolExecutor() as e:
- for f in (x for suff in suffixes for x in srcdir.glob('**/*.' + suff)):
- if f.is_dir():
- continue
+ for f in itertools.chain(*globs):
strf = str(f)
- if strf.startswith(builddir_name):
+ if f.is_dir() or f.suffix not in suffixes or \
+ any(fnmatch.fnmatch(strf, i) for i in ignore):
continue
- futures.append(e.submit(subprocess.run, exelist + ['-style=file', '-i', strf]))
+ futures.append(e.submit(run_clang_format, exelist, f))
returncode = max([x.result().returncode for x in futures])
return returncode
def run(args: T.List[str]) -> int:
- srcdir_name = args[0]
- builddir_name = args[1]
+ srcdir = Path(args[0])
+ builddir = Path(args[1])
exelist = detect_clangformat()
if not exelist:
print('Could not execute clang-format "%s"' % ' '.join(exelist))
return 1
- return clangformat(exelist, srcdir_name, builddir_name)
+ return clangformat(exelist, srcdir, builddir)