Rietveld Code Review Tool
Help | Bug tracker | Discussion group | Source code

Delta Between Two Patch Sets: sitescripts/extensions/bin/createNightlies.py

Issue 5092904657747968: Issue 356 - Update devbuild in the Chrome Web Store (Closed)
Left Patch Set: Use Client ID for installed applications Created April 20, 2014, 8:46 p.m.
Right Patch Set: Addressed comments Created April 21, 2014, 8:45 p.m.
Left:
Right:
Use n/p to move between diff chunks; N/P to move between comments.
Jump to:
Left: Side by side diff | Download
Right: Side by side diff | Download
« no previous file with change/comment | « .sitescripts.example ('k') | sitescripts/extensions/utils.py » ('j') | no next file with change/comment »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
LEFTRIGHT
1 # coding: utf-8 1 # coding: utf-8
2 2
3 # This file is part of the Adblock Plus web scripts, 3 # This file is part of the Adblock Plus web scripts,
4 # Copyright (C) 2006-2013 Eyeo GmbH 4 # Copyright (C) 2006-2013 Eyeo GmbH
5 # 5 #
6 # Adblock Plus is free software: you can redistribute it and/or modify 6 # Adblock Plus is free software: you can redistribute it and/or modify
7 # it under the terms of the GNU General Public License version 3 as 7 # it under the terms of the GNU General Public License version 3 as
8 # published by the Free Software Foundation. 8 # published by the Free Software Foundation.
9 # 9 #
10 # Adblock Plus is distributed in the hope that it will be useful, 10 # Adblock Plus is distributed in the hope that it will be useful,
11 # but WITHOUT ANY WARRANTY; without even the implied warranty of 11 # but WITHOUT ANY WARRANTY; without even the implied warranty of
12 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 # GNU General Public License for more details. 13 # GNU General Public License for more details.
14 # 14 #
15 # You should have received a copy of the GNU General Public License 15 # You should have received a copy of the GNU General Public License
16 # along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>. 16 # along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>.
17 17
18 """ 18 """
19 19
20 Nightly builds generation script 20 Nightly builds generation script
21 ================================ 21 ================================
22 22
23 This script generates nightly builds of extensions, together 23 This script generates nightly builds of extensions, together
24 with changelogs and documentation. 24 with changelogs and documentation.
25 25
26 """ 26 """
27 27
28 import sys, os, os.path, codecs, subprocess, ConfigParser, traceback, json, hash lib 28 import sys, os, os.path, codecs, subprocess, ConfigParser, traceback, json, hash lib
29 import tempfile, re, shutil, urlparse, pipes, time, urllib2 29 import tempfile, re, shutil, urlparse, pipes, time, urllib2, struct
30 from datetime import datetime 30 from datetime import datetime
31 from urllib import urlencode 31 from urllib import urlencode
32 from xml.dom.minidom import parse as parseXml 32 from xml.dom.minidom import parse as parseXml
33 from sitescripts.utils import get_config, setupStderr, get_template 33 from sitescripts.utils import get_config, setupStderr, get_template
34 from sitescripts.extensions.utils import compareVersions, Configuration 34 from sitescripts.extensions.utils import compareVersions, Configuration
35 35
36 MAX_BUILDS = 50 36 MAX_BUILDS = 50
37 37
38 38
39 class NightlyBuild(object): 39 class NightlyBuild(object):
(...skipping 370 matching lines...) Expand 10 before | Expand all | Expand 10 after
410 410
411 # upload a new version with the Chrome Web Store API 411 # upload a new version with the Chrome Web Store API
412 # https://developer.chrome.com/webstore/using_webstore_api#uploadexisitng 412 # https://developer.chrome.com/webstore/using_webstore_api#uploadexisitng
413 413
414 request = urllib2.Request('https://www.googleapis.com/upload/chromewebstore/ v1.1/items/' + self.config.galleryID) 414 request = urllib2.Request('https://www.googleapis.com/upload/chromewebstore/ v1.1/items/' + self.config.galleryID)
415 request.get_method = lambda: 'PUT' 415 request.get_method = lambda: 'PUT'
416 request.add_header('Authorization', '%s %s' % (response['token_type'], respo nse['access_token'])) 416 request.add_header('Authorization', '%s %s' % (response['token_type'], respo nse['access_token']))
417 request.add_header('x-goog-api-version', '2') 417 request.add_header('x-goog-api-version', '2')
418 418
419 with open(self.path, 'rb') as file: 419 with open(self.path, 'rb') as file:
420 request.add_header('Content-Length', '%d' % os.fstat(file.fileno()).st_siz e) 420 if file.read(8) != 'Cr24\x02\x00\x00\x00':
421 raise Exception('not a chrome extension or unknown CRX version')
422
423 # skip public key and signature
424 file.seek(sum(struct.unpack('<II', file.read(8))), os.SEEK_CUR)
425
426 request.add_header('Content-Length', os.fstat(file.fileno()).st_size - fil e.tell())
421 request.add_data(file) 427 request.add_data(file)
422 428
423 response = json.load(urllib2.urlopen(request)) 429 response = json.load(urllib2.urlopen(request))
424 430
425 if response['uploadState'] == 'FAILURE': 431 if response['uploadState'] == 'FAILURE':
426 raise Exception(response['itemError']) 432 raise Exception(response['itemError'])
427 433
428 def run(self): 434 def run(self):
429 """ 435 """
430 Run the nightly build process for one extension 436 Run the nightly build process for one extension
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
465 471
466 if self.config.type == 'ie': 472 if self.config.type == 'ie':
467 self.writeIEUpdateManifest(versions) 473 self.writeIEUpdateManifest(versions)
468 474
469 # update index page 475 # update index page
470 self.updateIndex(versions) 476 self.updateIndex(versions)
471 477
472 # update nightlies config 478 # update nightlies config
473 self.config.latestRevision = self.revision 479 self.config.latestRevision = self.revision
474 480
475 if self.config.clientID and self.config.clientSecret and self.config.refre shToken: 481 if self.type == 'chrome' and self.config.clientID and self.config.clientSe cret and self.config.refreshToken:
476 self.uploadToChromeWebStore() 482 self.uploadToChromeWebStore()
477 finally: 483 finally:
478 # clean up 484 # clean up
479 if self.tempdir: 485 if self.tempdir:
480 shutil.rmtree(self.tempdir, ignore_errors=True) 486 shutil.rmtree(self.tempdir, ignore_errors=True)
481 487
482 488
483 def main(): 489 def main():
484 """ 490 """
485 main function for createNightlies.py 491 main function for createNightlies.py
(...skipping 17 matching lines...) Expand all
503 except Exception, ex: 509 except Exception, ex:
504 print >>sys.stderr, "The build for %s failed:" % repo 510 print >>sys.stderr, "The build for %s failed:" % repo
505 traceback.print_exc() 511 traceback.print_exc()
506 512
507 file = open(nightlyConfigFile, 'wb') 513 file = open(nightlyConfigFile, 'wb')
508 nightlyConfig.write(file) 514 nightlyConfig.write(file)
509 515
510 516
511 if __name__ == '__main__': 517 if __name__ == '__main__':
512 main() 518 main()
LEFTRIGHT

Powered by Google App Engine
This is Rietveld