##// END OF EJS Templates
phabricator: add an option to fold several commits into one review (issue6244)...
Matt Harbison -
r45211:3dc6a707 default
parent child Browse files
Show More
This diff has been collapsed as it changes many lines, (889 lines changed) Show them Hide them
@@ -0,0 +1,889 b''
1 {
2 "interactions": [
3 {
4 "request": {
5 "headers": {
6 "content-length": [
7 "170"
8 ],
9 "accept": [
10 "application/mercurial-0.1"
11 ],
12 "content-type": [
13 "application/x-www-form-urlencoded"
14 ],
15 "host": [
16 "phab.mercurial-scm.org"
17 ],
18 "user-agent": [
19 "mercurial/proto-1.0 (Mercurial 5.3.2+463-d35fbae9dd33+20200408)"
20 ]
21 },
22 "body": "__conduit__=1&params=%7B%22__conduit__%22%3A+%7B%22token%22%3A+%22cli-hahayouwish%22%7D%2C+%22revisionIDs%22%3A+%5B8387%2C+8387%2C+8387%5D%7D&output=json",
23 "uri": "https://phab.mercurial-scm.org//api/differential.querydiffs",
24 "method": "POST"
25 },
26 "response": {
27 "headers": {
28 "x-xss-protection": [
29 "1; mode=block"
30 ],
31 "strict-transport-security": [
32 "max-age=0; includeSubdomains; preload"
33 ],
34 "transfer-encoding": [
35 "chunked"
36 ],
37 "x-frame-options": [
38 "Deny"
39 ],
40 "expires": [
41 "Sat, 01 Jan 2000 00:00:00 GMT"
42 ],
43 "content-type": [
44 "application/json"
45 ],
46 "referrer-policy": [
47 "no-referrer"
48 ],
49 "server": [
50 "Apache/2.4.10 (Debian)"
51 ],
52 "cache-control": [
53 "no-store"
54 ],
55 "x-content-type-options": [
56 "nosniff"
57 ],
58 "date": [
59 "Wed, 08 Apr 2020 21:13:13 GMT"
60 ]
61 },
62 "body": {
63 "string": "{\"result\":{\"21008\":{\"id\":\"21008\",\"revisionID\":\"8387\",\"dateCreated\":\"1586380389\",\"dateModified\":\"1586380391\",\"sourceControlBaseRevision\":\"98d480e0d494906d9758c44c622951b429afd862\",\"sourceControlPath\":\"\\/\",\"sourceControlSystem\":\"hg\",\"branch\":\"default\",\"bookmark\":null,\"creationMethod\":\"phabsend\",\"description\":null,\"unitStatus\":\"0\",\"lintStatus\":\"0\",\"changes\":[{\"id\":\"56827\",\"metadata\":{\"line:first\":1,\"hash.effect\":\"yXvxVg6uibwd\"},\"oldPath\":null,\"currentPath\":\"file2.txt\",\"awayPaths\":[],\"oldProperties\":[],\"newProperties\":{\"unix:filemode\":\"100644\"},\"type\":\"1\",\"fileType\":\"1\",\"commitHash\":null,\"addLines\":\"1\",\"delLines\":\"0\",\"hunks\":[{\"oldOffset\":\"0\",\"newOffset\":\"1\",\"oldLength\":\"0\",\"newLength\":\"1\",\"addLines\":null,\"delLines\":null,\"isMissingOldNewline\":null,\"isMissingNewNewline\":null,\"corpus\":\"+modified\\n\"}]},{\"id\":\"56826\",\"metadata\":{\"line:first\":1,\"hash.effect\":\"cAKuVP31KNrx\"},\"oldPath\":\"file.txt\",\"currentPath\":\"file.txt\",\"awayPaths\":[],\"oldProperties\":[],\"newProperties\":[],\"type\":\"2\",\"fileType\":\"1\",\"commitHash\":null,\"addLines\":\"1\",\"delLines\":\"1\",\"hunks\":[{\"oldOffset\":\"1\",\"newOffset\":\"1\",\"oldLength\":\"1\",\"newLength\":\"1\",\"addLines\":null,\"delLines\":null,\"isMissingOldNewline\":null,\"isMissingNewNewline\":null,\"corpus\":\"-added\\n+mod3\\n\"}]}],\"properties\":{\"hg:meta\":{\"branch\":\"default\",\"date\":\"0 0\",\"node\":\"e4edb1fe3565eaaecc1787ada4fcc2b7e9018fac\",\"parent\":\"98d480e0d494906d9758c44c622951b429afd862\",\"user\":\"test\"},\"local:commits\":{\"0124e5474c880e4fb40c8326ad2b75ae3e57ee5f\":{\"author\":\"test\",\"authorEmail\":\"test\",\"branch\":\"default\",\"commit\":\"0124e5474c880e4fb40c8326ad2b75ae3e57ee5f\",\"parents\":[\"602c4e7382436988e46c0d56fb3883968302b3f6\"],\"time\":0},\"602c4e7382436988e46c0d56fb3883968302b3f6\":{\"author\":\"test\",\"authorEmail\":\"test\",\"branch\":\"default\",\"commit\":\"602c4e7382436988e46c0d56fb3883968302b3f6\",\"parents\":[\"98d480e0d494906d9758c44c622951b429afd862\"],\"time\":0},\"e4edb1fe3565eaaecc1787ada4fcc2b7e9018fac\":{\"author\":\"test\",\"authorEmail\":\"test\",\"branch\":\"default\",\"commit\":\"e4edb1fe3565eaaecc1787ada4fcc2b7e9018fac\",\"parents\":[\"0124e5474c880e4fb40c8326ad2b75ae3e57ee5f\"],\"time\":0}}},\"authorName\":\"test\",\"authorEmail\":\"test\"},\"21007\":{\"id\":\"21007\",\"revisionID\":\"8387\",\"dateCreated\":\"1586380382\",\"dateModified\":\"1586380385\",\"sourceControlBaseRevision\":\"98d480e0d494906d9758c44c622951b429afd862\",\"sourceControlPath\":\"\\/\",\"sourceControlSystem\":\"hg\",\"branch\":\"default\",\"bookmark\":null,\"creationMethod\":\"phabsend\",\"description\":null,\"unitStatus\":\"0\",\"lintStatus\":\"0\",\"changes\":[{\"id\":\"56825\",\"metadata\":{\"line:first\":1,\"hash.effect\":\"yXvxVg6uibwd\"},\"oldPath\":null,\"currentPath\":\"file2.txt\",\"awayPaths\":[],\"oldProperties\":[],\"newProperties\":{\"unix:filemode\":\"100644\"},\"type\":\"1\",\"fileType\":\"1\",\"commitHash\":null,\"addLines\":\"1\",\"delLines\":\"0\",\"hunks\":[{\"oldOffset\":\"0\",\"newOffset\":\"1\",\"oldLength\":\"0\",\"newLength\":\"1\",\"addLines\":null,\"delLines\":null,\"isMissingOldNewline\":null,\"isMissingNewNewline\":null,\"corpus\":\"+modified\\n\"}]},{\"id\":\"56824\",\"metadata\":{\"line:first\":1,\"hash.effect\":\"cAKuVP31KNrx\"},\"oldPath\":\"file.txt\",\"currentPath\":\"file.txt\",\"awayPaths\":[],\"oldProperties\":[],\"newProperties\":[],\"type\":\"2\",\"fileType\":\"1\",\"commitHash\":null,\"addLines\":\"1\",\"delLines\":\"1\",\"hunks\":[{\"oldOffset\":\"1\",\"newOffset\":\"1\",\"oldLength\":\"1\",\"newLength\":\"1\",\"addLines\":null,\"delLines\":null,\"isMissingOldNewline\":null,\"isMissingNewNewline\":null,\"corpus\":\"-added\\n+mod3\\n\"}]}],\"properties\":{\"hg:meta\":{\"branch\":\"default\",\"date\":\"0 0\",\"node\":\"e4edb1fe3565eaaecc1787ada4fcc2b7e9018fac\",\"parent\":\"98d480e0d494906d9758c44c622951b429afd862\",\"user\":\"test\"},\"local:commits\":{\"0124e5474c880e4fb40c8326ad2b75ae3e57ee5f\":{\"author\":\"test\",\"authorEmail\":\"test\",\"branch\":\"default\",\"commit\":\"0124e5474c880e4fb40c8326ad2b75ae3e57ee5f\",\"parents\":[\"602c4e7382436988e46c0d56fb3883968302b3f6\"],\"time\":0},\"602c4e7382436988e46c0d56fb3883968302b3f6\":{\"author\":\"test\",\"authorEmail\":\"test\",\"branch\":\"default\",\"commit\":\"602c4e7382436988e46c0d56fb3883968302b3f6\",\"parents\":[\"98d480e0d494906d9758c44c622951b429afd862\"],\"time\":0},\"e4edb1fe3565eaaecc1787ada4fcc2b7e9018fac\":{\"author\":\"test\",\"authorEmail\":\"test\",\"branch\":\"default\",\"commit\":\"e4edb1fe3565eaaecc1787ada4fcc2b7e9018fac\",\"parents\":[\"0124e5474c880e4fb40c8326ad2b75ae3e57ee5f\"],\"time\":0}}},\"authorName\":\"test\",\"authorEmail\":\"test\"},\"21006\":{\"id\":\"21006\",\"revisionID\":\"8387\",\"dateCreated\":\"1586380375\",\"dateModified\":\"1586380377\",\"sourceControlBaseRevision\":\"98d480e0d494906d9758c44c622951b429afd862\",\"sourceControlPath\":\"\\/\",\"sourceControlSystem\":\"hg\",\"branch\":\"default\",\"bookmark\":null,\"creationMethod\":\"phabsend\",\"description\":null,\"unitStatus\":\"0\",\"lintStatus\":\"0\",\"changes\":[{\"id\":\"56823\",\"metadata\":{\"line:first\":1,\"hash.effect\":\"cAKuVP31KNrx\"},\"oldPath\":\"file.txt\",\"currentPath\":\"file.txt\",\"awayPaths\":[],\"oldProperties\":[],\"newProperties\":[],\"type\":\"2\",\"fileType\":\"1\",\"commitHash\":null,\"addLines\":\"1\",\"delLines\":\"1\",\"hunks\":[{\"oldOffset\":\"1\",\"newOffset\":\"1\",\"oldLength\":\"1\",\"newLength\":\"1\",\"addLines\":null,\"delLines\":null,\"isMissingOldNewline\":null,\"isMissingNewNewline\":null,\"corpus\":\"-added\\n+mod3\\n\"}]}],\"properties\":{\"hg:meta\":{\"branch\":\"default\",\"date\":\"0 0\",\"node\":\"921f8265efbd92e92bfa5d7a0e047908de9844a5\",\"parent\":\"98d480e0d494906d9758c44c622951b429afd862\",\"user\":\"test\"},\"local:commits\":{\"602c4e7382436988e46c0d56fb3883968302b3f6\":{\"author\":\"test\",\"authorEmail\":\"test\",\"branch\":\"default\",\"commit\":\"602c4e7382436988e46c0d56fb3883968302b3f6\",\"parents\":[\"98d480e0d494906d9758c44c622951b429afd862\"],\"time\":0},\"832553266fe8c3330d968e6987df4ae793483b2b\":{\"author\":\"test\",\"authorEmail\":\"test\",\"branch\":\"default\",\"commit\":\"832553266fe8c3330d968e6987df4ae793483b2b\",\"parents\":[\"602c4e7382436988e46c0d56fb3883968302b3f6\"],\"time\":0},\"921f8265efbd92e92bfa5d7a0e047908de9844a5\":{\"author\":\"test\",\"authorEmail\":\"test\",\"branch\":\"default\",\"commit\":\"921f8265efbd92e92bfa5d7a0e047908de9844a5\",\"parents\":[\"832553266fe8c3330d968e6987df4ae793483b2b\"],\"time\":0}}},\"authorName\":\"test\",\"authorEmail\":\"test\"}},\"error_code\":null,\"error_info\":null}"
64 },
65 "status": {
66 "code": 200,
67 "message": "OK"
68 }
69 }
70 },
71 {
72 "request": {
73 "headers": {
74 "content-length": [
75 "183"
76 ],
77 "accept": [
78 "application/mercurial-0.1"
79 ],
80 "content-type": [
81 "application/x-www-form-urlencoded"
82 ],
83 "host": [
84 "phab.mercurial-scm.org"
85 ],
86 "user-agent": [
87 "mercurial/proto-1.0 (Mercurial 5.3.2+463-d35fbae9dd33+20200408)"
88 ]
89 },
90 "body": "__conduit__=1&params=%7B%22__conduit__%22%3A+%7B%22token%22%3A+%22cli-hahayouwish%22%7D%2C+%22constraints%22%3A+%7B%22callsigns%22%3A+%5B%22HG%22%5D%7D%7D&output=json",
91 "uri": "https://phab.mercurial-scm.org//api/diffusion.repository.search",
92 "method": "POST"
93 },
94 "response": {
95 "headers": {
96 "x-xss-protection": [
97 "1; mode=block"
98 ],
99 "strict-transport-security": [
100 "max-age=0; includeSubdomains; preload"
101 ],
102 "transfer-encoding": [
103 "chunked"
104 ],
105 "x-frame-options": [
106 "Deny"
107 ],
108 "expires": [
109 "Sat, 01 Jan 2000 00:00:00 GMT"
110 ],
111 "content-type": [
112 "application/json"
113 ],
114 "referrer-policy": [
115 "no-referrer"
116 ],
117 "server": [
118 "Apache/2.4.10 (Debian)"
119 ],
120 "cache-control": [
121 "no-store"
122 ],
123 "x-content-type-options": [
124 "nosniff"
125 ],
126 "date": [
127 "Wed, 08 Apr 2020 21:13:14 GMT"
128 ]
129 },
130 "body": {
131 "string": "{\"result\":{\"data\":[{\"id\":2,\"type\":\"REPO\",\"phid\":\"PHID-REPO-bvunnehri4u2isyr7bc3\",\"fields\":{\"name\":\"Mercurial\",\"vcs\":\"hg\",\"callsign\":\"HG\",\"shortName\":null,\"status\":\"active\",\"isImporting\":false,\"almanacServicePHID\":null,\"refRules\":{\"fetchRules\":[],\"trackRules\":[],\"permanentRefRules\":[]},\"spacePHID\":null,\"dateCreated\":1498761653,\"dateModified\":1500403184,\"policy\":{\"view\":\"public\",\"edit\":\"admin\",\"diffusion.push\":\"users\"}},\"attachments\":{}}],\"maps\":{},\"query\":{\"queryKey\":null},\"cursor\":{\"limit\":100,\"after\":null,\"before\":null,\"order\":null}},\"error_code\":null,\"error_info\":null}"
132 },
133 "status": {
134 "code": 200,
135 "message": "OK"
136 }
137 }
138 },
139 {
140 "request": {
141 "headers": {
142 "content-length": [
143 "1739"
144 ],
145 "accept": [
146 "application/mercurial-0.1"
147 ],
148 "content-type": [
149 "application/x-www-form-urlencoded"
150 ],
151 "host": [
152 "phab.mercurial-scm.org"
153 ],
154 "user-agent": [
155 "mercurial/proto-1.0 (Mercurial 5.3.2+463-d35fbae9dd33+20200408)"
156 ]
157 },
158 "body": "__conduit__=1&params=%7B%22__conduit__%22%3A+%7B%22token%22%3A+%22cli-hahayouwish%22%7D%2C+%22bookmark%22%3A+null%2C+%22branch%22%3A+%22default%22%2C+%22changes%22%3A+%7B%22file.txt%22%3A+%7B%22addLines%22%3A+1%2C+%22awayPaths%22%3A+%5B%5D%2C+%22commitHash%22%3A+null%2C+%22currentPath%22%3A+%22file.txt%22%2C+%22delLines%22%3A+1%2C+%22fileType%22%3A+1%2C+%22hunks%22%3A+%5B%7B%22addLines%22%3A+1%2C+%22corpus%22%3A+%22-added%5Cn%2Bmod3%5Cn%22%2C+%22delLines%22%3A+1%2C+%22newLength%22%3A+1%2C+%22newOffset%22%3A+1%2C+%22oldLength%22%3A+1%2C+%22oldOffset%22%3A+1%7D%5D%2C+%22metadata%22%3A+%7B%7D%2C+%22newProperties%22%3A+%7B%7D%2C+%22oldPath%22%3A+%22file.txt%22%2C+%22oldProperties%22%3A+%7B%7D%2C+%22type%22%3A+2%7D%2C+%22file2.txt%22%3A+%7B%22addLines%22%3A+1%2C+%22awayPaths%22%3A+%5B%5D%2C+%22commitHash%22%3A+null%2C+%22currentPath%22%3A+%22file2.txt%22%2C+%22delLines%22%3A+0%2C+%22fileType%22%3A+1%2C+%22hunks%22%3A+%5B%7B%22addLines%22%3A+1%2C+%22corpus%22%3A+%22%2Banother+mod%5Cn%22%2C+%22delLines%22%3A+0%2C+%22newLength%22%3A+1%2C+%22newOffset%22%3A+1%2C+%22oldLength%22%3A+0%2C+%22oldOffset%22%3A+0%7D%5D%2C+%22metadata%22%3A+%7B%7D%2C+%22newProperties%22%3A+%7B%22unix%3Afilemode%22%3A+%22100644%22%7D%2C+%22oldPath%22%3A+null%2C+%22oldProperties%22%3A+%7B%7D%2C+%22type%22%3A+1%7D%7D%2C+%22creationMethod%22%3A+%22phabsend%22%2C+%22lintStatus%22%3A+%22none%22%2C+%22repositoryPHID%22%3A+%22PHID-REPO-bvunnehri4u2isyr7bc3%22%2C+%22sourceControlBaseRevision%22%3A+%2298d480e0d494906d9758c44c622951b429afd862%22%2C+%22sourceControlPath%22%3A+%22%2F%22%2C+%22sourceControlSystem%22%3A+%22hg%22%2C+%22sourceMachine%22%3A+%22%22%2C+%22sourcePath%22%3A+%22%2F%22%2C+%22unitStatus%22%3A+%22none%22%7D&output=json",
159 "uri": "https://phab.mercurial-scm.org//api/differential.creatediff",
160 "method": "POST"
161 },
162 "response": {
163 "headers": {
164 "x-xss-protection": [
165 "1; mode=block"
166 ],
167 "strict-transport-security": [
168 "max-age=0; includeSubdomains; preload"
169 ],
170 "transfer-encoding": [
171 "chunked"
172 ],
173 "x-frame-options": [
174 "Deny"
175 ],
176 "expires": [
177 "Sat, 01 Jan 2000 00:00:00 GMT"
178 ],
179 "content-type": [
180 "application/json"
181 ],
182 "referrer-policy": [
183 "no-referrer"
184 ],
185 "server": [
186 "Apache/2.4.10 (Debian)"
187 ],
188 "cache-control": [
189 "no-store"
190 ],
191 "x-content-type-options": [
192 "nosniff"
193 ],
194 "date": [
195 "Wed, 08 Apr 2020 21:13:14 GMT"
196 ]
197 },
198 "body": {
199 "string": "{\"result\":{\"diffid\":21009,\"phid\":\"PHID-DIFF-kvumllarf5ym6ewayp2l\",\"uri\":\"https:\\/\\/phab.mercurial-scm.org\\/differential\\/diff\\/21009\\/\"},\"error_code\":null,\"error_info\":null}"
200 },
201 "status": {
202 "code": 200,
203 "message": "OK"
204 }
205 }
206 },
207 {
208 "request": {
209 "headers": {
210 "content-length": [
211 "482"
212 ],
213 "accept": [
214 "application/mercurial-0.1"
215 ],
216 "content-type": [
217 "application/x-www-form-urlencoded"
218 ],
219 "host": [
220 "phab.mercurial-scm.org"
221 ],
222 "user-agent": [
223 "mercurial/proto-1.0 (Mercurial 5.3.2+463-d35fbae9dd33+20200408)"
224 ]
225 },
226 "body": "__conduit__=1&params=%7B%22__conduit__%22%3A+%7B%22token%22%3A+%22cli-hahayouwish%22%7D%2C+%22data%22%3A+%22%7B%5C%22branch%5C%22%3A+%5C%22default%5C%22%2C+%5C%22date%5C%22%3A+%5C%220+0%5C%22%2C+%5C%22node%5C%22%3A+%5C%2294aaae213b2397d1546801be89f317b63f0a6b93%5C%22%2C+%5C%22parent%5C%22%3A+%5C%2298d480e0d494906d9758c44c622951b429afd862%5C%22%2C+%5C%22user%5C%22%3A+%5C%22test%5C%22%7D%22%2C+%22diff_id%22%3A+21009%2C+%22name%22%3A+%22hg%3Ameta%22%7D&output=json",
227 "uri": "https://phab.mercurial-scm.org//api/differential.setdiffproperty",
228 "method": "POST"
229 },
230 "response": {
231 "headers": {
232 "x-xss-protection": [
233 "1; mode=block"
234 ],
235 "strict-transport-security": [
236 "max-age=0; includeSubdomains; preload"
237 ],
238 "transfer-encoding": [
239 "chunked"
240 ],
241 "x-frame-options": [
242 "Deny"
243 ],
244 "expires": [
245 "Sat, 01 Jan 2000 00:00:00 GMT"
246 ],
247 "content-type": [
248 "application/json"
249 ],
250 "referrer-policy": [
251 "no-referrer"
252 ],
253 "server": [
254 "Apache/2.4.10 (Debian)"
255 ],
256 "cache-control": [
257 "no-store"
258 ],
259 "x-content-type-options": [
260 "nosniff"
261 ],
262 "date": [
263 "Wed, 08 Apr 2020 21:13:15 GMT"
264 ]
265 },
266 "body": {
267 "string": "{\"result\":null,\"error_code\":null,\"error_info\":null}"
268 },
269 "status": {
270 "code": 200,
271 "message": "OK"
272 }
273 }
274 },
275 {
276 "request": {
277 "headers": {
278 "content-length": [
279 "1746"
280 ],
281 "accept": [
282 "application/mercurial-0.1"
283 ],
284 "content-type": [
285 "application/x-www-form-urlencoded"
286 ],
287 "host": [
288 "phab.mercurial-scm.org"
289 ],
290 "user-agent": [
291 "mercurial/proto-1.0 (Mercurial 5.3.2+463-d35fbae9dd33+20200408)"
292 ]
293 },
294 "body": "__conduit__=1&params=%7B%22__conduit__%22%3A+%7B%22token%22%3A+%22cli-hahayouwish%22%7D%2C+%22data%22%3A+%22%7B%5C%220124e5474c880e4fb40c8326ad2b75ae3e57ee5f%5C%22%3A+%7B%5C%22author%5C%22%3A+%5C%22test%5C%22%2C+%5C%22authorEmail%5C%22%3A+%5C%22test%5C%22%2C+%5C%22branch%5C%22%3A+%5C%22default%5C%22%2C+%5C%22commit%5C%22%3A+%5C%220124e5474c880e4fb40c8326ad2b75ae3e57ee5f%5C%22%2C+%5C%22parents%5C%22%3A+%5B%5C%22602c4e7382436988e46c0d56fb3883968302b3f6%5C%22%5D%2C+%5C%22time%5C%22%3A+0%7D%2C+%5C%22602c4e7382436988e46c0d56fb3883968302b3f6%5C%22%3A+%7B%5C%22author%5C%22%3A+%5C%22test%5C%22%2C+%5C%22authorEmail%5C%22%3A+%5C%22test%5C%22%2C+%5C%22branch%5C%22%3A+%5C%22default%5C%22%2C+%5C%22commit%5C%22%3A+%5C%22602c4e7382436988e46c0d56fb3883968302b3f6%5C%22%2C+%5C%22parents%5C%22%3A+%5B%5C%2298d480e0d494906d9758c44c622951b429afd862%5C%22%5D%2C+%5C%22time%5C%22%3A+0%7D%2C+%5C%2294aaae213b2397d1546801be89f317b63f0a6b93%5C%22%3A+%7B%5C%22author%5C%22%3A+%5C%22test%5C%22%2C+%5C%22authorEmail%5C%22%3A+%5C%22test%5C%22%2C+%5C%22branch%5C%22%3A+%5C%22default%5C%22%2C+%5C%22commit%5C%22%3A+%5C%2294aaae213b2397d1546801be89f317b63f0a6b93%5C%22%2C+%5C%22parents%5C%22%3A+%5B%5C%22e4edb1fe3565eaaecc1787ada4fcc2b7e9018fac%5C%22%5D%2C+%5C%22time%5C%22%3A+0%7D%2C+%5C%22e4edb1fe3565eaaecc1787ada4fcc2b7e9018fac%5C%22%3A+%7B%5C%22author%5C%22%3A+%5C%22test%5C%22%2C+%5C%22authorEmail%5C%22%3A+%5C%22test%5C%22%2C+%5C%22branch%5C%22%3A+%5C%22default%5C%22%2C+%5C%22commit%5C%22%3A+%5C%22e4edb1fe3565eaaecc1787ada4fcc2b7e9018fac%5C%22%2C+%5C%22parents%5C%22%3A+%5B%5C%220124e5474c880e4fb40c8326ad2b75ae3e57ee5f%5C%22%5D%2C+%5C%22time%5C%22%3A+0%7D%7D%22%2C+%22diff_id%22%3A+21009%2C+%22name%22%3A+%22local%3Acommits%22%7D&output=json",
295 "uri": "https://phab.mercurial-scm.org//api/differential.setdiffproperty",
296 "method": "POST"
297 },
298 "response": {
299 "headers": {
300 "x-xss-protection": [
301 "1; mode=block"
302 ],
303 "strict-transport-security": [
304 "max-age=0; includeSubdomains; preload"
305 ],
306 "transfer-encoding": [
307 "chunked"
308 ],
309 "x-frame-options": [
310 "Deny"
311 ],
312 "expires": [
313 "Sat, 01 Jan 2000 00:00:00 GMT"
314 ],
315 "content-type": [
316 "application/json"
317 ],
318 "referrer-policy": [
319 "no-referrer"
320 ],
321 "server": [
322 "Apache/2.4.10 (Debian)"
323 ],
324 "cache-control": [
325 "no-store"
326 ],
327 "x-content-type-options": [
328 "nosniff"
329 ],
330 "date": [
331 "Wed, 08 Apr 2020 21:13:15 GMT"
332 ]
333 },
334 "body": {
335 "string": "{\"result\":null,\"error_code\":null,\"error_info\":null}"
336 },
337 "status": {
338 "code": 200,
339 "message": "OK"
340 }
341 }
342 },
343 {
344 "request": {
345 "headers": {
346 "content-length": [
347 "364"
348 ],
349 "accept": [
350 "application/mercurial-0.1"
351 ],
352 "content-type": [
353 "application/x-www-form-urlencoded"
354 ],
355 "host": [
356 "phab.mercurial-scm.org"
357 ],
358 "user-agent": [
359 "mercurial/proto-1.0 (Mercurial 5.3.2+463-d35fbae9dd33+20200408)"
360 ]
361 },
362 "body": "__conduit__=1&params=%7B%22__conduit__%22%3A+%7B%22token%22%3A+%22cli-hahayouwish%22%7D%2C+%22corpus%22%3A+%22one%3A+first+commit+to+review%5Cn%5CnThis+file+was+modified+with+%27mod1%27+as+its+contents.%5Cn%5CnTest+Plan%3A%5CnLOL%21++What+testing%3F%21%5Cn%5CnDifferential+Revision%3A+https%3A%2F%2Fphab.mercurial-scm.org%2FD8387%22%7D&output=json",
363 "uri": "https://phab.mercurial-scm.org//api/differential.parsecommitmessage",
364 "method": "POST"
365 },
366 "response": {
367 "headers": {
368 "x-xss-protection": [
369 "1; mode=block"
370 ],
371 "strict-transport-security": [
372 "max-age=0; includeSubdomains; preload"
373 ],
374 "transfer-encoding": [
375 "chunked"
376 ],
377 "x-frame-options": [
378 "Deny"
379 ],
380 "expires": [
381 "Sat, 01 Jan 2000 00:00:00 GMT"
382 ],
383 "content-type": [
384 "application/json"
385 ],
386 "referrer-policy": [
387 "no-referrer"
388 ],
389 "server": [
390 "Apache/2.4.10 (Debian)"
391 ],
392 "cache-control": [
393 "no-store"
394 ],
395 "x-content-type-options": [
396 "nosniff"
397 ],
398 "date": [
399 "Wed, 08 Apr 2020 21:13:16 GMT"
400 ]
401 },
402 "body": {
403 "string": "{\"result\":{\"errors\":[],\"fields\":{\"title\":\"one: first commit to review\",\"testPlan\":\"LOL! What testing?!\",\"revisionID\":8387,\"summary\":\"This file was modified with 'mod1' as its contents.\"},\"revisionIDFieldInfo\":{\"value\":8387,\"validDomain\":\"https:\\/\\/phab.mercurial-scm.org\"},\"transactions\":[{\"type\":\"title\",\"value\":\"one: first commit to review\"},{\"type\":\"testPlan\",\"value\":\"LOL! What testing?!\"},{\"type\":\"summary\",\"value\":\"This file was modified with 'mod1' as its contents.\"}]},\"error_code\":null,\"error_info\":null}"
404 },
405 "status": {
406 "code": 200,
407 "message": "OK"
408 }
409 }
410 },
411 {
412 "request": {
413 "headers": {
414 "content-length": [
415 "361"
416 ],
417 "accept": [
418 "application/mercurial-0.1"
419 ],
420 "content-type": [
421 "application/x-www-form-urlencoded"
422 ],
423 "host": [
424 "phab.mercurial-scm.org"
425 ],
426 "user-agent": [
427 "mercurial/proto-1.0 (Mercurial 5.3.2+463-d35fbae9dd33+20200408)"
428 ]
429 },
430 "body": "__conduit__=1&params=%7B%22__conduit__%22%3A+%7B%22token%22%3A+%22cli-hahayouwish%22%7D%2C+%22corpus%22%3A+%22two%3A+second+commit+to+review%5Cn%5CnThis+file+was+modified+with+%27mod2%27+as+its+contents.%5Cn%5CnTest+Plan%3A%5CnHaha%21+yeah%2C+right.%5Cn%5CnDifferential+Revision%3A+https%3A%2F%2Fphab.mercurial-scm.org%2FD8387%22%7D&output=json",
431 "uri": "https://phab.mercurial-scm.org//api/differential.parsecommitmessage",
432 "method": "POST"
433 },
434 "response": {
435 "headers": {
436 "x-xss-protection": [
437 "1; mode=block"
438 ],
439 "strict-transport-security": [
440 "max-age=0; includeSubdomains; preload"
441 ],
442 "transfer-encoding": [
443 "chunked"
444 ],
445 "x-frame-options": [
446 "Deny"
447 ],
448 "expires": [
449 "Sat, 01 Jan 2000 00:00:00 GMT"
450 ],
451 "content-type": [
452 "application/json"
453 ],
454 "referrer-policy": [
455 "no-referrer"
456 ],
457 "server": [
458 "Apache/2.4.10 (Debian)"
459 ],
460 "cache-control": [
461 "no-store"
462 ],
463 "x-content-type-options": [
464 "nosniff"
465 ],
466 "date": [
467 "Wed, 08 Apr 2020 21:13:16 GMT"
468 ]
469 },
470 "body": {
471 "string": "{\"result\":{\"errors\":[],\"fields\":{\"title\":\"two: second commit to review\",\"testPlan\":\"Haha! yeah, right.\",\"revisionID\":8387,\"summary\":\"This file was modified with 'mod2' as its contents.\"},\"revisionIDFieldInfo\":{\"value\":8387,\"validDomain\":\"https:\\/\\/phab.mercurial-scm.org\"},\"transactions\":[{\"type\":\"title\",\"value\":\"two: second commit to review\"},{\"type\":\"testPlan\",\"value\":\"Haha! yeah, right.\"},{\"type\":\"summary\",\"value\":\"This file was modified with 'mod2' as its contents.\"}]},\"error_code\":null,\"error_info\":null}"
472 },
473 "status": {
474 "code": 200,
475 "message": "OK"
476 }
477 }
478 },
479 {
480 "request": {
481 "headers": {
482 "content-length": [
483 "260"
484 ],
485 "accept": [
486 "application/mercurial-0.1"
487 ],
488 "content-type": [
489 "application/x-www-form-urlencoded"
490 ],
491 "host": [
492 "phab.mercurial-scm.org"
493 ],
494 "user-agent": [
495 "mercurial/proto-1.0 (Mercurial 5.3.2+463-d35fbae9dd33+20200408)"
496 ]
497 },
498 "body": "__conduit__=1&params=%7B%22__conduit__%22%3A+%7B%22token%22%3A+%22cli-hahayouwish%22%7D%2C+%22corpus%22%3A+%223%3A+a+commit+with+no+detailed+message%5Cn%5CnDifferential+Revision%3A+https%3A%2F%2Fphab.mercurial-scm.org%2FD8387%22%7D&output=json",
499 "uri": "https://phab.mercurial-scm.org//api/differential.parsecommitmessage",
500 "method": "POST"
501 },
502 "response": {
503 "headers": {
504 "x-xss-protection": [
505 "1; mode=block"
506 ],
507 "strict-transport-security": [
508 "max-age=0; includeSubdomains; preload"
509 ],
510 "transfer-encoding": [
511 "chunked"
512 ],
513 "x-frame-options": [
514 "Deny"
515 ],
516 "expires": [
517 "Sat, 01 Jan 2000 00:00:00 GMT"
518 ],
519 "content-type": [
520 "application/json"
521 ],
522 "referrer-policy": [
523 "no-referrer"
524 ],
525 "server": [
526 "Apache/2.4.10 (Debian)"
527 ],
528 "cache-control": [
529 "no-store"
530 ],
531 "x-content-type-options": [
532 "nosniff"
533 ],
534 "date": [
535 "Wed, 08 Apr 2020 21:13:16 GMT"
536 ]
537 },
538 "body": {
539 "string": "{\"result\":{\"errors\":[],\"fields\":{\"title\":\"3: a commit with no detailed message\",\"revisionID\":8387},\"revisionIDFieldInfo\":{\"value\":8387,\"validDomain\":\"https:\\/\\/phab.mercurial-scm.org\"},\"transactions\":[{\"type\":\"title\",\"value\":\"3: a commit with no detailed message\"}]},\"error_code\":null,\"error_info\":null}"
540 },
541 "status": {
542 "code": 200,
543 "message": "OK"
544 }
545 }
546 },
547 {
548 "request": {
549 "headers": {
550 "content-length": [
551 "174"
552 ],
553 "accept": [
554 "application/mercurial-0.1"
555 ],
556 "content-type": [
557 "application/x-www-form-urlencoded"
558 ],
559 "host": [
560 "phab.mercurial-scm.org"
561 ],
562 "user-agent": [
563 "mercurial/proto-1.0 (Mercurial 5.3.2+463-d35fbae9dd33+20200408)"
564 ]
565 },
566 "body": "__conduit__=1&params=%7B%22__conduit__%22%3A+%7B%22token%22%3A+%22cli-hahayouwish%22%7D%2C+%22corpus%22%3A+%22four%3A+extend+the+fold+range%22%7D&output=json",
567 "uri": "https://phab.mercurial-scm.org//api/differential.parsecommitmessage",
568 "method": "POST"
569 },
570 "response": {
571 "headers": {
572 "x-xss-protection": [
573 "1; mode=block"
574 ],
575 "strict-transport-security": [
576 "max-age=0; includeSubdomains; preload"
577 ],
578 "transfer-encoding": [
579 "chunked"
580 ],
581 "x-frame-options": [
582 "Deny"
583 ],
584 "expires": [
585 "Sat, 01 Jan 2000 00:00:00 GMT"
586 ],
587 "content-type": [
588 "application/json"
589 ],
590 "referrer-policy": [
591 "no-referrer"
592 ],
593 "server": [
594 "Apache/2.4.10 (Debian)"
595 ],
596 "cache-control": [
597 "no-store"
598 ],
599 "x-content-type-options": [
600 "nosniff"
601 ],
602 "date": [
603 "Wed, 08 Apr 2020 21:13:17 GMT"
604 ]
605 },
606 "body": {
607 "string": "{\"result\":{\"errors\":[],\"fields\":{\"title\":\"four: extend the fold range\"},\"revisionIDFieldInfo\":{\"value\":null,\"validDomain\":\"https:\\/\\/phab.mercurial-scm.org\"},\"transactions\":[{\"type\":\"title\",\"value\":\"four: extend the fold range\"}]},\"error_code\":null,\"error_info\":null}"
608 },
609 "status": {
610 "code": 200,
611 "message": "OK"
612 }
613 }
614 },
615 {
616 "request": {
617 "headers": {
618 "content-length": [
619 "781"
620 ],
621 "accept": [
622 "application/mercurial-0.1"
623 ],
624 "content-type": [
625 "application/x-www-form-urlencoded"
626 ],
627 "host": [
628 "phab.mercurial-scm.org"
629 ],
630 "user-agent": [
631 "mercurial/proto-1.0 (Mercurial 5.3.2+463-d35fbae9dd33+20200408)"
632 ]
633 },
634 "body": "__conduit__=1&params=%7B%22__conduit__%22%3A+%7B%22token%22%3A+%22cli-hahayouwish%22%7D%2C+%22objectIdentifier%22%3A+8387%2C+%22transactions%22%3A+%5B%7B%22type%22%3A+%22update%22%2C+%22value%22%3A+%22PHID-DIFF-kvumllarf5ym6ewayp2l%22%7D%2C+%7B%22type%22%3A+%22title%22%2C+%22value%22%3A+%22one%3A+first+commit+to+review%22%7D%2C+%7B%22type%22%3A+%22testPlan%22%2C+%22value%22%3A+%22LOL%21++What+testing%3F%21%5Cn%5CnHaha%21+yeah%2C+right.%22%7D%2C+%7B%22type%22%3A+%22summary%22%2C+%22value%22%3A+%22This+file+was+modified+with+%27mod1%27+as+its+contents.%5Cn%5Cntwo%3A+second+commit+to+review%5Cn%5CnThis+file+was+modified+with+%27mod2%27+as+its+contents.%5Cn%5Cn3%3A+a+commit+with+no+detailed+message%5Cn%5Cnfour%3A+extend+the+fold+range%22%7D%5D%7D&output=json",
635 "uri": "https://phab.mercurial-scm.org//api/differential.revision.edit",
636 "method": "POST"
637 },
638 "response": {
639 "headers": {
640 "x-xss-protection": [
641 "1; mode=block"
642 ],
643 "strict-transport-security": [
644 "max-age=0; includeSubdomains; preload"
645 ],
646 "transfer-encoding": [
647 "chunked"
648 ],
649 "x-frame-options": [
650 "Deny"
651 ],
652 "expires": [
653 "Sat, 01 Jan 2000 00:00:00 GMT"
654 ],
655 "content-type": [
656 "application/json"
657 ],
658 "referrer-policy": [
659 "no-referrer"
660 ],
661 "server": [
662 "Apache/2.4.10 (Debian)"
663 ],
664 "cache-control": [
665 "no-store"
666 ],
667 "x-content-type-options": [
668 "nosniff"
669 ],
670 "date": [
671 "Wed, 08 Apr 2020 21:13:17 GMT"
672 ]
673 },
674 "body": {
675 "string": "{\"result\":{\"object\":{\"id\":8387,\"phid\":\"PHID-DREV-6ov3pvjim4txejzekw2t\"},\"transactions\":[{\"phid\":\"PHID-XACT-DREV-fr3vwmmeqsxaick\"},{\"phid\":\"PHID-XACT-DREV-csghurweoz3dkpp\"}]},\"error_code\":null,\"error_info\":null}"
676 },
677 "status": {
678 "code": 200,
679 "message": "OK"
680 }
681 }
682 },
683 {
684 "request": {
685 "headers": {
686 "content-length": [
687 "146"
688 ],
689 "accept": [
690 "application/mercurial-0.1"
691 ],
692 "content-type": [
693 "application/x-www-form-urlencoded"
694 ],
695 "host": [
696 "phab.mercurial-scm.org"
697 ],
698 "user-agent": [
699 "mercurial/proto-1.0 (Mercurial 5.3.2+463-d35fbae9dd33+20200408)"
700 ]
701 },
702 "body": "__conduit__=1&params=%7B%22__conduit__%22%3A+%7B%22token%22%3A+%22cli-hahayouwish%22%7D%2C+%22ids%22%3A+%5B8387%5D%7D&output=json",
703 "uri": "https://phab.mercurial-scm.org//api/differential.query",
704 "method": "POST"
705 },
706 "response": {
707 "headers": {
708 "x-xss-protection": [
709 "1; mode=block"
710 ],
711 "strict-transport-security": [
712 "max-age=0; includeSubdomains; preload"
713 ],
714 "transfer-encoding": [
715 "chunked"
716 ],
717 "x-frame-options": [
718 "Deny"
719 ],
720 "expires": [
721 "Sat, 01 Jan 2000 00:00:00 GMT"
722 ],
723 "content-type": [
724 "application/json"
725 ],
726 "referrer-policy": [
727 "no-referrer"
728 ],
729 "server": [
730 "Apache/2.4.10 (Debian)"
731 ],
732 "cache-control": [
733 "no-store"
734 ],
735 "x-content-type-options": [
736 "nosniff"
737 ],
738 "date": [
739 "Wed, 08 Apr 2020 21:13:18 GMT"
740 ]
741 },
742 "body": {
743 "string": "{\"result\":[{\"id\":\"8387\",\"phid\":\"PHID-DREV-6ov3pvjim4txejzekw2t\",\"title\":\"one: first commit to review\",\"uri\":\"https:\\/\\/phab.mercurial-scm.org\\/D8387\",\"dateCreated\":\"1586380377\",\"dateModified\":\"1586380397\",\"authorPHID\":\"PHID-USER-tzhaient733lwrlbcag5\",\"status\":\"0\",\"statusName\":\"Needs Review\",\"properties\":{\"draft.broadcast\":true,\"lines.added\":2,\"lines.removed\":1},\"branch\":\"default\",\"summary\":\"This file was modified with 'mod1' as its contents.\\n\\ntwo: second commit to review\\n\\nThis file was modified with 'mod2' as its contents.\\n\\n3: a commit with no detailed message\\n\\nfour: extend the fold range\",\"testPlan\":\"LOL! What testing?!\\n\\nHaha! yeah, right.\",\"lineCount\":\"3\",\"activeDiffPHID\":\"PHID-DIFF-kvumllarf5ym6ewayp2l\",\"diffs\":[\"21009\",\"21008\",\"21007\",\"21006\"],\"commits\":[],\"reviewers\":{\"PHID-PROJ-3dvcxzznrjru2xmmses3\":\"PHID-PROJ-3dvcxzznrjru2xmmses3\"},\"ccs\":[\"PHID-USER-q42dn7cc3donqriafhjx\"],\"hashes\":[[\"hgcm\",\"\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\"],[\"hgcm\",\"\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\"],[\"hgcm\",\"\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\"],[\"hgcm\",\"\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\"]],\"auxiliary\":{\"phabricator:projects\":[],\"phabricator:depends-on\":[]},\"repositoryPHID\":\"PHID-REPO-bvunnehri4u2isyr7bc3\",\"sourcePath\":\"\\/\"}],\"error_code\":null,\"error_info\":null}"
744 },
745 "status": {
746 "code": 200,
747 "message": "OK"
748 }
749 }
750 },
751 {
752 "request": {
753 "headers": {
754 "content-length": [
755 "482"
756 ],
757 "accept": [
758 "application/mercurial-0.1"
759 ],
760 "content-type": [
761 "application/x-www-form-urlencoded"
762 ],
763 "host": [
764 "phab.mercurial-scm.org"
765 ],
766 "user-agent": [
767 "mercurial/proto-1.0 (Mercurial 5.3.2+463-d35fbae9dd33+20200408)"
768 ]
769 },
770 "body": "__conduit__=1&params=%7B%22__conduit__%22%3A+%7B%22token%22%3A+%22cli-hahayouwish%22%7D%2C+%22data%22%3A+%22%7B%5C%22branch%5C%22%3A+%5C%22default%5C%22%2C+%5C%22date%5C%22%3A+%5C%220+0%5C%22%2C+%5C%22node%5C%22%3A+%5C%2251a04fea8707151b9891822fb3c5fc5f11d45f59%5C%22%2C+%5C%22parent%5C%22%3A+%5C%2298d480e0d494906d9758c44c622951b429afd862%5C%22%2C+%5C%22user%5C%22%3A+%5C%22test%5C%22%7D%22%2C+%22diff_id%22%3A+21009%2C+%22name%22%3A+%22hg%3Ameta%22%7D&output=json",
771 "uri": "https://phab.mercurial-scm.org//api/differential.setdiffproperty",
772 "method": "POST"
773 },
774 "response": {
775 "headers": {
776 "x-xss-protection": [
777 "1; mode=block"
778 ],
779 "strict-transport-security": [
780 "max-age=0; includeSubdomains; preload"
781 ],
782 "transfer-encoding": [
783 "chunked"
784 ],
785 "x-frame-options": [
786 "Deny"
787 ],
788 "expires": [
789 "Sat, 01 Jan 2000 00:00:00 GMT"
790 ],
791 "content-type": [
792 "application/json"
793 ],
794 "referrer-policy": [
795 "no-referrer"
796 ],
797 "server": [
798 "Apache/2.4.10 (Debian)"
799 ],
800 "cache-control": [
801 "no-store"
802 ],
803 "x-content-type-options": [
804 "nosniff"
805 ],
806 "date": [
807 "Wed, 08 Apr 2020 21:13:18 GMT"
808 ]
809 },
810 "body": {
811 "string": "{\"result\":null,\"error_code\":null,\"error_info\":null}"
812 },
813 "status": {
814 "code": 200,
815 "message": "OK"
816 }
817 }
818 },
819 {
820 "request": {
821 "headers": {
822 "content-length": [
823 "1746"
824 ],
825 "accept": [
826 "application/mercurial-0.1"
827 ],
828 "content-type": [
829 "application/x-www-form-urlencoded"
830 ],
831 "host": [
832 "phab.mercurial-scm.org"
833 ],
834 "user-agent": [
835 "mercurial/proto-1.0 (Mercurial 5.3.2+463-d35fbae9dd33+20200408)"
836 ]
837 },
838 "body": "__conduit__=1&params=%7B%22__conduit__%22%3A+%7B%22token%22%3A+%22cli-hahayouwish%22%7D%2C+%22data%22%3A+%22%7B%5C%220124e5474c880e4fb40c8326ad2b75ae3e57ee5f%5C%22%3A+%7B%5C%22author%5C%22%3A+%5C%22test%5C%22%2C+%5C%22authorEmail%5C%22%3A+%5C%22test%5C%22%2C+%5C%22branch%5C%22%3A+%5C%22default%5C%22%2C+%5C%22commit%5C%22%3A+%5C%220124e5474c880e4fb40c8326ad2b75ae3e57ee5f%5C%22%2C+%5C%22parents%5C%22%3A+%5B%5C%22602c4e7382436988e46c0d56fb3883968302b3f6%5C%22%5D%2C+%5C%22time%5C%22%3A+0%7D%2C+%5C%2251a04fea8707151b9891822fb3c5fc5f11d45f59%5C%22%3A+%7B%5C%22author%5C%22%3A+%5C%22test%5C%22%2C+%5C%22authorEmail%5C%22%3A+%5C%22test%5C%22%2C+%5C%22branch%5C%22%3A+%5C%22default%5C%22%2C+%5C%22commit%5C%22%3A+%5C%2251a04fea8707151b9891822fb3c5fc5f11d45f59%5C%22%2C+%5C%22parents%5C%22%3A+%5B%5C%22e4edb1fe3565eaaecc1787ada4fcc2b7e9018fac%5C%22%5D%2C+%5C%22time%5C%22%3A+0%7D%2C+%5C%22602c4e7382436988e46c0d56fb3883968302b3f6%5C%22%3A+%7B%5C%22author%5C%22%3A+%5C%22test%5C%22%2C+%5C%22authorEmail%5C%22%3A+%5C%22test%5C%22%2C+%5C%22branch%5C%22%3A+%5C%22default%5C%22%2C+%5C%22commit%5C%22%3A+%5C%22602c4e7382436988e46c0d56fb3883968302b3f6%5C%22%2C+%5C%22parents%5C%22%3A+%5B%5C%2298d480e0d494906d9758c44c622951b429afd862%5C%22%5D%2C+%5C%22time%5C%22%3A+0%7D%2C+%5C%22e4edb1fe3565eaaecc1787ada4fcc2b7e9018fac%5C%22%3A+%7B%5C%22author%5C%22%3A+%5C%22test%5C%22%2C+%5C%22authorEmail%5C%22%3A+%5C%22test%5C%22%2C+%5C%22branch%5C%22%3A+%5C%22default%5C%22%2C+%5C%22commit%5C%22%3A+%5C%22e4edb1fe3565eaaecc1787ada4fcc2b7e9018fac%5C%22%2C+%5C%22parents%5C%22%3A+%5B%5C%220124e5474c880e4fb40c8326ad2b75ae3e57ee5f%5C%22%5D%2C+%5C%22time%5C%22%3A+0%7D%7D%22%2C+%22diff_id%22%3A+21009%2C+%22name%22%3A+%22local%3Acommits%22%7D&output=json",
839 "uri": "https://phab.mercurial-scm.org//api/differential.setdiffproperty",
840 "method": "POST"
841 },
842 "response": {
843 "headers": {
844 "x-xss-protection": [
845 "1; mode=block"
846 ],
847 "strict-transport-security": [
848 "max-age=0; includeSubdomains; preload"
849 ],
850 "transfer-encoding": [
851 "chunked"
852 ],
853 "x-frame-options": [
854 "Deny"
855 ],
856 "expires": [
857 "Sat, 01 Jan 2000 00:00:00 GMT"
858 ],
859 "content-type": [
860 "application/json"
861 ],
862 "referrer-policy": [
863 "no-referrer"
864 ],
865 "server": [
866 "Apache/2.4.10 (Debian)"
867 ],
868 "cache-control": [
869 "no-store"
870 ],
871 "x-content-type-options": [
872 "nosniff"
873 ],
874 "date": [
875 "Wed, 08 Apr 2020 21:13:19 GMT"
876 ]
877 },
878 "body": {
879 "string": "{\"result\":null,\"error_code\":null,\"error_info\":null}"
880 },
881 "status": {
882 "code": 200,
883 "message": "OK"
884 }
885 }
886 }
887 ],
888 "version": 1
889 } No newline at end of file
This diff has been collapsed as it changes many lines, (960 lines changed) Show them Hide them
@@ -0,0 +1,960 b''
1 {
2 "interactions": [
3 {
4 "request": {
5 "headers": {
6 "content-length": [
7 "178"
8 ],
9 "accept": [
10 "application/mercurial-0.1"
11 ],
12 "content-type": [
13 "application/x-www-form-urlencoded"
14 ],
15 "host": [
16 "phab.mercurial-scm.org"
17 ],
18 "user-agent": [
19 "mercurial/proto-1.0 (Mercurial 5.3.2+463-d35fbae9dd33+20200408)"
20 ]
21 },
22 "body": "__conduit__=1&params=%7B%22__conduit__%22%3A+%7B%22token%22%3A+%22cli-hahayouwish%22%7D%2C+%22revisionIDs%22%3A+%5B8387%2C+8387%2C+8387%2C+8387%5D%7D&output=json",
23 "uri": "https://phab.mercurial-scm.org//api/differential.querydiffs",
24 "method": "POST"
25 },
26 "response": {
27 "headers": {
28 "x-xss-protection": [
29 "1; mode=block"
30 ],
31 "strict-transport-security": [
32 "max-age=0; includeSubdomains; preload"
33 ],
34 "transfer-encoding": [
35 "chunked"
36 ],
37 "x-frame-options": [
38 "Deny"
39 ],
40 "expires": [
41 "Sat, 01 Jan 2000 00:00:00 GMT"
42 ],
43 "content-type": [
44 "application/json"
45 ],
46 "referrer-policy": [
47 "no-referrer"
48 ],
49 "server": [
50 "Apache/2.4.10 (Debian)"
51 ],
52 "cache-control": [
53 "no-store"
54 ],
55 "x-content-type-options": [
56 "nosniff"
57 ],
58 "date": [
59 "Wed, 08 Apr 2020 21:13:20 GMT"
60 ]
61 },
62 "body": {
63 "string": "{\"result\":{\"21009\":{\"id\":\"21009\",\"revisionID\":\"8387\",\"dateCreated\":\"1586380394\",\"dateModified\":\"1586380397\",\"sourceControlBaseRevision\":\"98d480e0d494906d9758c44c622951b429afd862\",\"sourceControlPath\":\"\\/\",\"sourceControlSystem\":\"hg\",\"branch\":\"default\",\"bookmark\":null,\"creationMethod\":\"phabsend\",\"description\":null,\"unitStatus\":\"0\",\"lintStatus\":\"0\",\"changes\":[{\"id\":\"56829\",\"metadata\":{\"line:first\":1,\"hash.effect\":\"r1N4i770De9n\"},\"oldPath\":null,\"currentPath\":\"file2.txt\",\"awayPaths\":[],\"oldProperties\":[],\"newProperties\":{\"unix:filemode\":\"100644\"},\"type\":\"1\",\"fileType\":\"1\",\"commitHash\":null,\"addLines\":\"1\",\"delLines\":\"0\",\"hunks\":[{\"oldOffset\":\"0\",\"newOffset\":\"1\",\"oldLength\":\"0\",\"newLength\":\"1\",\"addLines\":null,\"delLines\":null,\"isMissingOldNewline\":null,\"isMissingNewNewline\":null,\"corpus\":\"+another mod\\n\"}]},{\"id\":\"56828\",\"metadata\":{\"line:first\":1,\"hash.effect\":\"cAKuVP31KNrx\"},\"oldPath\":\"file.txt\",\"currentPath\":\"file.txt\",\"awayPaths\":[],\"oldProperties\":[],\"newProperties\":[],\"type\":\"2\",\"fileType\":\"1\",\"commitHash\":null,\"addLines\":\"1\",\"delLines\":\"1\",\"hunks\":[{\"oldOffset\":\"1\",\"newOffset\":\"1\",\"oldLength\":\"1\",\"newLength\":\"1\",\"addLines\":null,\"delLines\":null,\"isMissingOldNewline\":null,\"isMissingNewNewline\":null,\"corpus\":\"-added\\n+mod3\\n\"}]}],\"properties\":{\"hg:meta\":{\"branch\":\"default\",\"date\":\"0 0\",\"node\":\"51a04fea8707151b9891822fb3c5fc5f11d45f59\",\"parent\":\"98d480e0d494906d9758c44c622951b429afd862\",\"user\":\"test\"},\"local:commits\":{\"0124e5474c880e4fb40c8326ad2b75ae3e57ee5f\":{\"author\":\"test\",\"authorEmail\":\"test\",\"branch\":\"default\",\"commit\":\"0124e5474c880e4fb40c8326ad2b75ae3e57ee5f\",\"parents\":[\"602c4e7382436988e46c0d56fb3883968302b3f6\"],\"time\":0},\"51a04fea8707151b9891822fb3c5fc5f11d45f59\":{\"author\":\"test\",\"authorEmail\":\"test\",\"branch\":\"default\",\"commit\":\"51a04fea8707151b9891822fb3c5fc5f11d45f59\",\"parents\":[\"e4edb1fe3565eaaecc1787ada4fcc2b7e9018fac\"],\"time\":0},\"602c4e7382436988e46c0d56fb3883968302b3f6\":{\"author\":\"test\",\"authorEmail\":\"test\",\"branch\":\"default\",\"commit\":\"602c4e7382436988e46c0d56fb3883968302b3f6\",\"parents\":[\"98d480e0d494906d9758c44c622951b429afd862\"],\"time\":0},\"e4edb1fe3565eaaecc1787ada4fcc2b7e9018fac\":{\"author\":\"test\",\"authorEmail\":\"test\",\"branch\":\"default\",\"commit\":\"e4edb1fe3565eaaecc1787ada4fcc2b7e9018fac\",\"parents\":[\"0124e5474c880e4fb40c8326ad2b75ae3e57ee5f\"],\"time\":0}}},\"authorName\":\"test\",\"authorEmail\":\"test\"},\"21008\":{\"id\":\"21008\",\"revisionID\":\"8387\",\"dateCreated\":\"1586380389\",\"dateModified\":\"1586380391\",\"sourceControlBaseRevision\":\"98d480e0d494906d9758c44c622951b429afd862\",\"sourceControlPath\":\"\\/\",\"sourceControlSystem\":\"hg\",\"branch\":\"default\",\"bookmark\":null,\"creationMethod\":\"phabsend\",\"description\":null,\"unitStatus\":\"0\",\"lintStatus\":\"0\",\"changes\":[{\"id\":\"56827\",\"metadata\":{\"line:first\":1,\"hash.effect\":\"yXvxVg6uibwd\"},\"oldPath\":null,\"currentPath\":\"file2.txt\",\"awayPaths\":[],\"oldProperties\":[],\"newProperties\":{\"unix:filemode\":\"100644\"},\"type\":\"1\",\"fileType\":\"1\",\"commitHash\":null,\"addLines\":\"1\",\"delLines\":\"0\",\"hunks\":[{\"oldOffset\":\"0\",\"newOffset\":\"1\",\"oldLength\":\"0\",\"newLength\":\"1\",\"addLines\":null,\"delLines\":null,\"isMissingOldNewline\":null,\"isMissingNewNewline\":null,\"corpus\":\"+modified\\n\"}]},{\"id\":\"56826\",\"metadata\":{\"line:first\":1,\"hash.effect\":\"cAKuVP31KNrx\"},\"oldPath\":\"file.txt\",\"currentPath\":\"file.txt\",\"awayPaths\":[],\"oldProperties\":[],\"newProperties\":[],\"type\":\"2\",\"fileType\":\"1\",\"commitHash\":null,\"addLines\":\"1\",\"delLines\":\"1\",\"hunks\":[{\"oldOffset\":\"1\",\"newOffset\":\"1\",\"oldLength\":\"1\",\"newLength\":\"1\",\"addLines\":null,\"delLines\":null,\"isMissingOldNewline\":null,\"isMissingNewNewline\":null,\"corpus\":\"-added\\n+mod3\\n\"}]}],\"properties\":{\"hg:meta\":{\"branch\":\"default\",\"date\":\"0 0\",\"node\":\"e4edb1fe3565eaaecc1787ada4fcc2b7e9018fac\",\"parent\":\"98d480e0d494906d9758c44c622951b429afd862\",\"user\":\"test\"},\"local:commits\":{\"0124e5474c880e4fb40c8326ad2b75ae3e57ee5f\":{\"author\":\"test\",\"authorEmail\":\"test\",\"branch\":\"default\",\"commit\":\"0124e5474c880e4fb40c8326ad2b75ae3e57ee5f\",\"parents\":[\"602c4e7382436988e46c0d56fb3883968302b3f6\"],\"time\":0},\"602c4e7382436988e46c0d56fb3883968302b3f6\":{\"author\":\"test\",\"authorEmail\":\"test\",\"branch\":\"default\",\"commit\":\"602c4e7382436988e46c0d56fb3883968302b3f6\",\"parents\":[\"98d480e0d494906d9758c44c622951b429afd862\"],\"time\":0},\"e4edb1fe3565eaaecc1787ada4fcc2b7e9018fac\":{\"author\":\"test\",\"authorEmail\":\"test\",\"branch\":\"default\",\"commit\":\"e4edb1fe3565eaaecc1787ada4fcc2b7e9018fac\",\"parents\":[\"0124e5474c880e4fb40c8326ad2b75ae3e57ee5f\"],\"time\":0}}},\"authorName\":\"test\",\"authorEmail\":\"test\"},\"21007\":{\"id\":\"21007\",\"revisionID\":\"8387\",\"dateCreated\":\"1586380382\",\"dateModified\":\"1586380385\",\"sourceControlBaseRevision\":\"98d480e0d494906d9758c44c622951b429afd862\",\"sourceControlPath\":\"\\/\",\"sourceControlSystem\":\"hg\",\"branch\":\"default\",\"bookmark\":null,\"creationMethod\":\"phabsend\",\"description\":null,\"unitStatus\":\"0\",\"lintStatus\":\"0\",\"changes\":[{\"id\":\"56825\",\"metadata\":{\"line:first\":1,\"hash.effect\":\"yXvxVg6uibwd\"},\"oldPath\":null,\"currentPath\":\"file2.txt\",\"awayPaths\":[],\"oldProperties\":[],\"newProperties\":{\"unix:filemode\":\"100644\"},\"type\":\"1\",\"fileType\":\"1\",\"commitHash\":null,\"addLines\":\"1\",\"delLines\":\"0\",\"hunks\":[{\"oldOffset\":\"0\",\"newOffset\":\"1\",\"oldLength\":\"0\",\"newLength\":\"1\",\"addLines\":null,\"delLines\":null,\"isMissingOldNewline\":null,\"isMissingNewNewline\":null,\"corpus\":\"+modified\\n\"}]},{\"id\":\"56824\",\"metadata\":{\"line:first\":1,\"hash.effect\":\"cAKuVP31KNrx\"},\"oldPath\":\"file.txt\",\"currentPath\":\"file.txt\",\"awayPaths\":[],\"oldProperties\":[],\"newProperties\":[],\"type\":\"2\",\"fileType\":\"1\",\"commitHash\":null,\"addLines\":\"1\",\"delLines\":\"1\",\"hunks\":[{\"oldOffset\":\"1\",\"newOffset\":\"1\",\"oldLength\":\"1\",\"newLength\":\"1\",\"addLines\":null,\"delLines\":null,\"isMissingOldNewline\":null,\"isMissingNewNewline\":null,\"corpus\":\"-added\\n+mod3\\n\"}]}],\"properties\":{\"hg:meta\":{\"branch\":\"default\",\"date\":\"0 0\",\"node\":\"e4edb1fe3565eaaecc1787ada4fcc2b7e9018fac\",\"parent\":\"98d480e0d494906d9758c44c622951b429afd862\",\"user\":\"test\"},\"local:commits\":{\"0124e5474c880e4fb40c8326ad2b75ae3e57ee5f\":{\"author\":\"test\",\"authorEmail\":\"test\",\"branch\":\"default\",\"commit\":\"0124e5474c880e4fb40c8326ad2b75ae3e57ee5f\",\"parents\":[\"602c4e7382436988e46c0d56fb3883968302b3f6\"],\"time\":0},\"602c4e7382436988e46c0d56fb3883968302b3f6\":{\"author\":\"test\",\"authorEmail\":\"test\",\"branch\":\"default\",\"commit\":\"602c4e7382436988e46c0d56fb3883968302b3f6\",\"parents\":[\"98d480e0d494906d9758c44c622951b429afd862\"],\"time\":0},\"e4edb1fe3565eaaecc1787ada4fcc2b7e9018fac\":{\"author\":\"test\",\"authorEmail\":\"test\",\"branch\":\"default\",\"commit\":\"e4edb1fe3565eaaecc1787ada4fcc2b7e9018fac\",\"parents\":[\"0124e5474c880e4fb40c8326ad2b75ae3e57ee5f\"],\"time\":0}}},\"authorName\":\"test\",\"authorEmail\":\"test\"},\"21006\":{\"id\":\"21006\",\"revisionID\":\"8387\",\"dateCreated\":\"1586380375\",\"dateModified\":\"1586380377\",\"sourceControlBaseRevision\":\"98d480e0d494906d9758c44c622951b429afd862\",\"sourceControlPath\":\"\\/\",\"sourceControlSystem\":\"hg\",\"branch\":\"default\",\"bookmark\":null,\"creationMethod\":\"phabsend\",\"description\":null,\"unitStatus\":\"0\",\"lintStatus\":\"0\",\"changes\":[{\"id\":\"56823\",\"metadata\":{\"line:first\":1,\"hash.effect\":\"cAKuVP31KNrx\"},\"oldPath\":\"file.txt\",\"currentPath\":\"file.txt\",\"awayPaths\":[],\"oldProperties\":[],\"newProperties\":[],\"type\":\"2\",\"fileType\":\"1\",\"commitHash\":null,\"addLines\":\"1\",\"delLines\":\"1\",\"hunks\":[{\"oldOffset\":\"1\",\"newOffset\":\"1\",\"oldLength\":\"1\",\"newLength\":\"1\",\"addLines\":null,\"delLines\":null,\"isMissingOldNewline\":null,\"isMissingNewNewline\":null,\"corpus\":\"-added\\n+mod3\\n\"}]}],\"properties\":{\"hg:meta\":{\"branch\":\"default\",\"date\":\"0 0\",\"node\":\"921f8265efbd92e92bfa5d7a0e047908de9844a5\",\"parent\":\"98d480e0d494906d9758c44c622951b429afd862\",\"user\":\"test\"},\"local:commits\":{\"602c4e7382436988e46c0d56fb3883968302b3f6\":{\"author\":\"test\",\"authorEmail\":\"test\",\"branch\":\"default\",\"commit\":\"602c4e7382436988e46c0d56fb3883968302b3f6\",\"parents\":[\"98d480e0d494906d9758c44c622951b429afd862\"],\"time\":0},\"832553266fe8c3330d968e6987df4ae793483b2b\":{\"author\":\"test\",\"authorEmail\":\"test\",\"branch\":\"default\",\"commit\":\"832553266fe8c3330d968e6987df4ae793483b2b\",\"parents\":[\"602c4e7382436988e46c0d56fb3883968302b3f6\"],\"time\":0},\"921f8265efbd92e92bfa5d7a0e047908de9844a5\":{\"author\":\"test\",\"authorEmail\":\"test\",\"branch\":\"default\",\"commit\":\"921f8265efbd92e92bfa5d7a0e047908de9844a5\",\"parents\":[\"832553266fe8c3330d968e6987df4ae793483b2b\"],\"time\":0}}},\"authorName\":\"test\",\"authorEmail\":\"test\"}},\"error_code\":null,\"error_info\":null}"
64 },
65 "status": {
66 "code": 200,
67 "message": "OK"
68 }
69 }
70 },
71 {
72 "request": {
73 "headers": {
74 "content-length": [
75 "183"
76 ],
77 "accept": [
78 "application/mercurial-0.1"
79 ],
80 "content-type": [
81 "application/x-www-form-urlencoded"
82 ],
83 "host": [
84 "phab.mercurial-scm.org"
85 ],
86 "user-agent": [
87 "mercurial/proto-1.0 (Mercurial 5.3.2+463-d35fbae9dd33+20200408)"
88 ]
89 },
90 "body": "__conduit__=1&params=%7B%22__conduit__%22%3A+%7B%22token%22%3A+%22cli-hahayouwish%22%7D%2C+%22constraints%22%3A+%7B%22callsigns%22%3A+%5B%22HG%22%5D%7D%7D&output=json",
91 "uri": "https://phab.mercurial-scm.org//api/diffusion.repository.search",
92 "method": "POST"
93 },
94 "response": {
95 "headers": {
96 "x-xss-protection": [
97 "1; mode=block"
98 ],
99 "strict-transport-security": [
100 "max-age=0; includeSubdomains; preload"
101 ],
102 "transfer-encoding": [
103 "chunked"
104 ],
105 "x-frame-options": [
106 "Deny"
107 ],
108 "expires": [
109 "Sat, 01 Jan 2000 00:00:00 GMT"
110 ],
111 "content-type": [
112 "application/json"
113 ],
114 "referrer-policy": [
115 "no-referrer"
116 ],
117 "server": [
118 "Apache/2.4.10 (Debian)"
119 ],
120 "cache-control": [
121 "no-store"
122 ],
123 "x-content-type-options": [
124 "nosniff"
125 ],
126 "date": [
127 "Wed, 08 Apr 2020 21:13:21 GMT"
128 ]
129 },
130 "body": {
131 "string": "{\"result\":{\"data\":[{\"id\":2,\"type\":\"REPO\",\"phid\":\"PHID-REPO-bvunnehri4u2isyr7bc3\",\"fields\":{\"name\":\"Mercurial\",\"vcs\":\"hg\",\"callsign\":\"HG\",\"shortName\":null,\"status\":\"active\",\"isImporting\":false,\"almanacServicePHID\":null,\"refRules\":{\"fetchRules\":[],\"trackRules\":[],\"permanentRefRules\":[]},\"spacePHID\":null,\"dateCreated\":1498761653,\"dateModified\":1500403184,\"policy\":{\"view\":\"public\",\"edit\":\"admin\",\"diffusion.push\":\"users\"}},\"attachments\":{}}],\"maps\":{},\"query\":{\"queryKey\":null},\"cursor\":{\"limit\":100,\"after\":null,\"before\":null,\"order\":null}},\"error_code\":null,\"error_info\":null}"
132 },
133 "status": {
134 "code": 200,
135 "message": "OK"
136 }
137 }
138 },
139 {
140 "request": {
141 "headers": {
142 "content-length": [
143 "1756"
144 ],
145 "accept": [
146 "application/mercurial-0.1"
147 ],
148 "content-type": [
149 "application/x-www-form-urlencoded"
150 ],
151 "host": [
152 "phab.mercurial-scm.org"
153 ],
154 "user-agent": [
155 "mercurial/proto-1.0 (Mercurial 5.3.2+463-d35fbae9dd33+20200408)"
156 ]
157 },
158 "body": "__conduit__=1&params=%7B%22__conduit__%22%3A+%7B%22token%22%3A+%22cli-hahayouwish%22%7D%2C+%22bookmark%22%3A+null%2C+%22branch%22%3A+%22default%22%2C+%22changes%22%3A+%7B%22file.txt%22%3A+%7B%22addLines%22%3A+1%2C+%22awayPaths%22%3A+%5B%5D%2C+%22commitHash%22%3A+null%2C+%22currentPath%22%3A+%22file.txt%22%2C+%22delLines%22%3A+0%2C+%22fileType%22%3A+1%2C+%22hunks%22%3A+%5B%7B%22addLines%22%3A+1%2C+%22corpus%22%3A+%22%2Bmod3%5Cn%22%2C+%22delLines%22%3A+0%2C+%22newLength%22%3A+1%2C+%22newOffset%22%3A+1%2C+%22oldLength%22%3A+0%2C+%22oldOffset%22%3A+0%7D%5D%2C+%22metadata%22%3A+%7B%7D%2C+%22newProperties%22%3A+%7B%22unix%3Afilemode%22%3A+%22100644%22%7D%2C+%22oldPath%22%3A+null%2C+%22oldProperties%22%3A+%7B%7D%2C+%22type%22%3A+1%7D%2C+%22file2.txt%22%3A+%7B%22addLines%22%3A+1%2C+%22awayPaths%22%3A+%5B%5D%2C+%22commitHash%22%3A+null%2C+%22currentPath%22%3A+%22file2.txt%22%2C+%22delLines%22%3A+0%2C+%22fileType%22%3A+1%2C+%22hunks%22%3A+%5B%7B%22addLines%22%3A+1%2C+%22corpus%22%3A+%22%2Banother+mod%5Cn%22%2C+%22delLines%22%3A+0%2C+%22newLength%22%3A+1%2C+%22newOffset%22%3A+1%2C+%22oldLength%22%3A+0%2C+%22oldOffset%22%3A+0%7D%5D%2C+%22metadata%22%3A+%7B%7D%2C+%22newProperties%22%3A+%7B%22unix%3Afilemode%22%3A+%22100644%22%7D%2C+%22oldPath%22%3A+null%2C+%22oldProperties%22%3A+%7B%7D%2C+%22type%22%3A+1%7D%7D%2C+%22creationMethod%22%3A+%22phabsend%22%2C+%22lintStatus%22%3A+%22none%22%2C+%22repositoryPHID%22%3A+%22PHID-REPO-bvunnehri4u2isyr7bc3%22%2C+%22sourceControlBaseRevision%22%3A+%220000000000000000000000000000000000000000%22%2C+%22sourceControlPath%22%3A+%22%2F%22%2C+%22sourceControlSystem%22%3A+%22hg%22%2C+%22sourceMachine%22%3A+%22%22%2C+%22sourcePath%22%3A+%22%2F%22%2C+%22unitStatus%22%3A+%22none%22%7D&output=json",
159 "uri": "https://phab.mercurial-scm.org//api/differential.creatediff",
160 "method": "POST"
161 },
162 "response": {
163 "headers": {
164 "x-xss-protection": [
165 "1; mode=block"
166 ],
167 "strict-transport-security": [
168 "max-age=0; includeSubdomains; preload"
169 ],
170 "transfer-encoding": [
171 "chunked"
172 ],
173 "x-frame-options": [
174 "Deny"
175 ],
176 "expires": [
177 "Sat, 01 Jan 2000 00:00:00 GMT"
178 ],
179 "content-type": [
180 "application/json"
181 ],
182 "referrer-policy": [
183 "no-referrer"
184 ],
185 "server": [
186 "Apache/2.4.10 (Debian)"
187 ],
188 "cache-control": [
189 "no-store"
190 ],
191 "x-content-type-options": [
192 "nosniff"
193 ],
194 "date": [
195 "Wed, 08 Apr 2020 21:13:21 GMT"
196 ]
197 },
198 "body": {
199 "string": "{\"result\":{\"diffid\":21010,\"phid\":\"PHID-DIFF-rgriot6pr2ef72gyyljl\",\"uri\":\"https:\\/\\/phab.mercurial-scm.org\\/differential\\/diff\\/21010\\/\"},\"error_code\":null,\"error_info\":null}"
200 },
201 "status": {
202 "code": 200,
203 "message": "OK"
204 }
205 }
206 },
207 {
208 "request": {
209 "headers": {
210 "content-length": [
211 "482"
212 ],
213 "accept": [
214 "application/mercurial-0.1"
215 ],
216 "content-type": [
217 "application/x-www-form-urlencoded"
218 ],
219 "host": [
220 "phab.mercurial-scm.org"
221 ],
222 "user-agent": [
223 "mercurial/proto-1.0 (Mercurial 5.3.2+463-d35fbae9dd33+20200408)"
224 ]
225 },
226 "body": "__conduit__=1&params=%7B%22__conduit__%22%3A+%7B%22token%22%3A+%22cli-hahayouwish%22%7D%2C+%22data%22%3A+%22%7B%5C%22branch%5C%22%3A+%5C%22default%5C%22%2C+%5C%22date%5C%22%3A+%5C%220+0%5C%22%2C+%5C%22node%5C%22%3A+%5C%2251a04fea8707151b9891822fb3c5fc5f11d45f59%5C%22%2C+%5C%22parent%5C%22%3A+%5C%220000000000000000000000000000000000000000%5C%22%2C+%5C%22user%5C%22%3A+%5C%22test%5C%22%7D%22%2C+%22diff_id%22%3A+21010%2C+%22name%22%3A+%22hg%3Ameta%22%7D&output=json",
227 "uri": "https://phab.mercurial-scm.org//api/differential.setdiffproperty",
228 "method": "POST"
229 },
230 "response": {
231 "headers": {
232 "x-xss-protection": [
233 "1; mode=block"
234 ],
235 "strict-transport-security": [
236 "max-age=0; includeSubdomains; preload"
237 ],
238 "transfer-encoding": [
239 "chunked"
240 ],
241 "x-frame-options": [
242 "Deny"
243 ],
244 "expires": [
245 "Sat, 01 Jan 2000 00:00:00 GMT"
246 ],
247 "content-type": [
248 "application/json"
249 ],
250 "referrer-policy": [
251 "no-referrer"
252 ],
253 "server": [
254 "Apache/2.4.10 (Debian)"
255 ],
256 "cache-control": [
257 "no-store"
258 ],
259 "x-content-type-options": [
260 "nosniff"
261 ],
262 "date": [
263 "Wed, 08 Apr 2020 21:13:22 GMT"
264 ]
265 },
266 "body": {
267 "string": "{\"result\":null,\"error_code\":null,\"error_info\":null}"
268 },
269 "status": {
270 "code": 200,
271 "message": "OK"
272 }
273 }
274 },
275 {
276 "request": {
277 "headers": {
278 "content-length": [
279 "2130"
280 ],
281 "accept": [
282 "application/mercurial-0.1"
283 ],
284 "content-type": [
285 "application/x-www-form-urlencoded"
286 ],
287 "host": [
288 "phab.mercurial-scm.org"
289 ],
290 "user-agent": [
291 "mercurial/proto-1.0 (Mercurial 5.3.2+463-d35fbae9dd33+20200408)"
292 ]
293 },
294 "body": "__conduit__=1&params=%7B%22__conduit__%22%3A+%7B%22token%22%3A+%22cli-hahayouwish%22%7D%2C+%22data%22%3A+%22%7B%5C%220124e5474c880e4fb40c8326ad2b75ae3e57ee5f%5C%22%3A+%7B%5C%22author%5C%22%3A+%5C%22test%5C%22%2C+%5C%22authorEmail%5C%22%3A+%5C%22test%5C%22%2C+%5C%22branch%5C%22%3A+%5C%22default%5C%22%2C+%5C%22commit%5C%22%3A+%5C%220124e5474c880e4fb40c8326ad2b75ae3e57ee5f%5C%22%2C+%5C%22parents%5C%22%3A+%5B%5C%22602c4e7382436988e46c0d56fb3883968302b3f6%5C%22%5D%2C+%5C%22time%5C%22%3A+0%7D%2C+%5C%2251a04fea8707151b9891822fb3c5fc5f11d45f59%5C%22%3A+%7B%5C%22author%5C%22%3A+%5C%22test%5C%22%2C+%5C%22authorEmail%5C%22%3A+%5C%22test%5C%22%2C+%5C%22branch%5C%22%3A+%5C%22default%5C%22%2C+%5C%22commit%5C%22%3A+%5C%2251a04fea8707151b9891822fb3c5fc5f11d45f59%5C%22%2C+%5C%22parents%5C%22%3A+%5B%5C%22e4edb1fe3565eaaecc1787ada4fcc2b7e9018fac%5C%22%5D%2C+%5C%22time%5C%22%3A+0%7D%2C+%5C%22602c4e7382436988e46c0d56fb3883968302b3f6%5C%22%3A+%7B%5C%22author%5C%22%3A+%5C%22test%5C%22%2C+%5C%22authorEmail%5C%22%3A+%5C%22test%5C%22%2C+%5C%22branch%5C%22%3A+%5C%22default%5C%22%2C+%5C%22commit%5C%22%3A+%5C%22602c4e7382436988e46c0d56fb3883968302b3f6%5C%22%2C+%5C%22parents%5C%22%3A+%5B%5C%2298d480e0d494906d9758c44c622951b429afd862%5C%22%5D%2C+%5C%22time%5C%22%3A+0%7D%2C+%5C%2298d480e0d494906d9758c44c622951b429afd862%5C%22%3A+%7B%5C%22author%5C%22%3A+%5C%22test%5C%22%2C+%5C%22authorEmail%5C%22%3A+%5C%22test%5C%22%2C+%5C%22branch%5C%22%3A+%5C%22default%5C%22%2C+%5C%22commit%5C%22%3A+%5C%2298d480e0d494906d9758c44c622951b429afd862%5C%22%2C+%5C%22parents%5C%22%3A+%5B%5C%220000000000000000000000000000000000000000%5C%22%5D%2C+%5C%22time%5C%22%3A+0%7D%2C+%5C%22e4edb1fe3565eaaecc1787ada4fcc2b7e9018fac%5C%22%3A+%7B%5C%22author%5C%22%3A+%5C%22test%5C%22%2C+%5C%22authorEmail%5C%22%3A+%5C%22test%5C%22%2C+%5C%22branch%5C%22%3A+%5C%22default%5C%22%2C+%5C%22commit%5C%22%3A+%5C%22e4edb1fe3565eaaecc1787ada4fcc2b7e9018fac%5C%22%2C+%5C%22parents%5C%22%3A+%5B%5C%220124e5474c880e4fb40c8326ad2b75ae3e57ee5f%5C%22%5D%2C+%5C%22time%5C%22%3A+0%7D%7D%22%2C+%22diff_id%22%3A+21010%2C+%22name%22%3A+%22local%3Acommits%22%7D&output=json",
295 "uri": "https://phab.mercurial-scm.org//api/differential.setdiffproperty",
296 "method": "POST"
297 },
298 "response": {
299 "headers": {
300 "x-xss-protection": [
301 "1; mode=block"
302 ],
303 "strict-transport-security": [
304 "max-age=0; includeSubdomains; preload"
305 ],
306 "transfer-encoding": [
307 "chunked"
308 ],
309 "x-frame-options": [
310 "Deny"
311 ],
312 "expires": [
313 "Sat, 01 Jan 2000 00:00:00 GMT"
314 ],
315 "content-type": [
316 "application/json"
317 ],
318 "referrer-policy": [
319 "no-referrer"
320 ],
321 "server": [
322 "Apache/2.4.10 (Debian)"
323 ],
324 "cache-control": [
325 "no-store"
326 ],
327 "x-content-type-options": [
328 "nosniff"
329 ],
330 "date": [
331 "Wed, 08 Apr 2020 21:13:22 GMT"
332 ]
333 },
334 "body": {
335 "string": "{\"result\":null,\"error_code\":null,\"error_info\":null}"
336 },
337 "status": {
338 "code": 200,
339 "message": "OK"
340 }
341 }
342 },
343 {
344 "request": {
345 "headers": {
346 "content-length": [
347 "155"
348 ],
349 "accept": [
350 "application/mercurial-0.1"
351 ],
352 "content-type": [
353 "application/x-www-form-urlencoded"
354 ],
355 "host": [
356 "phab.mercurial-scm.org"
357 ],
358 "user-agent": [
359 "mercurial/proto-1.0 (Mercurial 5.3.2+463-d35fbae9dd33+20200408)"
360 ]
361 },
362 "body": "__conduit__=1&params=%7B%22__conduit__%22%3A+%7B%22token%22%3A+%22cli-hahayouwish%22%7D%2C+%22corpus%22%3A+%22added+file%22%7D&output=json",
363 "uri": "https://phab.mercurial-scm.org//api/differential.parsecommitmessage",
364 "method": "POST"
365 },
366 "response": {
367 "headers": {
368 "x-xss-protection": [
369 "1; mode=block"
370 ],
371 "strict-transport-security": [
372 "max-age=0; includeSubdomains; preload"
373 ],
374 "transfer-encoding": [
375 "chunked"
376 ],
377 "x-frame-options": [
378 "Deny"
379 ],
380 "expires": [
381 "Sat, 01 Jan 2000 00:00:00 GMT"
382 ],
383 "content-type": [
384 "application/json"
385 ],
386 "referrer-policy": [
387 "no-referrer"
388 ],
389 "server": [
390 "Apache/2.4.10 (Debian)"
391 ],
392 "cache-control": [
393 "no-store"
394 ],
395 "x-content-type-options": [
396 "nosniff"
397 ],
398 "date": [
399 "Wed, 08 Apr 2020 21:13:22 GMT"
400 ]
401 },
402 "body": {
403 "string": "{\"result\":{\"errors\":[],\"fields\":{\"title\":\"added file\"},\"revisionIDFieldInfo\":{\"value\":null,\"validDomain\":\"https:\\/\\/phab.mercurial-scm.org\"},\"transactions\":[{\"type\":\"title\",\"value\":\"added file\"}]},\"error_code\":null,\"error_info\":null}"
404 },
405 "status": {
406 "code": 200,
407 "message": "OK"
408 }
409 }
410 },
411 {
412 "request": {
413 "headers": {
414 "content-length": [
415 "364"
416 ],
417 "accept": [
418 "application/mercurial-0.1"
419 ],
420 "content-type": [
421 "application/x-www-form-urlencoded"
422 ],
423 "host": [
424 "phab.mercurial-scm.org"
425 ],
426 "user-agent": [
427 "mercurial/proto-1.0 (Mercurial 5.3.2+463-d35fbae9dd33+20200408)"
428 ]
429 },
430 "body": "__conduit__=1&params=%7B%22__conduit__%22%3A+%7B%22token%22%3A+%22cli-hahayouwish%22%7D%2C+%22corpus%22%3A+%22one%3A+first+commit+to+review%5Cn%5CnThis+file+was+modified+with+%27mod1%27+as+its+contents.%5Cn%5CnTest+Plan%3A%5CnLOL%21++What+testing%3F%21%5Cn%5CnDifferential+Revision%3A+https%3A%2F%2Fphab.mercurial-scm.org%2FD8387%22%7D&output=json",
431 "uri": "https://phab.mercurial-scm.org//api/differential.parsecommitmessage",
432 "method": "POST"
433 },
434 "response": {
435 "headers": {
436 "x-xss-protection": [
437 "1; mode=block"
438 ],
439 "strict-transport-security": [
440 "max-age=0; includeSubdomains; preload"
441 ],
442 "transfer-encoding": [
443 "chunked"
444 ],
445 "x-frame-options": [
446 "Deny"
447 ],
448 "expires": [
449 "Sat, 01 Jan 2000 00:00:00 GMT"
450 ],
451 "content-type": [
452 "application/json"
453 ],
454 "referrer-policy": [
455 "no-referrer"
456 ],
457 "server": [
458 "Apache/2.4.10 (Debian)"
459 ],
460 "cache-control": [
461 "no-store"
462 ],
463 "x-content-type-options": [
464 "nosniff"
465 ],
466 "date": [
467 "Wed, 08 Apr 2020 21:13:23 GMT"
468 ]
469 },
470 "body": {
471 "string": "{\"result\":{\"errors\":[],\"fields\":{\"title\":\"one: first commit to review\",\"testPlan\":\"LOL! What testing?!\",\"revisionID\":8387,\"summary\":\"This file was modified with 'mod1' as its contents.\"},\"revisionIDFieldInfo\":{\"value\":8387,\"validDomain\":\"https:\\/\\/phab.mercurial-scm.org\"},\"transactions\":[{\"type\":\"title\",\"value\":\"one: first commit to review\"},{\"type\":\"testPlan\",\"value\":\"LOL! What testing?!\"},{\"type\":\"summary\",\"value\":\"This file was modified with 'mod1' as its contents.\"}]},\"error_code\":null,\"error_info\":null}"
472 },
473 "status": {
474 "code": 200,
475 "message": "OK"
476 }
477 }
478 },
479 {
480 "request": {
481 "headers": {
482 "content-length": [
483 "361"
484 ],
485 "accept": [
486 "application/mercurial-0.1"
487 ],
488 "content-type": [
489 "application/x-www-form-urlencoded"
490 ],
491 "host": [
492 "phab.mercurial-scm.org"
493 ],
494 "user-agent": [
495 "mercurial/proto-1.0 (Mercurial 5.3.2+463-d35fbae9dd33+20200408)"
496 ]
497 },
498 "body": "__conduit__=1&params=%7B%22__conduit__%22%3A+%7B%22token%22%3A+%22cli-hahayouwish%22%7D%2C+%22corpus%22%3A+%22two%3A+second+commit+to+review%5Cn%5CnThis+file+was+modified+with+%27mod2%27+as+its+contents.%5Cn%5CnTest+Plan%3A%5CnHaha%21+yeah%2C+right.%5Cn%5CnDifferential+Revision%3A+https%3A%2F%2Fphab.mercurial-scm.org%2FD8387%22%7D&output=json",
499 "uri": "https://phab.mercurial-scm.org//api/differential.parsecommitmessage",
500 "method": "POST"
501 },
502 "response": {
503 "headers": {
504 "x-xss-protection": [
505 "1; mode=block"
506 ],
507 "strict-transport-security": [
508 "max-age=0; includeSubdomains; preload"
509 ],
510 "transfer-encoding": [
511 "chunked"
512 ],
513 "x-frame-options": [
514 "Deny"
515 ],
516 "expires": [
517 "Sat, 01 Jan 2000 00:00:00 GMT"
518 ],
519 "content-type": [
520 "application/json"
521 ],
522 "referrer-policy": [
523 "no-referrer"
524 ],
525 "server": [
526 "Apache/2.4.10 (Debian)"
527 ],
528 "cache-control": [
529 "no-store"
530 ],
531 "x-content-type-options": [
532 "nosniff"
533 ],
534 "date": [
535 "Wed, 08 Apr 2020 21:13:23 GMT"
536 ]
537 },
538 "body": {
539 "string": "{\"result\":{\"errors\":[],\"fields\":{\"title\":\"two: second commit to review\",\"testPlan\":\"Haha! yeah, right.\",\"revisionID\":8387,\"summary\":\"This file was modified with 'mod2' as its contents.\"},\"revisionIDFieldInfo\":{\"value\":8387,\"validDomain\":\"https:\\/\\/phab.mercurial-scm.org\"},\"transactions\":[{\"type\":\"title\",\"value\":\"two: second commit to review\"},{\"type\":\"testPlan\",\"value\":\"Haha! yeah, right.\"},{\"type\":\"summary\",\"value\":\"This file was modified with 'mod2' as its contents.\"}]},\"error_code\":null,\"error_info\":null}"
540 },
541 "status": {
542 "code": 200,
543 "message": "OK"
544 }
545 }
546 },
547 {
548 "request": {
549 "headers": {
550 "content-length": [
551 "260"
552 ],
553 "accept": [
554 "application/mercurial-0.1"
555 ],
556 "content-type": [
557 "application/x-www-form-urlencoded"
558 ],
559 "host": [
560 "phab.mercurial-scm.org"
561 ],
562 "user-agent": [
563 "mercurial/proto-1.0 (Mercurial 5.3.2+463-d35fbae9dd33+20200408)"
564 ]
565 },
566 "body": "__conduit__=1&params=%7B%22__conduit__%22%3A+%7B%22token%22%3A+%22cli-hahayouwish%22%7D%2C+%22corpus%22%3A+%223%3A+a+commit+with+no+detailed+message%5Cn%5CnDifferential+Revision%3A+https%3A%2F%2Fphab.mercurial-scm.org%2FD8387%22%7D&output=json",
567 "uri": "https://phab.mercurial-scm.org//api/differential.parsecommitmessage",
568 "method": "POST"
569 },
570 "response": {
571 "headers": {
572 "x-xss-protection": [
573 "1; mode=block"
574 ],
575 "strict-transport-security": [
576 "max-age=0; includeSubdomains; preload"
577 ],
578 "transfer-encoding": [
579 "chunked"
580 ],
581 "x-frame-options": [
582 "Deny"
583 ],
584 "expires": [
585 "Sat, 01 Jan 2000 00:00:00 GMT"
586 ],
587 "content-type": [
588 "application/json"
589 ],
590 "referrer-policy": [
591 "no-referrer"
592 ],
593 "server": [
594 "Apache/2.4.10 (Debian)"
595 ],
596 "cache-control": [
597 "no-store"
598 ],
599 "x-content-type-options": [
600 "nosniff"
601 ],
602 "date": [
603 "Wed, 08 Apr 2020 21:13:24 GMT"
604 ]
605 },
606 "body": {
607 "string": "{\"result\":{\"errors\":[],\"fields\":{\"title\":\"3: a commit with no detailed message\",\"revisionID\":8387},\"revisionIDFieldInfo\":{\"value\":8387,\"validDomain\":\"https:\\/\\/phab.mercurial-scm.org\"},\"transactions\":[{\"type\":\"title\",\"value\":\"3: a commit with no detailed message\"}]},\"error_code\":null,\"error_info\":null}"
608 },
609 "status": {
610 "code": 200,
611 "message": "OK"
612 }
613 }
614 },
615 {
616 "request": {
617 "headers": {
618 "content-length": [
619 "251"
620 ],
621 "accept": [
622 "application/mercurial-0.1"
623 ],
624 "content-type": [
625 "application/x-www-form-urlencoded"
626 ],
627 "host": [
628 "phab.mercurial-scm.org"
629 ],
630 "user-agent": [
631 "mercurial/proto-1.0 (Mercurial 5.3.2+463-d35fbae9dd33+20200408)"
632 ]
633 },
634 "body": "__conduit__=1&params=%7B%22__conduit__%22%3A+%7B%22token%22%3A+%22cli-hahayouwish%22%7D%2C+%22corpus%22%3A+%22four%3A+extend+the+fold+range%5Cn%5CnDifferential+Revision%3A+https%3A%2F%2Fphab.mercurial-scm.org%2FD8387%22%7D&output=json",
635 "uri": "https://phab.mercurial-scm.org//api/differential.parsecommitmessage",
636 "method": "POST"
637 },
638 "response": {
639 "headers": {
640 "x-xss-protection": [
641 "1; mode=block"
642 ],
643 "strict-transport-security": [
644 "max-age=0; includeSubdomains; preload"
645 ],
646 "transfer-encoding": [
647 "chunked"
648 ],
649 "x-frame-options": [
650 "Deny"
651 ],
652 "expires": [
653 "Sat, 01 Jan 2000 00:00:00 GMT"
654 ],
655 "content-type": [
656 "application/json"
657 ],
658 "referrer-policy": [
659 "no-referrer"
660 ],
661 "server": [
662 "Apache/2.4.10 (Debian)"
663 ],
664 "cache-control": [
665 "no-store"
666 ],
667 "x-content-type-options": [
668 "nosniff"
669 ],
670 "date": [
671 "Wed, 08 Apr 2020 21:13:24 GMT"
672 ]
673 },
674 "body": {
675 "string": "{\"result\":{\"errors\":[],\"fields\":{\"title\":\"four: extend the fold range\",\"revisionID\":8387},\"revisionIDFieldInfo\":{\"value\":8387,\"validDomain\":\"https:\\/\\/phab.mercurial-scm.org\"},\"transactions\":[{\"type\":\"title\",\"value\":\"four: extend the fold range\"}]},\"error_code\":null,\"error_info\":null}"
676 },
677 "status": {
678 "code": 200,
679 "message": "OK"
680 }
681 }
682 },
683 {
684 "request": {
685 "headers": {
686 "content-length": [
687 "765"
688 ],
689 "accept": [
690 "application/mercurial-0.1"
691 ],
692 "content-type": [
693 "application/x-www-form-urlencoded"
694 ],
695 "host": [
696 "phab.mercurial-scm.org"
697 ],
698 "user-agent": [
699 "mercurial/proto-1.0 (Mercurial 5.3.2+463-d35fbae9dd33+20200408)"
700 ]
701 },
702 "body": "__conduit__=1&params=%7B%22__conduit__%22%3A+%7B%22token%22%3A+%22cli-hahayouwish%22%7D%2C+%22transactions%22%3A+%5B%7B%22type%22%3A+%22update%22%2C+%22value%22%3A+%22PHID-DIFF-rgriot6pr2ef72gyyljl%22%7D%2C+%7B%22type%22%3A+%22title%22%2C+%22value%22%3A+%22added+file%22%7D%2C+%7B%22type%22%3A+%22testPlan%22%2C+%22value%22%3A+%22LOL%21++What+testing%3F%21%5Cn%5CnHaha%21+yeah%2C+right.%22%7D%2C+%7B%22type%22%3A+%22summary%22%2C+%22value%22%3A+%22one%3A+first+commit+to+review%5Cn%5CnThis+file+was+modified+with+%27mod1%27+as+its+contents.%5Cn%5Cntwo%3A+second+commit+to+review%5Cn%5CnThis+file+was+modified+with+%27mod2%27+as+its+contents.%5Cn%5Cn3%3A+a+commit+with+no+detailed+message%5Cn%5Cnfour%3A+extend+the+fold+range%22%7D%5D%7D&output=json",
703 "uri": "https://phab.mercurial-scm.org//api/differential.revision.edit",
704 "method": "POST"
705 },
706 "response": {
707 "headers": {
708 "x-xss-protection": [
709 "1; mode=block"
710 ],
711 "strict-transport-security": [
712 "max-age=0; includeSubdomains; preload"
713 ],
714 "transfer-encoding": [
715 "chunked"
716 ],
717 "x-frame-options": [
718 "Deny"
719 ],
720 "expires": [
721 "Sat, 01 Jan 2000 00:00:00 GMT"
722 ],
723 "content-type": [
724 "application/json"
725 ],
726 "referrer-policy": [
727 "no-referrer"
728 ],
729 "server": [
730 "Apache/2.4.10 (Debian)"
731 ],
732 "cache-control": [
733 "no-store"
734 ],
735 "x-content-type-options": [
736 "nosniff"
737 ],
738 "date": [
739 "Wed, 08 Apr 2020 21:13:25 GMT"
740 ]
741 },
742 "body": {
743 "string": "{\"result\":{\"object\":{\"id\":8388,\"phid\":\"PHID-DREV-v5iywrnzj4h4uwo57pob\"},\"transactions\":[{\"phid\":\"PHID-XACT-DREV-dlqxlqkjwgga5ql\"},{\"phid\":\"PHID-XACT-DREV-wtmb3lqskq6o45p\"},{\"phid\":\"PHID-XACT-DREV-otuctsq34y7folr\"},{\"phid\":\"PHID-XACT-DREV-f5i6qgxl42cnu7c\"},{\"phid\":\"PHID-XACT-DREV-r773sn4ttwgm3hz\"},{\"phid\":\"PHID-XACT-DREV-rhu5nw6iwa4d2cz\"},{\"phid\":\"PHID-XACT-DREV-acc2lobcwf5ycb4\"}]},\"error_code\":null,\"error_info\":null}"
744 },
745 "status": {
746 "code": 200,
747 "message": "OK"
748 }
749 }
750 },
751 {
752 "request": {
753 "headers": {
754 "content-length": [
755 "146"
756 ],
757 "accept": [
758 "application/mercurial-0.1"
759 ],
760 "content-type": [
761 "application/x-www-form-urlencoded"
762 ],
763 "host": [
764 "phab.mercurial-scm.org"
765 ],
766 "user-agent": [
767 "mercurial/proto-1.0 (Mercurial 5.3.2+463-d35fbae9dd33+20200408)"
768 ]
769 },
770 "body": "__conduit__=1&params=%7B%22__conduit__%22%3A+%7B%22token%22%3A+%22cli-hahayouwish%22%7D%2C+%22ids%22%3A+%5B8388%5D%7D&output=json",
771 "uri": "https://phab.mercurial-scm.org//api/differential.query",
772 "method": "POST"
773 },
774 "response": {
775 "headers": {
776 "x-xss-protection": [
777 "1; mode=block"
778 ],
779 "strict-transport-security": [
780 "max-age=0; includeSubdomains; preload"
781 ],
782 "transfer-encoding": [
783 "chunked"
784 ],
785 "x-frame-options": [
786 "Deny"
787 ],
788 "expires": [
789 "Sat, 01 Jan 2000 00:00:00 GMT"
790 ],
791 "content-type": [
792 "application/json"
793 ],
794 "referrer-policy": [
795 "no-referrer"
796 ],
797 "server": [
798 "Apache/2.4.10 (Debian)"
799 ],
800 "cache-control": [
801 "no-store"
802 ],
803 "x-content-type-options": [
804 "nosniff"
805 ],
806 "date": [
807 "Wed, 08 Apr 2020 21:13:25 GMT"
808 ]
809 },
810 "body": {
811 "string": "{\"result\":[{\"id\":\"8388\",\"phid\":\"PHID-DREV-v5iywrnzj4h4uwo57pob\",\"title\":\"added file\",\"uri\":\"https:\\/\\/phab.mercurial-scm.org\\/D8388\",\"dateCreated\":\"1586380405\",\"dateModified\":\"1586380405\",\"authorPHID\":\"PHID-USER-tzhaient733lwrlbcag5\",\"status\":\"0\",\"statusName\":\"Needs Review\",\"properties\":{\"draft.broadcast\":true,\"lines.added\":2,\"lines.removed\":0},\"branch\":\"default\",\"summary\":\"one: first commit to review\\n\\nThis file was modified with 'mod1' as its contents.\\n\\ntwo: second commit to review\\n\\nThis file was modified with 'mod2' as its contents.\\n\\n3: a commit with no detailed message\\n\\nfour: extend the fold range\",\"testPlan\":\"LOL! What testing?!\\n\\nHaha! yeah, right.\",\"lineCount\":\"2\",\"activeDiffPHID\":\"PHID-DIFF-rgriot6pr2ef72gyyljl\",\"diffs\":[\"21010\"],\"commits\":[],\"reviewers\":{\"PHID-PROJ-3dvcxzznrjru2xmmses3\":\"PHID-PROJ-3dvcxzznrjru2xmmses3\"},\"ccs\":[\"PHID-USER-q42dn7cc3donqriafhjx\"],\"hashes\":[[\"hgcm\",\"\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\"],[\"hgcm\",\"\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\"],[\"hgcm\",\"\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\"],[\"hgcm\",\"\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\"],[\"hgcm\",\"\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\"]],\"auxiliary\":{\"phabricator:projects\":[],\"phabricator:depends-on\":[]},\"repositoryPHID\":\"PHID-REPO-bvunnehri4u2isyr7bc3\",\"sourcePath\":\"\\/\"}],\"error_code\":null,\"error_info\":null}"
812 },
813 "status": {
814 "code": 200,
815 "message": "OK"
816 }
817 }
818 },
819 {
820 "request": {
821 "headers": {
822 "content-length": [
823 "482"
824 ],
825 "accept": [
826 "application/mercurial-0.1"
827 ],
828 "content-type": [
829 "application/x-www-form-urlencoded"
830 ],
831 "host": [
832 "phab.mercurial-scm.org"
833 ],
834 "user-agent": [
835 "mercurial/proto-1.0 (Mercurial 5.3.2+463-d35fbae9dd33+20200408)"
836 ]
837 },
838 "body": "__conduit__=1&params=%7B%22__conduit__%22%3A+%7B%22token%22%3A+%22cli-hahayouwish%22%7D%2C+%22data%22%3A+%22%7B%5C%22branch%5C%22%3A+%5C%22default%5C%22%2C+%5C%22date%5C%22%3A+%5C%220+0%5C%22%2C+%5C%22node%5C%22%3A+%5C%22ac7db67f0991021fb38d3cbf31f5d605e694d3a9%5C%22%2C+%5C%22parent%5C%22%3A+%5C%220000000000000000000000000000000000000000%5C%22%2C+%5C%22user%5C%22%3A+%5C%22test%5C%22%7D%22%2C+%22diff_id%22%3A+21010%2C+%22name%22%3A+%22hg%3Ameta%22%7D&output=json",
839 "uri": "https://phab.mercurial-scm.org//api/differential.setdiffproperty",
840 "method": "POST"
841 },
842 "response": {
843 "headers": {
844 "x-xss-protection": [
845 "1; mode=block"
846 ],
847 "strict-transport-security": [
848 "max-age=0; includeSubdomains; preload"
849 ],
850 "transfer-encoding": [
851 "chunked"
852 ],
853 "x-frame-options": [
854 "Deny"
855 ],
856 "expires": [
857 "Sat, 01 Jan 2000 00:00:00 GMT"
858 ],
859 "content-type": [
860 "application/json"
861 ],
862 "referrer-policy": [
863 "no-referrer"
864 ],
865 "server": [
866 "Apache/2.4.10 (Debian)"
867 ],
868 "cache-control": [
869 "no-store"
870 ],
871 "x-content-type-options": [
872 "nosniff"
873 ],
874 "date": [
875 "Wed, 08 Apr 2020 21:13:26 GMT"
876 ],
877 "connection": [
878 "close"
879 ]
880 },
881 "body": {
882 "string": "{\"result\":null,\"error_code\":null,\"error_info\":null}"
883 },
884 "status": {
885 "code": 200,
886 "message": "OK"
887 }
888 }
889 },
890 {
891 "request": {
892 "headers": {
893 "content-length": [
894 "2130"
895 ],
896 "accept": [
897 "application/mercurial-0.1"
898 ],
899 "content-type": [
900 "application/x-www-form-urlencoded"
901 ],
902 "host": [
903 "phab.mercurial-scm.org"
904 ],
905 "user-agent": [
906 "mercurial/proto-1.0 (Mercurial 5.3.2+463-d35fbae9dd33+20200408)"
907 ]
908 },
909 "body": "__conduit__=1&params=%7B%22__conduit__%22%3A+%7B%22token%22%3A+%22cli-hahayouwish%22%7D%2C+%22data%22%3A+%22%7B%5C%2215e9b14b4b4c37ccd18298d058a184068718765e%5C%22%3A+%7B%5C%22author%5C%22%3A+%5C%22test%5C%22%2C+%5C%22authorEmail%5C%22%3A+%5C%22test%5C%22%2C+%5C%22branch%5C%22%3A+%5C%22default%5C%22%2C+%5C%22commit%5C%22%3A+%5C%2215e9b14b4b4c37ccd18298d058a184068718765e%5C%22%2C+%5C%22parents%5C%22%3A+%5B%5C%220000000000000000000000000000000000000000%5C%22%5D%2C+%5C%22time%5C%22%3A+0%7D%2C+%5C%2230682b960804bd91823ea5ccb5d6a7d999f8d1ea%5C%22%3A+%7B%5C%22author%5C%22%3A+%5C%22test%5C%22%2C+%5C%22authorEmail%5C%22%3A+%5C%22test%5C%22%2C+%5C%22branch%5C%22%3A+%5C%22default%5C%22%2C+%5C%22commit%5C%22%3A+%5C%2230682b960804bd91823ea5ccb5d6a7d999f8d1ea%5C%22%2C+%5C%22parents%5C%22%3A+%5B%5C%223ee132d41dbc24bf5a4df3e97573d6e922446565%5C%22%5D%2C+%5C%22time%5C%22%3A+0%7D%2C+%5C%223ee132d41dbc24bf5a4df3e97573d6e922446565%5C%22%3A+%7B%5C%22author%5C%22%3A+%5C%22test%5C%22%2C+%5C%22authorEmail%5C%22%3A+%5C%22test%5C%22%2C+%5C%22branch%5C%22%3A+%5C%22default%5C%22%2C+%5C%22commit%5C%22%3A+%5C%223ee132d41dbc24bf5a4df3e97573d6e922446565%5C%22%2C+%5C%22parents%5C%22%3A+%5B%5C%226320b7d714cf2b2b71370eafeae29e2988d07872%5C%22%5D%2C+%5C%22time%5C%22%3A+0%7D%2C+%5C%226320b7d714cf2b2b71370eafeae29e2988d07872%5C%22%3A+%7B%5C%22author%5C%22%3A+%5C%22test%5C%22%2C+%5C%22authorEmail%5C%22%3A+%5C%22test%5C%22%2C+%5C%22branch%5C%22%3A+%5C%22default%5C%22%2C+%5C%22commit%5C%22%3A+%5C%226320b7d714cf2b2b71370eafeae29e2988d07872%5C%22%2C+%5C%22parents%5C%22%3A+%5B%5C%2215e9b14b4b4c37ccd18298d058a184068718765e%5C%22%5D%2C+%5C%22time%5C%22%3A+0%7D%2C+%5C%22ac7db67f0991021fb38d3cbf31f5d605e694d3a9%5C%22%3A+%7B%5C%22author%5C%22%3A+%5C%22test%5C%22%2C+%5C%22authorEmail%5C%22%3A+%5C%22test%5C%22%2C+%5C%22branch%5C%22%3A+%5C%22default%5C%22%2C+%5C%22commit%5C%22%3A+%5C%22ac7db67f0991021fb38d3cbf31f5d605e694d3a9%5C%22%2C+%5C%22parents%5C%22%3A+%5B%5C%2230682b960804bd91823ea5ccb5d6a7d999f8d1ea%5C%22%5D%2C+%5C%22time%5C%22%3A+0%7D%7D%22%2C+%22diff_id%22%3A+21010%2C+%22name%22%3A+%22local%3Acommits%22%7D&output=json",
910 "uri": "https://phab.mercurial-scm.org//api/differential.setdiffproperty",
911 "method": "POST"
912 },
913 "response": {
914 "headers": {
915 "x-xss-protection": [
916 "1; mode=block"
917 ],
918 "strict-transport-security": [
919 "max-age=0; includeSubdomains; preload"
920 ],
921 "transfer-encoding": [
922 "chunked"
923 ],
924 "x-frame-options": [
925 "Deny"
926 ],
927 "expires": [
928 "Sat, 01 Jan 2000 00:00:00 GMT"
929 ],
930 "content-type": [
931 "application/json"
932 ],
933 "referrer-policy": [
934 "no-referrer"
935 ],
936 "server": [
937 "Apache/2.4.10 (Debian)"
938 ],
939 "cache-control": [
940 "no-store"
941 ],
942 "x-content-type-options": [
943 "nosniff"
944 ],
945 "date": [
946 "Wed, 08 Apr 2020 21:13:26 GMT"
947 ]
948 },
949 "body": {
950 "string": "{\"result\":null,\"error_code\":null,\"error_info\":null}"
951 },
952 "status": {
953 "code": 200,
954 "message": "OK"
955 }
956 }
957 }
958 ],
959 "version": 1
960 } No newline at end of file
This diff has been collapsed as it changes many lines, (957 lines changed) Show them Hide them
@@ -0,0 +1,957 b''
1 {
2 "interactions": [
3 {
4 "request": {
5 "headers": {
6 "content-length": [
7 "186"
8 ],
9 "accept": [
10 "application/mercurial-0.1"
11 ],
12 "content-type": [
13 "application/x-www-form-urlencoded"
14 ],
15 "host": [
16 "phab.mercurial-scm.org"
17 ],
18 "user-agent": [
19 "mercurial/proto-1.0 (Mercurial 5.3.2+463-d35fbae9dd33+20200408)"
20 ]
21 },
22 "body": "__conduit__=1&params=%7B%22__conduit__%22%3A+%7B%22token%22%3A+%22cli-hahayouwish%22%7D%2C+%22revisionIDs%22%3A+%5B8388%2C+8388%2C+8388%2C+8388%2C+8388%5D%7D&output=json",
23 "uri": "https://phab.mercurial-scm.org//api/differential.querydiffs",
24 "method": "POST"
25 },
26 "response": {
27 "headers": {
28 "x-xss-protection": [
29 "1; mode=block"
30 ],
31 "strict-transport-security": [
32 "max-age=0; includeSubdomains; preload"
33 ],
34 "transfer-encoding": [
35 "chunked"
36 ],
37 "x-frame-options": [
38 "Deny"
39 ],
40 "expires": [
41 "Sat, 01 Jan 2000 00:00:00 GMT"
42 ],
43 "content-type": [
44 "application/json"
45 ],
46 "referrer-policy": [
47 "no-referrer"
48 ],
49 "server": [
50 "Apache/2.4.10 (Debian)"
51 ],
52 "cache-control": [
53 "no-store"
54 ],
55 "x-content-type-options": [
56 "nosniff"
57 ],
58 "date": [
59 "Wed, 08 Apr 2020 21:13:36 GMT"
60 ]
61 },
62 "body": {
63 "string": "{\"result\":{\"21011\":{\"id\":\"21011\",\"revisionID\":\"8388\",\"dateCreated\":\"1586380410\",\"dateModified\":\"1586380414\",\"sourceControlBaseRevision\":\"0000000000000000000000000000000000000000\",\"sourceControlPath\":\"\\/\",\"sourceControlSystem\":\"hg\",\"branch\":\"default\",\"bookmark\":null,\"creationMethod\":\"phabsend\",\"description\":null,\"unitStatus\":\"0\",\"lintStatus\":\"0\",\"changes\":[{\"id\":\"56834\",\"metadata\":{\"line:first\":1,\"hash.effect\":\"NiiVAF6I6ZTP\"},\"oldPath\":null,\"currentPath\":\"file3.txt\",\"awayPaths\":[],\"oldProperties\":[],\"newProperties\":{\"unix:filemode\":\"100644\"},\"type\":\"1\",\"fileType\":\"1\",\"commitHash\":null,\"addLines\":\"1\",\"delLines\":\"0\",\"hunks\":[{\"oldOffset\":\"0\",\"newOffset\":\"1\",\"oldLength\":\"0\",\"newLength\":\"1\",\"addLines\":null,\"delLines\":null,\"isMissingOldNewline\":null,\"isMissingNewNewline\":null,\"corpus\":\"+foo\\n\"}]},{\"id\":\"56833\",\"metadata\":{\"line:first\":1,\"hash.effect\":\"fNX0XXem8Zx_\"},\"oldPath\":null,\"currentPath\":\"file2.txt\",\"awayPaths\":[],\"oldProperties\":[],\"newProperties\":{\"unix:filemode\":\"100644\"},\"type\":\"1\",\"fileType\":\"1\",\"commitHash\":null,\"addLines\":\"1\",\"delLines\":\"0\",\"hunks\":[{\"oldOffset\":\"0\",\"newOffset\":\"1\",\"oldLength\":\"0\",\"newLength\":\"1\",\"addLines\":null,\"delLines\":null,\"isMissingOldNewline\":null,\"isMissingNewNewline\":null,\"corpus\":\"+amended mod\\n\"}]},{\"id\":\"56832\",\"metadata\":{\"line:first\":1,\"hash.effect\":\"cAKuVP31KNrx\"},\"oldPath\":null,\"currentPath\":\"file.txt\",\"awayPaths\":[],\"oldProperties\":[],\"newProperties\":{\"unix:filemode\":\"100644\"},\"type\":\"1\",\"fileType\":\"1\",\"commitHash\":null,\"addLines\":\"1\",\"delLines\":\"0\",\"hunks\":[{\"oldOffset\":\"0\",\"newOffset\":\"1\",\"oldLength\":\"0\",\"newLength\":\"1\",\"addLines\":null,\"delLines\":null,\"isMissingOldNewline\":null,\"isMissingNewNewline\":null,\"corpus\":\"+mod3\\n\"}]}],\"properties\":{\"hg:meta\":{\"branch\":\"default\",\"date\":\"0 0\",\"node\":\"b50946d5e4901d7f7801d572342ef90d06a85a85\",\"parent\":\"0000000000000000000000000000000000000000\",\"user\":\"test\"},\"local:commits\":{\"15e9b14b4b4c37ccd18298d058a184068718765e\":{\"author\":\"test\",\"authorEmail\":\"test\",\"branch\":\"default\",\"commit\":\"15e9b14b4b4c37ccd18298d058a184068718765e\",\"parents\":[\"0000000000000000000000000000000000000000\"],\"time\":0},\"30682b960804bd91823ea5ccb5d6a7d999f8d1ea\":{\"author\":\"test\",\"authorEmail\":\"test\",\"branch\":\"default\",\"commit\":\"30682b960804bd91823ea5ccb5d6a7d999f8d1ea\",\"parents\":[\"3ee132d41dbc24bf5a4df3e97573d6e922446565\"],\"time\":0},\"3ee132d41dbc24bf5a4df3e97573d6e922446565\":{\"author\":\"test\",\"authorEmail\":\"test\",\"branch\":\"default\",\"commit\":\"3ee132d41dbc24bf5a4df3e97573d6e922446565\",\"parents\":[\"6320b7d714cf2b2b71370eafeae29e2988d07872\"],\"time\":0},\"6320b7d714cf2b2b71370eafeae29e2988d07872\":{\"author\":\"test\",\"authorEmail\":\"test\",\"branch\":\"default\",\"commit\":\"6320b7d714cf2b2b71370eafeae29e2988d07872\",\"parents\":[\"15e9b14b4b4c37ccd18298d058a184068718765e\"],\"time\":0},\"6bc15dc99efd596be5908c187f68d6810671121e\":{\"author\":\"test\",\"authorEmail\":\"test\",\"branch\":\"default\",\"commit\":\"6bc15dc99efd596be5908c187f68d6810671121e\",\"parents\":[\"30682b960804bd91823ea5ccb5d6a7d999f8d1ea\"],\"time\":0},\"b50946d5e4901d7f7801d572342ef90d06a85a85\":{\"author\":\"test\",\"authorEmail\":\"test\",\"branch\":\"default\",\"commit\":\"b50946d5e4901d7f7801d572342ef90d06a85a85\",\"parents\":[\"6bc15dc99efd596be5908c187f68d6810671121e\"],\"time\":0}}},\"authorName\":\"test\",\"authorEmail\":\"test\"},\"21010\":{\"id\":\"21010\",\"revisionID\":\"8388\",\"dateCreated\":\"1586380401\",\"dateModified\":\"1586380405\",\"sourceControlBaseRevision\":\"0000000000000000000000000000000000000000\",\"sourceControlPath\":\"\\/\",\"sourceControlSystem\":\"hg\",\"branch\":\"default\",\"bookmark\":null,\"creationMethod\":\"phabsend\",\"description\":null,\"unitStatus\":\"0\",\"lintStatus\":\"0\",\"changes\":[{\"id\":\"56831\",\"metadata\":{\"line:first\":1,\"hash.effect\":\"r1N4i770De9n\"},\"oldPath\":null,\"currentPath\":\"file2.txt\",\"awayPaths\":[],\"oldProperties\":[],\"newProperties\":{\"unix:filemode\":\"100644\"},\"type\":\"1\",\"fileType\":\"1\",\"commitHash\":null,\"addLines\":\"1\",\"delLines\":\"0\",\"hunks\":[{\"oldOffset\":\"0\",\"newOffset\":\"1\",\"oldLength\":\"0\",\"newLength\":\"1\",\"addLines\":null,\"delLines\":null,\"isMissingOldNewline\":null,\"isMissingNewNewline\":null,\"corpus\":\"+another mod\\n\"}]},{\"id\":\"56830\",\"metadata\":{\"line:first\":1,\"hash.effect\":\"cAKuVP31KNrx\"},\"oldPath\":null,\"currentPath\":\"file.txt\",\"awayPaths\":[],\"oldProperties\":[],\"newProperties\":{\"unix:filemode\":\"100644\"},\"type\":\"1\",\"fileType\":\"1\",\"commitHash\":null,\"addLines\":\"1\",\"delLines\":\"0\",\"hunks\":[{\"oldOffset\":\"0\",\"newOffset\":\"1\",\"oldLength\":\"0\",\"newLength\":\"1\",\"addLines\":null,\"delLines\":null,\"isMissingOldNewline\":null,\"isMissingNewNewline\":null,\"corpus\":\"+mod3\\n\"}]}],\"properties\":{\"hg:meta\":{\"branch\":\"default\",\"date\":\"0 0\",\"node\":\"ac7db67f0991021fb38d3cbf31f5d605e694d3a9\",\"parent\":\"0000000000000000000000000000000000000000\",\"user\":\"test\"},\"local:commits\":{\"15e9b14b4b4c37ccd18298d058a184068718765e\":{\"author\":\"test\",\"authorEmail\":\"test\",\"branch\":\"default\",\"commit\":\"15e9b14b4b4c37ccd18298d058a184068718765e\",\"parents\":[\"0000000000000000000000000000000000000000\"],\"time\":0},\"30682b960804bd91823ea5ccb5d6a7d999f8d1ea\":{\"author\":\"test\",\"authorEmail\":\"test\",\"branch\":\"default\",\"commit\":\"30682b960804bd91823ea5ccb5d6a7d999f8d1ea\",\"parents\":[\"3ee132d41dbc24bf5a4df3e97573d6e922446565\"],\"time\":0},\"3ee132d41dbc24bf5a4df3e97573d6e922446565\":{\"author\":\"test\",\"authorEmail\":\"test\",\"branch\":\"default\",\"commit\":\"3ee132d41dbc24bf5a4df3e97573d6e922446565\",\"parents\":[\"6320b7d714cf2b2b71370eafeae29e2988d07872\"],\"time\":0},\"6320b7d714cf2b2b71370eafeae29e2988d07872\":{\"author\":\"test\",\"authorEmail\":\"test\",\"branch\":\"default\",\"commit\":\"6320b7d714cf2b2b71370eafeae29e2988d07872\",\"parents\":[\"15e9b14b4b4c37ccd18298d058a184068718765e\"],\"time\":0},\"ac7db67f0991021fb38d3cbf31f5d605e694d3a9\":{\"author\":\"test\",\"authorEmail\":\"test\",\"branch\":\"default\",\"commit\":\"ac7db67f0991021fb38d3cbf31f5d605e694d3a9\",\"parents\":[\"30682b960804bd91823ea5ccb5d6a7d999f8d1ea\"],\"time\":0}}},\"authorName\":\"test\",\"authorEmail\":\"test\"}},\"error_code\":null,\"error_info\":null}"
64 },
65 "status": {
66 "code": 200,
67 "message": "OK"
68 }
69 }
70 },
71 {
72 "request": {
73 "headers": {
74 "content-length": [
75 "183"
76 ],
77 "accept": [
78 "application/mercurial-0.1"
79 ],
80 "content-type": [
81 "application/x-www-form-urlencoded"
82 ],
83 "host": [
84 "phab.mercurial-scm.org"
85 ],
86 "user-agent": [
87 "mercurial/proto-1.0 (Mercurial 5.3.2+463-d35fbae9dd33+20200408)"
88 ]
89 },
90 "body": "__conduit__=1&params=%7B%22__conduit__%22%3A+%7B%22token%22%3A+%22cli-hahayouwish%22%7D%2C+%22constraints%22%3A+%7B%22callsigns%22%3A+%5B%22HG%22%5D%7D%7D&output=json",
91 "uri": "https://phab.mercurial-scm.org//api/diffusion.repository.search",
92 "method": "POST"
93 },
94 "response": {
95 "headers": {
96 "x-xss-protection": [
97 "1; mode=block"
98 ],
99 "strict-transport-security": [
100 "max-age=0; includeSubdomains; preload"
101 ],
102 "transfer-encoding": [
103 "chunked"
104 ],
105 "x-frame-options": [
106 "Deny"
107 ],
108 "expires": [
109 "Sat, 01 Jan 2000 00:00:00 GMT"
110 ],
111 "content-type": [
112 "application/json"
113 ],
114 "referrer-policy": [
115 "no-referrer"
116 ],
117 "server": [
118 "Apache/2.4.10 (Debian)"
119 ],
120 "cache-control": [
121 "no-store"
122 ],
123 "x-content-type-options": [
124 "nosniff"
125 ],
126 "date": [
127 "Wed, 08 Apr 2020 21:13:37 GMT"
128 ]
129 },
130 "body": {
131 "string": "{\"result\":{\"data\":[{\"id\":2,\"type\":\"REPO\",\"phid\":\"PHID-REPO-bvunnehri4u2isyr7bc3\",\"fields\":{\"name\":\"Mercurial\",\"vcs\":\"hg\",\"callsign\":\"HG\",\"shortName\":null,\"status\":\"active\",\"isImporting\":false,\"almanacServicePHID\":null,\"refRules\":{\"fetchRules\":[],\"trackRules\":[],\"permanentRefRules\":[]},\"spacePHID\":null,\"dateCreated\":1498761653,\"dateModified\":1500403184,\"policy\":{\"view\":\"public\",\"edit\":\"admin\",\"diffusion.push\":\"users\"}},\"attachments\":{}}],\"maps\":{},\"query\":{\"queryKey\":null},\"cursor\":{\"limit\":100,\"after\":null,\"before\":null,\"order\":null}},\"error_code\":null,\"error_info\":null}"
132 },
133 "status": {
134 "code": 200,
135 "message": "OK"
136 }
137 }
138 },
139 {
140 "request": {
141 "headers": {
142 "content-length": [
143 "2327"
144 ],
145 "accept": [
146 "application/mercurial-0.1"
147 ],
148 "content-type": [
149 "application/x-www-form-urlencoded"
150 ],
151 "host": [
152 "phab.mercurial-scm.org"
153 ],
154 "user-agent": [
155 "mercurial/proto-1.0 (Mercurial 5.3.2+463-d35fbae9dd33+20200408)"
156 ]
157 },
158 "body": "__conduit__=1&params=%7B%22__conduit__%22%3A+%7B%22token%22%3A+%22cli-hahayouwish%22%7D%2C+%22bookmark%22%3A+null%2C+%22branch%22%3A+%22default%22%2C+%22changes%22%3A+%7B%22file.txt%22%3A+%7B%22addLines%22%3A+1%2C+%22awayPaths%22%3A+%5B%5D%2C+%22commitHash%22%3A+null%2C+%22currentPath%22%3A+%22file.txt%22%2C+%22delLines%22%3A+0%2C+%22fileType%22%3A+1%2C+%22hunks%22%3A+%5B%7B%22addLines%22%3A+1%2C+%22corpus%22%3A+%22%2Bmod3%5Cn%22%2C+%22delLines%22%3A+0%2C+%22newLength%22%3A+1%2C+%22newOffset%22%3A+1%2C+%22oldLength%22%3A+0%2C+%22oldOffset%22%3A+0%7D%5D%2C+%22metadata%22%3A+%7B%7D%2C+%22newProperties%22%3A+%7B%22unix%3Afilemode%22%3A+%22100644%22%7D%2C+%22oldPath%22%3A+null%2C+%22oldProperties%22%3A+%7B%7D%2C+%22type%22%3A+1%7D%2C+%22file2.txt%22%3A+%7B%22addLines%22%3A+1%2C+%22awayPaths%22%3A+%5B%5D%2C+%22commitHash%22%3A+null%2C+%22currentPath%22%3A+%22file2.txt%22%2C+%22delLines%22%3A+0%2C+%22fileType%22%3A+1%2C+%22hunks%22%3A+%5B%7B%22addLines%22%3A+1%2C+%22corpus%22%3A+%22%2Bamended+mod%5Cn%22%2C+%22delLines%22%3A+0%2C+%22newLength%22%3A+1%2C+%22newOffset%22%3A+1%2C+%22oldLength%22%3A+0%2C+%22oldOffset%22%3A+0%7D%5D%2C+%22metadata%22%3A+%7B%7D%2C+%22newProperties%22%3A+%7B%22unix%3Afilemode%22%3A+%22100644%22%7D%2C+%22oldPath%22%3A+null%2C+%22oldProperties%22%3A+%7B%7D%2C+%22type%22%3A+1%7D%2C+%22file3.txt%22%3A+%7B%22addLines%22%3A+1%2C+%22awayPaths%22%3A+%5B%5D%2C+%22commitHash%22%3A+null%2C+%22currentPath%22%3A+%22file3.txt%22%2C+%22delLines%22%3A+0%2C+%22fileType%22%3A+1%2C+%22hunks%22%3A+%5B%7B%22addLines%22%3A+1%2C+%22corpus%22%3A+%22%2Bfoo%5Cn%22%2C+%22delLines%22%3A+0%2C+%22newLength%22%3A+1%2C+%22newOffset%22%3A+1%2C+%22oldLength%22%3A+0%2C+%22oldOffset%22%3A+0%7D%5D%2C+%22metadata%22%3A+%7B%7D%2C+%22newProperties%22%3A+%7B%22unix%3Afilemode%22%3A+%22100644%22%7D%2C+%22oldPath%22%3A+null%2C+%22oldProperties%22%3A+%7B%7D%2C+%22type%22%3A+1%7D%7D%2C+%22creationMethod%22%3A+%22phabsend%22%2C+%22lintStatus%22%3A+%22none%22%2C+%22repositoryPHID%22%3A+%22PHID-REPO-bvunnehri4u2isyr7bc3%22%2C+%22sourceControlBaseRevision%22%3A+%220000000000000000000000000000000000000000%22%2C+%22sourceControlPath%22%3A+%22%2F%22%2C+%22sourceControlSystem%22%3A+%22hg%22%2C+%22sourceMachine%22%3A+%22%22%2C+%22sourcePath%22%3A+%22%2F%22%2C+%22unitStatus%22%3A+%22none%22%7D&output=json",
159 "uri": "https://phab.mercurial-scm.org//api/differential.creatediff",
160 "method": "POST"
161 },
162 "response": {
163 "headers": {
164 "x-xss-protection": [
165 "1; mode=block"
166 ],
167 "strict-transport-security": [
168 "max-age=0; includeSubdomains; preload"
169 ],
170 "transfer-encoding": [
171 "chunked"
172 ],
173 "x-frame-options": [
174 "Deny"
175 ],
176 "expires": [
177 "Sat, 01 Jan 2000 00:00:00 GMT"
178 ],
179 "content-type": [
180 "application/json"
181 ],
182 "referrer-policy": [
183 "no-referrer"
184 ],
185 "server": [
186 "Apache/2.4.10 (Debian)"
187 ],
188 "cache-control": [
189 "no-store"
190 ],
191 "x-content-type-options": [
192 "nosniff"
193 ],
194 "date": [
195 "Wed, 08 Apr 2020 21:13:37 GMT"
196 ]
197 },
198 "body": {
199 "string": "{\"result\":{\"diffid\":21012,\"phid\":\"PHID-DIFF-xfr3co4kuic6jeu3xbz4\",\"uri\":\"https:\\/\\/phab.mercurial-scm.org\\/differential\\/diff\\/21012\\/\"},\"error_code\":null,\"error_info\":null}"
200 },
201 "status": {
202 "code": 200,
203 "message": "OK"
204 }
205 }
206 },
207 {
208 "request": {
209 "headers": {
210 "content-length": [
211 "482"
212 ],
213 "accept": [
214 "application/mercurial-0.1"
215 ],
216 "content-type": [
217 "application/x-www-form-urlencoded"
218 ],
219 "host": [
220 "phab.mercurial-scm.org"
221 ],
222 "user-agent": [
223 "mercurial/proto-1.0 (Mercurial 5.3.2+463-d35fbae9dd33+20200408)"
224 ]
225 },
226 "body": "__conduit__=1&params=%7B%22__conduit__%22%3A+%7B%22token%22%3A+%22cli-hahayouwish%22%7D%2C+%22data%22%3A+%22%7B%5C%22branch%5C%22%3A+%5C%22default%5C%22%2C+%5C%22date%5C%22%3A+%5C%220+0%5C%22%2C+%5C%22node%5C%22%3A+%5C%22e919cdf3d4fe9a926427b1961601eeaf4b4e2caf%5C%22%2C+%5C%22parent%5C%22%3A+%5C%220000000000000000000000000000000000000000%5C%22%2C+%5C%22user%5C%22%3A+%5C%22test%5C%22%7D%22%2C+%22diff_id%22%3A+21012%2C+%22name%22%3A+%22hg%3Ameta%22%7D&output=json",
227 "uri": "https://phab.mercurial-scm.org//api/differential.setdiffproperty",
228 "method": "POST"
229 },
230 "response": {
231 "headers": {
232 "x-xss-protection": [
233 "1; mode=block"
234 ],
235 "strict-transport-security": [
236 "max-age=0; includeSubdomains; preload"
237 ],
238 "transfer-encoding": [
239 "chunked"
240 ],
241 "x-frame-options": [
242 "Deny"
243 ],
244 "expires": [
245 "Sat, 01 Jan 2000 00:00:00 GMT"
246 ],
247 "content-type": [
248 "application/json"
249 ],
250 "referrer-policy": [
251 "no-referrer"
252 ],
253 "server": [
254 "Apache/2.4.10 (Debian)"
255 ],
256 "cache-control": [
257 "no-store"
258 ],
259 "x-content-type-options": [
260 "nosniff"
261 ],
262 "date": [
263 "Wed, 08 Apr 2020 21:13:38 GMT"
264 ]
265 },
266 "body": {
267 "string": "{\"result\":null,\"error_code\":null,\"error_info\":null}"
268 },
269 "status": {
270 "code": 200,
271 "message": "OK"
272 }
273 }
274 },
275 {
276 "request": {
277 "headers": {
278 "content-length": [
279 "2130"
280 ],
281 "accept": [
282 "application/mercurial-0.1"
283 ],
284 "content-type": [
285 "application/x-www-form-urlencoded"
286 ],
287 "host": [
288 "phab.mercurial-scm.org"
289 ],
290 "user-agent": [
291 "mercurial/proto-1.0 (Mercurial 5.3.2+463-d35fbae9dd33+20200408)"
292 ]
293 },
294 "body": "__conduit__=1&params=%7B%22__conduit__%22%3A+%7B%22token%22%3A+%22cli-hahayouwish%22%7D%2C+%22data%22%3A+%22%7B%5C%2215e9b14b4b4c37ccd18298d058a184068718765e%5C%22%3A+%7B%5C%22author%5C%22%3A+%5C%22test%5C%22%2C+%5C%22authorEmail%5C%22%3A+%5C%22test%5C%22%2C+%5C%22branch%5C%22%3A+%5C%22default%5C%22%2C+%5C%22commit%5C%22%3A+%5C%2215e9b14b4b4c37ccd18298d058a184068718765e%5C%22%2C+%5C%22parents%5C%22%3A+%5B%5C%220000000000000000000000000000000000000000%5C%22%5D%2C+%5C%22time%5C%22%3A+0%7D%2C+%5C%2230682b960804bd91823ea5ccb5d6a7d999f8d1ea%5C%22%3A+%7B%5C%22author%5C%22%3A+%5C%22test%5C%22%2C+%5C%22authorEmail%5C%22%3A+%5C%22test%5C%22%2C+%5C%22branch%5C%22%3A+%5C%22default%5C%22%2C+%5C%22commit%5C%22%3A+%5C%2230682b960804bd91823ea5ccb5d6a7d999f8d1ea%5C%22%2C+%5C%22parents%5C%22%3A+%5B%5C%223ee132d41dbc24bf5a4df3e97573d6e922446565%5C%22%5D%2C+%5C%22time%5C%22%3A+0%7D%2C+%5C%223ee132d41dbc24bf5a4df3e97573d6e922446565%5C%22%3A+%7B%5C%22author%5C%22%3A+%5C%22test%5C%22%2C+%5C%22authorEmail%5C%22%3A+%5C%22test%5C%22%2C+%5C%22branch%5C%22%3A+%5C%22default%5C%22%2C+%5C%22commit%5C%22%3A+%5C%223ee132d41dbc24bf5a4df3e97573d6e922446565%5C%22%2C+%5C%22parents%5C%22%3A+%5B%5C%226320b7d714cf2b2b71370eafeae29e2988d07872%5C%22%5D%2C+%5C%22time%5C%22%3A+0%7D%2C+%5C%226320b7d714cf2b2b71370eafeae29e2988d07872%5C%22%3A+%7B%5C%22author%5C%22%3A+%5C%22test%5C%22%2C+%5C%22authorEmail%5C%22%3A+%5C%22test%5C%22%2C+%5C%22branch%5C%22%3A+%5C%22default%5C%22%2C+%5C%22commit%5C%22%3A+%5C%226320b7d714cf2b2b71370eafeae29e2988d07872%5C%22%2C+%5C%22parents%5C%22%3A+%5B%5C%2215e9b14b4b4c37ccd18298d058a184068718765e%5C%22%5D%2C+%5C%22time%5C%22%3A+0%7D%2C+%5C%22e919cdf3d4fe9a926427b1961601eeaf4b4e2caf%5C%22%3A+%7B%5C%22author%5C%22%3A+%5C%22test%5C%22%2C+%5C%22authorEmail%5C%22%3A+%5C%22test%5C%22%2C+%5C%22branch%5C%22%3A+%5C%22default%5C%22%2C+%5C%22commit%5C%22%3A+%5C%22e919cdf3d4fe9a926427b1961601eeaf4b4e2caf%5C%22%2C+%5C%22parents%5C%22%3A+%5B%5C%2230682b960804bd91823ea5ccb5d6a7d999f8d1ea%5C%22%5D%2C+%5C%22time%5C%22%3A+0%7D%7D%22%2C+%22diff_id%22%3A+21012%2C+%22name%22%3A+%22local%3Acommits%22%7D&output=json",
295 "uri": "https://phab.mercurial-scm.org//api/differential.setdiffproperty",
296 "method": "POST"
297 },
298 "response": {
299 "headers": {
300 "x-xss-protection": [
301 "1; mode=block"
302 ],
303 "strict-transport-security": [
304 "max-age=0; includeSubdomains; preload"
305 ],
306 "transfer-encoding": [
307 "chunked"
308 ],
309 "x-frame-options": [
310 "Deny"
311 ],
312 "expires": [
313 "Sat, 01 Jan 2000 00:00:00 GMT"
314 ],
315 "content-type": [
316 "application/json"
317 ],
318 "referrer-policy": [
319 "no-referrer"
320 ],
321 "server": [
322 "Apache/2.4.10 (Debian)"
323 ],
324 "cache-control": [
325 "no-store"
326 ],
327 "x-content-type-options": [
328 "nosniff"
329 ],
330 "date": [
331 "Wed, 08 Apr 2020 21:13:38 GMT"
332 ]
333 },
334 "body": {
335 "string": "{\"result\":null,\"error_code\":null,\"error_info\":null}"
336 },
337 "status": {
338 "code": 200,
339 "message": "OK"
340 }
341 }
342 },
343 {
344 "request": {
345 "headers": {
346 "content-length": [
347 "232"
348 ],
349 "accept": [
350 "application/mercurial-0.1"
351 ],
352 "content-type": [
353 "application/x-www-form-urlencoded"
354 ],
355 "host": [
356 "phab.mercurial-scm.org"
357 ],
358 "user-agent": [
359 "mercurial/proto-1.0 (Mercurial 5.3.2+463-d35fbae9dd33+20200408)"
360 ]
361 },
362 "body": "__conduit__=1&params=%7B%22__conduit__%22%3A+%7B%22token%22%3A+%22cli-hahayouwish%22%7D%2C+%22corpus%22%3A+%22added+file%5Cn%5CnDifferential+Revision%3A+https%3A%2F%2Fphab.mercurial-scm.org%2FD8388%22%7D&output=json",
363 "uri": "https://phab.mercurial-scm.org//api/differential.parsecommitmessage",
364 "method": "POST"
365 },
366 "response": {
367 "headers": {
368 "x-xss-protection": [
369 "1; mode=block"
370 ],
371 "strict-transport-security": [
372 "max-age=0; includeSubdomains; preload"
373 ],
374 "transfer-encoding": [
375 "chunked"
376 ],
377 "x-frame-options": [
378 "Deny"
379 ],
380 "expires": [
381 "Sat, 01 Jan 2000 00:00:00 GMT"
382 ],
383 "content-type": [
384 "application/json"
385 ],
386 "referrer-policy": [
387 "no-referrer"
388 ],
389 "server": [
390 "Apache/2.4.10 (Debian)"
391 ],
392 "cache-control": [
393 "no-store"
394 ],
395 "x-content-type-options": [
396 "nosniff"
397 ],
398 "date": [
399 "Wed, 08 Apr 2020 21:13:39 GMT"
400 ]
401 },
402 "body": {
403 "string": "{\"result\":{\"errors\":[],\"fields\":{\"title\":\"added file\",\"revisionID\":8388},\"revisionIDFieldInfo\":{\"value\":8388,\"validDomain\":\"https:\\/\\/phab.mercurial-scm.org\"},\"transactions\":[{\"type\":\"title\",\"value\":\"added file\"}]},\"error_code\":null,\"error_info\":null}"
404 },
405 "status": {
406 "code": 200,
407 "message": "OK"
408 }
409 }
410 },
411 {
412 "request": {
413 "headers": {
414 "content-length": [
415 "364"
416 ],
417 "accept": [
418 "application/mercurial-0.1"
419 ],
420 "content-type": [
421 "application/x-www-form-urlencoded"
422 ],
423 "host": [
424 "phab.mercurial-scm.org"
425 ],
426 "user-agent": [
427 "mercurial/proto-1.0 (Mercurial 5.3.2+463-d35fbae9dd33+20200408)"
428 ]
429 },
430 "body": "__conduit__=1&params=%7B%22__conduit__%22%3A+%7B%22token%22%3A+%22cli-hahayouwish%22%7D%2C+%22corpus%22%3A+%22one%3A+first+commit+to+review%5Cn%5CnThis+file+was+modified+with+%27mod1%27+as+its+contents.%5Cn%5CnTest+Plan%3A%5CnLOL%21++What+testing%3F%21%5Cn%5CnDifferential+Revision%3A+https%3A%2F%2Fphab.mercurial-scm.org%2FD8388%22%7D&output=json",
431 "uri": "https://phab.mercurial-scm.org//api/differential.parsecommitmessage",
432 "method": "POST"
433 },
434 "response": {
435 "headers": {
436 "x-xss-protection": [
437 "1; mode=block"
438 ],
439 "strict-transport-security": [
440 "max-age=0; includeSubdomains; preload"
441 ],
442 "transfer-encoding": [
443 "chunked"
444 ],
445 "x-frame-options": [
446 "Deny"
447 ],
448 "expires": [
449 "Sat, 01 Jan 2000 00:00:00 GMT"
450 ],
451 "content-type": [
452 "application/json"
453 ],
454 "referrer-policy": [
455 "no-referrer"
456 ],
457 "server": [
458 "Apache/2.4.10 (Debian)"
459 ],
460 "cache-control": [
461 "no-store"
462 ],
463 "x-content-type-options": [
464 "nosniff"
465 ],
466 "date": [
467 "Wed, 08 Apr 2020 21:13:39 GMT"
468 ]
469 },
470 "body": {
471 "string": "{\"result\":{\"errors\":[],\"fields\":{\"title\":\"one: first commit to review\",\"testPlan\":\"LOL! What testing?!\",\"revisionID\":8388,\"summary\":\"This file was modified with 'mod1' as its contents.\"},\"revisionIDFieldInfo\":{\"value\":8388,\"validDomain\":\"https:\\/\\/phab.mercurial-scm.org\"},\"transactions\":[{\"type\":\"title\",\"value\":\"one: first commit to review\"},{\"type\":\"testPlan\",\"value\":\"LOL! What testing?!\"},{\"type\":\"summary\",\"value\":\"This file was modified with 'mod1' as its contents.\"}]},\"error_code\":null,\"error_info\":null}"
472 },
473 "status": {
474 "code": 200,
475 "message": "OK"
476 }
477 }
478 },
479 {
480 "request": {
481 "headers": {
482 "content-length": [
483 "361"
484 ],
485 "accept": [
486 "application/mercurial-0.1"
487 ],
488 "content-type": [
489 "application/x-www-form-urlencoded"
490 ],
491 "host": [
492 "phab.mercurial-scm.org"
493 ],
494 "user-agent": [
495 "mercurial/proto-1.0 (Mercurial 5.3.2+463-d35fbae9dd33+20200408)"
496 ]
497 },
498 "body": "__conduit__=1&params=%7B%22__conduit__%22%3A+%7B%22token%22%3A+%22cli-hahayouwish%22%7D%2C+%22corpus%22%3A+%22two%3A+second+commit+to+review%5Cn%5CnThis+file+was+modified+with+%27mod2%27+as+its+contents.%5Cn%5CnTest+Plan%3A%5CnHaha%21+yeah%2C+right.%5Cn%5CnDifferential+Revision%3A+https%3A%2F%2Fphab.mercurial-scm.org%2FD8388%22%7D&output=json",
499 "uri": "https://phab.mercurial-scm.org//api/differential.parsecommitmessage",
500 "method": "POST"
501 },
502 "response": {
503 "headers": {
504 "x-xss-protection": [
505 "1; mode=block"
506 ],
507 "strict-transport-security": [
508 "max-age=0; includeSubdomains; preload"
509 ],
510 "transfer-encoding": [
511 "chunked"
512 ],
513 "x-frame-options": [
514 "Deny"
515 ],
516 "expires": [
517 "Sat, 01 Jan 2000 00:00:00 GMT"
518 ],
519 "content-type": [
520 "application/json"
521 ],
522 "referrer-policy": [
523 "no-referrer"
524 ],
525 "server": [
526 "Apache/2.4.10 (Debian)"
527 ],
528 "cache-control": [
529 "no-store"
530 ],
531 "x-content-type-options": [
532 "nosniff"
533 ],
534 "date": [
535 "Wed, 08 Apr 2020 21:13:40 GMT"
536 ]
537 },
538 "body": {
539 "string": "{\"result\":{\"errors\":[],\"fields\":{\"title\":\"two: second commit to review\",\"testPlan\":\"Haha! yeah, right.\",\"revisionID\":8388,\"summary\":\"This file was modified with 'mod2' as its contents.\"},\"revisionIDFieldInfo\":{\"value\":8388,\"validDomain\":\"https:\\/\\/phab.mercurial-scm.org\"},\"transactions\":[{\"type\":\"title\",\"value\":\"two: second commit to review\"},{\"type\":\"testPlan\",\"value\":\"Haha! yeah, right.\"},{\"type\":\"summary\",\"value\":\"This file was modified with 'mod2' as its contents.\"}]},\"error_code\":null,\"error_info\":null}"
540 },
541 "status": {
542 "code": 200,
543 "message": "OK"
544 }
545 }
546 },
547 {
548 "request": {
549 "headers": {
550 "content-length": [
551 "260"
552 ],
553 "accept": [
554 "application/mercurial-0.1"
555 ],
556 "content-type": [
557 "application/x-www-form-urlencoded"
558 ],
559 "host": [
560 "phab.mercurial-scm.org"
561 ],
562 "user-agent": [
563 "mercurial/proto-1.0 (Mercurial 5.3.2+463-d35fbae9dd33+20200408)"
564 ]
565 },
566 "body": "__conduit__=1&params=%7B%22__conduit__%22%3A+%7B%22token%22%3A+%22cli-hahayouwish%22%7D%2C+%22corpus%22%3A+%223%3A+a+commit+with+no+detailed+message%5Cn%5CnDifferential+Revision%3A+https%3A%2F%2Fphab.mercurial-scm.org%2FD8388%22%7D&output=json",
567 "uri": "https://phab.mercurial-scm.org//api/differential.parsecommitmessage",
568 "method": "POST"
569 },
570 "response": {
571 "headers": {
572 "x-xss-protection": [
573 "1; mode=block"
574 ],
575 "strict-transport-security": [
576 "max-age=0; includeSubdomains; preload"
577 ],
578 "transfer-encoding": [
579 "chunked"
580 ],
581 "x-frame-options": [
582 "Deny"
583 ],
584 "expires": [
585 "Sat, 01 Jan 2000 00:00:00 GMT"
586 ],
587 "content-type": [
588 "application/json"
589 ],
590 "referrer-policy": [
591 "no-referrer"
592 ],
593 "server": [
594 "Apache/2.4.10 (Debian)"
595 ],
596 "cache-control": [
597 "no-store"
598 ],
599 "x-content-type-options": [
600 "nosniff"
601 ],
602 "date": [
603 "Wed, 08 Apr 2020 21:13:40 GMT"
604 ]
605 },
606 "body": {
607 "string": "{\"result\":{\"errors\":[],\"fields\":{\"title\":\"3: a commit with no detailed message\",\"revisionID\":8388},\"revisionIDFieldInfo\":{\"value\":8388,\"validDomain\":\"https:\\/\\/phab.mercurial-scm.org\"},\"transactions\":[{\"type\":\"title\",\"value\":\"3: a commit with no detailed message\"}]},\"error_code\":null,\"error_info\":null}"
608 },
609 "status": {
610 "code": 200,
611 "message": "OK"
612 }
613 }
614 },
615 {
616 "request": {
617 "headers": {
618 "content-length": [
619 "251"
620 ],
621 "accept": [
622 "application/mercurial-0.1"
623 ],
624 "content-type": [
625 "application/x-www-form-urlencoded"
626 ],
627 "host": [
628 "phab.mercurial-scm.org"
629 ],
630 "user-agent": [
631 "mercurial/proto-1.0 (Mercurial 5.3.2+463-d35fbae9dd33+20200408)"
632 ]
633 },
634 "body": "__conduit__=1&params=%7B%22__conduit__%22%3A+%7B%22token%22%3A+%22cli-hahayouwish%22%7D%2C+%22corpus%22%3A+%22four%3A+extend+the+fold+range%5Cn%5CnDifferential+Revision%3A+https%3A%2F%2Fphab.mercurial-scm.org%2FD8388%22%7D&output=json",
635 "uri": "https://phab.mercurial-scm.org//api/differential.parsecommitmessage",
636 "method": "POST"
637 },
638 "response": {
639 "headers": {
640 "x-xss-protection": [
641 "1; mode=block"
642 ],
643 "strict-transport-security": [
644 "max-age=0; includeSubdomains; preload"
645 ],
646 "transfer-encoding": [
647 "chunked"
648 ],
649 "x-frame-options": [
650 "Deny"
651 ],
652 "expires": [
653 "Sat, 01 Jan 2000 00:00:00 GMT"
654 ],
655 "content-type": [
656 "application/json"
657 ],
658 "referrer-policy": [
659 "no-referrer"
660 ],
661 "server": [
662 "Apache/2.4.10 (Debian)"
663 ],
664 "cache-control": [
665 "no-store"
666 ],
667 "x-content-type-options": [
668 "nosniff"
669 ],
670 "date": [
671 "Wed, 08 Apr 2020 21:13:40 GMT"
672 ]
673 },
674 "body": {
675 "string": "{\"result\":{\"errors\":[],\"fields\":{\"title\":\"four: extend the fold range\",\"revisionID\":8388},\"revisionIDFieldInfo\":{\"value\":8388,\"validDomain\":\"https:\\/\\/phab.mercurial-scm.org\"},\"transactions\":[{\"type\":\"title\",\"value\":\"four: extend the fold range\"}]},\"error_code\":null,\"error_info\":null}"
676 },
677 "status": {
678 "code": 200,
679 "message": "OK"
680 }
681 }
682 },
683 {
684 "request": {
685 "headers": {
686 "content-length": [
687 "799"
688 ],
689 "accept": [
690 "application/mercurial-0.1"
691 ],
692 "content-type": [
693 "application/x-www-form-urlencoded"
694 ],
695 "host": [
696 "phab.mercurial-scm.org"
697 ],
698 "user-agent": [
699 "mercurial/proto-1.0 (Mercurial 5.3.2+463-d35fbae9dd33+20200408)"
700 ]
701 },
702 "body": "__conduit__=1&params=%7B%22__conduit__%22%3A+%7B%22token%22%3A+%22cli-hahayouwish%22%7D%2C+%22objectIdentifier%22%3A+8388%2C+%22transactions%22%3A+%5B%7B%22type%22%3A+%22update%22%2C+%22value%22%3A+%22PHID-DIFF-xfr3co4kuic6jeu3xbz4%22%7D%2C+%7B%22type%22%3A+%22title%22%2C+%22value%22%3A+%22added+file%22%7D%2C+%7B%22type%22%3A+%22testPlan%22%2C+%22value%22%3A+%22LOL%21++What+testing%3F%21%5Cn%5CnHaha%21+yeah%2C+right.%22%7D%2C+%7B%22type%22%3A+%22summary%22%2C+%22value%22%3A+%22one%3A+first+commit+to+review%5Cn%5CnThis+file+was+modified+with+%27mod1%27+as+its+contents.%5Cn%5Cntwo%3A+second+commit+to+review%5Cn%5CnThis+file+was+modified+with+%27mod2%27+as+its+contents.%5Cn%5Cn3%3A+a+commit+with+no+detailed+message%5Cn%5Cnfour%3A+extend+the+fold+range%22%7D%5D%7D&output=json",
703 "uri": "https://phab.mercurial-scm.org//api/differential.revision.edit",
704 "method": "POST"
705 },
706 "response": {
707 "headers": {
708 "x-xss-protection": [
709 "1; mode=block"
710 ],
711 "strict-transport-security": [
712 "max-age=0; includeSubdomains; preload"
713 ],
714 "transfer-encoding": [
715 "chunked"
716 ],
717 "x-frame-options": [
718 "Deny"
719 ],
720 "expires": [
721 "Sat, 01 Jan 2000 00:00:00 GMT"
722 ],
723 "content-type": [
724 "application/json"
725 ],
726 "referrer-policy": [
727 "no-referrer"
728 ],
729 "server": [
730 "Apache/2.4.10 (Debian)"
731 ],
732 "cache-control": [
733 "no-store"
734 ],
735 "x-content-type-options": [
736 "nosniff"
737 ],
738 "date": [
739 "Wed, 08 Apr 2020 21:13:41 GMT"
740 ]
741 },
742 "body": {
743 "string": "{\"result\":{\"object\":{\"id\":8388,\"phid\":\"PHID-DREV-v5iywrnzj4h4uwo57pob\"},\"transactions\":[{\"phid\":\"PHID-XACT-DREV-6o5t2mriosy3fst\"},{\"phid\":\"PHID-XACT-DREV-m25qxnu4ok3w5y5\"}]},\"error_code\":null,\"error_info\":null}"
744 },
745 "status": {
746 "code": 200,
747 "message": "OK"
748 }
749 }
750 },
751 {
752 "request": {
753 "headers": {
754 "content-length": [
755 "146"
756 ],
757 "accept": [
758 "application/mercurial-0.1"
759 ],
760 "content-type": [
761 "application/x-www-form-urlencoded"
762 ],
763 "host": [
764 "phab.mercurial-scm.org"
765 ],
766 "user-agent": [
767 "mercurial/proto-1.0 (Mercurial 5.3.2+463-d35fbae9dd33+20200408)"
768 ]
769 },
770 "body": "__conduit__=1&params=%7B%22__conduit__%22%3A+%7B%22token%22%3A+%22cli-hahayouwish%22%7D%2C+%22ids%22%3A+%5B8388%5D%7D&output=json",
771 "uri": "https://phab.mercurial-scm.org//api/differential.query",
772 "method": "POST"
773 },
774 "response": {
775 "headers": {
776 "x-xss-protection": [
777 "1; mode=block"
778 ],
779 "strict-transport-security": [
780 "max-age=0; includeSubdomains; preload"
781 ],
782 "transfer-encoding": [
783 "chunked"
784 ],
785 "x-frame-options": [
786 "Deny"
787 ],
788 "expires": [
789 "Sat, 01 Jan 2000 00:00:00 GMT"
790 ],
791 "content-type": [
792 "application/json"
793 ],
794 "referrer-policy": [
795 "no-referrer"
796 ],
797 "server": [
798 "Apache/2.4.10 (Debian)"
799 ],
800 "cache-control": [
801 "no-store"
802 ],
803 "x-content-type-options": [
804 "nosniff"
805 ],
806 "date": [
807 "Wed, 08 Apr 2020 21:13:42 GMT"
808 ]
809 },
810 "body": {
811 "string": "{\"result\":[{\"id\":\"8388\",\"phid\":\"PHID-DREV-v5iywrnzj4h4uwo57pob\",\"title\":\"added file\",\"uri\":\"https:\\/\\/phab.mercurial-scm.org\\/D8388\",\"dateCreated\":\"1586380405\",\"dateModified\":\"1586380421\",\"authorPHID\":\"PHID-USER-tzhaient733lwrlbcag5\",\"status\":\"0\",\"statusName\":\"Needs Review\",\"properties\":{\"draft.broadcast\":true,\"lines.added\":3,\"lines.removed\":0},\"branch\":\"default\",\"summary\":\"one: first commit to review\\n\\nThis file was modified with 'mod1' as its contents.\\n\\ntwo: second commit to review\\n\\nThis file was modified with 'mod2' as its contents.\\n\\n3: a commit with no detailed message\\n\\nfour: extend the fold range\",\"testPlan\":\"LOL! What testing?!\\n\\nHaha! yeah, right.\",\"lineCount\":\"3\",\"activeDiffPHID\":\"PHID-DIFF-xfr3co4kuic6jeu3xbz4\",\"diffs\":[\"21012\",\"21011\",\"21010\"],\"commits\":[],\"reviewers\":{\"PHID-PROJ-3dvcxzznrjru2xmmses3\":\"PHID-PROJ-3dvcxzznrjru2xmmses3\"},\"ccs\":[\"PHID-USER-q42dn7cc3donqriafhjx\"],\"hashes\":[[\"hgcm\",\"\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\"],[\"hgcm\",\"\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\"],[\"hgcm\",\"\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\"],[\"hgcm\",\"\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\"],[\"hgcm\",\"\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\"]],\"auxiliary\":{\"phabricator:projects\":[],\"phabricator:depends-on\":[]},\"repositoryPHID\":\"PHID-REPO-bvunnehri4u2isyr7bc3\",\"sourcePath\":\"\\/\"}],\"error_code\":null,\"error_info\":null}"
812 },
813 "status": {
814 "code": 200,
815 "message": "OK"
816 }
817 }
818 },
819 {
820 "request": {
821 "headers": {
822 "content-length": [
823 "482"
824 ],
825 "accept": [
826 "application/mercurial-0.1"
827 ],
828 "content-type": [
829 "application/x-www-form-urlencoded"
830 ],
831 "host": [
832 "phab.mercurial-scm.org"
833 ],
834 "user-agent": [
835 "mercurial/proto-1.0 (Mercurial 5.3.2+463-d35fbae9dd33+20200408)"
836 ]
837 },
838 "body": "__conduit__=1&params=%7B%22__conduit__%22%3A+%7B%22token%22%3A+%22cli-hahayouwish%22%7D%2C+%22data%22%3A+%22%7B%5C%22branch%5C%22%3A+%5C%22default%5C%22%2C+%5C%22date%5C%22%3A+%5C%220+0%5C%22%2C+%5C%22node%5C%22%3A+%5C%22e919cdf3d4fe9a926427b1961601eeaf4b4e2caf%5C%22%2C+%5C%22parent%5C%22%3A+%5C%220000000000000000000000000000000000000000%5C%22%2C+%5C%22user%5C%22%3A+%5C%22test%5C%22%7D%22%2C+%22diff_id%22%3A+21012%2C+%22name%22%3A+%22hg%3Ameta%22%7D&output=json",
839 "uri": "https://phab.mercurial-scm.org//api/differential.setdiffproperty",
840 "method": "POST"
841 },
842 "response": {
843 "headers": {
844 "x-xss-protection": [
845 "1; mode=block"
846 ],
847 "strict-transport-security": [
848 "max-age=0; includeSubdomains; preload"
849 ],
850 "transfer-encoding": [
851 "chunked"
852 ],
853 "x-frame-options": [
854 "Deny"
855 ],
856 "expires": [
857 "Sat, 01 Jan 2000 00:00:00 GMT"
858 ],
859 "content-type": [
860 "application/json"
861 ],
862 "referrer-policy": [
863 "no-referrer"
864 ],
865 "server": [
866 "Apache/2.4.10 (Debian)"
867 ],
868 "cache-control": [
869 "no-store"
870 ],
871 "x-content-type-options": [
872 "nosniff"
873 ],
874 "date": [
875 "Wed, 08 Apr 2020 21:13:42 GMT"
876 ]
877 },
878 "body": {
879 "string": "{\"result\":null,\"error_code\":null,\"error_info\":null}"
880 },
881 "status": {
882 "code": 200,
883 "message": "OK"
884 }
885 }
886 },
887 {
888 "request": {
889 "headers": {
890 "content-length": [
891 "2130"
892 ],
893 "accept": [
894 "application/mercurial-0.1"
895 ],
896 "content-type": [
897 "application/x-www-form-urlencoded"
898 ],
899 "host": [
900 "phab.mercurial-scm.org"
901 ],
902 "user-agent": [
903 "mercurial/proto-1.0 (Mercurial 5.3.2+463-d35fbae9dd33+20200408)"
904 ]
905 },
906 "body": "__conduit__=1&params=%7B%22__conduit__%22%3A+%7B%22token%22%3A+%22cli-hahayouwish%22%7D%2C+%22data%22%3A+%22%7B%5C%2215e9b14b4b4c37ccd18298d058a184068718765e%5C%22%3A+%7B%5C%22author%5C%22%3A+%5C%22test%5C%22%2C+%5C%22authorEmail%5C%22%3A+%5C%22test%5C%22%2C+%5C%22branch%5C%22%3A+%5C%22default%5C%22%2C+%5C%22commit%5C%22%3A+%5C%2215e9b14b4b4c37ccd18298d058a184068718765e%5C%22%2C+%5C%22parents%5C%22%3A+%5B%5C%220000000000000000000000000000000000000000%5C%22%5D%2C+%5C%22time%5C%22%3A+0%7D%2C+%5C%2230682b960804bd91823ea5ccb5d6a7d999f8d1ea%5C%22%3A+%7B%5C%22author%5C%22%3A+%5C%22test%5C%22%2C+%5C%22authorEmail%5C%22%3A+%5C%22test%5C%22%2C+%5C%22branch%5C%22%3A+%5C%22default%5C%22%2C+%5C%22commit%5C%22%3A+%5C%2230682b960804bd91823ea5ccb5d6a7d999f8d1ea%5C%22%2C+%5C%22parents%5C%22%3A+%5B%5C%223ee132d41dbc24bf5a4df3e97573d6e922446565%5C%22%5D%2C+%5C%22time%5C%22%3A+0%7D%2C+%5C%223ee132d41dbc24bf5a4df3e97573d6e922446565%5C%22%3A+%7B%5C%22author%5C%22%3A+%5C%22test%5C%22%2C+%5C%22authorEmail%5C%22%3A+%5C%22test%5C%22%2C+%5C%22branch%5C%22%3A+%5C%22default%5C%22%2C+%5C%22commit%5C%22%3A+%5C%223ee132d41dbc24bf5a4df3e97573d6e922446565%5C%22%2C+%5C%22parents%5C%22%3A+%5B%5C%226320b7d714cf2b2b71370eafeae29e2988d07872%5C%22%5D%2C+%5C%22time%5C%22%3A+0%7D%2C+%5C%226320b7d714cf2b2b71370eafeae29e2988d07872%5C%22%3A+%7B%5C%22author%5C%22%3A+%5C%22test%5C%22%2C+%5C%22authorEmail%5C%22%3A+%5C%22test%5C%22%2C+%5C%22branch%5C%22%3A+%5C%22default%5C%22%2C+%5C%22commit%5C%22%3A+%5C%226320b7d714cf2b2b71370eafeae29e2988d07872%5C%22%2C+%5C%22parents%5C%22%3A+%5B%5C%2215e9b14b4b4c37ccd18298d058a184068718765e%5C%22%5D%2C+%5C%22time%5C%22%3A+0%7D%2C+%5C%22e919cdf3d4fe9a926427b1961601eeaf4b4e2caf%5C%22%3A+%7B%5C%22author%5C%22%3A+%5C%22test%5C%22%2C+%5C%22authorEmail%5C%22%3A+%5C%22test%5C%22%2C+%5C%22branch%5C%22%3A+%5C%22default%5C%22%2C+%5C%22commit%5C%22%3A+%5C%22e919cdf3d4fe9a926427b1961601eeaf4b4e2caf%5C%22%2C+%5C%22parents%5C%22%3A+%5B%5C%2230682b960804bd91823ea5ccb5d6a7d999f8d1ea%5C%22%5D%2C+%5C%22time%5C%22%3A+0%7D%7D%22%2C+%22diff_id%22%3A+21012%2C+%22name%22%3A+%22local%3Acommits%22%7D&output=json",
907 "uri": "https://phab.mercurial-scm.org//api/differential.setdiffproperty",
908 "method": "POST"
909 },
910 "response": {
911 "headers": {
912 "x-xss-protection": [
913 "1; mode=block"
914 ],
915 "strict-transport-security": [
916 "max-age=0; includeSubdomains; preload"
917 ],
918 "transfer-encoding": [
919 "chunked"
920 ],
921 "x-frame-options": [
922 "Deny"
923 ],
924 "expires": [
925 "Sat, 01 Jan 2000 00:00:00 GMT"
926 ],
927 "content-type": [
928 "application/json"
929 ],
930 "referrer-policy": [
931 "no-referrer"
932 ],
933 "server": [
934 "Apache/2.4.10 (Debian)"
935 ],
936 "cache-control": [
937 "no-store"
938 ],
939 "x-content-type-options": [
940 "nosniff"
941 ],
942 "date": [
943 "Wed, 08 Apr 2020 21:13:42 GMT"
944 ]
945 },
946 "body": {
947 "string": "{\"result\":null,\"error_code\":null,\"error_info\":null}"
948 },
949 "status": {
950 "code": 200,
951 "message": "OK"
952 }
953 }
954 }
955 ],
956 "version": 1
957 } No newline at end of file
This diff has been collapsed as it changes many lines, (617 lines changed) Show them Hide them
@@ -0,0 +1,617 b''
1 {
2 "interactions": [
3 {
4 "request": {
5 "headers": {
6 "content-length": [
7 "183"
8 ],
9 "accept": [
10 "application/mercurial-0.1"
11 ],
12 "content-type": [
13 "application/x-www-form-urlencoded"
14 ],
15 "host": [
16 "phab.mercurial-scm.org"
17 ],
18 "user-agent": [
19 "mercurial/proto-1.0 (Mercurial 5.3.2+463-d35fbae9dd33+20200408)"
20 ]
21 },
22 "body": "__conduit__=1&params=%7B%22__conduit__%22%3A+%7B%22token%22%3A+%22cli-hahayouwish%22%7D%2C+%22constraints%22%3A+%7B%22callsigns%22%3A+%5B%22HG%22%5D%7D%7D&output=json",
23 "uri": "https://phab.mercurial-scm.org//api/diffusion.repository.search",
24 "method": "POST"
25 },
26 "response": {
27 "headers": {
28 "x-xss-protection": [
29 "1; mode=block"
30 ],
31 "strict-transport-security": [
32 "max-age=0; includeSubdomains; preload"
33 ],
34 "transfer-encoding": [
35 "chunked"
36 ],
37 "x-frame-options": [
38 "Deny"
39 ],
40 "expires": [
41 "Sat, 01 Jan 2000 00:00:00 GMT"
42 ],
43 "content-type": [
44 "application/json"
45 ],
46 "referrer-policy": [
47 "no-referrer"
48 ],
49 "server": [
50 "Apache/2.4.10 (Debian)"
51 ],
52 "cache-control": [
53 "no-store"
54 ],
55 "x-content-type-options": [
56 "nosniff"
57 ],
58 "date": [
59 "Wed, 08 Apr 2020 21:12:49 GMT"
60 ]
61 },
62 "body": {
63 "string": "{\"result\":{\"data\":[{\"id\":2,\"type\":\"REPO\",\"phid\":\"PHID-REPO-bvunnehri4u2isyr7bc3\",\"fields\":{\"name\":\"Mercurial\",\"vcs\":\"hg\",\"callsign\":\"HG\",\"shortName\":null,\"status\":\"active\",\"isImporting\":false,\"almanacServicePHID\":null,\"refRules\":{\"fetchRules\":[],\"trackRules\":[],\"permanentRefRules\":[]},\"spacePHID\":null,\"dateCreated\":1498761653,\"dateModified\":1500403184,\"policy\":{\"view\":\"public\",\"edit\":\"admin\",\"diffusion.push\":\"users\"}},\"attachments\":{}}],\"maps\":{},\"query\":{\"queryKey\":null},\"cursor\":{\"limit\":100,\"after\":null,\"before\":null,\"order\":null}},\"error_code\":null,\"error_info\":null}"
64 },
65 "status": {
66 "code": 200,
67 "message": "OK"
68 }
69 }
70 },
71 {
72 "request": {
73 "headers": {
74 "content-length": [
75 "1160"
76 ],
77 "accept": [
78 "application/mercurial-0.1"
79 ],
80 "content-type": [
81 "application/x-www-form-urlencoded"
82 ],
83 "host": [
84 "phab.mercurial-scm.org"
85 ],
86 "user-agent": [
87 "mercurial/proto-1.0 (Mercurial 5.3.2+463-d35fbae9dd33+20200408)"
88 ]
89 },
90 "body": "__conduit__=1&params=%7B%22__conduit__%22%3A+%7B%22token%22%3A+%22cli-hahayouwish%22%7D%2C+%22bookmark%22%3A+null%2C+%22branch%22%3A+%22default%22%2C+%22changes%22%3A+%7B%22file.txt%22%3A+%7B%22addLines%22%3A+1%2C+%22awayPaths%22%3A+%5B%5D%2C+%22commitHash%22%3A+null%2C+%22currentPath%22%3A+%22file.txt%22%2C+%22delLines%22%3A+1%2C+%22fileType%22%3A+1%2C+%22hunks%22%3A+%5B%7B%22addLines%22%3A+1%2C+%22corpus%22%3A+%22-added%5Cn%2Bmod3%5Cn%22%2C+%22delLines%22%3A+1%2C+%22newLength%22%3A+1%2C+%22newOffset%22%3A+1%2C+%22oldLength%22%3A+1%2C+%22oldOffset%22%3A+1%7D%5D%2C+%22metadata%22%3A+%7B%7D%2C+%22newProperties%22%3A+%7B%7D%2C+%22oldPath%22%3A+%22file.txt%22%2C+%22oldProperties%22%3A+%7B%7D%2C+%22type%22%3A+2%7D%7D%2C+%22creationMethod%22%3A+%22phabsend%22%2C+%22lintStatus%22%3A+%22none%22%2C+%22repositoryPHID%22%3A+%22PHID-REPO-bvunnehri4u2isyr7bc3%22%2C+%22sourceControlBaseRevision%22%3A+%2298d480e0d494906d9758c44c622951b429afd862%22%2C+%22sourceControlPath%22%3A+%22%2F%22%2C+%22sourceControlSystem%22%3A+%22hg%22%2C+%22sourceMachine%22%3A+%22%22%2C+%22sourcePath%22%3A+%22%2F%22%2C+%22unitStatus%22%3A+%22none%22%7D&output=json",
91 "uri": "https://phab.mercurial-scm.org//api/differential.creatediff",
92 "method": "POST"
93 },
94 "response": {
95 "headers": {
96 "x-xss-protection": [
97 "1; mode=block"
98 ],
99 "strict-transport-security": [
100 "max-age=0; includeSubdomains; preload"
101 ],
102 "transfer-encoding": [
103 "chunked"
104 ],
105 "x-frame-options": [
106 "Deny"
107 ],
108 "expires": [
109 "Sat, 01 Jan 2000 00:00:00 GMT"
110 ],
111 "content-type": [
112 "application/json"
113 ],
114 "referrer-policy": [
115 "no-referrer"
116 ],
117 "server": [
118 "Apache/2.4.10 (Debian)"
119 ],
120 "cache-control": [
121 "no-store"
122 ],
123 "x-content-type-options": [
124 "nosniff"
125 ],
126 "date": [
127 "Wed, 08 Apr 2020 21:12:50 GMT"
128 ]
129 },
130 "body": {
131 "string": "{\"result\":{\"diffid\":21005,\"phid\":\"PHID-DIFF-wsgu5klkhfav5w7whedy\",\"uri\":\"https:\\/\\/phab.mercurial-scm.org\\/differential\\/diff\\/21005\\/\"},\"error_code\":null,\"error_info\":null}"
132 },
133 "status": {
134 "code": 200,
135 "message": "OK"
136 }
137 }
138 },
139 {
140 "request": {
141 "headers": {
142 "content-length": [
143 "482"
144 ],
145 "accept": [
146 "application/mercurial-0.1"
147 ],
148 "content-type": [
149 "application/x-www-form-urlencoded"
150 ],
151 "host": [
152 "phab.mercurial-scm.org"
153 ],
154 "user-agent": [
155 "mercurial/proto-1.0 (Mercurial 5.3.2+463-d35fbae9dd33+20200408)"
156 ]
157 },
158 "body": "__conduit__=1&params=%7B%22__conduit__%22%3A+%7B%22token%22%3A+%22cli-hahayouwish%22%7D%2C+%22data%22%3A+%22%7B%5C%22branch%5C%22%3A+%5C%22default%5C%22%2C+%5C%22date%5C%22%3A+%5C%220+0%5C%22%2C+%5C%22node%5C%22%3A+%5C%22d235829e802c98c0171dac4a265b4b9bad07093a%5C%22%2C+%5C%22parent%5C%22%3A+%5C%2298d480e0d494906d9758c44c622951b429afd862%5C%22%2C+%5C%22user%5C%22%3A+%5C%22test%5C%22%7D%22%2C+%22diff_id%22%3A+21005%2C+%22name%22%3A+%22hg%3Ameta%22%7D&output=json",
159 "uri": "https://phab.mercurial-scm.org//api/differential.setdiffproperty",
160 "method": "POST"
161 },
162 "response": {
163 "headers": {
164 "x-xss-protection": [
165 "1; mode=block"
166 ],
167 "strict-transport-security": [
168 "max-age=0; includeSubdomains; preload"
169 ],
170 "transfer-encoding": [
171 "chunked"
172 ],
173 "x-frame-options": [
174 "Deny"
175 ],
176 "expires": [
177 "Sat, 01 Jan 2000 00:00:00 GMT"
178 ],
179 "content-type": [
180 "application/json"
181 ],
182 "referrer-policy": [
183 "no-referrer"
184 ],
185 "server": [
186 "Apache/2.4.10 (Debian)"
187 ],
188 "cache-control": [
189 "no-store"
190 ],
191 "x-content-type-options": [
192 "nosniff"
193 ],
194 "date": [
195 "Wed, 08 Apr 2020 21:12:50 GMT"
196 ]
197 },
198 "body": {
199 "string": "{\"result\":null,\"error_code\":null,\"error_info\":null}"
200 },
201 "status": {
202 "code": 200,
203 "message": "OK"
204 }
205 }
206 },
207 {
208 "request": {
209 "headers": {
210 "content-length": [
211 "1362"
212 ],
213 "accept": [
214 "application/mercurial-0.1"
215 ],
216 "content-type": [
217 "application/x-www-form-urlencoded"
218 ],
219 "host": [
220 "phab.mercurial-scm.org"
221 ],
222 "user-agent": [
223 "mercurial/proto-1.0 (Mercurial 5.3.2+463-d35fbae9dd33+20200408)"
224 ]
225 },
226 "body": "__conduit__=1&params=%7B%22__conduit__%22%3A+%7B%22token%22%3A+%22cli-hahayouwish%22%7D%2C+%22data%22%3A+%22%7B%5C%2224a4438154bad90603d53a4dd31d8daff7844b36%5C%22%3A+%7B%5C%22author%5C%22%3A+%5C%22test%5C%22%2C+%5C%22authorEmail%5C%22%3A+%5C%22test%5C%22%2C+%5C%22branch%5C%22%3A+%5C%22default%5C%22%2C+%5C%22commit%5C%22%3A+%5C%2224a4438154bad90603d53a4dd31d8daff7844b36%5C%22%2C+%5C%22parents%5C%22%3A+%5B%5C%22a959a3f69d8d498d96102cda0bc03ed89706891e%5C%22%5D%2C+%5C%22time%5C%22%3A+0%7D%2C+%5C%22a959a3f69d8d498d96102cda0bc03ed89706891e%5C%22%3A+%7B%5C%22author%5C%22%3A+%5C%22test%5C%22%2C+%5C%22authorEmail%5C%22%3A+%5C%22test%5C%22%2C+%5C%22branch%5C%22%3A+%5C%22default%5C%22%2C+%5C%22commit%5C%22%3A+%5C%22a959a3f69d8d498d96102cda0bc03ed89706891e%5C%22%2C+%5C%22parents%5C%22%3A+%5B%5C%2298d480e0d494906d9758c44c622951b429afd862%5C%22%5D%2C+%5C%22time%5C%22%3A+0%7D%2C+%5C%22d235829e802c98c0171dac4a265b4b9bad07093a%5C%22%3A+%7B%5C%22author%5C%22%3A+%5C%22test%5C%22%2C+%5C%22authorEmail%5C%22%3A+%5C%22test%5C%22%2C+%5C%22branch%5C%22%3A+%5C%22default%5C%22%2C+%5C%22commit%5C%22%3A+%5C%22d235829e802c98c0171dac4a265b4b9bad07093a%5C%22%2C+%5C%22parents%5C%22%3A+%5B%5C%2224a4438154bad90603d53a4dd31d8daff7844b36%5C%22%5D%2C+%5C%22time%5C%22%3A+0%7D%7D%22%2C+%22diff_id%22%3A+21005%2C+%22name%22%3A+%22local%3Acommits%22%7D&output=json",
227 "uri": "https://phab.mercurial-scm.org//api/differential.setdiffproperty",
228 "method": "POST"
229 },
230 "response": {
231 "headers": {
232 "x-xss-protection": [
233 "1; mode=block"
234 ],
235 "strict-transport-security": [
236 "max-age=0; includeSubdomains; preload"
237 ],
238 "transfer-encoding": [
239 "chunked"
240 ],
241 "x-frame-options": [
242 "Deny"
243 ],
244 "expires": [
245 "Sat, 01 Jan 2000 00:00:00 GMT"
246 ],
247 "content-type": [
248 "application/json"
249 ],
250 "referrer-policy": [
251 "no-referrer"
252 ],
253 "server": [
254 "Apache/2.4.10 (Debian)"
255 ],
256 "cache-control": [
257 "no-store"
258 ],
259 "x-content-type-options": [
260 "nosniff"
261 ],
262 "date": [
263 "Wed, 08 Apr 2020 21:12:50 GMT"
264 ]
265 },
266 "body": {
267 "string": "{\"result\":null,\"error_code\":null,\"error_info\":null}"
268 },
269 "status": {
270 "code": 200,
271 "message": "OK"
272 }
273 }
274 },
275 {
276 "request": {
277 "headers": {
278 "content-length": [
279 "287"
280 ],
281 "accept": [
282 "application/mercurial-0.1"
283 ],
284 "content-type": [
285 "application/x-www-form-urlencoded"
286 ],
287 "host": [
288 "phab.mercurial-scm.org"
289 ],
290 "user-agent": [
291 "mercurial/proto-1.0 (Mercurial 5.3.2+463-d35fbae9dd33+20200408)"
292 ]
293 },
294 "body": "__conduit__=1&params=%7B%22__conduit__%22%3A+%7B%22token%22%3A+%22cli-hahayouwish%22%7D%2C+%22corpus%22%3A+%22one%3A+first+commit+to+review%5Cn%5CnThis+file+was+modified+with+%27mod1%27+as+its+contents.%5Cn%5CnTest+Plan%3A%5CnLOL%21++What+testing%3F%21%22%7D&output=json",
295 "uri": "https://phab.mercurial-scm.org//api/differential.parsecommitmessage",
296 "method": "POST"
297 },
298 "response": {
299 "headers": {
300 "x-xss-protection": [
301 "1; mode=block"
302 ],
303 "strict-transport-security": [
304 "max-age=0; includeSubdomains; preload"
305 ],
306 "transfer-encoding": [
307 "chunked"
308 ],
309 "x-frame-options": [
310 "Deny"
311 ],
312 "expires": [
313 "Sat, 01 Jan 2000 00:00:00 GMT"
314 ],
315 "content-type": [
316 "application/json"
317 ],
318 "referrer-policy": [
319 "no-referrer"
320 ],
321 "server": [
322 "Apache/2.4.10 (Debian)"
323 ],
324 "cache-control": [
325 "no-store"
326 ],
327 "x-content-type-options": [
328 "nosniff"
329 ],
330 "date": [
331 "Wed, 08 Apr 2020 21:12:51 GMT"
332 ]
333 },
334 "body": {
335 "string": "{\"result\":{\"errors\":[],\"fields\":{\"title\":\"one: first commit to review\",\"testPlan\":\"LOL! What testing?!\",\"summary\":\"This file was modified with 'mod1' as its contents.\"},\"revisionIDFieldInfo\":{\"value\":null,\"validDomain\":\"https:\\/\\/phab.mercurial-scm.org\"},\"transactions\":[{\"type\":\"title\",\"value\":\"one: first commit to review\"},{\"type\":\"testPlan\",\"value\":\"LOL! What testing?!\"},{\"type\":\"summary\",\"value\":\"This file was modified with 'mod1' as its contents.\"}]},\"error_code\":null,\"error_info\":null}"
336 },
337 "status": {
338 "code": 200,
339 "message": "OK"
340 }
341 }
342 },
343 {
344 "request": {
345 "headers": {
346 "content-length": [
347 "284"
348 ],
349 "accept": [
350 "application/mercurial-0.1"
351 ],
352 "content-type": [
353 "application/x-www-form-urlencoded"
354 ],
355 "host": [
356 "phab.mercurial-scm.org"
357 ],
358 "user-agent": [
359 "mercurial/proto-1.0 (Mercurial 5.3.2+463-d35fbae9dd33+20200408)"
360 ]
361 },
362 "body": "__conduit__=1&params=%7B%22__conduit__%22%3A+%7B%22token%22%3A+%22cli-hahayouwish%22%7D%2C+%22corpus%22%3A+%22two%3A+second+commit+to+review%5Cn%5CnThis+file+was+modified+with+%27mod2%27+as+its+contents.%5Cn%5CnTest+Plan%3A%5CnHaha%21+yeah%2C+right.%22%7D&output=json",
363 "uri": "https://phab.mercurial-scm.org//api/differential.parsecommitmessage",
364 "method": "POST"
365 },
366 "response": {
367 "headers": {
368 "x-xss-protection": [
369 "1; mode=block"
370 ],
371 "strict-transport-security": [
372 "max-age=0; includeSubdomains; preload"
373 ],
374 "transfer-encoding": [
375 "chunked"
376 ],
377 "x-frame-options": [
378 "Deny"
379 ],
380 "expires": [
381 "Sat, 01 Jan 2000 00:00:00 GMT"
382 ],
383 "content-type": [
384 "application/json"
385 ],
386 "referrer-policy": [
387 "no-referrer"
388 ],
389 "server": [
390 "Apache/2.4.10 (Debian)"
391 ],
392 "cache-control": [
393 "no-store"
394 ],
395 "x-content-type-options": [
396 "nosniff"
397 ],
398 "date": [
399 "Wed, 08 Apr 2020 21:12:51 GMT"
400 ]
401 },
402 "body": {
403 "string": "{\"result\":{\"errors\":[],\"fields\":{\"title\":\"two: second commit to review\",\"testPlan\":\"Haha! yeah, right.\",\"summary\":\"This file was modified with 'mod2' as its contents.\"},\"revisionIDFieldInfo\":{\"value\":null,\"validDomain\":\"https:\\/\\/phab.mercurial-scm.org\"},\"transactions\":[{\"type\":\"title\",\"value\":\"two: second commit to review\"},{\"type\":\"testPlan\",\"value\":\"Haha! yeah, right.\"},{\"type\":\"summary\",\"value\":\"This file was modified with 'mod2' as its contents.\"}]},\"error_code\":null,\"error_info\":null}"
404 },
405 "status": {
406 "code": 200,
407 "message": "OK"
408 }
409 }
410 },
411 {
412 "request": {
413 "headers": {
414 "content-length": [
415 "183"
416 ],
417 "accept": [
418 "application/mercurial-0.1"
419 ],
420 "content-type": [
421 "application/x-www-form-urlencoded"
422 ],
423 "host": [
424 "phab.mercurial-scm.org"
425 ],
426 "user-agent": [
427 "mercurial/proto-1.0 (Mercurial 5.3.2+463-d35fbae9dd33+20200408)"
428 ]
429 },
430 "body": "__conduit__=1&params=%7B%22__conduit__%22%3A+%7B%22token%22%3A+%22cli-hahayouwish%22%7D%2C+%22corpus%22%3A+%223%3A+a+commit+with+no+detailed+message%22%7D&output=json",
431 "uri": "https://phab.mercurial-scm.org//api/differential.parsecommitmessage",
432 "method": "POST"
433 },
434 "response": {
435 "headers": {
436 "x-xss-protection": [
437 "1; mode=block"
438 ],
439 "strict-transport-security": [
440 "max-age=0; includeSubdomains; preload"
441 ],
442 "transfer-encoding": [
443 "chunked"
444 ],
445 "x-frame-options": [
446 "Deny"
447 ],
448 "expires": [
449 "Sat, 01 Jan 2000 00:00:00 GMT"
450 ],
451 "content-type": [
452 "application/json"
453 ],
454 "referrer-policy": [
455 "no-referrer"
456 ],
457 "server": [
458 "Apache/2.4.10 (Debian)"
459 ],
460 "cache-control": [
461 "no-store"
462 ],
463 "x-content-type-options": [
464 "nosniff"
465 ],
466 "date": [
467 "Wed, 08 Apr 2020 21:12:52 GMT"
468 ]
469 },
470 "body": {
471 "string": "{\"result\":{\"errors\":[],\"fields\":{\"title\":\"3: a commit with no detailed message\"},\"revisionIDFieldInfo\":{\"value\":null,\"validDomain\":\"https:\\/\\/phab.mercurial-scm.org\"},\"transactions\":[{\"type\":\"title\",\"value\":\"3: a commit with no detailed message\"}]},\"error_code\":null,\"error_info\":null}"
472 },
473 "status": {
474 "code": 200,
475 "message": "OK"
476 }
477 }
478 },
479 {
480 "request": {
481 "headers": {
482 "content-length": [
483 "710"
484 ],
485 "accept": [
486 "application/mercurial-0.1"
487 ],
488 "content-type": [
489 "application/x-www-form-urlencoded"
490 ],
491 "host": [
492 "phab.mercurial-scm.org"
493 ],
494 "user-agent": [
495 "mercurial/proto-1.0 (Mercurial 5.3.2+463-d35fbae9dd33+20200408)"
496 ]
497 },
498 "body": "__conduit__=1&params=%7B%22__conduit__%22%3A+%7B%22token%22%3A+%22cli-hahayouwish%22%7D%2C+%22transactions%22%3A+%5B%7B%22type%22%3A+%22update%22%2C+%22value%22%3A+%22PHID-DIFF-wsgu5klkhfav5w7whedy%22%7D%2C+%7B%22type%22%3A+%22title%22%2C+%22value%22%3A+%22one%3A+first+commit+to+review%22%7D%2C+%7B%22type%22%3A+%22testPlan%22%2C+%22value%22%3A+%22LOL%21++What+testing%3F%21%5Cn%5CnHaha%21+yeah%2C+right.%22%7D%2C+%7B%22type%22%3A+%22summary%22%2C+%22value%22%3A+%22This+file+was+modified+with+%27mod1%27+as+its+contents.%5Cn%5Cntwo%3A+second+commit+to+review%5Cn%5CnThis+file+was+modified+with+%27mod2%27+as+its+contents.%5Cn%5Cn3%3A+a+commit+with+no+detailed+message%22%7D%5D%7D&output=json",
499 "uri": "https://phab.mercurial-scm.org//api/differential.revision.edit",
500 "method": "POST"
501 },
502 "response": {
503 "headers": {
504 "x-xss-protection": [
505 "1; mode=block"
506 ],
507 "strict-transport-security": [
508 "max-age=0; includeSubdomains; preload"
509 ],
510 "transfer-encoding": [
511 "chunked"
512 ],
513 "x-frame-options": [
514 "Deny"
515 ],
516 "expires": [
517 "Sat, 01 Jan 2000 00:00:00 GMT"
518 ],
519 "content-type": [
520 "application/json"
521 ],
522 "referrer-policy": [
523 "no-referrer"
524 ],
525 "server": [
526 "Apache/2.4.10 (Debian)"
527 ],
528 "cache-control": [
529 "no-store"
530 ],
531 "x-content-type-options": [
532 "nosniff"
533 ],
534 "date": [
535 "Wed, 08 Apr 2020 21:12:52 GMT"
536 ]
537 },
538 "body": {
539 "string": "{\"result\":{\"object\":{\"id\":8386,\"phid\":\"PHID-DREV-vljbu77pqc7mc7kbjtda\"},\"transactions\":[{\"phid\":\"PHID-XACT-DREV-53554u7xxma5ilf\"},{\"phid\":\"PHID-XACT-DREV-uuawwpix7ys5h2o\"},{\"phid\":\"PHID-XACT-DREV-ayqnuzfys4wwult\"},{\"phid\":\"PHID-XACT-DREV-7cwnl5hsynwvae4\"},{\"phid\":\"PHID-XACT-DREV-q2g3p7fuwk2eldg\"},{\"phid\":\"PHID-XACT-DREV-32j4eonnv72por3\"},{\"phid\":\"PHID-XACT-DREV-h4hqh7acick3f6t\"}]},\"error_code\":null,\"error_info\":null}"
540 },
541 "status": {
542 "code": 200,
543 "message": "OK"
544 }
545 }
546 },
547 {
548 "request": {
549 "headers": {
550 "content-length": [
551 "146"
552 ],
553 "accept": [
554 "application/mercurial-0.1"
555 ],
556 "content-type": [
557 "application/x-www-form-urlencoded"
558 ],
559 "host": [
560 "phab.mercurial-scm.org"
561 ],
562 "user-agent": [
563 "mercurial/proto-1.0 (Mercurial 5.3.2+463-d35fbae9dd33+20200408)"
564 ]
565 },
566 "body": "__conduit__=1&params=%7B%22__conduit__%22%3A+%7B%22token%22%3A+%22cli-hahayouwish%22%7D%2C+%22ids%22%3A+%5B8386%5D%7D&output=json",
567 "uri": "https://phab.mercurial-scm.org//api/differential.query",
568 "method": "POST"
569 },
570 "response": {
571 "headers": {
572 "x-xss-protection": [
573 "1; mode=block"
574 ],
575 "strict-transport-security": [
576 "max-age=0; includeSubdomains; preload"
577 ],
578 "transfer-encoding": [
579 "chunked"
580 ],
581 "x-frame-options": [
582 "Deny"
583 ],
584 "expires": [
585 "Sat, 01 Jan 2000 00:00:00 GMT"
586 ],
587 "content-type": [
588 "application/json"
589 ],
590 "referrer-policy": [
591 "no-referrer"
592 ],
593 "server": [
594 "Apache/2.4.10 (Debian)"
595 ],
596 "cache-control": [
597 "no-store"
598 ],
599 "x-content-type-options": [
600 "nosniff"
601 ],
602 "date": [
603 "Wed, 08 Apr 2020 21:12:53 GMT"
604 ]
605 },
606 "body": {
607 "string": "{\"result\":[{\"id\":\"8386\",\"phid\":\"PHID-DREV-vljbu77pqc7mc7kbjtda\",\"title\":\"one: first commit to review\",\"uri\":\"https:\\/\\/phab.mercurial-scm.org\\/D8386\",\"dateCreated\":\"1586380372\",\"dateModified\":\"1586380372\",\"authorPHID\":\"PHID-USER-tzhaient733lwrlbcag5\",\"status\":\"0\",\"statusName\":\"Needs Review\",\"properties\":{\"draft.broadcast\":true,\"lines.added\":1,\"lines.removed\":1},\"branch\":\"default\",\"summary\":\"This file was modified with 'mod1' as its contents.\\n\\ntwo: second commit to review\\n\\nThis file was modified with 'mod2' as its contents.\\n\\n3: a commit with no detailed message\",\"testPlan\":\"LOL! What testing?!\\n\\nHaha! yeah, right.\",\"lineCount\":\"2\",\"activeDiffPHID\":\"PHID-DIFF-wsgu5klkhfav5w7whedy\",\"diffs\":[\"21005\"],\"commits\":[],\"reviewers\":{\"PHID-PROJ-3dvcxzznrjru2xmmses3\":\"PHID-PROJ-3dvcxzznrjru2xmmses3\"},\"ccs\":[\"PHID-USER-q42dn7cc3donqriafhjx\"],\"hashes\":[[\"hgcm\",\"\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\"],[\"hgcm\",\"\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\"],[\"hgcm\",\"\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\"]],\"auxiliary\":{\"phabricator:projects\":[],\"phabricator:depends-on\":[]},\"repositoryPHID\":\"PHID-REPO-bvunnehri4u2isyr7bc3\",\"sourcePath\":\"\\/\"}],\"error_code\":null,\"error_info\":null}"
608 },
609 "status": {
610 "code": 200,
611 "message": "OK"
612 }
613 }
614 }
615 ],
616 "version": 1
617 } No newline at end of file
This diff has been collapsed as it changes many lines, (753 lines changed) Show them Hide them
@@ -0,0 +1,753 b''
1 {
2 "interactions": [
3 {
4 "request": {
5 "headers": {
6 "content-length": [
7 "183"
8 ],
9 "accept": [
10 "application/mercurial-0.1"
11 ],
12 "content-type": [
13 "application/x-www-form-urlencoded"
14 ],
15 "host": [
16 "phab.mercurial-scm.org"
17 ],
18 "user-agent": [
19 "mercurial/proto-1.0 (Mercurial 5.3.2+463-d35fbae9dd33+20200408)"
20 ]
21 },
22 "body": "__conduit__=1&params=%7B%22__conduit__%22%3A+%7B%22token%22%3A+%22cli-hahayouwish%22%7D%2C+%22constraints%22%3A+%7B%22callsigns%22%3A+%5B%22HG%22%5D%7D%7D&output=json",
23 "uri": "https://phab.mercurial-scm.org//api/diffusion.repository.search",
24 "method": "POST"
25 },
26 "response": {
27 "headers": {
28 "x-xss-protection": [
29 "1; mode=block"
30 ],
31 "strict-transport-security": [
32 "max-age=0; includeSubdomains; preload"
33 ],
34 "transfer-encoding": [
35 "chunked"
36 ],
37 "x-frame-options": [
38 "Deny"
39 ],
40 "expires": [
41 "Sat, 01 Jan 2000 00:00:00 GMT"
42 ],
43 "content-type": [
44 "application/json"
45 ],
46 "referrer-policy": [
47 "no-referrer"
48 ],
49 "server": [
50 "Apache/2.4.10 (Debian)"
51 ],
52 "cache-control": [
53 "no-store"
54 ],
55 "x-content-type-options": [
56 "nosniff"
57 ],
58 "date": [
59 "Wed, 08 Apr 2020 21:12:54 GMT"
60 ]
61 },
62 "body": {
63 "string": "{\"result\":{\"data\":[{\"id\":2,\"type\":\"REPO\",\"phid\":\"PHID-REPO-bvunnehri4u2isyr7bc3\",\"fields\":{\"name\":\"Mercurial\",\"vcs\":\"hg\",\"callsign\":\"HG\",\"shortName\":null,\"status\":\"active\",\"isImporting\":false,\"almanacServicePHID\":null,\"refRules\":{\"fetchRules\":[],\"trackRules\":[],\"permanentRefRules\":[]},\"spacePHID\":null,\"dateCreated\":1498761653,\"dateModified\":1500403184,\"policy\":{\"view\":\"public\",\"edit\":\"admin\",\"diffusion.push\":\"users\"}},\"attachments\":{}}],\"maps\":{},\"query\":{\"queryKey\":null},\"cursor\":{\"limit\":100,\"after\":null,\"before\":null,\"order\":null}},\"error_code\":null,\"error_info\":null}"
64 },
65 "status": {
66 "code": 200,
67 "message": "OK"
68 }
69 }
70 },
71 {
72 "request": {
73 "headers": {
74 "content-length": [
75 "1160"
76 ],
77 "accept": [
78 "application/mercurial-0.1"
79 ],
80 "content-type": [
81 "application/x-www-form-urlencoded"
82 ],
83 "host": [
84 "phab.mercurial-scm.org"
85 ],
86 "user-agent": [
87 "mercurial/proto-1.0 (Mercurial 5.3.2+463-d35fbae9dd33+20200408)"
88 ]
89 },
90 "body": "__conduit__=1&params=%7B%22__conduit__%22%3A+%7B%22token%22%3A+%22cli-hahayouwish%22%7D%2C+%22bookmark%22%3A+null%2C+%22branch%22%3A+%22default%22%2C+%22changes%22%3A+%7B%22file.txt%22%3A+%7B%22addLines%22%3A+1%2C+%22awayPaths%22%3A+%5B%5D%2C+%22commitHash%22%3A+null%2C+%22currentPath%22%3A+%22file.txt%22%2C+%22delLines%22%3A+1%2C+%22fileType%22%3A+1%2C+%22hunks%22%3A+%5B%7B%22addLines%22%3A+1%2C+%22corpus%22%3A+%22-added%5Cn%2Bmod3%5Cn%22%2C+%22delLines%22%3A+1%2C+%22newLength%22%3A+1%2C+%22newOffset%22%3A+1%2C+%22oldLength%22%3A+1%2C+%22oldOffset%22%3A+1%7D%5D%2C+%22metadata%22%3A+%7B%7D%2C+%22newProperties%22%3A+%7B%7D%2C+%22oldPath%22%3A+%22file.txt%22%2C+%22oldProperties%22%3A+%7B%7D%2C+%22type%22%3A+2%7D%7D%2C+%22creationMethod%22%3A+%22phabsend%22%2C+%22lintStatus%22%3A+%22none%22%2C+%22repositoryPHID%22%3A+%22PHID-REPO-bvunnehri4u2isyr7bc3%22%2C+%22sourceControlBaseRevision%22%3A+%2298d480e0d494906d9758c44c622951b429afd862%22%2C+%22sourceControlPath%22%3A+%22%2F%22%2C+%22sourceControlSystem%22%3A+%22hg%22%2C+%22sourceMachine%22%3A+%22%22%2C+%22sourcePath%22%3A+%22%2F%22%2C+%22unitStatus%22%3A+%22none%22%7D&output=json",
91 "uri": "https://phab.mercurial-scm.org//api/differential.creatediff",
92 "method": "POST"
93 },
94 "response": {
95 "headers": {
96 "x-xss-protection": [
97 "1; mode=block"
98 ],
99 "strict-transport-security": [
100 "max-age=0; includeSubdomains; preload"
101 ],
102 "transfer-encoding": [
103 "chunked"
104 ],
105 "x-frame-options": [
106 "Deny"
107 ],
108 "expires": [
109 "Sat, 01 Jan 2000 00:00:00 GMT"
110 ],
111 "content-type": [
112 "application/json"
113 ],
114 "referrer-policy": [
115 "no-referrer"
116 ],
117 "server": [
118 "Apache/2.4.10 (Debian)"
119 ],
120 "cache-control": [
121 "no-store"
122 ],
123 "x-content-type-options": [
124 "nosniff"
125 ],
126 "date": [
127 "Wed, 08 Apr 2020 21:12:55 GMT"
128 ]
129 },
130 "body": {
131 "string": "{\"result\":{\"diffid\":21006,\"phid\":\"PHID-DIFF-j6mteixl347wzuphwdft\",\"uri\":\"https:\\/\\/phab.mercurial-scm.org\\/differential\\/diff\\/21006\\/\"},\"error_code\":null,\"error_info\":null}"
132 },
133 "status": {
134 "code": 200,
135 "message": "OK"
136 }
137 }
138 },
139 {
140 "request": {
141 "headers": {
142 "content-length": [
143 "482"
144 ],
145 "accept": [
146 "application/mercurial-0.1"
147 ],
148 "content-type": [
149 "application/x-www-form-urlencoded"
150 ],
151 "host": [
152 "phab.mercurial-scm.org"
153 ],
154 "user-agent": [
155 "mercurial/proto-1.0 (Mercurial 5.3.2+463-d35fbae9dd33+20200408)"
156 ]
157 },
158 "body": "__conduit__=1&params=%7B%22__conduit__%22%3A+%7B%22token%22%3A+%22cli-hahayouwish%22%7D%2C+%22data%22%3A+%22%7B%5C%22branch%5C%22%3A+%5C%22default%5C%22%2C+%5C%22date%5C%22%3A+%5C%220+0%5C%22%2C+%5C%22node%5C%22%3A+%5C%22d235829e802c98c0171dac4a265b4b9bad07093a%5C%22%2C+%5C%22parent%5C%22%3A+%5C%2298d480e0d494906d9758c44c622951b429afd862%5C%22%2C+%5C%22user%5C%22%3A+%5C%22test%5C%22%7D%22%2C+%22diff_id%22%3A+21006%2C+%22name%22%3A+%22hg%3Ameta%22%7D&output=json",
159 "uri": "https://phab.mercurial-scm.org//api/differential.setdiffproperty",
160 "method": "POST"
161 },
162 "response": {
163 "headers": {
164 "x-xss-protection": [
165 "1; mode=block"
166 ],
167 "strict-transport-security": [
168 "max-age=0; includeSubdomains; preload"
169 ],
170 "transfer-encoding": [
171 "chunked"
172 ],
173 "x-frame-options": [
174 "Deny"
175 ],
176 "expires": [
177 "Sat, 01 Jan 2000 00:00:00 GMT"
178 ],
179 "content-type": [
180 "application/json"
181 ],
182 "referrer-policy": [
183 "no-referrer"
184 ],
185 "server": [
186 "Apache/2.4.10 (Debian)"
187 ],
188 "cache-control": [
189 "no-store"
190 ],
191 "x-content-type-options": [
192 "nosniff"
193 ],
194 "date": [
195 "Wed, 08 Apr 2020 21:12:55 GMT"
196 ]
197 },
198 "body": {
199 "string": "{\"result\":null,\"error_code\":null,\"error_info\":null}"
200 },
201 "status": {
202 "code": 200,
203 "message": "OK"
204 }
205 }
206 },
207 {
208 "request": {
209 "headers": {
210 "content-length": [
211 "1362"
212 ],
213 "accept": [
214 "application/mercurial-0.1"
215 ],
216 "content-type": [
217 "application/x-www-form-urlencoded"
218 ],
219 "host": [
220 "phab.mercurial-scm.org"
221 ],
222 "user-agent": [
223 "mercurial/proto-1.0 (Mercurial 5.3.2+463-d35fbae9dd33+20200408)"
224 ]
225 },
226 "body": "__conduit__=1&params=%7B%22__conduit__%22%3A+%7B%22token%22%3A+%22cli-hahayouwish%22%7D%2C+%22data%22%3A+%22%7B%5C%2224a4438154bad90603d53a4dd31d8daff7844b36%5C%22%3A+%7B%5C%22author%5C%22%3A+%5C%22test%5C%22%2C+%5C%22authorEmail%5C%22%3A+%5C%22test%5C%22%2C+%5C%22branch%5C%22%3A+%5C%22default%5C%22%2C+%5C%22commit%5C%22%3A+%5C%2224a4438154bad90603d53a4dd31d8daff7844b36%5C%22%2C+%5C%22parents%5C%22%3A+%5B%5C%22a959a3f69d8d498d96102cda0bc03ed89706891e%5C%22%5D%2C+%5C%22time%5C%22%3A+0%7D%2C+%5C%22a959a3f69d8d498d96102cda0bc03ed89706891e%5C%22%3A+%7B%5C%22author%5C%22%3A+%5C%22test%5C%22%2C+%5C%22authorEmail%5C%22%3A+%5C%22test%5C%22%2C+%5C%22branch%5C%22%3A+%5C%22default%5C%22%2C+%5C%22commit%5C%22%3A+%5C%22a959a3f69d8d498d96102cda0bc03ed89706891e%5C%22%2C+%5C%22parents%5C%22%3A+%5B%5C%2298d480e0d494906d9758c44c622951b429afd862%5C%22%5D%2C+%5C%22time%5C%22%3A+0%7D%2C+%5C%22d235829e802c98c0171dac4a265b4b9bad07093a%5C%22%3A+%7B%5C%22author%5C%22%3A+%5C%22test%5C%22%2C+%5C%22authorEmail%5C%22%3A+%5C%22test%5C%22%2C+%5C%22branch%5C%22%3A+%5C%22default%5C%22%2C+%5C%22commit%5C%22%3A+%5C%22d235829e802c98c0171dac4a265b4b9bad07093a%5C%22%2C+%5C%22parents%5C%22%3A+%5B%5C%2224a4438154bad90603d53a4dd31d8daff7844b36%5C%22%5D%2C+%5C%22time%5C%22%3A+0%7D%7D%22%2C+%22diff_id%22%3A+21006%2C+%22name%22%3A+%22local%3Acommits%22%7D&output=json",
227 "uri": "https://phab.mercurial-scm.org//api/differential.setdiffproperty",
228 "method": "POST"
229 },
230 "response": {
231 "headers": {
232 "x-xss-protection": [
233 "1; mode=block"
234 ],
235 "strict-transport-security": [
236 "max-age=0; includeSubdomains; preload"
237 ],
238 "transfer-encoding": [
239 "chunked"
240 ],
241 "x-frame-options": [
242 "Deny"
243 ],
244 "expires": [
245 "Sat, 01 Jan 2000 00:00:00 GMT"
246 ],
247 "content-type": [
248 "application/json"
249 ],
250 "referrer-policy": [
251 "no-referrer"
252 ],
253 "server": [
254 "Apache/2.4.10 (Debian)"
255 ],
256 "cache-control": [
257 "no-store"
258 ],
259 "x-content-type-options": [
260 "nosniff"
261 ],
262 "date": [
263 "Wed, 08 Apr 2020 21:12:55 GMT"
264 ]
265 },
266 "body": {
267 "string": "{\"result\":null,\"error_code\":null,\"error_info\":null}"
268 },
269 "status": {
270 "code": 200,
271 "message": "OK"
272 }
273 }
274 },
275 {
276 "request": {
277 "headers": {
278 "content-length": [
279 "287"
280 ],
281 "accept": [
282 "application/mercurial-0.1"
283 ],
284 "content-type": [
285 "application/x-www-form-urlencoded"
286 ],
287 "host": [
288 "phab.mercurial-scm.org"
289 ],
290 "user-agent": [
291 "mercurial/proto-1.0 (Mercurial 5.3.2+463-d35fbae9dd33+20200408)"
292 ]
293 },
294 "body": "__conduit__=1&params=%7B%22__conduit__%22%3A+%7B%22token%22%3A+%22cli-hahayouwish%22%7D%2C+%22corpus%22%3A+%22one%3A+first+commit+to+review%5Cn%5CnThis+file+was+modified+with+%27mod1%27+as+its+contents.%5Cn%5CnTest+Plan%3A%5CnLOL%21++What+testing%3F%21%22%7D&output=json",
295 "uri": "https://phab.mercurial-scm.org//api/differential.parsecommitmessage",
296 "method": "POST"
297 },
298 "response": {
299 "headers": {
300 "x-xss-protection": [
301 "1; mode=block"
302 ],
303 "strict-transport-security": [
304 "max-age=0; includeSubdomains; preload"
305 ],
306 "transfer-encoding": [
307 "chunked"
308 ],
309 "x-frame-options": [
310 "Deny"
311 ],
312 "expires": [
313 "Sat, 01 Jan 2000 00:00:00 GMT"
314 ],
315 "content-type": [
316 "application/json"
317 ],
318 "referrer-policy": [
319 "no-referrer"
320 ],
321 "server": [
322 "Apache/2.4.10 (Debian)"
323 ],
324 "cache-control": [
325 "no-store"
326 ],
327 "x-content-type-options": [
328 "nosniff"
329 ],
330 "date": [
331 "Wed, 08 Apr 2020 21:12:56 GMT"
332 ]
333 },
334 "body": {
335 "string": "{\"result\":{\"errors\":[],\"fields\":{\"title\":\"one: first commit to review\",\"testPlan\":\"LOL! What testing?!\",\"summary\":\"This file was modified with 'mod1' as its contents.\"},\"revisionIDFieldInfo\":{\"value\":null,\"validDomain\":\"https:\\/\\/phab.mercurial-scm.org\"},\"transactions\":[{\"type\":\"title\",\"value\":\"one: first commit to review\"},{\"type\":\"testPlan\",\"value\":\"LOL! What testing?!\"},{\"type\":\"summary\",\"value\":\"This file was modified with 'mod1' as its contents.\"}]},\"error_code\":null,\"error_info\":null}"
336 },
337 "status": {
338 "code": 200,
339 "message": "OK"
340 }
341 }
342 },
343 {
344 "request": {
345 "headers": {
346 "content-length": [
347 "284"
348 ],
349 "accept": [
350 "application/mercurial-0.1"
351 ],
352 "content-type": [
353 "application/x-www-form-urlencoded"
354 ],
355 "host": [
356 "phab.mercurial-scm.org"
357 ],
358 "user-agent": [
359 "mercurial/proto-1.0 (Mercurial 5.3.2+463-d35fbae9dd33+20200408)"
360 ]
361 },
362 "body": "__conduit__=1&params=%7B%22__conduit__%22%3A+%7B%22token%22%3A+%22cli-hahayouwish%22%7D%2C+%22corpus%22%3A+%22two%3A+second+commit+to+review%5Cn%5CnThis+file+was+modified+with+%27mod2%27+as+its+contents.%5Cn%5CnTest+Plan%3A%5CnHaha%21+yeah%2C+right.%22%7D&output=json",
363 "uri": "https://phab.mercurial-scm.org//api/differential.parsecommitmessage",
364 "method": "POST"
365 },
366 "response": {
367 "headers": {
368 "x-xss-protection": [
369 "1; mode=block"
370 ],
371 "strict-transport-security": [
372 "max-age=0; includeSubdomains; preload"
373 ],
374 "transfer-encoding": [
375 "chunked"
376 ],
377 "x-frame-options": [
378 "Deny"
379 ],
380 "expires": [
381 "Sat, 01 Jan 2000 00:00:00 GMT"
382 ],
383 "content-type": [
384 "application/json"
385 ],
386 "referrer-policy": [
387 "no-referrer"
388 ],
389 "server": [
390 "Apache/2.4.10 (Debian)"
391 ],
392 "cache-control": [
393 "no-store"
394 ],
395 "x-content-type-options": [
396 "nosniff"
397 ],
398 "date": [
399 "Wed, 08 Apr 2020 21:12:56 GMT"
400 ]
401 },
402 "body": {
403 "string": "{\"result\":{\"errors\":[],\"fields\":{\"title\":\"two: second commit to review\",\"testPlan\":\"Haha! yeah, right.\",\"summary\":\"This file was modified with 'mod2' as its contents.\"},\"revisionIDFieldInfo\":{\"value\":null,\"validDomain\":\"https:\\/\\/phab.mercurial-scm.org\"},\"transactions\":[{\"type\":\"title\",\"value\":\"two: second commit to review\"},{\"type\":\"testPlan\",\"value\":\"Haha! yeah, right.\"},{\"type\":\"summary\",\"value\":\"This file was modified with 'mod2' as its contents.\"}]},\"error_code\":null,\"error_info\":null}"
404 },
405 "status": {
406 "code": 200,
407 "message": "OK"
408 }
409 }
410 },
411 {
412 "request": {
413 "headers": {
414 "content-length": [
415 "183"
416 ],
417 "accept": [
418 "application/mercurial-0.1"
419 ],
420 "content-type": [
421 "application/x-www-form-urlencoded"
422 ],
423 "host": [
424 "phab.mercurial-scm.org"
425 ],
426 "user-agent": [
427 "mercurial/proto-1.0 (Mercurial 5.3.2+463-d35fbae9dd33+20200408)"
428 ]
429 },
430 "body": "__conduit__=1&params=%7B%22__conduit__%22%3A+%7B%22token%22%3A+%22cli-hahayouwish%22%7D%2C+%22corpus%22%3A+%223%3A+a+commit+with+no+detailed+message%22%7D&output=json",
431 "uri": "https://phab.mercurial-scm.org//api/differential.parsecommitmessage",
432 "method": "POST"
433 },
434 "response": {
435 "headers": {
436 "x-xss-protection": [
437 "1; mode=block"
438 ],
439 "strict-transport-security": [
440 "max-age=0; includeSubdomains; preload"
441 ],
442 "transfer-encoding": [
443 "chunked"
444 ],
445 "x-frame-options": [
446 "Deny"
447 ],
448 "expires": [
449 "Sat, 01 Jan 2000 00:00:00 GMT"
450 ],
451 "content-type": [
452 "application/json"
453 ],
454 "referrer-policy": [
455 "no-referrer"
456 ],
457 "server": [
458 "Apache/2.4.10 (Debian)"
459 ],
460 "cache-control": [
461 "no-store"
462 ],
463 "x-content-type-options": [
464 "nosniff"
465 ],
466 "date": [
467 "Wed, 08 Apr 2020 21:12:57 GMT"
468 ]
469 },
470 "body": {
471 "string": "{\"result\":{\"errors\":[],\"fields\":{\"title\":\"3: a commit with no detailed message\"},\"revisionIDFieldInfo\":{\"value\":null,\"validDomain\":\"https:\\/\\/phab.mercurial-scm.org\"},\"transactions\":[{\"type\":\"title\",\"value\":\"3: a commit with no detailed message\"}]},\"error_code\":null,\"error_info\":null}"
472 },
473 "status": {
474 "code": 200,
475 "message": "OK"
476 }
477 }
478 },
479 {
480 "request": {
481 "headers": {
482 "content-length": [
483 "710"
484 ],
485 "accept": [
486 "application/mercurial-0.1"
487 ],
488 "content-type": [
489 "application/x-www-form-urlencoded"
490 ],
491 "host": [
492 "phab.mercurial-scm.org"
493 ],
494 "user-agent": [
495 "mercurial/proto-1.0 (Mercurial 5.3.2+463-d35fbae9dd33+20200408)"
496 ]
497 },
498 "body": "__conduit__=1&params=%7B%22__conduit__%22%3A+%7B%22token%22%3A+%22cli-hahayouwish%22%7D%2C+%22transactions%22%3A+%5B%7B%22type%22%3A+%22update%22%2C+%22value%22%3A+%22PHID-DIFF-j6mteixl347wzuphwdft%22%7D%2C+%7B%22type%22%3A+%22title%22%2C+%22value%22%3A+%22one%3A+first+commit+to+review%22%7D%2C+%7B%22type%22%3A+%22testPlan%22%2C+%22value%22%3A+%22LOL%21++What+testing%3F%21%5Cn%5CnHaha%21+yeah%2C+right.%22%7D%2C+%7B%22type%22%3A+%22summary%22%2C+%22value%22%3A+%22This+file+was+modified+with+%27mod1%27+as+its+contents.%5Cn%5Cntwo%3A+second+commit+to+review%5Cn%5CnThis+file+was+modified+with+%27mod2%27+as+its+contents.%5Cn%5Cn3%3A+a+commit+with+no+detailed+message%22%7D%5D%7D&output=json",
499 "uri": "https://phab.mercurial-scm.org//api/differential.revision.edit",
500 "method": "POST"
501 },
502 "response": {
503 "headers": {
504 "x-xss-protection": [
505 "1; mode=block"
506 ],
507 "strict-transport-security": [
508 "max-age=0; includeSubdomains; preload"
509 ],
510 "transfer-encoding": [
511 "chunked"
512 ],
513 "x-frame-options": [
514 "Deny"
515 ],
516 "expires": [
517 "Sat, 01 Jan 2000 00:00:00 GMT"
518 ],
519 "content-type": [
520 "application/json"
521 ],
522 "referrer-policy": [
523 "no-referrer"
524 ],
525 "server": [
526 "Apache/2.4.10 (Debian)"
527 ],
528 "cache-control": [
529 "no-store"
530 ],
531 "x-content-type-options": [
532 "nosniff"
533 ],
534 "date": [
535 "Wed, 08 Apr 2020 21:12:57 GMT"
536 ]
537 },
538 "body": {
539 "string": "{\"result\":{\"object\":{\"id\":8387,\"phid\":\"PHID-DREV-6ov3pvjim4txejzekw2t\"},\"transactions\":[{\"phid\":\"PHID-XACT-DREV-ypn7okwtaudnadw\"},{\"phid\":\"PHID-XACT-DREV-g2r45z4erxl56g4\"},{\"phid\":\"PHID-XACT-DREV-h6dgu3eetalcv72\"},{\"phid\":\"PHID-XACT-DREV-rl7yelqfeezlivr\"},{\"phid\":\"PHID-XACT-DREV-j7cpnfpbxxphsbp\"},{\"phid\":\"PHID-XACT-DREV-57vpcydiiiu4zu5\"},{\"phid\":\"PHID-XACT-DREV-dou37gk5rry34zv\"}]},\"error_code\":null,\"error_info\":null}"
540 },
541 "status": {
542 "code": 200,
543 "message": "OK"
544 }
545 }
546 },
547 {
548 "request": {
549 "headers": {
550 "content-length": [
551 "146"
552 ],
553 "accept": [
554 "application/mercurial-0.1"
555 ],
556 "content-type": [
557 "application/x-www-form-urlencoded"
558 ],
559 "host": [
560 "phab.mercurial-scm.org"
561 ],
562 "user-agent": [
563 "mercurial/proto-1.0 (Mercurial 5.3.2+463-d35fbae9dd33+20200408)"
564 ]
565 },
566 "body": "__conduit__=1&params=%7B%22__conduit__%22%3A+%7B%22token%22%3A+%22cli-hahayouwish%22%7D%2C+%22ids%22%3A+%5B8387%5D%7D&output=json",
567 "uri": "https://phab.mercurial-scm.org//api/differential.query",
568 "method": "POST"
569 },
570 "response": {
571 "headers": {
572 "x-xss-protection": [
573 "1; mode=block"
574 ],
575 "strict-transport-security": [
576 "max-age=0; includeSubdomains; preload"
577 ],
578 "transfer-encoding": [
579 "chunked"
580 ],
581 "x-frame-options": [
582 "Deny"
583 ],
584 "expires": [
585 "Sat, 01 Jan 2000 00:00:00 GMT"
586 ],
587 "content-type": [
588 "application/json"
589 ],
590 "referrer-policy": [
591 "no-referrer"
592 ],
593 "server": [
594 "Apache/2.4.10 (Debian)"
595 ],
596 "cache-control": [
597 "no-store"
598 ],
599 "x-content-type-options": [
600 "nosniff"
601 ],
602 "date": [
603 "Wed, 08 Apr 2020 21:12:58 GMT"
604 ]
605 },
606 "body": {
607 "string": "{\"result\":[{\"id\":\"8387\",\"phid\":\"PHID-DREV-6ov3pvjim4txejzekw2t\",\"title\":\"one: first commit to review\",\"uri\":\"https:\\/\\/phab.mercurial-scm.org\\/D8387\",\"dateCreated\":\"1586380377\",\"dateModified\":\"1586380377\",\"authorPHID\":\"PHID-USER-tzhaient733lwrlbcag5\",\"status\":\"0\",\"statusName\":\"Needs Review\",\"properties\":{\"draft.broadcast\":true,\"lines.added\":1,\"lines.removed\":1},\"branch\":\"default\",\"summary\":\"This file was modified with 'mod1' as its contents.\\n\\ntwo: second commit to review\\n\\nThis file was modified with 'mod2' as its contents.\\n\\n3: a commit with no detailed message\",\"testPlan\":\"LOL! What testing?!\\n\\nHaha! yeah, right.\",\"lineCount\":\"2\",\"activeDiffPHID\":\"PHID-DIFF-j6mteixl347wzuphwdft\",\"diffs\":[\"21006\"],\"commits\":[],\"reviewers\":{\"PHID-PROJ-3dvcxzznrjru2xmmses3\":\"PHID-PROJ-3dvcxzznrjru2xmmses3\"},\"ccs\":[\"PHID-USER-q42dn7cc3donqriafhjx\"],\"hashes\":[[\"hgcm\",\"\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\"],[\"hgcm\",\"\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\"],[\"hgcm\",\"\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\"]],\"auxiliary\":{\"phabricator:projects\":[],\"phabricator:depends-on\":[]},\"repositoryPHID\":\"PHID-REPO-bvunnehri4u2isyr7bc3\",\"sourcePath\":\"\\/\"}],\"error_code\":null,\"error_info\":null}"
608 },
609 "status": {
610 "code": 200,
611 "message": "OK"
612 }
613 }
614 },
615 {
616 "request": {
617 "headers": {
618 "content-length": [
619 "482"
620 ],
621 "accept": [
622 "application/mercurial-0.1"
623 ],
624 "content-type": [
625 "application/x-www-form-urlencoded"
626 ],
627 "host": [
628 "phab.mercurial-scm.org"
629 ],
630 "user-agent": [
631 "mercurial/proto-1.0 (Mercurial 5.3.2+463-d35fbae9dd33+20200408)"
632 ]
633 },
634 "body": "__conduit__=1&params=%7B%22__conduit__%22%3A+%7B%22token%22%3A+%22cli-hahayouwish%22%7D%2C+%22data%22%3A+%22%7B%5C%22branch%5C%22%3A+%5C%22default%5C%22%2C+%5C%22date%5C%22%3A+%5C%220+0%5C%22%2C+%5C%22node%5C%22%3A+%5C%22921f8265efbd92e92bfa5d7a0e047908de9844a5%5C%22%2C+%5C%22parent%5C%22%3A+%5C%2298d480e0d494906d9758c44c622951b429afd862%5C%22%2C+%5C%22user%5C%22%3A+%5C%22test%5C%22%7D%22%2C+%22diff_id%22%3A+21006%2C+%22name%22%3A+%22hg%3Ameta%22%7D&output=json",
635 "uri": "https://phab.mercurial-scm.org//api/differential.setdiffproperty",
636 "method": "POST"
637 },
638 "response": {
639 "headers": {
640 "x-xss-protection": [
641 "1; mode=block"
642 ],
643 "strict-transport-security": [
644 "max-age=0; includeSubdomains; preload"
645 ],
646 "transfer-encoding": [
647 "chunked"
648 ],
649 "x-frame-options": [
650 "Deny"
651 ],
652 "expires": [
653 "Sat, 01 Jan 2000 00:00:00 GMT"
654 ],
655 "content-type": [
656 "application/json"
657 ],
658 "referrer-policy": [
659 "no-referrer"
660 ],
661 "server": [
662 "Apache/2.4.10 (Debian)"
663 ],
664 "cache-control": [
665 "no-store"
666 ],
667 "x-content-type-options": [
668 "nosniff"
669 ],
670 "date": [
671 "Wed, 08 Apr 2020 21:12:58 GMT"
672 ]
673 },
674 "body": {
675 "string": "{\"result\":null,\"error_code\":null,\"error_info\":null}"
676 },
677 "status": {
678 "code": 200,
679 "message": "OK"
680 }
681 }
682 },
683 {
684 "request": {
685 "headers": {
686 "content-length": [
687 "1362"
688 ],
689 "accept": [
690 "application/mercurial-0.1"
691 ],
692 "content-type": [
693 "application/x-www-form-urlencoded"
694 ],
695 "host": [
696 "phab.mercurial-scm.org"
697 ],
698 "user-agent": [
699 "mercurial/proto-1.0 (Mercurial 5.3.2+463-d35fbae9dd33+20200408)"
700 ]
701 },
702 "body": "__conduit__=1&params=%7B%22__conduit__%22%3A+%7B%22token%22%3A+%22cli-hahayouwish%22%7D%2C+%22data%22%3A+%22%7B%5C%22602c4e7382436988e46c0d56fb3883968302b3f6%5C%22%3A+%7B%5C%22author%5C%22%3A+%5C%22test%5C%22%2C+%5C%22authorEmail%5C%22%3A+%5C%22test%5C%22%2C+%5C%22branch%5C%22%3A+%5C%22default%5C%22%2C+%5C%22commit%5C%22%3A+%5C%22602c4e7382436988e46c0d56fb3883968302b3f6%5C%22%2C+%5C%22parents%5C%22%3A+%5B%5C%2298d480e0d494906d9758c44c622951b429afd862%5C%22%5D%2C+%5C%22time%5C%22%3A+0%7D%2C+%5C%22832553266fe8c3330d968e6987df4ae793483b2b%5C%22%3A+%7B%5C%22author%5C%22%3A+%5C%22test%5C%22%2C+%5C%22authorEmail%5C%22%3A+%5C%22test%5C%22%2C+%5C%22branch%5C%22%3A+%5C%22default%5C%22%2C+%5C%22commit%5C%22%3A+%5C%22832553266fe8c3330d968e6987df4ae793483b2b%5C%22%2C+%5C%22parents%5C%22%3A+%5B%5C%22602c4e7382436988e46c0d56fb3883968302b3f6%5C%22%5D%2C+%5C%22time%5C%22%3A+0%7D%2C+%5C%22921f8265efbd92e92bfa5d7a0e047908de9844a5%5C%22%3A+%7B%5C%22author%5C%22%3A+%5C%22test%5C%22%2C+%5C%22authorEmail%5C%22%3A+%5C%22test%5C%22%2C+%5C%22branch%5C%22%3A+%5C%22default%5C%22%2C+%5C%22commit%5C%22%3A+%5C%22921f8265efbd92e92bfa5d7a0e047908de9844a5%5C%22%2C+%5C%22parents%5C%22%3A+%5B%5C%22832553266fe8c3330d968e6987df4ae793483b2b%5C%22%5D%2C+%5C%22time%5C%22%3A+0%7D%7D%22%2C+%22diff_id%22%3A+21006%2C+%22name%22%3A+%22local%3Acommits%22%7D&output=json",
703 "uri": "https://phab.mercurial-scm.org//api/differential.setdiffproperty",
704 "method": "POST"
705 },
706 "response": {
707 "headers": {
708 "x-xss-protection": [
709 "1; mode=block"
710 ],
711 "strict-transport-security": [
712 "max-age=0; includeSubdomains; preload"
713 ],
714 "transfer-encoding": [
715 "chunked"
716 ],
717 "x-frame-options": [
718 "Deny"
719 ],
720 "expires": [
721 "Sat, 01 Jan 2000 00:00:00 GMT"
722 ],
723 "content-type": [
724 "application/json"
725 ],
726 "referrer-policy": [
727 "no-referrer"
728 ],
729 "server": [
730 "Apache/2.4.10 (Debian)"
731 ],
732 "cache-control": [
733 "no-store"
734 ],
735 "x-content-type-options": [
736 "nosniff"
737 ],
738 "date": [
739 "Wed, 08 Apr 2020 21:12:59 GMT"
740 ]
741 },
742 "body": {
743 "string": "{\"result\":null,\"error_code\":null,\"error_info\":null}"
744 },
745 "status": {
746 "code": 200,
747 "message": "OK"
748 }
749 }
750 }
751 ],
752 "version": 1
753 } No newline at end of file
This diff has been collapsed as it changes many lines, (685 lines changed) Show them Hide them
@@ -0,0 +1,685 b''
1 {
2 "interactions": [
3 {
4 "request": {
5 "headers": {
6 "content-length": [
7 "170"
8 ],
9 "accept": [
10 "application/mercurial-0.1"
11 ],
12 "content-type": [
13 "application/x-www-form-urlencoded"
14 ],
15 "host": [
16 "phab.mercurial-scm.org"
17 ],
18 "user-agent": [
19 "mercurial/proto-1.0 (Mercurial 5.3.2+463-d35fbae9dd33+20200408)"
20 ]
21 },
22 "body": "__conduit__=1&params=%7B%22__conduit__%22%3A+%7B%22token%22%3A+%22cli-hahayouwish%22%7D%2C+%22revisionIDs%22%3A+%5B8387%2C+8387%2C+8387%5D%7D&output=json",
23 "uri": "https://phab.mercurial-scm.org//api/differential.querydiffs",
24 "method": "POST"
25 },
26 "response": {
27 "headers": {
28 "x-xss-protection": [
29 "1; mode=block"
30 ],
31 "strict-transport-security": [
32 "max-age=0; includeSubdomains; preload"
33 ],
34 "transfer-encoding": [
35 "chunked"
36 ],
37 "x-frame-options": [
38 "Deny"
39 ],
40 "expires": [
41 "Sat, 01 Jan 2000 00:00:00 GMT"
42 ],
43 "content-type": [
44 "application/json"
45 ],
46 "referrer-policy": [
47 "no-referrer"
48 ],
49 "server": [
50 "Apache/2.4.10 (Debian)"
51 ],
52 "cache-control": [
53 "no-store"
54 ],
55 "x-content-type-options": [
56 "nosniff"
57 ],
58 "date": [
59 "Wed, 08 Apr 2020 21:13:08 GMT"
60 ]
61 },
62 "body": {
63 "string": "{\"result\":{\"21007\":{\"id\":\"21007\",\"revisionID\":\"8387\",\"dateCreated\":\"1586380382\",\"dateModified\":\"1586380385\",\"sourceControlBaseRevision\":\"98d480e0d494906d9758c44c622951b429afd862\",\"sourceControlPath\":\"\\/\",\"sourceControlSystem\":\"hg\",\"branch\":\"default\",\"bookmark\":null,\"creationMethod\":\"phabsend\",\"description\":null,\"unitStatus\":\"0\",\"lintStatus\":\"0\",\"changes\":[{\"id\":\"56825\",\"metadata\":{\"line:first\":1,\"hash.effect\":\"yXvxVg6uibwd\"},\"oldPath\":null,\"currentPath\":\"file2.txt\",\"awayPaths\":[],\"oldProperties\":[],\"newProperties\":{\"unix:filemode\":\"100644\"},\"type\":\"1\",\"fileType\":\"1\",\"commitHash\":null,\"addLines\":\"1\",\"delLines\":\"0\",\"hunks\":[{\"oldOffset\":\"0\",\"newOffset\":\"1\",\"oldLength\":\"0\",\"newLength\":\"1\",\"addLines\":null,\"delLines\":null,\"isMissingOldNewline\":null,\"isMissingNewNewline\":null,\"corpus\":\"+modified\\n\"}]},{\"id\":\"56824\",\"metadata\":{\"line:first\":1,\"hash.effect\":\"cAKuVP31KNrx\"},\"oldPath\":\"file.txt\",\"currentPath\":\"file.txt\",\"awayPaths\":[],\"oldProperties\":[],\"newProperties\":[],\"type\":\"2\",\"fileType\":\"1\",\"commitHash\":null,\"addLines\":\"1\",\"delLines\":\"1\",\"hunks\":[{\"oldOffset\":\"1\",\"newOffset\":\"1\",\"oldLength\":\"1\",\"newLength\":\"1\",\"addLines\":null,\"delLines\":null,\"isMissingOldNewline\":null,\"isMissingNewNewline\":null,\"corpus\":\"-added\\n+mod3\\n\"}]}],\"properties\":{\"hg:meta\":{\"branch\":\"default\",\"date\":\"0 0\",\"node\":\"e4edb1fe3565eaaecc1787ada4fcc2b7e9018fac\",\"parent\":\"98d480e0d494906d9758c44c622951b429afd862\",\"user\":\"test\"},\"local:commits\":{\"0124e5474c880e4fb40c8326ad2b75ae3e57ee5f\":{\"author\":\"test\",\"authorEmail\":\"test\",\"branch\":\"default\",\"commit\":\"0124e5474c880e4fb40c8326ad2b75ae3e57ee5f\",\"parents\":[\"602c4e7382436988e46c0d56fb3883968302b3f6\"],\"time\":0},\"602c4e7382436988e46c0d56fb3883968302b3f6\":{\"author\":\"test\",\"authorEmail\":\"test\",\"branch\":\"default\",\"commit\":\"602c4e7382436988e46c0d56fb3883968302b3f6\",\"parents\":[\"98d480e0d494906d9758c44c622951b429afd862\"],\"time\":0},\"e4edb1fe3565eaaecc1787ada4fcc2b7e9018fac\":{\"author\":\"test\",\"authorEmail\":\"test\",\"branch\":\"default\",\"commit\":\"e4edb1fe3565eaaecc1787ada4fcc2b7e9018fac\",\"parents\":[\"0124e5474c880e4fb40c8326ad2b75ae3e57ee5f\"],\"time\":0}}},\"authorName\":\"test\",\"authorEmail\":\"test\"},\"21006\":{\"id\":\"21006\",\"revisionID\":\"8387\",\"dateCreated\":\"1586380375\",\"dateModified\":\"1586380377\",\"sourceControlBaseRevision\":\"98d480e0d494906d9758c44c622951b429afd862\",\"sourceControlPath\":\"\\/\",\"sourceControlSystem\":\"hg\",\"branch\":\"default\",\"bookmark\":null,\"creationMethod\":\"phabsend\",\"description\":null,\"unitStatus\":\"0\",\"lintStatus\":\"0\",\"changes\":[{\"id\":\"56823\",\"metadata\":{\"line:first\":1,\"hash.effect\":\"cAKuVP31KNrx\"},\"oldPath\":\"file.txt\",\"currentPath\":\"file.txt\",\"awayPaths\":[],\"oldProperties\":[],\"newProperties\":[],\"type\":\"2\",\"fileType\":\"1\",\"commitHash\":null,\"addLines\":\"1\",\"delLines\":\"1\",\"hunks\":[{\"oldOffset\":\"1\",\"newOffset\":\"1\",\"oldLength\":\"1\",\"newLength\":\"1\",\"addLines\":null,\"delLines\":null,\"isMissingOldNewline\":null,\"isMissingNewNewline\":null,\"corpus\":\"-added\\n+mod3\\n\"}]}],\"properties\":{\"hg:meta\":{\"branch\":\"default\",\"date\":\"0 0\",\"node\":\"921f8265efbd92e92bfa5d7a0e047908de9844a5\",\"parent\":\"98d480e0d494906d9758c44c622951b429afd862\",\"user\":\"test\"},\"local:commits\":{\"602c4e7382436988e46c0d56fb3883968302b3f6\":{\"author\":\"test\",\"authorEmail\":\"test\",\"branch\":\"default\",\"commit\":\"602c4e7382436988e46c0d56fb3883968302b3f6\",\"parents\":[\"98d480e0d494906d9758c44c622951b429afd862\"],\"time\":0},\"832553266fe8c3330d968e6987df4ae793483b2b\":{\"author\":\"test\",\"authorEmail\":\"test\",\"branch\":\"default\",\"commit\":\"832553266fe8c3330d968e6987df4ae793483b2b\",\"parents\":[\"602c4e7382436988e46c0d56fb3883968302b3f6\"],\"time\":0},\"921f8265efbd92e92bfa5d7a0e047908de9844a5\":{\"author\":\"test\",\"authorEmail\":\"test\",\"branch\":\"default\",\"commit\":\"921f8265efbd92e92bfa5d7a0e047908de9844a5\",\"parents\":[\"832553266fe8c3330d968e6987df4ae793483b2b\"],\"time\":0}}},\"authorName\":\"test\",\"authorEmail\":\"test\"}},\"error_code\":null,\"error_info\":null}"
64 },
65 "status": {
66 "code": 200,
67 "message": "OK"
68 }
69 }
70 },
71 {
72 "request": {
73 "headers": {
74 "content-length": [
75 "183"
76 ],
77 "accept": [
78 "application/mercurial-0.1"
79 ],
80 "content-type": [
81 "application/x-www-form-urlencoded"
82 ],
83 "host": [
84 "phab.mercurial-scm.org"
85 ],
86 "user-agent": [
87 "mercurial/proto-1.0 (Mercurial 5.3.2+463-d35fbae9dd33+20200408)"
88 ]
89 },
90 "body": "__conduit__=1&params=%7B%22__conduit__%22%3A+%7B%22token%22%3A+%22cli-hahayouwish%22%7D%2C+%22constraints%22%3A+%7B%22callsigns%22%3A+%5B%22HG%22%5D%7D%7D&output=json",
91 "uri": "https://phab.mercurial-scm.org//api/diffusion.repository.search",
92 "method": "POST"
93 },
94 "response": {
95 "headers": {
96 "x-xss-protection": [
97 "1; mode=block"
98 ],
99 "strict-transport-security": [
100 "max-age=0; includeSubdomains; preload"
101 ],
102 "transfer-encoding": [
103 "chunked"
104 ],
105 "x-frame-options": [
106 "Deny"
107 ],
108 "expires": [
109 "Sat, 01 Jan 2000 00:00:00 GMT"
110 ],
111 "content-type": [
112 "application/json"
113 ],
114 "referrer-policy": [
115 "no-referrer"
116 ],
117 "server": [
118 "Apache/2.4.10 (Debian)"
119 ],
120 "cache-control": [
121 "no-store"
122 ],
123 "x-content-type-options": [
124 "nosniff"
125 ],
126 "date": [
127 "Wed, 08 Apr 2020 21:13:08 GMT"
128 ]
129 },
130 "body": {
131 "string": "{\"result\":{\"data\":[{\"id\":2,\"type\":\"REPO\",\"phid\":\"PHID-REPO-bvunnehri4u2isyr7bc3\",\"fields\":{\"name\":\"Mercurial\",\"vcs\":\"hg\",\"callsign\":\"HG\",\"shortName\":null,\"status\":\"active\",\"isImporting\":false,\"almanacServicePHID\":null,\"refRules\":{\"fetchRules\":[],\"trackRules\":[],\"permanentRefRules\":[]},\"spacePHID\":null,\"dateCreated\":1498761653,\"dateModified\":1500403184,\"policy\":{\"view\":\"public\",\"edit\":\"admin\",\"diffusion.push\":\"users\"}},\"attachments\":{}}],\"maps\":{},\"query\":{\"queryKey\":null},\"cursor\":{\"limit\":100,\"after\":null,\"before\":null,\"order\":null}},\"error_code\":null,\"error_info\":null}"
132 },
133 "status": {
134 "code": 200,
135 "message": "OK"
136 }
137 }
138 },
139 {
140 "request": {
141 "headers": {
142 "content-length": [
143 "1736"
144 ],
145 "accept": [
146 "application/mercurial-0.1"
147 ],
148 "content-type": [
149 "application/x-www-form-urlencoded"
150 ],
151 "host": [
152 "phab.mercurial-scm.org"
153 ],
154 "user-agent": [
155 "mercurial/proto-1.0 (Mercurial 5.3.2+463-d35fbae9dd33+20200408)"
156 ]
157 },
158 "body": "__conduit__=1&params=%7B%22__conduit__%22%3A+%7B%22token%22%3A+%22cli-hahayouwish%22%7D%2C+%22bookmark%22%3A+null%2C+%22branch%22%3A+%22default%22%2C+%22changes%22%3A+%7B%22file.txt%22%3A+%7B%22addLines%22%3A+1%2C+%22awayPaths%22%3A+%5B%5D%2C+%22commitHash%22%3A+null%2C+%22currentPath%22%3A+%22file.txt%22%2C+%22delLines%22%3A+1%2C+%22fileType%22%3A+1%2C+%22hunks%22%3A+%5B%7B%22addLines%22%3A+1%2C+%22corpus%22%3A+%22-added%5Cn%2Bmod3%5Cn%22%2C+%22delLines%22%3A+1%2C+%22newLength%22%3A+1%2C+%22newOffset%22%3A+1%2C+%22oldLength%22%3A+1%2C+%22oldOffset%22%3A+1%7D%5D%2C+%22metadata%22%3A+%7B%7D%2C+%22newProperties%22%3A+%7B%7D%2C+%22oldPath%22%3A+%22file.txt%22%2C+%22oldProperties%22%3A+%7B%7D%2C+%22type%22%3A+2%7D%2C+%22file2.txt%22%3A+%7B%22addLines%22%3A+1%2C+%22awayPaths%22%3A+%5B%5D%2C+%22commitHash%22%3A+null%2C+%22currentPath%22%3A+%22file2.txt%22%2C+%22delLines%22%3A+0%2C+%22fileType%22%3A+1%2C+%22hunks%22%3A+%5B%7B%22addLines%22%3A+1%2C+%22corpus%22%3A+%22%2Bmodified%5Cn%22%2C+%22delLines%22%3A+0%2C+%22newLength%22%3A+1%2C+%22newOffset%22%3A+1%2C+%22oldLength%22%3A+0%2C+%22oldOffset%22%3A+0%7D%5D%2C+%22metadata%22%3A+%7B%7D%2C+%22newProperties%22%3A+%7B%22unix%3Afilemode%22%3A+%22100644%22%7D%2C+%22oldPath%22%3A+null%2C+%22oldProperties%22%3A+%7B%7D%2C+%22type%22%3A+1%7D%7D%2C+%22creationMethod%22%3A+%22phabsend%22%2C+%22lintStatus%22%3A+%22none%22%2C+%22repositoryPHID%22%3A+%22PHID-REPO-bvunnehri4u2isyr7bc3%22%2C+%22sourceControlBaseRevision%22%3A+%2298d480e0d494906d9758c44c622951b429afd862%22%2C+%22sourceControlPath%22%3A+%22%2F%22%2C+%22sourceControlSystem%22%3A+%22hg%22%2C+%22sourceMachine%22%3A+%22%22%2C+%22sourcePath%22%3A+%22%2F%22%2C+%22unitStatus%22%3A+%22none%22%7D&output=json",
159 "uri": "https://phab.mercurial-scm.org//api/differential.creatediff",
160 "method": "POST"
161 },
162 "response": {
163 "headers": {
164 "x-xss-protection": [
165 "1; mode=block"
166 ],
167 "strict-transport-security": [
168 "max-age=0; includeSubdomains; preload"
169 ],
170 "transfer-encoding": [
171 "chunked"
172 ],
173 "x-frame-options": [
174 "Deny"
175 ],
176 "expires": [
177 "Sat, 01 Jan 2000 00:00:00 GMT"
178 ],
179 "content-type": [
180 "application/json"
181 ],
182 "referrer-policy": [
183 "no-referrer"
184 ],
185 "server": [
186 "Apache/2.4.10 (Debian)"
187 ],
188 "cache-control": [
189 "no-store"
190 ],
191 "x-content-type-options": [
192 "nosniff"
193 ],
194 "date": [
195 "Wed, 08 Apr 2020 21:13:08 GMT"
196 ]
197 },
198 "body": {
199 "string": "{\"result\":{\"diffid\":21008,\"phid\":\"PHID-DIFF-wwqrxqimkcomhphpy4fb\",\"uri\":\"https:\\/\\/phab.mercurial-scm.org\\/differential\\/diff\\/21008\\/\"},\"error_code\":null,\"error_info\":null}"
200 },
201 "status": {
202 "code": 200,
203 "message": "OK"
204 }
205 }
206 },
207 {
208 "request": {
209 "headers": {
210 "content-length": [
211 "482"
212 ],
213 "accept": [
214 "application/mercurial-0.1"
215 ],
216 "content-type": [
217 "application/x-www-form-urlencoded"
218 ],
219 "host": [
220 "phab.mercurial-scm.org"
221 ],
222 "user-agent": [
223 "mercurial/proto-1.0 (Mercurial 5.3.2+463-d35fbae9dd33+20200408)"
224 ]
225 },
226 "body": "__conduit__=1&params=%7B%22__conduit__%22%3A+%7B%22token%22%3A+%22cli-hahayouwish%22%7D%2C+%22data%22%3A+%22%7B%5C%22branch%5C%22%3A+%5C%22default%5C%22%2C+%5C%22date%5C%22%3A+%5C%220+0%5C%22%2C+%5C%22node%5C%22%3A+%5C%22e4edb1fe3565eaaecc1787ada4fcc2b7e9018fac%5C%22%2C+%5C%22parent%5C%22%3A+%5C%2298d480e0d494906d9758c44c622951b429afd862%5C%22%2C+%5C%22user%5C%22%3A+%5C%22test%5C%22%7D%22%2C+%22diff_id%22%3A+21008%2C+%22name%22%3A+%22hg%3Ameta%22%7D&output=json",
227 "uri": "https://phab.mercurial-scm.org//api/differential.setdiffproperty",
228 "method": "POST"
229 },
230 "response": {
231 "headers": {
232 "x-xss-protection": [
233 "1; mode=block"
234 ],
235 "strict-transport-security": [
236 "max-age=0; includeSubdomains; preload"
237 ],
238 "transfer-encoding": [
239 "chunked"
240 ],
241 "x-frame-options": [
242 "Deny"
243 ],
244 "expires": [
245 "Sat, 01 Jan 2000 00:00:00 GMT"
246 ],
247 "content-type": [
248 "application/json"
249 ],
250 "referrer-policy": [
251 "no-referrer"
252 ],
253 "server": [
254 "Apache/2.4.10 (Debian)"
255 ],
256 "cache-control": [
257 "no-store"
258 ],
259 "x-content-type-options": [
260 "nosniff"
261 ],
262 "date": [
263 "Wed, 08 Apr 2020 21:13:09 GMT"
264 ]
265 },
266 "body": {
267 "string": "{\"result\":null,\"error_code\":null,\"error_info\":null}"
268 },
269 "status": {
270 "code": 200,
271 "message": "OK"
272 }
273 }
274 },
275 {
276 "request": {
277 "headers": {
278 "content-length": [
279 "1362"
280 ],
281 "accept": [
282 "application/mercurial-0.1"
283 ],
284 "content-type": [
285 "application/x-www-form-urlencoded"
286 ],
287 "host": [
288 "phab.mercurial-scm.org"
289 ],
290 "user-agent": [
291 "mercurial/proto-1.0 (Mercurial 5.3.2+463-d35fbae9dd33+20200408)"
292 ]
293 },
294 "body": "__conduit__=1&params=%7B%22__conduit__%22%3A+%7B%22token%22%3A+%22cli-hahayouwish%22%7D%2C+%22data%22%3A+%22%7B%5C%220124e5474c880e4fb40c8326ad2b75ae3e57ee5f%5C%22%3A+%7B%5C%22author%5C%22%3A+%5C%22test%5C%22%2C+%5C%22authorEmail%5C%22%3A+%5C%22test%5C%22%2C+%5C%22branch%5C%22%3A+%5C%22default%5C%22%2C+%5C%22commit%5C%22%3A+%5C%220124e5474c880e4fb40c8326ad2b75ae3e57ee5f%5C%22%2C+%5C%22parents%5C%22%3A+%5B%5C%22602c4e7382436988e46c0d56fb3883968302b3f6%5C%22%5D%2C+%5C%22time%5C%22%3A+0%7D%2C+%5C%22602c4e7382436988e46c0d56fb3883968302b3f6%5C%22%3A+%7B%5C%22author%5C%22%3A+%5C%22test%5C%22%2C+%5C%22authorEmail%5C%22%3A+%5C%22test%5C%22%2C+%5C%22branch%5C%22%3A+%5C%22default%5C%22%2C+%5C%22commit%5C%22%3A+%5C%22602c4e7382436988e46c0d56fb3883968302b3f6%5C%22%2C+%5C%22parents%5C%22%3A+%5B%5C%2298d480e0d494906d9758c44c622951b429afd862%5C%22%5D%2C+%5C%22time%5C%22%3A+0%7D%2C+%5C%22e4edb1fe3565eaaecc1787ada4fcc2b7e9018fac%5C%22%3A+%7B%5C%22author%5C%22%3A+%5C%22test%5C%22%2C+%5C%22authorEmail%5C%22%3A+%5C%22test%5C%22%2C+%5C%22branch%5C%22%3A+%5C%22default%5C%22%2C+%5C%22commit%5C%22%3A+%5C%22e4edb1fe3565eaaecc1787ada4fcc2b7e9018fac%5C%22%2C+%5C%22parents%5C%22%3A+%5B%5C%220124e5474c880e4fb40c8326ad2b75ae3e57ee5f%5C%22%5D%2C+%5C%22time%5C%22%3A+0%7D%7D%22%2C+%22diff_id%22%3A+21008%2C+%22name%22%3A+%22local%3Acommits%22%7D&output=json",
295 "uri": "https://phab.mercurial-scm.org//api/differential.setdiffproperty",
296 "method": "POST"
297 },
298 "response": {
299 "headers": {
300 "x-xss-protection": [
301 "1; mode=block"
302 ],
303 "strict-transport-security": [
304 "max-age=0; includeSubdomains; preload"
305 ],
306 "transfer-encoding": [
307 "chunked"
308 ],
309 "x-frame-options": [
310 "Deny"
311 ],
312 "expires": [
313 "Sat, 01 Jan 2000 00:00:00 GMT"
314 ],
315 "content-type": [
316 "application/json"
317 ],
318 "referrer-policy": [
319 "no-referrer"
320 ],
321 "server": [
322 "Apache/2.4.10 (Debian)"
323 ],
324 "cache-control": [
325 "no-store"
326 ],
327 "x-content-type-options": [
328 "nosniff"
329 ],
330 "date": [
331 "Wed, 08 Apr 2020 21:13:09 GMT"
332 ]
333 },
334 "body": {
335 "string": "{\"result\":null,\"error_code\":null,\"error_info\":null}"
336 },
337 "status": {
338 "code": 200,
339 "message": "OK"
340 }
341 }
342 },
343 {
344 "request": {
345 "headers": {
346 "content-length": [
347 "364"
348 ],
349 "accept": [
350 "application/mercurial-0.1"
351 ],
352 "content-type": [
353 "application/x-www-form-urlencoded"
354 ],
355 "host": [
356 "phab.mercurial-scm.org"
357 ],
358 "user-agent": [
359 "mercurial/proto-1.0 (Mercurial 5.3.2+463-d35fbae9dd33+20200408)"
360 ]
361 },
362 "body": "__conduit__=1&params=%7B%22__conduit__%22%3A+%7B%22token%22%3A+%22cli-hahayouwish%22%7D%2C+%22corpus%22%3A+%22one%3A+first+commit+to+review%5Cn%5CnThis+file+was+modified+with+%27mod1%27+as+its+contents.%5Cn%5CnTest+Plan%3A%5CnLOL%21++What+testing%3F%21%5Cn%5CnDifferential+Revision%3A+https%3A%2F%2Fphab.mercurial-scm.org%2FD8387%22%7D&output=json",
363 "uri": "https://phab.mercurial-scm.org//api/differential.parsecommitmessage",
364 "method": "POST"
365 },
366 "response": {
367 "headers": {
368 "x-xss-protection": [
369 "1; mode=block"
370 ],
371 "strict-transport-security": [
372 "max-age=0; includeSubdomains; preload"
373 ],
374 "transfer-encoding": [
375 "chunked"
376 ],
377 "x-frame-options": [
378 "Deny"
379 ],
380 "expires": [
381 "Sat, 01 Jan 2000 00:00:00 GMT"
382 ],
383 "content-type": [
384 "application/json"
385 ],
386 "referrer-policy": [
387 "no-referrer"
388 ],
389 "server": [
390 "Apache/2.4.10 (Debian)"
391 ],
392 "cache-control": [
393 "no-store"
394 ],
395 "x-content-type-options": [
396 "nosniff"
397 ],
398 "date": [
399 "Wed, 08 Apr 2020 21:13:10 GMT"
400 ]
401 },
402 "body": {
403 "string": "{\"result\":{\"errors\":[],\"fields\":{\"title\":\"one: first commit to review\",\"testPlan\":\"LOL! What testing?!\",\"revisionID\":8387,\"summary\":\"This file was modified with 'mod1' as its contents.\"},\"revisionIDFieldInfo\":{\"value\":8387,\"validDomain\":\"https:\\/\\/phab.mercurial-scm.org\"},\"transactions\":[{\"type\":\"title\",\"value\":\"one: first commit to review\"},{\"type\":\"testPlan\",\"value\":\"LOL! What testing?!\"},{\"type\":\"summary\",\"value\":\"This file was modified with 'mod1' as its contents.\"}]},\"error_code\":null,\"error_info\":null}"
404 },
405 "status": {
406 "code": 200,
407 "message": "OK"
408 }
409 }
410 },
411 {
412 "request": {
413 "headers": {
414 "content-length": [
415 "361"
416 ],
417 "accept": [
418 "application/mercurial-0.1"
419 ],
420 "content-type": [
421 "application/x-www-form-urlencoded"
422 ],
423 "host": [
424 "phab.mercurial-scm.org"
425 ],
426 "user-agent": [
427 "mercurial/proto-1.0 (Mercurial 5.3.2+463-d35fbae9dd33+20200408)"
428 ]
429 },
430 "body": "__conduit__=1&params=%7B%22__conduit__%22%3A+%7B%22token%22%3A+%22cli-hahayouwish%22%7D%2C+%22corpus%22%3A+%22two%3A+second+commit+to+review%5Cn%5CnThis+file+was+modified+with+%27mod2%27+as+its+contents.%5Cn%5CnTest+Plan%3A%5CnHaha%21+yeah%2C+right.%5Cn%5CnDifferential+Revision%3A+https%3A%2F%2Fphab.mercurial-scm.org%2FD8387%22%7D&output=json",
431 "uri": "https://phab.mercurial-scm.org//api/differential.parsecommitmessage",
432 "method": "POST"
433 },
434 "response": {
435 "headers": {
436 "x-xss-protection": [
437 "1; mode=block"
438 ],
439 "strict-transport-security": [
440 "max-age=0; includeSubdomains; preload"
441 ],
442 "transfer-encoding": [
443 "chunked"
444 ],
445 "x-frame-options": [
446 "Deny"
447 ],
448 "expires": [
449 "Sat, 01 Jan 2000 00:00:00 GMT"
450 ],
451 "content-type": [
452 "application/json"
453 ],
454 "referrer-policy": [
455 "no-referrer"
456 ],
457 "server": [
458 "Apache/2.4.10 (Debian)"
459 ],
460 "cache-control": [
461 "no-store"
462 ],
463 "x-content-type-options": [
464 "nosniff"
465 ],
466 "date": [
467 "Wed, 08 Apr 2020 21:13:10 GMT"
468 ]
469 },
470 "body": {
471 "string": "{\"result\":{\"errors\":[],\"fields\":{\"title\":\"two: second commit to review\",\"testPlan\":\"Haha! yeah, right.\",\"revisionID\":8387,\"summary\":\"This file was modified with 'mod2' as its contents.\"},\"revisionIDFieldInfo\":{\"value\":8387,\"validDomain\":\"https:\\/\\/phab.mercurial-scm.org\"},\"transactions\":[{\"type\":\"title\",\"value\":\"two: second commit to review\"},{\"type\":\"testPlan\",\"value\":\"Haha! yeah, right.\"},{\"type\":\"summary\",\"value\":\"This file was modified with 'mod2' as its contents.\"}]},\"error_code\":null,\"error_info\":null}"
472 },
473 "status": {
474 "code": 200,
475 "message": "OK"
476 }
477 }
478 },
479 {
480 "request": {
481 "headers": {
482 "content-length": [
483 "260"
484 ],
485 "accept": [
486 "application/mercurial-0.1"
487 ],
488 "content-type": [
489 "application/x-www-form-urlencoded"
490 ],
491 "host": [
492 "phab.mercurial-scm.org"
493 ],
494 "user-agent": [
495 "mercurial/proto-1.0 (Mercurial 5.3.2+463-d35fbae9dd33+20200408)"
496 ]
497 },
498 "body": "__conduit__=1&params=%7B%22__conduit__%22%3A+%7B%22token%22%3A+%22cli-hahayouwish%22%7D%2C+%22corpus%22%3A+%223%3A+a+commit+with+no+detailed+message%5Cn%5CnDifferential+Revision%3A+https%3A%2F%2Fphab.mercurial-scm.org%2FD8387%22%7D&output=json",
499 "uri": "https://phab.mercurial-scm.org//api/differential.parsecommitmessage",
500 "method": "POST"
501 },
502 "response": {
503 "headers": {
504 "x-xss-protection": [
505 "1; mode=block"
506 ],
507 "strict-transport-security": [
508 "max-age=0; includeSubdomains; preload"
509 ],
510 "transfer-encoding": [
511 "chunked"
512 ],
513 "x-frame-options": [
514 "Deny"
515 ],
516 "expires": [
517 "Sat, 01 Jan 2000 00:00:00 GMT"
518 ],
519 "content-type": [
520 "application/json"
521 ],
522 "referrer-policy": [
523 "no-referrer"
524 ],
525 "server": [
526 "Apache/2.4.10 (Debian)"
527 ],
528 "cache-control": [
529 "no-store"
530 ],
531 "x-content-type-options": [
532 "nosniff"
533 ],
534 "date": [
535 "Wed, 08 Apr 2020 21:13:11 GMT"
536 ]
537 },
538 "body": {
539 "string": "{\"result\":{\"errors\":[],\"fields\":{\"title\":\"3: a commit with no detailed message\",\"revisionID\":8387},\"revisionIDFieldInfo\":{\"value\":8387,\"validDomain\":\"https:\\/\\/phab.mercurial-scm.org\"},\"transactions\":[{\"type\":\"title\",\"value\":\"3: a commit with no detailed message\"}]},\"error_code\":null,\"error_info\":null}"
540 },
541 "status": {
542 "code": 200,
543 "message": "OK"
544 }
545 }
546 },
547 {
548 "request": {
549 "headers": {
550 "content-length": [
551 "744"
552 ],
553 "accept": [
554 "application/mercurial-0.1"
555 ],
556 "content-type": [
557 "application/x-www-form-urlencoded"
558 ],
559 "host": [
560 "phab.mercurial-scm.org"
561 ],
562 "user-agent": [
563 "mercurial/proto-1.0 (Mercurial 5.3.2+463-d35fbae9dd33+20200408)"
564 ]
565 },
566 "body": "__conduit__=1&params=%7B%22__conduit__%22%3A+%7B%22token%22%3A+%22cli-hahayouwish%22%7D%2C+%22objectIdentifier%22%3A+8387%2C+%22transactions%22%3A+%5B%7B%22type%22%3A+%22update%22%2C+%22value%22%3A+%22PHID-DIFF-wwqrxqimkcomhphpy4fb%22%7D%2C+%7B%22type%22%3A+%22title%22%2C+%22value%22%3A+%22one%3A+first+commit+to+review%22%7D%2C+%7B%22type%22%3A+%22testPlan%22%2C+%22value%22%3A+%22LOL%21++What+testing%3F%21%5Cn%5CnHaha%21+yeah%2C+right.%22%7D%2C+%7B%22type%22%3A+%22summary%22%2C+%22value%22%3A+%22This+file+was+modified+with+%27mod1%27+as+its+contents.%5Cn%5Cntwo%3A+second+commit+to+review%5Cn%5CnThis+file+was+modified+with+%27mod2%27+as+its+contents.%5Cn%5Cn3%3A+a+commit+with+no+detailed+message%22%7D%5D%7D&output=json",
567 "uri": "https://phab.mercurial-scm.org//api/differential.revision.edit",
568 "method": "POST"
569 },
570 "response": {
571 "headers": {
572 "x-xss-protection": [
573 "1; mode=block"
574 ],
575 "strict-transport-security": [
576 "max-age=0; includeSubdomains; preload"
577 ],
578 "transfer-encoding": [
579 "chunked"
580 ],
581 "x-frame-options": [
582 "Deny"
583 ],
584 "expires": [
585 "Sat, 01 Jan 2000 00:00:00 GMT"
586 ],
587 "content-type": [
588 "application/json"
589 ],
590 "referrer-policy": [
591 "no-referrer"
592 ],
593 "server": [
594 "Apache/2.4.10 (Debian)"
595 ],
596 "cache-control": [
597 "no-store"
598 ],
599 "x-content-type-options": [
600 "nosniff"
601 ],
602 "date": [
603 "Wed, 08 Apr 2020 21:13:11 GMT"
604 ]
605 },
606 "body": {
607 "string": "{\"result\":{\"object\":{\"id\":8387,\"phid\":\"PHID-DREV-6ov3pvjim4txejzekw2t\"},\"transactions\":[{\"phid\":\"PHID-XACT-DREV-yev5udwjourvj2j\"}]},\"error_code\":null,\"error_info\":null}"
608 },
609 "status": {
610 "code": 200,
611 "message": "OK"
612 }
613 }
614 },
615 {
616 "request": {
617 "headers": {
618 "content-length": [
619 "146"
620 ],
621 "accept": [
622 "application/mercurial-0.1"
623 ],
624 "content-type": [
625 "application/x-www-form-urlencoded"
626 ],
627 "host": [
628 "phab.mercurial-scm.org"
629 ],
630 "user-agent": [
631 "mercurial/proto-1.0 (Mercurial 5.3.2+463-d35fbae9dd33+20200408)"
632 ]
633 },
634 "body": "__conduit__=1&params=%7B%22__conduit__%22%3A+%7B%22token%22%3A+%22cli-hahayouwish%22%7D%2C+%22ids%22%3A+%5B8387%5D%7D&output=json",
635 "uri": "https://phab.mercurial-scm.org//api/differential.query",
636 "method": "POST"
637 },
638 "response": {
639 "headers": {
640 "x-xss-protection": [
641 "1; mode=block"
642 ],
643 "strict-transport-security": [
644 "max-age=0; includeSubdomains; preload"
645 ],
646 "transfer-encoding": [
647 "chunked"
648 ],
649 "x-frame-options": [
650 "Deny"
651 ],
652 "expires": [
653 "Sat, 01 Jan 2000 00:00:00 GMT"
654 ],
655 "content-type": [
656 "application/json"
657 ],
658 "referrer-policy": [
659 "no-referrer"
660 ],
661 "server": [
662 "Apache/2.4.10 (Debian)"
663 ],
664 "cache-control": [
665 "no-store"
666 ],
667 "x-content-type-options": [
668 "nosniff"
669 ],
670 "date": [
671 "Wed, 08 Apr 2020 21:13:12 GMT"
672 ]
673 },
674 "body": {
675 "string": "{\"result\":[{\"id\":\"8387\",\"phid\":\"PHID-DREV-6ov3pvjim4txejzekw2t\",\"title\":\"one: first commit to review\",\"uri\":\"https:\\/\\/phab.mercurial-scm.org\\/D8387\",\"dateCreated\":\"1586380377\",\"dateModified\":\"1586380391\",\"authorPHID\":\"PHID-USER-tzhaient733lwrlbcag5\",\"status\":\"0\",\"statusName\":\"Needs Review\",\"properties\":{\"draft.broadcast\":true,\"lines.added\":2,\"lines.removed\":1},\"branch\":\"default\",\"summary\":\"This file was modified with 'mod1' as its contents.\\n\\ntwo: second commit to review\\n\\nThis file was modified with 'mod2' as its contents.\\n\\n3: a commit with no detailed message\",\"testPlan\":\"LOL! What testing?!\\n\\nHaha! yeah, right.\",\"lineCount\":\"3\",\"activeDiffPHID\":\"PHID-DIFF-wwqrxqimkcomhphpy4fb\",\"diffs\":[\"21008\",\"21007\",\"21006\"],\"commits\":[],\"reviewers\":{\"PHID-PROJ-3dvcxzznrjru2xmmses3\":\"PHID-PROJ-3dvcxzznrjru2xmmses3\"},\"ccs\":[\"PHID-USER-q42dn7cc3donqriafhjx\"],\"hashes\":[[\"hgcm\",\"\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\"],[\"hgcm\",\"\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\"],[\"hgcm\",\"\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\"]],\"auxiliary\":{\"phabricator:projects\":[],\"phabricator:depends-on\":[]},\"repositoryPHID\":\"PHID-REPO-bvunnehri4u2isyr7bc3\",\"sourcePath\":\"\\/\"}],\"error_code\":null,\"error_info\":null}"
676 },
677 "status": {
678 "code": 200,
679 "message": "OK"
680 }
681 }
682 }
683 ],
684 "version": 1
685 } No newline at end of file
This diff has been collapsed as it changes many lines, (1028 lines changed) Show them Hide them
@@ -0,0 +1,1028 b''
1 {
2 "interactions": [
3 {
4 "request": {
5 "headers": {
6 "content-length": [
7 "194"
8 ],
9 "accept": [
10 "application/mercurial-0.1"
11 ],
12 "content-type": [
13 "application/x-www-form-urlencoded"
14 ],
15 "host": [
16 "phab.mercurial-scm.org"
17 ],
18 "user-agent": [
19 "mercurial/proto-1.0 (Mercurial 5.3.2+463-d35fbae9dd33+20200408)"
20 ]
21 },
22 "body": "__conduit__=1&params=%7B%22__conduit__%22%3A+%7B%22token%22%3A+%22cli-hahayouwish%22%7D%2C+%22revisionIDs%22%3A+%5B8388%2C+8388%2C+8388%2C+8388%2C+8388%2C+8388%5D%7D&output=json",
23 "uri": "https://phab.mercurial-scm.org//api/differential.querydiffs",
24 "method": "POST"
25 },
26 "response": {
27 "headers": {
28 "x-xss-protection": [
29 "1; mode=block"
30 ],
31 "strict-transport-security": [
32 "max-age=0; includeSubdomains; preload"
33 ],
34 "transfer-encoding": [
35 "chunked"
36 ],
37 "x-frame-options": [
38 "Deny"
39 ],
40 "expires": [
41 "Sat, 01 Jan 2000 00:00:00 GMT"
42 ],
43 "content-type": [
44 "application/json"
45 ],
46 "referrer-policy": [
47 "no-referrer"
48 ],
49 "server": [
50 "Apache/2.4.10 (Debian)"
51 ],
52 "cache-control": [
53 "no-store"
54 ],
55 "x-content-type-options": [
56 "nosniff"
57 ],
58 "date": [
59 "Wed, 08 Apr 2020 21:13:29 GMT"
60 ]
61 },
62 "body": {
63 "string": "{\"result\":{\"21010\":{\"id\":\"21010\",\"revisionID\":\"8388\",\"dateCreated\":\"1586380401\",\"dateModified\":\"1586380405\",\"sourceControlBaseRevision\":\"0000000000000000000000000000000000000000\",\"sourceControlPath\":\"\\/\",\"sourceControlSystem\":\"hg\",\"branch\":\"default\",\"bookmark\":null,\"creationMethod\":\"phabsend\",\"description\":null,\"unitStatus\":\"0\",\"lintStatus\":\"0\",\"changes\":[{\"id\":\"56831\",\"metadata\":{\"line:first\":1,\"hash.effect\":\"r1N4i770De9n\"},\"oldPath\":null,\"currentPath\":\"file2.txt\",\"awayPaths\":[],\"oldProperties\":[],\"newProperties\":{\"unix:filemode\":\"100644\"},\"type\":\"1\",\"fileType\":\"1\",\"commitHash\":null,\"addLines\":\"1\",\"delLines\":\"0\",\"hunks\":[{\"oldOffset\":\"0\",\"newOffset\":\"1\",\"oldLength\":\"0\",\"newLength\":\"1\",\"addLines\":null,\"delLines\":null,\"isMissingOldNewline\":null,\"isMissingNewNewline\":null,\"corpus\":\"+another mod\\n\"}]},{\"id\":\"56830\",\"metadata\":{\"line:first\":1,\"hash.effect\":\"cAKuVP31KNrx\"},\"oldPath\":null,\"currentPath\":\"file.txt\",\"awayPaths\":[],\"oldProperties\":[],\"newProperties\":{\"unix:filemode\":\"100644\"},\"type\":\"1\",\"fileType\":\"1\",\"commitHash\":null,\"addLines\":\"1\",\"delLines\":\"0\",\"hunks\":[{\"oldOffset\":\"0\",\"newOffset\":\"1\",\"oldLength\":\"0\",\"newLength\":\"1\",\"addLines\":null,\"delLines\":null,\"isMissingOldNewline\":null,\"isMissingNewNewline\":null,\"corpus\":\"+mod3\\n\"}]}],\"properties\":{\"hg:meta\":{\"branch\":\"default\",\"date\":\"0 0\",\"node\":\"ac7db67f0991021fb38d3cbf31f5d605e694d3a9\",\"parent\":\"0000000000000000000000000000000000000000\",\"user\":\"test\"},\"local:commits\":{\"15e9b14b4b4c37ccd18298d058a184068718765e\":{\"author\":\"test\",\"authorEmail\":\"test\",\"branch\":\"default\",\"commit\":\"15e9b14b4b4c37ccd18298d058a184068718765e\",\"parents\":[\"0000000000000000000000000000000000000000\"],\"time\":0},\"30682b960804bd91823ea5ccb5d6a7d999f8d1ea\":{\"author\":\"test\",\"authorEmail\":\"test\",\"branch\":\"default\",\"commit\":\"30682b960804bd91823ea5ccb5d6a7d999f8d1ea\",\"parents\":[\"3ee132d41dbc24bf5a4df3e97573d6e922446565\"],\"time\":0},\"3ee132d41dbc24bf5a4df3e97573d6e922446565\":{\"author\":\"test\",\"authorEmail\":\"test\",\"branch\":\"default\",\"commit\":\"3ee132d41dbc24bf5a4df3e97573d6e922446565\",\"parents\":[\"6320b7d714cf2b2b71370eafeae29e2988d07872\"],\"time\":0},\"6320b7d714cf2b2b71370eafeae29e2988d07872\":{\"author\":\"test\",\"authorEmail\":\"test\",\"branch\":\"default\",\"commit\":\"6320b7d714cf2b2b71370eafeae29e2988d07872\",\"parents\":[\"15e9b14b4b4c37ccd18298d058a184068718765e\"],\"time\":0},\"ac7db67f0991021fb38d3cbf31f5d605e694d3a9\":{\"author\":\"test\",\"authorEmail\":\"test\",\"branch\":\"default\",\"commit\":\"ac7db67f0991021fb38d3cbf31f5d605e694d3a9\",\"parents\":[\"30682b960804bd91823ea5ccb5d6a7d999f8d1ea\"],\"time\":0}}},\"authorName\":\"test\",\"authorEmail\":\"test\"}},\"error_code\":null,\"error_info\":null}"
64 },
65 "status": {
66 "code": 200,
67 "message": "OK"
68 }
69 }
70 },
71 {
72 "request": {
73 "headers": {
74 "content-length": [
75 "183"
76 ],
77 "accept": [
78 "application/mercurial-0.1"
79 ],
80 "content-type": [
81 "application/x-www-form-urlencoded"
82 ],
83 "host": [
84 "phab.mercurial-scm.org"
85 ],
86 "user-agent": [
87 "mercurial/proto-1.0 (Mercurial 5.3.2+463-d35fbae9dd33+20200408)"
88 ]
89 },
90 "body": "__conduit__=1&params=%7B%22__conduit__%22%3A+%7B%22token%22%3A+%22cli-hahayouwish%22%7D%2C+%22constraints%22%3A+%7B%22callsigns%22%3A+%5B%22HG%22%5D%7D%7D&output=json",
91 "uri": "https://phab.mercurial-scm.org//api/diffusion.repository.search",
92 "method": "POST"
93 },
94 "response": {
95 "headers": {
96 "x-xss-protection": [
97 "1; mode=block"
98 ],
99 "strict-transport-security": [
100 "max-age=0; includeSubdomains; preload"
101 ],
102 "transfer-encoding": [
103 "chunked"
104 ],
105 "x-frame-options": [
106 "Deny"
107 ],
108 "expires": [
109 "Sat, 01 Jan 2000 00:00:00 GMT"
110 ],
111 "content-type": [
112 "application/json"
113 ],
114 "referrer-policy": [
115 "no-referrer"
116 ],
117 "server": [
118 "Apache/2.4.10 (Debian)"
119 ],
120 "cache-control": [
121 "no-store"
122 ],
123 "x-content-type-options": [
124 "nosniff"
125 ],
126 "date": [
127 "Wed, 08 Apr 2020 21:13:29 GMT"
128 ]
129 },
130 "body": {
131 "string": "{\"result\":{\"data\":[{\"id\":2,\"type\":\"REPO\",\"phid\":\"PHID-REPO-bvunnehri4u2isyr7bc3\",\"fields\":{\"name\":\"Mercurial\",\"vcs\":\"hg\",\"callsign\":\"HG\",\"shortName\":null,\"status\":\"active\",\"isImporting\":false,\"almanacServicePHID\":null,\"refRules\":{\"fetchRules\":[],\"trackRules\":[],\"permanentRefRules\":[]},\"spacePHID\":null,\"dateCreated\":1498761653,\"dateModified\":1500403184,\"policy\":{\"view\":\"public\",\"edit\":\"admin\",\"diffusion.push\":\"users\"}},\"attachments\":{}}],\"maps\":{},\"query\":{\"queryKey\":null},\"cursor\":{\"limit\":100,\"after\":null,\"before\":null,\"order\":null}},\"error_code\":null,\"error_info\":null}"
132 },
133 "status": {
134 "code": 200,
135 "message": "OK"
136 }
137 }
138 },
139 {
140 "request": {
141 "headers": {
142 "content-length": [
143 "2327"
144 ],
145 "accept": [
146 "application/mercurial-0.1"
147 ],
148 "content-type": [
149 "application/x-www-form-urlencoded"
150 ],
151 "host": [
152 "phab.mercurial-scm.org"
153 ],
154 "user-agent": [
155 "mercurial/proto-1.0 (Mercurial 5.3.2+463-d35fbae9dd33+20200408)"
156 ]
157 },
158 "body": "__conduit__=1&params=%7B%22__conduit__%22%3A+%7B%22token%22%3A+%22cli-hahayouwish%22%7D%2C+%22bookmark%22%3A+null%2C+%22branch%22%3A+%22default%22%2C+%22changes%22%3A+%7B%22file.txt%22%3A+%7B%22addLines%22%3A+1%2C+%22awayPaths%22%3A+%5B%5D%2C+%22commitHash%22%3A+null%2C+%22currentPath%22%3A+%22file.txt%22%2C+%22delLines%22%3A+0%2C+%22fileType%22%3A+1%2C+%22hunks%22%3A+%5B%7B%22addLines%22%3A+1%2C+%22corpus%22%3A+%22%2Bmod3%5Cn%22%2C+%22delLines%22%3A+0%2C+%22newLength%22%3A+1%2C+%22newOffset%22%3A+1%2C+%22oldLength%22%3A+0%2C+%22oldOffset%22%3A+0%7D%5D%2C+%22metadata%22%3A+%7B%7D%2C+%22newProperties%22%3A+%7B%22unix%3Afilemode%22%3A+%22100644%22%7D%2C+%22oldPath%22%3A+null%2C+%22oldProperties%22%3A+%7B%7D%2C+%22type%22%3A+1%7D%2C+%22file2.txt%22%3A+%7B%22addLines%22%3A+1%2C+%22awayPaths%22%3A+%5B%5D%2C+%22commitHash%22%3A+null%2C+%22currentPath%22%3A+%22file2.txt%22%2C+%22delLines%22%3A+0%2C+%22fileType%22%3A+1%2C+%22hunks%22%3A+%5B%7B%22addLines%22%3A+1%2C+%22corpus%22%3A+%22%2Bamended+mod%5Cn%22%2C+%22delLines%22%3A+0%2C+%22newLength%22%3A+1%2C+%22newOffset%22%3A+1%2C+%22oldLength%22%3A+0%2C+%22oldOffset%22%3A+0%7D%5D%2C+%22metadata%22%3A+%7B%7D%2C+%22newProperties%22%3A+%7B%22unix%3Afilemode%22%3A+%22100644%22%7D%2C+%22oldPath%22%3A+null%2C+%22oldProperties%22%3A+%7B%7D%2C+%22type%22%3A+1%7D%2C+%22file3.txt%22%3A+%7B%22addLines%22%3A+1%2C+%22awayPaths%22%3A+%5B%5D%2C+%22commitHash%22%3A+null%2C+%22currentPath%22%3A+%22file3.txt%22%2C+%22delLines%22%3A+0%2C+%22fileType%22%3A+1%2C+%22hunks%22%3A+%5B%7B%22addLines%22%3A+1%2C+%22corpus%22%3A+%22%2Bfoo%5Cn%22%2C+%22delLines%22%3A+0%2C+%22newLength%22%3A+1%2C+%22newOffset%22%3A+1%2C+%22oldLength%22%3A+0%2C+%22oldOffset%22%3A+0%7D%5D%2C+%22metadata%22%3A+%7B%7D%2C+%22newProperties%22%3A+%7B%22unix%3Afilemode%22%3A+%22100644%22%7D%2C+%22oldPath%22%3A+null%2C+%22oldProperties%22%3A+%7B%7D%2C+%22type%22%3A+1%7D%7D%2C+%22creationMethod%22%3A+%22phabsend%22%2C+%22lintStatus%22%3A+%22none%22%2C+%22repositoryPHID%22%3A+%22PHID-REPO-bvunnehri4u2isyr7bc3%22%2C+%22sourceControlBaseRevision%22%3A+%220000000000000000000000000000000000000000%22%2C+%22sourceControlPath%22%3A+%22%2F%22%2C+%22sourceControlSystem%22%3A+%22hg%22%2C+%22sourceMachine%22%3A+%22%22%2C+%22sourcePath%22%3A+%22%2F%22%2C+%22unitStatus%22%3A+%22none%22%7D&output=json",
159 "uri": "https://phab.mercurial-scm.org//api/differential.creatediff",
160 "method": "POST"
161 },
162 "response": {
163 "headers": {
164 "x-xss-protection": [
165 "1; mode=block"
166 ],
167 "strict-transport-security": [
168 "max-age=0; includeSubdomains; preload"
169 ],
170 "transfer-encoding": [
171 "chunked"
172 ],
173 "x-frame-options": [
174 "Deny"
175 ],
176 "expires": [
177 "Sat, 01 Jan 2000 00:00:00 GMT"
178 ],
179 "content-type": [
180 "application/json"
181 ],
182 "referrer-policy": [
183 "no-referrer"
184 ],
185 "server": [
186 "Apache/2.4.10 (Debian)"
187 ],
188 "cache-control": [
189 "no-store"
190 ],
191 "x-content-type-options": [
192 "nosniff"
193 ],
194 "date": [
195 "Wed, 08 Apr 2020 21:13:30 GMT"
196 ]
197 },
198 "body": {
199 "string": "{\"result\":{\"diffid\":21011,\"phid\":\"PHID-DIFF-vyaqmcwywxowtnjrfkkw\",\"uri\":\"https:\\/\\/phab.mercurial-scm.org\\/differential\\/diff\\/21011\\/\"},\"error_code\":null,\"error_info\":null}"
200 },
201 "status": {
202 "code": 200,
203 "message": "OK"
204 }
205 }
206 },
207 {
208 "request": {
209 "headers": {
210 "content-length": [
211 "482"
212 ],
213 "accept": [
214 "application/mercurial-0.1"
215 ],
216 "content-type": [
217 "application/x-www-form-urlencoded"
218 ],
219 "host": [
220 "phab.mercurial-scm.org"
221 ],
222 "user-agent": [
223 "mercurial/proto-1.0 (Mercurial 5.3.2+463-d35fbae9dd33+20200408)"
224 ]
225 },
226 "body": "__conduit__=1&params=%7B%22__conduit__%22%3A+%7B%22token%22%3A+%22cli-hahayouwish%22%7D%2C+%22data%22%3A+%22%7B%5C%22branch%5C%22%3A+%5C%22default%5C%22%2C+%5C%22date%5C%22%3A+%5C%220+0%5C%22%2C+%5C%22node%5C%22%3A+%5C%22b50946d5e4901d7f7801d572342ef90d06a85a85%5C%22%2C+%5C%22parent%5C%22%3A+%5C%220000000000000000000000000000000000000000%5C%22%2C+%5C%22user%5C%22%3A+%5C%22test%5C%22%7D%22%2C+%22diff_id%22%3A+21011%2C+%22name%22%3A+%22hg%3Ameta%22%7D&output=json",
227 "uri": "https://phab.mercurial-scm.org//api/differential.setdiffproperty",
228 "method": "POST"
229 },
230 "response": {
231 "headers": {
232 "x-xss-protection": [
233 "1; mode=block"
234 ],
235 "strict-transport-security": [
236 "max-age=0; includeSubdomains; preload"
237 ],
238 "transfer-encoding": [
239 "chunked"
240 ],
241 "x-frame-options": [
242 "Deny"
243 ],
244 "expires": [
245 "Sat, 01 Jan 2000 00:00:00 GMT"
246 ],
247 "content-type": [
248 "application/json"
249 ],
250 "referrer-policy": [
251 "no-referrer"
252 ],
253 "server": [
254 "Apache/2.4.10 (Debian)"
255 ],
256 "cache-control": [
257 "no-store"
258 ],
259 "x-content-type-options": [
260 "nosniff"
261 ],
262 "date": [
263 "Wed, 08 Apr 2020 21:13:30 GMT"
264 ]
265 },
266 "body": {
267 "string": "{\"result\":null,\"error_code\":null,\"error_info\":null}"
268 },
269 "status": {
270 "code": 200,
271 "message": "OK"
272 }
273 }
274 },
275 {
276 "request": {
277 "headers": {
278 "content-length": [
279 "2514"
280 ],
281 "accept": [
282 "application/mercurial-0.1"
283 ],
284 "content-type": [
285 "application/x-www-form-urlencoded"
286 ],
287 "host": [
288 "phab.mercurial-scm.org"
289 ],
290 "user-agent": [
291 "mercurial/proto-1.0 (Mercurial 5.3.2+463-d35fbae9dd33+20200408)"
292 ]
293 },
294 "body": "__conduit__=1&params=%7B%22__conduit__%22%3A+%7B%22token%22%3A+%22cli-hahayouwish%22%7D%2C+%22data%22%3A+%22%7B%5C%2215e9b14b4b4c37ccd18298d058a184068718765e%5C%22%3A+%7B%5C%22author%5C%22%3A+%5C%22test%5C%22%2C+%5C%22authorEmail%5C%22%3A+%5C%22test%5C%22%2C+%5C%22branch%5C%22%3A+%5C%22default%5C%22%2C+%5C%22commit%5C%22%3A+%5C%2215e9b14b4b4c37ccd18298d058a184068718765e%5C%22%2C+%5C%22parents%5C%22%3A+%5B%5C%220000000000000000000000000000000000000000%5C%22%5D%2C+%5C%22time%5C%22%3A+0%7D%2C+%5C%2230682b960804bd91823ea5ccb5d6a7d999f8d1ea%5C%22%3A+%7B%5C%22author%5C%22%3A+%5C%22test%5C%22%2C+%5C%22authorEmail%5C%22%3A+%5C%22test%5C%22%2C+%5C%22branch%5C%22%3A+%5C%22default%5C%22%2C+%5C%22commit%5C%22%3A+%5C%2230682b960804bd91823ea5ccb5d6a7d999f8d1ea%5C%22%2C+%5C%22parents%5C%22%3A+%5B%5C%223ee132d41dbc24bf5a4df3e97573d6e922446565%5C%22%5D%2C+%5C%22time%5C%22%3A+0%7D%2C+%5C%223ee132d41dbc24bf5a4df3e97573d6e922446565%5C%22%3A+%7B%5C%22author%5C%22%3A+%5C%22test%5C%22%2C+%5C%22authorEmail%5C%22%3A+%5C%22test%5C%22%2C+%5C%22branch%5C%22%3A+%5C%22default%5C%22%2C+%5C%22commit%5C%22%3A+%5C%223ee132d41dbc24bf5a4df3e97573d6e922446565%5C%22%2C+%5C%22parents%5C%22%3A+%5B%5C%226320b7d714cf2b2b71370eafeae29e2988d07872%5C%22%5D%2C+%5C%22time%5C%22%3A+0%7D%2C+%5C%226320b7d714cf2b2b71370eafeae29e2988d07872%5C%22%3A+%7B%5C%22author%5C%22%3A+%5C%22test%5C%22%2C+%5C%22authorEmail%5C%22%3A+%5C%22test%5C%22%2C+%5C%22branch%5C%22%3A+%5C%22default%5C%22%2C+%5C%22commit%5C%22%3A+%5C%226320b7d714cf2b2b71370eafeae29e2988d07872%5C%22%2C+%5C%22parents%5C%22%3A+%5B%5C%2215e9b14b4b4c37ccd18298d058a184068718765e%5C%22%5D%2C+%5C%22time%5C%22%3A+0%7D%2C+%5C%226bc15dc99efd596be5908c187f68d6810671121e%5C%22%3A+%7B%5C%22author%5C%22%3A+%5C%22test%5C%22%2C+%5C%22authorEmail%5C%22%3A+%5C%22test%5C%22%2C+%5C%22branch%5C%22%3A+%5C%22default%5C%22%2C+%5C%22commit%5C%22%3A+%5C%226bc15dc99efd596be5908c187f68d6810671121e%5C%22%2C+%5C%22parents%5C%22%3A+%5B%5C%2230682b960804bd91823ea5ccb5d6a7d999f8d1ea%5C%22%5D%2C+%5C%22time%5C%22%3A+0%7D%2C+%5C%22b50946d5e4901d7f7801d572342ef90d06a85a85%5C%22%3A+%7B%5C%22author%5C%22%3A+%5C%22test%5C%22%2C+%5C%22authorEmail%5C%22%3A+%5C%22test%5C%22%2C+%5C%22branch%5C%22%3A+%5C%22default%5C%22%2C+%5C%22commit%5C%22%3A+%5C%22b50946d5e4901d7f7801d572342ef90d06a85a85%5C%22%2C+%5C%22parents%5C%22%3A+%5B%5C%226bc15dc99efd596be5908c187f68d6810671121e%5C%22%5D%2C+%5C%22time%5C%22%3A+0%7D%7D%22%2C+%22diff_id%22%3A+21011%2C+%22name%22%3A+%22local%3Acommits%22%7D&output=json",
295 "uri": "https://phab.mercurial-scm.org//api/differential.setdiffproperty",
296 "method": "POST"
297 },
298 "response": {
299 "headers": {
300 "x-xss-protection": [
301 "1; mode=block"
302 ],
303 "strict-transport-security": [
304 "max-age=0; includeSubdomains; preload"
305 ],
306 "transfer-encoding": [
307 "chunked"
308 ],
309 "x-frame-options": [
310 "Deny"
311 ],
312 "expires": [
313 "Sat, 01 Jan 2000 00:00:00 GMT"
314 ],
315 "content-type": [
316 "application/json"
317 ],
318 "referrer-policy": [
319 "no-referrer"
320 ],
321 "server": [
322 "Apache/2.4.10 (Debian)"
323 ],
324 "cache-control": [
325 "no-store"
326 ],
327 "x-content-type-options": [
328 "nosniff"
329 ],
330 "date": [
331 "Wed, 08 Apr 2020 21:13:30 GMT"
332 ]
333 },
334 "body": {
335 "string": "{\"result\":null,\"error_code\":null,\"error_info\":null}"
336 },
337 "status": {
338 "code": 200,
339 "message": "OK"
340 }
341 }
342 },
343 {
344 "request": {
345 "headers": {
346 "content-length": [
347 "232"
348 ],
349 "accept": [
350 "application/mercurial-0.1"
351 ],
352 "content-type": [
353 "application/x-www-form-urlencoded"
354 ],
355 "host": [
356 "phab.mercurial-scm.org"
357 ],
358 "user-agent": [
359 "mercurial/proto-1.0 (Mercurial 5.3.2+463-d35fbae9dd33+20200408)"
360 ]
361 },
362 "body": "__conduit__=1&params=%7B%22__conduit__%22%3A+%7B%22token%22%3A+%22cli-hahayouwish%22%7D%2C+%22corpus%22%3A+%22added+file%5Cn%5CnDifferential+Revision%3A+https%3A%2F%2Fphab.mercurial-scm.org%2FD8388%22%7D&output=json",
363 "uri": "https://phab.mercurial-scm.org//api/differential.parsecommitmessage",
364 "method": "POST"
365 },
366 "response": {
367 "headers": {
368 "x-xss-protection": [
369 "1; mode=block"
370 ],
371 "strict-transport-security": [
372 "max-age=0; includeSubdomains; preload"
373 ],
374 "transfer-encoding": [
375 "chunked"
376 ],
377 "x-frame-options": [
378 "Deny"
379 ],
380 "expires": [
381 "Sat, 01 Jan 2000 00:00:00 GMT"
382 ],
383 "content-type": [
384 "application/json"
385 ],
386 "referrer-policy": [
387 "no-referrer"
388 ],
389 "server": [
390 "Apache/2.4.10 (Debian)"
391 ],
392 "cache-control": [
393 "no-store"
394 ],
395 "x-content-type-options": [
396 "nosniff"
397 ],
398 "date": [
399 "Wed, 08 Apr 2020 21:13:31 GMT"
400 ]
401 },
402 "body": {
403 "string": "{\"result\":{\"errors\":[],\"fields\":{\"title\":\"added file\",\"revisionID\":8388},\"revisionIDFieldInfo\":{\"value\":8388,\"validDomain\":\"https:\\/\\/phab.mercurial-scm.org\"},\"transactions\":[{\"type\":\"title\",\"value\":\"added file\"}]},\"error_code\":null,\"error_info\":null}"
404 },
405 "status": {
406 "code": 200,
407 "message": "OK"
408 }
409 }
410 },
411 {
412 "request": {
413 "headers": {
414 "content-length": [
415 "364"
416 ],
417 "accept": [
418 "application/mercurial-0.1"
419 ],
420 "content-type": [
421 "application/x-www-form-urlencoded"
422 ],
423 "host": [
424 "phab.mercurial-scm.org"
425 ],
426 "user-agent": [
427 "mercurial/proto-1.0 (Mercurial 5.3.2+463-d35fbae9dd33+20200408)"
428 ]
429 },
430 "body": "__conduit__=1&params=%7B%22__conduit__%22%3A+%7B%22token%22%3A+%22cli-hahayouwish%22%7D%2C+%22corpus%22%3A+%22one%3A+first+commit+to+review%5Cn%5CnThis+file+was+modified+with+%27mod1%27+as+its+contents.%5Cn%5CnTest+Plan%3A%5CnLOL%21++What+testing%3F%21%5Cn%5CnDifferential+Revision%3A+https%3A%2F%2Fphab.mercurial-scm.org%2FD8388%22%7D&output=json",
431 "uri": "https://phab.mercurial-scm.org//api/differential.parsecommitmessage",
432 "method": "POST"
433 },
434 "response": {
435 "headers": {
436 "x-xss-protection": [
437 "1; mode=block"
438 ],
439 "strict-transport-security": [
440 "max-age=0; includeSubdomains; preload"
441 ],
442 "transfer-encoding": [
443 "chunked"
444 ],
445 "x-frame-options": [
446 "Deny"
447 ],
448 "expires": [
449 "Sat, 01 Jan 2000 00:00:00 GMT"
450 ],
451 "content-type": [
452 "application/json"
453 ],
454 "referrer-policy": [
455 "no-referrer"
456 ],
457 "server": [
458 "Apache/2.4.10 (Debian)"
459 ],
460 "cache-control": [
461 "no-store"
462 ],
463 "x-content-type-options": [
464 "nosniff"
465 ],
466 "date": [
467 "Wed, 08 Apr 2020 21:13:31 GMT"
468 ]
469 },
470 "body": {
471 "string": "{\"result\":{\"errors\":[],\"fields\":{\"title\":\"one: first commit to review\",\"testPlan\":\"LOL! What testing?!\",\"revisionID\":8388,\"summary\":\"This file was modified with 'mod1' as its contents.\"},\"revisionIDFieldInfo\":{\"value\":8388,\"validDomain\":\"https:\\/\\/phab.mercurial-scm.org\"},\"transactions\":[{\"type\":\"title\",\"value\":\"one: first commit to review\"},{\"type\":\"testPlan\",\"value\":\"LOL! What testing?!\"},{\"type\":\"summary\",\"value\":\"This file was modified with 'mod1' as its contents.\"}]},\"error_code\":null,\"error_info\":null}"
472 },
473 "status": {
474 "code": 200,
475 "message": "OK"
476 }
477 }
478 },
479 {
480 "request": {
481 "headers": {
482 "content-length": [
483 "361"
484 ],
485 "accept": [
486 "application/mercurial-0.1"
487 ],
488 "content-type": [
489 "application/x-www-form-urlencoded"
490 ],
491 "host": [
492 "phab.mercurial-scm.org"
493 ],
494 "user-agent": [
495 "mercurial/proto-1.0 (Mercurial 5.3.2+463-d35fbae9dd33+20200408)"
496 ]
497 },
498 "body": "__conduit__=1&params=%7B%22__conduit__%22%3A+%7B%22token%22%3A+%22cli-hahayouwish%22%7D%2C+%22corpus%22%3A+%22two%3A+second+commit+to+review%5Cn%5CnThis+file+was+modified+with+%27mod2%27+as+its+contents.%5Cn%5CnTest+Plan%3A%5CnHaha%21+yeah%2C+right.%5Cn%5CnDifferential+Revision%3A+https%3A%2F%2Fphab.mercurial-scm.org%2FD8388%22%7D&output=json",
499 "uri": "https://phab.mercurial-scm.org//api/differential.parsecommitmessage",
500 "method": "POST"
501 },
502 "response": {
503 "headers": {
504 "x-xss-protection": [
505 "1; mode=block"
506 ],
507 "strict-transport-security": [
508 "max-age=0; includeSubdomains; preload"
509 ],
510 "transfer-encoding": [
511 "chunked"
512 ],
513 "x-frame-options": [
514 "Deny"
515 ],
516 "expires": [
517 "Sat, 01 Jan 2000 00:00:00 GMT"
518 ],
519 "content-type": [
520 "application/json"
521 ],
522 "referrer-policy": [
523 "no-referrer"
524 ],
525 "server": [
526 "Apache/2.4.10 (Debian)"
527 ],
528 "cache-control": [
529 "no-store"
530 ],
531 "x-content-type-options": [
532 "nosniff"
533 ],
534 "date": [
535 "Wed, 08 Apr 2020 21:13:32 GMT"
536 ]
537 },
538 "body": {
539 "string": "{\"result\":{\"errors\":[],\"fields\":{\"title\":\"two: second commit to review\",\"testPlan\":\"Haha! yeah, right.\",\"revisionID\":8388,\"summary\":\"This file was modified with 'mod2' as its contents.\"},\"revisionIDFieldInfo\":{\"value\":8388,\"validDomain\":\"https:\\/\\/phab.mercurial-scm.org\"},\"transactions\":[{\"type\":\"title\",\"value\":\"two: second commit to review\"},{\"type\":\"testPlan\",\"value\":\"Haha! yeah, right.\"},{\"type\":\"summary\",\"value\":\"This file was modified with 'mod2' as its contents.\"}]},\"error_code\":null,\"error_info\":null}"
540 },
541 "status": {
542 "code": 200,
543 "message": "OK"
544 }
545 }
546 },
547 {
548 "request": {
549 "headers": {
550 "content-length": [
551 "260"
552 ],
553 "accept": [
554 "application/mercurial-0.1"
555 ],
556 "content-type": [
557 "application/x-www-form-urlencoded"
558 ],
559 "host": [
560 "phab.mercurial-scm.org"
561 ],
562 "user-agent": [
563 "mercurial/proto-1.0 (Mercurial 5.3.2+463-d35fbae9dd33+20200408)"
564 ]
565 },
566 "body": "__conduit__=1&params=%7B%22__conduit__%22%3A+%7B%22token%22%3A+%22cli-hahayouwish%22%7D%2C+%22corpus%22%3A+%223%3A+a+commit+with+no+detailed+message%5Cn%5CnDifferential+Revision%3A+https%3A%2F%2Fphab.mercurial-scm.org%2FD8388%22%7D&output=json",
567 "uri": "https://phab.mercurial-scm.org//api/differential.parsecommitmessage",
568 "method": "POST"
569 },
570 "response": {
571 "headers": {
572 "x-xss-protection": [
573 "1; mode=block"
574 ],
575 "strict-transport-security": [
576 "max-age=0; includeSubdomains; preload"
577 ],
578 "transfer-encoding": [
579 "chunked"
580 ],
581 "x-frame-options": [
582 "Deny"
583 ],
584 "expires": [
585 "Sat, 01 Jan 2000 00:00:00 GMT"
586 ],
587 "content-type": [
588 "application/json"
589 ],
590 "referrer-policy": [
591 "no-referrer"
592 ],
593 "server": [
594 "Apache/2.4.10 (Debian)"
595 ],
596 "cache-control": [
597 "no-store"
598 ],
599 "x-content-type-options": [
600 "nosniff"
601 ],
602 "date": [
603 "Wed, 08 Apr 2020 21:13:32 GMT"
604 ]
605 },
606 "body": {
607 "string": "{\"result\":{\"errors\":[],\"fields\":{\"title\":\"3: a commit with no detailed message\",\"revisionID\":8388},\"revisionIDFieldInfo\":{\"value\":8388,\"validDomain\":\"https:\\/\\/phab.mercurial-scm.org\"},\"transactions\":[{\"type\":\"title\",\"value\":\"3: a commit with no detailed message\"}]},\"error_code\":null,\"error_info\":null}"
608 },
609 "status": {
610 "code": 200,
611 "message": "OK"
612 }
613 }
614 },
615 {
616 "request": {
617 "headers": {
618 "content-length": [
619 "251"
620 ],
621 "accept": [
622 "application/mercurial-0.1"
623 ],
624 "content-type": [
625 "application/x-www-form-urlencoded"
626 ],
627 "host": [
628 "phab.mercurial-scm.org"
629 ],
630 "user-agent": [
631 "mercurial/proto-1.0 (Mercurial 5.3.2+463-d35fbae9dd33+20200408)"
632 ]
633 },
634 "body": "__conduit__=1&params=%7B%22__conduit__%22%3A+%7B%22token%22%3A+%22cli-hahayouwish%22%7D%2C+%22corpus%22%3A+%22four%3A+extend+the+fold+range%5Cn%5CnDifferential+Revision%3A+https%3A%2F%2Fphab.mercurial-scm.org%2FD8388%22%7D&output=json",
635 "uri": "https://phab.mercurial-scm.org//api/differential.parsecommitmessage",
636 "method": "POST"
637 },
638 "response": {
639 "headers": {
640 "x-xss-protection": [
641 "1; mode=block"
642 ],
643 "strict-transport-security": [
644 "max-age=0; includeSubdomains; preload"
645 ],
646 "transfer-encoding": [
647 "chunked"
648 ],
649 "x-frame-options": [
650 "Deny"
651 ],
652 "expires": [
653 "Sat, 01 Jan 2000 00:00:00 GMT"
654 ],
655 "content-type": [
656 "application/json"
657 ],
658 "referrer-policy": [
659 "no-referrer"
660 ],
661 "server": [
662 "Apache/2.4.10 (Debian)"
663 ],
664 "cache-control": [
665 "no-store"
666 ],
667 "x-content-type-options": [
668 "nosniff"
669 ],
670 "date": [
671 "Wed, 08 Apr 2020 21:13:33 GMT"
672 ]
673 },
674 "body": {
675 "string": "{\"result\":{\"errors\":[],\"fields\":{\"title\":\"four: extend the fold range\",\"revisionID\":8388},\"revisionIDFieldInfo\":{\"value\":8388,\"validDomain\":\"https:\\/\\/phab.mercurial-scm.org\"},\"transactions\":[{\"type\":\"title\",\"value\":\"four: extend the fold range\"}]},\"error_code\":null,\"error_info\":null}"
676 },
677 "status": {
678 "code": 200,
679 "message": "OK"
680 }
681 }
682 },
683 {
684 "request": {
685 "headers": {
686 "content-length": [
687 "251"
688 ],
689 "accept": [
690 "application/mercurial-0.1"
691 ],
692 "content-type": [
693 "application/x-www-form-urlencoded"
694 ],
695 "host": [
696 "phab.mercurial-scm.org"
697 ],
698 "user-agent": [
699 "mercurial/proto-1.0 (Mercurial 5.3.2+463-d35fbae9dd33+20200408)"
700 ]
701 },
702 "body": "__conduit__=1&params=%7B%22__conduit__%22%3A+%7B%22token%22%3A+%22cli-hahayouwish%22%7D%2C+%22corpus%22%3A+%22four%3A+extend+the+fold+range%5Cn%5CnDifferential+Revision%3A+https%3A%2F%2Fphab.mercurial-scm.org%2FD8388%22%7D&output=json",
703 "uri": "https://phab.mercurial-scm.org//api/differential.parsecommitmessage",
704 "method": "POST"
705 },
706 "response": {
707 "headers": {
708 "x-xss-protection": [
709 "1; mode=block"
710 ],
711 "strict-transport-security": [
712 "max-age=0; includeSubdomains; preload"
713 ],
714 "transfer-encoding": [
715 "chunked"
716 ],
717 "x-frame-options": [
718 "Deny"
719 ],
720 "expires": [
721 "Sat, 01 Jan 2000 00:00:00 GMT"
722 ],
723 "content-type": [
724 "application/json"
725 ],
726 "referrer-policy": [
727 "no-referrer"
728 ],
729 "server": [
730 "Apache/2.4.10 (Debian)"
731 ],
732 "cache-control": [
733 "no-store"
734 ],
735 "x-content-type-options": [
736 "nosniff"
737 ],
738 "date": [
739 "Wed, 08 Apr 2020 21:13:33 GMT"
740 ]
741 },
742 "body": {
743 "string": "{\"result\":{\"errors\":[],\"fields\":{\"title\":\"four: extend the fold range\",\"revisionID\":8388},\"revisionIDFieldInfo\":{\"value\":8388,\"validDomain\":\"https:\\/\\/phab.mercurial-scm.org\"},\"transactions\":[{\"type\":\"title\",\"value\":\"four: extend the fold range\"}]},\"error_code\":null,\"error_info\":null}"
744 },
745 "status": {
746 "code": 200,
747 "message": "OK"
748 }
749 }
750 },
751 {
752 "request": {
753 "headers": {
754 "content-length": [
755 "836"
756 ],
757 "accept": [
758 "application/mercurial-0.1"
759 ],
760 "content-type": [
761 "application/x-www-form-urlencoded"
762 ],
763 "host": [
764 "phab.mercurial-scm.org"
765 ],
766 "user-agent": [
767 "mercurial/proto-1.0 (Mercurial 5.3.2+463-d35fbae9dd33+20200408)"
768 ]
769 },
770 "body": "__conduit__=1&params=%7B%22__conduit__%22%3A+%7B%22token%22%3A+%22cli-hahayouwish%22%7D%2C+%22objectIdentifier%22%3A+8388%2C+%22transactions%22%3A+%5B%7B%22type%22%3A+%22update%22%2C+%22value%22%3A+%22PHID-DIFF-vyaqmcwywxowtnjrfkkw%22%7D%2C+%7B%22type%22%3A+%22title%22%2C+%22value%22%3A+%22added+file%22%7D%2C+%7B%22type%22%3A+%22testPlan%22%2C+%22value%22%3A+%22LOL%21++What+testing%3F%21%5Cn%5CnHaha%21+yeah%2C+right.%22%7D%2C+%7B%22type%22%3A+%22summary%22%2C+%22value%22%3A+%22one%3A+first+commit+to+review%5Cn%5CnThis+file+was+modified+with+%27mod1%27+as+its+contents.%5Cn%5Cntwo%3A+second+commit+to+review%5Cn%5CnThis+file+was+modified+with+%27mod2%27+as+its+contents.%5Cn%5Cn3%3A+a+commit+with+no+detailed+message%5Cn%5Cnfour%3A+extend+the+fold+range%5Cn%5Cnfour%3A+extend+the+fold+range%22%7D%5D%7D&output=json",
771 "uri": "https://phab.mercurial-scm.org//api/differential.revision.edit",
772 "method": "POST"
773 },
774 "response": {
775 "headers": {
776 "x-xss-protection": [
777 "1; mode=block"
778 ],
779 "strict-transport-security": [
780 "max-age=0; includeSubdomains; preload"
781 ],
782 "transfer-encoding": [
783 "chunked"
784 ],
785 "x-frame-options": [
786 "Deny"
787 ],
788 "expires": [
789 "Sat, 01 Jan 2000 00:00:00 GMT"
790 ],
791 "content-type": [
792 "application/json"
793 ],
794 "referrer-policy": [
795 "no-referrer"
796 ],
797 "server": [
798 "Apache/2.4.10 (Debian)"
799 ],
800 "cache-control": [
801 "no-store"
802 ],
803 "x-content-type-options": [
804 "nosniff"
805 ],
806 "date": [
807 "Wed, 08 Apr 2020 21:13:33 GMT"
808 ]
809 },
810 "body": {
811 "string": "{\"result\":{\"object\":{\"id\":8388,\"phid\":\"PHID-DREV-v5iywrnzj4h4uwo57pob\"},\"transactions\":[{\"phid\":\"PHID-XACT-DREV-hnejfcaarddna5z\"},{\"phid\":\"PHID-XACT-DREV-7icktpjfcm77foq\"}]},\"error_code\":null,\"error_info\":null}"
812 },
813 "status": {
814 "code": 200,
815 "message": "OK"
816 }
817 }
818 },
819 {
820 "request": {
821 "headers": {
822 "content-length": [
823 "146"
824 ],
825 "accept": [
826 "application/mercurial-0.1"
827 ],
828 "content-type": [
829 "application/x-www-form-urlencoded"
830 ],
831 "host": [
832 "phab.mercurial-scm.org"
833 ],
834 "user-agent": [
835 "mercurial/proto-1.0 (Mercurial 5.3.2+463-d35fbae9dd33+20200408)"
836 ]
837 },
838 "body": "__conduit__=1&params=%7B%22__conduit__%22%3A+%7B%22token%22%3A+%22cli-hahayouwish%22%7D%2C+%22ids%22%3A+%5B8388%5D%7D&output=json",
839 "uri": "https://phab.mercurial-scm.org//api/differential.query",
840 "method": "POST"
841 },
842 "response": {
843 "headers": {
844 "x-xss-protection": [
845 "1; mode=block"
846 ],
847 "strict-transport-security": [
848 "max-age=0; includeSubdomains; preload"
849 ],
850 "transfer-encoding": [
851 "chunked"
852 ],
853 "x-frame-options": [
854 "Deny"
855 ],
856 "expires": [
857 "Sat, 01 Jan 2000 00:00:00 GMT"
858 ],
859 "content-type": [
860 "application/json"
861 ],
862 "referrer-policy": [
863 "no-referrer"
864 ],
865 "server": [
866 "Apache/2.4.10 (Debian)"
867 ],
868 "cache-control": [
869 "no-store"
870 ],
871 "x-content-type-options": [
872 "nosniff"
873 ],
874 "date": [
875 "Wed, 08 Apr 2020 21:13:34 GMT"
876 ]
877 },
878 "body": {
879 "string": "{\"result\":[{\"id\":\"8388\",\"phid\":\"PHID-DREV-v5iywrnzj4h4uwo57pob\",\"title\":\"added file\",\"uri\":\"https:\\/\\/phab.mercurial-scm.org\\/D8388\",\"dateCreated\":\"1586380405\",\"dateModified\":\"1586380414\",\"authorPHID\":\"PHID-USER-tzhaient733lwrlbcag5\",\"status\":\"0\",\"statusName\":\"Needs Review\",\"properties\":{\"draft.broadcast\":true,\"lines.added\":3,\"lines.removed\":0},\"branch\":\"default\",\"summary\":\"one: first commit to review\\n\\nThis file was modified with 'mod1' as its contents.\\n\\ntwo: second commit to review\\n\\nThis file was modified with 'mod2' as its contents.\\n\\n3: a commit with no detailed message\\n\\nfour: extend the fold range\\n\\nfour: extend the fold range\",\"testPlan\":\"LOL! What testing?!\\n\\nHaha! yeah, right.\",\"lineCount\":\"3\",\"activeDiffPHID\":\"PHID-DIFF-vyaqmcwywxowtnjrfkkw\",\"diffs\":[\"21011\",\"21010\"],\"commits\":[],\"reviewers\":{\"PHID-PROJ-3dvcxzznrjru2xmmses3\":\"PHID-PROJ-3dvcxzznrjru2xmmses3\"},\"ccs\":[\"PHID-USER-q42dn7cc3donqriafhjx\"],\"hashes\":[[\"hgcm\",\"\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\"],[\"hgcm\",\"\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\"],[\"hgcm\",\"\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\"],[\"hgcm\",\"\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\"],[\"hgcm\",\"\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\"],[\"hgcm\",\"\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\"]],\"auxiliary\":{\"phabricator:projects\":[],\"phabricator:depends-on\":[]},\"repositoryPHID\":\"PHID-REPO-bvunnehri4u2isyr7bc3\",\"sourcePath\":\"\\/\"}],\"error_code\":null,\"error_info\":null}"
880 },
881 "status": {
882 "code": 200,
883 "message": "OK"
884 }
885 }
886 },
887 {
888 "request": {
889 "headers": {
890 "content-length": [
891 "482"
892 ],
893 "accept": [
894 "application/mercurial-0.1"
895 ],
896 "content-type": [
897 "application/x-www-form-urlencoded"
898 ],
899 "host": [
900 "phab.mercurial-scm.org"
901 ],
902 "user-agent": [
903 "mercurial/proto-1.0 (Mercurial 5.3.2+463-d35fbae9dd33+20200408)"
904 ]
905 },
906 "body": "__conduit__=1&params=%7B%22__conduit__%22%3A+%7B%22token%22%3A+%22cli-hahayouwish%22%7D%2C+%22data%22%3A+%22%7B%5C%22branch%5C%22%3A+%5C%22default%5C%22%2C+%5C%22date%5C%22%3A+%5C%220+0%5C%22%2C+%5C%22node%5C%22%3A+%5C%22b50946d5e4901d7f7801d572342ef90d06a85a85%5C%22%2C+%5C%22parent%5C%22%3A+%5C%220000000000000000000000000000000000000000%5C%22%2C+%5C%22user%5C%22%3A+%5C%22test%5C%22%7D%22%2C+%22diff_id%22%3A+21011%2C+%22name%22%3A+%22hg%3Ameta%22%7D&output=json",
907 "uri": "https://phab.mercurial-scm.org//api/differential.setdiffproperty",
908 "method": "POST"
909 },
910 "response": {
911 "headers": {
912 "x-xss-protection": [
913 "1; mode=block"
914 ],
915 "strict-transport-security": [
916 "max-age=0; includeSubdomains; preload"
917 ],
918 "transfer-encoding": [
919 "chunked"
920 ],
921 "x-frame-options": [
922 "Deny"
923 ],
924 "expires": [
925 "Sat, 01 Jan 2000 00:00:00 GMT"
926 ],
927 "content-type": [
928 "application/json"
929 ],
930 "referrer-policy": [
931 "no-referrer"
932 ],
933 "server": [
934 "Apache/2.4.10 (Debian)"
935 ],
936 "cache-control": [
937 "no-store"
938 ],
939 "x-content-type-options": [
940 "nosniff"
941 ],
942 "date": [
943 "Wed, 08 Apr 2020 21:13:35 GMT"
944 ],
945 "connection": [
946 "close"
947 ]
948 },
949 "body": {
950 "string": "{\"result\":null,\"error_code\":null,\"error_info\":null}"
951 },
952 "status": {
953 "code": 200,
954 "message": "OK"
955 }
956 }
957 },
958 {
959 "request": {
960 "headers": {
961 "content-length": [
962 "2514"
963 ],
964 "accept": [
965 "application/mercurial-0.1"
966 ],
967 "content-type": [
968 "application/x-www-form-urlencoded"
969 ],
970 "host": [
971 "phab.mercurial-scm.org"
972 ],
973 "user-agent": [
974 "mercurial/proto-1.0 (Mercurial 5.3.2+463-d35fbae9dd33+20200408)"
975 ]
976 },
977 "body": "__conduit__=1&params=%7B%22__conduit__%22%3A+%7B%22token%22%3A+%22cli-hahayouwish%22%7D%2C+%22data%22%3A+%22%7B%5C%2215e9b14b4b4c37ccd18298d058a184068718765e%5C%22%3A+%7B%5C%22author%5C%22%3A+%5C%22test%5C%22%2C+%5C%22authorEmail%5C%22%3A+%5C%22test%5C%22%2C+%5C%22branch%5C%22%3A+%5C%22default%5C%22%2C+%5C%22commit%5C%22%3A+%5C%2215e9b14b4b4c37ccd18298d058a184068718765e%5C%22%2C+%5C%22parents%5C%22%3A+%5B%5C%220000000000000000000000000000000000000000%5C%22%5D%2C+%5C%22time%5C%22%3A+0%7D%2C+%5C%2230682b960804bd91823ea5ccb5d6a7d999f8d1ea%5C%22%3A+%7B%5C%22author%5C%22%3A+%5C%22test%5C%22%2C+%5C%22authorEmail%5C%22%3A+%5C%22test%5C%22%2C+%5C%22branch%5C%22%3A+%5C%22default%5C%22%2C+%5C%22commit%5C%22%3A+%5C%2230682b960804bd91823ea5ccb5d6a7d999f8d1ea%5C%22%2C+%5C%22parents%5C%22%3A+%5B%5C%223ee132d41dbc24bf5a4df3e97573d6e922446565%5C%22%5D%2C+%5C%22time%5C%22%3A+0%7D%2C+%5C%223ee132d41dbc24bf5a4df3e97573d6e922446565%5C%22%3A+%7B%5C%22author%5C%22%3A+%5C%22test%5C%22%2C+%5C%22authorEmail%5C%22%3A+%5C%22test%5C%22%2C+%5C%22branch%5C%22%3A+%5C%22default%5C%22%2C+%5C%22commit%5C%22%3A+%5C%223ee132d41dbc24bf5a4df3e97573d6e922446565%5C%22%2C+%5C%22parents%5C%22%3A+%5B%5C%226320b7d714cf2b2b71370eafeae29e2988d07872%5C%22%5D%2C+%5C%22time%5C%22%3A+0%7D%2C+%5C%226320b7d714cf2b2b71370eafeae29e2988d07872%5C%22%3A+%7B%5C%22author%5C%22%3A+%5C%22test%5C%22%2C+%5C%22authorEmail%5C%22%3A+%5C%22test%5C%22%2C+%5C%22branch%5C%22%3A+%5C%22default%5C%22%2C+%5C%22commit%5C%22%3A+%5C%226320b7d714cf2b2b71370eafeae29e2988d07872%5C%22%2C+%5C%22parents%5C%22%3A+%5B%5C%2215e9b14b4b4c37ccd18298d058a184068718765e%5C%22%5D%2C+%5C%22time%5C%22%3A+0%7D%2C+%5C%226bc15dc99efd596be5908c187f68d6810671121e%5C%22%3A+%7B%5C%22author%5C%22%3A+%5C%22test%5C%22%2C+%5C%22authorEmail%5C%22%3A+%5C%22test%5C%22%2C+%5C%22branch%5C%22%3A+%5C%22default%5C%22%2C+%5C%22commit%5C%22%3A+%5C%226bc15dc99efd596be5908c187f68d6810671121e%5C%22%2C+%5C%22parents%5C%22%3A+%5B%5C%2230682b960804bd91823ea5ccb5d6a7d999f8d1ea%5C%22%5D%2C+%5C%22time%5C%22%3A+0%7D%2C+%5C%22b50946d5e4901d7f7801d572342ef90d06a85a85%5C%22%3A+%7B%5C%22author%5C%22%3A+%5C%22test%5C%22%2C+%5C%22authorEmail%5C%22%3A+%5C%22test%5C%22%2C+%5C%22branch%5C%22%3A+%5C%22default%5C%22%2C+%5C%22commit%5C%22%3A+%5C%22b50946d5e4901d7f7801d572342ef90d06a85a85%5C%22%2C+%5C%22parents%5C%22%3A+%5B%5C%226bc15dc99efd596be5908c187f68d6810671121e%5C%22%5D%2C+%5C%22time%5C%22%3A+0%7D%7D%22%2C+%22diff_id%22%3A+21011%2C+%22name%22%3A+%22local%3Acommits%22%7D&output=json",
978 "uri": "https://phab.mercurial-scm.org//api/differential.setdiffproperty",
979 "method": "POST"
980 },
981 "response": {
982 "headers": {
983 "x-xss-protection": [
984 "1; mode=block"
985 ],
986 "strict-transport-security": [
987 "max-age=0; includeSubdomains; preload"
988 ],
989 "transfer-encoding": [
990 "chunked"
991 ],
992 "x-frame-options": [
993 "Deny"
994 ],
995 "expires": [
996 "Sat, 01 Jan 2000 00:00:00 GMT"
997 ],
998 "content-type": [
999 "application/json"
1000 ],
1001 "referrer-policy": [
1002 "no-referrer"
1003 ],
1004 "server": [
1005 "Apache/2.4.10 (Debian)"
1006 ],
1007 "cache-control": [
1008 "no-store"
1009 ],
1010 "x-content-type-options": [
1011 "nosniff"
1012 ],
1013 "date": [
1014 "Wed, 08 Apr 2020 21:13:35 GMT"
1015 ]
1016 },
1017 "body": {
1018 "string": "{\"result\":null,\"error_code\":null,\"error_info\":null}"
1019 },
1020 "status": {
1021 "code": 200,
1022 "message": "OK"
1023 }
1024 }
1025 }
1026 ],
1027 "version": 1
1028 } No newline at end of file
This diff has been collapsed as it changes many lines, (824 lines changed) Show them Hide them
@@ -0,0 +1,824 b''
1 {
2 "interactions": [
3 {
4 "request": {
5 "headers": {
6 "content-length": [
7 "170"
8 ],
9 "accept": [
10 "application/mercurial-0.1"
11 ],
12 "content-type": [
13 "application/x-www-form-urlencoded"
14 ],
15 "host": [
16 "phab.mercurial-scm.org"
17 ],
18 "user-agent": [
19 "mercurial/proto-1.0 (Mercurial 5.3.2+463-d35fbae9dd33+20200408)"
20 ]
21 },
22 "body": "__conduit__=1&params=%7B%22__conduit__%22%3A+%7B%22token%22%3A+%22cli-hahayouwish%22%7D%2C+%22revisionIDs%22%3A+%5B8387%2C+8387%2C+8387%5D%7D&output=json",
23 "uri": "https://phab.mercurial-scm.org//api/differential.querydiffs",
24 "method": "POST"
25 },
26 "response": {
27 "headers": {
28 "x-xss-protection": [
29 "1; mode=block"
30 ],
31 "strict-transport-security": [
32 "max-age=0; includeSubdomains; preload"
33 ],
34 "transfer-encoding": [
35 "chunked"
36 ],
37 "x-frame-options": [
38 "Deny"
39 ],
40 "expires": [
41 "Sat, 01 Jan 2000 00:00:00 GMT"
42 ],
43 "content-type": [
44 "application/json"
45 ],
46 "referrer-policy": [
47 "no-referrer"
48 ],
49 "server": [
50 "Apache/2.4.10 (Debian)"
51 ],
52 "cache-control": [
53 "no-store"
54 ],
55 "x-content-type-options": [
56 "nosniff"
57 ],
58 "date": [
59 "Wed, 08 Apr 2020 21:13:01 GMT"
60 ],
61 "connection": [
62 "close"
63 ]
64 },
65 "body": {
66 "string": "{\"result\":{\"21006\":{\"id\":\"21006\",\"revisionID\":\"8387\",\"dateCreated\":\"1586380375\",\"dateModified\":\"1586380377\",\"sourceControlBaseRevision\":\"98d480e0d494906d9758c44c622951b429afd862\",\"sourceControlPath\":\"\\/\",\"sourceControlSystem\":\"hg\",\"branch\":\"default\",\"bookmark\":null,\"creationMethod\":\"phabsend\",\"description\":null,\"unitStatus\":\"0\",\"lintStatus\":\"0\",\"changes\":[{\"id\":\"56823\",\"metadata\":{\"line:first\":1,\"hash.effect\":\"cAKuVP31KNrx\"},\"oldPath\":\"file.txt\",\"currentPath\":\"file.txt\",\"awayPaths\":[],\"oldProperties\":[],\"newProperties\":[],\"type\":\"2\",\"fileType\":\"1\",\"commitHash\":null,\"addLines\":\"1\",\"delLines\":\"1\",\"hunks\":[{\"oldOffset\":\"1\",\"newOffset\":\"1\",\"oldLength\":\"1\",\"newLength\":\"1\",\"addLines\":null,\"delLines\":null,\"isMissingOldNewline\":null,\"isMissingNewNewline\":null,\"corpus\":\"-added\\n+mod3\\n\"}]}],\"properties\":{\"hg:meta\":{\"branch\":\"default\",\"date\":\"0 0\",\"node\":\"921f8265efbd92e92bfa5d7a0e047908de9844a5\",\"parent\":\"98d480e0d494906d9758c44c622951b429afd862\",\"user\":\"test\"},\"local:commits\":{\"602c4e7382436988e46c0d56fb3883968302b3f6\":{\"author\":\"test\",\"authorEmail\":\"test\",\"branch\":\"default\",\"commit\":\"602c4e7382436988e46c0d56fb3883968302b3f6\",\"parents\":[\"98d480e0d494906d9758c44c622951b429afd862\"],\"time\":0},\"832553266fe8c3330d968e6987df4ae793483b2b\":{\"author\":\"test\",\"authorEmail\":\"test\",\"branch\":\"default\",\"commit\":\"832553266fe8c3330d968e6987df4ae793483b2b\",\"parents\":[\"602c4e7382436988e46c0d56fb3883968302b3f6\"],\"time\":0},\"921f8265efbd92e92bfa5d7a0e047908de9844a5\":{\"author\":\"test\",\"authorEmail\":\"test\",\"branch\":\"default\",\"commit\":\"921f8265efbd92e92bfa5d7a0e047908de9844a5\",\"parents\":[\"832553266fe8c3330d968e6987df4ae793483b2b\"],\"time\":0}}},\"authorName\":\"test\",\"authorEmail\":\"test\"}},\"error_code\":null,\"error_info\":null}"
67 },
68 "status": {
69 "code": 200,
70 "message": "OK"
71 }
72 }
73 },
74 {
75 "request": {
76 "headers": {
77 "content-length": [
78 "183"
79 ],
80 "accept": [
81 "application/mercurial-0.1"
82 ],
83 "content-type": [
84 "application/x-www-form-urlencoded"
85 ],
86 "host": [
87 "phab.mercurial-scm.org"
88 ],
89 "user-agent": [
90 "mercurial/proto-1.0 (Mercurial 5.3.2+463-d35fbae9dd33+20200408)"
91 ]
92 },
93 "body": "__conduit__=1&params=%7B%22__conduit__%22%3A+%7B%22token%22%3A+%22cli-hahayouwish%22%7D%2C+%22constraints%22%3A+%7B%22callsigns%22%3A+%5B%22HG%22%5D%7D%7D&output=json",
94 "uri": "https://phab.mercurial-scm.org//api/diffusion.repository.search",
95 "method": "POST"
96 },
97 "response": {
98 "headers": {
99 "x-xss-protection": [
100 "1; mode=block"
101 ],
102 "strict-transport-security": [
103 "max-age=0; includeSubdomains; preload"
104 ],
105 "transfer-encoding": [
106 "chunked"
107 ],
108 "x-frame-options": [
109 "Deny"
110 ],
111 "expires": [
112 "Sat, 01 Jan 2000 00:00:00 GMT"
113 ],
114 "content-type": [
115 "application/json"
116 ],
117 "referrer-policy": [
118 "no-referrer"
119 ],
120 "server": [
121 "Apache/2.4.10 (Debian)"
122 ],
123 "cache-control": [
124 "no-store"
125 ],
126 "x-content-type-options": [
127 "nosniff"
128 ],
129 "date": [
130 "Wed, 08 Apr 2020 21:13:02 GMT"
131 ]
132 },
133 "body": {
134 "string": "{\"result\":{\"data\":[{\"id\":2,\"type\":\"REPO\",\"phid\":\"PHID-REPO-bvunnehri4u2isyr7bc3\",\"fields\":{\"name\":\"Mercurial\",\"vcs\":\"hg\",\"callsign\":\"HG\",\"shortName\":null,\"status\":\"active\",\"isImporting\":false,\"almanacServicePHID\":null,\"refRules\":{\"fetchRules\":[],\"trackRules\":[],\"permanentRefRules\":[]},\"spacePHID\":null,\"dateCreated\":1498761653,\"dateModified\":1500403184,\"policy\":{\"view\":\"public\",\"edit\":\"admin\",\"diffusion.push\":\"users\"}},\"attachments\":{}}],\"maps\":{},\"query\":{\"queryKey\":null},\"cursor\":{\"limit\":100,\"after\":null,\"before\":null,\"order\":null}},\"error_code\":null,\"error_info\":null}"
135 },
136 "status": {
137 "code": 200,
138 "message": "OK"
139 }
140 }
141 },
142 {
143 "request": {
144 "headers": {
145 "content-length": [
146 "1736"
147 ],
148 "accept": [
149 "application/mercurial-0.1"
150 ],
151 "content-type": [
152 "application/x-www-form-urlencoded"
153 ],
154 "host": [
155 "phab.mercurial-scm.org"
156 ],
157 "user-agent": [
158 "mercurial/proto-1.0 (Mercurial 5.3.2+463-d35fbae9dd33+20200408)"
159 ]
160 },
161 "body": "__conduit__=1&params=%7B%22__conduit__%22%3A+%7B%22token%22%3A+%22cli-hahayouwish%22%7D%2C+%22bookmark%22%3A+null%2C+%22branch%22%3A+%22default%22%2C+%22changes%22%3A+%7B%22file.txt%22%3A+%7B%22addLines%22%3A+1%2C+%22awayPaths%22%3A+%5B%5D%2C+%22commitHash%22%3A+null%2C+%22currentPath%22%3A+%22file.txt%22%2C+%22delLines%22%3A+1%2C+%22fileType%22%3A+1%2C+%22hunks%22%3A+%5B%7B%22addLines%22%3A+1%2C+%22corpus%22%3A+%22-added%5Cn%2Bmod3%5Cn%22%2C+%22delLines%22%3A+1%2C+%22newLength%22%3A+1%2C+%22newOffset%22%3A+1%2C+%22oldLength%22%3A+1%2C+%22oldOffset%22%3A+1%7D%5D%2C+%22metadata%22%3A+%7B%7D%2C+%22newProperties%22%3A+%7B%7D%2C+%22oldPath%22%3A+%22file.txt%22%2C+%22oldProperties%22%3A+%7B%7D%2C+%22type%22%3A+2%7D%2C+%22file2.txt%22%3A+%7B%22addLines%22%3A+1%2C+%22awayPaths%22%3A+%5B%5D%2C+%22commitHash%22%3A+null%2C+%22currentPath%22%3A+%22file2.txt%22%2C+%22delLines%22%3A+0%2C+%22fileType%22%3A+1%2C+%22hunks%22%3A+%5B%7B%22addLines%22%3A+1%2C+%22corpus%22%3A+%22%2Bmodified%5Cn%22%2C+%22delLines%22%3A+0%2C+%22newLength%22%3A+1%2C+%22newOffset%22%3A+1%2C+%22oldLength%22%3A+0%2C+%22oldOffset%22%3A+0%7D%5D%2C+%22metadata%22%3A+%7B%7D%2C+%22newProperties%22%3A+%7B%22unix%3Afilemode%22%3A+%22100644%22%7D%2C+%22oldPath%22%3A+null%2C+%22oldProperties%22%3A+%7B%7D%2C+%22type%22%3A+1%7D%7D%2C+%22creationMethod%22%3A+%22phabsend%22%2C+%22lintStatus%22%3A+%22none%22%2C+%22repositoryPHID%22%3A+%22PHID-REPO-bvunnehri4u2isyr7bc3%22%2C+%22sourceControlBaseRevision%22%3A+%2298d480e0d494906d9758c44c622951b429afd862%22%2C+%22sourceControlPath%22%3A+%22%2F%22%2C+%22sourceControlSystem%22%3A+%22hg%22%2C+%22sourceMachine%22%3A+%22%22%2C+%22sourcePath%22%3A+%22%2F%22%2C+%22unitStatus%22%3A+%22none%22%7D&output=json",
162 "uri": "https://phab.mercurial-scm.org//api/differential.creatediff",
163 "method": "POST"
164 },
165 "response": {
166 "headers": {
167 "x-xss-protection": [
168 "1; mode=block"
169 ],
170 "strict-transport-security": [
171 "max-age=0; includeSubdomains; preload"
172 ],
173 "transfer-encoding": [
174 "chunked"
175 ],
176 "x-frame-options": [
177 "Deny"
178 ],
179 "expires": [
180 "Sat, 01 Jan 2000 00:00:00 GMT"
181 ],
182 "content-type": [
183 "application/json"
184 ],
185 "referrer-policy": [
186 "no-referrer"
187 ],
188 "server": [
189 "Apache/2.4.10 (Debian)"
190 ],
191 "cache-control": [
192 "no-store"
193 ],
194 "x-content-type-options": [
195 "nosniff"
196 ],
197 "date": [
198 "Wed, 08 Apr 2020 21:13:02 GMT"
199 ]
200 },
201 "body": {
202 "string": "{\"result\":{\"diffid\":21007,\"phid\":\"PHID-DIFF-zkluur4ou3j4pswpif6e\",\"uri\":\"https:\\/\\/phab.mercurial-scm.org\\/differential\\/diff\\/21007\\/\"},\"error_code\":null,\"error_info\":null}"
203 },
204 "status": {
205 "code": 200,
206 "message": "OK"
207 }
208 }
209 },
210 {
211 "request": {
212 "headers": {
213 "content-length": [
214 "482"
215 ],
216 "accept": [
217 "application/mercurial-0.1"
218 ],
219 "content-type": [
220 "application/x-www-form-urlencoded"
221 ],
222 "host": [
223 "phab.mercurial-scm.org"
224 ],
225 "user-agent": [
226 "mercurial/proto-1.0 (Mercurial 5.3.2+463-d35fbae9dd33+20200408)"
227 ]
228 },
229 "body": "__conduit__=1&params=%7B%22__conduit__%22%3A+%7B%22token%22%3A+%22cli-hahayouwish%22%7D%2C+%22data%22%3A+%22%7B%5C%22branch%5C%22%3A+%5C%22default%5C%22%2C+%5C%22date%5C%22%3A+%5C%220+0%5C%22%2C+%5C%22node%5C%22%3A+%5C%22e4edb1fe3565eaaecc1787ada4fcc2b7e9018fac%5C%22%2C+%5C%22parent%5C%22%3A+%5C%2298d480e0d494906d9758c44c622951b429afd862%5C%22%2C+%5C%22user%5C%22%3A+%5C%22test%5C%22%7D%22%2C+%22diff_id%22%3A+21007%2C+%22name%22%3A+%22hg%3Ameta%22%7D&output=json",
230 "uri": "https://phab.mercurial-scm.org//api/differential.setdiffproperty",
231 "method": "POST"
232 },
233 "response": {
234 "headers": {
235 "x-xss-protection": [
236 "1; mode=block"
237 ],
238 "strict-transport-security": [
239 "max-age=0; includeSubdomains; preload"
240 ],
241 "transfer-encoding": [
242 "chunked"
243 ],
244 "x-frame-options": [
245 "Deny"
246 ],
247 "expires": [
248 "Sat, 01 Jan 2000 00:00:00 GMT"
249 ],
250 "content-type": [
251 "application/json"
252 ],
253 "referrer-policy": [
254 "no-referrer"
255 ],
256 "server": [
257 "Apache/2.4.10 (Debian)"
258 ],
259 "cache-control": [
260 "no-store"
261 ],
262 "x-content-type-options": [
263 "nosniff"
264 ],
265 "date": [
266 "Wed, 08 Apr 2020 21:13:03 GMT"
267 ]
268 },
269 "body": {
270 "string": "{\"result\":null,\"error_code\":null,\"error_info\":null}"
271 },
272 "status": {
273 "code": 200,
274 "message": "OK"
275 }
276 }
277 },
278 {
279 "request": {
280 "headers": {
281 "content-length": [
282 "1362"
283 ],
284 "accept": [
285 "application/mercurial-0.1"
286 ],
287 "content-type": [
288 "application/x-www-form-urlencoded"
289 ],
290 "host": [
291 "phab.mercurial-scm.org"
292 ],
293 "user-agent": [
294 "mercurial/proto-1.0 (Mercurial 5.3.2+463-d35fbae9dd33+20200408)"
295 ]
296 },
297 "body": "__conduit__=1&params=%7B%22__conduit__%22%3A+%7B%22token%22%3A+%22cli-hahayouwish%22%7D%2C+%22data%22%3A+%22%7B%5C%220124e5474c880e4fb40c8326ad2b75ae3e57ee5f%5C%22%3A+%7B%5C%22author%5C%22%3A+%5C%22test%5C%22%2C+%5C%22authorEmail%5C%22%3A+%5C%22test%5C%22%2C+%5C%22branch%5C%22%3A+%5C%22default%5C%22%2C+%5C%22commit%5C%22%3A+%5C%220124e5474c880e4fb40c8326ad2b75ae3e57ee5f%5C%22%2C+%5C%22parents%5C%22%3A+%5B%5C%22602c4e7382436988e46c0d56fb3883968302b3f6%5C%22%5D%2C+%5C%22time%5C%22%3A+0%7D%2C+%5C%22602c4e7382436988e46c0d56fb3883968302b3f6%5C%22%3A+%7B%5C%22author%5C%22%3A+%5C%22test%5C%22%2C+%5C%22authorEmail%5C%22%3A+%5C%22test%5C%22%2C+%5C%22branch%5C%22%3A+%5C%22default%5C%22%2C+%5C%22commit%5C%22%3A+%5C%22602c4e7382436988e46c0d56fb3883968302b3f6%5C%22%2C+%5C%22parents%5C%22%3A+%5B%5C%2298d480e0d494906d9758c44c622951b429afd862%5C%22%5D%2C+%5C%22time%5C%22%3A+0%7D%2C+%5C%22e4edb1fe3565eaaecc1787ada4fcc2b7e9018fac%5C%22%3A+%7B%5C%22author%5C%22%3A+%5C%22test%5C%22%2C+%5C%22authorEmail%5C%22%3A+%5C%22test%5C%22%2C+%5C%22branch%5C%22%3A+%5C%22default%5C%22%2C+%5C%22commit%5C%22%3A+%5C%22e4edb1fe3565eaaecc1787ada4fcc2b7e9018fac%5C%22%2C+%5C%22parents%5C%22%3A+%5B%5C%220124e5474c880e4fb40c8326ad2b75ae3e57ee5f%5C%22%5D%2C+%5C%22time%5C%22%3A+0%7D%7D%22%2C+%22diff_id%22%3A+21007%2C+%22name%22%3A+%22local%3Acommits%22%7D&output=json",
298 "uri": "https://phab.mercurial-scm.org//api/differential.setdiffproperty",
299 "method": "POST"
300 },
301 "response": {
302 "headers": {
303 "x-xss-protection": [
304 "1; mode=block"
305 ],
306 "strict-transport-security": [
307 "max-age=0; includeSubdomains; preload"
308 ],
309 "transfer-encoding": [
310 "chunked"
311 ],
312 "x-frame-options": [
313 "Deny"
314 ],
315 "expires": [
316 "Sat, 01 Jan 2000 00:00:00 GMT"
317 ],
318 "content-type": [
319 "application/json"
320 ],
321 "referrer-policy": [
322 "no-referrer"
323 ],
324 "server": [
325 "Apache/2.4.10 (Debian)"
326 ],
327 "cache-control": [
328 "no-store"
329 ],
330 "x-content-type-options": [
331 "nosniff"
332 ],
333 "date": [
334 "Wed, 08 Apr 2020 21:13:03 GMT"
335 ]
336 },
337 "body": {
338 "string": "{\"result\":null,\"error_code\":null,\"error_info\":null}"
339 },
340 "status": {
341 "code": 200,
342 "message": "OK"
343 }
344 }
345 },
346 {
347 "request": {
348 "headers": {
349 "content-length": [
350 "364"
351 ],
352 "accept": [
353 "application/mercurial-0.1"
354 ],
355 "content-type": [
356 "application/x-www-form-urlencoded"
357 ],
358 "host": [
359 "phab.mercurial-scm.org"
360 ],
361 "user-agent": [
362 "mercurial/proto-1.0 (Mercurial 5.3.2+463-d35fbae9dd33+20200408)"
363 ]
364 },
365 "body": "__conduit__=1&params=%7B%22__conduit__%22%3A+%7B%22token%22%3A+%22cli-hahayouwish%22%7D%2C+%22corpus%22%3A+%22one%3A+first+commit+to+review%5Cn%5CnThis+file+was+modified+with+%27mod1%27+as+its+contents.%5Cn%5CnTest+Plan%3A%5CnLOL%21++What+testing%3F%21%5Cn%5CnDifferential+Revision%3A+https%3A%2F%2Fphab.mercurial-scm.org%2FD8387%22%7D&output=json",
366 "uri": "https://phab.mercurial-scm.org//api/differential.parsecommitmessage",
367 "method": "POST"
368 },
369 "response": {
370 "headers": {
371 "x-xss-protection": [
372 "1; mode=block"
373 ],
374 "strict-transport-security": [
375 "max-age=0; includeSubdomains; preload"
376 ],
377 "transfer-encoding": [
378 "chunked"
379 ],
380 "x-frame-options": [
381 "Deny"
382 ],
383 "expires": [
384 "Sat, 01 Jan 2000 00:00:00 GMT"
385 ],
386 "content-type": [
387 "application/json"
388 ],
389 "referrer-policy": [
390 "no-referrer"
391 ],
392 "server": [
393 "Apache/2.4.10 (Debian)"
394 ],
395 "cache-control": [
396 "no-store"
397 ],
398 "x-content-type-options": [
399 "nosniff"
400 ],
401 "date": [
402 "Wed, 08 Apr 2020 21:13:04 GMT"
403 ]
404 },
405 "body": {
406 "string": "{\"result\":{\"errors\":[],\"fields\":{\"title\":\"one: first commit to review\",\"testPlan\":\"LOL! What testing?!\",\"revisionID\":8387,\"summary\":\"This file was modified with 'mod1' as its contents.\"},\"revisionIDFieldInfo\":{\"value\":8387,\"validDomain\":\"https:\\/\\/phab.mercurial-scm.org\"},\"transactions\":[{\"type\":\"title\",\"value\":\"one: first commit to review\"},{\"type\":\"testPlan\",\"value\":\"LOL! What testing?!\"},{\"type\":\"summary\",\"value\":\"This file was modified with 'mod1' as its contents.\"}]},\"error_code\":null,\"error_info\":null}"
407 },
408 "status": {
409 "code": 200,
410 "message": "OK"
411 }
412 }
413 },
414 {
415 "request": {
416 "headers": {
417 "content-length": [
418 "361"
419 ],
420 "accept": [
421 "application/mercurial-0.1"
422 ],
423 "content-type": [
424 "application/x-www-form-urlencoded"
425 ],
426 "host": [
427 "phab.mercurial-scm.org"
428 ],
429 "user-agent": [
430 "mercurial/proto-1.0 (Mercurial 5.3.2+463-d35fbae9dd33+20200408)"
431 ]
432 },
433 "body": "__conduit__=1&params=%7B%22__conduit__%22%3A+%7B%22token%22%3A+%22cli-hahayouwish%22%7D%2C+%22corpus%22%3A+%22two%3A+second+commit+to+review%5Cn%5CnThis+file+was+modified+with+%27mod2%27+as+its+contents.%5Cn%5CnTest+Plan%3A%5CnHaha%21+yeah%2C+right.%5Cn%5CnDifferential+Revision%3A+https%3A%2F%2Fphab.mercurial-scm.org%2FD8387%22%7D&output=json",
434 "uri": "https://phab.mercurial-scm.org//api/differential.parsecommitmessage",
435 "method": "POST"
436 },
437 "response": {
438 "headers": {
439 "x-xss-protection": [
440 "1; mode=block"
441 ],
442 "strict-transport-security": [
443 "max-age=0; includeSubdomains; preload"
444 ],
445 "transfer-encoding": [
446 "chunked"
447 ],
448 "x-frame-options": [
449 "Deny"
450 ],
451 "expires": [
452 "Sat, 01 Jan 2000 00:00:00 GMT"
453 ],
454 "content-type": [
455 "application/json"
456 ],
457 "referrer-policy": [
458 "no-referrer"
459 ],
460 "server": [
461 "Apache/2.4.10 (Debian)"
462 ],
463 "cache-control": [
464 "no-store"
465 ],
466 "x-content-type-options": [
467 "nosniff"
468 ],
469 "date": [
470 "Wed, 08 Apr 2020 21:13:04 GMT"
471 ]
472 },
473 "body": {
474 "string": "{\"result\":{\"errors\":[],\"fields\":{\"title\":\"two: second commit to review\",\"testPlan\":\"Haha! yeah, right.\",\"revisionID\":8387,\"summary\":\"This file was modified with 'mod2' as its contents.\"},\"revisionIDFieldInfo\":{\"value\":8387,\"validDomain\":\"https:\\/\\/phab.mercurial-scm.org\"},\"transactions\":[{\"type\":\"title\",\"value\":\"two: second commit to review\"},{\"type\":\"testPlan\",\"value\":\"Haha! yeah, right.\"},{\"type\":\"summary\",\"value\":\"This file was modified with 'mod2' as its contents.\"}]},\"error_code\":null,\"error_info\":null}"
475 },
476 "status": {
477 "code": 200,
478 "message": "OK"
479 }
480 }
481 },
482 {
483 "request": {
484 "headers": {
485 "content-length": [
486 "260"
487 ],
488 "accept": [
489 "application/mercurial-0.1"
490 ],
491 "content-type": [
492 "application/x-www-form-urlencoded"
493 ],
494 "host": [
495 "phab.mercurial-scm.org"
496 ],
497 "user-agent": [
498 "mercurial/proto-1.0 (Mercurial 5.3.2+463-d35fbae9dd33+20200408)"
499 ]
500 },
501 "body": "__conduit__=1&params=%7B%22__conduit__%22%3A+%7B%22token%22%3A+%22cli-hahayouwish%22%7D%2C+%22corpus%22%3A+%223%3A+a+commit+with+no+detailed+message%5Cn%5CnDifferential+Revision%3A+https%3A%2F%2Fphab.mercurial-scm.org%2FD8387%22%7D&output=json",
502 "uri": "https://phab.mercurial-scm.org//api/differential.parsecommitmessage",
503 "method": "POST"
504 },
505 "response": {
506 "headers": {
507 "x-xss-protection": [
508 "1; mode=block"
509 ],
510 "strict-transport-security": [
511 "max-age=0; includeSubdomains; preload"
512 ],
513 "transfer-encoding": [
514 "chunked"
515 ],
516 "x-frame-options": [
517 "Deny"
518 ],
519 "expires": [
520 "Sat, 01 Jan 2000 00:00:00 GMT"
521 ],
522 "content-type": [
523 "application/json"
524 ],
525 "referrer-policy": [
526 "no-referrer"
527 ],
528 "server": [
529 "Apache/2.4.10 (Debian)"
530 ],
531 "cache-control": [
532 "no-store"
533 ],
534 "x-content-type-options": [
535 "nosniff"
536 ],
537 "date": [
538 "Wed, 08 Apr 2020 21:13:04 GMT"
539 ]
540 },
541 "body": {
542 "string": "{\"result\":{\"errors\":[],\"fields\":{\"title\":\"3: a commit with no detailed message\",\"revisionID\":8387},\"revisionIDFieldInfo\":{\"value\":8387,\"validDomain\":\"https:\\/\\/phab.mercurial-scm.org\"},\"transactions\":[{\"type\":\"title\",\"value\":\"3: a commit with no detailed message\"}]},\"error_code\":null,\"error_info\":null}"
543 },
544 "status": {
545 "code": 200,
546 "message": "OK"
547 }
548 }
549 },
550 {
551 "request": {
552 "headers": {
553 "content-length": [
554 "744"
555 ],
556 "accept": [
557 "application/mercurial-0.1"
558 ],
559 "content-type": [
560 "application/x-www-form-urlencoded"
561 ],
562 "host": [
563 "phab.mercurial-scm.org"
564 ],
565 "user-agent": [
566 "mercurial/proto-1.0 (Mercurial 5.3.2+463-d35fbae9dd33+20200408)"
567 ]
568 },
569 "body": "__conduit__=1&params=%7B%22__conduit__%22%3A+%7B%22token%22%3A+%22cli-hahayouwish%22%7D%2C+%22objectIdentifier%22%3A+8387%2C+%22transactions%22%3A+%5B%7B%22type%22%3A+%22update%22%2C+%22value%22%3A+%22PHID-DIFF-zkluur4ou3j4pswpif6e%22%7D%2C+%7B%22type%22%3A+%22title%22%2C+%22value%22%3A+%22one%3A+first+commit+to+review%22%7D%2C+%7B%22type%22%3A+%22testPlan%22%2C+%22value%22%3A+%22LOL%21++What+testing%3F%21%5Cn%5CnHaha%21+yeah%2C+right.%22%7D%2C+%7B%22type%22%3A+%22summary%22%2C+%22value%22%3A+%22This+file+was+modified+with+%27mod1%27+as+its+contents.%5Cn%5Cntwo%3A+second+commit+to+review%5Cn%5CnThis+file+was+modified+with+%27mod2%27+as+its+contents.%5Cn%5Cn3%3A+a+commit+with+no+detailed+message%22%7D%5D%7D&output=json",
570 "uri": "https://phab.mercurial-scm.org//api/differential.revision.edit",
571 "method": "POST"
572 },
573 "response": {
574 "headers": {
575 "x-xss-protection": [
576 "1; mode=block"
577 ],
578 "strict-transport-security": [
579 "max-age=0; includeSubdomains; preload"
580 ],
581 "transfer-encoding": [
582 "chunked"
583 ],
584 "x-frame-options": [
585 "Deny"
586 ],
587 "expires": [
588 "Sat, 01 Jan 2000 00:00:00 GMT"
589 ],
590 "content-type": [
591 "application/json"
592 ],
593 "referrer-policy": [
594 "no-referrer"
595 ],
596 "server": [
597 "Apache/2.4.10 (Debian)"
598 ],
599 "cache-control": [
600 "no-store"
601 ],
602 "x-content-type-options": [
603 "nosniff"
604 ],
605 "date": [
606 "Wed, 08 Apr 2020 21:13:05 GMT"
607 ]
608 },
609 "body": {
610 "string": "{\"result\":{\"object\":{\"id\":8387,\"phid\":\"PHID-DREV-6ov3pvjim4txejzekw2t\"},\"transactions\":[{\"phid\":\"PHID-XACT-DREV-thuey6pboatact4\"}]},\"error_code\":null,\"error_info\":null}"
611 },
612 "status": {
613 "code": 200,
614 "message": "OK"
615 }
616 }
617 },
618 {
619 "request": {
620 "headers": {
621 "content-length": [
622 "146"
623 ],
624 "accept": [
625 "application/mercurial-0.1"
626 ],
627 "content-type": [
628 "application/x-www-form-urlencoded"
629 ],
630 "host": [
631 "phab.mercurial-scm.org"
632 ],
633 "user-agent": [
634 "mercurial/proto-1.0 (Mercurial 5.3.2+463-d35fbae9dd33+20200408)"
635 ]
636 },
637 "body": "__conduit__=1&params=%7B%22__conduit__%22%3A+%7B%22token%22%3A+%22cli-hahayouwish%22%7D%2C+%22ids%22%3A+%5B8387%5D%7D&output=json",
638 "uri": "https://phab.mercurial-scm.org//api/differential.query",
639 "method": "POST"
640 },
641 "response": {
642 "headers": {
643 "x-xss-protection": [
644 "1; mode=block"
645 ],
646 "strict-transport-security": [
647 "max-age=0; includeSubdomains; preload"
648 ],
649 "transfer-encoding": [
650 "chunked"
651 ],
652 "x-frame-options": [
653 "Deny"
654 ],
655 "expires": [
656 "Sat, 01 Jan 2000 00:00:00 GMT"
657 ],
658 "content-type": [
659 "application/json"
660 ],
661 "referrer-policy": [
662 "no-referrer"
663 ],
664 "server": [
665 "Apache/2.4.10 (Debian)"
666 ],
667 "cache-control": [
668 "no-store"
669 ],
670 "x-content-type-options": [
671 "nosniff"
672 ],
673 "date": [
674 "Wed, 08 Apr 2020 21:13:06 GMT"
675 ]
676 },
677 "body": {
678 "string": "{\"result\":[{\"id\":\"8387\",\"phid\":\"PHID-DREV-6ov3pvjim4txejzekw2t\",\"title\":\"one: first commit to review\",\"uri\":\"https:\\/\\/phab.mercurial-scm.org\\/D8387\",\"dateCreated\":\"1586380377\",\"dateModified\":\"1586380385\",\"authorPHID\":\"PHID-USER-tzhaient733lwrlbcag5\",\"status\":\"0\",\"statusName\":\"Needs Review\",\"properties\":{\"draft.broadcast\":true,\"lines.added\":2,\"lines.removed\":1},\"branch\":\"default\",\"summary\":\"This file was modified with 'mod1' as its contents.\\n\\ntwo: second commit to review\\n\\nThis file was modified with 'mod2' as its contents.\\n\\n3: a commit with no detailed message\",\"testPlan\":\"LOL! What testing?!\\n\\nHaha! yeah, right.\",\"lineCount\":\"3\",\"activeDiffPHID\":\"PHID-DIFF-zkluur4ou3j4pswpif6e\",\"diffs\":[\"21007\",\"21006\"],\"commits\":[],\"reviewers\":{\"PHID-PROJ-3dvcxzznrjru2xmmses3\":\"PHID-PROJ-3dvcxzznrjru2xmmses3\"},\"ccs\":[\"PHID-USER-q42dn7cc3donqriafhjx\"],\"hashes\":[[\"hgcm\",\"\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\"],[\"hgcm\",\"\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\"],[\"hgcm\",\"\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\\u0000\"]],\"auxiliary\":{\"phabricator:projects\":[],\"phabricator:depends-on\":[]},\"repositoryPHID\":\"PHID-REPO-bvunnehri4u2isyr7bc3\",\"sourcePath\":\"\\/\"}],\"error_code\":null,\"error_info\":null}"
679 },
680 "status": {
681 "code": 200,
682 "message": "OK"
683 }
684 }
685 },
686 {
687 "request": {
688 "headers": {
689 "content-length": [
690 "482"
691 ],
692 "accept": [
693 "application/mercurial-0.1"
694 ],
695 "content-type": [
696 "application/x-www-form-urlencoded"
697 ],
698 "host": [
699 "phab.mercurial-scm.org"
700 ],
701 "user-agent": [
702 "mercurial/proto-1.0 (Mercurial 5.3.2+463-d35fbae9dd33+20200408)"
703 ]
704 },
705 "body": "__conduit__=1&params=%7B%22__conduit__%22%3A+%7B%22token%22%3A+%22cli-hahayouwish%22%7D%2C+%22data%22%3A+%22%7B%5C%22branch%5C%22%3A+%5C%22default%5C%22%2C+%5C%22date%5C%22%3A+%5C%220+0%5C%22%2C+%5C%22node%5C%22%3A+%5C%22e4edb1fe3565eaaecc1787ada4fcc2b7e9018fac%5C%22%2C+%5C%22parent%5C%22%3A+%5C%2298d480e0d494906d9758c44c622951b429afd862%5C%22%2C+%5C%22user%5C%22%3A+%5C%22test%5C%22%7D%22%2C+%22diff_id%22%3A+21007%2C+%22name%22%3A+%22hg%3Ameta%22%7D&output=json",
706 "uri": "https://phab.mercurial-scm.org//api/differential.setdiffproperty",
707 "method": "POST"
708 },
709 "response": {
710 "headers": {
711 "x-xss-protection": [
712 "1; mode=block"
713 ],
714 "strict-transport-security": [
715 "max-age=0; includeSubdomains; preload"
716 ],
717 "transfer-encoding": [
718 "chunked"
719 ],
720 "x-frame-options": [
721 "Deny"
722 ],
723 "expires": [
724 "Sat, 01 Jan 2000 00:00:00 GMT"
725 ],
726 "content-type": [
727 "application/json"
728 ],
729 "referrer-policy": [
730 "no-referrer"
731 ],
732 "server": [
733 "Apache/2.4.10 (Debian)"
734 ],
735 "cache-control": [
736 "no-store"
737 ],
738 "x-content-type-options": [
739 "nosniff"
740 ],
741 "date": [
742 "Wed, 08 Apr 2020 21:13:06 GMT"
743 ]
744 },
745 "body": {
746 "string": "{\"result\":null,\"error_code\":null,\"error_info\":null}"
747 },
748 "status": {
749 "code": 200,
750 "message": "OK"
751 }
752 }
753 },
754 {
755 "request": {
756 "headers": {
757 "content-length": [
758 "1362"
759 ],
760 "accept": [
761 "application/mercurial-0.1"
762 ],
763 "content-type": [
764 "application/x-www-form-urlencoded"
765 ],
766 "host": [
767 "phab.mercurial-scm.org"
768 ],
769 "user-agent": [
770 "mercurial/proto-1.0 (Mercurial 5.3.2+463-d35fbae9dd33+20200408)"
771 ]
772 },
773 "body": "__conduit__=1&params=%7B%22__conduit__%22%3A+%7B%22token%22%3A+%22cli-hahayouwish%22%7D%2C+%22data%22%3A+%22%7B%5C%220124e5474c880e4fb40c8326ad2b75ae3e57ee5f%5C%22%3A+%7B%5C%22author%5C%22%3A+%5C%22test%5C%22%2C+%5C%22authorEmail%5C%22%3A+%5C%22test%5C%22%2C+%5C%22branch%5C%22%3A+%5C%22default%5C%22%2C+%5C%22commit%5C%22%3A+%5C%220124e5474c880e4fb40c8326ad2b75ae3e57ee5f%5C%22%2C+%5C%22parents%5C%22%3A+%5B%5C%22602c4e7382436988e46c0d56fb3883968302b3f6%5C%22%5D%2C+%5C%22time%5C%22%3A+0%7D%2C+%5C%22602c4e7382436988e46c0d56fb3883968302b3f6%5C%22%3A+%7B%5C%22author%5C%22%3A+%5C%22test%5C%22%2C+%5C%22authorEmail%5C%22%3A+%5C%22test%5C%22%2C+%5C%22branch%5C%22%3A+%5C%22default%5C%22%2C+%5C%22commit%5C%22%3A+%5C%22602c4e7382436988e46c0d56fb3883968302b3f6%5C%22%2C+%5C%22parents%5C%22%3A+%5B%5C%2298d480e0d494906d9758c44c622951b429afd862%5C%22%5D%2C+%5C%22time%5C%22%3A+0%7D%2C+%5C%22e4edb1fe3565eaaecc1787ada4fcc2b7e9018fac%5C%22%3A+%7B%5C%22author%5C%22%3A+%5C%22test%5C%22%2C+%5C%22authorEmail%5C%22%3A+%5C%22test%5C%22%2C+%5C%22branch%5C%22%3A+%5C%22default%5C%22%2C+%5C%22commit%5C%22%3A+%5C%22e4edb1fe3565eaaecc1787ada4fcc2b7e9018fac%5C%22%2C+%5C%22parents%5C%22%3A+%5B%5C%220124e5474c880e4fb40c8326ad2b75ae3e57ee5f%5C%22%5D%2C+%5C%22time%5C%22%3A+0%7D%7D%22%2C+%22diff_id%22%3A+21007%2C+%22name%22%3A+%22local%3Acommits%22%7D&output=json",
774 "uri": "https://phab.mercurial-scm.org//api/differential.setdiffproperty",
775 "method": "POST"
776 },
777 "response": {
778 "headers": {
779 "x-xss-protection": [
780 "1; mode=block"
781 ],
782 "strict-transport-security": [
783 "max-age=0; includeSubdomains; preload"
784 ],
785 "transfer-encoding": [
786 "chunked"
787 ],
788 "x-frame-options": [
789 "Deny"
790 ],
791 "expires": [
792 "Sat, 01 Jan 2000 00:00:00 GMT"
793 ],
794 "content-type": [
795 "application/json"
796 ],
797 "referrer-policy": [
798 "no-referrer"
799 ],
800 "server": [
801 "Apache/2.4.10 (Debian)"
802 ],
803 "cache-control": [
804 "no-store"
805 ],
806 "x-content-type-options": [
807 "nosniff"
808 ],
809 "date": [
810 "Wed, 08 Apr 2020 21:13:06 GMT"
811 ]
812 },
813 "body": {
814 "string": "{\"result\":null,\"error_code\":null,\"error_info\":null}"
815 },
816 "status": {
817 "code": 200,
818 "message": "OK"
819 }
820 }
821 }
822 ],
823 "version": 1
824 } No newline at end of file
@@ -1,2104 +1,2219 b''
1 # phabricator.py - simple Phabricator integration
1 # phabricator.py - simple Phabricator integration
2 #
2 #
3 # Copyright 2017 Facebook, Inc.
3 # Copyright 2017 Facebook, Inc.
4 #
4 #
5 # This software may be used and distributed according to the terms of the
5 # This software may be used and distributed according to the terms of the
6 # GNU General Public License version 2 or any later version.
6 # GNU General Public License version 2 or any later version.
7 """simple Phabricator integration (EXPERIMENTAL)
7 """simple Phabricator integration (EXPERIMENTAL)
8
8
9 This extension provides a ``phabsend`` command which sends a stack of
9 This extension provides a ``phabsend`` command which sends a stack of
10 changesets to Phabricator, and a ``phabread`` command which prints a stack of
10 changesets to Phabricator, and a ``phabread`` command which prints a stack of
11 revisions in a format suitable for :hg:`import`, and a ``phabupdate`` command
11 revisions in a format suitable for :hg:`import`, and a ``phabupdate`` command
12 to update statuses in batch.
12 to update statuses in batch.
13
13
14 A "phabstatus" view for :hg:`show` is also provided; it displays status
14 A "phabstatus" view for :hg:`show` is also provided; it displays status
15 information of Phabricator differentials associated with unfinished
15 information of Phabricator differentials associated with unfinished
16 changesets.
16 changesets.
17
17
18 By default, Phabricator requires ``Test Plan`` which might prevent some
18 By default, Phabricator requires ``Test Plan`` which might prevent some
19 changeset from being sent. The requirement could be disabled by changing
19 changeset from being sent. The requirement could be disabled by changing
20 ``differential.require-test-plan-field`` config server side.
20 ``differential.require-test-plan-field`` config server side.
21
21
22 Config::
22 Config::
23
23
24 [phabricator]
24 [phabricator]
25 # Phabricator URL
25 # Phabricator URL
26 url = https://phab.example.com/
26 url = https://phab.example.com/
27
27
28 # Repo callsign. If a repo has a URL https://$HOST/diffusion/FOO, then its
28 # Repo callsign. If a repo has a URL https://$HOST/diffusion/FOO, then its
29 # callsign is "FOO".
29 # callsign is "FOO".
30 callsign = FOO
30 callsign = FOO
31
31
32 # curl command to use. If not set (default), use builtin HTTP library to
32 # curl command to use. If not set (default), use builtin HTTP library to
33 # communicate. If set, use the specified curl command. This could be useful
33 # communicate. If set, use the specified curl command. This could be useful
34 # if you need to specify advanced options that is not easily supported by
34 # if you need to specify advanced options that is not easily supported by
35 # the internal library.
35 # the internal library.
36 curlcmd = curl --connect-timeout 2 --retry 3 --silent
36 curlcmd = curl --connect-timeout 2 --retry 3 --silent
37
37
38 [auth]
38 [auth]
39 example.schemes = https
39 example.schemes = https
40 example.prefix = phab.example.com
40 example.prefix = phab.example.com
41
41
42 # API token. Get it from https://$HOST/conduit/login/
42 # API token. Get it from https://$HOST/conduit/login/
43 example.phabtoken = cli-xxxxxxxxxxxxxxxxxxxxxxxxxxxx
43 example.phabtoken = cli-xxxxxxxxxxxxxxxxxxxxxxxxxxxx
44 """
44 """
45
45
46 from __future__ import absolute_import
46 from __future__ import absolute_import
47
47
48 import base64
48 import base64
49 import contextlib
49 import contextlib
50 import hashlib
50 import hashlib
51 import itertools
51 import itertools
52 import json
52 import json
53 import mimetypes
53 import mimetypes
54 import operator
54 import operator
55 import re
55 import re
56
56
57 from mercurial.node import bin, nullid, short
57 from mercurial.node import bin, nullid, short
58 from mercurial.i18n import _
58 from mercurial.i18n import _
59 from mercurial.pycompat import getattr
59 from mercurial.pycompat import getattr
60 from mercurial.thirdparty import attr
60 from mercurial.thirdparty import attr
61 from mercurial import (
61 from mercurial import (
62 cmdutil,
62 cmdutil,
63 context,
63 context,
64 copies,
64 copies,
65 encoding,
65 encoding,
66 error,
66 error,
67 exthelper,
67 exthelper,
68 graphmod,
68 graphmod,
69 httpconnection as httpconnectionmod,
69 httpconnection as httpconnectionmod,
70 localrepo,
70 localrepo,
71 logcmdutil,
71 logcmdutil,
72 match,
72 match,
73 mdiff,
73 mdiff,
74 obsutil,
74 obsutil,
75 parser,
75 parser,
76 patch,
76 patch,
77 phases,
77 phases,
78 pycompat,
78 pycompat,
79 scmutil,
79 scmutil,
80 smartset,
80 smartset,
81 tags,
81 tags,
82 templatefilters,
82 templatefilters,
83 templateutil,
83 templateutil,
84 url as urlmod,
84 url as urlmod,
85 util,
85 util,
86 )
86 )
87 from mercurial.utils import (
87 from mercurial.utils import (
88 procutil,
88 procutil,
89 stringutil,
89 stringutil,
90 )
90 )
91 from . import show
91 from . import show
92
92
93
93
94 # Note for extension authors: ONLY specify testedwith = 'ships-with-hg-core' for
94 # Note for extension authors: ONLY specify testedwith = 'ships-with-hg-core' for
95 # extensions which SHIP WITH MERCURIAL. Non-mainline extensions should
95 # extensions which SHIP WITH MERCURIAL. Non-mainline extensions should
96 # be specifying the version(s) of Mercurial they are tested with, or
96 # be specifying the version(s) of Mercurial they are tested with, or
97 # leave the attribute unspecified.
97 # leave the attribute unspecified.
98 testedwith = b'ships-with-hg-core'
98 testedwith = b'ships-with-hg-core'
99
99
100 eh = exthelper.exthelper()
100 eh = exthelper.exthelper()
101
101
102 cmdtable = eh.cmdtable
102 cmdtable = eh.cmdtable
103 command = eh.command
103 command = eh.command
104 configtable = eh.configtable
104 configtable = eh.configtable
105 templatekeyword = eh.templatekeyword
105 templatekeyword = eh.templatekeyword
106 uisetup = eh.finaluisetup
106 uisetup = eh.finaluisetup
107
107
108 # developer config: phabricator.batchsize
108 # developer config: phabricator.batchsize
109 eh.configitem(
109 eh.configitem(
110 b'phabricator', b'batchsize', default=12,
110 b'phabricator', b'batchsize', default=12,
111 )
111 )
112 eh.configitem(
112 eh.configitem(
113 b'phabricator', b'callsign', default=None,
113 b'phabricator', b'callsign', default=None,
114 )
114 )
115 eh.configitem(
115 eh.configitem(
116 b'phabricator', b'curlcmd', default=None,
116 b'phabricator', b'curlcmd', default=None,
117 )
117 )
118 # developer config: phabricator.debug
118 # developer config: phabricator.debug
119 eh.configitem(
119 eh.configitem(
120 b'phabricator', b'debug', default=False,
120 b'phabricator', b'debug', default=False,
121 )
121 )
122 # developer config: phabricator.repophid
122 # developer config: phabricator.repophid
123 eh.configitem(
123 eh.configitem(
124 b'phabricator', b'repophid', default=None,
124 b'phabricator', b'repophid', default=None,
125 )
125 )
126 eh.configitem(
126 eh.configitem(
127 b'phabricator', b'url', default=None,
127 b'phabricator', b'url', default=None,
128 )
128 )
129 eh.configitem(
129 eh.configitem(
130 b'phabsend', b'confirm', default=False,
130 b'phabsend', b'confirm', default=False,
131 )
131 )
132 eh.configitem(
132 eh.configitem(
133 b'phabimport', b'secret', default=False,
133 b'phabimport', b'secret', default=False,
134 )
134 )
135 eh.configitem(
135 eh.configitem(
136 b'phabimport', b'obsolete', default=False,
136 b'phabimport', b'obsolete', default=False,
137 )
137 )
138
138
139 colortable = {
139 colortable = {
140 b'phabricator.action.created': b'green',
140 b'phabricator.action.created': b'green',
141 b'phabricator.action.skipped': b'magenta',
141 b'phabricator.action.skipped': b'magenta',
142 b'phabricator.action.updated': b'magenta',
142 b'phabricator.action.updated': b'magenta',
143 b'phabricator.desc': b'',
143 b'phabricator.desc': b'',
144 b'phabricator.drev': b'bold',
144 b'phabricator.drev': b'bold',
145 b'phabricator.node': b'',
145 b'phabricator.node': b'',
146 b'phabricator.status.abandoned': b'magenta dim',
146 b'phabricator.status.abandoned': b'magenta dim',
147 b'phabricator.status.accepted': b'green bold',
147 b'phabricator.status.accepted': b'green bold',
148 b'phabricator.status.closed': b'green',
148 b'phabricator.status.closed': b'green',
149 b'phabricator.status.needsreview': b'yellow',
149 b'phabricator.status.needsreview': b'yellow',
150 b'phabricator.status.needsrevision': b'red',
150 b'phabricator.status.needsrevision': b'red',
151 b'phabricator.status.changesplanned': b'red',
151 b'phabricator.status.changesplanned': b'red',
152 }
152 }
153
153
154 _VCR_FLAGS = [
154 _VCR_FLAGS = [
155 (
155 (
156 b'',
156 b'',
157 b'test-vcr',
157 b'test-vcr',
158 b'',
158 b'',
159 _(
159 _(
160 b'Path to a vcr file. If nonexistent, will record a new vcr transcript'
160 b'Path to a vcr file. If nonexistent, will record a new vcr transcript'
161 b', otherwise will mock all http requests using the specified vcr file.'
161 b', otherwise will mock all http requests using the specified vcr file.'
162 b' (ADVANCED)'
162 b' (ADVANCED)'
163 ),
163 ),
164 ),
164 ),
165 ]
165 ]
166
166
167
167
168 @eh.wrapfunction(localrepo, "loadhgrc")
168 @eh.wrapfunction(localrepo, "loadhgrc")
169 def _loadhgrc(orig, ui, wdirvfs, hgvfs, requirements):
169 def _loadhgrc(orig, ui, wdirvfs, hgvfs, requirements):
170 """Load ``.arcconfig`` content into a ui instance on repository open.
170 """Load ``.arcconfig`` content into a ui instance on repository open.
171 """
171 """
172 result = False
172 result = False
173 arcconfig = {}
173 arcconfig = {}
174
174
175 try:
175 try:
176 # json.loads only accepts bytes from 3.6+
176 # json.loads only accepts bytes from 3.6+
177 rawparams = encoding.unifromlocal(wdirvfs.read(b".arcconfig"))
177 rawparams = encoding.unifromlocal(wdirvfs.read(b".arcconfig"))
178 # json.loads only returns unicode strings
178 # json.loads only returns unicode strings
179 arcconfig = pycompat.rapply(
179 arcconfig = pycompat.rapply(
180 lambda x: encoding.unitolocal(x)
180 lambda x: encoding.unitolocal(x)
181 if isinstance(x, pycompat.unicode)
181 if isinstance(x, pycompat.unicode)
182 else x,
182 else x,
183 pycompat.json_loads(rawparams),
183 pycompat.json_loads(rawparams),
184 )
184 )
185
185
186 result = True
186 result = True
187 except ValueError:
187 except ValueError:
188 ui.warn(_(b"invalid JSON in %s\n") % wdirvfs.join(b".arcconfig"))
188 ui.warn(_(b"invalid JSON in %s\n") % wdirvfs.join(b".arcconfig"))
189 except IOError:
189 except IOError:
190 pass
190 pass
191
191
192 cfg = util.sortdict()
192 cfg = util.sortdict()
193
193
194 if b"repository.callsign" in arcconfig:
194 if b"repository.callsign" in arcconfig:
195 cfg[(b"phabricator", b"callsign")] = arcconfig[b"repository.callsign"]
195 cfg[(b"phabricator", b"callsign")] = arcconfig[b"repository.callsign"]
196
196
197 if b"phabricator.uri" in arcconfig:
197 if b"phabricator.uri" in arcconfig:
198 cfg[(b"phabricator", b"url")] = arcconfig[b"phabricator.uri"]
198 cfg[(b"phabricator", b"url")] = arcconfig[b"phabricator.uri"]
199
199
200 if cfg:
200 if cfg:
201 ui.applyconfig(cfg, source=wdirvfs.join(b".arcconfig"))
201 ui.applyconfig(cfg, source=wdirvfs.join(b".arcconfig"))
202
202
203 return orig(ui, wdirvfs, hgvfs, requirements) or result # Load .hg/hgrc
203 return orig(ui, wdirvfs, hgvfs, requirements) or result # Load .hg/hgrc
204
204
205
205
206 def vcrcommand(name, flags, spec, helpcategory=None, optionalrepo=False):
206 def vcrcommand(name, flags, spec, helpcategory=None, optionalrepo=False):
207 fullflags = flags + _VCR_FLAGS
207 fullflags = flags + _VCR_FLAGS
208
208
209 def hgmatcher(r1, r2):
209 def hgmatcher(r1, r2):
210 if r1.uri != r2.uri or r1.method != r2.method:
210 if r1.uri != r2.uri or r1.method != r2.method:
211 return False
211 return False
212 r1params = util.urlreq.parseqs(r1.body)
212 r1params = util.urlreq.parseqs(r1.body)
213 r2params = util.urlreq.parseqs(r2.body)
213 r2params = util.urlreq.parseqs(r2.body)
214 for key in r1params:
214 for key in r1params:
215 if key not in r2params:
215 if key not in r2params:
216 return False
216 return False
217 value = r1params[key][0]
217 value = r1params[key][0]
218 # we want to compare json payloads without worrying about ordering
218 # we want to compare json payloads without worrying about ordering
219 if value.startswith(b'{') and value.endswith(b'}'):
219 if value.startswith(b'{') and value.endswith(b'}'):
220 r1json = pycompat.json_loads(value)
220 r1json = pycompat.json_loads(value)
221 r2json = pycompat.json_loads(r2params[key][0])
221 r2json = pycompat.json_loads(r2params[key][0])
222 if r1json != r2json:
222 if r1json != r2json:
223 return False
223 return False
224 elif r2params[key][0] != value:
224 elif r2params[key][0] != value:
225 return False
225 return False
226 return True
226 return True
227
227
228 def sanitiserequest(request):
228 def sanitiserequest(request):
229 request.body = re.sub(
229 request.body = re.sub(
230 br'cli-[a-z0-9]+', br'cli-hahayouwish', request.body
230 br'cli-[a-z0-9]+', br'cli-hahayouwish', request.body
231 )
231 )
232 return request
232 return request
233
233
234 def sanitiseresponse(response):
234 def sanitiseresponse(response):
235 if 'set-cookie' in response['headers']:
235 if 'set-cookie' in response['headers']:
236 del response['headers']['set-cookie']
236 del response['headers']['set-cookie']
237 return response
237 return response
238
238
239 def decorate(fn):
239 def decorate(fn):
240 def inner(*args, **kwargs):
240 def inner(*args, **kwargs):
241 cassette = pycompat.fsdecode(kwargs.pop('test_vcr', None))
241 cassette = pycompat.fsdecode(kwargs.pop('test_vcr', None))
242 if cassette:
242 if cassette:
243 import hgdemandimport
243 import hgdemandimport
244
244
245 with hgdemandimport.deactivated():
245 with hgdemandimport.deactivated():
246 import vcr as vcrmod
246 import vcr as vcrmod
247 import vcr.stubs as stubs
247 import vcr.stubs as stubs
248
248
249 vcr = vcrmod.VCR(
249 vcr = vcrmod.VCR(
250 serializer='json',
250 serializer='json',
251 before_record_request=sanitiserequest,
251 before_record_request=sanitiserequest,
252 before_record_response=sanitiseresponse,
252 before_record_response=sanitiseresponse,
253 custom_patches=[
253 custom_patches=[
254 (
254 (
255 urlmod,
255 urlmod,
256 'httpconnection',
256 'httpconnection',
257 stubs.VCRHTTPConnection,
257 stubs.VCRHTTPConnection,
258 ),
258 ),
259 (
259 (
260 urlmod,
260 urlmod,
261 'httpsconnection',
261 'httpsconnection',
262 stubs.VCRHTTPSConnection,
262 stubs.VCRHTTPSConnection,
263 ),
263 ),
264 ],
264 ],
265 )
265 )
266 vcr.register_matcher('hgmatcher', hgmatcher)
266 vcr.register_matcher('hgmatcher', hgmatcher)
267 with vcr.use_cassette(cassette, match_on=['hgmatcher']):
267 with vcr.use_cassette(cassette, match_on=['hgmatcher']):
268 return fn(*args, **kwargs)
268 return fn(*args, **kwargs)
269 return fn(*args, **kwargs)
269 return fn(*args, **kwargs)
270
270
271 cmd = util.checksignature(inner, depth=2)
271 cmd = util.checksignature(inner, depth=2)
272 cmd.__name__ = fn.__name__
272 cmd.__name__ = fn.__name__
273 cmd.__doc__ = fn.__doc__
273 cmd.__doc__ = fn.__doc__
274
274
275 return command(
275 return command(
276 name,
276 name,
277 fullflags,
277 fullflags,
278 spec,
278 spec,
279 helpcategory=helpcategory,
279 helpcategory=helpcategory,
280 optionalrepo=optionalrepo,
280 optionalrepo=optionalrepo,
281 )(cmd)
281 )(cmd)
282
282
283 return decorate
283 return decorate
284
284
285
285
286 def _debug(ui, *msg, **opts):
286 def _debug(ui, *msg, **opts):
287 """write debug output for Phabricator if ``phabricator.debug`` is set
287 """write debug output for Phabricator if ``phabricator.debug`` is set
288
288
289 Specifically, this avoids dumping Conduit and HTTP auth chatter that is
289 Specifically, this avoids dumping Conduit and HTTP auth chatter that is
290 printed with the --debug argument.
290 printed with the --debug argument.
291 """
291 """
292 if ui.configbool(b"phabricator", b"debug"):
292 if ui.configbool(b"phabricator", b"debug"):
293 flag = ui.debugflag
293 flag = ui.debugflag
294 try:
294 try:
295 ui.debugflag = True
295 ui.debugflag = True
296 ui.write(*msg, **opts)
296 ui.write(*msg, **opts)
297 finally:
297 finally:
298 ui.debugflag = flag
298 ui.debugflag = flag
299
299
300
300
301 def urlencodenested(params):
301 def urlencodenested(params):
302 """like urlencode, but works with nested parameters.
302 """like urlencode, but works with nested parameters.
303
303
304 For example, if params is {'a': ['b', 'c'], 'd': {'e': 'f'}}, it will be
304 For example, if params is {'a': ['b', 'c'], 'd': {'e': 'f'}}, it will be
305 flattened to {'a[0]': 'b', 'a[1]': 'c', 'd[e]': 'f'} and then passed to
305 flattened to {'a[0]': 'b', 'a[1]': 'c', 'd[e]': 'f'} and then passed to
306 urlencode. Note: the encoding is consistent with PHP's http_build_query.
306 urlencode. Note: the encoding is consistent with PHP's http_build_query.
307 """
307 """
308 flatparams = util.sortdict()
308 flatparams = util.sortdict()
309
309
310 def process(prefix, obj):
310 def process(prefix, obj):
311 if isinstance(obj, bool):
311 if isinstance(obj, bool):
312 obj = {True: b'true', False: b'false'}[obj] # Python -> PHP form
312 obj = {True: b'true', False: b'false'}[obj] # Python -> PHP form
313 lister = lambda l: [(b'%d' % k, v) for k, v in enumerate(l)]
313 lister = lambda l: [(b'%d' % k, v) for k, v in enumerate(l)]
314 items = {list: lister, dict: lambda x: x.items()}.get(type(obj))
314 items = {list: lister, dict: lambda x: x.items()}.get(type(obj))
315 if items is None:
315 if items is None:
316 flatparams[prefix] = obj
316 flatparams[prefix] = obj
317 else:
317 else:
318 for k, v in items(obj):
318 for k, v in items(obj):
319 if prefix:
319 if prefix:
320 process(b'%s[%s]' % (prefix, k), v)
320 process(b'%s[%s]' % (prefix, k), v)
321 else:
321 else:
322 process(k, v)
322 process(k, v)
323
323
324 process(b'', params)
324 process(b'', params)
325 return util.urlreq.urlencode(flatparams)
325 return util.urlreq.urlencode(flatparams)
326
326
327
327
328 def readurltoken(ui):
328 def readurltoken(ui):
329 """return conduit url, token and make sure they exist
329 """return conduit url, token and make sure they exist
330
330
331 Currently read from [auth] config section. In the future, it might
331 Currently read from [auth] config section. In the future, it might
332 make sense to read from .arcconfig and .arcrc as well.
332 make sense to read from .arcconfig and .arcrc as well.
333 """
333 """
334 url = ui.config(b'phabricator', b'url')
334 url = ui.config(b'phabricator', b'url')
335 if not url:
335 if not url:
336 raise error.Abort(
336 raise error.Abort(
337 _(b'config %s.%s is required') % (b'phabricator', b'url')
337 _(b'config %s.%s is required') % (b'phabricator', b'url')
338 )
338 )
339
339
340 res = httpconnectionmod.readauthforuri(ui, url, util.url(url).user)
340 res = httpconnectionmod.readauthforuri(ui, url, util.url(url).user)
341 token = None
341 token = None
342
342
343 if res:
343 if res:
344 group, auth = res
344 group, auth = res
345
345
346 ui.debug(b"using auth.%s.* for authentication\n" % group)
346 ui.debug(b"using auth.%s.* for authentication\n" % group)
347
347
348 token = auth.get(b'phabtoken')
348 token = auth.get(b'phabtoken')
349
349
350 if not token:
350 if not token:
351 raise error.Abort(
351 raise error.Abort(
352 _(b'Can\'t find conduit token associated to %s') % (url,)
352 _(b'Can\'t find conduit token associated to %s') % (url,)
353 )
353 )
354
354
355 return url, token
355 return url, token
356
356
357
357
358 def callconduit(ui, name, params):
358 def callconduit(ui, name, params):
359 """call Conduit API, params is a dict. return json.loads result, or None"""
359 """call Conduit API, params is a dict. return json.loads result, or None"""
360 host, token = readurltoken(ui)
360 host, token = readurltoken(ui)
361 url, authinfo = util.url(b'/'.join([host, b'api', name])).authinfo()
361 url, authinfo = util.url(b'/'.join([host, b'api', name])).authinfo()
362 ui.debug(b'Conduit Call: %s %s\n' % (url, pycompat.byterepr(params)))
362 ui.debug(b'Conduit Call: %s %s\n' % (url, pycompat.byterepr(params)))
363 params = params.copy()
363 params = params.copy()
364 params[b'__conduit__'] = {
364 params[b'__conduit__'] = {
365 b'token': token,
365 b'token': token,
366 }
366 }
367 rawdata = {
367 rawdata = {
368 b'params': templatefilters.json(params),
368 b'params': templatefilters.json(params),
369 b'output': b'json',
369 b'output': b'json',
370 b'__conduit__': 1,
370 b'__conduit__': 1,
371 }
371 }
372 data = urlencodenested(rawdata)
372 data = urlencodenested(rawdata)
373 curlcmd = ui.config(b'phabricator', b'curlcmd')
373 curlcmd = ui.config(b'phabricator', b'curlcmd')
374 if curlcmd:
374 if curlcmd:
375 sin, sout = procutil.popen2(
375 sin, sout = procutil.popen2(
376 b'%s -d @- %s' % (curlcmd, procutil.shellquote(url))
376 b'%s -d @- %s' % (curlcmd, procutil.shellquote(url))
377 )
377 )
378 sin.write(data)
378 sin.write(data)
379 sin.close()
379 sin.close()
380 body = sout.read()
380 body = sout.read()
381 else:
381 else:
382 urlopener = urlmod.opener(ui, authinfo)
382 urlopener = urlmod.opener(ui, authinfo)
383 request = util.urlreq.request(pycompat.strurl(url), data=data)
383 request = util.urlreq.request(pycompat.strurl(url), data=data)
384 with contextlib.closing(urlopener.open(request)) as rsp:
384 with contextlib.closing(urlopener.open(request)) as rsp:
385 body = rsp.read()
385 body = rsp.read()
386 ui.debug(b'Conduit Response: %s\n' % body)
386 ui.debug(b'Conduit Response: %s\n' % body)
387 parsed = pycompat.rapply(
387 parsed = pycompat.rapply(
388 lambda x: encoding.unitolocal(x)
388 lambda x: encoding.unitolocal(x)
389 if isinstance(x, pycompat.unicode)
389 if isinstance(x, pycompat.unicode)
390 else x,
390 else x,
391 # json.loads only accepts bytes from py3.6+
391 # json.loads only accepts bytes from py3.6+
392 pycompat.json_loads(encoding.unifromlocal(body)),
392 pycompat.json_loads(encoding.unifromlocal(body)),
393 )
393 )
394 if parsed.get(b'error_code'):
394 if parsed.get(b'error_code'):
395 msg = _(b'Conduit Error (%s): %s') % (
395 msg = _(b'Conduit Error (%s): %s') % (
396 parsed[b'error_code'],
396 parsed[b'error_code'],
397 parsed[b'error_info'],
397 parsed[b'error_info'],
398 )
398 )
399 raise error.Abort(msg)
399 raise error.Abort(msg)
400 return parsed[b'result']
400 return parsed[b'result']
401
401
402
402
403 @vcrcommand(b'debugcallconduit', [], _(b'METHOD'), optionalrepo=True)
403 @vcrcommand(b'debugcallconduit', [], _(b'METHOD'), optionalrepo=True)
404 def debugcallconduit(ui, repo, name):
404 def debugcallconduit(ui, repo, name):
405 """call Conduit API
405 """call Conduit API
406
406
407 Call parameters are read from stdin as a JSON blob. Result will be written
407 Call parameters are read from stdin as a JSON blob. Result will be written
408 to stdout as a JSON blob.
408 to stdout as a JSON blob.
409 """
409 """
410 # json.loads only accepts bytes from 3.6+
410 # json.loads only accepts bytes from 3.6+
411 rawparams = encoding.unifromlocal(ui.fin.read())
411 rawparams = encoding.unifromlocal(ui.fin.read())
412 # json.loads only returns unicode strings
412 # json.loads only returns unicode strings
413 params = pycompat.rapply(
413 params = pycompat.rapply(
414 lambda x: encoding.unitolocal(x)
414 lambda x: encoding.unitolocal(x)
415 if isinstance(x, pycompat.unicode)
415 if isinstance(x, pycompat.unicode)
416 else x,
416 else x,
417 pycompat.json_loads(rawparams),
417 pycompat.json_loads(rawparams),
418 )
418 )
419 # json.dumps only accepts unicode strings
419 # json.dumps only accepts unicode strings
420 result = pycompat.rapply(
420 result = pycompat.rapply(
421 lambda x: encoding.unifromlocal(x) if isinstance(x, bytes) else x,
421 lambda x: encoding.unifromlocal(x) if isinstance(x, bytes) else x,
422 callconduit(ui, name, params),
422 callconduit(ui, name, params),
423 )
423 )
424 s = json.dumps(result, sort_keys=True, indent=2, separators=(u',', u': '))
424 s = json.dumps(result, sort_keys=True, indent=2, separators=(u',', u': '))
425 ui.write(b'%s\n' % encoding.unitolocal(s))
425 ui.write(b'%s\n' % encoding.unitolocal(s))
426
426
427
427
428 def getrepophid(repo):
428 def getrepophid(repo):
429 """given callsign, return repository PHID or None"""
429 """given callsign, return repository PHID or None"""
430 # developer config: phabricator.repophid
430 # developer config: phabricator.repophid
431 repophid = repo.ui.config(b'phabricator', b'repophid')
431 repophid = repo.ui.config(b'phabricator', b'repophid')
432 if repophid:
432 if repophid:
433 return repophid
433 return repophid
434 callsign = repo.ui.config(b'phabricator', b'callsign')
434 callsign = repo.ui.config(b'phabricator', b'callsign')
435 if not callsign:
435 if not callsign:
436 return None
436 return None
437 query = callconduit(
437 query = callconduit(
438 repo.ui,
438 repo.ui,
439 b'diffusion.repository.search',
439 b'diffusion.repository.search',
440 {b'constraints': {b'callsigns': [callsign]}},
440 {b'constraints': {b'callsigns': [callsign]}},
441 )
441 )
442 if len(query[b'data']) == 0:
442 if len(query[b'data']) == 0:
443 return None
443 return None
444 repophid = query[b'data'][0][b'phid']
444 repophid = query[b'data'][0][b'phid']
445 repo.ui.setconfig(b'phabricator', b'repophid', repophid)
445 repo.ui.setconfig(b'phabricator', b'repophid', repophid)
446 return repophid
446 return repophid
447
447
448
448
449 _differentialrevisiontagre = re.compile(br'\AD([1-9][0-9]*)\Z')
449 _differentialrevisiontagre = re.compile(br'\AD([1-9][0-9]*)\Z')
450 _differentialrevisiondescre = re.compile(
450 _differentialrevisiondescre = re.compile(
451 br'^Differential Revision:\s*(?P<url>(?:.*)D(?P<id>[1-9][0-9]*))$', re.M
451 br'^Differential Revision:\s*(?P<url>(?:.*)D(?P<id>[1-9][0-9]*))$', re.M
452 )
452 )
453
453
454
454
455 def getoldnodedrevmap(repo, nodelist):
455 def getoldnodedrevmap(repo, nodelist):
456 """find previous nodes that has been sent to Phabricator
456 """find previous nodes that has been sent to Phabricator
457
457
458 return {node: (oldnode, Differential diff, Differential Revision ID)}
458 return {node: (oldnode, Differential diff, Differential Revision ID)}
459 for node in nodelist with known previous sent versions, or associated
459 for node in nodelist with known previous sent versions, or associated
460 Differential Revision IDs. ``oldnode`` and ``Differential diff`` could
460 Differential Revision IDs. ``oldnode`` and ``Differential diff`` could
461 be ``None``.
461 be ``None``.
462
462
463 Examines commit messages like "Differential Revision:" to get the
463 Examines commit messages like "Differential Revision:" to get the
464 association information.
464 association information.
465
465
466 If such commit message line is not found, examines all precursors and their
466 If such commit message line is not found, examines all precursors and their
467 tags. Tags with format like "D1234" are considered a match and the node
467 tags. Tags with format like "D1234" are considered a match and the node
468 with that tag, and the number after "D" (ex. 1234) will be returned.
468 with that tag, and the number after "D" (ex. 1234) will be returned.
469
469
470 The ``old node``, if not None, is guaranteed to be the last diff of
470 The ``old node``, if not None, is guaranteed to be the last diff of
471 corresponding Differential Revision, and exist in the repo.
471 corresponding Differential Revision, and exist in the repo.
472 """
472 """
473 unfi = repo.unfiltered()
473 unfi = repo.unfiltered()
474 has_node = unfi.changelog.index.has_node
474 has_node = unfi.changelog.index.has_node
475
475
476 result = {} # {node: (oldnode?, lastdiff?, drev)}
476 result = {} # {node: (oldnode?, lastdiff?, drev)}
477 # ordered for test stability when printing new -> old mapping below
477 # ordered for test stability when printing new -> old mapping below
478 toconfirm = util.sortdict() # {node: (force, {precnode}, drev)}
478 toconfirm = util.sortdict() # {node: (force, {precnode}, drev)}
479 for node in nodelist:
479 for node in nodelist:
480 ctx = unfi[node]
480 ctx = unfi[node]
481 # For tags like "D123", put them into "toconfirm" to verify later
481 # For tags like "D123", put them into "toconfirm" to verify later
482 precnodes = list(obsutil.allpredecessors(unfi.obsstore, [node]))
482 precnodes = list(obsutil.allpredecessors(unfi.obsstore, [node]))
483 for n in precnodes:
483 for n in precnodes:
484 if has_node(n):
484 if has_node(n):
485 for tag in unfi.nodetags(n):
485 for tag in unfi.nodetags(n):
486 m = _differentialrevisiontagre.match(tag)
486 m = _differentialrevisiontagre.match(tag)
487 if m:
487 if m:
488 toconfirm[node] = (0, set(precnodes), int(m.group(1)))
488 toconfirm[node] = (0, set(precnodes), int(m.group(1)))
489 break
489 break
490 else:
490 else:
491 continue # move to next predecessor
491 continue # move to next predecessor
492 break # found a tag, stop
492 break # found a tag, stop
493 else:
493 else:
494 # Check commit message
494 # Check commit message
495 m = _differentialrevisiondescre.search(ctx.description())
495 m = _differentialrevisiondescre.search(ctx.description())
496 if m:
496 if m:
497 toconfirm[node] = (1, set(precnodes), int(m.group('id')))
497 toconfirm[node] = (1, set(precnodes), int(m.group('id')))
498
498
499 # Double check if tags are genuine by collecting all old nodes from
499 # Double check if tags are genuine by collecting all old nodes from
500 # Phabricator, and expect precursors overlap with it.
500 # Phabricator, and expect precursors overlap with it.
501 if toconfirm:
501 if toconfirm:
502 drevs = [drev for force, precs, drev in toconfirm.values()]
502 drevs = [drev for force, precs, drev in toconfirm.values()]
503 alldiffs = callconduit(
503 alldiffs = callconduit(
504 unfi.ui, b'differential.querydiffs', {b'revisionIDs': drevs}
504 unfi.ui, b'differential.querydiffs', {b'revisionIDs': drevs}
505 )
505 )
506
506
507 def getnodes(d, precset):
507 def getnodes(d, precset):
508 # Ignore other nodes that were combined into the Differential
508 # Ignore other nodes that were combined into the Differential
509 # that aren't predecessors of the current local node.
509 # that aren't predecessors of the current local node.
510 return [n for n in getlocalcommits(d) if n in precset]
510 return [n for n in getlocalcommits(d) if n in precset]
511
511
512 for newnode, (force, precset, drev) in toconfirm.items():
512 for newnode, (force, precset, drev) in toconfirm.items():
513 diffs = [
513 diffs = [
514 d for d in alldiffs.values() if int(d[b'revisionID']) == drev
514 d for d in alldiffs.values() if int(d[b'revisionID']) == drev
515 ]
515 ]
516
516
517 # local predecessors known by Phabricator
517 # local predecessors known by Phabricator
518 phprecset = {n for d in diffs for n in getnodes(d, precset)}
518 phprecset = {n for d in diffs for n in getnodes(d, precset)}
519
519
520 # Ignore if precursors (Phabricator and local repo) do not overlap,
520 # Ignore if precursors (Phabricator and local repo) do not overlap,
521 # and force is not set (when commit message says nothing)
521 # and force is not set (when commit message says nothing)
522 if not force and not phprecset:
522 if not force and not phprecset:
523 tagname = b'D%d' % drev
523 tagname = b'D%d' % drev
524 tags.tag(
524 tags.tag(
525 repo,
525 repo,
526 tagname,
526 tagname,
527 nullid,
527 nullid,
528 message=None,
528 message=None,
529 user=None,
529 user=None,
530 date=None,
530 date=None,
531 local=True,
531 local=True,
532 )
532 )
533 unfi.ui.warn(
533 unfi.ui.warn(
534 _(
534 _(
535 b'D%d: local tag removed - does not match '
535 b'D%d: local tag removed - does not match '
536 b'Differential history\n'
536 b'Differential history\n'
537 )
537 )
538 % drev
538 % drev
539 )
539 )
540 continue
540 continue
541
541
542 # Find the last node using Phabricator metadata, and make sure it
542 # Find the last node using Phabricator metadata, and make sure it
543 # exists in the repo
543 # exists in the repo
544 oldnode = lastdiff = None
544 oldnode = lastdiff = None
545 if diffs:
545 if diffs:
546 lastdiff = max(diffs, key=lambda d: int(d[b'id']))
546 lastdiff = max(diffs, key=lambda d: int(d[b'id']))
547 oldnodes = getnodes(lastdiff, precset)
547 oldnodes = getnodes(lastdiff, precset)
548
548
549 _debug(
549 _debug(
550 unfi.ui,
550 unfi.ui,
551 b"%s mapped to old nodes %s\n"
551 b"%s mapped to old nodes %s\n"
552 % (
552 % (
553 short(newnode),
553 short(newnode),
554 stringutil.pprint([short(n) for n in sorted(oldnodes)]),
554 stringutil.pprint([short(n) for n in sorted(oldnodes)]),
555 ),
555 ),
556 )
556 )
557
557
558 # If this commit was the result of `hg fold` after submission,
558 # If this commit was the result of `hg fold` after submission,
559 # and now resubmitted with --fold, the easiest thing to do is
559 # and now resubmitted with --fold, the easiest thing to do is
560 # to leave the node clear. This only results in creating a new
560 # to leave the node clear. This only results in creating a new
561 # diff for the _same_ Differential Revision if this commit is
561 # diff for the _same_ Differential Revision if this commit is
562 # the first or last in the selected range.
562 # the first or last in the selected range. If we picked a node
563 # from the list instead, it would have to be the lowest if at
564 # the beginning of the --fold range, or the highest at the end.
565 # Otherwise, one or more of the nodes wouldn't be considered in
566 # the diff, and the Differential wouldn't be properly updated.
563 # If this commit is the result of `hg split` in the same
567 # If this commit is the result of `hg split` in the same
564 # scenario, there is a single oldnode here (and multiple
568 # scenario, there is a single oldnode here (and multiple
565 # newnodes mapped to it). That makes it the same as the normal
569 # newnodes mapped to it). That makes it the same as the normal
566 # case, as the edges of the newnode range cleanly maps to one
570 # case, as the edges of the newnode range cleanly maps to one
567 # oldnode each.
571 # oldnode each.
568 if len(oldnodes) == 1:
572 if len(oldnodes) == 1:
569 oldnode = oldnodes[0]
573 oldnode = oldnodes[0]
570 if oldnode and not has_node(oldnode):
574 if oldnode and not has_node(oldnode):
571 oldnode = None
575 oldnode = None
572
576
573 result[newnode] = (oldnode, lastdiff, drev)
577 result[newnode] = (oldnode, lastdiff, drev)
574
578
575 return result
579 return result
576
580
577
581
578 def getdrevmap(repo, revs):
582 def getdrevmap(repo, revs):
579 """Return a dict mapping each rev in `revs` to their Differential Revision
583 """Return a dict mapping each rev in `revs` to their Differential Revision
580 ID or None.
584 ID or None.
581 """
585 """
582 result = {}
586 result = {}
583 for rev in revs:
587 for rev in revs:
584 result[rev] = None
588 result[rev] = None
585 ctx = repo[rev]
589 ctx = repo[rev]
586 # Check commit message
590 # Check commit message
587 m = _differentialrevisiondescre.search(ctx.description())
591 m = _differentialrevisiondescre.search(ctx.description())
588 if m:
592 if m:
589 result[rev] = int(m.group('id'))
593 result[rev] = int(m.group('id'))
590 continue
594 continue
591 # Check tags
595 # Check tags
592 for tag in repo.nodetags(ctx.node()):
596 for tag in repo.nodetags(ctx.node()):
593 m = _differentialrevisiontagre.match(tag)
597 m = _differentialrevisiontagre.match(tag)
594 if m:
598 if m:
595 result[rev] = int(m.group(1))
599 result[rev] = int(m.group(1))
596 break
600 break
597
601
598 return result
602 return result
599
603
600
604
601 def getdiff(basectx, ctx, diffopts):
605 def getdiff(basectx, ctx, diffopts):
602 """plain-text diff without header (user, commit message, etc)"""
606 """plain-text diff without header (user, commit message, etc)"""
603 output = util.stringio()
607 output = util.stringio()
604 for chunk, _label in patch.diffui(
608 for chunk, _label in patch.diffui(
605 ctx.repo(), basectx.p1().node(), ctx.node(), None, opts=diffopts
609 ctx.repo(), basectx.p1().node(), ctx.node(), None, opts=diffopts
606 ):
610 ):
607 output.write(chunk)
611 output.write(chunk)
608 return output.getvalue()
612 return output.getvalue()
609
613
610
614
611 class DiffChangeType(object):
615 class DiffChangeType(object):
612 ADD = 1
616 ADD = 1
613 CHANGE = 2
617 CHANGE = 2
614 DELETE = 3
618 DELETE = 3
615 MOVE_AWAY = 4
619 MOVE_AWAY = 4
616 COPY_AWAY = 5
620 COPY_AWAY = 5
617 MOVE_HERE = 6
621 MOVE_HERE = 6
618 COPY_HERE = 7
622 COPY_HERE = 7
619 MULTICOPY = 8
623 MULTICOPY = 8
620
624
621
625
622 class DiffFileType(object):
626 class DiffFileType(object):
623 TEXT = 1
627 TEXT = 1
624 IMAGE = 2
628 IMAGE = 2
625 BINARY = 3
629 BINARY = 3
626
630
627
631
628 @attr.s
632 @attr.s
629 class phabhunk(dict):
633 class phabhunk(dict):
630 """Represents a Differential hunk, which is owned by a Differential change
634 """Represents a Differential hunk, which is owned by a Differential change
631 """
635 """
632
636
633 oldOffset = attr.ib(default=0) # camelcase-required
637 oldOffset = attr.ib(default=0) # camelcase-required
634 oldLength = attr.ib(default=0) # camelcase-required
638 oldLength = attr.ib(default=0) # camelcase-required
635 newOffset = attr.ib(default=0) # camelcase-required
639 newOffset = attr.ib(default=0) # camelcase-required
636 newLength = attr.ib(default=0) # camelcase-required
640 newLength = attr.ib(default=0) # camelcase-required
637 corpus = attr.ib(default='')
641 corpus = attr.ib(default='')
638 # These get added to the phabchange's equivalents
642 # These get added to the phabchange's equivalents
639 addLines = attr.ib(default=0) # camelcase-required
643 addLines = attr.ib(default=0) # camelcase-required
640 delLines = attr.ib(default=0) # camelcase-required
644 delLines = attr.ib(default=0) # camelcase-required
641
645
642
646
643 @attr.s
647 @attr.s
644 class phabchange(object):
648 class phabchange(object):
645 """Represents a Differential change, owns Differential hunks and owned by a
649 """Represents a Differential change, owns Differential hunks and owned by a
646 Differential diff. Each one represents one file in a diff.
650 Differential diff. Each one represents one file in a diff.
647 """
651 """
648
652
649 currentPath = attr.ib(default=None) # camelcase-required
653 currentPath = attr.ib(default=None) # camelcase-required
650 oldPath = attr.ib(default=None) # camelcase-required
654 oldPath = attr.ib(default=None) # camelcase-required
651 awayPaths = attr.ib(default=attr.Factory(list)) # camelcase-required
655 awayPaths = attr.ib(default=attr.Factory(list)) # camelcase-required
652 metadata = attr.ib(default=attr.Factory(dict))
656 metadata = attr.ib(default=attr.Factory(dict))
653 oldProperties = attr.ib(default=attr.Factory(dict)) # camelcase-required
657 oldProperties = attr.ib(default=attr.Factory(dict)) # camelcase-required
654 newProperties = attr.ib(default=attr.Factory(dict)) # camelcase-required
658 newProperties = attr.ib(default=attr.Factory(dict)) # camelcase-required
655 type = attr.ib(default=DiffChangeType.CHANGE)
659 type = attr.ib(default=DiffChangeType.CHANGE)
656 fileType = attr.ib(default=DiffFileType.TEXT) # camelcase-required
660 fileType = attr.ib(default=DiffFileType.TEXT) # camelcase-required
657 commitHash = attr.ib(default=None) # camelcase-required
661 commitHash = attr.ib(default=None) # camelcase-required
658 addLines = attr.ib(default=0) # camelcase-required
662 addLines = attr.ib(default=0) # camelcase-required
659 delLines = attr.ib(default=0) # camelcase-required
663 delLines = attr.ib(default=0) # camelcase-required
660 hunks = attr.ib(default=attr.Factory(list))
664 hunks = attr.ib(default=attr.Factory(list))
661
665
662 def copynewmetadatatoold(self):
666 def copynewmetadatatoold(self):
663 for key in list(self.metadata.keys()):
667 for key in list(self.metadata.keys()):
664 newkey = key.replace(b'new:', b'old:')
668 newkey = key.replace(b'new:', b'old:')
665 self.metadata[newkey] = self.metadata[key]
669 self.metadata[newkey] = self.metadata[key]
666
670
667 def addoldmode(self, value):
671 def addoldmode(self, value):
668 self.oldProperties[b'unix:filemode'] = value
672 self.oldProperties[b'unix:filemode'] = value
669
673
670 def addnewmode(self, value):
674 def addnewmode(self, value):
671 self.newProperties[b'unix:filemode'] = value
675 self.newProperties[b'unix:filemode'] = value
672
676
673 def addhunk(self, hunk):
677 def addhunk(self, hunk):
674 if not isinstance(hunk, phabhunk):
678 if not isinstance(hunk, phabhunk):
675 raise error.Abort(b'phabchange.addhunk only takes phabhunks')
679 raise error.Abort(b'phabchange.addhunk only takes phabhunks')
676 self.hunks.append(pycompat.byteskwargs(attr.asdict(hunk)))
680 self.hunks.append(pycompat.byteskwargs(attr.asdict(hunk)))
677 # It's useful to include these stats since the Phab web UI shows them,
681 # It's useful to include these stats since the Phab web UI shows them,
678 # and uses them to estimate how large a change a Revision is. Also used
682 # and uses them to estimate how large a change a Revision is. Also used
679 # in email subjects for the [+++--] bit.
683 # in email subjects for the [+++--] bit.
680 self.addLines += hunk.addLines
684 self.addLines += hunk.addLines
681 self.delLines += hunk.delLines
685 self.delLines += hunk.delLines
682
686
683
687
684 @attr.s
688 @attr.s
685 class phabdiff(object):
689 class phabdiff(object):
686 """Represents a Differential diff, owns Differential changes. Corresponds
690 """Represents a Differential diff, owns Differential changes. Corresponds
687 to a commit.
691 to a commit.
688 """
692 """
689
693
690 # Doesn't seem to be any reason to send this (output of uname -n)
694 # Doesn't seem to be any reason to send this (output of uname -n)
691 sourceMachine = attr.ib(default=b'') # camelcase-required
695 sourceMachine = attr.ib(default=b'') # camelcase-required
692 sourcePath = attr.ib(default=b'/') # camelcase-required
696 sourcePath = attr.ib(default=b'/') # camelcase-required
693 sourceControlBaseRevision = attr.ib(default=b'0' * 40) # camelcase-required
697 sourceControlBaseRevision = attr.ib(default=b'0' * 40) # camelcase-required
694 sourceControlPath = attr.ib(default=b'/') # camelcase-required
698 sourceControlPath = attr.ib(default=b'/') # camelcase-required
695 sourceControlSystem = attr.ib(default=b'hg') # camelcase-required
699 sourceControlSystem = attr.ib(default=b'hg') # camelcase-required
696 branch = attr.ib(default=b'default')
700 branch = attr.ib(default=b'default')
697 bookmark = attr.ib(default=None)
701 bookmark = attr.ib(default=None)
698 creationMethod = attr.ib(default=b'phabsend') # camelcase-required
702 creationMethod = attr.ib(default=b'phabsend') # camelcase-required
699 lintStatus = attr.ib(default=b'none') # camelcase-required
703 lintStatus = attr.ib(default=b'none') # camelcase-required
700 unitStatus = attr.ib(default=b'none') # camelcase-required
704 unitStatus = attr.ib(default=b'none') # camelcase-required
701 changes = attr.ib(default=attr.Factory(dict))
705 changes = attr.ib(default=attr.Factory(dict))
702 repositoryPHID = attr.ib(default=None) # camelcase-required
706 repositoryPHID = attr.ib(default=None) # camelcase-required
703
707
704 def addchange(self, change):
708 def addchange(self, change):
705 if not isinstance(change, phabchange):
709 if not isinstance(change, phabchange):
706 raise error.Abort(b'phabdiff.addchange only takes phabchanges')
710 raise error.Abort(b'phabdiff.addchange only takes phabchanges')
707 self.changes[change.currentPath] = pycompat.byteskwargs(
711 self.changes[change.currentPath] = pycompat.byteskwargs(
708 attr.asdict(change)
712 attr.asdict(change)
709 )
713 )
710
714
711
715
712 def maketext(pchange, basectx, ctx, fname):
716 def maketext(pchange, basectx, ctx, fname):
713 """populate the phabchange for a text file"""
717 """populate the phabchange for a text file"""
714 repo = ctx.repo()
718 repo = ctx.repo()
715 fmatcher = match.exact([fname])
719 fmatcher = match.exact([fname])
716 diffopts = mdiff.diffopts(git=True, context=32767)
720 diffopts = mdiff.diffopts(git=True, context=32767)
717 _pfctx, _fctx, header, fhunks = next(
721 _pfctx, _fctx, header, fhunks = next(
718 patch.diffhunks(repo, basectx.p1(), ctx, fmatcher, opts=diffopts)
722 patch.diffhunks(repo, basectx.p1(), ctx, fmatcher, opts=diffopts)
719 )
723 )
720
724
721 for fhunk in fhunks:
725 for fhunk in fhunks:
722 (oldOffset, oldLength, newOffset, newLength), lines = fhunk
726 (oldOffset, oldLength, newOffset, newLength), lines = fhunk
723 corpus = b''.join(lines[1:])
727 corpus = b''.join(lines[1:])
724 shunk = list(header)
728 shunk = list(header)
725 shunk.extend(lines)
729 shunk.extend(lines)
726 _mf, _mt, addLines, delLines, _hb = patch.diffstatsum(
730 _mf, _mt, addLines, delLines, _hb = patch.diffstatsum(
727 patch.diffstatdata(util.iterlines(shunk))
731 patch.diffstatdata(util.iterlines(shunk))
728 )
732 )
729 pchange.addhunk(
733 pchange.addhunk(
730 phabhunk(
734 phabhunk(
731 oldOffset,
735 oldOffset,
732 oldLength,
736 oldLength,
733 newOffset,
737 newOffset,
734 newLength,
738 newLength,
735 corpus,
739 corpus,
736 addLines,
740 addLines,
737 delLines,
741 delLines,
738 )
742 )
739 )
743 )
740
744
741
745
742 def uploadchunks(fctx, fphid):
746 def uploadchunks(fctx, fphid):
743 """upload large binary files as separate chunks.
747 """upload large binary files as separate chunks.
744 Phab requests chunking over 8MiB, and splits into 4MiB chunks
748 Phab requests chunking over 8MiB, and splits into 4MiB chunks
745 """
749 """
746 ui = fctx.repo().ui
750 ui = fctx.repo().ui
747 chunks = callconduit(ui, b'file.querychunks', {b'filePHID': fphid})
751 chunks = callconduit(ui, b'file.querychunks', {b'filePHID': fphid})
748 with ui.makeprogress(
752 with ui.makeprogress(
749 _(b'uploading file chunks'), unit=_(b'chunks'), total=len(chunks)
753 _(b'uploading file chunks'), unit=_(b'chunks'), total=len(chunks)
750 ) as progress:
754 ) as progress:
751 for chunk in chunks:
755 for chunk in chunks:
752 progress.increment()
756 progress.increment()
753 if chunk[b'complete']:
757 if chunk[b'complete']:
754 continue
758 continue
755 bstart = int(chunk[b'byteStart'])
759 bstart = int(chunk[b'byteStart'])
756 bend = int(chunk[b'byteEnd'])
760 bend = int(chunk[b'byteEnd'])
757 callconduit(
761 callconduit(
758 ui,
762 ui,
759 b'file.uploadchunk',
763 b'file.uploadchunk',
760 {
764 {
761 b'filePHID': fphid,
765 b'filePHID': fphid,
762 b'byteStart': bstart,
766 b'byteStart': bstart,
763 b'data': base64.b64encode(fctx.data()[bstart:bend]),
767 b'data': base64.b64encode(fctx.data()[bstart:bend]),
764 b'dataEncoding': b'base64',
768 b'dataEncoding': b'base64',
765 },
769 },
766 )
770 )
767
771
768
772
769 def uploadfile(fctx):
773 def uploadfile(fctx):
770 """upload binary files to Phabricator"""
774 """upload binary files to Phabricator"""
771 repo = fctx.repo()
775 repo = fctx.repo()
772 ui = repo.ui
776 ui = repo.ui
773 fname = fctx.path()
777 fname = fctx.path()
774 size = fctx.size()
778 size = fctx.size()
775 fhash = pycompat.bytestr(hashlib.sha256(fctx.data()).hexdigest())
779 fhash = pycompat.bytestr(hashlib.sha256(fctx.data()).hexdigest())
776
780
777 # an allocate call is required first to see if an upload is even required
781 # an allocate call is required first to see if an upload is even required
778 # (Phab might already have it) and to determine if chunking is needed
782 # (Phab might already have it) and to determine if chunking is needed
779 allocateparams = {
783 allocateparams = {
780 b'name': fname,
784 b'name': fname,
781 b'contentLength': size,
785 b'contentLength': size,
782 b'contentHash': fhash,
786 b'contentHash': fhash,
783 }
787 }
784 filealloc = callconduit(ui, b'file.allocate', allocateparams)
788 filealloc = callconduit(ui, b'file.allocate', allocateparams)
785 fphid = filealloc[b'filePHID']
789 fphid = filealloc[b'filePHID']
786
790
787 if filealloc[b'upload']:
791 if filealloc[b'upload']:
788 ui.write(_(b'uploading %s\n') % bytes(fctx))
792 ui.write(_(b'uploading %s\n') % bytes(fctx))
789 if not fphid:
793 if not fphid:
790 uploadparams = {
794 uploadparams = {
791 b'name': fname,
795 b'name': fname,
792 b'data_base64': base64.b64encode(fctx.data()),
796 b'data_base64': base64.b64encode(fctx.data()),
793 }
797 }
794 fphid = callconduit(ui, b'file.upload', uploadparams)
798 fphid = callconduit(ui, b'file.upload', uploadparams)
795 else:
799 else:
796 uploadchunks(fctx, fphid)
800 uploadchunks(fctx, fphid)
797 else:
801 else:
798 ui.debug(b'server already has %s\n' % bytes(fctx))
802 ui.debug(b'server already has %s\n' % bytes(fctx))
799
803
800 if not fphid:
804 if not fphid:
801 raise error.Abort(b'Upload of %s failed.' % bytes(fctx))
805 raise error.Abort(b'Upload of %s failed.' % bytes(fctx))
802
806
803 return fphid
807 return fphid
804
808
805
809
806 def addoldbinary(pchange, oldfctx, fctx):
810 def addoldbinary(pchange, oldfctx, fctx):
807 """add the metadata for the previous version of a binary file to the
811 """add the metadata for the previous version of a binary file to the
808 phabchange for the new version
812 phabchange for the new version
809
813
810 ``oldfctx`` is the previous version of the file; ``fctx`` is the new
814 ``oldfctx`` is the previous version of the file; ``fctx`` is the new
811 version of the file, or None if the file is being removed.
815 version of the file, or None if the file is being removed.
812 """
816 """
813 if not fctx or fctx.cmp(oldfctx):
817 if not fctx or fctx.cmp(oldfctx):
814 # Files differ, add the old one
818 # Files differ, add the old one
815 pchange.metadata[b'old:file:size'] = oldfctx.size()
819 pchange.metadata[b'old:file:size'] = oldfctx.size()
816 mimeguess, _enc = mimetypes.guess_type(
820 mimeguess, _enc = mimetypes.guess_type(
817 encoding.unifromlocal(oldfctx.path())
821 encoding.unifromlocal(oldfctx.path())
818 )
822 )
819 if mimeguess:
823 if mimeguess:
820 pchange.metadata[b'old:file:mime-type'] = pycompat.bytestr(
824 pchange.metadata[b'old:file:mime-type'] = pycompat.bytestr(
821 mimeguess
825 mimeguess
822 )
826 )
823 fphid = uploadfile(oldfctx)
827 fphid = uploadfile(oldfctx)
824 pchange.metadata[b'old:binary-phid'] = fphid
828 pchange.metadata[b'old:binary-phid'] = fphid
825 else:
829 else:
826 # If it's left as IMAGE/BINARY web UI might try to display it
830 # If it's left as IMAGE/BINARY web UI might try to display it
827 pchange.fileType = DiffFileType.TEXT
831 pchange.fileType = DiffFileType.TEXT
828 pchange.copynewmetadatatoold()
832 pchange.copynewmetadatatoold()
829
833
830
834
831 def makebinary(pchange, fctx):
835 def makebinary(pchange, fctx):
832 """populate the phabchange for a binary file"""
836 """populate the phabchange for a binary file"""
833 pchange.fileType = DiffFileType.BINARY
837 pchange.fileType = DiffFileType.BINARY
834 fphid = uploadfile(fctx)
838 fphid = uploadfile(fctx)
835 pchange.metadata[b'new:binary-phid'] = fphid
839 pchange.metadata[b'new:binary-phid'] = fphid
836 pchange.metadata[b'new:file:size'] = fctx.size()
840 pchange.metadata[b'new:file:size'] = fctx.size()
837 mimeguess, _enc = mimetypes.guess_type(encoding.unifromlocal(fctx.path()))
841 mimeguess, _enc = mimetypes.guess_type(encoding.unifromlocal(fctx.path()))
838 if mimeguess:
842 if mimeguess:
839 mimeguess = pycompat.bytestr(mimeguess)
843 mimeguess = pycompat.bytestr(mimeguess)
840 pchange.metadata[b'new:file:mime-type'] = mimeguess
844 pchange.metadata[b'new:file:mime-type'] = mimeguess
841 if mimeguess.startswith(b'image/'):
845 if mimeguess.startswith(b'image/'):
842 pchange.fileType = DiffFileType.IMAGE
846 pchange.fileType = DiffFileType.IMAGE
843
847
844
848
845 # Copied from mercurial/patch.py
849 # Copied from mercurial/patch.py
846 gitmode = {b'l': b'120000', b'x': b'100755', b'': b'100644'}
850 gitmode = {b'l': b'120000', b'x': b'100755', b'': b'100644'}
847
851
848
852
849 def notutf8(fctx):
853 def notutf8(fctx):
850 """detect non-UTF-8 text files since Phabricator requires them to be marked
854 """detect non-UTF-8 text files since Phabricator requires them to be marked
851 as binary
855 as binary
852 """
856 """
853 try:
857 try:
854 fctx.data().decode('utf-8')
858 fctx.data().decode('utf-8')
855 return False
859 return False
856 except UnicodeDecodeError:
860 except UnicodeDecodeError:
857 fctx.repo().ui.write(
861 fctx.repo().ui.write(
858 _(b'file %s detected as non-UTF-8, marked as binary\n')
862 _(b'file %s detected as non-UTF-8, marked as binary\n')
859 % fctx.path()
863 % fctx.path()
860 )
864 )
861 return True
865 return True
862
866
863
867
864 def addremoved(pdiff, basectx, ctx, removed):
868 def addremoved(pdiff, basectx, ctx, removed):
865 """add removed files to the phabdiff. Shouldn't include moves"""
869 """add removed files to the phabdiff. Shouldn't include moves"""
866 for fname in removed:
870 for fname in removed:
867 pchange = phabchange(
871 pchange = phabchange(
868 currentPath=fname, oldPath=fname, type=DiffChangeType.DELETE
872 currentPath=fname, oldPath=fname, type=DiffChangeType.DELETE
869 )
873 )
870 oldfctx = basectx.p1()[fname]
874 oldfctx = basectx.p1()[fname]
871 pchange.addoldmode(gitmode[oldfctx.flags()])
875 pchange.addoldmode(gitmode[oldfctx.flags()])
872 if not (oldfctx.isbinary() or notutf8(oldfctx)):
876 if not (oldfctx.isbinary() or notutf8(oldfctx)):
873 maketext(pchange, basectx, ctx, fname)
877 maketext(pchange, basectx, ctx, fname)
874
878
875 pdiff.addchange(pchange)
879 pdiff.addchange(pchange)
876
880
877
881
878 def addmodified(pdiff, basectx, ctx, modified):
882 def addmodified(pdiff, basectx, ctx, modified):
879 """add modified files to the phabdiff"""
883 """add modified files to the phabdiff"""
880 for fname in modified:
884 for fname in modified:
881 fctx = ctx[fname]
885 fctx = ctx[fname]
882 oldfctx = basectx.p1()[fname]
886 oldfctx = basectx.p1()[fname]
883 pchange = phabchange(currentPath=fname, oldPath=fname)
887 pchange = phabchange(currentPath=fname, oldPath=fname)
884 filemode = gitmode[fctx.flags()]
888 filemode = gitmode[fctx.flags()]
885 originalmode = gitmode[oldfctx.flags()]
889 originalmode = gitmode[oldfctx.flags()]
886 if filemode != originalmode:
890 if filemode != originalmode:
887 pchange.addoldmode(originalmode)
891 pchange.addoldmode(originalmode)
888 pchange.addnewmode(filemode)
892 pchange.addnewmode(filemode)
889
893
890 if (
894 if (
891 fctx.isbinary()
895 fctx.isbinary()
892 or notutf8(fctx)
896 or notutf8(fctx)
893 or oldfctx.isbinary()
897 or oldfctx.isbinary()
894 or notutf8(oldfctx)
898 or notutf8(oldfctx)
895 ):
899 ):
896 makebinary(pchange, fctx)
900 makebinary(pchange, fctx)
897 addoldbinary(pchange, oldfctx, fctx)
901 addoldbinary(pchange, oldfctx, fctx)
898 else:
902 else:
899 maketext(pchange, basectx, ctx, fname)
903 maketext(pchange, basectx, ctx, fname)
900
904
901 pdiff.addchange(pchange)
905 pdiff.addchange(pchange)
902
906
903
907
904 def addadded(pdiff, basectx, ctx, added, removed):
908 def addadded(pdiff, basectx, ctx, added, removed):
905 """add file adds to the phabdiff, both new files and copies/moves"""
909 """add file adds to the phabdiff, both new files and copies/moves"""
906 # Keep track of files that've been recorded as moved/copied, so if there are
910 # Keep track of files that've been recorded as moved/copied, so if there are
907 # additional copies we can mark them (moves get removed from removed)
911 # additional copies we can mark them (moves get removed from removed)
908 copiedchanges = {}
912 copiedchanges = {}
909 movedchanges = {}
913 movedchanges = {}
910
914
911 copy = {}
915 copy = {}
912 if basectx != ctx:
916 if basectx != ctx:
913 copy = copies.pathcopies(basectx.p1(), ctx)
917 copy = copies.pathcopies(basectx.p1(), ctx)
914
918
915 for fname in added:
919 for fname in added:
916 fctx = ctx[fname]
920 fctx = ctx[fname]
917 oldfctx = None
921 oldfctx = None
918 pchange = phabchange(currentPath=fname)
922 pchange = phabchange(currentPath=fname)
919
923
920 filemode = gitmode[fctx.flags()]
924 filemode = gitmode[fctx.flags()]
921
925
922 if copy:
926 if copy:
923 originalfname = copy.get(fname, fname)
927 originalfname = copy.get(fname, fname)
924 else:
928 else:
925 originalfname = fname
929 originalfname = fname
926 if fctx.renamed():
930 if fctx.renamed():
927 originalfname = fctx.renamed()[0]
931 originalfname = fctx.renamed()[0]
928
932
929 renamed = fname != originalfname
933 renamed = fname != originalfname
930
934
931 if renamed:
935 if renamed:
932 oldfctx = basectx.p1()[originalfname]
936 oldfctx = basectx.p1()[originalfname]
933 originalmode = gitmode[oldfctx.flags()]
937 originalmode = gitmode[oldfctx.flags()]
934 pchange.oldPath = originalfname
938 pchange.oldPath = originalfname
935
939
936 if originalfname in removed:
940 if originalfname in removed:
937 origpchange = phabchange(
941 origpchange = phabchange(
938 currentPath=originalfname,
942 currentPath=originalfname,
939 oldPath=originalfname,
943 oldPath=originalfname,
940 type=DiffChangeType.MOVE_AWAY,
944 type=DiffChangeType.MOVE_AWAY,
941 awayPaths=[fname],
945 awayPaths=[fname],
942 )
946 )
943 movedchanges[originalfname] = origpchange
947 movedchanges[originalfname] = origpchange
944 removed.remove(originalfname)
948 removed.remove(originalfname)
945 pchange.type = DiffChangeType.MOVE_HERE
949 pchange.type = DiffChangeType.MOVE_HERE
946 elif originalfname in movedchanges:
950 elif originalfname in movedchanges:
947 movedchanges[originalfname].type = DiffChangeType.MULTICOPY
951 movedchanges[originalfname].type = DiffChangeType.MULTICOPY
948 movedchanges[originalfname].awayPaths.append(fname)
952 movedchanges[originalfname].awayPaths.append(fname)
949 pchange.type = DiffChangeType.COPY_HERE
953 pchange.type = DiffChangeType.COPY_HERE
950 else: # pure copy
954 else: # pure copy
951 if originalfname not in copiedchanges:
955 if originalfname not in copiedchanges:
952 origpchange = phabchange(
956 origpchange = phabchange(
953 currentPath=originalfname, type=DiffChangeType.COPY_AWAY
957 currentPath=originalfname, type=DiffChangeType.COPY_AWAY
954 )
958 )
955 copiedchanges[originalfname] = origpchange
959 copiedchanges[originalfname] = origpchange
956 else:
960 else:
957 origpchange = copiedchanges[originalfname]
961 origpchange = copiedchanges[originalfname]
958 origpchange.awayPaths.append(fname)
962 origpchange.awayPaths.append(fname)
959 pchange.type = DiffChangeType.COPY_HERE
963 pchange.type = DiffChangeType.COPY_HERE
960
964
961 if filemode != originalmode:
965 if filemode != originalmode:
962 pchange.addoldmode(originalmode)
966 pchange.addoldmode(originalmode)
963 pchange.addnewmode(filemode)
967 pchange.addnewmode(filemode)
964 else: # Brand-new file
968 else: # Brand-new file
965 pchange.addnewmode(gitmode[fctx.flags()])
969 pchange.addnewmode(gitmode[fctx.flags()])
966 pchange.type = DiffChangeType.ADD
970 pchange.type = DiffChangeType.ADD
967
971
968 if (
972 if (
969 fctx.isbinary()
973 fctx.isbinary()
970 or notutf8(fctx)
974 or notutf8(fctx)
971 or (oldfctx and (oldfctx.isbinary() or notutf8(oldfctx)))
975 or (oldfctx and (oldfctx.isbinary() or notutf8(oldfctx)))
972 ):
976 ):
973 makebinary(pchange, fctx)
977 makebinary(pchange, fctx)
974 if renamed:
978 if renamed:
975 addoldbinary(pchange, oldfctx, fctx)
979 addoldbinary(pchange, oldfctx, fctx)
976 else:
980 else:
977 maketext(pchange, basectx, ctx, fname)
981 maketext(pchange, basectx, ctx, fname)
978
982
979 pdiff.addchange(pchange)
983 pdiff.addchange(pchange)
980
984
981 for _path, copiedchange in copiedchanges.items():
985 for _path, copiedchange in copiedchanges.items():
982 pdiff.addchange(copiedchange)
986 pdiff.addchange(copiedchange)
983 for _path, movedchange in movedchanges.items():
987 for _path, movedchange in movedchanges.items():
984 pdiff.addchange(movedchange)
988 pdiff.addchange(movedchange)
985
989
986
990
987 def creatediff(basectx, ctx):
991 def creatediff(basectx, ctx):
988 """create a Differential Diff"""
992 """create a Differential Diff"""
989 repo = ctx.repo()
993 repo = ctx.repo()
990 repophid = getrepophid(repo)
994 repophid = getrepophid(repo)
991 # Create a "Differential Diff" via "differential.creatediff" API
995 # Create a "Differential Diff" via "differential.creatediff" API
992 pdiff = phabdiff(
996 pdiff = phabdiff(
993 sourceControlBaseRevision=b'%s' % basectx.p1().hex(),
997 sourceControlBaseRevision=b'%s' % basectx.p1().hex(),
994 branch=b'%s' % ctx.branch(),
998 branch=b'%s' % ctx.branch(),
995 )
999 )
996 modified, added, removed, _d, _u, _i, _c = basectx.p1().status(ctx)
1000 modified, added, removed, _d, _u, _i, _c = basectx.p1().status(ctx)
997 # addadded will remove moved files from removed, so addremoved won't get
1001 # addadded will remove moved files from removed, so addremoved won't get
998 # them
1002 # them
999 addadded(pdiff, basectx, ctx, added, removed)
1003 addadded(pdiff, basectx, ctx, added, removed)
1000 addmodified(pdiff, basectx, ctx, modified)
1004 addmodified(pdiff, basectx, ctx, modified)
1001 addremoved(pdiff, basectx, ctx, removed)
1005 addremoved(pdiff, basectx, ctx, removed)
1002 if repophid:
1006 if repophid:
1003 pdiff.repositoryPHID = repophid
1007 pdiff.repositoryPHID = repophid
1004 diff = callconduit(
1008 diff = callconduit(
1005 repo.ui,
1009 repo.ui,
1006 b'differential.creatediff',
1010 b'differential.creatediff',
1007 pycompat.byteskwargs(attr.asdict(pdiff)),
1011 pycompat.byteskwargs(attr.asdict(pdiff)),
1008 )
1012 )
1009 if not diff:
1013 if not diff:
1010 if basectx != ctx:
1014 if basectx != ctx:
1011 msg = _(b'cannot create diff for %s::%s') % (basectx, ctx)
1015 msg = _(b'cannot create diff for %s::%s') % (basectx, ctx)
1012 else:
1016 else:
1013 msg = _(b'cannot create diff for %s') % ctx
1017 msg = _(b'cannot create diff for %s') % ctx
1014 raise error.Abort(msg)
1018 raise error.Abort(msg)
1015 return diff
1019 return diff
1016
1020
1017
1021
1018 def writediffproperties(ctxs, diff):
1022 def writediffproperties(ctxs, diff):
1019 """write metadata to diff so patches could be applied losslessly
1023 """write metadata to diff so patches could be applied losslessly
1020
1024
1021 ``ctxs`` is the list of commits that created the diff, in ascending order.
1025 ``ctxs`` is the list of commits that created the diff, in ascending order.
1022 The list is generally a single commit, but may be several when using
1026 The list is generally a single commit, but may be several when using
1023 ``phabsend --fold``.
1027 ``phabsend --fold``.
1024 """
1028 """
1025 # creatediff returns with a diffid but query returns with an id
1029 # creatediff returns with a diffid but query returns with an id
1026 diffid = diff.get(b'diffid', diff.get(b'id'))
1030 diffid = diff.get(b'diffid', diff.get(b'id'))
1027 basectx = ctxs[0]
1031 basectx = ctxs[0]
1028 tipctx = ctxs[-1]
1032 tipctx = ctxs[-1]
1029
1033
1030 params = {
1034 params = {
1031 b'diff_id': diffid,
1035 b'diff_id': diffid,
1032 b'name': b'hg:meta',
1036 b'name': b'hg:meta',
1033 b'data': templatefilters.json(
1037 b'data': templatefilters.json(
1034 {
1038 {
1035 b'user': tipctx.user(),
1039 b'user': tipctx.user(),
1036 b'date': b'%d %d' % tipctx.date(),
1040 b'date': b'%d %d' % tipctx.date(),
1037 b'branch': tipctx.branch(),
1041 b'branch': tipctx.branch(),
1038 b'node': tipctx.hex(),
1042 b'node': tipctx.hex(),
1039 b'parent': basectx.p1().hex(),
1043 b'parent': basectx.p1().hex(),
1040 }
1044 }
1041 ),
1045 ),
1042 }
1046 }
1043 callconduit(basectx.repo().ui, b'differential.setdiffproperty', params)
1047 callconduit(basectx.repo().ui, b'differential.setdiffproperty', params)
1044
1048
1045 commits = {}
1049 commits = {}
1046 for ctx in ctxs:
1050 for ctx in ctxs:
1047 commits[ctx.hex()] = {
1051 commits[ctx.hex()] = {
1048 b'author': stringutil.person(ctx.user()),
1052 b'author': stringutil.person(ctx.user()),
1049 b'authorEmail': stringutil.email(ctx.user()),
1053 b'authorEmail': stringutil.email(ctx.user()),
1050 b'time': int(ctx.date()[0]),
1054 b'time': int(ctx.date()[0]),
1051 b'commit': ctx.hex(),
1055 b'commit': ctx.hex(),
1052 b'parents': [ctx.p1().hex()],
1056 b'parents': [ctx.p1().hex()],
1053 b'branch': ctx.branch(),
1057 b'branch': ctx.branch(),
1054 }
1058 }
1055 params = {
1059 params = {
1056 b'diff_id': diffid,
1060 b'diff_id': diffid,
1057 b'name': b'local:commits',
1061 b'name': b'local:commits',
1058 b'data': templatefilters.json(commits),
1062 b'data': templatefilters.json(commits),
1059 }
1063 }
1060 callconduit(basectx.repo().ui, b'differential.setdiffproperty', params)
1064 callconduit(basectx.repo().ui, b'differential.setdiffproperty', params)
1061
1065
1062
1066
1063 def createdifferentialrevision(
1067 def createdifferentialrevision(
1064 ctxs,
1068 ctxs,
1065 revid=None,
1069 revid=None,
1066 parentrevphid=None,
1070 parentrevphid=None,
1067 oldbasenode=None,
1071 oldbasenode=None,
1068 oldnode=None,
1072 oldnode=None,
1069 olddiff=None,
1073 olddiff=None,
1070 actions=None,
1074 actions=None,
1071 comment=None,
1075 comment=None,
1072 ):
1076 ):
1073 """create or update a Differential Revision
1077 """create or update a Differential Revision
1074
1078
1075 If revid is None, create a new Differential Revision, otherwise update
1079 If revid is None, create a new Differential Revision, otherwise update
1076 revid. If parentrevphid is not None, set it as a dependency.
1080 revid. If parentrevphid is not None, set it as a dependency.
1077
1081
1078 If there is a single commit for the new Differential Revision, ``ctxs`` will
1082 If there is a single commit for the new Differential Revision, ``ctxs`` will
1079 be a list of that single context. Otherwise, it is a list that covers the
1083 be a list of that single context. Otherwise, it is a list that covers the
1080 range of changes for the differential, where ``ctxs[0]`` is the first change
1084 range of changes for the differential, where ``ctxs[0]`` is the first change
1081 to include and ``ctxs[-1]`` is the last.
1085 to include and ``ctxs[-1]`` is the last.
1082
1086
1083 If oldnode is not None, check if the patch content (without commit message
1087 If oldnode is not None, check if the patch content (without commit message
1084 and metadata) has changed before creating another diff. For a Revision with
1088 and metadata) has changed before creating another diff. For a Revision with
1085 a single commit, ``oldbasenode`` and ``oldnode`` have the same value. For a
1089 a single commit, ``oldbasenode`` and ``oldnode`` have the same value. For a
1086 Revision covering multiple commits, ``oldbasenode`` corresponds to
1090 Revision covering multiple commits, ``oldbasenode`` corresponds to
1087 ``ctxs[0]`` the previous time this Revision was posted, and ``oldnode``
1091 ``ctxs[0]`` the previous time this Revision was posted, and ``oldnode``
1088 corresponds to ``ctxs[-1]``.
1092 corresponds to ``ctxs[-1]``.
1089
1093
1090 If actions is not None, they will be appended to the transaction.
1094 If actions is not None, they will be appended to the transaction.
1091 """
1095 """
1092 ctx = ctxs[-1]
1096 ctx = ctxs[-1]
1093 basectx = ctxs[0]
1097 basectx = ctxs[0]
1094
1098
1095 repo = ctx.repo()
1099 repo = ctx.repo()
1096 if oldnode:
1100 if oldnode:
1097 diffopts = mdiff.diffopts(git=True, context=32767)
1101 diffopts = mdiff.diffopts(git=True, context=32767)
1098 unfi = repo.unfiltered()
1102 unfi = repo.unfiltered()
1099 oldctx = unfi[oldnode]
1103 oldctx = unfi[oldnode]
1100 oldbasectx = unfi[oldbasenode]
1104 oldbasectx = unfi[oldbasenode]
1101 neednewdiff = getdiff(basectx, ctx, diffopts) != getdiff(
1105 neednewdiff = getdiff(basectx, ctx, diffopts) != getdiff(
1102 oldbasectx, oldctx, diffopts
1106 oldbasectx, oldctx, diffopts
1103 )
1107 )
1104 else:
1108 else:
1105 neednewdiff = True
1109 neednewdiff = True
1106
1110
1107 transactions = []
1111 transactions = []
1108 if neednewdiff:
1112 if neednewdiff:
1109 diff = creatediff(basectx, ctx)
1113 diff = creatediff(basectx, ctx)
1110 transactions.append({b'type': b'update', b'value': diff[b'phid']})
1114 transactions.append({b'type': b'update', b'value': diff[b'phid']})
1111 if comment:
1115 if comment:
1112 transactions.append({b'type': b'comment', b'value': comment})
1116 transactions.append({b'type': b'comment', b'value': comment})
1113 else:
1117 else:
1114 # Even if we don't need to upload a new diff because the patch content
1118 # Even if we don't need to upload a new diff because the patch content
1115 # does not change. We might still need to update its metadata so
1119 # does not change. We might still need to update its metadata so
1116 # pushers could know the correct node metadata.
1120 # pushers could know the correct node metadata.
1117 assert olddiff
1121 assert olddiff
1118 diff = olddiff
1122 diff = olddiff
1119 writediffproperties(ctxs, diff)
1123 writediffproperties(ctxs, diff)
1120
1124
1121 # Set the parent Revision every time, so commit re-ordering is picked-up
1125 # Set the parent Revision every time, so commit re-ordering is picked-up
1122 if parentrevphid:
1126 if parentrevphid:
1123 transactions.append(
1127 transactions.append(
1124 {b'type': b'parents.set', b'value': [parentrevphid]}
1128 {b'type': b'parents.set', b'value': [parentrevphid]}
1125 )
1129 )
1126
1130
1127 if actions:
1131 if actions:
1128 transactions += actions
1132 transactions += actions
1129
1133
1130 # When folding multiple local commits into a single review, arcanist will
1134 # When folding multiple local commits into a single review, arcanist will
1131 # take the summary line of the first commit as the title, and then
1135 # take the summary line of the first commit as the title, and then
1132 # concatenate the rest of the remaining messages (including each of their
1136 # concatenate the rest of the remaining messages (including each of their
1133 # first lines) to the rest of the first commit message (each separated by
1137 # first lines) to the rest of the first commit message (each separated by
1134 # an empty line), and use that as the summary field. Do the same here.
1138 # an empty line), and use that as the summary field. Do the same here.
1135 # For commits with only a one line message, there is no summary field, as
1139 # For commits with only a one line message, there is no summary field, as
1136 # this gets assigned to the title.
1140 # this gets assigned to the title.
1137 fields = util.sortdict() # sorted for stable wire protocol in tests
1141 fields = util.sortdict() # sorted for stable wire protocol in tests
1138
1142
1139 for i, _ctx in enumerate(ctxs):
1143 for i, _ctx in enumerate(ctxs):
1140 # Parse commit message and update related fields.
1144 # Parse commit message and update related fields.
1141 desc = _ctx.description()
1145 desc = _ctx.description()
1142 info = callconduit(
1146 info = callconduit(
1143 repo.ui, b'differential.parsecommitmessage', {b'corpus': desc}
1147 repo.ui, b'differential.parsecommitmessage', {b'corpus': desc}
1144 )
1148 )
1145
1149
1146 for k in [b'title', b'summary', b'testPlan']:
1150 for k in [b'title', b'summary', b'testPlan']:
1147 v = info[b'fields'].get(k)
1151 v = info[b'fields'].get(k)
1148 if not v:
1152 if not v:
1149 continue
1153 continue
1150
1154
1151 if i == 0:
1155 if i == 0:
1152 # Title, summary and test plan (if present) are taken verbatim
1156 # Title, summary and test plan (if present) are taken verbatim
1153 # for the first commit.
1157 # for the first commit.
1154 fields[k] = v.rstrip()
1158 fields[k] = v.rstrip()
1155 continue
1159 continue
1156 elif k == b'title':
1160 elif k == b'title':
1157 # Add subsequent titles (i.e. the first line of the commit
1161 # Add subsequent titles (i.e. the first line of the commit
1158 # message) back to the summary.
1162 # message) back to the summary.
1159 k = b'summary'
1163 k = b'summary'
1160
1164
1161 # Append any current field to the existing composite field
1165 # Append any current field to the existing composite field
1162 fields[k] = b'\n\n'.join(filter(None, [fields.get(k), v.rstrip()]))
1166 fields[k] = b'\n\n'.join(filter(None, [fields.get(k), v.rstrip()]))
1163
1167
1164 for k, v in fields.items():
1168 for k, v in fields.items():
1165 transactions.append({b'type': k, b'value': v})
1169 transactions.append({b'type': k, b'value': v})
1166
1170
1167 params = {b'transactions': transactions}
1171 params = {b'transactions': transactions}
1168 if revid is not None:
1172 if revid is not None:
1169 # Update an existing Differential Revision
1173 # Update an existing Differential Revision
1170 params[b'objectIdentifier'] = revid
1174 params[b'objectIdentifier'] = revid
1171
1175
1172 revision = callconduit(repo.ui, b'differential.revision.edit', params)
1176 revision = callconduit(repo.ui, b'differential.revision.edit', params)
1173 if not revision:
1177 if not revision:
1174 if len(ctxs) == 1:
1178 if len(ctxs) == 1:
1175 msg = _(b'cannot create revision for %s') % ctx
1179 msg = _(b'cannot create revision for %s') % ctx
1176 else:
1180 else:
1177 msg = _(b'cannot create revision for %s::%s') % (basectx, ctx)
1181 msg = _(b'cannot create revision for %s::%s') % (basectx, ctx)
1178 raise error.Abort(msg)
1182 raise error.Abort(msg)
1179
1183
1180 return revision, diff
1184 return revision, diff
1181
1185
1182
1186
1183 def userphids(ui, names):
1187 def userphids(ui, names):
1184 """convert user names to PHIDs"""
1188 """convert user names to PHIDs"""
1185 names = [name.lower() for name in names]
1189 names = [name.lower() for name in names]
1186 query = {b'constraints': {b'usernames': names}}
1190 query = {b'constraints': {b'usernames': names}}
1187 result = callconduit(ui, b'user.search', query)
1191 result = callconduit(ui, b'user.search', query)
1188 # username not found is not an error of the API. So check if we have missed
1192 # username not found is not an error of the API. So check if we have missed
1189 # some names here.
1193 # some names here.
1190 data = result[b'data']
1194 data = result[b'data']
1191 resolved = {entry[b'fields'][b'username'].lower() for entry in data}
1195 resolved = {entry[b'fields'][b'username'].lower() for entry in data}
1192 unresolved = set(names) - resolved
1196 unresolved = set(names) - resolved
1193 if unresolved:
1197 if unresolved:
1194 raise error.Abort(
1198 raise error.Abort(
1195 _(b'unknown username: %s') % b' '.join(sorted(unresolved))
1199 _(b'unknown username: %s') % b' '.join(sorted(unresolved))
1196 )
1200 )
1197 return [entry[b'phid'] for entry in data]
1201 return [entry[b'phid'] for entry in data]
1198
1202
1199
1203
1200 def _print_phabsend_action(ui, ctx, newrevid, action):
1204 def _print_phabsend_action(ui, ctx, newrevid, action):
1201 """print the ``action`` that occurred when posting ``ctx`` for review
1205 """print the ``action`` that occurred when posting ``ctx`` for review
1202
1206
1203 This is a utility function for the sending phase of ``phabsend``, which
1207 This is a utility function for the sending phase of ``phabsend``, which
1204 makes it easier to show a status for all local commits with `--fold``.
1208 makes it easier to show a status for all local commits with `--fold``.
1205 """
1209 """
1206 actiondesc = ui.label(
1210 actiondesc = ui.label(
1207 {
1211 {
1208 b'created': _(b'created'),
1212 b'created': _(b'created'),
1209 b'skipped': _(b'skipped'),
1213 b'skipped': _(b'skipped'),
1210 b'updated': _(b'updated'),
1214 b'updated': _(b'updated'),
1211 }[action],
1215 }[action],
1212 b'phabricator.action.%s' % action,
1216 b'phabricator.action.%s' % action,
1213 )
1217 )
1214 drevdesc = ui.label(b'D%d' % newrevid, b'phabricator.drev')
1218 drevdesc = ui.label(b'D%d' % newrevid, b'phabricator.drev')
1215 nodedesc = ui.label(bytes(ctx), b'phabricator.node')
1219 nodedesc = ui.label(bytes(ctx), b'phabricator.node')
1216 desc = ui.label(ctx.description().split(b'\n')[0], b'phabricator.desc')
1220 desc = ui.label(ctx.description().split(b'\n')[0], b'phabricator.desc')
1217 ui.write(_(b'%s - %s - %s: %s\n') % (drevdesc, actiondesc, nodedesc, desc))
1221 ui.write(_(b'%s - %s - %s: %s\n') % (drevdesc, actiondesc, nodedesc, desc))
1218
1222
1219
1223
1220 def _amend_diff_properties(unfi, drevid, newnodes, diff):
1224 def _amend_diff_properties(unfi, drevid, newnodes, diff):
1221 """update the local commit list for the ``diff`` associated with ``drevid``
1225 """update the local commit list for the ``diff`` associated with ``drevid``
1222
1226
1223 This is a utility function for the amend phase of ``phabsend``, which
1227 This is a utility function for the amend phase of ``phabsend``, which
1224 converts failures to warning messages.
1228 converts failures to warning messages.
1225 """
1229 """
1226 _debug(
1230 _debug(
1227 unfi.ui,
1231 unfi.ui,
1228 b"new commits: %s\n" % stringutil.pprint([short(n) for n in newnodes]),
1232 b"new commits: %s\n" % stringutil.pprint([short(n) for n in newnodes]),
1229 )
1233 )
1230
1234
1231 try:
1235 try:
1232 writediffproperties([unfi[newnode] for newnode in newnodes], diff)
1236 writediffproperties([unfi[newnode] for newnode in newnodes], diff)
1233 except util.urlerr.urlerror:
1237 except util.urlerr.urlerror:
1234 # If it fails just warn and keep going, otherwise the DREV
1238 # If it fails just warn and keep going, otherwise the DREV
1235 # associations will be lost
1239 # associations will be lost
1236 unfi.ui.warnnoi18n(b'Failed to update metadata for D%d\n' % drevid)
1240 unfi.ui.warnnoi18n(b'Failed to update metadata for D%d\n' % drevid)
1237
1241
1238
1242
1239 @vcrcommand(
1243 @vcrcommand(
1240 b'phabsend',
1244 b'phabsend',
1241 [
1245 [
1242 (b'r', b'rev', [], _(b'revisions to send'), _(b'REV')),
1246 (b'r', b'rev', [], _(b'revisions to send'), _(b'REV')),
1243 (b'', b'amend', True, _(b'update commit messages')),
1247 (b'', b'amend', True, _(b'update commit messages')),
1244 (b'', b'reviewer', [], _(b'specify reviewers')),
1248 (b'', b'reviewer', [], _(b'specify reviewers')),
1245 (b'', b'blocker', [], _(b'specify blocking reviewers')),
1249 (b'', b'blocker', [], _(b'specify blocking reviewers')),
1246 (
1250 (
1247 b'm',
1251 b'm',
1248 b'comment',
1252 b'comment',
1249 b'',
1253 b'',
1250 _(b'add a comment to Revisions with new/updated Diffs'),
1254 _(b'add a comment to Revisions with new/updated Diffs'),
1251 ),
1255 ),
1252 (b'', b'confirm', None, _(b'ask for confirmation before sending')),
1256 (b'', b'confirm', None, _(b'ask for confirmation before sending')),
1257 (b'', b'fold', False, _(b'combine the revisions into one review')),
1253 ],
1258 ],
1254 _(b'REV [OPTIONS]'),
1259 _(b'REV [OPTIONS]'),
1255 helpcategory=command.CATEGORY_IMPORT_EXPORT,
1260 helpcategory=command.CATEGORY_IMPORT_EXPORT,
1256 )
1261 )
1257 def phabsend(ui, repo, *revs, **opts):
1262 def phabsend(ui, repo, *revs, **opts):
1258 """upload changesets to Phabricator
1263 """upload changesets to Phabricator
1259
1264
1260 If there are multiple revisions specified, they will be send as a stack
1265 If there are multiple revisions specified, they will be send as a stack
1261 with a linear dependencies relationship using the order specified by the
1266 with a linear dependencies relationship using the order specified by the
1262 revset.
1267 revset.
1263
1268
1264 For the first time uploading changesets, local tags will be created to
1269 For the first time uploading changesets, local tags will be created to
1265 maintain the association. After the first time, phabsend will check
1270 maintain the association. After the first time, phabsend will check
1266 obsstore and tags information so it can figure out whether to update an
1271 obsstore and tags information so it can figure out whether to update an
1267 existing Differential Revision, or create a new one.
1272 existing Differential Revision, or create a new one.
1268
1273
1269 If --amend is set, update commit messages so they have the
1274 If --amend is set, update commit messages so they have the
1270 ``Differential Revision`` URL, remove related tags. This is similar to what
1275 ``Differential Revision`` URL, remove related tags. This is similar to what
1271 arcanist will do, and is more desired in author-push workflows. Otherwise,
1276 arcanist will do, and is more desired in author-push workflows. Otherwise,
1272 use local tags to record the ``Differential Revision`` association.
1277 use local tags to record the ``Differential Revision`` association.
1273
1278
1274 The --confirm option lets you confirm changesets before sending them. You
1279 The --confirm option lets you confirm changesets before sending them. You
1275 can also add following to your configuration file to make it default
1280 can also add following to your configuration file to make it default
1276 behaviour::
1281 behaviour::
1277
1282
1278 [phabsend]
1283 [phabsend]
1279 confirm = true
1284 confirm = true
1280
1285
1286 By default, a separate review will be created for each commit that is
1287 selected, and will have the same parent/child relationship in Phabricator.
1288 If ``--fold`` is set, multiple commits are rolled up into a single review
1289 as if diffed from the parent of the first revision to the last. The commit
1290 messages are concatenated in the summary field on Phabricator.
1291
1281 phabsend will check obsstore and the above association to decide whether to
1292 phabsend will check obsstore and the above association to decide whether to
1282 update an existing Differential Revision, or create a new one.
1293 update an existing Differential Revision, or create a new one.
1283 """
1294 """
1284 opts = pycompat.byteskwargs(opts)
1295 opts = pycompat.byteskwargs(opts)
1285 revs = list(revs) + opts.get(b'rev', [])
1296 revs = list(revs) + opts.get(b'rev', [])
1286 revs = scmutil.revrange(repo, revs)
1297 revs = scmutil.revrange(repo, revs)
1287 revs.sort() # ascending order to preserve topological parent/child in phab
1298 revs.sort() # ascending order to preserve topological parent/child in phab
1288
1299
1289 if not revs:
1300 if not revs:
1290 raise error.Abort(_(b'phabsend requires at least one changeset'))
1301 raise error.Abort(_(b'phabsend requires at least one changeset'))
1291 if opts.get(b'amend'):
1302 if opts.get(b'amend'):
1292 cmdutil.checkunfinished(repo)
1303 cmdutil.checkunfinished(repo)
1293
1304
1305 ctxs = [repo[rev] for rev in revs]
1306
1307 fold = opts.get(b'fold')
1308 if fold:
1309 if len(revs) == 1:
1310 # TODO: just switch to --no-fold instead?
1311 raise error.Abort(_(b"cannot fold a single revision"))
1312
1313 # There's no clear way to manage multiple commits with a Dxxx tag, so
1314 # require the amend option. (We could append "_nnn", but then it
1315 # becomes jumbled if earlier commits are added to an update.) It should
1316 # lock the repo and ensure that the range is editable, but that would
1317 # make the code pretty convoluted. The default behavior of `arc` is to
1318 # create a new review anyway.
1319 if not opts.get(b"amend"):
1320 raise error.Abort(_(b"cannot fold with --no-amend"))
1321
1322 # Ensure the local commits are an unbroken range
1323 revrange = repo.revs(b'(first(%ld)::last(%ld))', revs, revs)
1324 if any(r for r in revs if r not in revrange) or any(
1325 r for r in revrange if r not in revs
1326 ):
1327 raise error.Abort(_(b"cannot fold non-linear revisions"))
1328
1329 # It might be possible to bucketize the revisions by the DREV value, and
1330 # iterate over those groups when posting, and then again when amending.
1331 # But for simplicity, require all selected revisions to be for the same
1332 # DREV (if present). Adding local revisions to an existing DREV is
1333 # acceptable.
1334 drevmatchers = [
1335 _differentialrevisiondescre.search(ctx.description())
1336 for ctx in ctxs
1337 ]
1338 if len({m.group('url') for m in drevmatchers if m}) > 1:
1339 raise error.Abort(
1340 _(b"cannot fold revisions with different DREV values")
1341 )
1342
1294 # {newnode: (oldnode, olddiff, olddrev}
1343 # {newnode: (oldnode, olddiff, olddrev}
1295 oldmap = getoldnodedrevmap(repo, [repo[r].node() for r in revs])
1344 oldmap = getoldnodedrevmap(repo, [repo[r].node() for r in revs])
1296
1345
1297 confirm = ui.configbool(b'phabsend', b'confirm')
1346 confirm = ui.configbool(b'phabsend', b'confirm')
1298 confirm |= bool(opts.get(b'confirm'))
1347 confirm |= bool(opts.get(b'confirm'))
1299 if confirm:
1348 if confirm:
1300 confirmed = _confirmbeforesend(repo, revs, oldmap)
1349 confirmed = _confirmbeforesend(repo, revs, oldmap)
1301 if not confirmed:
1350 if not confirmed:
1302 raise error.Abort(_(b'phabsend cancelled'))
1351 raise error.Abort(_(b'phabsend cancelled'))
1303
1352
1304 actions = []
1353 actions = []
1305 reviewers = opts.get(b'reviewer', [])
1354 reviewers = opts.get(b'reviewer', [])
1306 blockers = opts.get(b'blocker', [])
1355 blockers = opts.get(b'blocker', [])
1307 phids = []
1356 phids = []
1308 if reviewers:
1357 if reviewers:
1309 phids.extend(userphids(repo.ui, reviewers))
1358 phids.extend(userphids(repo.ui, reviewers))
1310 if blockers:
1359 if blockers:
1311 phids.extend(
1360 phids.extend(
1312 map(
1361 map(
1313 lambda phid: b'blocking(%s)' % phid,
1362 lambda phid: b'blocking(%s)' % phid,
1314 userphids(repo.ui, blockers),
1363 userphids(repo.ui, blockers),
1315 )
1364 )
1316 )
1365 )
1317 if phids:
1366 if phids:
1318 actions.append({b'type': b'reviewers.add', b'value': phids})
1367 actions.append({b'type': b'reviewers.add', b'value': phids})
1319
1368
1320 drevids = [] # [int]
1369 drevids = [] # [int]
1321 diffmap = {} # {newnode: diff}
1370 diffmap = {} # {newnode: diff}
1322
1371
1323 # Send patches one by one so we know their Differential Revision PHIDs and
1372 # Send patches one by one so we know their Differential Revision PHIDs and
1324 # can provide dependency relationship
1373 # can provide dependency relationship
1325 lastrevphid = None
1374 lastrevphid = None
1326 for rev in revs:
1375 for ctx in ctxs:
1327 ui.debug(b'sending rev %d\n' % rev)
1376 if fold:
1328 ctx = repo[rev]
1377 ui.debug(b'sending rev %d::%d\n' % (ctx.rev(), ctxs[-1].rev()))
1378 else:
1379 ui.debug(b'sending rev %d\n' % ctx.rev())
1329
1380
1330 # Get Differential Revision ID
1381 # Get Differential Revision ID
1331 oldnode, olddiff, revid = oldmap.get(ctx.node(), (None, None, None))
1382 oldnode, olddiff, revid = oldmap.get(ctx.node(), (None, None, None))
1332 oldbasenode = oldnode
1383 oldbasenode, oldbasediff, oldbaserevid = oldnode, olddiff, revid
1384
1385 if fold:
1386 oldbasenode, oldbasediff, oldbaserevid = oldmap.get(
1387 ctxs[-1].node(), (None, None, None)
1388 )
1389
1333 if oldnode != ctx.node() or opts.get(b'amend'):
1390 if oldnode != ctx.node() or opts.get(b'amend'):
1334 # Create or update Differential Revision
1391 # Create or update Differential Revision
1335 revision, diff = createdifferentialrevision(
1392 revision, diff = createdifferentialrevision(
1336 [ctx],
1393 ctxs if fold else [ctx],
1337 revid,
1394 revid,
1338 lastrevphid,
1395 lastrevphid,
1339 oldbasenode,
1396 oldbasenode,
1340 oldnode,
1397 oldnode,
1341 olddiff,
1398 olddiff,
1342 actions,
1399 actions,
1343 opts.get(b'comment'),
1400 opts.get(b'comment'),
1344 )
1401 )
1345 diffmap[ctx.node()] = diff
1402
1403 if fold:
1404 for ctx in ctxs:
1405 diffmap[ctx.node()] = diff
1406 else:
1407 diffmap[ctx.node()] = diff
1408
1346 newrevid = int(revision[b'object'][b'id'])
1409 newrevid = int(revision[b'object'][b'id'])
1347 newrevphid = revision[b'object'][b'phid']
1410 newrevphid = revision[b'object'][b'phid']
1348 if revid:
1411 if revid:
1349 action = b'updated'
1412 action = b'updated'
1350 else:
1413 else:
1351 action = b'created'
1414 action = b'created'
1352
1415
1353 # Create a local tag to note the association, if commit message
1416 # Create a local tag to note the association, if commit message
1354 # does not have it already
1417 # does not have it already
1355 m = _differentialrevisiondescre.search(ctx.description())
1418 if not fold:
1356 if not m or int(m.group('id')) != newrevid:
1419 m = _differentialrevisiondescre.search(ctx.description())
1357 tagname = b'D%d' % newrevid
1420 if not m or int(m.group('id')) != newrevid:
1358 tags.tag(
1421 tagname = b'D%d' % newrevid
1359 repo,
1422 tags.tag(
1360 tagname,
1423 repo,
1361 ctx.node(),
1424 tagname,
1362 message=None,
1425 ctx.node(),
1363 user=None,
1426 message=None,
1364 date=None,
1427 user=None,
1365 local=True,
1428 date=None,
1366 )
1429 local=True,
1430 )
1367 else:
1431 else:
1368 # Nothing changed. But still set "newrevphid" so the next revision
1432 # Nothing changed. But still set "newrevphid" so the next revision
1369 # could depend on this one and "newrevid" for the summary line.
1433 # could depend on this one and "newrevid" for the summary line.
1370 newrevphid = querydrev(repo.ui, b'%d' % revid)[0][b'phid']
1434 newrevphid = querydrev(repo.ui, b'%d' % revid)[0][b'phid']
1371 newrevid = revid
1435 newrevid = revid
1372 action = b'skipped'
1436 action = b'skipped'
1373
1437
1374 drevids.append(newrevid)
1438 drevids.append(newrevid)
1375 lastrevphid = newrevphid
1439 lastrevphid = newrevphid
1376
1440
1441 if fold:
1442 for c in ctxs:
1443 if oldmap.get(c.node(), (None, None, None))[2]:
1444 action = b'updated'
1445 else:
1446 action = b'created'
1447 _print_phabsend_action(ui, c, newrevid, action)
1448 break
1449
1377 _print_phabsend_action(ui, ctx, newrevid, action)
1450 _print_phabsend_action(ui, ctx, newrevid, action)
1378
1451
1379 # Update commit messages and remove tags
1452 # Update commit messages and remove tags
1380 if opts.get(b'amend'):
1453 if opts.get(b'amend'):
1381 unfi = repo.unfiltered()
1454 unfi = repo.unfiltered()
1382 drevs = callconduit(ui, b'differential.query', {b'ids': drevids})
1455 drevs = callconduit(ui, b'differential.query', {b'ids': drevids})
1383 with repo.wlock(), repo.lock(), repo.transaction(b'phabsend'):
1456 with repo.wlock(), repo.lock(), repo.transaction(b'phabsend'):
1384 wnode = unfi[b'.'].node()
1457 wnode = unfi[b'.'].node()
1385 mapping = {} # {oldnode: [newnode]}
1458 mapping = {} # {oldnode: [newnode]}
1459 newnodes = []
1460
1461 drevid = drevids[0]
1462
1386 for i, rev in enumerate(revs):
1463 for i, rev in enumerate(revs):
1387 old = unfi[rev]
1464 old = unfi[rev]
1388 drevid = drevids[i]
1465 if not fold:
1466 drevid = drevids[i]
1389 drev = [d for d in drevs if int(d[b'id']) == drevid][0]
1467 drev = [d for d in drevs if int(d[b'id']) == drevid][0]
1390 newdesc = get_amended_desc(drev, old, False)
1468
1469 newdesc = get_amended_desc(drev, old, fold)
1391 # Make sure commit message contain "Differential Revision"
1470 # Make sure commit message contain "Differential Revision"
1392 if old.description() != newdesc:
1471 if old.description() != newdesc:
1393 if old.phase() == phases.public:
1472 if old.phase() == phases.public:
1394 ui.warn(
1473 ui.warn(
1395 _(b"warning: not updating public commit %s\n")
1474 _(b"warning: not updating public commit %s\n")
1396 % scmutil.formatchangeid(old)
1475 % scmutil.formatchangeid(old)
1397 )
1476 )
1398 continue
1477 continue
1399 parents = [
1478 parents = [
1400 mapping.get(old.p1().node(), (old.p1(),))[0],
1479 mapping.get(old.p1().node(), (old.p1(),))[0],
1401 mapping.get(old.p2().node(), (old.p2(),))[0],
1480 mapping.get(old.p2().node(), (old.p2(),))[0],
1402 ]
1481 ]
1403 new = context.metadataonlyctx(
1482 new = context.metadataonlyctx(
1404 repo,
1483 repo,
1405 old,
1484 old,
1406 parents=parents,
1485 parents=parents,
1407 text=newdesc,
1486 text=newdesc,
1408 user=old.user(),
1487 user=old.user(),
1409 date=old.date(),
1488 date=old.date(),
1410 extra=old.extra(),
1489 extra=old.extra(),
1411 )
1490 )
1412
1491
1413 newnode = new.commit()
1492 newnode = new.commit()
1414
1493
1415 mapping[old.node()] = [newnode]
1494 mapping[old.node()] = [newnode]
1416
1495
1496 if fold:
1497 # Defer updating the (single) Diff until all nodes are
1498 # collected. No tags were created, so none need to be
1499 # removed.
1500 newnodes.append(newnode)
1501 continue
1502
1417 _amend_diff_properties(
1503 _amend_diff_properties(
1418 unfi, drevid, [newnode], diffmap[old.node()]
1504 unfi, drevid, [newnode], diffmap[old.node()]
1419 )
1505 )
1420 # Remove local tags since it's no longer necessary
1506
1421 tagname = b'D%d' % drevid
1507 # Remove local tags since it's no longer necessary
1422 if tagname in repo.tags():
1508 tagname = b'D%d' % drevid
1423 tags.tag(
1509 if tagname in repo.tags():
1424 repo,
1510 tags.tag(
1425 tagname,
1511 repo,
1426 nullid,
1512 tagname,
1427 message=None,
1513 nullid,
1428 user=None,
1514 message=None,
1429 date=None,
1515 user=None,
1430 local=True,
1516 date=None,
1517 local=True,
1518 )
1519 elif fold:
1520 # When folding multiple commits into one review with
1521 # --fold, track even the commits that weren't amended, so
1522 # that their association isn't lost if the properties are
1523 # rewritten below.
1524 newnodes.append(old.node())
1525
1526 # If the submitted commits are public, no amend takes place so
1527 # there are no newnodes and therefore no diff update to do.
1528 if fold and newnodes:
1529 diff = diffmap[old.node()]
1530
1531 # The diff object in diffmap doesn't have the local commits
1532 # because that could be returned from differential.creatediff,
1533 # not differential.querydiffs. So use the queried diff (if
1534 # present), or force the amend (a new revision is being posted.)
1535 if not olddiff or set(newnodes) != getlocalcommits(olddiff):
1536 _debug(ui, b"updating local commit list for D%d\n" % drevid)
1537 _amend_diff_properties(unfi, drevid, newnodes, diff)
1538 else:
1539 _debug(
1540 ui,
1541 b"local commit list for D%d is already up-to-date\n"
1542 % drevid,
1431 )
1543 )
1544 elif fold:
1545 _debug(ui, b"no newnodes to update\n")
1546
1432 scmutil.cleanupnodes(repo, mapping, b'phabsend', fixphase=True)
1547 scmutil.cleanupnodes(repo, mapping, b'phabsend', fixphase=True)
1433 if wnode in mapping:
1548 if wnode in mapping:
1434 unfi.setparents(mapping[wnode][0])
1549 unfi.setparents(mapping[wnode][0])
1435
1550
1436
1551
1437 # Map from "hg:meta" keys to header understood by "hg import". The order is
1552 # Map from "hg:meta" keys to header understood by "hg import". The order is
1438 # consistent with "hg export" output.
1553 # consistent with "hg export" output.
1439 _metanamemap = util.sortdict(
1554 _metanamemap = util.sortdict(
1440 [
1555 [
1441 (b'user', b'User'),
1556 (b'user', b'User'),
1442 (b'date', b'Date'),
1557 (b'date', b'Date'),
1443 (b'branch', b'Branch'),
1558 (b'branch', b'Branch'),
1444 (b'node', b'Node ID'),
1559 (b'node', b'Node ID'),
1445 (b'parent', b'Parent '),
1560 (b'parent', b'Parent '),
1446 ]
1561 ]
1447 )
1562 )
1448
1563
1449
1564
1450 def _confirmbeforesend(repo, revs, oldmap):
1565 def _confirmbeforesend(repo, revs, oldmap):
1451 url, token = readurltoken(repo.ui)
1566 url, token = readurltoken(repo.ui)
1452 ui = repo.ui
1567 ui = repo.ui
1453 for rev in revs:
1568 for rev in revs:
1454 ctx = repo[rev]
1569 ctx = repo[rev]
1455 desc = ctx.description().splitlines()[0]
1570 desc = ctx.description().splitlines()[0]
1456 oldnode, olddiff, drevid = oldmap.get(ctx.node(), (None, None, None))
1571 oldnode, olddiff, drevid = oldmap.get(ctx.node(), (None, None, None))
1457 if drevid:
1572 if drevid:
1458 drevdesc = ui.label(b'D%d' % drevid, b'phabricator.drev')
1573 drevdesc = ui.label(b'D%d' % drevid, b'phabricator.drev')
1459 else:
1574 else:
1460 drevdesc = ui.label(_(b'NEW'), b'phabricator.drev')
1575 drevdesc = ui.label(_(b'NEW'), b'phabricator.drev')
1461
1576
1462 ui.write(
1577 ui.write(
1463 _(b'%s - %s: %s\n')
1578 _(b'%s - %s: %s\n')
1464 % (
1579 % (
1465 drevdesc,
1580 drevdesc,
1466 ui.label(bytes(ctx), b'phabricator.node'),
1581 ui.label(bytes(ctx), b'phabricator.node'),
1467 ui.label(desc, b'phabricator.desc'),
1582 ui.label(desc, b'phabricator.desc'),
1468 )
1583 )
1469 )
1584 )
1470
1585
1471 if ui.promptchoice(
1586 if ui.promptchoice(
1472 _(b'Send the above changes to %s (yn)?$$ &Yes $$ &No') % url
1587 _(b'Send the above changes to %s (yn)?$$ &Yes $$ &No') % url
1473 ):
1588 ):
1474 return False
1589 return False
1475
1590
1476 return True
1591 return True
1477
1592
1478
1593
1479 _knownstatusnames = {
1594 _knownstatusnames = {
1480 b'accepted',
1595 b'accepted',
1481 b'needsreview',
1596 b'needsreview',
1482 b'needsrevision',
1597 b'needsrevision',
1483 b'closed',
1598 b'closed',
1484 b'abandoned',
1599 b'abandoned',
1485 b'changesplanned',
1600 b'changesplanned',
1486 }
1601 }
1487
1602
1488
1603
1489 def _getstatusname(drev):
1604 def _getstatusname(drev):
1490 """get normalized status name from a Differential Revision"""
1605 """get normalized status name from a Differential Revision"""
1491 return drev[b'statusName'].replace(b' ', b'').lower()
1606 return drev[b'statusName'].replace(b' ', b'').lower()
1492
1607
1493
1608
1494 # Small language to specify differential revisions. Support symbols: (), :X,
1609 # Small language to specify differential revisions. Support symbols: (), :X,
1495 # +, and -.
1610 # +, and -.
1496
1611
1497 _elements = {
1612 _elements = {
1498 # token-type: binding-strength, primary, prefix, infix, suffix
1613 # token-type: binding-strength, primary, prefix, infix, suffix
1499 b'(': (12, None, (b'group', 1, b')'), None, None),
1614 b'(': (12, None, (b'group', 1, b')'), None, None),
1500 b':': (8, None, (b'ancestors', 8), None, None),
1615 b':': (8, None, (b'ancestors', 8), None, None),
1501 b'&': (5, None, None, (b'and_', 5), None),
1616 b'&': (5, None, None, (b'and_', 5), None),
1502 b'+': (4, None, None, (b'add', 4), None),
1617 b'+': (4, None, None, (b'add', 4), None),
1503 b'-': (4, None, None, (b'sub', 4), None),
1618 b'-': (4, None, None, (b'sub', 4), None),
1504 b')': (0, None, None, None, None),
1619 b')': (0, None, None, None, None),
1505 b'symbol': (0, b'symbol', None, None, None),
1620 b'symbol': (0, b'symbol', None, None, None),
1506 b'end': (0, None, None, None, None),
1621 b'end': (0, None, None, None, None),
1507 }
1622 }
1508
1623
1509
1624
1510 def _tokenize(text):
1625 def _tokenize(text):
1511 view = memoryview(text) # zero-copy slice
1626 view = memoryview(text) # zero-copy slice
1512 special = b'():+-& '
1627 special = b'():+-& '
1513 pos = 0
1628 pos = 0
1514 length = len(text)
1629 length = len(text)
1515 while pos < length:
1630 while pos < length:
1516 symbol = b''.join(
1631 symbol = b''.join(
1517 itertools.takewhile(
1632 itertools.takewhile(
1518 lambda ch: ch not in special, pycompat.iterbytestr(view[pos:])
1633 lambda ch: ch not in special, pycompat.iterbytestr(view[pos:])
1519 )
1634 )
1520 )
1635 )
1521 if symbol:
1636 if symbol:
1522 yield (b'symbol', symbol, pos)
1637 yield (b'symbol', symbol, pos)
1523 pos += len(symbol)
1638 pos += len(symbol)
1524 else: # special char, ignore space
1639 else: # special char, ignore space
1525 if text[pos : pos + 1] != b' ':
1640 if text[pos : pos + 1] != b' ':
1526 yield (text[pos : pos + 1], None, pos)
1641 yield (text[pos : pos + 1], None, pos)
1527 pos += 1
1642 pos += 1
1528 yield (b'end', None, pos)
1643 yield (b'end', None, pos)
1529
1644
1530
1645
1531 def _parse(text):
1646 def _parse(text):
1532 tree, pos = parser.parser(_elements).parse(_tokenize(text))
1647 tree, pos = parser.parser(_elements).parse(_tokenize(text))
1533 if pos != len(text):
1648 if pos != len(text):
1534 raise error.ParseError(b'invalid token', pos)
1649 raise error.ParseError(b'invalid token', pos)
1535 return tree
1650 return tree
1536
1651
1537
1652
1538 def _parsedrev(symbol):
1653 def _parsedrev(symbol):
1539 """str -> int or None, ex. 'D45' -> 45; '12' -> 12; 'x' -> None"""
1654 """str -> int or None, ex. 'D45' -> 45; '12' -> 12; 'x' -> None"""
1540 if symbol.startswith(b'D') and symbol[1:].isdigit():
1655 if symbol.startswith(b'D') and symbol[1:].isdigit():
1541 return int(symbol[1:])
1656 return int(symbol[1:])
1542 if symbol.isdigit():
1657 if symbol.isdigit():
1543 return int(symbol)
1658 return int(symbol)
1544
1659
1545
1660
1546 def _prefetchdrevs(tree):
1661 def _prefetchdrevs(tree):
1547 """return ({single-drev-id}, {ancestor-drev-id}) to prefetch"""
1662 """return ({single-drev-id}, {ancestor-drev-id}) to prefetch"""
1548 drevs = set()
1663 drevs = set()
1549 ancestordrevs = set()
1664 ancestordrevs = set()
1550 op = tree[0]
1665 op = tree[0]
1551 if op == b'symbol':
1666 if op == b'symbol':
1552 r = _parsedrev(tree[1])
1667 r = _parsedrev(tree[1])
1553 if r:
1668 if r:
1554 drevs.add(r)
1669 drevs.add(r)
1555 elif op == b'ancestors':
1670 elif op == b'ancestors':
1556 r, a = _prefetchdrevs(tree[1])
1671 r, a = _prefetchdrevs(tree[1])
1557 drevs.update(r)
1672 drevs.update(r)
1558 ancestordrevs.update(r)
1673 ancestordrevs.update(r)
1559 ancestordrevs.update(a)
1674 ancestordrevs.update(a)
1560 else:
1675 else:
1561 for t in tree[1:]:
1676 for t in tree[1:]:
1562 r, a = _prefetchdrevs(t)
1677 r, a = _prefetchdrevs(t)
1563 drevs.update(r)
1678 drevs.update(r)
1564 ancestordrevs.update(a)
1679 ancestordrevs.update(a)
1565 return drevs, ancestordrevs
1680 return drevs, ancestordrevs
1566
1681
1567
1682
1568 def querydrev(ui, spec):
1683 def querydrev(ui, spec):
1569 """return a list of "Differential Revision" dicts
1684 """return a list of "Differential Revision" dicts
1570
1685
1571 spec is a string using a simple query language, see docstring in phabread
1686 spec is a string using a simple query language, see docstring in phabread
1572 for details.
1687 for details.
1573
1688
1574 A "Differential Revision dict" looks like:
1689 A "Differential Revision dict" looks like:
1575
1690
1576 {
1691 {
1577 "activeDiffPHID": "PHID-DIFF-xoqnjkobbm6k4dk6hi72",
1692 "activeDiffPHID": "PHID-DIFF-xoqnjkobbm6k4dk6hi72",
1578 "authorPHID": "PHID-USER-tv3ohwc4v4jeu34otlye",
1693 "authorPHID": "PHID-USER-tv3ohwc4v4jeu34otlye",
1579 "auxiliary": {
1694 "auxiliary": {
1580 "phabricator:depends-on": [
1695 "phabricator:depends-on": [
1581 "PHID-DREV-gbapp366kutjebt7agcd"
1696 "PHID-DREV-gbapp366kutjebt7agcd"
1582 ]
1697 ]
1583 "phabricator:projects": [],
1698 "phabricator:projects": [],
1584 },
1699 },
1585 "branch": "default",
1700 "branch": "default",
1586 "ccs": [],
1701 "ccs": [],
1587 "commits": [],
1702 "commits": [],
1588 "dateCreated": "1499181406",
1703 "dateCreated": "1499181406",
1589 "dateModified": "1499182103",
1704 "dateModified": "1499182103",
1590 "diffs": [
1705 "diffs": [
1591 "3",
1706 "3",
1592 "4",
1707 "4",
1593 ],
1708 ],
1594 "hashes": [],
1709 "hashes": [],
1595 "id": "2",
1710 "id": "2",
1596 "lineCount": "2",
1711 "lineCount": "2",
1597 "phid": "PHID-DREV-672qvysjcczopag46qty",
1712 "phid": "PHID-DREV-672qvysjcczopag46qty",
1598 "properties": {},
1713 "properties": {},
1599 "repositoryPHID": "PHID-REPO-hub2hx62ieuqeheznasv",
1714 "repositoryPHID": "PHID-REPO-hub2hx62ieuqeheznasv",
1600 "reviewers": [],
1715 "reviewers": [],
1601 "sourcePath": null
1716 "sourcePath": null
1602 "status": "0",
1717 "status": "0",
1603 "statusName": "Needs Review",
1718 "statusName": "Needs Review",
1604 "summary": "",
1719 "summary": "",
1605 "testPlan": "",
1720 "testPlan": "",
1606 "title": "example",
1721 "title": "example",
1607 "uri": "https://phab.example.com/D2",
1722 "uri": "https://phab.example.com/D2",
1608 }
1723 }
1609 """
1724 """
1610 # TODO: replace differential.query and differential.querydiffs with
1725 # TODO: replace differential.query and differential.querydiffs with
1611 # differential.diff.search because the former (and their output) are
1726 # differential.diff.search because the former (and their output) are
1612 # frozen, and planned to be deprecated and removed.
1727 # frozen, and planned to be deprecated and removed.
1613
1728
1614 def fetch(params):
1729 def fetch(params):
1615 """params -> single drev or None"""
1730 """params -> single drev or None"""
1616 key = (params.get(b'ids') or params.get(b'phids') or [None])[0]
1731 key = (params.get(b'ids') or params.get(b'phids') or [None])[0]
1617 if key in prefetched:
1732 if key in prefetched:
1618 return prefetched[key]
1733 return prefetched[key]
1619 drevs = callconduit(ui, b'differential.query', params)
1734 drevs = callconduit(ui, b'differential.query', params)
1620 # Fill prefetched with the result
1735 # Fill prefetched with the result
1621 for drev in drevs:
1736 for drev in drevs:
1622 prefetched[drev[b'phid']] = drev
1737 prefetched[drev[b'phid']] = drev
1623 prefetched[int(drev[b'id'])] = drev
1738 prefetched[int(drev[b'id'])] = drev
1624 if key not in prefetched:
1739 if key not in prefetched:
1625 raise error.Abort(
1740 raise error.Abort(
1626 _(b'cannot get Differential Revision %r') % params
1741 _(b'cannot get Differential Revision %r') % params
1627 )
1742 )
1628 return prefetched[key]
1743 return prefetched[key]
1629
1744
1630 def getstack(topdrevids):
1745 def getstack(topdrevids):
1631 """given a top, get a stack from the bottom, [id] -> [id]"""
1746 """given a top, get a stack from the bottom, [id] -> [id]"""
1632 visited = set()
1747 visited = set()
1633 result = []
1748 result = []
1634 queue = [{b'ids': [i]} for i in topdrevids]
1749 queue = [{b'ids': [i]} for i in topdrevids]
1635 while queue:
1750 while queue:
1636 params = queue.pop()
1751 params = queue.pop()
1637 drev = fetch(params)
1752 drev = fetch(params)
1638 if drev[b'id'] in visited:
1753 if drev[b'id'] in visited:
1639 continue
1754 continue
1640 visited.add(drev[b'id'])
1755 visited.add(drev[b'id'])
1641 result.append(int(drev[b'id']))
1756 result.append(int(drev[b'id']))
1642 auxiliary = drev.get(b'auxiliary', {})
1757 auxiliary = drev.get(b'auxiliary', {})
1643 depends = auxiliary.get(b'phabricator:depends-on', [])
1758 depends = auxiliary.get(b'phabricator:depends-on', [])
1644 for phid in depends:
1759 for phid in depends:
1645 queue.append({b'phids': [phid]})
1760 queue.append({b'phids': [phid]})
1646 result.reverse()
1761 result.reverse()
1647 return smartset.baseset(result)
1762 return smartset.baseset(result)
1648
1763
1649 # Initialize prefetch cache
1764 # Initialize prefetch cache
1650 prefetched = {} # {id or phid: drev}
1765 prefetched = {} # {id or phid: drev}
1651
1766
1652 tree = _parse(spec)
1767 tree = _parse(spec)
1653 drevs, ancestordrevs = _prefetchdrevs(tree)
1768 drevs, ancestordrevs = _prefetchdrevs(tree)
1654
1769
1655 # developer config: phabricator.batchsize
1770 # developer config: phabricator.batchsize
1656 batchsize = ui.configint(b'phabricator', b'batchsize')
1771 batchsize = ui.configint(b'phabricator', b'batchsize')
1657
1772
1658 # Prefetch Differential Revisions in batch
1773 # Prefetch Differential Revisions in batch
1659 tofetch = set(drevs)
1774 tofetch = set(drevs)
1660 for r in ancestordrevs:
1775 for r in ancestordrevs:
1661 tofetch.update(range(max(1, r - batchsize), r + 1))
1776 tofetch.update(range(max(1, r - batchsize), r + 1))
1662 if drevs:
1777 if drevs:
1663 fetch({b'ids': list(tofetch)})
1778 fetch({b'ids': list(tofetch)})
1664 validids = sorted(set(getstack(list(ancestordrevs))) | set(drevs))
1779 validids = sorted(set(getstack(list(ancestordrevs))) | set(drevs))
1665
1780
1666 # Walk through the tree, return smartsets
1781 # Walk through the tree, return smartsets
1667 def walk(tree):
1782 def walk(tree):
1668 op = tree[0]
1783 op = tree[0]
1669 if op == b'symbol':
1784 if op == b'symbol':
1670 drev = _parsedrev(tree[1])
1785 drev = _parsedrev(tree[1])
1671 if drev:
1786 if drev:
1672 return smartset.baseset([drev])
1787 return smartset.baseset([drev])
1673 elif tree[1] in _knownstatusnames:
1788 elif tree[1] in _knownstatusnames:
1674 drevs = [
1789 drevs = [
1675 r
1790 r
1676 for r in validids
1791 for r in validids
1677 if _getstatusname(prefetched[r]) == tree[1]
1792 if _getstatusname(prefetched[r]) == tree[1]
1678 ]
1793 ]
1679 return smartset.baseset(drevs)
1794 return smartset.baseset(drevs)
1680 else:
1795 else:
1681 raise error.Abort(_(b'unknown symbol: %s') % tree[1])
1796 raise error.Abort(_(b'unknown symbol: %s') % tree[1])
1682 elif op in {b'and_', b'add', b'sub'}:
1797 elif op in {b'and_', b'add', b'sub'}:
1683 assert len(tree) == 3
1798 assert len(tree) == 3
1684 return getattr(operator, op)(walk(tree[1]), walk(tree[2]))
1799 return getattr(operator, op)(walk(tree[1]), walk(tree[2]))
1685 elif op == b'group':
1800 elif op == b'group':
1686 return walk(tree[1])
1801 return walk(tree[1])
1687 elif op == b'ancestors':
1802 elif op == b'ancestors':
1688 return getstack(walk(tree[1]))
1803 return getstack(walk(tree[1]))
1689 else:
1804 else:
1690 raise error.ProgrammingError(b'illegal tree: %r' % tree)
1805 raise error.ProgrammingError(b'illegal tree: %r' % tree)
1691
1806
1692 return [prefetched[r] for r in walk(tree)]
1807 return [prefetched[r] for r in walk(tree)]
1693
1808
1694
1809
1695 def getdescfromdrev(drev):
1810 def getdescfromdrev(drev):
1696 """get description (commit message) from "Differential Revision"
1811 """get description (commit message) from "Differential Revision"
1697
1812
1698 This is similar to differential.getcommitmessage API. But we only care
1813 This is similar to differential.getcommitmessage API. But we only care
1699 about limited fields: title, summary, test plan, and URL.
1814 about limited fields: title, summary, test plan, and URL.
1700 """
1815 """
1701 title = drev[b'title']
1816 title = drev[b'title']
1702 summary = drev[b'summary'].rstrip()
1817 summary = drev[b'summary'].rstrip()
1703 testplan = drev[b'testPlan'].rstrip()
1818 testplan = drev[b'testPlan'].rstrip()
1704 if testplan:
1819 if testplan:
1705 testplan = b'Test Plan:\n%s' % testplan
1820 testplan = b'Test Plan:\n%s' % testplan
1706 uri = b'Differential Revision: %s' % drev[b'uri']
1821 uri = b'Differential Revision: %s' % drev[b'uri']
1707 return b'\n\n'.join(filter(None, [title, summary, testplan, uri]))
1822 return b'\n\n'.join(filter(None, [title, summary, testplan, uri]))
1708
1823
1709
1824
1710 def get_amended_desc(drev, ctx, folded):
1825 def get_amended_desc(drev, ctx, folded):
1711 """similar to ``getdescfromdrev``, but supports a folded series of commits
1826 """similar to ``getdescfromdrev``, but supports a folded series of commits
1712
1827
1713 This is used when determining if an individual commit needs to have its
1828 This is used when determining if an individual commit needs to have its
1714 message amended after posting it for review. The determination is made for
1829 message amended after posting it for review. The determination is made for
1715 each individual commit, even when they were folded into one review.
1830 each individual commit, even when they were folded into one review.
1716 """
1831 """
1717 if not folded:
1832 if not folded:
1718 return getdescfromdrev(drev)
1833 return getdescfromdrev(drev)
1719
1834
1720 uri = b'Differential Revision: %s' % drev[b'uri']
1835 uri = b'Differential Revision: %s' % drev[b'uri']
1721
1836
1722 # Since the commit messages were combined when posting multiple commits
1837 # Since the commit messages were combined when posting multiple commits
1723 # with --fold, the fields can't be read from Phabricator here, or *all*
1838 # with --fold, the fields can't be read from Phabricator here, or *all*
1724 # affected local revisions will end up with the same commit message after
1839 # affected local revisions will end up with the same commit message after
1725 # the URI is amended in. Append in the DREV line, or update it if it
1840 # the URI is amended in. Append in the DREV line, or update it if it
1726 # exists. At worst, this means commit message or test plan updates on
1841 # exists. At worst, this means commit message or test plan updates on
1727 # Phabricator aren't propagated back to the repository, but that seems
1842 # Phabricator aren't propagated back to the repository, but that seems
1728 # reasonable for the case where local commits are effectively combined
1843 # reasonable for the case where local commits are effectively combined
1729 # in Phabricator.
1844 # in Phabricator.
1730 m = _differentialrevisiondescre.search(ctx.description())
1845 m = _differentialrevisiondescre.search(ctx.description())
1731 if not m:
1846 if not m:
1732 return b'\n\n'.join([ctx.description(), uri])
1847 return b'\n\n'.join([ctx.description(), uri])
1733
1848
1734 return _differentialrevisiondescre.sub(uri, ctx.description())
1849 return _differentialrevisiondescre.sub(uri, ctx.description())
1735
1850
1736
1851
1737 def getlocalcommits(diff):
1852 def getlocalcommits(diff):
1738 """get the set of local commits from a diff object
1853 """get the set of local commits from a diff object
1739
1854
1740 See ``getdiffmeta()`` for an example diff object.
1855 See ``getdiffmeta()`` for an example diff object.
1741 """
1856 """
1742 props = diff.get(b'properties') or {}
1857 props = diff.get(b'properties') or {}
1743 commits = props.get(b'local:commits') or {}
1858 commits = props.get(b'local:commits') or {}
1744 if len(commits) > 1:
1859 if len(commits) > 1:
1745 return {bin(c) for c in commits.keys()}
1860 return {bin(c) for c in commits.keys()}
1746
1861
1747 # Storing the diff metadata predates storing `local:commits`, so continue
1862 # Storing the diff metadata predates storing `local:commits`, so continue
1748 # to use that in the --no-fold case.
1863 # to use that in the --no-fold case.
1749 return {bin(getdiffmeta(diff).get(b'node', b'')) or None}
1864 return {bin(getdiffmeta(diff).get(b'node', b'')) or None}
1750
1865
1751
1866
1752 def getdiffmeta(diff):
1867 def getdiffmeta(diff):
1753 """get commit metadata (date, node, user, p1) from a diff object
1868 """get commit metadata (date, node, user, p1) from a diff object
1754
1869
1755 The metadata could be "hg:meta", sent by phabsend, like:
1870 The metadata could be "hg:meta", sent by phabsend, like:
1756
1871
1757 "properties": {
1872 "properties": {
1758 "hg:meta": {
1873 "hg:meta": {
1759 "branch": "default",
1874 "branch": "default",
1760 "date": "1499571514 25200",
1875 "date": "1499571514 25200",
1761 "node": "98c08acae292b2faf60a279b4189beb6cff1414d",
1876 "node": "98c08acae292b2faf60a279b4189beb6cff1414d",
1762 "user": "Foo Bar <foo@example.com>",
1877 "user": "Foo Bar <foo@example.com>",
1763 "parent": "6d0abad76b30e4724a37ab8721d630394070fe16"
1878 "parent": "6d0abad76b30e4724a37ab8721d630394070fe16"
1764 }
1879 }
1765 }
1880 }
1766
1881
1767 Or converted from "local:commits", sent by "arc", like:
1882 Or converted from "local:commits", sent by "arc", like:
1768
1883
1769 "properties": {
1884 "properties": {
1770 "local:commits": {
1885 "local:commits": {
1771 "98c08acae292b2faf60a279b4189beb6cff1414d": {
1886 "98c08acae292b2faf60a279b4189beb6cff1414d": {
1772 "author": "Foo Bar",
1887 "author": "Foo Bar",
1773 "authorEmail": "foo@example.com"
1888 "authorEmail": "foo@example.com"
1774 "branch": "default",
1889 "branch": "default",
1775 "commit": "98c08acae292b2faf60a279b4189beb6cff1414d",
1890 "commit": "98c08acae292b2faf60a279b4189beb6cff1414d",
1776 "local": "1000",
1891 "local": "1000",
1777 "message": "...",
1892 "message": "...",
1778 "parents": ["6d0abad76b30e4724a37ab8721d630394070fe16"],
1893 "parents": ["6d0abad76b30e4724a37ab8721d630394070fe16"],
1779 "rev": "98c08acae292b2faf60a279b4189beb6cff1414d",
1894 "rev": "98c08acae292b2faf60a279b4189beb6cff1414d",
1780 "summary": "...",
1895 "summary": "...",
1781 "tag": "",
1896 "tag": "",
1782 "time": 1499546314,
1897 "time": 1499546314,
1783 }
1898 }
1784 }
1899 }
1785 }
1900 }
1786
1901
1787 Note: metadata extracted from "local:commits" will lose time zone
1902 Note: metadata extracted from "local:commits" will lose time zone
1788 information.
1903 information.
1789 """
1904 """
1790 props = diff.get(b'properties') or {}
1905 props = diff.get(b'properties') or {}
1791 meta = props.get(b'hg:meta')
1906 meta = props.get(b'hg:meta')
1792 if not meta:
1907 if not meta:
1793 if props.get(b'local:commits'):
1908 if props.get(b'local:commits'):
1794 commit = sorted(props[b'local:commits'].values())[0]
1909 commit = sorted(props[b'local:commits'].values())[0]
1795 meta = {}
1910 meta = {}
1796 if b'author' in commit and b'authorEmail' in commit:
1911 if b'author' in commit and b'authorEmail' in commit:
1797 meta[b'user'] = b'%s <%s>' % (
1912 meta[b'user'] = b'%s <%s>' % (
1798 commit[b'author'],
1913 commit[b'author'],
1799 commit[b'authorEmail'],
1914 commit[b'authorEmail'],
1800 )
1915 )
1801 if b'time' in commit:
1916 if b'time' in commit:
1802 meta[b'date'] = b'%d 0' % int(commit[b'time'])
1917 meta[b'date'] = b'%d 0' % int(commit[b'time'])
1803 if b'branch' in commit:
1918 if b'branch' in commit:
1804 meta[b'branch'] = commit[b'branch']
1919 meta[b'branch'] = commit[b'branch']
1805 node = commit.get(b'commit', commit.get(b'rev'))
1920 node = commit.get(b'commit', commit.get(b'rev'))
1806 if node:
1921 if node:
1807 meta[b'node'] = node
1922 meta[b'node'] = node
1808 if len(commit.get(b'parents', ())) >= 1:
1923 if len(commit.get(b'parents', ())) >= 1:
1809 meta[b'parent'] = commit[b'parents'][0]
1924 meta[b'parent'] = commit[b'parents'][0]
1810 else:
1925 else:
1811 meta = {}
1926 meta = {}
1812 if b'date' not in meta and b'dateCreated' in diff:
1927 if b'date' not in meta and b'dateCreated' in diff:
1813 meta[b'date'] = b'%s 0' % diff[b'dateCreated']
1928 meta[b'date'] = b'%s 0' % diff[b'dateCreated']
1814 if b'branch' not in meta and diff.get(b'branch'):
1929 if b'branch' not in meta and diff.get(b'branch'):
1815 meta[b'branch'] = diff[b'branch']
1930 meta[b'branch'] = diff[b'branch']
1816 if b'parent' not in meta and diff.get(b'sourceControlBaseRevision'):
1931 if b'parent' not in meta and diff.get(b'sourceControlBaseRevision'):
1817 meta[b'parent'] = diff[b'sourceControlBaseRevision']
1932 meta[b'parent'] = diff[b'sourceControlBaseRevision']
1818 return meta
1933 return meta
1819
1934
1820
1935
1821 def _getdrevs(ui, stack, specs):
1936 def _getdrevs(ui, stack, specs):
1822 """convert user supplied DREVSPECs into "Differential Revision" dicts
1937 """convert user supplied DREVSPECs into "Differential Revision" dicts
1823
1938
1824 See ``hg help phabread`` for how to specify each DREVSPEC.
1939 See ``hg help phabread`` for how to specify each DREVSPEC.
1825 """
1940 """
1826 if len(specs) > 0:
1941 if len(specs) > 0:
1827
1942
1828 def _formatspec(s):
1943 def _formatspec(s):
1829 if stack:
1944 if stack:
1830 s = b':(%s)' % s
1945 s = b':(%s)' % s
1831 return b'(%s)' % s
1946 return b'(%s)' % s
1832
1947
1833 spec = b'+'.join(pycompat.maplist(_formatspec, specs))
1948 spec = b'+'.join(pycompat.maplist(_formatspec, specs))
1834
1949
1835 drevs = querydrev(ui, spec)
1950 drevs = querydrev(ui, spec)
1836 if drevs:
1951 if drevs:
1837 return drevs
1952 return drevs
1838
1953
1839 raise error.Abort(_(b"empty DREVSPEC set"))
1954 raise error.Abort(_(b"empty DREVSPEC set"))
1840
1955
1841
1956
1842 def readpatch(ui, drevs, write):
1957 def readpatch(ui, drevs, write):
1843 """generate plain-text patch readable by 'hg import'
1958 """generate plain-text patch readable by 'hg import'
1844
1959
1845 write takes a list of (DREV, bytes), where DREV is the differential number
1960 write takes a list of (DREV, bytes), where DREV is the differential number
1846 (as bytes, without the "D" prefix) and the bytes are the text of a patch
1961 (as bytes, without the "D" prefix) and the bytes are the text of a patch
1847 to be imported. drevs is what "querydrev" returns, results of
1962 to be imported. drevs is what "querydrev" returns, results of
1848 "differential.query".
1963 "differential.query".
1849 """
1964 """
1850 # Prefetch hg:meta property for all diffs
1965 # Prefetch hg:meta property for all diffs
1851 diffids = sorted({max(int(v) for v in drev[b'diffs']) for drev in drevs})
1966 diffids = sorted({max(int(v) for v in drev[b'diffs']) for drev in drevs})
1852 diffs = callconduit(ui, b'differential.querydiffs', {b'ids': diffids})
1967 diffs = callconduit(ui, b'differential.querydiffs', {b'ids': diffids})
1853
1968
1854 patches = []
1969 patches = []
1855
1970
1856 # Generate patch for each drev
1971 # Generate patch for each drev
1857 for drev in drevs:
1972 for drev in drevs:
1858 ui.note(_(b'reading D%s\n') % drev[b'id'])
1973 ui.note(_(b'reading D%s\n') % drev[b'id'])
1859
1974
1860 diffid = max(int(v) for v in drev[b'diffs'])
1975 diffid = max(int(v) for v in drev[b'diffs'])
1861 body = callconduit(ui, b'differential.getrawdiff', {b'diffID': diffid})
1976 body = callconduit(ui, b'differential.getrawdiff', {b'diffID': diffid})
1862 desc = getdescfromdrev(drev)
1977 desc = getdescfromdrev(drev)
1863 header = b'# HG changeset patch\n'
1978 header = b'# HG changeset patch\n'
1864
1979
1865 # Try to preserve metadata from hg:meta property. Write hg patch
1980 # Try to preserve metadata from hg:meta property. Write hg patch
1866 # headers that can be read by the "import" command. See patchheadermap
1981 # headers that can be read by the "import" command. See patchheadermap
1867 # and extract in mercurial/patch.py for supported headers.
1982 # and extract in mercurial/patch.py for supported headers.
1868 meta = getdiffmeta(diffs[b'%d' % diffid])
1983 meta = getdiffmeta(diffs[b'%d' % diffid])
1869 for k in _metanamemap.keys():
1984 for k in _metanamemap.keys():
1870 if k in meta:
1985 if k in meta:
1871 header += b'# %s %s\n' % (_metanamemap[k], meta[k])
1986 header += b'# %s %s\n' % (_metanamemap[k], meta[k])
1872
1987
1873 content = b'%s%s\n%s' % (header, desc, body)
1988 content = b'%s%s\n%s' % (header, desc, body)
1874 patches.append((drev[b'id'], content))
1989 patches.append((drev[b'id'], content))
1875
1990
1876 # Write patches to the supplied callback
1991 # Write patches to the supplied callback
1877 write(patches)
1992 write(patches)
1878
1993
1879
1994
1880 @vcrcommand(
1995 @vcrcommand(
1881 b'phabread',
1996 b'phabread',
1882 [(b'', b'stack', False, _(b'read dependencies'))],
1997 [(b'', b'stack', False, _(b'read dependencies'))],
1883 _(b'DREVSPEC... [OPTIONS]'),
1998 _(b'DREVSPEC... [OPTIONS]'),
1884 helpcategory=command.CATEGORY_IMPORT_EXPORT,
1999 helpcategory=command.CATEGORY_IMPORT_EXPORT,
1885 optionalrepo=True,
2000 optionalrepo=True,
1886 )
2001 )
1887 def phabread(ui, repo, *specs, **opts):
2002 def phabread(ui, repo, *specs, **opts):
1888 """print patches from Phabricator suitable for importing
2003 """print patches from Phabricator suitable for importing
1889
2004
1890 DREVSPEC could be a Differential Revision identity, like ``D123``, or just
2005 DREVSPEC could be a Differential Revision identity, like ``D123``, or just
1891 the number ``123``. It could also have common operators like ``+``, ``-``,
2006 the number ``123``. It could also have common operators like ``+``, ``-``,
1892 ``&``, ``(``, ``)`` for complex queries. Prefix ``:`` could be used to
2007 ``&``, ``(``, ``)`` for complex queries. Prefix ``:`` could be used to
1893 select a stack. If multiple DREVSPEC values are given, the result is the
2008 select a stack. If multiple DREVSPEC values are given, the result is the
1894 union of each individually evaluated value. No attempt is currently made
2009 union of each individually evaluated value. No attempt is currently made
1895 to reorder the values to run from parent to child.
2010 to reorder the values to run from parent to child.
1896
2011
1897 ``abandoned``, ``accepted``, ``closed``, ``needsreview``, ``needsrevision``
2012 ``abandoned``, ``accepted``, ``closed``, ``needsreview``, ``needsrevision``
1898 could be used to filter patches by status. For performance reason, they
2013 could be used to filter patches by status. For performance reason, they
1899 only represent a subset of non-status selections and cannot be used alone.
2014 only represent a subset of non-status selections and cannot be used alone.
1900
2015
1901 For example, ``:D6+8-(2+D4)`` selects a stack up to D6, plus D8 and exclude
2016 For example, ``:D6+8-(2+D4)`` selects a stack up to D6, plus D8 and exclude
1902 D2 and D4. ``:D9 & needsreview`` selects "Needs Review" revisions in a
2017 D2 and D4. ``:D9 & needsreview`` selects "Needs Review" revisions in a
1903 stack up to D9.
2018 stack up to D9.
1904
2019
1905 If --stack is given, follow dependencies information and read all patches.
2020 If --stack is given, follow dependencies information and read all patches.
1906 It is equivalent to the ``:`` operator.
2021 It is equivalent to the ``:`` operator.
1907 """
2022 """
1908 opts = pycompat.byteskwargs(opts)
2023 opts = pycompat.byteskwargs(opts)
1909 drevs = _getdrevs(ui, opts.get(b'stack'), specs)
2024 drevs = _getdrevs(ui, opts.get(b'stack'), specs)
1910
2025
1911 def _write(patches):
2026 def _write(patches):
1912 for drev, content in patches:
2027 for drev, content in patches:
1913 ui.write(content)
2028 ui.write(content)
1914
2029
1915 readpatch(ui, drevs, _write)
2030 readpatch(ui, drevs, _write)
1916
2031
1917
2032
1918 @vcrcommand(
2033 @vcrcommand(
1919 b'phabimport',
2034 b'phabimport',
1920 [(b'', b'stack', False, _(b'import dependencies as well'))],
2035 [(b'', b'stack', False, _(b'import dependencies as well'))],
1921 _(b'DREVSPEC... [OPTIONS]'),
2036 _(b'DREVSPEC... [OPTIONS]'),
1922 helpcategory=command.CATEGORY_IMPORT_EXPORT,
2037 helpcategory=command.CATEGORY_IMPORT_EXPORT,
1923 )
2038 )
1924 def phabimport(ui, repo, *specs, **opts):
2039 def phabimport(ui, repo, *specs, **opts):
1925 """import patches from Phabricator for the specified Differential Revisions
2040 """import patches from Phabricator for the specified Differential Revisions
1926
2041
1927 The patches are read and applied starting at the parent of the working
2042 The patches are read and applied starting at the parent of the working
1928 directory.
2043 directory.
1929
2044
1930 See ``hg help phabread`` for how to specify DREVSPEC.
2045 See ``hg help phabread`` for how to specify DREVSPEC.
1931 """
2046 """
1932 opts = pycompat.byteskwargs(opts)
2047 opts = pycompat.byteskwargs(opts)
1933
2048
1934 # --bypass avoids losing exec and symlink bits when importing on Windows,
2049 # --bypass avoids losing exec and symlink bits when importing on Windows,
1935 # and allows importing with a dirty wdir. It also aborts instead of leaving
2050 # and allows importing with a dirty wdir. It also aborts instead of leaving
1936 # rejects.
2051 # rejects.
1937 opts[b'bypass'] = True
2052 opts[b'bypass'] = True
1938
2053
1939 # Mandatory default values, synced with commands.import
2054 # Mandatory default values, synced with commands.import
1940 opts[b'strip'] = 1
2055 opts[b'strip'] = 1
1941 opts[b'prefix'] = b''
2056 opts[b'prefix'] = b''
1942 # Evolve 9.3.0 assumes this key is present in cmdutil.tryimportone()
2057 # Evolve 9.3.0 assumes this key is present in cmdutil.tryimportone()
1943 opts[b'obsolete'] = False
2058 opts[b'obsolete'] = False
1944
2059
1945 if ui.configbool(b'phabimport', b'secret'):
2060 if ui.configbool(b'phabimport', b'secret'):
1946 opts[b'secret'] = True
2061 opts[b'secret'] = True
1947 if ui.configbool(b'phabimport', b'obsolete'):
2062 if ui.configbool(b'phabimport', b'obsolete'):
1948 opts[b'obsolete'] = True # Handled by evolve wrapping tryimportone()
2063 opts[b'obsolete'] = True # Handled by evolve wrapping tryimportone()
1949
2064
1950 def _write(patches):
2065 def _write(patches):
1951 parents = repo[None].parents()
2066 parents = repo[None].parents()
1952
2067
1953 with repo.wlock(), repo.lock(), repo.transaction(b'phabimport'):
2068 with repo.wlock(), repo.lock(), repo.transaction(b'phabimport'):
1954 for drev, contents in patches:
2069 for drev, contents in patches:
1955 ui.status(_(b'applying patch from D%s\n') % drev)
2070 ui.status(_(b'applying patch from D%s\n') % drev)
1956
2071
1957 with patch.extract(ui, pycompat.bytesio(contents)) as patchdata:
2072 with patch.extract(ui, pycompat.bytesio(contents)) as patchdata:
1958 msg, node, rej = cmdutil.tryimportone(
2073 msg, node, rej = cmdutil.tryimportone(
1959 ui,
2074 ui,
1960 repo,
2075 repo,
1961 patchdata,
2076 patchdata,
1962 parents,
2077 parents,
1963 opts,
2078 opts,
1964 [],
2079 [],
1965 None, # Never update wdir to another revision
2080 None, # Never update wdir to another revision
1966 )
2081 )
1967
2082
1968 if not node:
2083 if not node:
1969 raise error.Abort(_(b'D%s: no diffs found') % drev)
2084 raise error.Abort(_(b'D%s: no diffs found') % drev)
1970
2085
1971 ui.note(msg + b'\n')
2086 ui.note(msg + b'\n')
1972 parents = [repo[node]]
2087 parents = [repo[node]]
1973
2088
1974 drevs = _getdrevs(ui, opts.get(b'stack'), specs)
2089 drevs = _getdrevs(ui, opts.get(b'stack'), specs)
1975
2090
1976 readpatch(repo.ui, drevs, _write)
2091 readpatch(repo.ui, drevs, _write)
1977
2092
1978
2093
1979 @vcrcommand(
2094 @vcrcommand(
1980 b'phabupdate',
2095 b'phabupdate',
1981 [
2096 [
1982 (b'', b'accept', False, _(b'accept revisions')),
2097 (b'', b'accept', False, _(b'accept revisions')),
1983 (b'', b'reject', False, _(b'reject revisions')),
2098 (b'', b'reject', False, _(b'reject revisions')),
1984 (b'', b'abandon', False, _(b'abandon revisions')),
2099 (b'', b'abandon', False, _(b'abandon revisions')),
1985 (b'', b'reclaim', False, _(b'reclaim revisions')),
2100 (b'', b'reclaim', False, _(b'reclaim revisions')),
1986 (b'm', b'comment', b'', _(b'comment on the last revision')),
2101 (b'm', b'comment', b'', _(b'comment on the last revision')),
1987 ],
2102 ],
1988 _(b'DREVSPEC... [OPTIONS]'),
2103 _(b'DREVSPEC... [OPTIONS]'),
1989 helpcategory=command.CATEGORY_IMPORT_EXPORT,
2104 helpcategory=command.CATEGORY_IMPORT_EXPORT,
1990 optionalrepo=True,
2105 optionalrepo=True,
1991 )
2106 )
1992 def phabupdate(ui, repo, *specs, **opts):
2107 def phabupdate(ui, repo, *specs, **opts):
1993 """update Differential Revision in batch
2108 """update Differential Revision in batch
1994
2109
1995 DREVSPEC selects revisions. See :hg:`help phabread` for its usage.
2110 DREVSPEC selects revisions. See :hg:`help phabread` for its usage.
1996 """
2111 """
1997 opts = pycompat.byteskwargs(opts)
2112 opts = pycompat.byteskwargs(opts)
1998 flags = [n for n in b'accept reject abandon reclaim'.split() if opts.get(n)]
2113 flags = [n for n in b'accept reject abandon reclaim'.split() if opts.get(n)]
1999 if len(flags) > 1:
2114 if len(flags) > 1:
2000 raise error.Abort(_(b'%s cannot be used together') % b', '.join(flags))
2115 raise error.Abort(_(b'%s cannot be used together') % b', '.join(flags))
2001
2116
2002 actions = []
2117 actions = []
2003 for f in flags:
2118 for f in flags:
2004 actions.append({b'type': f, b'value': True})
2119 actions.append({b'type': f, b'value': True})
2005
2120
2006 drevs = _getdrevs(ui, opts.get(b'stack'), specs)
2121 drevs = _getdrevs(ui, opts.get(b'stack'), specs)
2007 for i, drev in enumerate(drevs):
2122 for i, drev in enumerate(drevs):
2008 if i + 1 == len(drevs) and opts.get(b'comment'):
2123 if i + 1 == len(drevs) and opts.get(b'comment'):
2009 actions.append({b'type': b'comment', b'value': opts[b'comment']})
2124 actions.append({b'type': b'comment', b'value': opts[b'comment']})
2010 if actions:
2125 if actions:
2011 params = {
2126 params = {
2012 b'objectIdentifier': drev[b'phid'],
2127 b'objectIdentifier': drev[b'phid'],
2013 b'transactions': actions,
2128 b'transactions': actions,
2014 }
2129 }
2015 callconduit(ui, b'differential.revision.edit', params)
2130 callconduit(ui, b'differential.revision.edit', params)
2016
2131
2017
2132
2018 @eh.templatekeyword(b'phabreview', requires={b'ctx'})
2133 @eh.templatekeyword(b'phabreview', requires={b'ctx'})
2019 def template_review(context, mapping):
2134 def template_review(context, mapping):
2020 """:phabreview: Object describing the review for this changeset.
2135 """:phabreview: Object describing the review for this changeset.
2021 Has attributes `url` and `id`.
2136 Has attributes `url` and `id`.
2022 """
2137 """
2023 ctx = context.resource(mapping, b'ctx')
2138 ctx = context.resource(mapping, b'ctx')
2024 m = _differentialrevisiondescre.search(ctx.description())
2139 m = _differentialrevisiondescre.search(ctx.description())
2025 if m:
2140 if m:
2026 return templateutil.hybriddict(
2141 return templateutil.hybriddict(
2027 {b'url': m.group('url'), b'id': b"D%s" % m.group('id'),}
2142 {b'url': m.group('url'), b'id': b"D%s" % m.group('id'),}
2028 )
2143 )
2029 else:
2144 else:
2030 tags = ctx.repo().nodetags(ctx.node())
2145 tags = ctx.repo().nodetags(ctx.node())
2031 for t in tags:
2146 for t in tags:
2032 if _differentialrevisiontagre.match(t):
2147 if _differentialrevisiontagre.match(t):
2033 url = ctx.repo().ui.config(b'phabricator', b'url')
2148 url = ctx.repo().ui.config(b'phabricator', b'url')
2034 if not url.endswith(b'/'):
2149 if not url.endswith(b'/'):
2035 url += b'/'
2150 url += b'/'
2036 url += t
2151 url += t
2037
2152
2038 return templateutil.hybriddict({b'url': url, b'id': t,})
2153 return templateutil.hybriddict({b'url': url, b'id': t,})
2039 return None
2154 return None
2040
2155
2041
2156
2042 @eh.templatekeyword(b'phabstatus', requires={b'ctx', b'repo', b'ui'})
2157 @eh.templatekeyword(b'phabstatus', requires={b'ctx', b'repo', b'ui'})
2043 def template_status(context, mapping):
2158 def template_status(context, mapping):
2044 """:phabstatus: String. Status of Phabricator differential.
2159 """:phabstatus: String. Status of Phabricator differential.
2045 """
2160 """
2046 ctx = context.resource(mapping, b'ctx')
2161 ctx = context.resource(mapping, b'ctx')
2047 repo = context.resource(mapping, b'repo')
2162 repo = context.resource(mapping, b'repo')
2048 ui = context.resource(mapping, b'ui')
2163 ui = context.resource(mapping, b'ui')
2049
2164
2050 rev = ctx.rev()
2165 rev = ctx.rev()
2051 try:
2166 try:
2052 drevid = getdrevmap(repo, [rev])[rev]
2167 drevid = getdrevmap(repo, [rev])[rev]
2053 except KeyError:
2168 except KeyError:
2054 return None
2169 return None
2055 drevs = callconduit(ui, b'differential.query', {b'ids': [drevid]})
2170 drevs = callconduit(ui, b'differential.query', {b'ids': [drevid]})
2056 for drev in drevs:
2171 for drev in drevs:
2057 if int(drev[b'id']) == drevid:
2172 if int(drev[b'id']) == drevid:
2058 return templateutil.hybriddict(
2173 return templateutil.hybriddict(
2059 {b'url': drev[b'uri'], b'status': drev[b'statusName'],}
2174 {b'url': drev[b'uri'], b'status': drev[b'statusName'],}
2060 )
2175 )
2061 return None
2176 return None
2062
2177
2063
2178
2064 @show.showview(b'phabstatus', csettopic=b'work')
2179 @show.showview(b'phabstatus', csettopic=b'work')
2065 def phabstatusshowview(ui, repo, displayer):
2180 def phabstatusshowview(ui, repo, displayer):
2066 """Phabricator differiential status"""
2181 """Phabricator differiential status"""
2067 revs = repo.revs('sort(_underway(), topo)')
2182 revs = repo.revs('sort(_underway(), topo)')
2068 drevmap = getdrevmap(repo, revs)
2183 drevmap = getdrevmap(repo, revs)
2069 unknownrevs, drevids, revsbydrevid = [], set(), {}
2184 unknownrevs, drevids, revsbydrevid = [], set(), {}
2070 for rev, drevid in pycompat.iteritems(drevmap):
2185 for rev, drevid in pycompat.iteritems(drevmap):
2071 if drevid is not None:
2186 if drevid is not None:
2072 drevids.add(drevid)
2187 drevids.add(drevid)
2073 revsbydrevid.setdefault(drevid, set()).add(rev)
2188 revsbydrevid.setdefault(drevid, set()).add(rev)
2074 else:
2189 else:
2075 unknownrevs.append(rev)
2190 unknownrevs.append(rev)
2076
2191
2077 drevs = callconduit(ui, b'differential.query', {b'ids': list(drevids)})
2192 drevs = callconduit(ui, b'differential.query', {b'ids': list(drevids)})
2078 drevsbyrev = {}
2193 drevsbyrev = {}
2079 for drev in drevs:
2194 for drev in drevs:
2080 for rev in revsbydrevid[int(drev[b'id'])]:
2195 for rev in revsbydrevid[int(drev[b'id'])]:
2081 drevsbyrev[rev] = drev
2196 drevsbyrev[rev] = drev
2082
2197
2083 def phabstatus(ctx):
2198 def phabstatus(ctx):
2084 drev = drevsbyrev[ctx.rev()]
2199 drev = drevsbyrev[ctx.rev()]
2085 status = ui.label(
2200 status = ui.label(
2086 b'%(statusName)s' % drev,
2201 b'%(statusName)s' % drev,
2087 b'phabricator.status.%s' % _getstatusname(drev),
2202 b'phabricator.status.%s' % _getstatusname(drev),
2088 )
2203 )
2089 ui.write(b"\n%s %s\n" % (drev[b'uri'], status))
2204 ui.write(b"\n%s %s\n" % (drev[b'uri'], status))
2090
2205
2091 revs -= smartset.baseset(unknownrevs)
2206 revs -= smartset.baseset(unknownrevs)
2092 revdag = graphmod.dagwalker(repo, revs)
2207 revdag = graphmod.dagwalker(repo, revs)
2093
2208
2094 ui.setconfig(b'experimental', b'graphshorten', True)
2209 ui.setconfig(b'experimental', b'graphshorten', True)
2095 displayer._exthook = phabstatus
2210 displayer._exthook = phabstatus
2096 nodelen = show.longestshortest(repo, revs)
2211 nodelen = show.longestshortest(repo, revs)
2097 logcmdutil.displaygraph(
2212 logcmdutil.displaygraph(
2098 ui,
2213 ui,
2099 repo,
2214 repo,
2100 revdag,
2215 revdag,
2101 displayer,
2216 displayer,
2102 graphmod.asciiedges,
2217 graphmod.asciiedges,
2103 props={b'nodelen': nodelen},
2218 props={b'nodelen': nodelen},
2104 )
2219 )
@@ -1,419 +1,788 b''
1 #require vcr
1 #require vcr
2 $ cat >> $HGRCPATH <<EOF
2 $ cat >> $HGRCPATH <<EOF
3 > [extensions]
3 > [extensions]
4 > phabricator =
4 > phabricator =
5 >
5 >
6 > [auth]
6 > [auth]
7 > hgphab.schemes = https
7 > hgphab.schemes = https
8 > hgphab.prefix = phab.mercurial-scm.org
8 > hgphab.prefix = phab.mercurial-scm.org
9 > # When working on the extension and making phabricator interaction
9 > # When working on the extension and making phabricator interaction
10 > # changes, edit this to be a real phabricator token. When done, edit
10 > # changes, edit this to be a real phabricator token. When done, edit
11 > # it back. The VCR transcripts will be auto-sanitised to replace your real
11 > # it back. The VCR transcripts will be auto-sanitised to replace your real
12 > # token with this value.
12 > # token with this value.
13 > hgphab.phabtoken = cli-hahayouwish
13 > hgphab.phabtoken = cli-hahayouwish
14 >
14 >
15 > [phabricator]
15 > [phabricator]
16 > debug = True
16 > debug = True
17 > EOF
17 > EOF
18 $ hg init repo
18 $ hg init repo
19 $ cd repo
19 $ cd repo
20 $ cat >> .hg/hgrc <<EOF
20 $ cat >> .hg/hgrc <<EOF
21 > [phabricator]
21 > [phabricator]
22 > url = https://phab.mercurial-scm.org/
22 > url = https://phab.mercurial-scm.org/
23 > callsign = HG
23 > callsign = HG
24 > EOF
24 > EOF
25 $ VCR="$TESTDIR/phabricator"
25 $ VCR="$TESTDIR/phabricator"
26
26
27 Error is handled reasonably. We override the phabtoken here so that
27 Error is handled reasonably. We override the phabtoken here so that
28 when you're developing changes to phabricator.py you can edit the
28 when you're developing changes to phabricator.py you can edit the
29 above config and have a real token in the test but not have to edit
29 above config and have a real token in the test but not have to edit
30 this test.
30 this test.
31 $ hg phabread --config auth.hgphab.phabtoken=cli-notavalidtoken \
31 $ hg phabread --config auth.hgphab.phabtoken=cli-notavalidtoken \
32 > --test-vcr "$VCR/phabread-conduit-error.json" D4480 | head
32 > --test-vcr "$VCR/phabread-conduit-error.json" D4480 | head
33 abort: Conduit Error (ERR-INVALID-AUTH): API token "cli-notavalidtoken" has the wrong length. API tokens should be 32 characters long.
33 abort: Conduit Error (ERR-INVALID-AUTH): API token "cli-notavalidtoken" has the wrong length. API tokens should be 32 characters long.
34
34
35 Missing arguments don't crash, and may print the command help
35 Missing arguments don't crash, and may print the command help
36
36
37 $ hg debugcallconduit
37 $ hg debugcallconduit
38 hg debugcallconduit: invalid arguments
38 hg debugcallconduit: invalid arguments
39 hg debugcallconduit METHOD
39 hg debugcallconduit METHOD
40
40
41 call Conduit API
41 call Conduit API
42
42
43 options:
43 options:
44
44
45 (use 'hg debugcallconduit -h' to show more help)
45 (use 'hg debugcallconduit -h' to show more help)
46 [255]
46 [255]
47 $ hg phabread
47 $ hg phabread
48 abort: empty DREVSPEC set
48 abort: empty DREVSPEC set
49 [255]
49 [255]
50
50
51 Basic phabread:
51 Basic phabread:
52 $ hg phabread --test-vcr "$VCR/phabread-4480.json" D4480 | head
52 $ hg phabread --test-vcr "$VCR/phabread-4480.json" D4480 | head
53 # HG changeset patch
53 # HG changeset patch
54 # Date 1536771503 0
54 # Date 1536771503 0
55 # Parent a5de21c9e3703f8e8eb064bd7d893ff2f703c66a
55 # Parent a5de21c9e3703f8e8eb064bd7d893ff2f703c66a
56 exchangev2: start to implement pull with wire protocol v2
56 exchangev2: start to implement pull with wire protocol v2
57
57
58 Wire protocol version 2 will take a substantially different
58 Wire protocol version 2 will take a substantially different
59 approach to exchange than version 1 (at least as far as pulling
59 approach to exchange than version 1 (at least as far as pulling
60 is concerned).
60 is concerned).
61
61
62 This commit establishes a new exchangev2 module for holding
62 This commit establishes a new exchangev2 module for holding
63
63
64 Phabread with multiple DREVSPEC
64 Phabread with multiple DREVSPEC
65
65
66 TODO: attempt to order related revisions like --stack?
66 TODO: attempt to order related revisions like --stack?
67 $ hg phabread --test-vcr "$VCR/phabread-multi-drev.json" D8205 8206 D8207 \
67 $ hg phabread --test-vcr "$VCR/phabread-multi-drev.json" D8205 8206 D8207 \
68 > | grep '^Differential Revision'
68 > | grep '^Differential Revision'
69 Differential Revision: https://phab.mercurial-scm.org/D8205
69 Differential Revision: https://phab.mercurial-scm.org/D8205
70 Differential Revision: https://phab.mercurial-scm.org/D8206
70 Differential Revision: https://phab.mercurial-scm.org/D8206
71 Differential Revision: https://phab.mercurial-scm.org/D8207
71 Differential Revision: https://phab.mercurial-scm.org/D8207
72
72
73 Empty DREVSPECs don't crash
73 Empty DREVSPECs don't crash
74
74
75 $ hg phabread --test-vcr "$VCR/phabread-empty-drev.json" D7917-D7917
75 $ hg phabread --test-vcr "$VCR/phabread-empty-drev.json" D7917-D7917
76 abort: empty DREVSPEC set
76 abort: empty DREVSPEC set
77 [255]
77 [255]
78
78
79
79
80 phabupdate with an accept:
80 phabupdate with an accept:
81 $ hg phabupdate --accept D4564 \
81 $ hg phabupdate --accept D4564 \
82 > -m 'I think I like where this is headed. Will read rest of series later.'\
82 > -m 'I think I like where this is headed. Will read rest of series later.'\
83 > --test-vcr "$VCR/accept-4564.json"
83 > --test-vcr "$VCR/accept-4564.json"
84 abort: Conduit Error (ERR-CONDUIT-CORE): Validation errors:
84 abort: Conduit Error (ERR-CONDUIT-CORE): Validation errors:
85 - You can not accept this revision because it has already been closed. Only open revisions can be accepted.
85 - You can not accept this revision because it has already been closed. Only open revisions can be accepted.
86 [255]
86 [255]
87 $ hg phabupdate --accept D7913 -m 'LGTM' --test-vcr "$VCR/accept-7913.json"
87 $ hg phabupdate --accept D7913 -m 'LGTM' --test-vcr "$VCR/accept-7913.json"
88
88
89 Create a differential diff:
89 Create a differential diff:
90 $ HGENCODING=utf-8; export HGENCODING
90 $ HGENCODING=utf-8; export HGENCODING
91 $ echo alpha > alpha
91 $ echo alpha > alpha
92 $ hg ci --addremove -m 'create alpha for phabricator test €'
92 $ hg ci --addremove -m 'create alpha for phabricator test €'
93 adding alpha
93 adding alpha
94 $ hg phabsend -r . --test-vcr "$VCR/phabsend-create-alpha.json"
94 $ hg phabsend -r . --test-vcr "$VCR/phabsend-create-alpha.json"
95 D7915 - created - d386117f30e6: create alpha for phabricator test \xe2\x82\xac (esc)
95 D7915 - created - d386117f30e6: create alpha for phabricator test \xe2\x82\xac (esc)
96 new commits: ['347bf67801e5']
96 new commits: ['347bf67801e5']
97 saved backup bundle to $TESTTMP/repo/.hg/strip-backup/d386117f30e6-24ffe649-phabsend.hg
97 saved backup bundle to $TESTTMP/repo/.hg/strip-backup/d386117f30e6-24ffe649-phabsend.hg
98 $ echo more >> alpha
98 $ echo more >> alpha
99 $ HGEDITOR=true hg ci --amend
99 $ HGEDITOR=true hg ci --amend
100 saved backup bundle to $TESTTMP/repo/.hg/strip-backup/347bf67801e5-3bf313e4-amend.hg
100 saved backup bundle to $TESTTMP/repo/.hg/strip-backup/347bf67801e5-3bf313e4-amend.hg
101 $ echo beta > beta
101 $ echo beta > beta
102 $ hg ci --addremove -m 'create beta for phabricator test'
102 $ hg ci --addremove -m 'create beta for phabricator test'
103 adding beta
103 adding beta
104 $ hg phabsend -r ".^::" --test-vcr "$VCR/phabsend-update-alpha-create-beta.json"
104 $ hg phabsend -r ".^::" --test-vcr "$VCR/phabsend-update-alpha-create-beta.json"
105 c44b38f24a45 mapped to old nodes []
105 c44b38f24a45 mapped to old nodes []
106 D7915 - updated - c44b38f24a45: create alpha for phabricator test \xe2\x82\xac (esc)
106 D7915 - updated - c44b38f24a45: create alpha for phabricator test \xe2\x82\xac (esc)
107 D7916 - created - 9e6901f21d5b: create beta for phabricator test
107 D7916 - created - 9e6901f21d5b: create beta for phabricator test
108 new commits: ['a692622e6937']
108 new commits: ['a692622e6937']
109 saved backup bundle to $TESTTMP/repo/.hg/strip-backup/9e6901f21d5b-1fcd4f0e-phabsend.hg
109 saved backup bundle to $TESTTMP/repo/.hg/strip-backup/9e6901f21d5b-1fcd4f0e-phabsend.hg
110 $ unset HGENCODING
110 $ unset HGENCODING
111
111
112 The amend won't explode after posting a public commit. The local tag is left
112 The amend won't explode after posting a public commit. The local tag is left
113 behind to identify it.
113 behind to identify it.
114
114
115 $ echo 'public change' > beta
115 $ echo 'public change' > beta
116 $ hg ci -m 'create public change for phabricator testing'
116 $ hg ci -m 'create public change for phabricator testing'
117 $ hg phase --public .
117 $ hg phase --public .
118 $ echo 'draft change' > alpha
118 $ echo 'draft change' > alpha
119 $ hg ci -m 'create draft change for phabricator testing'
119 $ hg ci -m 'create draft change for phabricator testing'
120 $ hg phabsend --amend -r '.^::' --test-vcr "$VCR/phabsend-create-public.json"
120 $ hg phabsend --amend -r '.^::' --test-vcr "$VCR/phabsend-create-public.json"
121 D7917 - created - 7b4185ab5d16: create public change for phabricator testing
121 D7917 - created - 7b4185ab5d16: create public change for phabricator testing
122 D7918 - created - 251c1c333fc6: create draft change for phabricator testing
122 D7918 - created - 251c1c333fc6: create draft change for phabricator testing
123 warning: not updating public commit 2:7b4185ab5d16
123 warning: not updating public commit 2:7b4185ab5d16
124 new commits: ['3244dc4a3334']
124 new commits: ['3244dc4a3334']
125 saved backup bundle to $TESTTMP/repo/.hg/strip-backup/251c1c333fc6-41cb7c3b-phabsend.hg
125 saved backup bundle to $TESTTMP/repo/.hg/strip-backup/251c1c333fc6-41cb7c3b-phabsend.hg
126 $ hg tags -v
126 $ hg tags -v
127 tip 3:3244dc4a3334
127 tip 3:3244dc4a3334
128 D7917 2:7b4185ab5d16 local
128 D7917 2:7b4185ab5d16 local
129
129
130 $ hg debugcallconduit user.search --test-vcr "$VCR/phab-conduit.json" <<EOF
130 $ hg debugcallconduit user.search --test-vcr "$VCR/phab-conduit.json" <<EOF
131 > {
131 > {
132 > "constraints": {
132 > "constraints": {
133 > "isBot": true
133 > "isBot": true
134 > }
134 > }
135 > }
135 > }
136 > EOF
136 > EOF
137 {
137 {
138 "cursor": {
138 "cursor": {
139 "after": null,
139 "after": null,
140 "before": null,
140 "before": null,
141 "limit": 100,
141 "limit": 100,
142 "order": null
142 "order": null
143 },
143 },
144 "data": [],
144 "data": [],
145 "maps": {},
145 "maps": {},
146 "query": {
146 "query": {
147 "queryKey": null
147 "queryKey": null
148 }
148 }
149 }
149 }
150
150
151 Template keywords
151 Template keywords
152 $ hg log -T'{rev} {phabreview|json}\n'
152 $ hg log -T'{rev} {phabreview|json}\n'
153 3 {"id": "D7918", "url": "https://phab.mercurial-scm.org/D7918"}
153 3 {"id": "D7918", "url": "https://phab.mercurial-scm.org/D7918"}
154 2 {"id": "D7917", "url": "https://phab.mercurial-scm.org/D7917"}
154 2 {"id": "D7917", "url": "https://phab.mercurial-scm.org/D7917"}
155 1 {"id": "D7916", "url": "https://phab.mercurial-scm.org/D7916"}
155 1 {"id": "D7916", "url": "https://phab.mercurial-scm.org/D7916"}
156 0 {"id": "D7915", "url": "https://phab.mercurial-scm.org/D7915"}
156 0 {"id": "D7915", "url": "https://phab.mercurial-scm.org/D7915"}
157
157
158 $ hg log -T'{rev} {if(phabreview, "{phabreview.url} {phabreview.id}")}\n'
158 $ hg log -T'{rev} {if(phabreview, "{phabreview.url} {phabreview.id}")}\n'
159 3 https://phab.mercurial-scm.org/D7918 D7918
159 3 https://phab.mercurial-scm.org/D7918 D7918
160 2 https://phab.mercurial-scm.org/D7917 D7917
160 2 https://phab.mercurial-scm.org/D7917 D7917
161 1 https://phab.mercurial-scm.org/D7916 D7916
161 1 https://phab.mercurial-scm.org/D7916 D7916
162 0 https://phab.mercurial-scm.org/D7915 D7915
162 0 https://phab.mercurial-scm.org/D7915 D7915
163
163
164 Commenting when phabsending:
164 Commenting when phabsending:
165 $ echo comment > comment
165 $ echo comment > comment
166 $ hg ci --addremove -m "create comment for phabricator test"
166 $ hg ci --addremove -m "create comment for phabricator test"
167 adding comment
167 adding comment
168 $ hg phabsend -r . -m "For default branch" --test-vcr "$VCR/phabsend-comment-created.json"
168 $ hg phabsend -r . -m "For default branch" --test-vcr "$VCR/phabsend-comment-created.json"
169 D7919 - created - d5dddca9023d: create comment for phabricator test
169 D7919 - created - d5dddca9023d: create comment for phabricator test
170 new commits: ['f7db812bbe1d']
170 new commits: ['f7db812bbe1d']
171 saved backup bundle to $TESTTMP/repo/.hg/strip-backup/d5dddca9023d-adf673ba-phabsend.hg
171 saved backup bundle to $TESTTMP/repo/.hg/strip-backup/d5dddca9023d-adf673ba-phabsend.hg
172 $ echo comment2 >> comment
172 $ echo comment2 >> comment
173 $ hg ci --amend
173 $ hg ci --amend
174 saved backup bundle to $TESTTMP/repo/.hg/strip-backup/f7db812bbe1d-8fcded77-amend.hg
174 saved backup bundle to $TESTTMP/repo/.hg/strip-backup/f7db812bbe1d-8fcded77-amend.hg
175 $ hg phabsend -r . -m "Address review comments" --test-vcr "$VCR/phabsend-comment-updated.json"
175 $ hg phabsend -r . -m "Address review comments" --test-vcr "$VCR/phabsend-comment-updated.json"
176 1849d7828727 mapped to old nodes []
176 1849d7828727 mapped to old nodes []
177 D7919 - updated - 1849d7828727: create comment for phabricator test
177 D7919 - updated - 1849d7828727: create comment for phabricator test
178
178
179 Phabsending a skipped commit:
179 Phabsending a skipped commit:
180 $ hg phabsend --no-amend -r . --test-vcr "$VCR/phabsend-skipped.json"
180 $ hg phabsend --no-amend -r . --test-vcr "$VCR/phabsend-skipped.json"
181 1849d7828727 mapped to old nodes ['1849d7828727']
181 1849d7828727 mapped to old nodes ['1849d7828727']
182 D7919 - skipped - 1849d7828727: create comment for phabricator test
182 D7919 - skipped - 1849d7828727: create comment for phabricator test
183
183
184 Phabesending a new binary, a modified binary, and a removed binary
184 Phabesending a new binary, a modified binary, and a removed binary
185
185
186 >>> open('bin', 'wb').write(b'\0a') and None
186 >>> open('bin', 'wb').write(b'\0a') and None
187 $ hg ci -Am 'add binary'
187 $ hg ci -Am 'add binary'
188 adding bin
188 adding bin
189 >>> open('bin', 'wb').write(b'\0b') and None
189 >>> open('bin', 'wb').write(b'\0b') and None
190 $ hg ci -m 'modify binary'
190 $ hg ci -m 'modify binary'
191 $ hg rm bin
191 $ hg rm bin
192 $ hg ci -m 'remove binary'
192 $ hg ci -m 'remove binary'
193 $ hg phabsend -r .~2:: --test-vcr "$VCR/phabsend-binary.json"
193 $ hg phabsend -r .~2:: --test-vcr "$VCR/phabsend-binary.json"
194 uploading bin@aa24a81f55de
194 uploading bin@aa24a81f55de
195 D8007 - created - aa24a81f55de: add binary
195 D8007 - created - aa24a81f55de: add binary
196 uploading bin@d8d62a881b54
196 uploading bin@d8d62a881b54
197 D8008 - created - d8d62a881b54: modify binary
197 D8008 - created - d8d62a881b54: modify binary
198 D8009 - created - af55645b2e29: remove binary
198 D8009 - created - af55645b2e29: remove binary
199 new commits: ['b8139fbb4a57']
199 new commits: ['b8139fbb4a57']
200 new commits: ['c88ce4c2d2ad']
200 new commits: ['c88ce4c2d2ad']
201 new commits: ['75dbbc901145']
201 new commits: ['75dbbc901145']
202 saved backup bundle to $TESTTMP/repo/.hg/strip-backup/aa24a81f55de-a3a0cf24-phabsend.hg
202 saved backup bundle to $TESTTMP/repo/.hg/strip-backup/aa24a81f55de-a3a0cf24-phabsend.hg
203
203
204 Phabsend a renamed binary and a copied binary, with and without content changes
204 Phabsend a renamed binary and a copied binary, with and without content changes
205 to src and dest
205 to src and dest
206
206
207 >>> open('bin2', 'wb').write(b'\0c') and None
207 >>> open('bin2', 'wb').write(b'\0c') and None
208 $ hg ci -Am 'add another binary'
208 $ hg ci -Am 'add another binary'
209 adding bin2
209 adding bin2
210
210
211 TODO: "bin2" can't be viewed in this commit (left or right side), and the URL
211 TODO: "bin2" can't be viewed in this commit (left or right side), and the URL
212 looks much different than when viewing "bin2_moved". No idea if this is a phab
212 looks much different than when viewing "bin2_moved". No idea if this is a phab
213 bug, or phabsend bug. The patch (as printed by phabread) look reasonable
213 bug, or phabsend bug. The patch (as printed by phabread) look reasonable
214 though.
214 though.
215
215
216 $ hg mv bin2 bin2_moved
216 $ hg mv bin2 bin2_moved
217 $ hg ci -m "moved binary"
217 $ hg ci -m "moved binary"
218
218
219 Note: "bin2_moved" is also not viewable in phabricator with this review
219 Note: "bin2_moved" is also not viewable in phabricator with this review
220
220
221 $ hg cp bin2_moved bin2_copied
221 $ hg cp bin2_moved bin2_copied
222 $ hg ci -m "copied binary"
222 $ hg ci -m "copied binary"
223
223
224 Note: "bin2_moved_again" is marked binary in phabricator, and both sides of it
224 Note: "bin2_moved_again" is marked binary in phabricator, and both sides of it
225 are viewable in their proper state. "bin2_copied" is not viewable, and not
225 are viewable in their proper state. "bin2_copied" is not viewable, and not
226 listed as binary in phabricator.
226 listed as binary in phabricator.
227
227
228 >>> open('bin2_copied', 'wb').write(b'\0move+mod') and None
228 >>> open('bin2_copied', 'wb').write(b'\0move+mod') and None
229 $ hg mv bin2_copied bin2_moved_again
229 $ hg mv bin2_copied bin2_moved_again
230 $ hg ci -m "move+mod copied binary"
230 $ hg ci -m "move+mod copied binary"
231
231
232 Note: "bin2_moved" and "bin2_moved_copy" are both marked binary, and both
232 Note: "bin2_moved" and "bin2_moved_copy" are both marked binary, and both
233 viewable on each side.
233 viewable on each side.
234
234
235 >>> open('bin2_moved', 'wb').write(b'\0precopy mod') and None
235 >>> open('bin2_moved', 'wb').write(b'\0precopy mod') and None
236 $ hg cp bin2_moved bin2_moved_copied
236 $ hg cp bin2_moved bin2_moved_copied
237 >>> open('bin2_moved', 'wb').write(b'\0copy src+mod') and None
237 >>> open('bin2_moved', 'wb').write(b'\0copy src+mod') and None
238 $ hg ci -m "copy+mod moved binary"
238 $ hg ci -m "copy+mod moved binary"
239
239
240 $ hg phabsend -r .~4:: --test-vcr "$VCR/phabsend-binary-renames.json"
240 $ hg phabsend -r .~4:: --test-vcr "$VCR/phabsend-binary-renames.json"
241 uploading bin2@f42f9195e00c
241 uploading bin2@f42f9195e00c
242 D8128 - created - f42f9195e00c: add another binary
242 D8128 - created - f42f9195e00c: add another binary
243 D8129 - created - 834ab31d80ae: moved binary
243 D8129 - created - 834ab31d80ae: moved binary
244 D8130 - created - 494b750e5194: copied binary
244 D8130 - created - 494b750e5194: copied binary
245 uploading bin2_moved_again@25f766b50cc2
245 uploading bin2_moved_again@25f766b50cc2
246 D8131 - created - 25f766b50cc2: move+mod copied binary
246 D8131 - created - 25f766b50cc2: move+mod copied binary
247 uploading bin2_moved_copied@1b87b363a5e4
247 uploading bin2_moved_copied@1b87b363a5e4
248 uploading bin2_moved@1b87b363a5e4
248 uploading bin2_moved@1b87b363a5e4
249 D8132 - created - 1b87b363a5e4: copy+mod moved binary
249 D8132 - created - 1b87b363a5e4: copy+mod moved binary
250 new commits: ['90437c20312a']
250 new commits: ['90437c20312a']
251 new commits: ['f391f4da4c61']
251 new commits: ['f391f4da4c61']
252 new commits: ['da86a9f3268c']
252 new commits: ['da86a9f3268c']
253 new commits: ['003ffc16ba66']
253 new commits: ['003ffc16ba66']
254 new commits: ['13bd750c36fa']
254 new commits: ['13bd750c36fa']
255 saved backup bundle to $TESTTMP/repo/.hg/strip-backup/f42f9195e00c-e82a0769-phabsend.hg
255 saved backup bundle to $TESTTMP/repo/.hg/strip-backup/f42f9195e00c-e82a0769-phabsend.hg
256
256
257 Phabreading a DREV with a local:commits time as a string:
257 Phabreading a DREV with a local:commits time as a string:
258 $ hg phabread --test-vcr "$VCR/phabread-str-time.json" D1285
258 $ hg phabread --test-vcr "$VCR/phabread-str-time.json" D1285
259 # HG changeset patch
259 # HG changeset patch
260 # User Pulkit Goyal <7895pulkit@gmail.com>
260 # User Pulkit Goyal <7895pulkit@gmail.com>
261 # Date 1509404054 -19800
261 # Date 1509404054 -19800
262 # Node ID 44fc1c1f1774a76423b9c732af6938435099bcc5
262 # Node ID 44fc1c1f1774a76423b9c732af6938435099bcc5
263 # Parent 8feef8ef8389a3b544e0a74624f1efc3a8d85d35
263 # Parent 8feef8ef8389a3b544e0a74624f1efc3a8d85d35
264 repoview: add a new attribute _visibilityexceptions and related API
264 repoview: add a new attribute _visibilityexceptions and related API
265
265
266 Currently we don't have a defined way in core to make some hidden revisions
266 Currently we don't have a defined way in core to make some hidden revisions
267 visible in filtered repo. Extensions to achieve the purpose of unhiding some
267 visible in filtered repo. Extensions to achieve the purpose of unhiding some
268 hidden commits, wrap repoview.pinnedrevs() function.
268 hidden commits, wrap repoview.pinnedrevs() function.
269
269
270 To make the above task simple and have well defined API, this patch adds a new
270 To make the above task simple and have well defined API, this patch adds a new
271 attribute '_visibilityexceptions' to repoview class which will contains
271 attribute '_visibilityexceptions' to repoview class which will contains
272 the hidden revs which should be exception.
272 the hidden revs which should be exception.
273 This will allow to set different exceptions for different repoview objects
273 This will allow to set different exceptions for different repoview objects
274 backed by the same unfiltered repo.
274 backed by the same unfiltered repo.
275
275
276 This patch also adds API to add revs to the attribute set and get them.
276 This patch also adds API to add revs to the attribute set and get them.
277
277
278 Thanks to Jun for suggesting the use of repoview class instead of localrepo.
278 Thanks to Jun for suggesting the use of repoview class instead of localrepo.
279
279
280 Differential Revision: https://phab.mercurial-scm.org/D1285
280 Differential Revision: https://phab.mercurial-scm.org/D1285
281 diff --git a/mercurial/repoview.py b/mercurial/repoview.py
281 diff --git a/mercurial/repoview.py b/mercurial/repoview.py
282 --- a/mercurial/repoview.py
282 --- a/mercurial/repoview.py
283 +++ b/mercurial/repoview.py
283 +++ b/mercurial/repoview.py
284 @@ * @@ (glob)
284 @@ * @@ (glob)
285 subclasses of `localrepo`. Eg: `bundlerepo` or `statichttprepo`.
285 subclasses of `localrepo`. Eg: `bundlerepo` or `statichttprepo`.
286 """
286 """
287
287
288 + # hidden revs which should be visible
288 + # hidden revs which should be visible
289 + _visibilityexceptions = set()
289 + _visibilityexceptions = set()
290 +
290 +
291 def __init__(self, repo, filtername):
291 def __init__(self, repo, filtername):
292 object.__setattr__(self, r'_unfilteredrepo', repo)
292 object.__setattr__(self, r'_unfilteredrepo', repo)
293 object.__setattr__(self, r'filtername', filtername)
293 object.__setattr__(self, r'filtername', filtername)
294 @@ -231,6 +234,14 @@
294 @@ -231,6 +234,14 @@
295 return self
295 return self
296 return self.unfiltered().filtered(name)
296 return self.unfiltered().filtered(name)
297
297
298 + def addvisibilityexceptions(self, revs):
298 + def addvisibilityexceptions(self, revs):
299 + """adds hidden revs which should be visible to set of exceptions"""
299 + """adds hidden revs which should be visible to set of exceptions"""
300 + self._visibilityexceptions.update(revs)
300 + self._visibilityexceptions.update(revs)
301 +
301 +
302 + def getvisibilityexceptions(self):
302 + def getvisibilityexceptions(self):
303 + """returns the set of hidden revs which should be visible"""
303 + """returns the set of hidden revs which should be visible"""
304 + return self._visibilityexceptions
304 + return self._visibilityexceptions
305 +
305 +
306 # everything access are forwarded to the proxied repo
306 # everything access are forwarded to the proxied repo
307 def __getattr__(self, attr):
307 def __getattr__(self, attr):
308 return getattr(self._unfilteredrepo, attr)
308 return getattr(self._unfilteredrepo, attr)
309 diff --git a/mercurial/localrepo.py b/mercurial/localrepo.py
309 diff --git a/mercurial/localrepo.py b/mercurial/localrepo.py
310 --- a/mercurial/localrepo.py
310 --- a/mercurial/localrepo.py
311 +++ b/mercurial/localrepo.py
311 +++ b/mercurial/localrepo.py
312 @@ -570,6 +570,14 @@
312 @@ -570,6 +570,14 @@
313 def close(self):
313 def close(self):
314 self._writecaches()
314 self._writecaches()
315
315
316 + def addvisibilityexceptions(self, exceptions):
316 + def addvisibilityexceptions(self, exceptions):
317 + # should be called on a filtered repository
317 + # should be called on a filtered repository
318 + pass
318 + pass
319 +
319 +
320 + def getvisibilityexceptions(self):
320 + def getvisibilityexceptions(self):
321 + # should be called on a filtered repository
321 + # should be called on a filtered repository
322 + return set()
322 + return set()
323 +
323 +
324 def _loadextensions(self):
324 def _loadextensions(self):
325 extensions.loadall(self.ui)
325 extensions.loadall(self.ui)
326
326
327
327
328 A bad .arcconfig doesn't error out
328 A bad .arcconfig doesn't error out
329 $ echo 'garbage' > .arcconfig
329 $ echo 'garbage' > .arcconfig
330 $ hg config phabricator --debug
330 $ hg config phabricator --debug
331 invalid JSON in $TESTTMP/repo/.arcconfig
331 invalid JSON in $TESTTMP/repo/.arcconfig
332 read config from: */.hgrc (glob)
332 read config from: */.hgrc (glob)
333 */.hgrc:*: phabricator.debug=True (glob)
333 */.hgrc:*: phabricator.debug=True (glob)
334 $TESTTMP/repo/.hg/hgrc:*: phabricator.url=https://phab.mercurial-scm.org/ (glob)
334 $TESTTMP/repo/.hg/hgrc:*: phabricator.url=https://phab.mercurial-scm.org/ (glob)
335 $TESTTMP/repo/.hg/hgrc:*: phabricator.callsign=HG (glob)
335 $TESTTMP/repo/.hg/hgrc:*: phabricator.callsign=HG (glob)
336
336
337 The .arcconfig content overrides global config
337 The .arcconfig content overrides global config
338 $ cat >> $HGRCPATH << EOF
338 $ cat >> $HGRCPATH << EOF
339 > [phabricator]
339 > [phabricator]
340 > url = global
340 > url = global
341 > callsign = global
341 > callsign = global
342 > EOF
342 > EOF
343 $ cp $TESTDIR/../.arcconfig .
343 $ cp $TESTDIR/../.arcconfig .
344 $ mv .hg/hgrc .hg/hgrc.bak
344 $ mv .hg/hgrc .hg/hgrc.bak
345 $ hg config phabricator --debug
345 $ hg config phabricator --debug
346 read config from: */.hgrc (glob)
346 read config from: */.hgrc (glob)
347 */.hgrc:*: phabricator.debug=True (glob)
347 */.hgrc:*: phabricator.debug=True (glob)
348 $TESTTMP/repo/.arcconfig: phabricator.callsign=HG
348 $TESTTMP/repo/.arcconfig: phabricator.callsign=HG
349 $TESTTMP/repo/.arcconfig: phabricator.url=https://phab.mercurial-scm.org/
349 $TESTTMP/repo/.arcconfig: phabricator.url=https://phab.mercurial-scm.org/
350
350
351 But it doesn't override local config
351 But it doesn't override local config
352 $ cat >> .hg/hgrc << EOF
352 $ cat >> .hg/hgrc << EOF
353 > [phabricator]
353 > [phabricator]
354 > url = local
354 > url = local
355 > callsign = local
355 > callsign = local
356 > EOF
356 > EOF
357 $ hg config phabricator --debug
357 $ hg config phabricator --debug
358 read config from: */.hgrc (glob)
358 read config from: */.hgrc (glob)
359 */.hgrc:*: phabricator.debug=True (glob)
359 */.hgrc:*: phabricator.debug=True (glob)
360 $TESTTMP/repo/.hg/hgrc:*: phabricator.url=local (glob)
360 $TESTTMP/repo/.hg/hgrc:*: phabricator.url=local (glob)
361 $TESTTMP/repo/.hg/hgrc:*: phabricator.callsign=local (glob)
361 $TESTTMP/repo/.hg/hgrc:*: phabricator.callsign=local (glob)
362 $ mv .hg/hgrc.bak .hg/hgrc
362 $ mv .hg/hgrc.bak .hg/hgrc
363
363
364 Phabimport works with a stack
364 Phabimport works with a stack
365
365
366 $ cd ..
366 $ cd ..
367 $ hg clone repo repo2 -qr 1
367 $ hg clone repo repo2 -qr 1
368 $ cp repo/.hg/hgrc repo2/.hg/
368 $ cp repo/.hg/hgrc repo2/.hg/
369 $ cd repo2
369 $ cd repo2
370 $ hg phabimport --stack 'D7918' --test-vcr "$VCR/phabimport-stack.json"
370 $ hg phabimport --stack 'D7918' --test-vcr "$VCR/phabimport-stack.json"
371 applying patch from D7917
371 applying patch from D7917
372 applying patch from D7918
372 applying patch from D7918
373 $ hg log -r .: -G -Tcompact
373 $ hg log -r .: -G -Tcompact
374 o 3[tip] aaef04066140 1970-01-01 00:00 +0000 test
374 o 3[tip] aaef04066140 1970-01-01 00:00 +0000 test
375 | create draft change for phabricator testing
375 | create draft change for phabricator testing
376 |
376 |
377 o 2 8de3712202d1 1970-01-01 00:00 +0000 test
377 o 2 8de3712202d1 1970-01-01 00:00 +0000 test
378 | create public change for phabricator testing
378 | create public change for phabricator testing
379 |
379 |
380 @ 1 a692622e6937 1970-01-01 00:00 +0000 test
380 @ 1 a692622e6937 1970-01-01 00:00 +0000 test
381 | create beta for phabricator test
381 | create beta for phabricator test
382 ~
382 ~
383 Phabimport can create secret commits
383 Phabimport can create secret commits
384
384
385 $ hg rollback --config ui.rollback=True
385 $ hg rollback --config ui.rollback=True
386 repository tip rolled back to revision 1 (undo phabimport)
386 repository tip rolled back to revision 1 (undo phabimport)
387 $ hg phabimport --stack 'D7918' --test-vcr "$VCR/phabimport-stack.json" \
387 $ hg phabimport --stack 'D7918' --test-vcr "$VCR/phabimport-stack.json" \
388 > --config phabimport.secret=True
388 > --config phabimport.secret=True
389 applying patch from D7917
389 applying patch from D7917
390 applying patch from D7918
390 applying patch from D7918
391 $ hg log -r 'reverse(.:)' -T phases
391 $ hg log -r 'reverse(.:)' -T phases
392 changeset: 3:aaef04066140
392 changeset: 3:aaef04066140
393 tag: tip
393 tag: tip
394 phase: secret
394 phase: secret
395 user: test
395 user: test
396 date: Thu Jan 01 00:00:00 1970 +0000
396 date: Thu Jan 01 00:00:00 1970 +0000
397 summary: create draft change for phabricator testing
397 summary: create draft change for phabricator testing
398
398
399 changeset: 2:8de3712202d1
399 changeset: 2:8de3712202d1
400 phase: secret
400 phase: secret
401 user: test
401 user: test
402 date: Thu Jan 01 00:00:00 1970 +0000
402 date: Thu Jan 01 00:00:00 1970 +0000
403 summary: create public change for phabricator testing
403 summary: create public change for phabricator testing
404
404
405 changeset: 1:a692622e6937
405 changeset: 1:a692622e6937
406 phase: public
406 phase: public
407 user: test
407 user: test
408 date: Thu Jan 01 00:00:00 1970 +0000
408 date: Thu Jan 01 00:00:00 1970 +0000
409 summary: create beta for phabricator test
409 summary: create beta for phabricator test
410
410
411 Phabimport accepts multiple DREVSPECs
411 Phabimport accepts multiple DREVSPECs
412
412
413 $ hg rollback --config ui.rollback=True
413 $ hg rollback --config ui.rollback=True
414 repository tip rolled back to revision 1 (undo phabimport)
414 repository tip rolled back to revision 1 (undo phabimport)
415 $ hg phabimport --no-stack D7917 D7918 --test-vcr "$VCR/phabimport-multi-drev.json"
415 $ hg phabimport --no-stack D7917 D7918 --test-vcr "$VCR/phabimport-multi-drev.json"
416 applying patch from D7917
416 applying patch from D7917
417 applying patch from D7918
417 applying patch from D7918
418
418
419 Validate arguments with --fold
420
421 $ hg phabsend --fold -r 1
422 abort: cannot fold a single revision
423 [255]
424 $ hg phabsend --fold --no-amend -r 1::
425 abort: cannot fold with --no-amend
426 [255]
427 $ hg phabsend --fold -r 0+3
428 abort: cannot fold non-linear revisions
429 [255]
430 $ hg phabsend --fold -r 1::
431 abort: cannot fold revisions with different DREV values
432 [255]
433
434 Setup a series of commits to be folded, and include the Test Plan field multiple
435 times to test the concatenation logic. No Test Plan field in the last one to
436 ensure missing fields are skipped.
437
438 $ hg init ../folded
439 $ cd ../folded
440 $ cat >> .hg/hgrc <<EOF
441 > [phabricator]
442 > url = https://phab.mercurial-scm.org/
443 > callsign = HG
444 > EOF
445
446 $ echo 'added' > file.txt
447 $ hg ci -Aqm 'added file'
448
449 $ cat > log.txt <<EOF
450 > one: first commit to review
451 >
452 > This file was modified with 'mod1' as its contents.
453 >
454 > Test Plan:
455 > LOL! What testing?!
456 > EOF
457 $ echo mod1 > file.txt
458 $ hg ci -l log.txt
459
460 $ cat > log.txt <<EOF
461 > two: second commit to review
462 >
463 > This file was modified with 'mod2' as its contents.
464 >
465 > Test Plan:
466 > Haha! yeah, right.
467 >
468 > EOF
469 $ echo mod2 > file.txt
470 $ hg ci -l log.txt
471
472 $ echo mod3 > file.txt
473 $ hg ci -m '3: a commit with no detailed message'
474
475 The folding of immutable commits works...
476
477 $ hg phase -r tip --public
478 $ hg phabsend --fold -r 1:: --test-vcr "$VCR/phabsend-fold-immutable.json"
479 D8386 - created - a959a3f69d8d: one: first commit to review
480 D8386 - created - 24a4438154ba: two: second commit to review
481 D8386 - created - d235829e802c: 3: a commit with no detailed message
482 warning: not updating public commit 1:a959a3f69d8d
483 warning: not updating public commit 2:24a4438154ba
484 warning: not updating public commit 3:d235829e802c
485 no newnodes to update
486
487 $ hg phase -r 0 --draft --force
488
489 ... as does the initial mutable fold...
490
491 $ echo y | hg phabsend --fold --confirm -r 1:: \
492 > --test-vcr "$VCR/phabsend-fold-initial.json"
493 NEW - a959a3f69d8d: one: first commit to review
494 NEW - 24a4438154ba: two: second commit to review
495 NEW - d235829e802c: 3: a commit with no detailed message
496 Send the above changes to https://phab.mercurial-scm.org/ (yn)? y
497 D8387 - created - a959a3f69d8d: one: first commit to review
498 D8387 - created - 24a4438154ba: two: second commit to review
499 D8387 - created - d235829e802c: 3: a commit with no detailed message
500 updating local commit list for D8387
501 new commits: ['602c4e738243', '832553266fe8', '921f8265efbd']
502 saved backup bundle to $TESTTMP/folded/.hg/strip-backup/a959a3f69d8d-a4a24136-phabsend.hg
503
504 ... and doesn't mangle the local commits.
505
506 $ hg log -T '{rev}:{node|short}\n{indent(desc, " ")}\n'
507 3:921f8265efbd
508 3: a commit with no detailed message
509
510 Differential Revision: https://phab.mercurial-scm.org/D8387
511 2:832553266fe8
512 two: second commit to review
513
514 This file was modified with 'mod2' as its contents.
515
516 Test Plan:
517 Haha! yeah, right.
518
519 Differential Revision: https://phab.mercurial-scm.org/D8387
520 1:602c4e738243
521 one: first commit to review
522
523 This file was modified with 'mod1' as its contents.
524
525 Test Plan:
526 LOL! What testing?!
527
528 Differential Revision: https://phab.mercurial-scm.org/D8387
529 0:98d480e0d494
530 added file
531
532 Setup some obsmarkers by adding a file to the middle commit. This stress tests
533 getoldnodedrevmap() in later phabsends.
534
535 $ hg up '.^'
536 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
537 $ echo 'modified' > file2.txt
538 $ hg add file2.txt
539 $ hg amend --config experimental.evolution=all --config extensions.amend=
540 1 new orphan changesets
541 $ hg up 3
542 obsolete feature not enabled but 1 markers found!
543 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
544 $ hg rebase --config experimental.evolution=all --config extensions.rebase=
545 note: not rebasing 2:832553266fe8 "two: second commit to review", already in destination as 4:0124e5474c88 "two: second commit to review" (tip)
546 rebasing 3:921f8265efbd "3: a commit with no detailed message"
547
548 When commits have changed locally, the local commit list on Phabricator is
549 updated.
550
551 $ echo y | hg phabsend --fold --confirm -r 1:: \
552 > --test-vcr "$VCR/phabsend-fold-updated.json"
553 obsolete feature not enabled but 2 markers found!
554 602c4e738243 mapped to old nodes ['602c4e738243']
555 0124e5474c88 mapped to old nodes ['832553266fe8']
556 e4edb1fe3565 mapped to old nodes ['921f8265efbd']
557 D8387 - 602c4e738243: one: first commit to review
558 D8387 - 0124e5474c88: two: second commit to review
559 D8387 - e4edb1fe3565: 3: a commit with no detailed message
560 Send the above changes to https://phab.mercurial-scm.org/ (yn)? y
561 D8387 - updated - 602c4e738243: one: first commit to review
562 D8387 - updated - 0124e5474c88: two: second commit to review
563 D8387 - updated - e4edb1fe3565: 3: a commit with no detailed message
564 obsolete feature not enabled but 2 markers found! (?)
565 updating local commit list for D8387
566 new commits: ['602c4e738243', '0124e5474c88', 'e4edb1fe3565']
567 $ hg log -Tcompact
568 obsolete feature not enabled but 2 markers found!
569 5[tip] e4edb1fe3565 1970-01-01 00:00 +0000 test
570 3: a commit with no detailed message
571
572 4:1 0124e5474c88 1970-01-01 00:00 +0000 test
573 two: second commit to review
574
575 1 602c4e738243 1970-01-01 00:00 +0000 test
576 one: first commit to review
577
578 0 98d480e0d494 1970-01-01 00:00 +0000 test
579 added file
580
581 When nothing has changed locally since the last phabsend, the commit list isn't
582 updated, and nothing is changed locally afterward.
583
584 $ hg phabsend --fold -r 1:: --test-vcr "$VCR/phabsend-fold-no-changes.json"
585 obsolete feature not enabled but 2 markers found!
586 602c4e738243 mapped to old nodes ['602c4e738243']
587 0124e5474c88 mapped to old nodes ['0124e5474c88']
588 e4edb1fe3565 mapped to old nodes ['e4edb1fe3565']
589 D8387 - updated - 602c4e738243: one: first commit to review
590 D8387 - updated - 0124e5474c88: two: second commit to review
591 D8387 - updated - e4edb1fe3565: 3: a commit with no detailed message
592 obsolete feature not enabled but 2 markers found! (?)
593 local commit list for D8387 is already up-to-date
594 $ hg log -Tcompact
595 obsolete feature not enabled but 2 markers found!
596 5[tip] e4edb1fe3565 1970-01-01 00:00 +0000 test
597 3: a commit with no detailed message
598
599 4:1 0124e5474c88 1970-01-01 00:00 +0000 test
600 two: second commit to review
601
602 1 602c4e738243 1970-01-01 00:00 +0000 test
603 one: first commit to review
604
605 0 98d480e0d494 1970-01-01 00:00 +0000 test
606 added file
607
608 Fold will accept new revisions at the end...
609
610 $ echo 'another mod' > file2.txt
611 $ hg ci -m 'four: extend the fold range'
612 obsolete feature not enabled but 2 markers found!
613 $ hg phabsend --fold -r 1:: --test-vcr "$VCR/phabsend-fold-extend-end.json" \
614 > --config experimental.evolution=all
615 602c4e738243 mapped to old nodes ['602c4e738243']
616 0124e5474c88 mapped to old nodes ['0124e5474c88']
617 e4edb1fe3565 mapped to old nodes ['e4edb1fe3565']
618 D8387 - updated - 602c4e738243: one: first commit to review
619 D8387 - updated - 0124e5474c88: two: second commit to review
620 D8387 - updated - e4edb1fe3565: 3: a commit with no detailed message
621 D8387 - created - 94aaae213b23: four: extend the fold range
622 updating local commit list for D8387
623 new commits: ['602c4e738243', '0124e5474c88', 'e4edb1fe3565', '51a04fea8707']
624 $ hg log -r . -T '{desc}\n'
625 four: extend the fold range
626
627 Differential Revision: https://phab.mercurial-scm.org/D8387
628 $ hg log -T'{rev} {if(phabreview, "{phabreview.url} {phabreview.id}")}\n' -r 1::
629 obsolete feature not enabled but 3 markers found!
630 1 https://phab.mercurial-scm.org/D8387 D8387
631 4 https://phab.mercurial-scm.org/D8387 D8387
632 5 https://phab.mercurial-scm.org/D8387 D8387
633 7 https://phab.mercurial-scm.org/D8387 D8387
634
635 ... and also accepts new revisions at the beginning of the range
636
637 It's a bit unfortunate that not having a Differential URL on the first commit
638 causes a new Differential Revision to be created, though it isn't *entirely*
639 unreasonable. At least this updates the subsequent commits.
640
641 TODO: See if it can reuse the existing Differential.
642
643 $ hg phabsend --fold -r 0:: --test-vcr "$VCR/phabsend-fold-extend-front.json" \
644 > --config experimental.evolution=all
645 602c4e738243 mapped to old nodes ['602c4e738243']
646 0124e5474c88 mapped to old nodes ['0124e5474c88']
647 e4edb1fe3565 mapped to old nodes ['e4edb1fe3565']
648 51a04fea8707 mapped to old nodes ['51a04fea8707']
649 D8388 - created - 98d480e0d494: added file
650 D8388 - updated - 602c4e738243: one: first commit to review
651 D8388 - updated - 0124e5474c88: two: second commit to review
652 D8388 - updated - e4edb1fe3565: 3: a commit with no detailed message
653 D8388 - updated - 51a04fea8707: four: extend the fold range
654 updating local commit list for D8388
655 new commits: ['15e9b14b4b4c', '6320b7d714cf', '3ee132d41dbc', '30682b960804', 'ac7db67f0991']
656
657 $ hg log -T '{rev}:{node|short}\n{indent(desc, " ")}\n'
658 obsolete feature not enabled but 8 markers found!
659 12:ac7db67f0991
660 four: extend the fold range
661
662 Differential Revision: https://phab.mercurial-scm.org/D8388
663 11:30682b960804
664 3: a commit with no detailed message
665
666 Differential Revision: https://phab.mercurial-scm.org/D8388
667 10:3ee132d41dbc
668 two: second commit to review
669
670 This file was modified with 'mod2' as its contents.
671
672 Test Plan:
673 Haha! yeah, right.
674
675 Differential Revision: https://phab.mercurial-scm.org/D8388
676 9:6320b7d714cf
677 one: first commit to review
678
679 This file was modified with 'mod1' as its contents.
680
681 Test Plan:
682 LOL! What testing?!
683
684 Differential Revision: https://phab.mercurial-scm.org/D8388
685 8:15e9b14b4b4c
686 added file
687
688 Differential Revision: https://phab.mercurial-scm.org/D8388
689
690 Test phabsend --fold with an `hg split` at the end of the range
691
692 $ echo foo > file3.txt
693 $ hg add file3.txt
694
695 $ hg log -r . -T '{desc}' > log.txt
696 $ echo 'amended mod' > file2.txt
697 $ hg ci --amend -l log.txt --config experimental.evolution=all
698
699 $ cat <<EOF | hg --config extensions.split= --config ui.interactive=True \
700 > --config experimental.evolution=all split -r .
701 > n
702 > y
703 > y
704 > y
705 > y
706 > EOF
707 diff --git a/file2.txt b/file2.txt
708 1 hunks, 1 lines changed
709 examine changes to 'file2.txt'?
710 (enter ? for help) [Ynesfdaq?] n
711
712 diff --git a/file3.txt b/file3.txt
713 new file mode 100644
714 examine changes to 'file3.txt'?
715 (enter ? for help) [Ynesfdaq?] y
716
717 @@ -0,0 +1,1 @@
718 +foo
719 record change 2/2 to 'file3.txt'?
720 (enter ? for help) [Ynesfdaq?] y
721
722 created new head
723 diff --git a/file2.txt b/file2.txt
724 1 hunks, 1 lines changed
725 examine changes to 'file2.txt'?
726 (enter ? for help) [Ynesfdaq?] y
727
728 @@ -1,1 +1,1 @@
729 -modified
730 +amended mod
731 record this change to 'file2.txt'?
732 (enter ? for help) [Ynesfdaq?] y
733
734 $ hg phabsend --fold -r 8:: --test-vcr "$VCR/phabsend-fold-split-end.json" \
735 > --config experimental.evolution=all
736 15e9b14b4b4c mapped to old nodes ['15e9b14b4b4c']
737 6320b7d714cf mapped to old nodes ['6320b7d714cf']
738 3ee132d41dbc mapped to old nodes ['3ee132d41dbc']
739 30682b960804 mapped to old nodes ['30682b960804']
740 6bc15dc99efd mapped to old nodes ['ac7db67f0991']
741 b50946d5e490 mapped to old nodes ['ac7db67f0991']
742 D8388 - updated - 15e9b14b4b4c: added file
743 D8388 - updated - 6320b7d714cf: one: first commit to review
744 D8388 - updated - 3ee132d41dbc: two: second commit to review
745 D8388 - updated - 30682b960804: 3: a commit with no detailed message
746 D8388 - updated - 6bc15dc99efd: four: extend the fold range
747 D8388 - updated - b50946d5e490: four: extend the fold range
748 updating local commit list for D8388
749 new commits: ['15e9b14b4b4c', '6320b7d714cf', '3ee132d41dbc', '30682b960804', '6bc15dc99efd', 'b50946d5e490']
750
751 Test phabsend --fold with an `hg fold` at the end of the range
752
753 $ hg --config experimental.evolution=all --config extensions.rebase= \
754 > rebase -r '.^' -r . -d '.^^' --collapse -l log.txt
755 rebasing 14:6bc15dc99efd "four: extend the fold range"
756 rebasing 15:b50946d5e490 "four: extend the fold range" (tip)
757
758 $ hg phabsend --fold -r 8:: --test-vcr "$VCR/phabsend-fold-fold-end.json" \
759 > --config experimental.evolution=all
760 15e9b14b4b4c mapped to old nodes ['15e9b14b4b4c']
761 6320b7d714cf mapped to old nodes ['6320b7d714cf']
762 3ee132d41dbc mapped to old nodes ['3ee132d41dbc']
763 30682b960804 mapped to old nodes ['30682b960804']
764 e919cdf3d4fe mapped to old nodes ['6bc15dc99efd', 'b50946d5e490']
765 D8388 - updated - 15e9b14b4b4c: added file
766 D8388 - updated - 6320b7d714cf: one: first commit to review
767 D8388 - updated - 3ee132d41dbc: two: second commit to review
768 D8388 - updated - 30682b960804: 3: a commit with no detailed message
769 D8388 - updated - e919cdf3d4fe: four: extend the fold range
770 updating local commit list for D8388
771 new commits: ['15e9b14b4b4c', '6320b7d714cf', '3ee132d41dbc', '30682b960804', 'e919cdf3d4fe']
772
773 $ hg log -r tip -v
774 obsolete feature not enabled but 12 markers found!
775 changeset: 16:e919cdf3d4fe
776 tag: tip
777 parent: 11:30682b960804
778 user: test
779 date: Thu Jan 01 00:00:00 1970 +0000
780 files: file2.txt file3.txt
781 description:
782 four: extend the fold range
783
784 Differential Revision: https://phab.mercurial-scm.org/D8388
785
786
787
419 $ cd ..
788 $ cd ..
General Comments 0
You need to be logged in to leave comments. Login now