The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.

Changes for version 0.9999 - 2019-02-01

  • Bug Fixes
    • Fixed a test failure with the MySQL max limit value, mostly exhibited on BSD platforms.
    • Removed fallback in the PostgreSQL engine on the `$PGUSER` and `$PGPASSWORD` environnement variables, as well as the system username, since libpq does all that automatically, and collects data from other sources that we did not (e.g., the password and connection service files). Thanks to Tom Bloor for the report (issue #410).
    • Changed dependency validation to prevent an error when a change required from a different project has been reworked. Previously, when a when requiring a change such as `foo:greeble`, Sqitch would raise an error if `foo:greeble` was reworked, suggesting that the dependency be tag-qualified to eliminate ambiguity. Now reworked dependencies may be required without tag-qualification, though tag-qualification should still be specified if functionality as of a particular tag is required.
    • Added a workaround for the shell quoting issue on Windows. Applies to IPC::System::Simple 1.29 and lower. See [pjf/ipc-system-simple#29](https://github.com/pjf/ipc-system-simple/pull/29) for details (#413).
    • Fixed an issue with the MariaDB client where a deploy, revert, or verify failure was not properly propagated to Sqitch. Sqitch now passes `--abort-source-on-error` to the Maria `mysql` client to ensure that SQL errors cause the client to abort with an error so that Sqitch can properly handle it. Thanks to @mvgrimes for the original report and, years later, the fix (#209).
    • Fixed an issue with command argument parsing so that it truly never returns a target without an engine specified, as documented.
    • Removed documentation for methods that don't exist.
    • Fixed test failures due to a change in Encode v2.99 that's stricter about `undef` arguments that should be defined.
  • Improvements
    • The Snowflake engine now consults the `connections.warehousename`, `connections.dbname`, and `connections.rolename` variables in the SnowSQL configuration file (`~/.snowsql/config`) before falling back on the hard-coded warehouse name "sqitch" and using the system username as the database name and no default for the role.
    • Switched to using a constant internally to optimize windows-specific code paths at compile time.
    • When `deploy` detects undeployed dependencies, it now eliminates duplicates before listing them in the error message.
    • Now requiring IO::Pager v0.34 or later for its more consistent interface.
    • Added notes about creating databases to the tutorials. Thanks to Dave Rolsky for the prompt (#315).
    • Added a status message to tell the user when the registry is being updated, rather than just show each individual update. Thanks to Ben Hutton for the suggestion (#276).
    • Added support for a `$SQITCH_TARGET` environment variable, which takes precedence over all other target specifications except for command-line options and arguments. Thanks to @mvgrimes for the suggestion (#203).
    • Fixed target/engine/change argument parsing so it won't automatically fail when `core.engine` isn't set unless no targets are found. This lets engines be determined strictly from command-line arguments -- derived from targets, or just listed on their own -- whether or not `core.engine` is set. This change eliminates the need for the `no_default` parameter to the `parse_args()` method of App::Sqitch Command. It also greatly reduces the need for the core `--engine` option, which was previously required to work around this issue (see below for its removal).
    • Refactored config handling in tests to use a custom subclass of App::Sqitch::Config instead of various mocks, temporary files, and the like.
    • Added advice to use the PL/pgSQL `ASSERT()` function for verify scripts to the Postgres tutorial. Thanks to Sergii Tkachenko for the PR (#425).
  • Target Variables
    • The `verify` command now reads `deploy.variables`, and individual `verify.variables override `deploy.variables`, on the assumption that the verify variables in general ought to be the same as the deploy variables. This makes `verify` variable configuration consistent with `revert` variable configuration.
    • Variables set via the `--set-deploy` option on the `rebase` and `checkout` commands no longer apply to both reverts and deploys, but only deploys. Use the `--set` option to apply a variable to both reverts and deploys.
    • Added support for core, engine, and target variable configuration. The simplest way to use them is via the `--set` option on the `init`, `engine`, and `target` commands. These commands allow the configuration of database client variables for specific engines and targets, as well as defaults that apply to all change execution commands (`deploy`, `revert`, `verify`, `rebase`, and `checkout`). The commands merge the variables from each level in this priority order:
      • `--set-deploy` and `--set-revert` options on `rebase` and `checkout`
      • `--set` option
      • `target.$target.variables`
      • `engine.$engine.variables`
      • `deploy.variables`, `revert.variables`, and `verify.variables`
      • `core.variables` See `sqitch-configuration` for general documentation of of the hierarchy for merging variables and the documentation for each command for specifics.
  • Options Unification
    • Added the `--chdir`/`--cd`/`-C` option to specify a directory to change to before executing any Sqitch commands. Thanks to Thomas Sibley for the suggestion (#411).
    • Added the `--no-pager` option to disable the pager (#414).
    • Changed command-line parsing to allow core and command options to appear anywhere on the line. Previously, core options had to come before the command name, and command options after. No more. The caveat is that command options that take arguments should either appear after the command or use the `--opt=val` syntax instead of `--opt val`, so that Sqitch doesn't think `val` is the command. Even in that case, it will search the rest of the arguments to find a valid command. However, to minimize this challenge, the documentation now suggests and demonstrates putting all options after the command, like so: `sqitch [command] [options]`.
    • Simplified and clarified the distinction between core and command options by removing all options from the core except those that affect output and runtime context. The core options are:
      • -C --chdir --cd <dir> Change to directory before performing any actions
      • --etc-path Print the path to the etc directory and exit
      • --no-pager Do not pipe output into a pager
      • --quiet Quiet mode with non-error output suppressed
      • -V --verbose Increment verbosity
      • --version Print the version number and exit
      • --help Show a list of commands and exit
      • --man Print the introductory documentation and exit
    • Relatedly, single-letter core options will now always be uppercase, while single-letter command options will be lowercase. As such, `-V` has been added as an alias for `--version`, although `-v` remains for now, undocumented. It may be removed in the future should a compelling use for `-v` in a command be discovered.
    • All other options have been moved to the commands they affect. Their use should remain mostly unchanged now that command options are parsed from anywhere on the command-line, although we recommend that all options come after commands. The options were moved as follows:
      • `--registry`, `--client`, `--db-name`, `--db-user`, `--db-host`, and `--db-port` (and their aliases) have been moved to the `checkout`, `deploy`, `log`, `rebase`, `revert`, `status`, `upgrade`, and `verify` commands.
      • `--plan-file` and `--top-dir` (deprecated; see below) have been moved to the `add`, `bundle`, `checkout`, `deploy`, `rebase`, `revert`, `rework`, `show`, `status`, `tag`, and `verify` commands. They were already supported by the `init`, `engine`, and `target` commands (where `--top-dir` is not deprecated).
    • Because some command options conflicted with core options, a few options have been removed altogether, including:
      • The `--verbose` option on the `--engine` and `--target` commands has been removed, but no visible change should be apparent, since those commands now read the core `--verbose` option.
      • The undocumented `--dir` alias for `--top-dir` has been removed, as it conflicted with the option of the same name but different meaning in the `init`, `engine`, and `target` commands.
      • The `-d` alias for `--set-deploy` in the `rebase` and `checkout` commands has been changed to `-e` so as not to conflict with the `-d` alias for `--db-name`.
      • Added tests for all commands to ensure none of their options conflict with core options. Will help prevent conflicts in the future.
  • Deprecations & Removals
    • Deprecated the `--top-dir` option in favor of `--chdir` with a warning except when used for configuration in the `init`, `engine`, and `target` commands.
    • Removed the core `--deploy-dir`, `--revert-dir`, and `--verify-dir` options, which have been deprecated and triggering warnings since v0.9993 (August 2015). The `--dir` option to the `init`, `engine`, and `target` commands remains the favored interface for specifying script directories.
    • Removed the deprecated core `--engine` option. The `init` command still supports it, while other commands are able to parse the engine name as an argument — e.g., `sqitch deploy mysql` — or implicitly as part of a target, as in `sqitch revert db:pg:tryme`. When Sqitch is unable to determine the engine for a command, the error message no longer mentions `--engine` and instead suggests specifying the engine via the target. This option never triggered an error, but demonstration of its use has been limited to `init` examples.
    • Removed support for reading the `core.$engine` configuration, which has been deprecated with warnings in favor of `engine.$engine` since 0.997 (November 2014). The `sqitch engine update-config` action remains available to update old configurations, but may be removed in the future.
    • Removed the `--deploy`, `--revert`, and `--verify` options on the `add` command, as well as their `--no-*` variants. They have been deprecated with warnings in favor of the `--with` and `--without` options since v0.990 (January 2014).
    • Removed the `--deploy-template`, `--revert-template`, and `--verify-template` options to the `add` command. They have been deprecated with warnings in favor of the `--use` option since v0.990 (January 2014).
    • Removed the `add.deploy_template`, `add.revert_template`, and `add.verify_template` configuration settings. They have been deprecated with warnings in favor of the `add.templates` configuration section since v0.990 (January 2014).
    • Removed the `@FIRST` and `@LAST` symbolic tags, which have been deprecated with warnings in favor of `@ROOT` and `@HEAD`, respectively, since 0.997 (November 2014).
    • Removed the command-specific options with the string "target" in them, such as `--to-target`, `--upto-target`, which have been deprecated with warnings in in favor of options containing the string "change", such as `--to-change` and `--upto-change`, since v0.997 (November 2014).
    • Remove the `engine` and `target` command `set-*` actions and their corresponding methods, which have been deprecated in favor of the `alter` action since v0.9993 (August 2015).
    • Removed the automatic updating of change and tag IDs in the Postgres engine. This functionality was added in v0.940 (December 2012), when Postgres was the only engine, and the SHA-1 hash for change and tag IDs was changed. There were very few deployments at the time, and all should long since have been updated.
  • API Changes
    • Added the URI-overriding parameters `user`, `host`, `port`, and `dbname` to App::Sqitch::Target so that command options can be used to easily set them.
    • Added support for passing attribute parameters to the `all_targets` group constructor on App::Sqitch::Target, so that command-line options can be used to assign attributes to all targets read from the configuration.
    • Aded the `target_params` method to App::Sqitch::Command and updated all commands to use it when constructing targets. This allows commands to define options for Target parameters, as required for moving options to commands as described above.
    • Added the `class_for` method to App::Sqitch::Command so that the new options parser described above can load a command class without instantiating an instance. Useful for searching command-line arguments for a command name.
    • Added the `create` constructor to App::Sqitch::Command to let Sqitch instantiate an instance of a command once it finds one via `class_for`. Previously, Sqitch used the `load` method, which handled the functionality of both `class_for` and `create`. That method still exists but is used only in tests.
    • Added the ConnectingCommand role to define database connection options for the commands that need them.
    • Added the ContextCommand role to define command options for the location of the plan file and top directory. This is also where use of the deprecated form of `--top-dir` triggers a warning.
    • Removed the `verbosity` attribute from App::Sqitch::Command::engine and App::Sqitch::Command::target, since the `--verbose` option is no longer needed. These commands now rely on the core `--verbose` option.
    • Removed the copying of core options from the target class and TargetConfigCommand role, since the attributes fetched from there are no longer core options, but provided as attribute parameters to the constructors by commands.
    • Removed documentation for the optional `config` parameter to the `all_targets` constructor of App::Sqitch::Target, since it was never used by Sqitch. It always fetched the config from the required `sqitch` parameter. Support for the `config` parameter has not been removed, since third-parties might use it.
    • Removed the `set_*` methods in the `engine` and `target` commands, which have been deprecated in favor of the new `alter` method since v0.9993 (August 2015).
    • Removed the `old_id` and `old_info` methods from Change and Tag, which date from v0.940 (December 2012), and were provided only to allow existing Postgres databases to be updated from the old to new ID format, now removed. There should be no other use case for these methods.

Documentation

Sqitch add usage statement
Add a database change to plans
Guide to using database authentication credentials with Sqitch
Sqitch bundle usage statement
Bundle a Sqitch project for distribution
Sqitch checkout usage statement
Revert, checkout another VCS branch, and re-deploy changes
Sqitch config usage statement
Get and set local, user, or system Sqitch options
Hierarchical engine and target configuration
Sqitch deploy usage statement
Deploy changes to a database
Sqitch engine usage statement
Manage database engine configuration
Environment variables recognized by Sqitch
Sqitch help usage statement
Display help for Sqitch and Sqitch commands
Sqitch init usage statement
Create a new Sqitch project
Sqitch log usage statement
Show Sqitch change logs
Guide to using database passwords with Sqitch
Sqitch plan usage statement
Show planned database changes
Sqitch rebase usage statement
Revert and redeploy database changes
Sqitch revert usage statement
Revert changes to a database
Sqitch rework usage statement
Rework a database change
Sqitch show usage statement
Show object information or change file contents
Sqitch status usage statement
Show the current deployment status of a database
Sqitch tag usage statement
Create or list tag objects
Sqitch target usage statement
Manage target database configuration
Sqitch upgrade usage statement
Upgrade the registry to the current version
Sqitch verify usage statement
Verify deployed database changes
Sane database change management
Specifying changes for Sqitch
List of common sqitch commands
List of common Sqitch guides
A tutorial introduction to Sqitch change management on Exasol
A tutorial introduction to Sqitch change management on Firebird
A tutorial introduction to Sqitch change management on MySQL
A tutorial introduction to Sqitch change management on Oracle
A tutorial introduction to Sqitch change management on Snowflake
A tutorial introduction to Sqitch change management on SQLite
A tutorial introduction to Sqitch change management on Vertica
A tutorial introduction to Sqitch change management on PostgreSQL
Sqitch usage statement

Modules

Sane database change management
Sqitch Command support
Add a new change to Sqitch plans
Bundle Sqitch changes for distribution
Revert, change checkout a VCS branch, and redeploy
Get and set local, user, or system Sqitch options
Deploy Sqitch changes to a database
Add, modify, or list Sqitch database engines
Display help information about Sqitch
Initialize a Sqitch project
Show a database event log
List the changes in the plan
Revert and redeploy Sqitch changes
Revert Sqitch changes from a database
Rework a Sqitch change
Show Sqitch changes to a database
Display status information about Sqitch
Add or list tags in Sqitch plans
Add, modify, or list Sqitch target databases
Upgrade the Sqitch registry
Verify deployed Sqitch changes
Sqitch configuration management
Sqitch DateTime object
Sqitch Deployment Engine
Sqitch Exasol Engine
Sqitch Firebird Engine
Sqitch MySQL Engine
Sqitch Oracle Engine
Sqitch PostgreSQL Engine
Sqitch Snowflake Engine
Sqitch SQLite Engine
Sqitch Vertica Engine
Format events and changes for command output
Sqitch Deployment Plan
Sqitch deployment plan blank line
Sqitch deployment plan tag
Sqitch deployment plan change list
Sqitch dependency specification
Sqitch deployment plan line
Sqitch deployment plan line list
Sqitch deployment plan blank line
Sqitch deployment plan tag
A command that connects to a target
A command that needs to know where things are
An engine based on the DBI
A command that reverts and deploys
A command that handles target-related configuration
Sqitch deployment target
Definition of attribute data types
Sqitch Exception class