buf icon indicating copy to clipboard operation
buf copied to clipboard

Implement breaking lints in the LSP

Open mcy opened this issue 1 year ago • 1 comments

This change adds breaking lints to the LSP as part of the general lint pass.

Breaking lints are interesting because they need an "against". I've chosen to expose two configuration knobs (which are set in the settings for an LSP in the standard way):

  1. buf.against sets the against strategy. For the LSP, there are three that reasonably make sense: against some remote's HEAD, against your local HEAD, and against whatever is on disk. This means that lints go away when pushing to main, committing working changes, or saving in the editor, respectively.
  2. buf.gitRemote, the remote to use for the above. "origin" is the default for almost everyone, but it need not be that, so it's a config knob.

Also, in the process of standing up loading config settings from the client, I found a deadlock in the jsonrpc2 library. To work around it, every request runs on its own goroutine (although they are still serialized wrt to the big LSP lock). This ensures that the single goroutine jsonrpc2 spawns to actually poll the IPC socket doesn't deadlock. Why do they only spawn one goroutine? Presumably because they expect users to spawn a goroutine to handle each request, but this does not appear to be visibly documented. (Much debugging of deadlocked goroutines happened today.)

mcy avatar Oct 16 '24 19:10 mcy

The latest Buf updates on your PR. Results from workflow Buf CI / buf (pull_request).

BuildFormatLintBreakingUpdated (UTC)
✅ passed✅ passed✅ passed✅ passedNov 25, 2024, 6:23 PM

github-actions[bot] avatar Oct 16 '24 19:10 github-actions[bot]