Files
nih-plug-template/tools/branding.conf
T
mikkeli 454e80bcd5 fix: separate cargo AUTHOR from Plugin::VENDOR, and rewrite sites precisely
Integrating this toolkit into Bari 206 surfaced two things the template
could not express, both of which would have produced wrong output.

**AUTHOR.** Cargo's authors entry names whoever wrote the plugin; VENDOR
is the organisation that ships it. Bari 206 separates them - "Mikkeli
Matlock" authored it, "Novoyuuparosk" vends it - while this template only
happened to work because its two placeholders were identical. AUTHOR is
now its own value defaulting to VENDOR, pinned in branding.conf only when
it actually differs so the file keeps showing that it derives.

**Site-directed rewriting.** That default is exactly what broke the
rename: with AUTHOR defaulting to VENDOR, both fields hold the same old
string, and a global value substitution cannot tell which occurrence
belongs to which. Renaming the vendor put the org name in the authors
field.

The site table already holds the old resolved literal for every site it
owns, and regeneration produces the new one, so rewriting by that pair is
unambiguous. brand-plugin.sh now does that first and falls back to value
substitution for everything the table does not enumerate - doc comments,
use sites in other modules, prose. The order matters and is load-bearing:
run the global pass first and it consumes the old literals, leaving the
precise pass nothing to match.

Verified on the ambiguous case: renaming with a distinct author now puts
the person in Cargo.toml's authors and the org in Plugin::VENDOR, where
the previous implementation put the org in both.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WHt4DykxXaQnyaJfyS8KCn
2026-09-02 16:36:34 +09:00

96 lines
4.4 KiB
Plaintext

# SPDX-License-Identifier: GPL-3.0-or-later
# branding.conf - this plugin's canonical identity.
#
# Managed by tools/brand-plugin.sh, read by tools/check-branding.sh. Hand-editing
# works and is sometimes the quickest thing, but the helper is what keeps this
# file, the source tree and tools/branding-sites.tsv agreeing with each other.
# Edit here and you are on the hook for running the checker afterwards.
# --- derivations ------------------------------------------------------------
# Defined before the values so the defaults below can use them.
# Package name: lowercased, every run of non-alphanumerics becomes one
# underscore. Cargo accepts hyphens too and maps them to underscores for the
# built artifact, which nih_plug_xtask already handles; underscores are used to
# match the Rust convention.
_derive_pkg() {
printf '%s' "$1" | tr '[:upper:]' '[:lower:]' \
| sed -e 's/[^a-z0-9]\{1,\}/_/g' -e 's/^_//' -e 's/_$//'
}
# Rust type name: CamelCase, non-alphanumerics dropped.
_derive_struct() {
printf '%s' "$1" | sed -e 's/[^A-Za-z0-9]\{1,\}/ /g' \
| awk '{for(i=1;i<=NF;i++) printf "%s%s", toupper(substr($i,1,1)), substr($i,2); print ""}'
}
# --- the names ---------------------------------------------------------------
PLUGIN_NAME="Plugin Name" # the one name everything else derives from
VENDOR="Your Name" # Plugin::VENDOR - the org, not the person
EMAIL="your@email.com" # Plugin::EMAIL
# Cargo's authors entry names whoever wrote it, which is not always the vendor:
# an org ships the plugin, a person authored it. Defaults to VENDOR when the two
# are the same, which is the common case for a one-person project.
# AUTHOR="Your Name"
HOMEPAGE="https://github.com/YOUR-USERNAME/YOUR-PLUGIN-NAME" # -> Plugin::URL
DESCRIPTION="A minimal NIH-plug audio plugin" # Cargo description
# What the plugin does *now*. No codename, no "prototype", no "v2 rewrite" -
# hosts show this to users who never knew any of that. check-branding.sh
# enforces the mechanical half by rejecting retired names and the repo codename.
CLAP_DESCRIPTION="Your plugin description"
# --- frozen identity ---------------------------------------------------------
# Hosts key saved projects and presets off these two. Change either and every
# existing session silently loses the plugin: the track comes up empty, with no
# error. Choose once before the first release, then never again.
# brand-plugin.sh refuses to move them without --allow-identity-change.
CLAP_ID="com.your-domain.plugin-name" # reverse-DNS, lowercase, no spaces
VST3_CLASS_ID="Unique16CharId!!" # MUST be exactly 16 bytes
# --- fixed at repo creation --------------------------------------------------
# The repository's own name. Deliberately NOT renamed when the plugin is: the
# repo keeps its development codename while the plugin gets a product name.
# Recorded only so it can be kept out of user-facing text.
CODENAME="nih-plug-template"
# Where the two Rust types are defined. A plugin whose params outgrow lib.rs
# points PARAMS_FILE at src/params.rs.
LIB_FILE="src/lib.rs"
PARAMS_FILE="src/lib.rs"
# --- derived unless overridden -----------------------------------------------
# Set one only when the derivation is wrong or rejected - a name like
# "206 Prototype" derives to "206_prototype", which cargo refuses because a
# package name cannot start with a digit.
#
# This template overrides three of them, which a real plugin usually will not:
# its package and type names are the template's own rather than derived from a
# product name. Delete these three lines after renaming and the derivations
# from PLUGIN_NAME take over.
PKG="nih_plug_template"
STRUCT="MyPlugin"
PARAMS_STRUCT="PluginParams"
# DISPLAY="Plugin Name" # defaults to PLUGIN_NAME
: "${AUTHOR:=$VENDOR}"
: "${DISPLAY:=$PLUGIN_NAME}"
: "${PKG:=$(_derive_pkg "$PLUGIN_NAME")}"
: "${STRUCT:=$(_derive_struct "$PLUGIN_NAME")}"
: "${PARAMS_STRUCT:=${STRUCT}Params}"
# --- retired spellings -------------------------------------------------------
# Must no longer appear in tracked files. An entry is skipped while it is still
# part of a canonical value above and arms the moment it stops being one, so a
# rename is self-checking in both directions. brand-plugin.sh appends here.
STALE="nih_plug_template
MyPlugin
PluginParams
A minimal NIH-plug audio plugin
Your plugin description
Plugin Name
Your Name
your@email.com
com.your-domain.plugin-name
Unique16CharId!!
YOUR-USERNAME
YOUR-PLUGIN-NAME
your-domain"