Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(110)

Side by Side Diff: scripts/slave/recipes/android_webview_aosp.expected/uses_android_repo.json

Issue 24650004: Fix hack for test presentation in path api. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/tools/build
Patch Set: rebase Created 7 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 [ 1 [
2 { 2 {
3 "cmd": [ 3 "cmd": [
4 "python", 4 "python",
5 "-u", 5 "-u",
6 "[DEPOT_TOOLS_ROOT]/gclient.py", 6 "[DEPOT_TOOLS]/gclient.py",
7 "config", 7 "config",
8 "--spec", 8 "--spec",
9 "cache_dir = None\nsolutions = [{'custom_vars': {'googlecode_url': 'svn:// svn-mirror.golo.chromium.org/%s', 'nacl_trunk': 'svn://svn-mirror.golo.chromium. org/native_client/trunk', 'sourceforge_url': 'svn://svn-mirror.golo.chromium.org /%(repo)s', 'webkit_trunk': 'svn://svn-mirror.golo.chromium.org/blink/trunk'}, ' deps_file': '', 'managed': True, 'name': 'src', 'url': 'svn://svn-mirror.golo.ch romium.org/chrome/trunk/src'}]" 9 "cache_dir = None\nsolutions = [{'custom_vars': {'googlecode_url': 'svn:// svn-mirror.golo.chromium.org/%s', 'nacl_trunk': 'svn://svn-mirror.golo.chromium. org/native_client/trunk', 'sourceforge_url': 'svn://svn-mirror.golo.chromium.org /%(repo)s', 'webkit_trunk': 'svn://svn-mirror.golo.chromium.org/blink/trunk'}, ' deps_file': '', 'managed': True, 'name': 'src', 'url': 'svn://svn-mirror.golo.ch romium.org/chrome/trunk/src'}]"
10 ], 10 ],
11 "name": "[spec: empty_deps] gclient setup", 11 "name": "[spec: empty_deps] gclient setup",
12 "seed_steps": [ 12 "seed_steps": [
13 "[spec: empty_deps] gclient setup", 13 "[spec: empty_deps] gclient setup",
14 "[spec: empty_deps] gclient revert", 14 "[spec: empty_deps] gclient revert",
15 "[spec: empty_deps] gclient sync" 15 "[spec: empty_deps] gclient sync"
16 ] 16 ]
17 }, 17 },
18 { 18 {
19 "cmd": [ 19 "cmd": [
20 "python", 20 "python",
21 "-u", 21 "-u",
22 "[BUILD_ROOT]/scripts/slave/gclient_safe_revert.py", 22 "[BUILD]/scripts/slave/gclient_safe_revert.py",
23 ".", 23 ".",
24 "[DEPOT_TOOLS_ROOT]/gclient" 24 "[DEPOT_TOOLS]/gclient"
25 ], 25 ],
26 "name": "[spec: empty_deps] gclient revert" 26 "name": "[spec: empty_deps] gclient revert"
27 }, 27 },
28 { 28 {
29 "cmd": [ 29 "cmd": [
30 "python", 30 "python",
31 "-u", 31 "-u",
32 "[DEPOT_TOOLS_ROOT]/gclient.py", 32 "[DEPOT_TOOLS]/gclient.py",
33 "sync", 33 "sync",
34 "--nohooks", 34 "--nohooks",
35 "--revision", 35 "--revision",
36 "src@204787", 36 "src@204787",
37 "--output-json", 37 "--output-json",
38 "/path/to/tmp/json" 38 "/path/to/tmp/json"
39 ], 39 ],
40 "name": "[spec: empty_deps] gclient sync", 40 "name": "[spec: empty_deps] gclient sync",
41 "~followup_annotations": [ 41 "~followup_annotations": [
42 "@@@STEP_LOG_LINE@json.output@{@@@", 42 "@@@STEP_LOG_LINE@json.output@{@@@",
(...skipping 22 matching lines...) Expand all
65 "@@@SET_BUILD_PROPERTY@got_nacl_revision@274981@@@", 65 "@@@SET_BUILD_PROPERTY@got_nacl_revision@274981@@@",
66 "@@@SET_BUILD_PROPERTY@got_webkit_revision@124383@@@", 66 "@@@SET_BUILD_PROPERTY@got_webkit_revision@124383@@@",
67 "@@@SET_BUILD_PROPERTY@got_swarming_client_revision@276089@@@", 67 "@@@SET_BUILD_PROPERTY@got_swarming_client_revision@276089@@@",
68 "@@@SET_BUILD_PROPERTY@got_webrtc_revision@120644@@@", 68 "@@@SET_BUILD_PROPERTY@got_webrtc_revision@120644@@@",
69 "@@@SET_BUILD_PROPERTY@got_revision@170242@@@", 69 "@@@SET_BUILD_PROPERTY@got_revision@170242@@@",
70 "@@@SET_BUILD_PROPERTY@got_swarm_client_revision@200767@@@" 70 "@@@SET_BUILD_PROPERTY@got_swarm_client_revision@200767@@@"
71 ] 71 ]
72 }, 72 },
73 { 73 {
74 "cmd": [ 74 "cmd": [
75 "[SLAVE_BUILD_ROOT]/src/android_webview/buildbot/deps_whitelist.py", 75 "[SLAVE_BUILD]/src/android_webview/buildbot/deps_whitelist.py",
76 "--method", 76 "--method",
77 "android_build", 77 "android_build",
78 "--path-to-deps", 78 "--path-to-deps",
79 "[SLAVE_BUILD_ROOT]/src/DEPS", 79 "[SLAVE_BUILD]/src/DEPS",
80 "--output-json", 80 "--output-json",
81 "/path/to/tmp/json" 81 "/path/to/tmp/json"
82 ], 82 ],
83 "name": "calculate trimmed deps", 83 "name": "calculate trimmed deps",
84 "~followup_annotations": [ 84 "~followup_annotations": [
85 "@@@STEP_LOG_LINE@json.output@{@@@", 85 "@@@STEP_LOG_LINE@json.output@{@@@",
86 "@@@STEP_LOG_LINE@json.output@ \"blacklist\": {@@@", 86 "@@@STEP_LOG_LINE@json.output@ \"blacklist\": {@@@",
87 "@@@STEP_LOG_LINE@json.output@ \"src/blacklist/project/1\": null, @@@", 87 "@@@STEP_LOG_LINE@json.output@ \"src/blacklist/project/1\": null, @@@",
88 "@@@STEP_LOG_LINE@json.output@ \"src/blacklist/project/2\": null@@@", 88 "@@@STEP_LOG_LINE@json.output@ \"src/blacklist/project/2\": null@@@",
89 "@@@STEP_LOG_LINE@json.output@ }@@@", 89 "@@@STEP_LOG_LINE@json.output@ }@@@",
90 "@@@STEP_LOG_LINE@json.output@}@@@", 90 "@@@STEP_LOG_LINE@json.output@}@@@",
91 "@@@STEP_LOG_END@json.output@@@" 91 "@@@STEP_LOG_END@json.output@@@"
92 ] 92 ]
93 }, 93 },
94 { 94 {
95 "cmd": [ 95 "cmd": [
96 "python", 96 "python",
97 "-u", 97 "-u",
98 "[DEPOT_TOOLS_ROOT]/gclient.py", 98 "[DEPOT_TOOLS]/gclient.py",
99 "config", 99 "config",
100 "--spec", 100 "--spec",
101 "cache_dir = None\nsolutions = [{'custom_deps': {'src/blacklist/project/1' : None, 'src/blacklist/project/2': None}, 'custom_vars': {'googlecode_url': 'svn ://svn-mirror.golo.chromium.org/%s', 'nacl_trunk': 'svn://svn-mirror.golo.chromi um.org/native_client/trunk', 'sourceforge_url': 'svn://svn-mirror.golo.chromium. org/%(repo)s', 'webkit_trunk': 'svn://svn-mirror.golo.chromium.org/blink/trunk'} , 'deps_file': 'DEPS', 'managed': True, 'name': 'src', 'url': 'svn://svn-mirror. golo.chromium.org/chrome/trunk/src'}]\ntarget_os = ['android']" 101 "cache_dir = None\nsolutions = [{'custom_deps': {'src/blacklist/project/1' : None, 'src/blacklist/project/2': None}, 'custom_vars': {'googlecode_url': 'svn ://svn-mirror.golo.chromium.org/%s', 'nacl_trunk': 'svn://svn-mirror.golo.chromi um.org/native_client/trunk', 'sourceforge_url': 'svn://svn-mirror.golo.chromium. org/%(repo)s', 'webkit_trunk': 'svn://svn-mirror.golo.chromium.org/blink/trunk'} , 'deps_file': 'DEPS', 'managed': True, 'name': 'src', 'url': 'svn://svn-mirror. golo.chromium.org/chrome/trunk/src'}]\ntarget_os = ['android']"
102 ], 102 ],
103 "name": "[spec: trimmed] gclient setup", 103 "name": "[spec: trimmed] gclient setup",
104 "seed_steps": [ 104 "seed_steps": [
105 "[spec: trimmed] gclient setup", 105 "[spec: trimmed] gclient setup",
106 "[spec: trimmed] gclient revert", 106 "[spec: trimmed] gclient revert",
107 "[spec: trimmed] gclient sync" 107 "[spec: trimmed] gclient sync"
108 ] 108 ]
109 }, 109 },
110 { 110 {
111 "cmd": [ 111 "cmd": [
112 "python", 112 "python",
113 "-u", 113 "-u",
114 "[BUILD_ROOT]/scripts/slave/gclient_safe_revert.py", 114 "[BUILD]/scripts/slave/gclient_safe_revert.py",
115 ".", 115 ".",
116 "[DEPOT_TOOLS_ROOT]/gclient" 116 "[DEPOT_TOOLS]/gclient"
117 ], 117 ],
118 "name": "[spec: trimmed] gclient revert" 118 "name": "[spec: trimmed] gclient revert"
119 }, 119 },
120 { 120 {
121 "cmd": [ 121 "cmd": [
122 "python", 122 "python",
123 "-u", 123 "-u",
124 "[DEPOT_TOOLS_ROOT]/gclient.py", 124 "[DEPOT_TOOLS]/gclient.py",
125 "sync", 125 "sync",
126 "--nohooks", 126 "--nohooks",
127 "--revision", 127 "--revision",
128 "src@204787", 128 "src@204787",
129 "--output-json", 129 "--output-json",
130 "/path/to/tmp/json" 130 "/path/to/tmp/json"
131 ], 131 ],
132 "name": "[spec: trimmed] gclient sync", 132 "name": "[spec: trimmed] gclient sync",
133 "~followup_annotations": [ 133 "~followup_annotations": [
134 "@@@STEP_LOG_LINE@json.output@{@@@", 134 "@@@STEP_LOG_LINE@json.output@{@@@",
(...skipping 22 matching lines...) Expand all
157 "@@@SET_BUILD_PROPERTY@got_nacl_revision@274981@@@", 157 "@@@SET_BUILD_PROPERTY@got_nacl_revision@274981@@@",
158 "@@@SET_BUILD_PROPERTY@got_webkit_revision@124383@@@", 158 "@@@SET_BUILD_PROPERTY@got_webkit_revision@124383@@@",
159 "@@@SET_BUILD_PROPERTY@got_swarming_client_revision@276089@@@", 159 "@@@SET_BUILD_PROPERTY@got_swarming_client_revision@276089@@@",
160 "@@@SET_BUILD_PROPERTY@got_webrtc_revision@120644@@@", 160 "@@@SET_BUILD_PROPERTY@got_webrtc_revision@120644@@@",
161 "@@@SET_BUILD_PROPERTY@got_revision@170242@@@", 161 "@@@SET_BUILD_PROPERTY@got_revision@170242@@@",
162 "@@@SET_BUILD_PROPERTY@got_swarm_client_revision@200767@@@" 162 "@@@SET_BUILD_PROPERTY@got_swarm_client_revision@200767@@@"
163 ] 163 ]
164 }, 164 },
165 { 165 {
166 "cmd": [ 166 "cmd": [
167 "[SLAVE_BUILD_ROOT]/src/build/util/lastchange.py", 167 "[SLAVE_BUILD]/src/build/util/lastchange.py",
168 "-o", 168 "-o",
169 "[SLAVE_BUILD_ROOT]/src/build/util/LASTCHANGE", 169 "[SLAVE_BUILD]/src/build/util/LASTCHANGE",
170 "-s", 170 "-s",
171 "[SLAVE_BUILD_ROOT]/src" 171 "[SLAVE_BUILD]/src"
172 ], 172 ],
173 "name": "Chromium LASTCHANGE", 173 "name": "Chromium LASTCHANGE",
174 "seed_steps": [ 174 "seed_steps": [
175 "Chromium LASTCHANGE", 175 "Chromium LASTCHANGE",
176 "Blink LASTCHANGE" 176 "Blink LASTCHANGE"
177 ] 177 ]
178 }, 178 },
179 { 179 {
180 "cmd": [ 180 "cmd": [
181 "[SLAVE_BUILD_ROOT]/src/build/util/lastchange.py", 181 "[SLAVE_BUILD]/src/build/util/lastchange.py",
182 "-o", 182 "-o",
183 "[SLAVE_BUILD_ROOT]/src/build/util/LASTCHANGE.blink", 183 "[SLAVE_BUILD]/src/build/util/LASTCHANGE.blink",
184 "-s", 184 "-s",
185 "[SLAVE_BUILD_ROOT]/src/third_party/WebKit" 185 "[SLAVE_BUILD]/src/third_party/WebKit"
186 ], 186 ],
187 "name": "Blink LASTCHANGE" 187 "name": "Blink LASTCHANGE"
188 }, 188 },
189 { 189 {
190 "cmd": [ 190 "cmd": [
191 "python", 191 "python",
192 "-u", 192 "-u",
193 "\nimport sys, os\npath = sys.argv[1]\nmode = int(sys.argv[2])\nif not os. path.isdir(path):\n if os.path.exists(path):\n print \"%s exists but is not a dir\" % path\n sys.exit(1)\n os.makedirs(path, mode)\n", 193 "\nimport sys, os\npath = sys.argv[1]\nmode = int(sys.argv[2])\nif not os. path.isdir(path):\n if os.path.exists(path):\n print \"%s exists but is not a dir\" % path\n sys.exit(1)\n os.makedirs(path, mode)\n",
194 "[SLAVE_BUILD_ROOT]/repo_copy", 194 "[SLAVE_BUILD]/repo_copy",
195 "511" 195 "511"
196 ], 196 ],
197 "name": "makedirs repo copy dir", 197 "name": "makedirs repo copy dir",
198 "~followup_annotations": [ 198 "~followup_annotations": [
199 "@@@STEP_LOG_LINE@python.inline@@@@", 199 "@@@STEP_LOG_LINE@python.inline@@@@",
200 "@@@STEP_LOG_LINE@python.inline@import sys, os@@@", 200 "@@@STEP_LOG_LINE@python.inline@import sys, os@@@",
201 "@@@STEP_LOG_LINE@python.inline@path = sys.argv[1]@@@", 201 "@@@STEP_LOG_LINE@python.inline@path = sys.argv[1]@@@",
202 "@@@STEP_LOG_LINE@python.inline@mode = int(sys.argv[2])@@@", 202 "@@@STEP_LOG_LINE@python.inline@mode = int(sys.argv[2])@@@",
203 "@@@STEP_LOG_LINE@python.inline@if not os.path.isdir(path):@@@", 203 "@@@STEP_LOG_LINE@python.inline@if not os.path.isdir(path):@@@",
204 "@@@STEP_LOG_LINE@python.inline@ if os.path.exists(path):@@@", 204 "@@@STEP_LOG_LINE@python.inline@ if os.path.exists(path):@@@",
205 "@@@STEP_LOG_LINE@python.inline@ print \"%s exists but is not a dir\" % path@@@", 205 "@@@STEP_LOG_LINE@python.inline@ print \"%s exists but is not a dir\" % path@@@",
206 "@@@STEP_LOG_LINE@python.inline@ sys.exit(1)@@@", 206 "@@@STEP_LOG_LINE@python.inline@ sys.exit(1)@@@",
207 "@@@STEP_LOG_LINE@python.inline@ os.makedirs(path, mode)@@@", 207 "@@@STEP_LOG_LINE@python.inline@ os.makedirs(path, mode)@@@",
208 "@@@STEP_LOG_END@python.inline@@@" 208 "@@@STEP_LOG_END@python.inline@@@"
209 ] 209 ]
210 }, 210 },
211 { 211 {
212 "cmd": [ 212 "cmd": [
213 "cp", 213 "cp",
214 "[SLAVE_BUILD_ROOT]/android-src/.repo/repo/repo", 214 "[SLAVE_BUILD]/android-src/.repo/repo/repo",
215 "[SLAVE_BUILD_ROOT]/repo_copy/repo" 215 "[SLAVE_BUILD]/repo_copy/repo"
216 ], 216 ],
217 "name": "copy repo from Android" 217 "name": "copy repo from Android"
218 }, 218 },
219 { 219 {
220 "cmd": [ 220 "cmd": [
221 "python", 221 "python",
222 "-u", 222 "-u",
223 "\nimport sys, os\npath = sys.argv[1]\nmode = int(sys.argv[2])\nif not os. path.isdir(path):\n if os.path.exists(path):\n print \"%s exists but is not a dir\" % path\n sys.exit(1)\n os.makedirs(path, mode)\n", 223 "\nimport sys, os\npath = sys.argv[1]\nmode = int(sys.argv[2])\nif not os. path.isdir(path):\n if os.path.exists(path):\n print \"%s exists but is not a dir\" % path\n sys.exit(1)\n os.makedirs(path, mode)\n",
224 "[SLAVE_BUILD_ROOT]/android-src", 224 "[SLAVE_BUILD]/android-src",
225 "511" 225 "511"
226 ], 226 ],
227 "name": "makedirs android source root", 227 "name": "makedirs android source root",
228 "~followup_annotations": [ 228 "~followup_annotations": [
229 "@@@STEP_LOG_LINE@python.inline@@@@", 229 "@@@STEP_LOG_LINE@python.inline@@@@",
230 "@@@STEP_LOG_LINE@python.inline@import sys, os@@@", 230 "@@@STEP_LOG_LINE@python.inline@import sys, os@@@",
231 "@@@STEP_LOG_LINE@python.inline@path = sys.argv[1]@@@", 231 "@@@STEP_LOG_LINE@python.inline@path = sys.argv[1]@@@",
232 "@@@STEP_LOG_LINE@python.inline@mode = int(sys.argv[2])@@@", 232 "@@@STEP_LOG_LINE@python.inline@mode = int(sys.argv[2])@@@",
233 "@@@STEP_LOG_LINE@python.inline@if not os.path.isdir(path):@@@", 233 "@@@STEP_LOG_LINE@python.inline@if not os.path.isdir(path):@@@",
234 "@@@STEP_LOG_LINE@python.inline@ if os.path.exists(path):@@@", 234 "@@@STEP_LOG_LINE@python.inline@ if os.path.exists(path):@@@",
235 "@@@STEP_LOG_LINE@python.inline@ print \"%s exists but is not a dir\" % path@@@", 235 "@@@STEP_LOG_LINE@python.inline@ print \"%s exists but is not a dir\" % path@@@",
236 "@@@STEP_LOG_LINE@python.inline@ sys.exit(1)@@@", 236 "@@@STEP_LOG_LINE@python.inline@ sys.exit(1)@@@",
237 "@@@STEP_LOG_LINE@python.inline@ os.makedirs(path, mode)@@@", 237 "@@@STEP_LOG_LINE@python.inline@ os.makedirs(path, mode)@@@",
238 "@@@STEP_LOG_END@python.inline@@@" 238 "@@@STEP_LOG_END@python.inline@@@"
239 ] 239 ]
240 }, 240 },
241 { 241 {
242 "cmd": [ 242 "cmd": [
243 "[SLAVE_BUILD_ROOT]/repo_copy/repo", 243 "[SLAVE_BUILD]/repo_copy/repo",
244 "init", 244 "init",
245 "-u", 245 "-u",
246 "https://android.googlesource.com/platform/manifest", 246 "https://android.googlesource.com/platform/manifest",
247 "-b", 247 "-b",
248 "android-4.3_r2.3" 248 "android-4.3_r2.3"
249 ], 249 ],
250 "cwd": "[SLAVE_BUILD_ROOT]/android-src", 250 "cwd": "[SLAVE_BUILD]/android-src",
251 "name": "repo init" 251 "name": "repo init"
252 }, 252 },
253 { 253 {
254 "cmd": [ 254 "cmd": [
255 "[SLAVE_BUILD_ROOT]/src/android_webview/buildbot/generate_local_manifest.p y", 255 "[SLAVE_BUILD]/src/android_webview/buildbot/generate_local_manifest.py",
256 "[SLAVE_BUILD_ROOT]/android-src", 256 "[SLAVE_BUILD]/android-src",
257 "external/chromium_org" 257 "external/chromium_org"
258 ], 258 ],
259 "name": "generate local manifest" 259 "name": "generate local manifest"
260 }, 260 },
261 { 261 {
262 "cmd": [ 262 "cmd": [
263 "[SLAVE_BUILD_ROOT]/repo_copy/repo", 263 "[SLAVE_BUILD]/repo_copy/repo",
264 "sync", 264 "sync",
265 "-j16", 265 "-j16",
266 "-d", 266 "-d",
267 "-f" 267 "-f"
268 ], 268 ],
269 "cwd": "[SLAVE_BUILD_ROOT]/android-src", 269 "cwd": "[SLAVE_BUILD]/android-src",
270 "name": "repo sync" 270 "name": "repo sync"
271 }, 271 },
272 { 272 {
273 "cmd": [ 273 "cmd": [
274 "ln", 274 "ln",
275 "-s", 275 "-s",
276 "[SLAVE_BUILD_ROOT]/src", 276 "[SLAVE_BUILD]/src",
277 "[SLAVE_BUILD_ROOT]/android-src/external/chromium_org" 277 "[SLAVE_BUILD]/android-src/external/chromium_org"
278 ], 278 ],
279 "name": "symlink chromium_org", 279 "name": "symlink chromium_org",
280 "seed_steps": [ 280 "seed_steps": [
281 "symlink chromium_org" 281 "symlink chromium_org"
282 ] 282 ]
283 }, 283 },
284 { 284 {
285 "cmd": [ 285 "cmd": [
286 "[BUILD_ROOT]/scripts/slave/android/with_lunch", 286 "[BUILD]/scripts/slave/android/with_lunch",
287 "[SLAVE_BUILD_ROOT]/android-src", 287 "[SLAVE_BUILD]/android-src",
288 "full-eng", 288 "full-eng",
289 "[SLAVE_BUILD_ROOT]/android-src/external/chromium_org/android_webview/tool s/gyp_webview" 289 "[SLAVE_BUILD]/android-src/external/chromium_org/android_webview/tools/gyp _webview"
290 ], 290 ],
291 "cwd": "[SLAVE_BUILD_ROOT]/android-src/external/chromium_org", 291 "cwd": "[SLAVE_BUILD]/android-src/external/chromium_org",
292 "name": "gyp_webview" 292 "name": "gyp_webview"
293 }, 293 },
294 { 294 {
295 "cmd": [ 295 "cmd": [
296 "[BUILD_ROOT]/scripts/slave/android/with_lunch", 296 "[BUILD]/scripts/slave/android/with_lunch",
297 "[SLAVE_BUILD_ROOT]/android-src", 297 "[SLAVE_BUILD]/android-src",
298 "full-eng", 298 "full-eng",
299 "[BUILD_ROOT]/scripts/slave/compile.py", 299 "[BUILD]/scripts/slave/compile.py",
300 "libwebviewchromium", 300 "libwebviewchromium",
301 "android_webview_java", 301 "android_webview_java",
302 "--build-dir", 302 "--build-dir",
303 "[SLAVE_BUILD_ROOT]", 303 "[SLAVE_BUILD]",
304 "--src-dir", 304 "--src-dir",
305 "[SLAVE_BUILD_ROOT]/android-src", 305 "[SLAVE_BUILD]/android-src",
306 "--build-tool", 306 "--build-tool",
307 "make-android", 307 "make-android",
308 "--verbose" 308 "--verbose"
309 ], 309 ],
310 "cwd": "[SLAVE_BUILD_ROOT]", 310 "cwd": "[SLAVE_BUILD]",
311 "name": "compile" 311 "name": "compile"
312 } 312 }
313 ] 313 ]
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698