Closed (fixed)
Project:
Drupal core
Version:
11.x-dev
Component:
configuration entity system
Priority:
Normal
Category:
Task
Assigned:
Unassigned
Reporter:
Created:
3 Nov 2017 at 02:44 UTC
Updated:
7 Aug 2025 at 14:32 UTC
Jump to comment: Most recent, Most recent file
Comments
Comment #2
sam152 commentedComment #3
sam152 commentedComment #4
sam152 commentedComment #6
sam152 commentedTest fixes.
Comment #7
dawehnerWhat about adding a message how a valid machine name looks like?
It feels like adding tests for everything inside one data provider wouldn't really scale. Maybe keeping them separate is actually better, what do you think?
Comment #8
sam152 commented#7.1: Sounds good. I wonder if we have some strings that describe this already?
#7.2: Are you thinking individual test methods or individual test classes? I think more test methods on the same class would be equally unmaintainable, but possibly a test class per constraint with a base class for boilerplate would be okay? I always find the
ClassNameandClassNameTestconvention very discoverable.Comment #9
borisson_#8: I agree with having a test class per constraint be the best for discoverability.
Comment #10
dawehnerThese are exactly my thoughts :)
Here is an adaption of the patch :)
Comment #11
sam152 commentedWe should convert
TypedConfigTestintoUuidValidatorTest. If we have lots of these I also wouldn't be against a base class to share the common bits.Comment #12
dawehnerI agree, but I thought: this is out of the scope of this issue.
Comment #13
sam152 commentedMakes sense. I've filed #2923168: Rename ConstraintsTest to UuidValidatorTest.
I think the message change was missed in the interdiff. I think the only problem is it implies there can only be one underscore.
Comment #14
sam152 commentedHow about the following?
Comment #15
borisson_That looks great!
Comment #16
dawehner+1
Comment #17
sam152 commentedThanks for the review @borisson_ and checking the message again @dawehner!
Comment #18
wim leers❤️
This definitely also helps API-First! The IS even indicates that. Tagging as such.
I'm missing one thing though: a change record, which informs contrib/custom module developers about this, so they can update their config schemas.
Comment #19
dawehner@Wim Leers
I thought it would be a good idea to add all the constraint things into one issue, which seem to happen in #2869792: [meta] Add constraints to all config entity types for now.
Comment #20
wim leersIsn't this just one of many, many implementation issues? i.e. #2869792: [meta] Add constraints to all config entity types is the plan issue, this is a child issue?
I guess I'm not sure what you mean exactly — could you clarify?
Comment #21
dawehner@Wim Leers
I think having one change record instead of multiple would be way easier for people to find information.
Comment #22
alexpottThis is unfortunately not that simple :( we need to be able to configure this as this is not the same for all machine names. For example, much to my chargrin block IDs can have a dot in...
See \Drupal\block\BlockForm::form()
This test looks a bit annoying if it going to change whenever we add a new validation.
Comment #23
alexpottCreated #2925689: ConfigValidation class contains code that is brittle and changing for every addition to address #22.2
Comment #24
dawehner@alexpott
It still makes sense to have a default format, right?
Comment #25
alexpott@dawehner yep I think so - to match what's in \Drupal\Core\Render\Element\MachineName::processMachineName() - ie.
[^a-z0-9_]Comment #27
dawehnerThis adds support for configuring the pattern. I'm curious whether we should update the change record in https://www.drupal.org/node/2906029
Comment #28
dawehnerI added a change record https://www.drupal.org/node/2954832 for setting up config validation itself.
Comment #30
jibranDo we need an upgrade path for this schema change?
Comment #31
dawehner@jibran How would you upgrade something like this? What we need a change record explaining what module authors can do now.
Comment #32
dawehnerLet's fix the test failures :) This never worked, I'm glad we have tests.
Comment #33
amateescu commentedSince the replace pattern is configurable, the second part of the message is not necessarily accurate...
Comment #34
dawehnerThank you for your review!
You are absolutely right, On the other hand though, much like you can configure the
replacePattern, you can also configure the message in your constraint configuration.Comment #35
amateescu commentedAhh, I never saw a constraint's message being configured, but you're totally right, I don't see why it wouldn't be possible :)
We already have
\Drupal\Core\Validation\Plugin\Validation\Constraint\RegexConstraintwhich is using Symfony's\Symfony\Component\Validator\Constraints\RegexValidator.So, if we really want this new constraint instead of using the existing
Regex(for DX reasons I guess?), then we should at least extend it and let it handle the validation (i.e. remove the customMachineNameConstraintValidatorfrom this patch).OTOH, do we really need the new constraint in the first place? :)
Comment #36
dawehnerGood point! I first though we could need to negate the regex, but Regex allows you to say "$match = false".
Comment #37
tedbowJust saw this issue and couldn't get it to work because I hadn't figured this out.
Suggestion in #35 and #36 seem like a good idea to avoid adding our own constraint and validator.
Should we assert the message text here? Because presumably something else could be broken in the config system we might get a different message.
Otherwise looks very good
Comment #38
amateescu commentedIn addition to #37, I only have a couple of minor observations:
Note that we're no longer testing the machine name constraint, but the machine_name config data type.
I wonder if it's really useful to instantiate this test twice for this very simple scenario.. I would simply do both assertions in the test method and save a second of the testbot's time. But that's just me, feel free to ignore this point :)
Comment #39
dawehnerDone :)
Can't be bothered right now. It is basically a 32th of a second, due to the parallel execution.
Comment #40
amateescu commentedThis looks great to me now :)
Comment #41
jibranWe are adding a new data type to config schema, to make this available I think we at least add an empty update hook to clear the cache.
RE #30: @dawehner: I don't think we need an update hook for this because
typeis not stored in anywhere in active config.Comment #42
dawehnerThere is a change record already :)
Comment #43
jibranSorry, missed that.
Comment #44
dawehnerNo worries :)
Sure, let's do that.
Honestly, next time, in case you want, I'd be super happy if you would fix it too.
Comment #45
jibran> Honestly, next time, in case you want, I'd be super happy if you would fix it too.
I didn't mean to annoy you. I just wanted to have a discussion about it before we agree on it and thank you for agreeing with me and updating the patch. I'll try to be more helpful next time.
Comment #46
dawehnerOh sorry, I really didn't wanted to say that. All I wanted to say is: Feel free to provide a patch too :)
Comment #47
alexpottThis is not quite right. Because blocks allow dots in there machine name. See \Drupal\block\BlockForm::form() - the block schema needs a custom pattern. Also we need to test this.
Comment #48
alexpottThis shouldn't need to change now.
Comment #49
dawehnerI expanded the validation for menus and entity displays.
TODOs:
Comment #51
dawehnerContinue to work on it.
Comment #52
dawehnerI converted more instances and added test coverage to some of them.
Comment #54
dawehnerI discussed a bit with @alexpott whether we want to do the UI aspects here. I think we settled to limit the scope of this issue for now and continuously work on that later.
Comment #56
dawehnerLet's fix the test failures.
Comment #57
borisson_Should be only one blank line
Can we not use the same dataprovider we use in
ShortcutSetTest,EntityFormDisplayTestandEntityDisplayTesthere?This dataprovider is reused in 3 places now and I think we can either copy it in, or refer to it from a trait and/or change the @dataProvider to point to one of the other classes?
This should move to a post update, see https://drupal.org/node/2960601
There needs to be a blank line before the last closing brace of a class.
Comment #58
dawehnerI'm not sure about this anymore, see https://www.drupal.org/project/drupal/issues/2743313#comment-12575919
Comment #60
gogowitsch commented@borisson_ Thanks for your review - here are my answers:
Here is what I changed on top of the above:
core.entity_view_display.mapping.id, because it gets added in\Drupal\Core\Plugin\Context\EntityContextDefinition::fromEntityType. This is why the previous patch failed testing.$this->assertEqualstoself::assertEqualsbecause it this is how we should call static methods.$this->assertEqualtoself::assertEqualsbecause the former is deprecated.messagekey: Made very long lines in YAML shorter by using the >- multiline.I noticed that the empty machine names are considered valid as we just look for invalid characters. As a follow-up issue we might have to add a
LengthConstraint.Comment #61
alexpottNeeds to be moved to the system module and should be a post update now as that's what we do to ensure a cache flush. To do this we need to add a function like
system_post_update_field_formatter_entity_schema()tocore/modules/system/system.post_update.php. The debate from #58 has been resolved.Comment #62
gogowitsch commentedAh, got it! There is a new patch attached converting the
hook_update()to ahook_post_update()and moved it to the system module. This leads to another advantage: the cache clear will work for both 8.6.x and 8.7.x.Comment #64
gogowitsch commentedAs this issue is marked as 8.7.x-dev, I will ignore the failed test for 8.6.x unless someone objects.
Comment #65
alexpott@Gogowitsch yeah this addition is not eligible for 8.6.x anyway.
Comment #67
gogowitsch commentedI am re-uploading the patch from #62. It's unchanged from the perspective of content. The patches differ by line numbers and patch context.
This is to force the test runner to apply it to the 8.8.x branch, so it can be reviewed and merged with more confidence.
Comment #69
tstoecklerMaybe there's a reason for that that I'm missing, but I find this double negative with the regular expression hard to understand.
I guess this was taken from the replace pattern in the form, but since there's no direct connection to that here, I wonder if it wouldn't be better for future developers to simplify this?
Should this mention that the string "custom" is not allowed?
Any reason for using
self::here over$this->?Comment #70
tstoecklerOh, and I guess this introduces some coding standard violations so those need to be fixed at least.
Comment #71
longwave> Any reason for using self:: here over $this->?
I think this is trying to follow the deprecation of the SimpleTest assertion methods, but also I think changing existing assertions is out of scope here and should be left for #2496109: Replace all usages to deprecated methods on KernelTestBase(NG)
Comment #72
longwaveAddressed #69 and #70; I negated the regular expressions and simplified the one remaining negative one (as "custom" is easier to look for with a negative match), improved the "custom" validation message, and also renamed the data providers so they follow the standard we use in core.
The regexes could also limit the maximum number of characters; should we add this?
Comment #73
gogowitsch commentedThe patch from comment #72 looks very good to me.
@longwave: Regarding the YAML: What was the reason for replacing the multi-line
>-strings with single lines? I am fine with either, but find long lines a little harder to read.Comment #74
longwaveIt was not consistent before - some were multiline and some were not - and I find the single lines easier to read (up to a point anyway!).
Happy to change them all the other way as long as we are consistent; I also looked at the yaml coding standards but it doesn't seem to specify line lengths.
Comment #75
longwaveAlso it just struck me that for the ones that allow symbols (underscore, dot, etc) do we have any rules about allowing these as the first character?
Comment #76
tstoecklerThanks for the quick turnaround!
Patch looks good to me, so setting RTBC. While I personally kind of like the multiline YAML strings they are not used very much in core, so I think going with the single-line strings is a bit less controversial and increases the chance of this landing soon.
Re #75: That's a very good question!!! I just tried and it is actually possible to create a block with the machine name "..." through the UI. I'm not really sure that that's a good idea, but since it "works" that's definitely follow-up material if we want to change that. But good catch!
Comment #77
longwave@tstoeckler: do you think it is worth adding length checks to the regexes as I suggested in #72?
Comment #78
tstoecklerOh right, totally missed that point, sorry.
Kicking to back to needs review to discuss that.
I think since the point of this issue (at least one specific formulation of it) is to generalize the validation of machine names that is currently done in the UI to the config schema it would only be right to bring the maxlength validation along with it. I can also see that being handled in a follow-up, because the patch is definitely already an improvement over the status quo.
I went through all the places where we use machine name form element in core and tracked the maxlengths. The default is 64, so everything that is not mentioned below has that maxlength:
* Actually it is 32 minus the field prefix (i.e. the value of the "field_prefix" key in the "field_ui.settings" config). So maybe we would have to implement hook_config_schema_alter() to adapt that? That definitely sounds like follow-up material though, it kind of feels like a can of worms...
Comment #79
longwaveI can't decide if the best thing to do here is add the length to the regex, or add a separate LengthConstraint to the machine name data types. The regex means that we can handle everything in a single validation, but a separate length constraint would be easier to manage for the more complicated config entities like field_storage and menu.
Also, config entities are already supposed to know their maximum length via the MAX_ID_LENGTH constant, so perhaps we can reuse this and automatically set a length constraint on the machine names? Embedding it in the regex from the constant seems like it would be much more difficult.
As you say, it does feel like this might be better done in a followup, as this is already a significant improvement on its own.
Comment #80
tstoecklerYes, I think #79 is a great point. I opened #3109137: Add config validation for length of machine names for adding length constraints. So marking this RTBC again (and slightly narrowing the title).
Comment #81
dwwIs this an existing pattern in core? Seems verbose and repetitive. Why not just:
"This value should be a valid machine name, containing only alphanumeric characters and underscores."
?
Same
And here.
Also, in cases like this, I think it can be a nice UI touch to include examples of the punctuation you're talking about (since not everyone agrees on "dots" vs. "periods" vs. "full-stop" etc). E.g.:
This value should be a valid machine name, containing only alphanumeric bcharacters, dots (.) and underscores (_).
Although now that I see it, that does look a little ugly with the final dot. So maybe ignore this part of the review... ;)
I know you're just fixing the spacing here, but it's technically out of scope from this issue. Might be better to fix this in a follow-up to make the patch smaller?
Same as above.
And here. Sorry...
We're trying to get Classy out of core. Does this have to test with classy like this? If it doesn't matter, let's use stark instead.
00?
If we change this above, we have to change it here, too.
Generally unhelpful comment: This test looks almost identical to ~5 others added in this patch. I don't think there's anything we can do about that, but it strikes me as a bit of a bummer to be duplicating so much code like this. Probably a shared test trait somewhere is too much trouble. But I wanted to point it out in case anyone working on this patch thinks it's worth reconsidering.
Again here
Also, https://www.drupal.org/node/2954832 could use some help. There's malformed HTML in the example for machine names. It's also not clear why that CR wasn't already published, and why this issue is adding to it. Can someone more in-the-know on this take another look?
Thanks!
-Derek
Comment #82
andypostI bet it not always true, I recall few forms altering the pattern
Comment #83
dww@andypost re: #82: Note, there are different regexps (and messages) for a bunch of different cases in the patch. I only put that example in one of my review points, but see the quoted code in points 2, 3, 5, 6 and 11 for different patterns the patch is handling...
Comment #84
longwave@dww Thanks for review, back to needs work to deal with that.
I agree with pretty much all those changes. For #81.10 I think we can try to make an abstract test base class (e.g. similar to Drupal\Tests\rest\Functional\EntityResource\EntityResourceTestBase) that can carry out config validation and that is extended into concrete classes for each specific type that we want to test.
Comment #86
andypostComment #90
larowlanClosed #2845517: Enforce allowed characters of machine names in config entities. as duplicate
Comment #91
larowlanAnd #2824519: User role machine name created with caps and spaces
Comment #92
ravi.shankar commentedAdded reroll of patch #72 on Drupall 9.4.x.
Comment #93
yogeshmpawarResolved CS issues.
Comment #97
wim leersHah, I wrote something very similar over at https://git.drupalcode.org/project/drupal/-/merge_requests/3047/diffs?co...!
I like this approach better though: it's better to stop using this generic
type: string👍I'll get this reviewed/moving forward again.
P.S.: changing parent, because this validation constraint would be helpful not only for config entities, but also config in general.
Comment #98
wim leers@larowlan over at https://git.drupalcode.org/project/drupal/-/merge_requests/3047/diffs#no... pointed out that this is not actually correct — he wrote:
TIL!
Comment #99
phenaproximaI can take this on.
From some basic research, I think it's not far off. It definitely needs to be customizable, since some config entity forms use different logic for machine names (i.e., they'll replace periods in input, whereas other forms won't).
Comment #100
andypostIt could make obsolete #2091871: Add an ConfigEntityForm with an exists() method
Comment #102
phenaproximaOK, merge request opened. I don't think we need a new constraint for this; it's something we can implement with the existing Length and Regex constraints.
Most machine names default to allowing lowercase letters and numbers, as well as underscores, with a maximum length of 64. Those are the constraints implemented on the new
machine_namedata type, and tested in ActionValidationTest.These things can be overridden. In menus, the
idfield allows lowercase letters, numbers, and dashes (not underscores), and has a maximum length of 32. This is also tested in MenuValidationTest.So, not sure what else is needed here. Kicking it into review mode!
Comment #103
wim leersNits on the MR, but more importantly, it fails with this:
… I think this a DrupalCI issue? 🤔
Comment #104
phenaproximaNo idea what the hell is going on with CI, but I addressed your concerns anyway. :)
Comment #105
wim leersThey were known DrupalCI issues that should since then have been resolved. Re-testing to check if that's true 😊
Comment #106
needs-review-queue-bot commentedThe Needs Review Queue Bot tested this issue. It either no longer applies to Drupal core, or fails the Drupal core commit checks. Therefore, this issue status is now "Needs work".
Apart from a re-roll or rebase, this issue may need more work to address feedback in the issue or MR comments. To progress an issue, incorporate this feedback as part of the process of updating the issue. This helps other contributors to know what is outstanding.
Consult the Drupal Contributor Guide to find step-by-step guides for working with issues.
Comment #107
wim leersIt looks like our excellent progress pace on config validation was indeed killed by an ephemeral DrupalCI issue 😬🤬😞 Let's get it back on track!
This MR looks great and very close! 🤩
Marked for:
testMachineName().@sees would do!type: machine_namein more places: if I grep the codebase forlabel: 'Machine name', I find several more that should be updated here:filter.format.*,taxonomy.vocabulary.*,views.field.machine_name,views.view.*.Comment #108
phenaproximaComment #109
phenaproximaRegarding #107:
views.field.machine_nameis a boolean, not a machine name. Despite the confusing label, it is unrelated to the change we're making here.Comment #110
phenaproximaHiding patches in favor of the merge request.
Comment #111
wim leersLooks superb!
CR updated.
Let's do this!
Comment #112
phenaproximaBack to Wim to revert one small comment change which is not correct.
Comment #113
wim leers#112: done.
If we apply #3324984-34: Create test that reports % of config entity types (and config schema types) that is validatable to get a sense of how much difference this makes for total config validatability — and use #2164373-37: [META] Untie config validation from form validation — enables validatable Recipes, decoupled admin UIs …'s
2023-01-11.txtas a baseline:and
Clearly a solid step in the right direction 😊
Comment #114
phenaproximaI need re-review here after adding some entity types that we forgot.
Comment #115
wim leersI didn't mind too much that we didn't get everything. We're very likely to miss things anyway, because core doesn't yet have thorough test coverage for valid configuration.
The main goal IMHO is to make measurable progress, and that was already the case! :) This is definitely better though 👍
git diff 0152bf9b33bc335e1eb4d866712bf62c5c41d170 8c249cd82d98ac23b5b75f5587184b55b06a6f18(to review the changes since I RTBC'd) look great so 🚀Comment #116
longwaveAdded a few comments, partially based on the research previously done in #3109137: Add config validation for length of machine names
Comment #117
alexpottIn some ways these tests are moot beyond testing that the constraint is applied. Like the length constraint is well tested outside of Drupal.
Comment #118
alexpottWhoops...
Comment #119
wim leers@phenaproxima addressed some concerns, I responded to some on the MR.
Comment #120
alexpottI think we need to review all the ones where the max length is the default 64. Adding constraints that don't respect the real limit will cause us problems in the future. I created a block with the ID
claro_messagesclaro_messagesclaro_messagesclaro_messagesclaro_messagesclaro_messagesclaro_messagesclaro_messagesclaro_messagesclaro_messagesclaro_messagesand could edit the block just fine.Comment #121
wim leers#120: Very interesting!
claro_messagesclaro_messagesclaro_messagesclaro_messagesclaro_messagesclaro_messagesclaro_messagesclaro_messagesclaro_messagesclaro_messagesclaro_messagesis 155 characters, which is indeed less than the 166 that\Drupal\Core\Config\Entity\ConfigEntityStorage::MAX_ID_LENGTHallows and which is checked by\Drupal\Core\Config\Entity\ConfigEntityStorage::save().But
'#maxlength' => 64,is present inBlockForm, so … how did you create that? 🤔@phenaproxima said this about that in chat:
But I think @longwave and @alexpott are right that despite the max lengths imposed by forms that are listed in #78, forms can be bypassed, so the only safe choice for a default is
166aka\Drupal\Core\Config\Entity\ConfigEntityStorage::MAX_ID_LENGTH. Otherwise we will never realistically be able to enable config validation because existing configuration will be not just considered as invalid in some key-value pairs, but on its most fundamental one: its identifier! Which then has wild repercussions for everything else: all references to that config from other config (and code) would have to be updated. That's a BC nightmare.So choosing to be pragmatic makes sense to me. I hope @phenaproxima agrees 😊
Comment #122
borisson_I agree with @Wim Leers here, we shouldn't look at the validation in the forms but at the data level.
The open Merge Request should be rebased and then I think we can get this in.
Comment #123
wim leersMerged in all
10.1.xcommits of the last ~2 months. No conflicts 🥳Comment #124
wim leersUpdated issue summary with updated validatability impact analysis (previous one was in #113, almost 3 months ago): this significantly increases the average validatability of config entity types (from 24.16% to 31.24%!) because almost every config type contains at least one
type: machine_name! 🤩Comment #125
borisson_I was already confident in #122, so to rtbc this goes.
Comment #127
kim.pepperNeeds a rebase on 11.x
Comment #128
dwwThanks everyone, this is going to be great!
There was an unresolved thread with a suggestion that looked right to me, so I clicked the "Apply suggestion" button in the GitLab UI.
I then rebased this to the latest
11.xbranch (as of commit 570710ad), with no conflicts to resolve, and pushed it. What I don't have perms for is to edit the MR to change the target branch. Either @phenaproxima or a core committer must do that.Not done reviewing, but this was RTBC so it's probably ready.
Thanks again,
-Derek
Comment #129
needs-review-queue-bot commentedThe Needs Review Queue Bot tested this issue. It no longer applies to Drupal core. Therefore, this issue status is now "Needs work".
This does not mean that the patch needs to be re-rolled or the MR rebased. Read the Issue Summary, the issue tags and the latest discussion here to determine what needs to be done.
Consult the Drupal Contributor Guide to find step-by-step guides for working with issues.
Comment #130
wim leersThanks, @dww!
The failures appear all to be be due to #3349293: Make assertions using ConfigEntityValidationTestBase::assertValidationErrors() clearer. 👍 Yay for clearer test assertions! (Also, this means that automatic re-testing appears to be broken 🤷♀️)
Comment #132
wim leersAh, too bad — @dww, that didn't quite work 😅 You merged in commits from
11.x, but the MR is still flagged as targeting11.x. This is a huge failure on GitLab's behalf: it's impossible for us to change the target branch 😬Also, just creating a branch from
11.xfails because it doesn't yet exist in this issue fork. So we need to push that in fromoriginfirst… despite the GitLab UI actually showing11.x:(Yes, DX issues aplenty.)
I tried to learn some new
gitskills (thanks @larowlan! https://drupal.community/@larowlan/110471613823751109) to hopefully accelerate future painful "change target branch" parties like this one:Now let's rebase this onto
11.x:(that's the last upstream aka non-merge commit from the previous target branch)
And then check it out as the new branch to create an MR for and push:
P.S.: I've been unable to figure out how to make this generate a new branch automatically. Maybe @larowlan can shed some light on that…
P.P.S.: this took me more than 40 mins of fighting
gitto figure out 😬Comment #133
wim leersFinally, @dww mentioned in #128 that he applied one agreed upon suggestion from the original MR. Re-applying that.
Comment #134
wim leersAdjusted test expectations to be more precise, necessary since #3349293 — see #130.
Comment #135
wim leersComment #136
borisson_Moving this back to rtbc after the rebase and branch switching.
Comment #137
borisson_Actually moving status
Comment #138
longwaveAs per #47 blocks allow dots in their machine name, but I don't see an override for the default regex in block.schema.yml.
I haven't checked the other entity types, but this is one special case that I was previously aware of.
Comment #139
wim leersDarn, great catch! Looks like we missed that one 🙈
Comment #140
wim leersAddressed #47 / #138 👍 (Explicit test coverage added.)
Comment #141
smustgrave commentedtest failures in the MR seem legit to the task at hand.
Comment #142
wim leersDone!
Turns out that the tightening of test coverage I did in bd31ada0 made it apparent that we were missing explicit test coverage for the atypical behavior in
MenuandShortcutSettoo — not just inBlock.Comment #143
smustgrave commentedLGTM now!
Comment #144
larowlanIssue credits
Comment #146
larowlanCommitted 0a7c337 and pushed to 11.x. Thanks!
Nice work folks 🏎️
Comment #148
fgmThanks for the feature, but this needs to be added to the config schema reference page https://www.drupal.org/docs/drupal-apis/configuration-api/configuration-... otherwise it will mostly remain unused, so resetting to NW and tagging as needs documentation for now.
Comment #149
wim leersTIL that documentation even exists 😅 I've never once in my life found that page! 🤯
Comment #150
fgm@Wim Leers, that's what happens when one knows too much :-)
Comment #151
wim leers@fgm Or when I've grown to assume docs are missing/inconsistent/incomplete and just figure it out by grepping the codebase 😇 I wouldn't say I know too much, I'd say my search-fu has been trained a LOT 😜
Comment #153
wim leersComment #154
smustgrave commented