# Changelog

All notable changes to sbo-create are documented in this file.

## [2.3.1] - 2026-05-21
### Added
- **`.crate` source extension**: Rust `.crate` files are now recognised as
  source archives in `validate --strict`, `--fix`, `clean`, and `package`.

### Fixed
- **`bump --with-sources` MD5SUM indentation**: continuation lines in the
  rewritten MD5SUM field were indented 8 spaces instead of the SBo-standard
  2 spaces.
- **wget --continue option**: Replace --continue option with -N to properly 
  replace file with the same name.
- **`validate --fix` adds trailing blank line to README**: `--fix` was
  incorrectly adding an extra newline to README files that already ended
  with a proper `\n`, leaving them with a trailing blank line (`\n\n`).
  The fixer now strips all extra trailing newlines down to exactly one `\n`.
  `validate` no longer requires `\n\n`; instead it reports an error when one
  or more trailing blank lines are detected, which `--fix` resolves automatically.
- **Trailing newline checks for all submission files**: `validate` now checks
  `.info`, `.SlackBuild`, `slack-desc` and `README` for both missing final
  newline (`\n`) and trailing blank lines (`\n\n`), reported as a new
  "Trailing newlines" error group. `--fix` corrects both issues in all four files.

## [2.3.0] - 2026-04-23

### Changed
- **`repo` command group**: `diff`, `sync`, `submit`, `copy` are now subcommands
  of `sbc repo` (e.g. `sbc repo diff`, `sbc repo submit`). The old flat forms
  (`sbc diff`, `sbc sync`, `sbc submit`, `sbc copy`) are removed.
- **`repo submit`**: the pre-confirmation file listing now shows only files that
  have actually changed (via `git status --short`), with a single-character
  status indicator (`M` modified, `A` added, `D` deleted, `?` untracked)
  instead of listing all files in the package directory.

### Added
- **`repo log`**: new subcommand that shows packages committed on the current
  branch since the last public SBo update, parsed from commit subjects of the
  form `category/prgnam: Updated for version X.Y.Z.`

### Fixed
- **`package`**: the submission tarball now includes all files in the package
  directory except downloaded source archives — `doinst.sh`, `douninst.sh`,
  patches, `.desktop` files, and any other extras are no longer silently omitted.
- **`diff`**: lines missing a trailing newline no longer concatenate with the
  next diff line; a `\ No newline at end of file` marker is now printed after
  such lines, matching the behaviour of `git diff`.
- **`bump --with-sources`**: when one or more source downloads fail, the summary
  now shows `MD5SUM FAILED` (and a warning that checksums were not updated)
  instead of the misleading `MD5SUM OK`.


## [2.2.0] - 2026-04-16

### Added
- **`scan TARBALL`** subcommand: Scan a source tarball for potential dependencies.
  Opens the tarball without full extraction and parses known build-system metadata
  files: `PKG-INFO`, `pyproject.toml`, `setup.cfg`, `requirements.txt` (Python),
  `Cargo.toml` (Rust), `META.yml`, `META.json` (Perl), `package.yaml` (Haskell),
  `Gemfile` (Ruby), `CMakeLists.txt` (CMake), `configure.ac` (autotools),
  `meson.build` (Meson). Prints dependencies with full version specifiers and
  runtime version requirements (e.g. `python >=3.10`, `rust-version = "1.65"`,
  `perl 5.010`, `ruby ~> 3.0`) as suggestions.
- **`scan --format FORMAT`** (`-F`): Limit the scan to a specific ecosystem
  (`python`, `rust`, `perl`, `haskell`, `ruby`, `cmake`, `autotools`, `meson`).
- **`validate --all`** (`-A`): Scan all packages in the local SBo repository that
  belong to the configured maintainer and validate each one. Prints a one-line
  summary per package (`category/name  OK` or `N errors, N warnings`). Exits 1 if
  any package fails. Requires `SBO_REPO_PATH` to be configured. Supports
  `--maintainer NAME` to override the configured name and `--path PATH` to override
  the repo root.
