Page Menu
Home
Phabricator
Search
Configure Global Search
Log In
Files
F15328530
D12748.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Award Token
Flag For Later
Size
2 KB
Referenced Files
None
Subscribers
None
D12748.diff
View Options
diff --git a/src/differential/ArcanistDifferentialCommitMessage.php b/src/differential/ArcanistDifferentialCommitMessage.php
--- a/src/differential/ArcanistDifferentialCommitMessage.php
+++ b/src/differential/ArcanistDifferentialCommitMessage.php
@@ -16,26 +16,10 @@
public static function newFromRawCorpus($corpus) {
$obj = new ArcanistDifferentialCommitMessage();
$obj->rawCorpus = $corpus;
-
- $match = null;
- if (preg_match('/^Differential Revision:\s*(.*)/im', $corpus, $match)) {
- $revision_id = trim($match[1]);
- if (strlen($revision_id)) {
- $uri = new PhutilURI($revision_id);
- $path = $uri->getPath();
- $path = trim($path, '/');
- if (preg_match('/^D\d+$/', $path)) {
- $obj->revisionID = (int)trim($path, 'D');
- } else {
- throw new ArcanistUsageException(
- "Invalid 'Differential Revision' field. The field should have a ".
- "Phabricator URI like 'http://phabricator.example.com/D123', ".
- "but has '{$match[1]}'.");
- }
- }
- }
+ $obj->revisionID = $obj->parseRevisionIDFromRawCorpus($corpus);
$pattern = '/^git-svn-id:\s*([^@]+)@(\d+)\s+(.*)$/m';
+ $match = null;
if (preg_match($pattern, $corpus, $match)) {
$obj->gitSVNBaseRevision = $match[1].'@'.$match[2];
$obj->gitSVNBasePath = $match[1];
@@ -109,4 +93,42 @@
return md5($fields);
}
+ /**
+ * Extract the revision ID from a commit message.
+ *
+ * @param string Raw commit message.
+ * @return int|null Revision ID, if the commit message contains one.
+ */
+ private function parseRevisionIDFromRawCorpus($corpus) {
+ $match = null;
+ if (!preg_match('/^Differential Revision:\s*(.+)/im', $corpus, $match)) {
+ return null;
+ }
+
+ $revision_value = trim($match[1]);
+ $revision_pattern = '/^[dD]([1-9]\d*)\z/';
+
+ // Accept a bare revision ID like "D123".
+ if (preg_match($revision_pattern, $revision_value, $match)) {
+ return (int)$match[1];
+ }
+
+ // Otherwise, try to find a full URI.
+ $uri = new PhutilURI($revision_value);
+ $path = $uri->getPath();
+ $path = trim($path, '/');
+ if (preg_match($revision_pattern, $path, $match)) {
+ return (int)$match[1];
+ }
+
+ throw new ArcanistUsageException(
+ pht(
+ 'Invalid "Differential Revision" field in commit message. This field '.
+ 'should have a revision identifier like "%s" or a Phabricator URI '.
+ 'like "%s", but has "%s".',
+ 'D123',
+ 'https://phabricator.example.com/D123',
+ $revision_value));
+ }
+
}
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Sat, Mar 8, 5:44 AM (4 d, 3 h ago)
Storage Engine
blob
Storage Format
Encrypted (AES-256-CBC)
Storage Handle
7374471
Default Alt Text
D12748.diff (2 KB)
Attached To
Mode
D12748: Allow Arcanist to parse bare revision IDs from "Differential Revisions:" field
Attached
Detach File
Event Timeline
Log In to Comment