PageRenderTime 45ms CodeModel.GetById 19ms RepoModel.GetById 0ms app.codeStats 0ms

/pypy/tool/release/make_release.py

https://bitbucket.org/yrttyr/pypy
Python | 99 lines | 82 code | 2 blank | 15 comment | 1 complexity | d6eff843aad27d02ed8122929351be79 MD5 | raw file
  1. #!/usr/bin/env python
  2. """ A tool to download correct pypy-c's from nightly build run and package them
  3. into release packages. Note: you must run apropriate buildbots first and
  4. make sure there are no failures. Use force-builds.py from the same directory.
  5. Usage: make_release.py <branchname> <version>
  6. e.g.: make_release.py release-1.4.1 1.4.1
  7. """
  8. import autopath
  9. import sys
  10. import urllib2
  11. from xml.dom import minidom
  12. import re
  13. import py
  14. from pypy.tool.udir import udir
  15. from pypy.tool.release.package import package
  16. import tarfile
  17. import os
  18. import shutil
  19. BASEURL = 'http://buildbot.pypy.org/nightly/'
  20. PAUSE = False
  21. def browse_nightly(branch,
  22. baseurl=BASEURL,
  23. override_xml=None):
  24. if override_xml is None:
  25. url = baseurl + branch + '/'
  26. xml = urllib2.urlopen(url).read()
  27. else:
  28. xml = override_xml
  29. dom = minidom.parseString(xml)
  30. refs = [node.getAttribute('href') for node in dom.getElementsByTagName('a')
  31. if 'pypy' in node.getAttribute('href')]
  32. # all refs are of form: pypy-c-{type}-{revnum}-{hghash}-{platform}.tar.bz2
  33. r = re.compile('pypy-c-([\w\d]+)-(\d+)-([0-9a-f]+)-([\w\d]+).tar.bz2$')
  34. d = {}
  35. for ref in refs:
  36. kind, revnum, hghash, platform = r.match(ref).groups()
  37. rev = int(revnum)
  38. try:
  39. lastrev, _ = d[(kind, platform)]
  40. except KeyError:
  41. lastrev = -1
  42. if rev > lastrev:
  43. d[(kind, platform)] = rev, ref
  44. return d
  45. def main(branch, release):
  46. to_download = browse_nightly(branch)
  47. tmpdir = udir.join('download')
  48. tmpdir.ensure(dir=True)
  49. alltars = []
  50. olddir = os.getcwd()
  51. try:
  52. os.chdir(str(tmpdir))
  53. print 'Using tmpdir', str(tmpdir)
  54. for (kind, platform), (rev, name) in to_download.iteritems():
  55. if platform == 'win32':
  56. print 'Ignoring %s, windows unsupported' % name
  57. else:
  58. print "Downloading %s at rev %d" % (name, rev)
  59. url = BASEURL + branch + "/" + name
  60. data = urllib2.urlopen(url).read()
  61. tmpdir.join(name).write(data, mode="wb")
  62. t = tarfile.open(str(tmpdir.join(name)))
  63. dirname = t.getmembers()[0].name
  64. t.extractall(path=str(tmpdir))
  65. if kind == 'jit':
  66. kind = ''
  67. else:
  68. kind = '-' + kind
  69. topdirname = 'pypy-%s-%s%s' % (release, platform, kind)
  70. os.system('mv %s %s' % (str(tmpdir.join(dirname)),
  71. str(tmpdir.join(topdirname))))
  72. if PAUSE:
  73. print 'Pausing, press Enter...'
  74. raw_input()
  75. name = '%s.tar.bz2' % topdirname
  76. print "Building %s" % name
  77. t = tarfile.open(name, 'w:bz2')
  78. t.add(topdirname)
  79. alltars.append(name)
  80. t.close()
  81. shutil.rmtree(str(tmpdir.join(topdirname)))
  82. for name in alltars:
  83. print "Uploading %s" % name
  84. os.system('scp %s codespeak.net:/www/pypy.org/htdocs/download' % name)
  85. finally:
  86. os.chdir(olddir)
  87. if __name__ == '__main__':
  88. if len(sys.argv) != 3:
  89. print __doc__
  90. sys.exit(1)
  91. main(sys.argv[1], release=sys.argv[2])