phacility/phabricator · error · PhutilArgumentUsageException
Specified maximum date must come after specified minimum dat
Error message
Specified maximum date must come after specified minimum date.
What it means
Thrown by the audit delete workflow (bin/audit delete) when both --min-commit-date and --max-commit-date are supplied and the minimum is strictly greater than the maximum. Dates are compared as loaded values (loadDate), so an inverted range is rejected before any query runs — protecting you from selecting the wrong set of audit data to delete.
Source
Thrown at src/applications/audit/management/PhabricatorAuditManagementDeleteWorkflow.php:74
'param' => 'ids',
'help' => pht('Select only audits with the given IDs.'),
),
));
}
public function execute(PhutilArgumentParser $args) {
$viewer = $this->getViewer();
$users = $this->loadUsers($args->getArg('users'));
$repos = $this->loadRepos($args->getArg('repositories'));
$commits = $this->loadCommits($args->getArg('commits'));
$ids = $this->parseList($args->getArg('ids'));
$status = $args->getArg('status');
$min_date = $this->loadDate($args->getArg('min-commit-date'));
$max_date = $this->loadDate($args->getArg('max-commit-date'));
if ($min_date && $max_date && ($min_date > $max_date)) {
throw new PhutilArgumentUsageException(
pht('Specified maximum date must come after specified minimum date.'));
}
$is_dry_run = $args->getArg('dry-run');
$query = id(new DiffusionCommitQuery())
->setViewer($this->getViewer())
->needAuditRequests(true);
if ($status) {
$query->withStatuses(array($status));
}
$id_map = array();
if ($ids) {
$id_map = array_fuse($ids);
$query->withAuditIDs($ids);
}View on GitHub (pinned to 5720a38cfe)
Solutions
- Swap the two flags so the earlier date is --min-commit-date and the later is --max-commit-date
- Re-run with --dry-run first to see what would be deleted before doing it for real
- Use unambiguous absolute dates (YYYY-MM-DD) to avoid parse surprises
Example fix
# before $ bin/audit delete --min-commit-date 2024-12-01 --max-commit-date 2024-01-01 # after $ bin/audit delete --min-commit-date 2024-01-01 --max-commit-date 2024-12-01 --dry-run
Defensive patterns
Strategy: validation
Validate before calling
$min = strtotime($args->getArg('min-commit-date'));
$max = strtotime($args->getArg('max-commit-date'));
if ($min !== false && $max !== false && $min > $max) {
throw new InvalidArgumentException('min-commit-date must be <= max-commit-date');
} Prevention
- Always run destructive audit commands with --dry-run first
- Use absolute YYYY-MM-DD dates in scripts to avoid timezone/parsing drift
When it happens
Trigger: Passing --min-commit-date 2024-12-01 --max-commit-date 2024-01-01 (arguments swapped), or mixing formats so the parsed min lands after max.
Common situations: Copy-pasting a command template and swapping the flags; timezone confusion when using relative or local-time formats around midnight/year boundaries.
Related errors
- No such user with username "%s"!
- No repository "%s" exists!
- Request parameter "%s" is not formatted properly. Expected a
- Request parameter "%s" is not formatted properly. Expected a
- Invalid Request (CSRF)
AI-assisted analysis of phacility/phabricator@5720a38cfe (2026-08-21).
Data as JSON: /api/errors/d4f9bbb92ddc4016.
Report an issue: GitHub.