@recaptime-dev's working patches + fork for Phorge, a community fork of Phabricator. (Upstream dev and stable branches are at upstream/main and upstream/stable respectively.)
hq.recaptime.dev/wiki/Phorge
phorge
phabricator
1<?php
2
3$table = new DifferentialRevision();
4$diff_table = new DifferentialDiff();
5$reviewer_table = new DifferentialReviewer();
6
7$table_name = PhabricatorEdgeConfig::TABLE_NAME_EDGE;
8$data_name = PhabricatorEdgeConfig::TABLE_NAME_EDGEDATA;
9
10$conn = $table->establishConnection('w');
11
12// Previously "DifferentialRevisionHasReviewerEdgeType::EDGECONST".
13$edge_type = 35;
14
15// NOTE: We can't use normal migration iterators for edges because they don't
16// have an "id" column. For now, try just loading the whole result set: the
17// actual size of the rows is small. If we run into issues, we could write an
18// EdgeIterator.
19$every_edge = queryfx_all(
20 $conn,
21 'SELECT * FROM %T edge LEFT JOIN %T data ON edge.dataID = data.id
22 WHERE edge.type = %d',
23 $table_name,
24 $data_name,
25 $edge_type);
26
27foreach ($every_edge as $edge) {
28 if ($edge['type'] != $edge_type) {
29 // Ignore edges which aren't "reviewers", like subscribers.
30 continue;
31 }
32
33 try {
34 $data = phutil_json_decode($edge['data']);
35 $data = idx($data, 'data');
36 } catch (Exception $ex) {
37 // Just ignore any kind of issue with the edge data, we'll use a default
38 // below.
39 $data = null;
40 }
41
42 if (!$data) {
43 $data = array(
44 'status' => 'added',
45 );
46 }
47
48 $status = idx($data, 'status');
49
50 $diff_phid = null;
51
52 // NOTE: At one point, the code to populate "diffID" worked correctly, but
53 // it seems to have later been broken. Salvage it if we can, and look up
54 // the corresponding diff PHID.
55 $diff_id = idx($data, 'diffID');
56 if ($diff_id) {
57 $row = queryfx_one(
58 $conn,
59 'SELECT phid FROM %T WHERE id = %d',
60 $diff_table->getTableName(),
61 $diff_id);
62 if ($row) {
63 $diff_phid = $row['phid'];
64 }
65 }
66
67 if (!$diff_phid) {
68 // If the status is "accepted" or "rejected", look up the current diff
69 // PHID so we can distinguish between "accepted" and "accepted older".
70 switch ($status) {
71 case 'accepted':
72 case 'rejected':
73 case 'commented':
74 $row = queryfx_one(
75 $conn,
76 'SELECT diff.phid FROM %T diff JOIN %T revision
77 ON diff.revisionID = revision.id
78 WHERE revision.phid = %s
79 ORDER BY diff.id DESC LIMIT 1',
80 $diff_table->getTableName(),
81 $table->getTableName(),
82 $edge['src']);
83 if ($row) {
84 $diff_phid = $row['phid'];
85 }
86 break;
87 }
88 }
89
90 // We now represent some states (like "Commented" and "Accepted Older") as
91 // a primary state plus an extra flag, instead of making "Commented" a
92 // primary state. Map old states to new states and flags.
93
94 if ($status == 'commented') {
95 $status = 'added';
96 $comment_phid = $diff_phid;
97 $action_phid = null;
98 } else {
99 $comment_phid = null;
100 $action_phid = $diff_phid;
101 }
102
103 if ($status == 'accepted-older') {
104 $status = 'accepted';
105 }
106
107 if ($status == 'rejected-older') {
108 $status = 'rejected';
109 }
110
111 queryfx(
112 $conn,
113 'INSERT INTO %T (revisionPHID, reviewerPHID, reviewerStatus,
114 lastActionDiffPHID, lastCommentDiffPHID, dateCreated, dateModified)
115 VALUES (%s, %s, %s, %ns, %ns, %d, %d)
116 ON DUPLICATE KEY UPDATE dateCreated = VALUES(dateCreated)',
117 $reviewer_table->getTableName(),
118 $edge['src'],
119 $edge['dst'],
120 $status,
121 $action_phid,
122 $comment_phid,
123 $edge['dateCreated'],
124 $edge['dateCreated']);
125}