diff --git a/src/applications/diffusion/conduit/DiffusionBranchQueryConduitAPIMethod.php b/src/applications/diffusion/conduit/DiffusionBranchQueryConduitAPIMethod.php --- a/src/applications/diffusion/conduit/DiffusionBranchQueryConduitAPIMethod.php +++ b/src/applications/diffusion/conduit/DiffusionBranchQueryConduitAPIMethod.php @@ -56,7 +56,7 @@ $refs = array(); foreach ($ref_map as $ref => $commit) { $refs[] = id(new DiffusionRepositoryRef()) - ->setShortName($ref) + ->setShortName((string)$ref) ->setCommitIdentifier($commit); } } else { diff --git a/src/applications/diffusion/data/DiffusionGitBranch.php b/src/applications/diffusion/data/DiffusionGitBranch.php --- a/src/applications/diffusion/data/DiffusionGitBranch.php +++ b/src/applications/diffusion/data/DiffusionGitBranch.php @@ -101,7 +101,9 @@ if ($branch == '(no branch)') { continue; } - + // Note: If the $branch name string is numeric containing only decimal + // ints and does not start with 0, PHP will cast it from string to int: + // https://www.php.net/manual/en/language.types.array.php#language.types.array.syntax $map[$branch] = $branch_head; } diff --git a/src/docs/flavor/php_pitfalls.diviner b/src/docs/flavor/php_pitfalls.diviner --- a/src/docs/flavor/php_pitfalls.diviner +++ b/src/docs/flavor/php_pitfalls.diviner @@ -374,3 +374,25 @@ // ... } ``` + += PHP casts all-digit array keys from string to int = + +An array key which is a string that contains a decimal int will be cast to the +int type: + +```lang=php +$key0 = "main"; +$key1 = "123"; +$key2 = "0123"; +$array = array($key0 => "foo", $key1 => "foo", $key2 => "foo"); +foreach ($array as $key => $value) { + print(gettype($key)."\n"); +} +``` +prints `string`, `integer`, `string`. + +Thus running `phutil_nonempty_string($key)` complains that it expected null or +a string but got int. + +Avoid this by either explicitly casting via `(string)$key`, or by using +`phutil_nonempty_scalar($key)` instead of `phutil_nonempty_string($key)`.