mirror of
https://we.phorge.it/source/phorge.git
synced 2024-12-19 03:50:54 +01:00
Add a helper function to DiffusionPathIDQuery
Summary: Just breaking D960 into some smaller parts, this is a standalone method used in Mercurial parsing. (There's a bad version of this function in the SVN stuff but I'll get rid of it the next time I'm in there.) Test Plan: See D960. Reviewers: Makinde, jungejason, nh, tuomaspelkonen, aran Reviewed By: Makinde CC: aran, Makinde Differential Revision: 965
This commit is contained in:
parent
cd71098110
commit
9155369668
2 changed files with 67 additions and 0 deletions
|
@ -16,6 +16,9 @@
|
|||
* limitations under the License.
|
||||
*/
|
||||
|
||||
/**
|
||||
* @task pathutil Path Utilities
|
||||
*/
|
||||
final class DiffusionPathIDQuery {
|
||||
|
||||
public function __construct(array $paths) {
|
||||
|
@ -49,13 +52,55 @@ final class DiffusionPathIDQuery {
|
|||
return $result;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Convert a path to the canonical, absolute representation used by Diffusion.
|
||||
*
|
||||
* @param string Some repository path.
|
||||
* @return string Canonicalized Diffusion path.
|
||||
* @task pathutil
|
||||
*/
|
||||
public static function normalizePath($path) {
|
||||
|
||||
// Normalize to single slashes, e.g. "///" => "/".
|
||||
$path = preg_replace('@[/]{2,}@', '/', $path);
|
||||
|
||||
return '/'.trim($path, '/');
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Return the canonical parent directory for a path. Note, returns "/" when
|
||||
* passed "/".
|
||||
*
|
||||
* @param string Some repository path.
|
||||
* @return string That path's canonical parent directory.
|
||||
* @task pathutil
|
||||
*/
|
||||
public static function getParentPath($path) {
|
||||
$path = self::normalizePath($path);
|
||||
return dirname($path);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Generate a list of parents for a repository path. The path itself is
|
||||
* included.
|
||||
*
|
||||
* @param string Some repository path.
|
||||
* @return list List of canonical paths between the path and the root.
|
||||
* @task pathutil
|
||||
*/
|
||||
public static function expandPathToRoot($path) {
|
||||
$path = self::normalizePath($path);
|
||||
$parents = array($path);
|
||||
$parts = explode('/', trim($path, '/'));
|
||||
while (count($parts) >= 1) {
|
||||
if (array_pop($parts)) {
|
||||
$parents[] = '/'.implode('/', $parts);
|
||||
}
|
||||
}
|
||||
return $parents;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -31,6 +31,28 @@ final class DiffusionPathQueryTestCase extends PhabricatorTestCase {
|
|||
'/a',
|
||||
DiffusionPathIDQuery::getParentPath('/a/b'),
|
||||
'Parent of /a/b');
|
||||
$this->assertEqual(
|
||||
'/a',
|
||||
DiffusionPathIDQuery::getParentPath('/a///b'),
|
||||
'Parent of /a///b');
|
||||
}
|
||||
|
||||
public function testExpandEdgeCases() {
|
||||
$this->assertEqual(
|
||||
array('/'),
|
||||
DiffusionPathIDQuery::expandPathToRoot('/'));
|
||||
$this->assertEqual(
|
||||
array('/'),
|
||||
DiffusionPathIDQuery::expandPathToRoot('//'));
|
||||
$this->assertEqual(
|
||||
array('/a/b', '/a', '/'),
|
||||
DiffusionPathIDQuery::expandPathToRoot('/a/b'));
|
||||
$this->assertEqual(
|
||||
array('/a/b', '/a', '/'),
|
||||
DiffusionPathIDQuery::expandPathToRoot('/a//b'));
|
||||
$this->assertEqual(
|
||||
array('/a/b', '/a', '/'),
|
||||
DiffusionPathIDQuery::expandPathToRoot('a/b'));
|
||||
}
|
||||
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue