Index: src/__phutil_library_map__.php =================================================================== --- src/__phutil_library_map__.php +++ src/__phutil_library_map__.php @@ -482,6 +482,7 @@ 'DiffusionCommitHookRejectException' => 'applications/diffusion/exception/DiffusionCommitHookRejectException.php', 'DiffusionCommitParentsQuery' => 'applications/diffusion/query/parents/DiffusionCommitParentsQuery.php', 'DiffusionCommitQuery' => 'applications/diffusion/query/DiffusionCommitQuery.php', + 'DiffusionCommitRef' => 'applications/diffusion/data/DiffusionCommitRef.php', 'DiffusionCommitTagsController' => 'applications/diffusion/controller/DiffusionCommitTagsController.php', 'DiffusionController' => 'applications/diffusion/controller/DiffusionController.php', 'DiffusionDiffController' => 'applications/diffusion/controller/DiffusionDiffController.php', @@ -506,6 +507,7 @@ 'DiffusionLintController' => 'applications/diffusion/controller/DiffusionLintController.php', 'DiffusionLintDetailsController' => 'applications/diffusion/controller/DiffusionLintDetailsController.php', 'DiffusionLintSaveRunner' => 'applications/diffusion/DiffusionLintSaveRunner.php', + 'DiffusionLowLevelGitCommitQuery' => 'applications/diffusion/query/lowlevel/DiffusionLowLevelGitCommitQuery.php', 'DiffusionLowLevelGitRefQuery' => 'applications/diffusion/query/lowlevel/DiffusionLowLevelGitRefQuery.php', 'DiffusionLowLevelMercurialBranchesQuery' => 'applications/diffusion/query/lowlevel/DiffusionLowLevelMercurialBranchesQuery.php', 'DiffusionLowLevelQuery' => 'applications/diffusion/query/lowlevel/DiffusionLowLevelQuery.php', @@ -2866,6 +2868,7 @@ 'DiffusionCommitHookRejectException' => 'Exception', 'DiffusionCommitParentsQuery' => 'DiffusionQuery', 'DiffusionCommitQuery' => 'PhabricatorCursorPagedPolicyAwareQuery', + 'DiffusionCommitRef' => 'Phobject', 'DiffusionCommitTagsController' => 'DiffusionController', 'DiffusionController' => 'PhabricatorController', 'DiffusionDiffController' => 'DiffusionController', @@ -2887,6 +2890,7 @@ 'DiffusionLastModifiedController' => 'DiffusionController', 'DiffusionLintController' => 'DiffusionController', 'DiffusionLintDetailsController' => 'DiffusionController', + 'DiffusionLowLevelGitCommitQuery' => 'DiffusionLowLevelQuery', 'DiffusionLowLevelGitRefQuery' => 'DiffusionLowLevelQuery', 'DiffusionLowLevelMercurialBranchesQuery' => 'DiffusionLowLevelQuery', 'DiffusionLowLevelQuery' => 'Phobject', Index: src/applications/diffusion/data/DiffusionCommitRef.php =================================================================== --- /dev/null +++ src/applications/diffusion/data/DiffusionCommitRef.php @@ -0,0 +1,59 @@ +committerEmail = $committer_email; + return $this; + } + + public function getCommitterEmail() { + return $this->committerEmail; + } + + + public function setCommitterName($committer_name) { + $this->committerName = $committer_name; + return $this; + } + + public function getCommitterName() { + return $this->committerName; + } + + + public function setAuthorEmail($author_email) { + $this->authorEmail = $author_email; + return $this; + } + + public function getAuthorEmail() { + return $this->authorEmail; + } + + + public function setAuthorName($author_name) { + $this->authorName = $author_name; + return $this; + } + + public function getAuthorName() { + return $this->authorName; + } + + public function setMessage($message) { + $this->message = $message; + return $this; + } + + public function getMessage() { + return $this->message; + } + +} Index: src/applications/diffusion/query/lowlevel/DiffusionLowLevelGitCommitQuery.php =================================================================== --- /dev/null +++ src/applications/diffusion/query/lowlevel/DiffusionLowLevelGitCommitQuery.php @@ -0,0 +1,48 @@ +identifier = $identifier; + return $this; + } + + protected function executeQuery() { + $repository = $this->getRepository(); + + // NOTE: %B was introduced somewhat recently in git's history, so pull + // commit message information with %s and %b instead. + + // Even though we pass --encoding here, git doesn't always succeed, so + // we try a little harder, since git *does* tell us what the actual encoding + // is correctly (unless it doesn't; encoding is sometimes empty). + list($info) = $repository->execxLocalCommand( + 'log -n 1 --encoding=%s --format=%s %s --', + 'UTF-8', + implode('%x00', array('%e', '%cn', '%ce', '%an', '%ae', '%s%n%n%b')), + $this->identifier); + + $parts = explode("\0", $info); + $encoding = array_shift($parts); + + foreach ($parts as $key => $part) { + if ($encoding) { + $part = phutil_utf8_convert($part, 'UTF-8', $encoding); + } + $parts[$key] = phutil_utf8ize($part); + if (!strlen($parts[$key])) { + $parts[$key] = null; + } + } + + return id(new DiffusionCommitRef()) + ->setCommitterName($parts[0]) + ->setCommitterEmail($parts[1]) + ->setAuthorName($parts[2]) + ->setAuthorEmail($parts[3]) + ->setMessage($parts[4]); + } + +} Index: src/applications/repository/worker/commitmessageparser/PhabricatorRepositoryGitCommitMessageParserWorker.php =================================================================== --- src/applications/repository/worker/commitmessageparser/PhabricatorRepositoryGitCommitMessageParserWorker.php +++ src/applications/repository/worker/commitmessageparser/PhabricatorRepositoryGitCommitMessageParserWorker.php @@ -7,32 +7,16 @@ PhabricatorRepository $repository, PhabricatorRepositoryCommit $commit) { - // NOTE: %B was introduced somewhat recently in git's history, so pull - // commit message information with %s and %b instead. - // Even though we pass --encoding here, git doesn't always succeed, so - // we try a little harder, since git *does* tell us what the actual encoding - // is correctly (unless it doesn't; encoding is sometimes empty). - list($info) = $repository->execxLocalCommand( - 'log -n 1 --encoding=%s --format=%s %s --', - 'UTF-8', - implode('%x00', array('%e', '%cn', '%ce', '%an', '%ae', '%s%n%n%b')), - $commit->getCommitIdentifier()); - - $parts = explode("\0", $info); - $encoding = array_shift($parts); - - foreach ($parts as $key => $part) { - if ($encoding) { - $part = phutil_utf8_convert($part, 'UTF-8', $encoding); - } - $parts[$key] = phutil_utf8ize($part); - } - - $committer_name = $parts[0]; - $committer_email = $parts[1]; - $author_name = $parts[2]; - $author_email = $parts[3]; - $message = $parts[4]; + $ref = id(new DiffusionLowLevelGitCommitQuery()) + ->setRepository($repository) + ->withIdentifier($commit->getCommitIdentifier()) + ->execute(); + + $committer_name = $ref->getCommitterName(); + $committer_email = $ref->getCommitterEmail(); + $author_name = $ref->getAuthorName(); + $author_email = $ref->getAuthorEmail(); + $message = $ref->getMessage(); if (strlen($author_email)) { $author = "{$author_name} <{$author_email}>";