Relative Links in the Wiki Are Broken
- [ ] #16568 (!4050) Relative links in wiki are broken
- [x] Investigate issue
- [x] Implementation / Fix
- [x] Write (failing) tests for `WikiLinkFilter`
- [x] Link to `./bar` should either get rewritten correctly or left alone
- [x] Link to `./bar.md` should maybe get rewritten correctly (is left alone currently)
- [x] Link to `bar.md` should get rewritten correctly
- [x] Check if this indeed a bug
- [x] Make sure CI is green
- [x] Assign to endboss
- [x] Wait for review
- [x] Implement review feedback
- [ ] Wait for merge
See merge request !4050
Don't show the Todo count if there aren't any Todos.
When there are 0 Todos, the Todos icon still had the blue badge with a "0" in it, which made me think I had a new Todo left. This makes it less annoying.
Follow-up on !4077.
**Before:**

**After:**

cc: @jschatz1 @rspeicher
See merge request !4113
Improve documentation and web test for web hooks
Tips and documentation of actual hook behavior. Improved user feedback
when testing hooks via the web UI.
See merge request !4015
Restrict starred projects to viewable ones
`User#starred_projects` doesn't perform any visibility checks. This has
a couple of problems:
1. It assumes a user can always view all of their starred projects in
perpetuity (project not changed to private, access revoked, etc.).
2. It assumes that we'll only ever allow a user to star a project they
can view. This is currently the case, but bugs happen.
Add `User#viewable_starred_projects` to filter the starred projects by
those the user either has explicit access to, or are public or
internal. Then use that in all places where we list the user's starred
projects.
Closes#17249.
See merge request !4108
Only generate repository push email once
The repository push email can be very expensive to generate, especially
with syntax-highlighted diffs. Instead of generating the email for each
recipient, generate one email object and reset the Message-Id and To
headers for each recipient. (Cloning would also be expensive in the case
of large emails, although probably not as bad as generating from
scratch.)
Closes#17270.
See merge request !4070
Enable the StringReplacement cop.
Also fix one use of `gsub` that would be faster as `delete`.
Use `tr` instead of `gsub` when you are replacing the same number of characters. Use `delete` instead of `gsub` when you are deleting characters.
See merge request !3960
The repository push email can be very expensive to generate, especially
with syntax-highlighted diffs. Instead of generating the email for each
recipient, generate one email object and reset the Message-Id and To
headers for each recipient. (Cloning would also be expensive in the case
of large emails, although probably not as bad as generating from
scratch.)
When there are 0 Todos, the Todos icon still had the blue badge with a "0" in it, which made me think I had a new Todo left. This makes it less annoying.
Follow-up on !4077.