<feed xmlns='http://www.w3.org/2005/Atom'>
<title>projectile.git, branch dirconfig-polish</title>
<subtitle>Unnamed repository; edit this file 'description' to name the repository.
</subtitle>
<link rel='alternate' type='text/html' href='http://git.tews.dev/cgit/projectile.git/'/>
<entry>
<title>Small dirconfig cleanups</title>
<updated>2026-04-25T22:29:08+00:00</updated>
<author>
<name>Bozhidar Batsov</name>
<email>bozhidar@toptal.com</email>
</author>
<published>2026-04-25T22:29:08+00:00</published>
<link rel='alternate' type='text/html' href='http://git.tews.dev/cgit/projectile.git/commit/?id=4d6c1a16af2c12bc369de7c5e4078cd0281a5271'/>
<id>4d6c1a16af2c12bc369de7c5e4078cd0281a5271</id>
<content type='text'>
- projectile-get-project-directories: replace the (or keep '("")) trick
  with an explicit (if keep ... (list project-dir)). The behavior is
  unchanged but the empty-keep case no longer reads as a string-concat
  with the empty string.

- projectile-dirconfig-file: expand the docstring to spell out the
  dual marker/config role — empty file is enough to mark a project,
  non-empty content drives parsing.
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
- projectile-get-project-directories: replace the (or keep '("")) trick
  with an explicit (if keep ... (list project-dir)). The behavior is
  unchanged but the empty-keep case no longer reads as a string-concat
  with the empty string.

- projectile-dirconfig-file: expand the docstring to spell out the
  dual marker/config role — empty file is enough to mark a project,
  non-empty content drives parsing.
</pre>
</div>
</content>
</entry>
<entry>
<title>Include dirconfig path in the parse-cache hit check</title>
<updated>2026-04-25T22:27:44+00:00</updated>
<author>
<name>Bozhidar Batsov</name>
<email>bozhidar@toptal.com</email>
</author>
<published>2026-04-25T22:27:44+00:00</published>
<link rel='alternate' type='text/html' href='http://git.tews.dev/cgit/projectile.git/commit/?id=0dc5b507231e8ad53a0ce925471111dda89cff4d'/>
<id>0dc5b507231e8ad53a0ce925471111dda89cff4d</id>
<content type='text'>
The cache value used to be (MTIME . PARSED-RESULT) keyed on the
project root. If the user changed `projectile-dirconfig-file' to
point at a different file mid-session, the old entry kept getting
returned because the key didn't depend on the path. Store the path
alongside the mtime in the cached value and compare both before
considering a hit. The hash key remains the project root so
`projectile-invalidate-cache' continues to work as-is.
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
The cache value used to be (MTIME . PARSED-RESULT) keyed on the
project root. If the user changed `projectile-dirconfig-file' to
point at a different file mid-session, the old entry kept getting
returned because the key didn't depend on the path. Store the path
alongside the mtime in the cached value and compare both before
considering a hit. The hash key remains the project root so
`projectile-invalidate-cache' continues to work as-is.
</pre>
</div>
</content>
</entry>
<entry>
<title>Fire the + glob keep warning once per project</title>
<updated>2026-04-25T22:15:26+00:00</updated>
<author>
<name>Bozhidar Batsov</name>
<email>bozhidar@toptal.com</email>
</author>
<published>2026-04-25T22:15:26+00:00</published>
<link rel='alternate' type='text/html' href='http://git.tews.dev/cgit/projectile.git/commit/?id=31a5723acce2c4f31b77aaa611c3fe7c47387b93'/>
<id>31a5723acce2c4f31b77aaa611c3fe7c47387b93</id>
<content type='text'>
The other two dirconfig warnings (alien-mode bypass and prefix-less
entries) are gated by per-project hash sets so they fire at most
once per Emacs session. The glob-keep warning was the odd one out —
it lived inside the uncached parser and re-fired on every cache
miss, and it emitted one display-warning per offending entry rather
than a single consolidated message.

Move it into the cached wrapper alongside the others, gate it on
projectile--glob-keep-warned-projects, and roll multiple offending
entries into one warning that lists them.
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
The other two dirconfig warnings (alien-mode bypass and prefix-less
entries) are gated by per-project hash sets so they fire at most
once per Emacs session. The glob-keep warning was the odd one out —
it lived inside the uncached parser and re-fired on every cache
miss, and it emitted one display-warning per offending entry rather
than a single consolidated message.

Move it into the cached wrapper alongside the others, gate it on
projectile--glob-keep-warned-projects, and roll multiple offending
entries into one warning that lists them.
</pre>
</div>
</content>
</entry>
<entry>
<title>Merge pull request #1994 from bbatsov/dirconfig-refactor</title>
<updated>2026-04-25T22:12:54+00:00</updated>
<author>
<name>Bozhidar Batsov</name>
<email>bozhidar@batsov.dev</email>
</author>
<published>2026-04-25T22:12:54+00:00</published>
<link rel='alternate' type='text/html' href='http://git.tews.dev/cgit/projectile.git/commit/?id=1d330eb5bece7e0bad347cf2e93209e0e1d45bf0'/>
<id>1d330eb5bece7e0bad347cf2e93209e0e1d45bf0</id>
<content type='text'>
Refactor dirconfig parser: struct, pure classifier, deprecation warning</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
Refactor dirconfig parser: struct, pure classifier, deprecation warning</pre>
</div>
</content>
</entry>
<entry>
<title>Soft-deprecate prefix-less dirconfig entries</title>
<updated>2026-04-25T22:06:17+00:00</updated>
<author>
<name>Bozhidar Batsov</name>
<email>bozhidar@toptal.com</email>
</author>
<published>2026-04-25T22:06:17+00:00</published>
<link rel='alternate' type='text/html' href='http://git.tews.dev/cgit/projectile.git/commit/?id=6be2d06216a74b09b96315c6878fad8f3923d7e1'/>
<id>6be2d06216a74b09b96315c6878fad8f3923d7e1</id>
<content type='text'>
The implicit "any unprefixed line is an ignore pattern" rule is the
last source of subtle parser surprises — it's the reason why a
single leading space silently changes a +-keep into a literal ignore
pattern, and it makes typo'd comments slip through as ignores.

Mark these lines as :legacy-ignore in the classifier, record them
in a new prefixless-ignore slot on the dirconfig struct, and emit a
one-time warning per project listing the offending entries. The
behavior is unchanged — the lines still go into the ignore list —
but users now get a nudge to write them as -entry. The warning can
be silenced via projectile-warn-on-prefixless-dirconfig-lines.
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
The implicit "any unprefixed line is an ignore pattern" rule is the
last source of subtle parser surprises — it's the reason why a
single leading space silently changes a +-keep into a literal ignore
pattern, and it makes typo'd comments slip through as ignores.

Mark these lines as :legacy-ignore in the classifier, record them
in a new prefixless-ignore slot on the dirconfig struct, and emit a
one-time warning per project listing the offending entries. The
behavior is unchanged — the lines still go into the ignore list —
but users now get a nudge to write them as -entry. The warning can
be silenced via projectile-warn-on-prefixless-dirconfig-lines.
</pre>
</div>
</content>
</entry>
<entry>
<title>Split the dirconfig parser into a pure line classifier</title>
<updated>2026-04-25T22:02:52+00:00</updated>
<author>
<name>Bozhidar Batsov</name>
<email>bozhidar@toptal.com</email>
</author>
<published>2026-04-25T22:02:52+00:00</published>
<link rel='alternate' type='text/html' href='http://git.tews.dev/cgit/projectile.git/commit/?id=2b49c82126c12180bbabbd929698dc35192b1a75'/>
<id>2b49c82126c12180bbabbd929698dc35192b1a75</id>
<content type='text'>
The old parser walked a temp buffer with point and pcase'd on
char-after, mixing IO, prefix dispatch, and bucket bookkeeping into
one function. Pull the dispatch out into projectile--dirconfig-classify-line,
which takes a string and returns a (BUCKET . VALUE) tag. The pure
function is unit-testable without buffer plumbing, the IO wrapper
shrinks to a one-shot read + dispatch, and the awkward
(pcase ((pred (lambda ...)) ...)) for the comment-prefix check
becomes a straightforward cond.

No behavior change.
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
The old parser walked a temp buffer with point and pcase'd on
char-after, mixing IO, prefix dispatch, and bucket bookkeeping into
one function. Pull the dispatch out into projectile--dirconfig-classify-line,
which takes a string and returns a (BUCKET . VALUE) tag. The pure
function is unit-testable without buffer plumbing, the IO wrapper
shrinks to a one-shot read + dispatch, and the awkward
(pcase ((pred (lambda ...)) ...)) for the comment-prefix check
becomes a straightforward cond.

No behavior change.
</pre>
</div>
</content>
</entry>
<entry>
<title>Return a projectile-dirconfig struct from the parser</title>
<updated>2026-04-25T22:01:11+00:00</updated>
<author>
<name>Bozhidar Batsov</name>
<email>bozhidar@toptal.com</email>
</author>
<published>2026-04-25T22:01:11+00:00</published>
<link rel='alternate' type='text/html' href='http://git.tews.dev/cgit/projectile.git/commit/?id=4928cbf3306b4699f6c4a7b63f934b647d545c00'/>
<id>4928cbf3306b4699f6c4a7b63f934b647d545c00</id>
<content type='text'>
Replace the positional (KEEP IGNORE ENSURE) triple with a
cl-defstruct. Every internal call site used car/cadr/caddr to pull
out a slot, which is unreadable and error-prone — slot accessors
make the intent explicit and let cl-defstruct grow a fourth field
later without touching every consumer.

Existing callers that compared against the raw triple (a couple of
internal helper tests) are updated to construct the struct with
make-projectile-dirconfig.
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
Replace the positional (KEEP IGNORE ENSURE) triple with a
cl-defstruct. Every internal call site used car/cadr/caddr to pull
out a slot, which is unreadable and error-prone — slot accessors
make the intent explicit and let cl-defstruct grow a fourth field
later without touching every consumer.

Existing callers that compared against the raw triple (a couple of
internal helper tests) are updated to construct the struct with
make-projectile-dirconfig.
</pre>
</div>
</content>
</entry>
<entry>
<title>Merge pull request #1993 from bbatsov/dirconfig-improvements</title>
<updated>2026-04-25T21:56:34+00:00</updated>
<author>
<name>Bozhidar Batsov</name>
<email>bozhidar@batsov.dev</email>
</author>
<published>2026-04-25T21:56:34+00:00</published>
<link rel='alternate' type='text/html' href='http://git.tews.dev/cgit/projectile.git/commit/?id=e86fbda84ac2f4da82d64387209724ddcf1affd9'/>
<id>e86fbda84ac2f4da82d64387209724ddcf1affd9</id>
<content type='text'>
Improvements to .projectile (dirconfig) parsing and ergonomics</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
Improvements to .projectile (dirconfig) parsing and ergonomics</pre>
</div>
</content>
</entry>
<entry>
<title>Warn when a + keep entry contains glob metacharacters</title>
<updated>2026-04-25T21:50:36+00:00</updated>
<author>
<name>Bozhidar Batsov</name>
<email>bozhidar@toptal.com</email>
</author>
<published>2026-04-25T21:50:36+00:00</published>
<link rel='alternate' type='text/html' href='http://git.tews.dev/cgit/projectile.git/commit/?id=a8a90311044f240f9b1d4789a32d5144f8d955ec'/>
<id>a8a90311044f240f9b1d4789a32d5144f8d955ec</id>
<content type='text'>
The parser silently turns every keep entry into a directory via
file-name-as-directory, which means a user-typed +*.json or +/foo.txt
becomes "*.json/" or "foo.txt/" and quietly never matches anything.
Spot the obvious misuses (anything containing *, ?, or [) at parse
time and emit a warning so the user can correct the file or move the
pattern to an ignore/ensure rule.
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
The parser silently turns every keep entry into a directory via
file-name-as-directory, which means a user-typed +*.json or +/foo.txt
becomes "*.json/" or "foo.txt/" and quietly never matches anything.
Spot the obvious misuses (anything containing *, ?, or [) at parse
time and emit a warning so the user can correct the file or move the
pattern to an ignore/ensure rule.
</pre>
</div>
</content>
</entry>
<entry>
<title>Add real-file integration tests for the dirconfig parser</title>
<updated>2026-04-25T21:49:20+00:00</updated>
<author>
<name>Bozhidar Batsov</name>
<email>bozhidar@toptal.com</email>
</author>
<published>2026-04-25T21:49:20+00:00</published>
<link rel='alternate' type='text/html' href='http://git.tews.dev/cgit/projectile.git/commit/?id=82fd4a5d3ab97cf5a8fdf65c38a68995ec1b3ef1'/>
<id>82fd4a5d3ab97cf5a8fdf65c38a68995ec1b3ef1</id>
<content type='text'>
The existing parser tests stub insert-file-contents; nothing exercises
the full IO path. Add three sandbox-based tests: a mixed +/-/!/no-prefix
file, a non-ASCII round-trip, and a file with no trailing newline. These
guard against IO-layer regressions that the stubbed tests can't see.
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
The existing parser tests stub insert-file-contents; nothing exercises
the full IO path. Add three sandbox-based tests: a mixed +/-/!/no-prefix
file, a non-ASCII round-trip, and a file with no trailing newline. These
guard against IO-layer regressions that the stubbed tests can't see.
</pre>
</div>
</content>
</entry>
</feed>
