Repository navigation
Expand file tree
/
Copy pathcliff.toml
More file actions
251 lines (233 loc) · 16.3 KB
/
Copy pathcliff.toml
File metadata and controls
251 lines (233 loc) · 16.3 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
[changelog]
# changelog header
header = """
<!-- vale off -->
# Changelog\n
All notable changes to this project will be documented in this file.\n
"""
# template for the changelog body
# https://keats.github.io/tera/docs/#introduction
body = """
{% if version %}\
{% if previous.version %}\
## [{{ version | trim_start_matches(pat="v") }}](<REPO>/compare/{{ previous.version }}..{{ version }}) - {{ timestamp | date(format="%Y-%m-%d") }}
{% else %}\
## [{{ version | trim_start_matches(pat="v") }}] - {{ timestamp | date(format="%Y-%m-%d") }}
{% endif %}\
{% else %}\
## [unreleased]
{% endif %}\
{% macro commit(commit) -%}
- {% if commit.scope %}*({{ commit.scope }})* {% endif %}{% if commit.breaking %}[**breaking**] {% endif %}\
{{ commit.message | split(pat="\n") | first }} - ([{{ commit.id | truncate(length=7, end="") }}](<REPO>/commit/{{ commit.id }}))\
{% endmacro %}
{% for group, commits in commits | group_by(attribute="group") %}
### {{ group | striptags | trim | upper_first }}
{% for commit in commits
| filter(attribute="scope")
| sort(attribute="scope") %}
{{ self::commit(commit=commit) }}
{%- endfor -%}
{% raw %}\n{% endraw %}\
{%- for commit in commits %}
{%- if not commit.scope -%}
{{ self::commit(commit=commit) }}
{% endif -%}
{% endfor -%}
{% endfor %}\n
"""
# template for the changelog footer
footer = """
<!-- generated by git-cliff -->
<!-- vale on -->
"""
# remove the leading and trailing whitespace from the templates
trim = true
# postprocessors
postprocessors = [
{ pattern = '<REPO>', replace = "https://github.com/TraceMachina/nativelink" }, # replace repository URL
]
[git]
# parse the commits based on https://www.conventionalcommits.org
conventional_commits = true
# filter out the commits that are not conventional
filter_unconventional = false
# process each line of a commit as an individual commit
split_commits = false
# regex for preprocessing the commit messages
commit_preprocessors = [
{ pattern = '\((\w+\s)?#([0-9]+)\)', replace = "([#${2}](<REPO>/issues/${2}))" },
{ pattern = 'a license to protect the team', replace = 'Extended license to FSL-Apache' },
]
# regex for parsing and grouping commits
commit_parsers = [
{ message = "Fix a blocking-pool deadlock", group = "<!-- 2 -->🐛 Bug Fixes" },
{ message = "Pipeline BEP stream store writes", group = "<!-- 2 -->🐛 Bug Fixes" },
{ message = "tolerate backwards clock steps in worker liveness refresh", group = "<!-- 2 -->🐛 Bug Fixes" },
# The config reference is regenerated by a workflow on every release tag, so
# its commit says nothing a reader of the changelog needs. Matched on the
# scope, because conventional_commits puts "config-reference" there and the
# message parsers only see the description.
{ field = "scope", pattern = "config-reference", skip = true },
# The llms files are regenerated by a workflow too; same reasoning.
{ field = "scope", pattern = "llms", skip = true },
# Custom rules for specific commits.
# v1.7.7: pinned by subject, since their bodies trip the generic word rules.
{ message = "Clear a read-only tree without changing the mode", group = "<!-- 2 -->🐛 Bug Fixes" },
{ message = "Count retries, recoveries and exhausted retries per client", group = "<!-- 1 -->⛰️ Features" },
{ message = "Fetch an input again when the store evicts it", group = "<!-- 2 -->🐛 Bug Fixes" },
{ message = "Hold a worker for a queued action whose reservation only fits an idle one", group = "<!-- 1 -->⛰️ Features" },
{ message = "Honor Retry-After on throttled Azure blob responses", group = "<!-- 1 -->⛰️ Features" },
{ message = "Record the input fetch retry outcome under a prefixed attribute", group = "<!-- 6 -->⚙️ Miscellaneous" },
{ message = "Relink an input whose blob was evicted during staging", group = "<!-- 2 -->🐛 Bug Fixes" },
{ message = "Report queued and executing actions by age", group = "<!-- 1 -->⛰️ Features" },
{ message = "Report running operations on the worker keepalive", group = "<!-- 2 -->🐛 Bug Fixes" },
{ message = "Resolve a forwarded operation name by its configured instance", group = "<!-- 2 -->🐛 Bug Fixes" },
{ message = "Retry an action's input fetch on the worker after a transient store failure", group = "<!-- 1 -->⛰️ Features" },
{ message = "Sweep executing actions on the scheduler's clock", group = "<!-- 2 -->🐛 Bug Fixes" },
{ message = "Worker match logging off by default", group = "<!-- 2 -->🐛 Bug Fixes" },
{ message = "cut CI log noise so real failures stand out", group = "<!-- 4 -->🧪 Testing & CI" },
{ message = "Resend a retried event-sink write from offset zero", group = "<!-- 2 -->🐛 Bug Fixes" },
{ message = "Drop hint dimensions the ladder does not reserve", group = "<!-- 2 -->🐛 Bug Fixes" },
{ message = "Dispatch is acknowledged or declined by the worker", group = "<!-- 1 -->⛰️ Features" },
{ message = "Give a live worker a grace period to report its own timeout", group = "<!-- 2 -->🐛 Bug Fixes" },
{ message = "Give the oversized-upload store tests the 30 s deadline", group = "<!-- 4 -->🧪 Testing & CI" },
{ message = "Give trivy three vulnerability database mirrors", group = "<!-- 4 -->🧪 Testing & CI" },
{ message = "GoingAway with a drain flag, reconnect backoff with jitter", group = "<!-- 1 -->⛰️ Features" },
{ message = "RESP3 cursor pages, the retention default", group = "<!-- 1 -->⛰️ Features" },
{ message = "SIGTERM grace before the kill, output kept", group = "<!-- 1 -->⛰️ Features" },
{ message = "Scheduler skips and counts a queue entry it cannot read", group = "<!-- 2 -->🐛 Bug Fixes" },
{ message = "Serve the scheduler queue in order", group = "<!-- 1 -->⛰️ Features" },
{ message = "Sorted index reads return the whole set", group = "<!-- 2 -->🐛 Bug Fixes" },
{ message = "Support queueing-service through an opt-in gRPC event sink", group = "<!-- 1 -->⛰️ Features" },
{ message = "Worker advertises CPU and memory from its own cgroup limits", group = "<!-- 1 -->⛰️ Features" },
{ message = "Worker readiness follows scheduler registration", group = "<!-- 1 -->⛰️ Features" },
{ message = "a configurable pool with an idle sweeper", group = "<!-- 1 -->⛰️ Features" },
{ message = "a disk soft limit, and peak_disk_kb", group = "<!-- 1 -->⛰️ Features" },
{ message = "a fast tier that ends short on a digest resumes from the slow store", group = "<!-- 2 -->🐛 Bug Fixes" },
{ message = "a read that stops short of the digest's size is an error", group = "<!-- 2 -->🐛 Bug Fixes" },
{ message = "a stalled scheduler connection reconnects instead of leaving the worker evicted", group = "<!-- 2 -->🐛 Bug Fixes" },
{ message = "any message counts, a 10s default", group = "<!-- 1 -->⛰️ Features" },
{ message = "bound output capture, upload fan-out, precondition scripts", group = "<!-- 1 -->⛰️ Features" },
{ message = "bound the input fetch with max_download_timeout", group = "<!-- 1 -->⛰️ Features" },
{ message = "budget released at completion, pause until the next keepalive", group = "<!-- 1 -->⛰️ Features" },
{ message = "build the cleanup mark's guard after the lock is released", group = "<!-- 2 -->🐛 Bug Fixes" },
{ message = "each action gets a private /tmp", group = "<!-- 1 -->⛰️ Features" },
{ message = "hints by digest keys, size classes with a cold-start policy", group = "<!-- 1 -->⛰️ Features" },
{ message = "kill the whole process group when an action times out", group = "<!-- 1 -->⛰️ Features" },
{ message = "list connected workers and queued demand", group = "<!-- 1 -->⛰️ Features" },
{ message = "memory escalation with retry budgets by cause", group = "<!-- 1 -->⛰️ Features" },
{ message = "read capacity and free memory from the worker's own cgroup directory", group = "<!-- 1 -->⛰️ Features" },
{ message = "reaps the zombies actions leave behind", group = "<!-- 1 -->⛰️ Features" },
{ message = "room that opens mid-pass goes to the oldest waiting action", group = "<!-- 1 -->⛰️ Features" },
{ message = "soft memory enforcement against the reservation", group = "<!-- 1 -->⛰️ Features" },
{ message = "the clock follows the fleet's shapes", group = "<!-- 1 -->⛰️ Features" },
{ message = "Account for block size in filesystem store for eviction purposes", group = "<!-- 2 -->🐛 Bug Fixes" },
{ message = "Add ONTAP S3 Store with existence cache", group = "<!-- 1 -->⛰️ Features" },
{ message = "Add OSFamily property in basic_cas.json", group = "<!-- 3 -->📚 Documentation" },
{ message = "Add REAPI content-defined chunking", group = "<!-- 1 -->⛰️ Features" },
{ message = "Add configuration breakdown page", group = "<!-- 3 -->📚 Documentation" },
{ message = "Add rt-tokio feature to aws-sdk-s3", group = "<!-- 2 -->🐛 Bug Fixes" },
{ message = "Add trending badge", group = "<!-- 6 -->⚙️ Miscellaneous" },
{ message = "Azure store: bound a read to the bytes the digest declares", group = "<!-- 2 -->🐛 Bug Fixes" },
{ message = "Basic config updated", group = "<!-- 3 -->📚 Documentation" },
{ message = "Build nativelink with musl", group = "<!-- 1 -->⛰️ Features" },
{ message = "Change worker to consider reclaimable page cache as usable memory", group = "<!-- 2 -->🐛 Bug Fixes" },
{ message = "Completeness checking store should not check if directory digests exist", group = "<!-- 2 -->🐛 Bug Fixes" },
{ message = "Create directory for action", group = "<!-- 1 -->⛰️ Features" },
{ message = "De-dupe the fast-slow store", group = "<!-- 2 -->🐛 Bug Fixes" },
{ message = "Detect anonymous GCS auth and optionally quit", group = "<!-- 1 -->⛰️ Features" },
{ message = "Disable Bazel disk cache when nativelink cloud cache is enabled", group = "<!-- 4 -->🧪 Testing & CI" },
{ message = "Disable Bazel lockfile in 8.7 compatibility lane", group = "<!-- 4 -->🧪 Testing & CI" },
{ message = "Don't retry permanent failures", group = "<!-- 2 -->🐛 Bug Fixes" },
{ message = "Draw a General Purpose Diagram", group = "<!-- 3 -->📚 Documentation" },
{ message = "Evict on touch failure", group = "<!-- 2 -->🐛 Bug Fixes" },
{ message = "Existence cache remove callbacks", group = "<!-- 2 -->🐛 Bug Fixes" },
{ message = "Fix duplicate phrase in CONTRIBUTING.md", group = "<!-- 3 -->📚 Documentation" },
{ message = "Fix incorrect bazel version 6.4.0", group = "<!-- 3 -->📚 Documentation" },
{ message = "Flush in detect_duplicate_upload", group = "<!-- 2 -->🐛 Bug Fixes" },
{ message = "GrpcStore now sends digest function from context", group = "<!-- 2 -->🐛 Bug Fixes" },
{ message = "Implement .* feature", group = "<!-- 1 -->⛰️ Features" },
{ message = "Implement `ClientStateManager` for `SimpleScheduler`", group = "<!-- 6 -->⚙️ Miscellaneous" },
{ message = "Increase the attic retry time", group = "<!-- 4 -->🧪 Testing & CI" },
{ message = "Let paused idle workers accept new work", group = "<!-- 2 -->🐛 Bug Fixes" },
{ message = "Log failures to update actions", group = "<!-- 1 -->⛰️ Features" },
{ message = "Log on command complete", group = "<!-- 1 -->⛰️ Features" },
{ message = "Make the error on a size field clearer", group = "<!-- 2 -->🐛 Bug Fixes" },
{ message = "Marcussorealheis extend zstd", group = "<!-- 1 -->⛰️ Features" },
{ message = "Materialize directory-cache nodes concurrently on cold misses", group = "<!-- 1 -->⛰️ Features" },
{ message = "Migrate to callPackage syntax", group = "<!-- 6 -->⚙️ Miscellaneous" },
{ message = "Move Bytestream to array config", group = "<!-- 1 -->⛰️ Features" },
{ message = "Move `update_action_with_internal_error` into `StateManager`", group = "<!-- 6 -->⚙️ Miscellaneous" },
{ message = "Prevent UUID collision", group = "<!-- 2 -->🐛 Bug Fixes" },
{ message = "Redo worker_find_logging as config", group = "<!-- 1 -->⛰️ Features" },
{ message = "Remove nativelink-proto as build dependency", group = "<!-- 4 -->🧪 Testing & CI" },
{ message = "Retry GrpcStore get_part_ref", group = "<!-- 1 -->⛰️ Features" },
{ message = "Shard store weight scale distribution", group = "<!-- 1 -->⛰️ Features" },
{ message = "Upgrade crossbeam-epoch and serial_test", group = "<!-- 7 -->⬆️ Bumps & Version Updates" },
{ message = "Upgrade to Bazel 9.1.1 and 8.7.0", group = "<!-- 7 -->⬆️ Bumps & Version Updates" },
{ message = "Use mimalloc", group = "<!-- 1 -->⛰️ Features" },
# Non-conventional types ("scheduler:", "worker:") keep the description out
# of the verb rules below, and the message rules see the whole commit body:
# #2784 landed in Testing & CI because its body discusses tests, #2750 in
# Features because its body says "Add". Pin both by their subject.
{ message = "fail queued actions with criteria no worker can meet", group = "<!-- 1 -->⛰️ Features" },
{ message = "fix active counts when a client disappears", group = "<!-- 2 -->🐛 Bug Fixes" },
{ message = "keep directory construction retries on the same lock", group = "<!-- 2 -->🐛 Bug Fixes" },
# A conventional ci: commit whose description mentions docs or a scope the
# verb rules claim first: #2878 reads "docs-only", #2874 is ci(nix), and
# #2863 is a dependency bump the generic Update rule misses.
{ message = "skip the sanitizer lane on docs-only changes", group = "<!-- 4 -->🧪 Testing & CI" },
{ message = "update dependency typescript", group = "<!-- 7 -->⬆️ Bumps & Version Updates" },
{ message = "warm the Bazel Dev lane from the remote cache", group = "<!-- 4 -->🧪 Testing & CI" },
# Get all breaking changes first.
{ message = "BREAKING", group = "<!-- 0 -->❌️ Breaking Changes" },
{ message = "Breaking", group = "<!-- 0 -->❌️ Breaking Changes" },
# Filter these out early but show them later in the changelog.
{ message = "Breakdown", group = "<!-- 3 -->📚 Documentation" },
{ message = "Document", group = "<!-- 3 -->📚 Documentation" },
{ message = "Example", group = "<!-- 3 -->📚 Documentation" },
{ message = "README", group = "<!-- 3 -->📚 Documentation" },
{ message = "Update .* Readme", group = "<!-- 3 -->📚 Documentation" },
{ message = "docs", group = "<!-- 3 -->📚 Documentation" },
{ message = "document", group = "<!-- 3 -->📚 Documentation" },
{ message = "documentation", group = "<!-- 3 -->📚 Documentation" },
# Filter out all updates, but show them last.
{ message = "Bump", group = "<!-- 7 -->⬆️ Bumps & Version Updates" },
{ message = "Bump+", group = "<!-- 7 -->⬆️ Bumps & Version Updates" },
{ message = "Update", group = "<!-- 7 -->⬆️ Bumps & Version Updates" },
{ message = "to [0-9.]+", group = "<!-- 7 -->⬆️ Bumps & Version Updates" },
# Filter these out early but show them later in the changelog.
{ message = "CI", group = "<!-- 4 -->🧪 Testing & CI" },
{ message = "pre-commit", group = "<!-- 4 -->🧪 Testing & CI" },
{ message = "test", group = "<!-- 4 -->🧪 Testing & CI" },
{ message = "Add", group = "<!-- 1 -->⛰️ Features" },
{ message = "Allow", group = "<!-- 1 -->⛰️ Features" },
{ message = "Integrate", group = "<!-- 1 -->⛰️ Features" },
{ message = "Introduce", group = "<!-- 1 -->⛰️ Features" },
{ message = "Optimize", group = "<!-- 1 -->⛰️ Features" },
{ message = "Avoid", group = "<!-- 2 -->🐛 Bug Fixes" },
{ message = "Fix", group = "<!-- 2 -->🐛 Bug Fixes" },
{ message = "Handle", group = "<!-- 2 -->🐛 Bug Fixes" },
{ message = "Resolve", group = "<!-- 2 -->🐛 Bug Fixes" },
{ message = "Merge branch", skip = true },
{ message = "Prepare.+release", skip = true },
{ message = "Release", skip = true },
{ message = "wtf", skip = true },
# Catch-all in miscellaneous
{ message = ".*", group = "<!-- 6 -->⚙️ Miscellaneous" },
]
# protect breaking changes from being skipped due to matching a skipping commit_parser
protect_breaking_commits = false
# filter out the commits that are not matched by commit parsers
filter_commits = false
# regex for matching git tags
tag_pattern = "v[0-9].*"
# regex for skipping tags
skip_tags = "beta|alpha"
# regex for ignoring tags
ignore_tags = "v0.3.0"
# sort the tags topologically
topo_order = false
# sort the commits inside sections by oldest/newest order
sort_commits = "newest"