Page MenuHomestyx hydra

No OneTemporary

diff --git a/src/applications/diffusion/query/history/DiffusionMercurialHistoryQuery.php b/src/applications/diffusion/query/history/DiffusionMercurialHistoryQuery.php
index c1aafb5e2e..7b6add1adb 100644
--- a/src/applications/diffusion/query/history/DiffusionMercurialHistoryQuery.php
+++ b/src/applications/diffusion/query/history/DiffusionMercurialHistoryQuery.php
@@ -1,89 +1,105 @@
<?php
/*
* Copyright 2012 Facebook, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
final class DiffusionMercurialHistoryQuery extends DiffusionHistoryQuery {
protected function executeQuery() {
$drequest = $this->getRequest();
$repository = $drequest->getRepository();
$path = $drequest->getPath();
$commit_hash = $drequest->getStableCommitName();
$path = DiffusionPathIDQuery::normalizePath($path);
+ $path = ltrim($path, '/');
- // NOTE: Using '' as a default path produces the correct behavior if HEAD
- // is a merge commit; using '.' does not (the merge commit is not included
- // in the log).
- $default_path = '';
+ // NOTE: Older versions of Mercurial give different results for these
+ // commands (see T1268):
+ //
+ // $ hg log -- ''
+ // $ hg log
+ //
+ // All versions of Mercurial give different results for these commands
+ // (merge commits are excluded with the "." version):
+ //
+ // $ hg log -- .
+ // $ hg log
+ //
+ // If we don't have a path component in the query, omit it from the command
+ // entirely to avoid these inconsistencies.
+
+ $path_arg = '';
+ if (strlen($path)) {
+ $path_arg = csprintf('-- %s', $path);
+ }
// NOTE: --branch used to be called --only-branch; use -b for compatibility.
list($stdout) = $repository->execxLocalCommand(
- 'log --debug --template %s --limit %d -b %s --rev %s:0 -- %s',
+ 'log --debug --template %s --limit %d -b %s --rev %s:0 %C',
'{node};{parents}\\n',
($this->getOffset() + $this->getLimit()), // No '--skip' in Mercurial.
$drequest->getBranch(),
$commit_hash,
- nonempty(ltrim($path, '/'), $default_path));
+ $path_arg);
$lines = explode("\n", trim($stdout));
$lines = array_slice($lines, $this->getOffset());
$hash_list = array();
$parent_map = array();
$last = null;
foreach (array_reverse($lines) as $line) {
list($hash, $parents) = explode(';', $line);
$parents = trim($parents);
if (!$parents) {
if ($last === null) {
$parent_map[$hash] = array('...');
} else {
$parent_map[$hash] = array($last);
}
} else {
$parents = preg_split('/\s+/', $parents);
foreach ($parents as $parent) {
list($plocal, $phash) = explode(':', $parent);
if (!preg_match('/^0+$/', $phash)) {
$parent_map[$hash][] = $phash;
}
}
// This may happen for the zeroth commit in repository, both hashes
// are "000000000...".
if (empty($parent_map[$hash])) {
$parent_map[$hash] = array('...');
}
}
// The rendering code expects the first commit to be "mainline", like
// Git. Flip the order so it does the right thing.
$parent_map[$hash] = array_reverse($parent_map[$hash]);
$hash_list[] = $hash;
$last = $hash;
}
$hash_list = array_reverse($hash_list);
$this->parents = $parent_map;
return $this->loadHistoryForCommitIdentifiers($hash_list);
}
}
diff --git a/src/applications/diffusion/request/DiffusionMercurialRequest.php b/src/applications/diffusion/request/DiffusionMercurialRequest.php
index 99d6baf720..b2ef171813 100644
--- a/src/applications/diffusion/request/DiffusionMercurialRequest.php
+++ b/src/applications/diffusion/request/DiffusionMercurialRequest.php
@@ -1,71 +1,85 @@
<?php
/*
* Copyright 2012 Facebook, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/**
* @group diffusion
*/
final class DiffusionMercurialRequest extends DiffusionRequest {
protected function getSupportsBranches() {
return true;
}
protected function didInitialize() {
$repository = $this->getRepository();
if (!Filesystem::pathExists($repository->getLocalPath())) {
$this->raiseCloneException();
}
return;
}
public function getBranch() {
if ($this->branch) {
return $this->branch;
}
if ($this->repository) {
return $this->repository->getDefaultBranch();
}
throw new Exception("Unable to determine branch!");
}
public function getCommit() {
if ($this->commit) {
return $this->commit;
}
return $this->getBranch();
}
public function getStableCommitName() {
if (!$this->stableCommitName) {
if ($this->commit) {
$this->stableCommitName = $this->commit;
} else {
+
+ // NOTE: For branches with spaces in their name like "a b", this
+ // does not work properly:
+ //
+ // $ hg log --rev 'a b'
+ //
+ // We can use revsets instead:
+ //
+ // $ hg log --rev branch('a b')
+ //
+ // ...but they require a somewhat newer version of Mercurial. Instead,
+ // use "-b" flag with limit 1 for greatest compatibility across
+ // versions.
+
list($this->stableCommitName) = $this->repository->execxLocalCommand(
- 'log --template=%s --rev %s',
+ 'log --template=%s -b %s --limit 1',
'{node}',
$this->getBranch());
}
}
return $this->stableCommitName;
}
}

File Metadata

Mime Type
text/x-diff
Expires
Sun, Jul 27, 2:58 PM (1 w, 8 h ago)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
185949
Default Alt Text
(6 KB)

Event Timeline