Page MenuHomePhorge

D25872.1740273029.diff
No OneTemporary

D25872.1740273029.diff

diff --git a/src/work/ArcanistWorkEngine.php b/src/work/ArcanistWorkEngine.php
--- a/src/work/ArcanistWorkEngine.php
+++ b/src/work/ArcanistWorkEngine.php
@@ -198,18 +198,61 @@
ArcanistSymbolRef::HARDPOINT_OBJECT);
$task_ref = $task_symbol->getObject();
+
if (!$task_ref) {
throw new PhutilArgumentUsageException(
pht(
'No task "%s" exists, or you do not have permission to view it.',
$symbol));
}
+ // check if branch exists
+ $api = $this->getRepositoryAPI();
+ $old_branches = $api->execxLocal('branch --list %s*', $symbol);
+ $branch_name = '';
+
+ $old_branches = array_map(function ($v) {
+ $v = ltrim($v, ' +*'); // `git branch --list` can give + or *
+ return trim($v);
+ }, $old_branches);
+
+ if (count($old_branches)) {
+ $old_branch = array_shift($old_branches);
+ $branch_name = $old_branch; // will be '' if no matches
+ }
- throw new Exception(pht('TODO: Implement this workflow.'));
+ if ($branch_name !== '') {
+ $api->execxLocal('checkout %s', $branch_name);
+ } else {
+ $task_name = $task_ref->getName();
+
+ // TODO: check mercurial and subversion. This is just git
+ // see https://git-scm.com/docs/git-check-ref-format
+ $pattern = '#(^[./]+|//|/\.+|\.{2,}|@{|[/.]+$|^@$|[~^:\x00-\x20\x7F?*\[\\\\])#u';
+ $branch_name = preg_replace($pattern, '-', $task_name);
+ $branch_name = trim($branch_name, '-');
+ $branch_name = mb_convert_case($branch_name, MB_CASE_LOWER, 'UTF-8');
+ $branch_name = $task_ref->getMonogram().'-'.$branch_name;
+ // to reduce multiple '-' to single '-'
+ $branch_name = preg_replace('#-+#', '-', $branch_name);
+ // keep length to GitHub max
+ $branch_name = rtrim(mb_substr($branch_name, 0, 244), '-');
+
+ // below should work unless in detached HEAD state??
+ $start = id($api)->getBranchName();
+ if (!$start) {
+ // test detached HEAD??
+ $start = id($api)->getWorkingCopyRevision();
+ $this->newMarker($branch_name, $start);
+ }
+ }
- $this->loadHardpoints(
+ return id(new ArcanistMarkerRef())
+ ->setName($branch_name)
+ ->setMarkerType(ArcanistMarkerRef::TYPE_BRANCH);
+ /* $this->loadHardpoints(
$task_ref,
ArcanistTaskRef::HARDPOINT_REVISIONREFS);
+ */
}
}

File Metadata

Mime Type
text/plain
Expires
Sun, Feb 23, 01:10 (5 h, 15 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
1179504
Default Alt Text
D25872.1740273029.diff (2 KB)

Event Timeline