- **`validate --path PATH`** (`-p`): Validate a specific directory instead of the
  current working directory. When combined with `--all`, use `PATH` as the repo
  root to scan.
- **`validate --strict`**: The `Homepage:` URL in `slack-desc` (if present) is
  now checked for HTTPS and accessibility, identical to the `.info` `HOMEPAGE`
  check. Reported as a separate `slack-desc Homepage` entry in the results table.
- **`validate --strict --fix`**: Automatically replaces `http://` with `https://`
  in the `Homepage:` line of `slack-desc`, matching the existing fix for `HOMEPAGE`
  in `.info`.
- **`copy`** subcommand: Copy local package files from the current directory
  to the corresponding package directory in the SBo repository
  (`SBO_REPO_PATH/category/prgnam/`). The package name is auto-detected from
  the `.info` file. Source tarballs are excluded. Lists the files to be copied
  and prompts for confirmation before proceeding.
- **Shell completion**: Package name completion from `slackbuilds.json` for
  `fetch`, `check`, `search`, `deps`, `rdeps`, and `diff`.
- **Shell completion** (`fetch -f`): Completes `<pkg>.info`, `<pkg>.SlackBuild`,
  `README`, and `slack-desc` using the package name already typed on the command
  line.

### Changed
- **`scan`**: Metadata files that produce identical dependency sets are now grouped
  under a single label (e.g. `PKG-INFO, pyproject.toml:`) instead of being printed
  separately.
- **`fetch NAME`**: positional `NAME` is now required; omitting it produces an
  argparse error instead of a custom message.
- **`fetch -M NAME`**: `--maintainer` is now a boolean flag; the maintainer
  name is passed as the positional `NAME` argument. `NAME` is always required
  (the implicit "use configured name" fallback has been removed).
- **`fetch -f FILE` / `fetch --file FILE`**: renamed from `-w`/`--view` for
  clarity. `FILE` is required; omitting it produces an argparse error.

### Fixed
- All fetch argument validation is now handled by argparse; no custom error
  messages remain for missing arguments.
- The custom error handler in `_SBoCreateParser` no longer intercepts invalid
  flag-value choices (e.g. `scan -F pyton`) as "Unknown command". Flag errors
  now fall through to the standard argparse message.
- Man page: corrected `--view` reference to `--file` in the `SBO_REPO_PATH`
  description.


## [2.1.0] - 2026-04-12

### Added
- **`rdeps NAME`** subcommand: Show which packages in the SBo repository depend
  on a given package (reverse dependencies). Scans the cached `SLACKBUILDS.TXT`
  requires map and prints a flat list by default: direct dependees with branch
  connectors, transitive dependees indented without connectors, followed by a
  `N direct, N transitive.` summary. Cycles are detected and silently stopped.
  Options:
  - **`-t` / `--tree`**: Show a full recursive reverse dependency tree with
    branch connectors instead of the flat list.
