freshl 0.20260603.1

Modern ls replacement with git awareness
Documentation
# Copyright © 2026 Michael Shields
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

.PHONY: build install test lint fmt coverage run clean publish publish-dry-run

# Override to pin to a specific nightly date (e.g. nightly-2026-04-12) when a
# bleeding-edge nightly destabilises llvm-cov instrumentation.
NIGHTLY ?= nightly

# Override to swap the Markdown formatter front-end (e.g. PRETTIER='npx --yes
# prettier' in CI where bun is not installed).
PRETTIER ?= bunx prettier

build:
	cargo build --release

install:
	cargo install --path .

test:
	cargo test --all-targets

lint:
	cargo fmt --check
	cargo clippy --all-targets -- -D warnings
	$(PRETTIER) --check '**/*.md'

fmt:
	cargo fmt
	$(PRETTIER) --write '**/*.md'

# cargo-llvm-cov auto-sets cfg(coverage_nightly) on nightly; passing --cfg
# explicitly is rejected. Do not add --cfg coverage_nightly here.
#
# The 100% gate is on *production* code. Integration-test files under tests/
# (the generative property/differential harness) are excluded from the report
# via --ignore-filename-regex: they still run and exercise src/, but their own
# lines aren't held to the line gate — a random generator can't be expected to
# execute every branch on a fixed seed. Inline `#[cfg(test)]` modules in src/
# stay measured (they're deterministic and already fully covered). The heaviest
# generators additionally gate themselves out of the coverage *build* with
# `#![cfg(not(coverage_nightly))]` to keep the pre-commit hook fast.
coverage:
	cargo +$(NIGHTLY) llvm-cov --fail-under-lines 100 --ignore-filename-regex '(^|/)tests/'

run:
	cargo run --release --

clean:
	cargo clean

# Publish to crates.io. The committed Cargo.toml omits `version` and `publish`;
# `gitcalver prepare-publish` injects both into a throwaway copy of HEAD so the
# source tree stays version-less. Requires `gitcalver` on PATH
# (`cargo install gitcalver`). Refuses a dirty tree or off-(default-)branch HEAD.
publish publish-dry-run:
	@set -e; \
	src=$$(pwd); \
	tmp=$$(mktemp -d); \
	trap 'rm -rf "$$tmp"' EXIT INT TERM; \
	git archive HEAD | tar -x -C "$$tmp"; \
	ver=$$(gitcalver prepare-publish --prefix 0. --manifest "$$tmp/Cargo.toml" --source-dir "$$src"); \
	$(if $(findstring dry,$@),echo "Would publish version $$ver";) \
	cd "$$tmp"; \
	CARGO_TARGET_DIR="$$src/target" cargo check --quiet; \
	CARGO_TARGET_DIR="$$src/target" cargo publish $(if $(findstring dry,$@),--dry-run,)