Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
freebsd
GitHub Repository: freebsd/phabricator
Path: blob/master/src/applications/doorkeeper/bridge/DoorkeeperBridgeGitHubIssue.php
12256 views
1
<?php
2
3
final class DoorkeeperBridgeGitHubIssue
4
extends DoorkeeperBridgeGitHub {
5
6
const OBJTYPE_GITHUB_ISSUE = 'github.issue';
7
8
public function canPullRef(DoorkeeperObjectRef $ref) {
9
if (!parent::canPullRef($ref)) {
10
return false;
11
}
12
13
if ($ref->getObjectType() !== self::OBJTYPE_GITHUB_ISSUE) {
14
return false;
15
}
16
17
return true;
18
}
19
20
public function pullRefs(array $refs) {
21
$token = $this->getGitHubAccessToken();
22
if (!strlen($token)) {
23
return null;
24
}
25
26
$template = id(new PhutilGitHubFuture())
27
->setAccessToken($token);
28
29
$futures = array();
30
$id_map = mpull($refs, 'getObjectID', 'getObjectKey');
31
foreach ($id_map as $key => $id) {
32
list($user, $repository, $number) = $this->parseGitHubIssueID($id);
33
$uri = "/repos/{$user}/{$repository}/issues/{$number}";
34
$data = array();
35
$futures[$key] = id(clone $template)
36
->setRawGitHubQuery($uri, $data);
37
}
38
39
$results = array();
40
$failed = array();
41
foreach (new FutureIterator($futures) as $key => $future) {
42
try {
43
$results[$key] = $future->resolve();
44
} catch (Exception $ex) {
45
if (($ex instanceof HTTPFutureResponseStatus) &&
46
($ex->getStatusCode() == 404)) {
47
// TODO: Do we end up here for deleted objects and invisible
48
// objects?
49
} else {
50
phlog($ex);
51
$failed[$key] = $ex;
52
}
53
}
54
}
55
56
$viewer = $this->getViewer();
57
58
foreach ($refs as $ref) {
59
$ref->setAttribute('name', pht('GitHub Issue %s', $ref->getObjectID()));
60
61
$did_fail = idx($failed, $ref->getObjectKey());
62
if ($did_fail) {
63
$ref->setSyncFailed(true);
64
continue;
65
}
66
67
$result = idx($results, $ref->getObjectKey());
68
if (!$result) {
69
continue;
70
}
71
72
$body = $result->getBody();
73
74
$ref->setIsVisible(true);
75
$ref->setAttribute('api.raw', $body);
76
$ref->setAttribute('name', $body['title']);
77
78
$obj = $ref->getExternalObject();
79
80
$this->fillObjectFromData($obj, $result);
81
$this->saveExternalObject($ref, $obj);
82
}
83
}
84
85
public function fillObjectFromData(DoorkeeperExternalObject $obj, $result) {
86
$body = $result->getBody();
87
$uri = $body['html_url'];
88
$obj->setObjectURI($uri);
89
90
$title = idx($body, 'title');
91
$description = idx($body, 'body');
92
93
$created = idx($body, 'created_at');
94
$created = strtotime($created);
95
96
$state = idx($body, 'state');
97
98
$obj->setProperty('task.title', $title);
99
$obj->setProperty('task.description', $description);
100
$obj->setProperty('task.created', $created);
101
$obj->setProperty('task.state', $state);
102
}
103
104
}
105
106