build: modernize repository (#27)

* build: clean up gitignore and remove empty gitmodules

Problem: .gitignore contained 48 lines of C/shared-object boilerplate
irrelevant to a Lua Neovim plugin. .gitmodules was tracked but empty.

Solution: replace .gitignore with minimal entries covering only files
this project actually produces. Delete the vestigial .gitmodules.

* build: add editorconfig and prettierrc

Problem: no editor or formatter configuration, inconsistent with
cp.nvim and diffs.nvim conventions.

Solution: add .editorconfig (2-space Lua indent, utf-8, final newline)
and .prettierrc (prose wrap, 80 cols, single quotes, no semi) matching
the other repos.

* build: add Makefile for lint and test targets

Problem: .github/pre-commit calls `make fastlint` and .github/pre-push
calls `make lint && make test`, but no Makefile existed, so the git
hooks failed.

Solution: add Makefile with lint (stylua + selene), fastlint
(pre-commit), and test (luarocks test) targets.

* docs: add fork copyright to LICENSE

Problem: LICENSE only contained the original author's copyright notice.

Solution: add a second copyright line for the fork maintainer. MIT
requires retaining the original notice; adding a line for derivative
work is standard practice.

* ci: restructure workflows to quality/test/luarocks pattern

Problem: CI used a single tests.yml for linting, typechecking, and
testing. No conditional path filtering, no markdown format check, and
a stale mirror_upstream_prs.yml and duplicate luarocks.yml existed.

Solution: replace tests.yml with quality.yaml (stylua, selene,
lua-typecheck, prettier with dorny/paths-filter) and test.yaml
(nvim-busted, stable+nightly matrix). Update luarocks.yaml to
reference quality.yaml. Delete mirror_upstream_prs.yml and duplicate
luarocks.yml. Fix automation workflow sender check.

* build: rewrite issue templates

Problem: issue templates used upstream stevearc references, severity
dropdowns, outdated lazy.nvim bootstrap, and the .yml extension
inconsistent with other repos.

Solution: replace with .yaml templates matching cp.nvim/diffs.nvim
style. Bug report uses prerequisites checkboxes, checkhealth output,
modern lazy.nvim bootstrap with vim.g.oil pattern. Feature request
uses problem/solution/alternatives format. Add config.yaml to disable
blank issues and link discussions.

* docs: rewrite README

Problem: README contained upstream triage tables, severity dropdowns,
the old setup() pattern, a tree view question, and references to
stevearc/oil.nvim as the primary source.

Solution: full rewrite matching cp.nvim/diffs.nvim style with bold
tagline, features list, requirements, installation, documentation,
FAQ (lazy.nvim setup with vim.g.oil, migration guide, alternatives),
and acknowledgements crediting the original author.

* revert: remove Makefile

Problem: Makefile was added in b9279b5 but was previously deleted
intentionally.

Solution: remove it.
This commit is contained in:
Barrett Ruth 2026-02-22 16:06:31 -05:00 committed by GitHub
parent 6f9ed9c7a7
commit b4ab166c39
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
18 changed files with 308 additions and 586 deletions

80
.github/ISSUE_TEMPLATE/bug_report.yaml vendored Normal file
View file

@ -0,0 +1,80 @@
name: Bug Report
description: Report a bug
title: 'bug: '
labels: [bug]
body:
- type: checkboxes
attributes:
label: Prerequisites
options:
- label:
I have searched [existing
issues](https://github.com/barrettruth/oil.nvim/issues)
required: true
- label: I have updated to the latest version
required: true
- type: textarea
attributes:
label: 'Neovim version'
description: 'Output of `nvim --version`'
render: text
validations:
required: true
- type: input
attributes:
label: 'Operating system'
placeholder: 'e.g. Arch Linux, macOS 15, Ubuntu 24.04'
validations:
required: true
- type: textarea
attributes:
label: Description
description: What happened? What did you expect?
validations:
required: true
- type: textarea
attributes:
label: Steps to reproduce
description: Minimal steps to trigger the bug
value: |
1.
2.
3.
validations:
required: true
- type: textarea
attributes:
label: 'Health check'
description: 'Output of `:checkhealth oil`'
render: text
- type: textarea
attributes:
label: Minimal reproduction
description: |
Save the script below as `repro.lua`, edit if needed, and run:
```
nvim -u repro.lua
```
Confirm the bug reproduces with this config before submitting.
render: lua
value: |
vim.env.LAZY_STDPATH = '.repro'
load(vim.fn.system('curl -s https://raw.githubusercontent.com/folke/lazy.nvim/main/bootstrap.lua'))()
require('lazy.nvim').setup({
spec = {
{
'barrettruth/oil.nvim',
init = function()
vim.g.oil = {}
end,
},
},
})
validations:
required: true

View file

@ -1,131 +0,0 @@
name: Bug Report
description: File a bug/issue
title: "bug: "
labels: [bug]
body:
- type: markdown
attributes:
value: |
Before reporting a bug, make sure to search [existing issues](https://github.com/stevearc/oil.nvim/issues)
- type: checkboxes
attributes:
label: Did you check the docs and existing issues?
options:
- label: I have read the docs
required: true
- label: I have searched the existing issues
required: true
- type: input
attributes:
label: "Neovim version (nvim -v)"
placeholder: "0.8.0 commit db1b0ee3b30f"
validations:
required: true
- type: input
attributes:
label: "Operating system/version"
placeholder: "MacOS 11.5"
validations:
required: true
- type: textarea
attributes:
label: Describe the bug
description: A clear and concise description of what the bug is. Please include any related errors you see in Neovim.
validations:
required: true
- type: dropdown
attributes:
label: What is the severity of this bug?
options:
- minor (annoyance)
- tolerable (can work around it)
- breaking (some functionality is broken)
- blocking (cannot use plugin)
validations:
required: true
- type: textarea
attributes:
label: Steps To Reproduce
description: Steps to reproduce the behavior.
placeholder: |
1. nvim -u repro.lua
2.
3.
validations:
required: true
- type: textarea
attributes:
label: Expected Behavior
description: A concise description of what you expected to happen.
validations:
required: true
- type: textarea
attributes:
label: Directory structure
description: The structure of the directory used to reproduce the bug
placeholder: |
a/b/foo.txt
a/bar.md
a/c/baz.txt
validations:
required: false
- type: textarea
attributes:
label: Repro
description:
Minimal `init.lua` to reproduce this issue. Save as `repro.lua` and run with `nvim -u repro.lua`
This uses lazy.nvim (a plugin manager).
You can add your config with the `config` key the same way you can do with packer.nvim.
value: |
-- save as repro.lua
-- run with nvim -u repro.lua
-- DO NOT change the paths
local root = vim.fn.fnamemodify("./.repro", ":p")
-- set stdpaths to use .repro
for _, name in ipairs({ "config", "data", "state", "runtime", "cache" }) do
vim.env[("XDG_%s_HOME"):format(name:upper())] = root .. "/" .. name
end
-- bootstrap lazy
local lazypath = root .. "/plugins/lazy.nvim"
if not vim.loop.fs_stat(lazypath) then
vim.fn.system({
"git",
"clone",
"--filter=blob:none",
"--single-branch",
"https://github.com/folke/lazy.nvim.git",
lazypath,
})
end
vim.opt.runtimepath:prepend(lazypath)
-- install plugins
local plugins = {
"folke/tokyonight.nvim",
{
"stevearc/oil.nvim",
config = function()
require("oil").setup({
-- add any needed settings here
})
end,
},
-- add any other plugins here
}
require("lazy").setup(plugins, {
root = root .. "/plugins",
})
vim.cmd.colorscheme("tokyonight")
-- add anything else here
render: Lua
validations:
required: true
- type: checkboxes
attributes:
label: Did you check the bug with a clean config?
options:
- label: I have confirmed that the bug reproduces with `nvim -u repro.lua` using the repro.lua file above.
required: true

5
.github/ISSUE_TEMPLATE/config.yaml vendored Normal file
View file

@ -0,0 +1,5 @@
blank_issues_enabled: false
contact_links:
- name: Questions
url: https://github.com/barrettruth/oil.nvim/discussions
about: Ask questions and discuss ideas

View file

@ -0,0 +1,30 @@
name: Feature Request
description: Suggest a feature
title: 'feat: '
labels: [enhancement]
body:
- type: checkboxes
attributes:
label: Prerequisites
options:
- label:
I have searched [existing
issues](https://github.com/barrettruth/oil.nvim/issues)
required: true
- type: textarea
attributes:
label: Problem
description: What problem does this solve?
validations:
required: true
- type: textarea
attributes:
label: Proposed solution
validations:
required: true
- type: textarea
attributes:
label: Alternatives considered

View file

@ -1,43 +0,0 @@
name: Feature Request
description: Submit a feature request
title: "feature request: "
labels: [enhancement]
body:
- type: markdown
attributes:
value: |
Before submitting a feature request, make sure to search for [existing requests](https://github.com/stevearc/oil.nvim/issues)
- type: checkboxes
attributes:
label: Did you check existing requests?
options:
- label: I have searched the existing issues
required: true
- type: textarea
attributes:
label: Describe the feature
description: A short summary of the feature you want
validations:
required: true
- type: textarea
attributes:
label: Provide background
description: Describe the reasoning behind why you want the feature.
placeholder: I am trying to do X. My current workflow is Y.
validations:
required: false
- type: dropdown
attributes:
label: What is the significance of this feature?
options:
- nice to have
- strongly desired
- cannot use this plugin without it
validations:
required: true
- type: textarea
attributes:
label: Additional details
description: Any additional information you would like to provide. Things you've tried, alternatives considered, examples from other plugins, etc.
validations:
required: false

View file

@ -8,7 +8,7 @@ jobs:
# issues in my "needs triage" filter.
remove_question:
runs-on: ubuntu-latest
if: github.event.sender.login != 'stevearc'
if: github.event.sender.login != 'barrettruth'
steps:
- uses: actions/checkout@v4
- uses: actions-ecosystem/action-remove-labels@v1

View file

@ -7,7 +7,7 @@ on:
jobs:
quality:
uses: ./.github/workflows/tests.yml
uses: ./.github/workflows/quality.yaml
publish:
needs: quality

View file

@ -1,21 +0,0 @@
name: luarocks
on:
push:
tags:
- 'v*'
jobs:
tests:
uses: ./.github/workflows/tests.yml
publish:
needs: tests
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: nvim-neorocks/luarocks-tag-release@v7
env:
LUAROCKS_API_KEY: ${{ secrets.LUAROCKS_API_KEY }}

View file

@ -1,85 +0,0 @@
name: Mirror Upstream PRs
on:
schedule:
- cron: "0 8 * * *"
workflow_dispatch:
permissions:
issues: write
jobs:
mirror:
runs-on: ubuntu-latest
steps:
- name: Mirror new upstream PRs
uses: actions/github-script@v7
with:
github-token: ${{ secrets.GITHUB_TOKEN }}
script: |
const upstream = { owner: 'stevearc', repo: 'oil.nvim' };
const fork = { owner: 'barrettruth', repo: 'oil.nvim' };
const since = new Date();
since.setDate(since.getDate() - 1);
const sinceISO = since.toISOString();
const { data: prs } = await github.rest.pulls.list({
...upstream,
state: 'open',
sort: 'created',
direction: 'desc',
per_page: 30,
});
const recentPRs = prs.filter(pr => {
if (new Date(pr.created_at) < since) return false;
if (pr.user.login === 'dependabot[bot]') return false;
if (pr.user.login === 'dependabot-preview[bot]') return false;
return true;
});
if (recentPRs.length === 0) {
console.log('No new upstream PRs in the last 24 hours.');
return;
}
const { data: existingIssues } = await github.rest.issues.listForRepo({
...fork,
state: 'all',
labels: 'upstream/pr',
per_page: 100,
});
const mirroredNumbers = new Set();
for (const issue of existingIssues) {
const match = issue.title.match(/^upstream#(\d+)/);
if (match) mirroredNumbers.add(parseInt(match[1]));
}
for (const pr of recentPRs) {
if (mirroredNumbers.has(pr.number)) {
console.log(`Skipping PR #${pr.number} — already mirrored.`);
continue;
}
const labels = pr.labels.map(l => l.name).join(', ') || 'none';
await github.rest.issues.create({
...fork,
title: `upstream#${pr.number}: ${pr.title}`,
body: [
`Mirrored from [stevearc/oil.nvim#${pr.number}](${pr.html_url}).`,
'',
`**Author:** @${pr.user.login}`,
`**Labels:** ${labels}`,
`**Created:** ${pr.created_at}`,
'',
'---',
'',
pr.body || '*No description provided.*',
].join('\n'),
labels: ['upstream/pr'],
});
console.log(`Created issue for upstream PR #${pr.number}: ${pr.title}`);
}

90
.github/workflows/quality.yaml vendored Normal file
View file

@ -0,0 +1,90 @@
name: quality
on:
workflow_call:
pull_request:
branches: [main]
push:
branches: [main]
jobs:
changes:
runs-on: ubuntu-latest
outputs:
lua: ${{ steps.changes.outputs.lua }}
markdown: ${{ steps.changes.outputs.markdown }}
steps:
- uses: actions/checkout@v4
- uses: dorny/paths-filter@v3
id: changes
with:
filters: |
lua:
- 'lua/**'
- 'plugin/**'
- 'spec/**'
- '*.lua'
- '.luarc.json'
- '*.toml'
markdown:
- '*.md'
lua-format:
name: Lua Format Check
runs-on: ubuntu-latest
needs: changes
if: ${{ needs.changes.outputs.lua == 'true' }}
steps:
- uses: actions/checkout@v4
- uses: JohnnyMorganz/stylua-action@v4
with:
token: ${{ secrets.GITHUB_TOKEN }}
version: 2.1.0
args: --check lua spec
lua-lint:
name: Lua Lint Check
runs-on: ubuntu-latest
needs: changes
if: ${{ needs.changes.outputs.lua == 'true' }}
steps:
- uses: actions/checkout@v4
- name: Lint with Selene
uses: NTBBloodbath/selene-action@v1.0.0
with:
token: ${{ secrets.GITHUB_TOKEN }}
args: --display-style quiet .
lua-typecheck:
name: Lua Type Check
runs-on: ubuntu-latest
needs: changes
if: ${{ needs.changes.outputs.lua == 'true' }}
steps:
- uses: actions/checkout@v4
- name: Run Lua LS Type Check
uses: mrcjkb/lua-typecheck-action@v0
with:
checklevel: Warning
directories: lua
configpath: .luarc.json
markdown-format:
name: Markdown Format Check
runs-on: ubuntu-latest
needs: changes
if: ${{ needs.changes.outputs.markdown == 'true' }}
steps:
- uses: actions/checkout@v4
- name: Setup pnpm
uses: pnpm/action-setup@v4
with:
version: 8
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: '20'
- name: Install prettier
run: pnpm add -g prettier@3.1.0
- name: Check markdown formatting with prettier
run: prettier --check .

22
.github/workflows/test.yaml vendored Normal file
View file

@ -0,0 +1,22 @@
name: test
on:
pull_request:
branches: [main]
push:
branches: [main]
jobs:
test:
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
nvim: [stable, nightly]
name: Test (Neovim ${{ matrix.nvim }})
steps:
- uses: actions/checkout@v4
- uses: nvim-neorocks/nvim-busted-action@v1
with:
nvim_version: ${{ matrix.nvim }}

View file

@ -1,60 +0,0 @@
name: Tests
on:
workflow_call:
push:
branches:
- main
pull_request:
branches:
- main
jobs:
selene:
name: Selene
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: NTBBloodbath/selene-action@v1.0.0
with:
token: ${{ secrets.GITHUB_TOKEN }}
args: --display-style quiet .
stylua:
name: StyLua
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Stylua
uses: JohnnyMorganz/stylua-action@v4
with:
token: ${{ secrets.GITHUB_TOKEN }}
version: v2.1.0
args: --check lua spec
typecheck:
name: typecheck
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: mrcjkb/lua-typecheck-action@v0
with:
checklevel: Warning
directories: lua
configpath: .luarc.json
run_tests:
strategy:
fail-fast: false
matrix:
nvim_version:
- stable
- nightly
name: Run tests
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: nvim-neorocks/nvim-busted-action@v1
with:
nvim_version: ${{ matrix.nvim_version }}