1/*
2 * Copyright (c) 2021-2024, Arm Limited. All rights reserved.
3 *
4 * SPDX-License-Identifier: BSD-3-Clause
5 */
6
7/* eslint-env es6 */
8
9"use strict";
10
11const fs = require("fs");
12const yaml = require("js-yaml");
13
14/*
15 * The types and scopes accepted by both Commitlint and Commitizen are defined by the changelog
16 * configuration file - `changelog.yaml` - as they decide which section of the changelog commits
17 * with a given type and scope are placed in.
18 */
19
20let changelog;
21
22try {
23    const contents = fs.readFileSync("changelog.yaml", "utf8");
24
25    changelog = yaml.load(contents);
26} catch (err) {
27    console.log(err);
28
29    throw err;
30}
31
32/*
33 * The next couple of functions are just used to transform the changelog YAML configuration
34 * structure into one accepted by the Conventional Changelog adapter (conventional-changelog-tf-a).
35 */
36
37function getTypes(sections) {
38    return sections.map(section => {
39        return {
40            "type": section.type,
41            "section": section.hidden ? undefined : section.title,
42            "hidden": section.hidden || false,
43        };
44    })
45}
46
47function getSections(subsections) {
48    return subsections.flatMap(subsection => {
49        const scope = subsection.scope ? [ subsection.scope ] : [];
50
51        return {
52            "title": subsection.title,
53            "sections": getSections(subsection.subsections || []),
54            "scopes": scope.concat(subsection.deprecated || []),
55        };
56    })
57};
58
59const types = getTypes(changelog.sections);
60const sections = getSections(changelog.subsections);
61
62module.exports = {
63    "header": "# Change Log & Release Notes\n\nThis document contains a summary of the new features, changes, fixes and known\nissues in each release of Trusted Firmware-A.\n",
64    "preset": {
65        "name": "tf-a",
66        "commitUrlFormat": "https://review.trustedfirmware.org/plugins/gitiles/TF-A/trusted-firmware-a/+/{{hash}}",
67        "compareUrlFormat": "https://review.trustedfirmware.org/plugins/gitiles/TF-A/trusted-firmware-a/+/refs/tags/{{previousTag}}..refs/tags/{{currentTag}}",
68        "userUrlFormat": "https://github.com/{{user}}",
69
70        "types": types,
71        "sections": sections,
72    },
73    "infile": "docs/change-log.md",
74    "skip": {
75        "commit": true,
76        "tag": true
77    },
78    "bumpFiles": [
79        {
80            "filename": "package.json",
81            "type": "json"
82        },
83        {
84            "filename": "pyproject.toml",
85            "updater": {
86                "readVersion": function (contents) {
87                    const _ver = contents.match(/version\s=.*"(\d+?)\.(\d+?)\.(\d+?)/);
88
89                    return `${_ver[1]}.${_ver[2]}.${_ver[3]}`;
90                },
91
92                "writeVersion": function (contents, version) {
93                    const _ver = 'version = "' + version + '"'
94
95                    return contents.replace(/^(version\s=\s")((\d).?)*$/m, _ver)
96                }
97            },
98        },
99        {
100            "filename": "package-lock.json",
101            "type": "json"
102        },
103        {
104            "filename": "docs/conf.py",
105            "updater": {
106                "readVersion": function (contents) {
107                    const _ver = contents.match(/version\s=.*"(\d+?)\.(\d+?)\.(\d+?)/);
108
109                    return `${_ver[1]}.${_ver[2]}.${_ver[3]}`;
110                },
111
112                "writeVersion": function (contents, version) {
113                    const _ver = 'version = "' + version + '"'
114                    const _rel = 'release = "' + version + '"'
115
116                    contents = contents.replace(/^(version\s=\s")((\d).?)*$/m, _ver)
117                    contents = contents.replace(/^(release\s=\s")((\d).?)*$/m, _rel)
118                    return contents
119                }
120            },
121        },
122        {
123            "filename": "tools/conventional-changelog-tf-a/package.json",
124            "type": "json"
125        },
126        {
127            "filename": "Makefile",
128            "updater": {
129                "readVersion": function (contents) {
130                    const major = contents.match(/^VERSION_MAJOR\s*:=\s*(\d+?)$/m)[1];
131                    const minor = contents.match(/^VERSION_MINOR\s*:=\s*(\d+?)$/m)[1];
132                    const patch = contents.match(/^VERSION_PATCH\s*:=\s*(\d+?)$/m)[1];
133
134                    return `${major}.${minor}.${patch}`;
135                },
136
137                "writeVersion": function (contents, version) {
138                    const major = version.split(".")[0];
139                    const minor = version.split(".")[1];
140                    const patch = version.split(".")[2];
141
142                    contents = contents.replace(/^(VERSION_MAJOR\s*:=\s*)(\d+?)$/m, `$1${major}`);
143                    contents = contents.replace(/^(VERSION_MINOR\s*:=\s*)(\d+?)$/m, `$1${minor}`);
144                    contents = contents.replace(/^(VERSION_PATCH\s*:=\s*)(\d+?)$/m, `$1${patch}`);
145
146                    return contents;
147                }
148            }
149        }
150    ]
151};
152