xref: /rk3399_ARM-atf/.commitlintrc.js (revision f64c55826eb123f7bb5aae402d8885344fe1bd66)
1fa3a1382SChris Kay/*
2fa3a1382SChris Kay * Copyright (c) 2021, Arm Limited. All rights reserved.
3fa3a1382SChris Kay *
4fa3a1382SChris Kay * SPDX-License-Identifier: BSD-3-Clause
5fa3a1382SChris Kay */
6fa3a1382SChris Kay
7fa3a1382SChris Kay/* eslint-env es6 */
8fa3a1382SChris Kay
9fa3a1382SChris Kay"use strict";
10fa3a1382SChris Kay
11*f64c5582SChris Kayconst fs = require("fs");
12*f64c5582SChris Kayconst yaml = require("js-yaml");
13*f64c5582SChris Kay
14fa3a1382SChris Kayconst { "trailer-exists": trailerExists } = require("@commitlint/rules").default;
15fa3a1382SChris Kay
16c4e8edabSChris Kay/*
17*f64c5582SChris Kay * The types and scopes accepted by both Commitlint and Commitizen are defined by the changelog
18*f64c5582SChris Kay * configuration file - `changelog.yaml` - as they decide which section of the changelog commits
19*f64c5582SChris Kay * with a given type and scope are placed in.
20c4e8edabSChris Kay */
21c4e8edabSChris Kay
22*f64c5582SChris Kaylet changelog;
23*f64c5582SChris Kay
24*f64c5582SChris Kaytry {
25*f64c5582SChris Kay    const contents = fs.readFileSync("changelog.yaml", "utf8");
26*f64c5582SChris Kay
27*f64c5582SChris Kay    changelog = yaml.load(contents);
28*f64c5582SChris Kay} catch (err) {
29*f64c5582SChris Kay    console.log(err);
30*f64c5582SChris Kay
31*f64c5582SChris Kay    throw err;
32*f64c5582SChris Kay}
33*f64c5582SChris Kay
34*f64c5582SChris Kayfunction getTypes(sections) {
35*f64c5582SChris Kay    return sections.map(section => section.type)
36*f64c5582SChris Kay}
37*f64c5582SChris Kay
38*f64c5582SChris Kayfunction getScopes(subsections) {
39*f64c5582SChris Kay    return subsections.flatMap(subsection => {
40*f64c5582SChris Kay        const scope = subsection.scope ?  [ subsection.scope ] : [];
41*f64c5582SChris Kay        const subscopes = getScopes(subsection.subsections || []);
42c4e8edabSChris Kay
43c4e8edabSChris Kay        return scope.concat(subscopes);
44c4e8edabSChris Kay    })
45c4e8edabSChris Kay};
46c4e8edabSChris Kay
47*f64c5582SChris Kayconst types = getTypes(changelog.sections).sort(); /* Sort alphabetically */
48*f64c5582SChris Kayconst scopes = getScopes(changelog.subsections).sort(); /* Sort alphabetically */
49c4e8edabSChris Kay
50fa3a1382SChris Kaymodule.exports = {
51fa3a1382SChris Kay    extends: ["@commitlint/config-conventional"],
52fa3a1382SChris Kay    plugins: [
53fa3a1382SChris Kay        {
54fa3a1382SChris Kay            rules: {
55fa3a1382SChris Kay                "signed-off-by-exists": trailerExists,
56fa3a1382SChris Kay                "change-id-exists": trailerExists,
57fa3a1382SChris Kay            },
58fa3a1382SChris Kay        },
59fa3a1382SChris Kay    ],
60fa3a1382SChris Kay    rules: {
61*f64c5582SChris Kay        "header-max-length": [1, "always", 50], /* Warning */
62*f64c5582SChris Kay        "body-max-line-length": [1, "always", 72], /* Warning */
63fa3a1382SChris Kay
64fa3a1382SChris Kay        "change-id-exists": [1, "always", "Change-Id:"], /* Warning */
65fa3a1382SChris Kay        "signed-off-by-exists": [1, "always", "Signed-off-by:"], /* Warning */
66c4e8edabSChris Kay
67*f64c5582SChris Kay        "type-case": [2, "always", "lower-case" ], /* Error */
68*f64c5582SChris Kay        "type-enum": [2, "always", types], /* Error */
69*f64c5582SChris Kay
70804e52e9SYann Gautier        "scope-case": [2, "always", "lower-case"], /* Error */
71*f64c5582SChris Kay        "scope-empty": [2, "never"], /* Error */
72c4e8edabSChris Kay        "scope-enum": [1, "always", scopes] /* Warning */
73fa3a1382SChris Kay    },
74fa3a1382SChris Kay};
75