1
0
Fork 0
mirror of https://we.phorge.it/source/phorge.git synced 2024-11-19 05:12:41 +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:
epriestley 2011-09-26 15:09:39 -07:00
parent cd71098110
commit 9155369668
2 changed files with 67 additions and 0 deletions

View file

@ -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;
}
}

View file

@ -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'));
}
}