- **`repology`** subcommand: Query [repology.org](https://repology.org) for
  package version status by maintainer e-mail. Fetches all packages associated
  with the configured (or supplied) e-mail and prints a table with package name,
  version, and status (`newest`, `outdated`, `problematic`, `unique`, etc.).
  Uses paginated API requests with a 1-second pause between pages to respect
  rate limits; on HTTP 429 waits for the `Retry-After` delay (default 10 s)
  and retries once. Sends a well-formed `User-Agent` header as required by the
  repology API.
  Options:
  - **`-n` / `--newest`**: Show only up-to-date packages.
  - **`-o` / `--outdated`**: Show only outdated packages.
  - **`-p` / `--problematic`**: Show only problematic packages.
  - **`-m EMAIL` / `--maintainer EMAIL`**: Override the configured maintainer
    e-mail for this query.
  When none of `-n`, `-o`, `-p` is given, all categories are shown.
- **`diff`** subcommand: Show a unified diff between local package files
  (`.SlackBuild`, `.info`, `slack-desc`, `README`) and the corresponding files
  in the SBo repository (`SBO_REPO_PATH/category/prgnam/`). Only files present
  in both locations are compared. Prints `No differences found` when all files
  are identical. Accepts `-U N` / `--unified N` to control the number of
  context lines (default: 3).
- **`sync`** subcommand: Synchronise the local SBo git repository after a
  weekly public update. Runs `git checkout <main>`, `git pull`, `git branch -D
  <branch>`, and `git checkout -B <branch>` in sequence. The `-D` step is
  skipped automatically on first-time use when the branch does not yet exist.
  Requires `SBO_REPO_PATH` and `GIT_BRANCH` to be set in `maintainer.config`.
- **`submit`** subcommand: Commit and push the current package to the SBo git
  repository, or open `https://slackbuilds.org/submit/` in the default browser
  if `SBO_REPO_PATH` is not configured. Before committing, warns if the working
  branch is behind the main branch and suggests running `sbc sync`. Proposes a
  commit message of the form `category/prgnam: Updated for version X.Y.Z.`
  (editable). Asks whether to push after the commit. Displays the exact git
  commands before executing and requires final confirmation. On the first push
  of a new branch (no upstream configured), automatically uses
  `git push --set-upstream origin <branch>`.
- **`maintainer.config`**: Three new fields with pre-declared defaults:
  `SBO_REPO_PATH` (path to local SBo git clone, empty by default),
  `GIT_BRANCH` (maintainer's working branch, e.g. `user/dslackw/updates`),
  `GIT_MAIN_BRANCH` (upstream main branch, default `master`),
  `GIT_COMMIT_CMD` (default `git commit -asm`),
  `GIT_PUSH_CMD` (default `git push`).
- **`maintainer` clear field**: Typing `!` at any prompt clears the field to
  empty, allowing previously set values (e.g. `SBO_REPO_PATH`) to be removed.
  Pressing Enter continues to keep the current value. A note is shown at the
  top of the prompt explaining both behaviours.
- **`validate --fix`**: When a MD5SUM mismatch is detected and the source
  tarball is already present locally, prompts the user to recompute the
  checksum from the local file and update the `.info` file automatically.
  Works with multiple checksums (multi-source packages).
- **`deps NAME`** subcommand: Show the full recursive dependency tree for a
  package using the `REQUIRES` field from `SLACKBUILDS.TXT`. Cycles are
  detected and skipped. Prints a summary of direct and total transitive
  dependencies.
- **`fetch NAME`** subcommand: Download and extract a SlackBuild package from
  the SBo repository into a `<NAME>/` subdirectory. The Slackware version is
  auto-detected from `/etc/slackware-version`. Use `-V`/`--slackware-version`
  to override (e.g. `sbc fetch myapp -V 14.1`). Prompts for confirmation if
  the directory already exists. When `SBO_REPO_PATH` is configured, copies
  directly from the local repository without a network request.
- **`fetch --view NAME`**: List the files available for a package without
  fetching it.
- **`fetch --view NAME/FILE [NAME/FILE ...]`**: Print the content of one or
  more files from a package (e.g. `sbc fetch --view vim/vim.info`). All files
  must belong to the same package.
- **`fetch -M [NAME]` / `fetch --maintainer [NAME]`**: List all packages
  maintained by the given maintainer name. If NAME is omitted, uses the name
  from `maintainer.config`. Use `-W` / `--wide` for a wider output format.
- **`edit`** subcommand: Open all package files (`prgnam.info`, `prgnam.SlackBuild`,
  `slack-desc`, `README`) in the editor configured in `maintainer.config`.
  Falls back to `vim` if no editor is set.
- **`edit -e EDITOR` / `edit --editor EDITOR`**: Override the configured editor
  for a single invocation (e.g. `sbc edit --editor subl`).
- **`rename NAME`** subcommand: Rename `prgnam.SlackBuild` and `prgnam.info` to
  the new name. Updates `PRGNAM=` in both files, the `# Slackware build script
  for` header in `.SlackBuild`, and all occurrences of the package name in
  `slack-desc` (prefix and body) using word-boundary matching to avoid partial
  replacements. The current name is auto-detected from the `.info` file.
  Prompts for confirmation before renaming.
- **`create` interactive mode**: Running `sbc create` with no flags now starts
  a step-by-step prompt (package name, version, template, ARM64 support,
  output directory), replacing the old requirement to pass all values as flags.
  Pressing Enter at any prompt accepts the shown default. The template is
  selected with ← → arrow keys; the active choice is highlighted in cyan.
- **`create NAME`**: Package name can now be given as a positional argument
  (e.g. `sbc create myapp`) as a shorthand for `-n`. `-n` takes precedence
  if both are given.
- **`validate`**: Output now shows a per-check summary table (✓/✗ per group)
  before the error details, making it easy to see which checks passed and
  which failed at a glance.
- **`create --strip-comments`**: Remove full comment lines and inline comments
  from the `.SlackBuild` body, keeping the shebang and the copyright/license
  header. Shell parameter expansions containing `#` (e.g. `${var##pattern}`)
  are not affected. Consecutive blank lines are collapsed into one.
- **`info`** subcommand: Display parsed `.info` file fields in a readable
  format (PRGNAM, VERSION, HOMEPAGE, DOWNLOAD count, MD5SUM count, REQUIRES,
  MAINTAINER, EMAIL).
- **`search NAME [NAME ...]`** subcommand: Search for packages in the SBo
  repository by partial name match. Prints matching package names with their
  category. Supports multiple search terms in a single invocation.
- **`clean`** subcommand: Remove downloaded source tarballs from the current
  directory. Lists files to be removed and prompts for confirmation.
- **`download -u` / `download --check-urls`**: Perform HTTP HEAD requests on
  all `DOWNLOAD` URLs to verify accessibility without downloading any files.
  Reports `OK` (200), `WARN (HEAD not supported)` (405),
  `REDIRECT` (3xx), or `FAILED` (4xx/5xx/connection error) per URL.
- **`validate -s` / `validate --strict`**: Additional pre-submission checks:
  DOWNLOAD URLs must use HTTPS, `VERSION` must not contain spaces, `HOMEPAGE`
  must use HTTPS and be accessible (HEAD request), `.SlackBuild` must not be
  executable, and `slack-desc` must have exactly 19 lines.
- **`validate -f` / `validate --fix`**: Auto-fix common issues across all
  package files (`.info`, `README`, `.SlackBuild`, `slack-desc`). Fixes
  trailing whitespace, missing final newline, malformed double quotes in
  `.info` field values, corrupted field names via fuzzy matching, executable
  bit on `.SlackBuild`, missing blank line at end of `README`, `slack-desc`
  line prefix and spacing, misaligned handy-ruler, `HOMEPAGE` using `http://`
  instead of `https://`, `VERSION` mismatch between `.info` and `.SlackBuild`,
  and source tarballs present in the package directory (prompts for
  confirmation before removing). Reports `FIXED` or `OK` per check.
- **`validate --md5` / `-m`**: Show detailed warnings for each missing or
  untracked source tarball during validation.
- **`package`** subcommand: Create the submission tarball (`<prgnam>.tar.gz`).
  Prompts whether to run `validate --strict` before packaging; aborts if
  validation fails. The tarball is created in the parent directory of the
  package folder. Accepts `-o DIR` to write the tarball to a specific output
  directory.
- **`REQUIRES` existence check**: Automatically verify that dependencies
  listed in the `.info` file exist in the SBo repository.
- **Local package caching**: `SLACKBUILDS.TXT` is now cached locally in
  `~/.local/share/sbo-create/repo/` during update, making validation and
  existence checks instantaneous and supporting offline use.
- **File-based template system**: Templates are now loaded at runtime from
  `~/.local/share/sbo-create/templates/` instead of hardcoded Python strings.
- **`update`** subcommand: Download the latest template files directly
  from https://slackbuilds.org/templates/ into `~/.local/share/sbo-create/templates/`,
  with per-file OK/FAIL output. Must be run before first use.
- **`list`** subcommand: List available SlackBuild templates and exit.
- **`validate`** subcommand: Validate all package files against SBo submission
  guidelines. Checks `.info` fields, MD5SUM checksums (valid 32-char hex),
  DOWNLOAD URLs (format and trailing `/`), HOMEPAGE URL scheme, `slack-desc`
  formatting (prefix, spacing, line length, handy-ruler, first-line format),
  and `.SlackBuild` structure. Prints a `Tip:` when errors are found and
  `--fix` was not used. Skipped checksum warnings appear as `Note:` lines
  after a passing result.
- **`bump VERSION`** subcommand: Bump the version string in `.info` and
  `.SlackBuild` files non-interactively.
- **Manpage**: Added `man/sbo-create.1` following standard groff/troff format.
- **`create -a` / `create --arm64`**: Enable ARM64 architecture support in the
  generated `.info` file.
- **`TemplateLoader` class** (`template_loader.py`): Reads raw SBo template
  files and performs placeholder substitution for `prgnam`, `version`, `year`,
  `maintainer`, `location`, and ARM64 architecture.
- **pytest test suite** (`tests_pytest/`): 199 tests.
- **`maintainer`** subcommand: Interactive CLI prompt to create or update
  `~/.config/sbo-create/maintainer.config`. Existing values are shown as
  defaults; pressing Enter keeps the current value. The config directory
  is created automatically if it does not exist.
- **`maintainer -S` / `maintainer --show`**: Print current maintainer
  configuration and exit without prompting.
- **`check NAME [NAME ...]`** subcommand: Check if one or more packages exist
  in the SBo repository. Prints a color-coded result for each package.
- **`create -o DIR` / `create --output DIR`**: Write files created by `create`
  to a specified directory instead of the current working directory.
  The directory is created automatically if it does not exist.
- **`package -o DIR` / `package --output DIR`**: Write the submission tarball
  to a specified directory.
- **`create -D` / `create --dry-run`**: Show the files that would be created
  by `create` without writing anything to disk.
- **`.SlackBuild` structural checks**: `validate` now checks for mandatory
  SBo fields: `#!/bin/bash` shebang, `BUILD` variable, `TAG=${TAG:-_SBo}`,
  and `PKGTYPE=${PKGTYPE:-tgz}`.
- **`--no-color`**: Global option to disable colored output. Works before or
  after the subcommand (e.g., `sbo-create --no-color validate` or
  `sbo-create validate --no-color`).
- **`bump -W` / `bump --with-sources`**: Replace the old version string in
  `DOWNLOAD` URLs, download the new sources, and recompute `MD5SUM` /
  `MD5SUM_x86_64` in the `.info` file. Each step is reported with OK, FAILED,
  or WARNING (when the version string is not found in a URL).
  A confirmation prompt is shown before downloading.
  Download output uses the same aligned format as the `download` command.

### Changed
- **Dynamic program name**: All error and warning messages now use the actual
  invocation name (`sbc` or `sbo-create`) instead of the hardcoded string
  `sbo-create`. A module-level `PROG` constant in `models.py` (derived from
  `sys.argv[0]` at import time) is imported by all handlers.
- **`maintainer` optional config fields**: `SBO_REPO_PATH`, `GIT_BRANCH`,
  `GIT_MAIN_BRANCH`, `GIT_COMMIT_CMD`, and `GIT_PUSH_CMD` no longer produce
  warnings when absent from an existing `maintainer.config`. They are treated
  as optional and fall back to their built-in defaults silently.
- **`check`, `search`, `fetch` local-first**: When `SBO_REPO_PATH` is
  configured, these commands operate directly on the local repository
  directory instead of querying `SLACKBUILDS.TXT`, making them instantaneous
  and available offline.
- **`diff`**: Now also lists files present locally but absent from the SBo
  repository under a `New in local (not in SBo repo):` section, including
  source tarballs, so forgotten test files are visible before submission.
- **`submit`**: Lists the files in each package directory before the
  `Proceed?` confirmation prompt, so the maintainer can verify what will
  be committed.
- **`validate --strict` VERSION mismatch**: The error message now highlights
  the `.SlackBuild` filename in red, consistent with all other error messages.

### Fixed
- **Python 3.9 compatibility**: Nested f-strings with identical quote characters
  (valid only from Python 3.12) replaced with local variable extraction in
  `fetch_package()`.

- **`create` now creates a `<prgnam>` subdirectory**: Files are written to
  `./<prgnam>/` instead of the current directory, matching the SBo layout.
  If the current directory is already named `<prgnam>`, files are created
  there directly (no double nesting). `--output DIR` sets the parent
  directory in which `<prgnam>/` is created.
- **`validate` summary icons**: `✓`/`✗` are shown on UTF-8 terminals; plain
  `OK`/`FAIL` on non-UTF-8 terminals for compatibility.
- **`validate --fix`**: Removed automatic `http://` → `https://` replacement
  from DOWNLOAD and HOMEPAGE fields. ~16% of SBo packages use `http://` only;
  auto-upgrading would silently break those downloads.
- **Short options added**: `-N` for `--no-color` (global), `-s` for
  `--strip-comments` (create). All CLI options now have a short form.
- **Bash and zsh shell completion scripts** added under `completions/`;
  installed to `/etc/bash_completion.d/` and
  `/usr/share/zsh/site-functions/` by the SlackBuild.

### Removed
- **TUI / interactive menu**: The `dialog`-based interactive menu has been
  removed entirely. `sbo-create` is now a pure CLI tool.
- **`pythondialog` dependency**: No longer required.
- **TUI maintainer editor**: Replaced by the new `maintainer` subcommand
  (see Added above).

### Changed
- **`check`** exit codes: The `sbo-create check` command now correctly exits
  with `0` (Success) when a package is found in the SBo repository, and `1`
  (Error) when it is not found, conforming to standard Unix shell scripting logic.
- **`validate`** output:
  - Improved validation output to consolidate missing checksum warnings by default.
    Detailed missing file warnings and untracked tarball discovery are now gated behind the `--md5` flag.
  - Consolidated duplicate "source tarballs must not be included" messages into a single warning.
  - Strict existence checking for all 10 mandatory SBo variables in `.info` files, distinguishing between missing variables and empty ones.
  - The "must not be executable for SBo submission" check on `.SlackBuild` files is now correctly restricted to the `package` command.
- **Subcommand-based CLI**: The flat flag interface has been replaced with
  `argparse` subcommands (`create`, `download`, `check`, `list`, `validate`,
  `bump`, `package`, `update`, `maintainer`). Each subcommand naturally scopes
  its own options, eliminating manual dependency checks.
- **First-run behaviour**: If `~/.local/share/sbo-create/templates/` does not
  exist, a message is shown instructing the user to run `sbo-create update`.
  Templates are no longer bundled with the package.
- **No-argument behaviour**: Running `sbo-create` without any arguments now
  prints the help message and exits.
- **doinst.sh / douninst.sh**: An informational header comment is prepended
  to the template files by `sbo-create update`.
- **CLI options renamed** for clarity and consistency:
  - `-e` / `--prg-version` → `-r` / `--prg-version`
- **`-h` / `--help`** moved to the bottom of the help output, below `--version`.
- **`templates_path`** added to `AppContext`: `~/.local/share/sbo-create/templates/`.
- **`urllib3`** added as an explicit runtime dependency.

### Refactored
- **Composition-based architecture**: `main.py` split into focused handler modules:
  `FileHandler`, `MiscHandler`.
- **CLI parser replaced**: Custom argument parser replaced with `argparse` subcommands
  and moved to `cli.py`. Removed `utils.py` and its `usage()` / `clear_and_exit()` functions.
- **`sbo_create/templates/`** Python string package removed (~1200 lines of
  hardcoded templates replaced by file-based loading).

### Fixed
- Fixed a bug where parsing multi-line variables in `.info` files could fail
  if subsequent variables were missing.
- Fixed a silent failure where a missing `PRGNAM` variable in the `.info` or
  `.SlackBuild` file was not reported.
- Fixed a memory exhaustion issue (MemoryError) when hashing extremely large
  source tarballs by reading files in 64KB chunks during MD5 computation.
- **`wget` download directory**: Sources are now correctly downloaded to the
  directory specified by `-o` / `--output` (or the program name directory)
  instead of the current working directory.
- **`.info` parsing with multiple `=`**: Fixed a bug where values containing
  multiple equals signs (e.g., URLs with query strings) were truncated.
- **Multi-line `.info` validation**: Fixed a false positive in `validate`
  where multi-line fields were flagged as not being enclosed in double quotes.
- **Line continuation backslashes**: Backslashes (`\`) used for line
  continuation in `.info` files are now correctly removed during internal
  processing (MD5 checks, downloads) without affecting the file on disk.
- **Validation quote handling**: Fixed a bug where values with a single
  double quote incorrectly passed validation; at least two quotes are now
  required.
- **Multi-line version bump**: Fixed a bug where only the first URL in a
  multi-line `DOWNLOAD` field was updated during a version bump.
- **Source detection refined**: `_check_no_sources` now only checks files
  (ignoring directories) and uses stricter suffix matching to avoid false
  positives.
- **`fix_quotation_mark()`**: `rstrip()` result was not persisted to
  `ctx.fields`, leaving trailing whitespace in the saved file.
- **README not created**: Opening the README editor for a new package no longer
  silently does nothing — an empty file is created first.
- **Grammar**: "is not exist" → "does not exist" in error messages.
- **Validate output width**: Fixed `width=60` that truncated long error
  messages; width is now calculated dynamically from the longest error line.

### Changed
- **`validate --fix`** output format: replaced per-file blocks with a compact
  `Fixing files:` table — one line per check across all files, with a
  `FIXED` / `OK` status column.
- **`validate`**: PRGNAM is no longer checked in `.SlackBuild` (validate and
  `--fix`) — variable names in `.SlackBuild` are the maintainer's
  responsibility.
- **`validate`**: Removed redundant `(use '--fix' to correct)` hint from
  individual error messages; the `Tip:` line at the end covers this.
- **`validate`**: Skipped checksum warnings no longer appear under
  `Validation errors`; they are shown as `Note:` lines after a passing result.


## [2.0.8] - 2024-02-14

### Added
- AARCH64 (ARM64) architecture support in the `.info` file template.
  (Thanks to Kermit DaFrog)

### Changed
- License updated to GNU General Public License v3 (GPLv3).
- Build configuration migrated to `pyproject.toml`.


## [2.0.7] - 2023-11-20

### Fixed
- Downloading and checksum handling for sources marked as `UNSUPPORTED` in the
  `.info` file. ([#3](https://gitlab.com/dslackw/sbo-create/-/issues/3))


## [2.0.6] - 2023-06-06

### Added
- SBo repository version field in the maintainer configuration file.
- `douninst.sh` uninstall script support.

### Fixed
- Incorrect formatting in the `slack-desc` template.
- Build errors in the `meson` SlackBuild template.
- HTTP error handling during source downloads.

### Updated
- Maintainer configuration file format.
- All SlackBuild templates updated to reflect current SBo guidelines:
  `doinst.sh`, `python`, `autotools`, `cmake`, `perl`, `rubygem`, `haskell`, `meson`.


## [2.0.5] - 2023-06-04

### Added
- Additional CLI options for non-interactive file creation.

### Fixed
- Incorrect MD5 checksum written to the `.info` file.

### Changed
- General code quality improvements and refactoring.


## [2.0.4] - 2023-01-31

### Fixed
- `IndexError: list index out of range` when reading malformed `.info` files.
  ([#1](https://gitlab.com/dslackw/sbo-create/-/issues/1))


## [2.0.3] - 2022-12-29

### Fixed
- Incorrect shebang and variable handling in generated SlackBuild scripts.
  (Thanks to A. Rozell, [!1](https://gitlab.com/dslackw/sbo-create/-/merge_requests/1))


## [2.0.2] - 2022-12-27

### Added
- Help button added to all dialog form screens.


## [2.0.0] - 2022-12-12

### Added
- Check whether a SlackBuild with the same name already exists in the SBo
  repository before proceeding.
- Editor options field in the maintainer configuration.

### Changed
- Project renamed from **sbo-templates** to **sbo-create**.


## [1.3.5] - 2022-05-25

### Fixed
- Typos in the README file.

### Changed
- Shell scripts switched from `/bin/sh` to `/bin/bash`.


## [1.3.4] - 2022-04-29

### Changed
- All SlackBuild templates updated to use `/bin/bash`.


## [1.3.3] - 2022-03-19

### Changed
- SlackBuild templates updated for Slackware 15.0 compatibility.


## [1.3.2] - 2020-02-28

### Added
- Python 3 support in the Python SlackBuild template.


## [1.3.1] - 2019-12-04

### Fixed
- Incorrect quoting in generated `.info` files.

### Changed
- Default application placeholder renamed from `appname` to `sboname`.


## [1.3.0] - 2019-12-01

### Changed
- Codebase ported to Python 3.


## [1.1.0] - 2019-10-16

### Added
- Meson build system SlackBuild template.

### Fixed
- Errors in the autotools SlackBuild template.


## [1.0.9] - 2019-02-24

### Added
- Source download functionality from URLs listed in the `.info` file.

### Fixed
- Dialog menu width calculation for long program names.


## [1.0.8] - 2019-02-24

### Fixed
- Reading and writing the `slack-desc` file correctly.


## [1.0.7] - 2019-02-23

### Added
- MD5SUM checksum computation and automatic update of the `.info` file.

### Fixed
- Reading the `slack-desc` file.
- Parsing multi-line fields in the `.info` file.
- Maintainer data not preserved in existing `.info` files.
- `slack-desc` enforced to exactly 11 description lines.
- Directory existence check before writing files.

### Changed
- Script renamed to `sbotmp`.


## [1.0.6] - 2019-02-17

### Added
- Auto-correction of quotation marks in `.info` file fields.


## [1.0.5] - 2019-02-17

### Changed
- Script renamed to `sbt`.


## [1.0.4] - 2019-02-17

### Fixed
- MD5 checksum not written correctly to the `.info` file.


## [1.0.3] - 2019-01-23

### Changed
- Repository migrated to GitLab.


## [1.0.2] - 2018-01-13

### Changed
- Reverted to Python 2 temporarily due to UTF-8 codec compatibility issues.


## [1.0.1] - 2017-12-19

### Fixed
- Package setup requirements and PyPI classifiers.


## [1.0.0] - 2017-12-16

### Added
- Initial Python 3 release.

### Fixed
- Reading the `slack-desc` file when it already exists.


## [0.14.0] - 2017-12-16

### Added
- Haskell SlackBuild template.
- `i586` architecture support.


## [0.12.0] - 2015-04-25

### Added
- Change working directory at runtime.
- Automatic `README` file creation.
- Automatic `doinst.sh` file creation.
- Reading existing files for editing instead of overwriting.

### Fixed
- `slack-desc` line length enforcement.


## [0.11.0] - 2015-04-23

### Fixed
- Data not reset correctly after browsing between menu items.


## [0.10.0] - 2015-04-23

### Added
- Initial release.
