[cig-commits] r7409 - in cs/buildbot/trunk/buildbot: . scripts

leif at geodynamics.org leif at geodynamics.org
Fri Jun 22 20:13:18 PDT 2007


Author: leif
Date: 2007-06-22 20:13:18 -0700 (Fri, 22 Jun 2007)
New Revision: 7409

Modified:
   cs/buildbot/trunk/buildbot/config.py
   cs/buildbot/trunk/buildbot/meta.py
   cs/buildbot/trunk/buildbot/scripts/packager.py
   cs/buildbot/trunk/buildbot/scripts/shipper.py
Log:
Wrote Windows packaging stuff (not tested).

Modified: cs/buildbot/trunk/buildbot/config.py
===================================================================
--- cs/buildbot/trunk/buildbot/config.py	2007-06-23 02:25:37 UTC (rev 7408)
+++ cs/buildbot/trunk/buildbot/config.py	2007-06-23 03:13:18 UTC (rev 7409)
@@ -50,7 +50,7 @@
         from buildbot.steps.shell import WithProperties
 
         buildnumber = WithProperties("%d", "buildnumber")
-        revision = WithProperties("%s", "revision")
+        revision = WithProperties("%d", "revision")
 
         steps = [
             s(step.ShellCommand,

Modified: cs/buildbot/trunk/buildbot/meta.py
===================================================================
--- cs/buildbot/trunk/buildbot/meta.py	2007-06-23 02:25:37 UTC (rev 7408)
+++ cs/buildbot/trunk/buildbot/meta.py	2007-06-23 03:13:18 UTC (rev 7409)
@@ -7,7 +7,7 @@
 
 class Packaging(object):
     _name = 'packaging'
-    _attrs = ['directories', 'programs', 'scripts', 'libraries', 'python']
+    _attrs = ['directories', 'programs', 'scripts', 'libraries', 'python', 'urls']
 
 
 class Config(object):

Modified: cs/buildbot/trunk/buildbot/scripts/packager.py
===================================================================
--- cs/buildbot/trunk/buildbot/scripts/packager.py	2007-06-23 02:25:37 UTC (rev 7408)
+++ cs/buildbot/trunk/buildbot/scripts/packager.py	2007-06-23 03:13:18 UTC (rev 7409)
@@ -1,12 +1,227 @@
 
 import os, sys, platform
+from popen2 import Popen4
 from buildbot.meta import Config, getPackageAndVersion
 
 
+def pairUp(l):
+    pairs = []
+    i = iter(l)
+    try:
+        while True:
+            x = i.next()
+            y = i.next()
+            pairs.append((x, y))
+    except StopIteration:
+        pass
+    return pairs
+
+
+def spawn(**cmd):
+    print ' '.join(cmd)
+    child = Popen4(cmd)
+
+    child.tochild.close()
+
+    output = [line.rstrip() for line in child.fromchild]
+    status = child.wait()
+
+    exitStatus = None
+    if (os.WIFSIGNALED(status)):
+        statusStr = "signal %d" % os.WTERMSIG(status)
+    elif (os.WIFEXITED(status)):
+        exitStatus = os.WEXITSTATUS(status)
+        statusStr = "exit %d" % exitStatus
+    else:
+        statusStr = "status %d" % status
+    print "%s: %s" % (cmd[0], statusStr)
+    
+    return output
+
+
+def cygpath(*args):
+    output = spawn("cygpath", *args)
+    return output[0]
+
+
+def generateBashrc(prefix, package, info):
+    bashrc = "." package.lower() + "rc"
+    s = open(prefix + "/" + bashrc, "w")
+
+    bashrc = {
+        "line": "-" * len(info["AppVerName"]),
+        }
+    bashrc.update(info)
+
+    s.write(
+"""
+
+export PATH=/bin:$PATH
+
+echo %(line)s
+echo %(AppVerName)s
+echo %(line)s
+
+PS1='\[\e]0;\w\a\]\n\[\e[32m\]\u@\h \[\e[33m\]\w\[\e[0m\]\n\$ '
+""" % bashrc
+    )
+    
+    return bashrc
+
+
+def generateISS(info, config, bashrc, python):
+    s = open("buildbot.iss", "w")
+
+
+    # [Setup]
+    s.write(
+"""
+; Inno Setup Script generated by BuildBot
+
+[Setup]
+AppName=%(AppName)s
+AppVerName=%(AppVerName)s
+AppPublisher=Computational Infrastructure for Geodynamics
+AppPublisherURL=http://www.geodynamics.org/
+AppSupportURL=http://www.geodynamics.org/
+AppUpdatesURL=http://www.geodynamics.org/
+DefaultDirName={pf}\\%(AppName)s
+DefaultGroupName=%(AppName)s
+SourceDir=%(SourceDir)s
+
+""" % info
+    )
+
+
+    # [Tasks]
+    s.write(
+"""
+[Tasks]
+Name: "desktopicon"; Description: "Create a &desktop icon"; GroupDescription: "Additional icons:"
+
+""")
+
+
+    # [Files]
+    #  NOTE: Don't use "Flags: ignoreversion" on any shared system files
+    s.write(
+"""
+[Files]
+"""
+    )
+    for d in config.packaging.directories:
+        s.write("""Source: "%(dir)s\*"; DestDir: "{app}\\%(dir)s"; Flags: ignoreversion recursesubdirs\n""" % {'dir': d})
+    for f in config.packaging.programs:
+        s.write("""Source: "bin\\%s"; DestDir: "{app}\\bin"; Flags: ignoreversion\n""" % f)
+    for f in config.packaging.scripts:
+        s.write("""Source: "bin\\%s"; DestDir: "{app}\\bin"; Flags: ignoreversion\n""" % f)
+    for d in config.packaging.python:
+        s.write("""Source: "lib\\%(python)\\site-packages\\%(dir)s\\*"; DestDir: "{app}\\lib\\%(python)\\site-packages\\%(dir)s"; Flags: ignoreversion recursesubdirs\n""" %
+                {'dir': d, 'python', python})
+    s.write("""Source: "%(bashrc)s"; DestDir: "{app}"; Flags: ignoreversion\n""" % {'bashrc': bashrc})
+
+
+    # [Dirs]
+    s.write(
+"""
+[Dirs]
+; Cygwin demands a /tmp directory
+Name: "{app}\\tmp"
+; for our /usr mounts
+Name: "{app}\\usr"
+Name: "{app}\\usr\\bin"
+Name: "{app}\\usr\\lib"
+
+"""
+    )
+
+
+    # [Registry]
+    s.write(
+"""
+[Registry]
+Root: HKLM; Subkey: "Software\\Cigwin Solutions"; Flags: uninsdeletekey noerror
+Root: HKLM; Subkey: "Software\\Cigwin Solutions\\Cygwin"; Flags: uninsdeletekey noerror
+Root: HKLM; Subkey: "Software\\Cigwin Solutions\\Cygwin\\mounts v2"; Flags: uninsdeletekey noerror
+Root: HKLM; Subkey: "Software\\Cigwin Solutions\\Cygwin\\mounts v2\\/"; Flags: uninsdeletekey noerror
+Root: HKLM; Subkey: "Software\\Cigwin Solutions\\Cygwin\\mounts v2\\/"; Flags: noerror; ValueType: string; ValueName: "native"; ValueData: "{app}"
+Root: HKLM; Subkey: "Software\\Cigwin Solutions\\Cygwin\\mounts v2\\/"; Flags: noerror; ValueType: dword; ValueName: "flags"; ValueData: "00000002"
+Root: HKLM; Subkey: "Software\\Cigwin Solutions\\Cygwin\\mounts v2\\/usr/bin"; Flags: uninsdeletekey noerror
+Root: HKLM; Subkey: "Software\\Cigwin Solutions\\Cygwin\\mounts v2\\/usr/bin"; Flags: noerror; ValueType: string; ValueName: "native"; ValueData: "{app}\\bin"
+Root: HKLM; Subkey: "Software\\Cigwin Solutions\\Cygwin\\mounts v2\\/usr/bin"; Flags: noerror; ValueType: dword; ValueName: "flags"; ValueData: "00000002"
+Root: HKLM; Subkey: "Software\\Cigwin Solutions\\Cygwin\\mounts v2\\/usr/lib"; Flags: uninsdeletekey noerror
+Root: HKLM; Subkey: "Software\\Cigwin Solutions\\Cygwin\\mounts v2\\/usr/lib"; Flags: noerror; ValueType: string; ValueName: "native"; ValueData: "{app}\\lib"
+Root: HKLM; Subkey: "Software\\Cigwin Solutions\\Cygwin\\mounts v2\\/usr/lib"; Flags: noerror; ValueType: dword; ValueName: "flags"; ValueData: "00000002"
+; for non-admin install
+Root: HKCU; Subkey: "Software\\Cigwin Solutions"; Flags: uninsdeletekey
+Root: HKCU; Subkey: "Software\\Cigwin Solutions\\Cygwin"; Flags: uninsdeletekey
+Root: HKCU; Subkey: "Software\\Cigwin Solutions\\Cygwin\\mounts v2"; Flags: uninsdeletekey
+Root: HKCU; Subkey: "Software\\Cigwin Solutions\\Cygwin\\mounts v2\\/"; Flags: uninsdeletekey
+Root: HKCU; Subkey: "Software\\Cigwin Solutions\\Cygwin\\mounts v2\\/"; ValueType: string; ValueName: "native"; ValueData: "{app}"
+Root: HKCU; Subkey: "Software\\Cigwin Solutions\\Cygwin\\mounts v2\\/"; ValueType: dword; ValueName: "flags"; ValueData: "00000002"
+Root: HKCU; Subkey: "Software\\Cigwin Solutions\\Cygwin\\mounts v2\\/usr/bin"; Flags: uninsdeletekey
+Root: HKCU; Subkey: "Software\\Cigwin Solutions\\Cygwin\\mounts v2\\/usr/bin"; ValueType: string; ValueName: "native"; ValueData: "{app}\\bin"
+Root: HKCU; Subkey: "Software\\Cigwin Solutions\\Cygwin\\mounts v2\\/usr/bin"; ValueType: dword; ValueName: "flags"; ValueData: "00000002"
+Root: HKCU; Subkey: "Software\\Cigwin Solutions\\Cygwin\\mounts v2\\/usr/lib"; Flags: uninsdeletekey
+Root: HKCU; Subkey: "Software\\Cigwin Solutions\\Cygwin\\mounts v2\\/usr/lib"; ValueType: string; ValueName: "native"; ValueData: "{app}\\lib"
+Root: HKCU; Subkey: "Software\\Cigwin Solutions\\Cygwin\\mounts v2\\/usr/lib"; ValueType: dword; ValueName: "flags"; ValueData: "00000002"
+
+"""
+    )
+
+
+    # [INI]
+    s.write("""[INI]\n""")
+    urls = ["cig", "http://www.geodynamics.org/"] + config.urls
+    urls = pairUp(urls)
+    for filename, url in urls:
+        s.write("""Filename: "{app}\\%(filename)s.url"; Section: "InternetShortcut"; Key: "URL"; String: "%(url)s"\n""" %
+                {'filename': filename, 'url': url})
+
+
+    # [Icons]
+    s.write(
+"""
+[Icons]
+Name: "{group}\\%(AppName)s"; Filename: "{app}\\bin\\bash.exe"; Parameters: "--init-file %(bashrc)s -i"; WorkingDir: "{app}"; IconFilename: "{app}\\cig.ico"
+Name: "{userdesktop}\\%(AppName)s"; Filename: "{app}\\bin\\bash.exe"; Tasks: desktopicon; Parameters: "--init-file %(bashrc)s -i"; WorkingDir: "{app}"; IconFilename: "{app}\\cig.ico"
+""" % {'AppName': info['AppName'], 'bashrc': bashrc}
+    )
+    for filename, url in urls:
+        s.write("""Name: "{group}\CIG"; Filename: "{app}\cig.url"\n""" % (displayName, filename))
+    s.write(
+"""
+Name: "{group}\Uninstall %(AppName)s"; Filename: "{uninstallexe}"
+
+""" % info
+    )
+
+    return
+
+    
+def createWindowsInstaller(python, prefix, package, version, config):
+
+    sourceDir = cygpath("-w", prefix)
+    
+    info = {
+        "AppName": package,
+        "AppVerName": package + " v" + version,
+        "SourceDir": sourceDir,
+        }
+
+    bashrc = generateBashrc(prefix, package, info)
+
+    generateISS(python, info, config, bashrc, python)
+
+    return
+
+
 def mkpkg():
     buildnumber = int(sys.argv[1])
     revision = sys.argv[2]
-    if not revision:
+    if revision:
+        revision = "r" + revision
+    else:
         revision = "forced"
     opSys = platform.system().lower()
     arch = opSys + "-" + platform.machine()
@@ -71,16 +286,26 @@
 
     os.chdir(workdir)
 
-    distdir_arch = distdir + "-" + arch
-    os.system("rm " + distdir_arch)
-    os.system("ln -s " + prefix + " " + distdir_arch)
-    packingList = [distdir_arch + "/" + m for m in packingList]
-    archive = distdir_arch + ".tar.gz"
-    taggedArchive = tag + "-" + archive
-    os.system("tar cvzf " + archive + " " + " ".join(packingList))
-    if status != 0:
-        sys.exit("tar: exit %d" % status)
+    if opSys == "darwin" or opSys == "linux":
+        # No .dmg on Mac for now.
+        distdir_arch = distdir + "-" + arch
+        os.system("rm " + distdir_arch)
+        os.system("ln -s " + prefix + " " + distdir_arch)
+        packingList = [distdir_arch + "/" + m for m in packingList]
+        archive = distdir_arch + ".tar.gz"
+        taggedArchive = tag + "-" + archive
+        os.system("tar cvzf " + archive + " " + " ".join(packingList))
+        if status != 0:
+            sys.exit("tar: exit %d" % status)
 
-    os.system("mv " + archive + " " + taggedArchive)
+        os.system("mv " + archive + " " + taggedArchive)
+    elif opSys == "cygwin":
+        createWindowsInstaller(python, prefix, package, version, config)
+    else:
+        sys.exit("unknown OS: " + opSys)
 
     return
+
+
+if __name__ == "__main__":
+    mkpkg("0001", "1234")

Modified: cs/buildbot/trunk/buildbot/scripts/shipper.py
===================================================================
--- cs/buildbot/trunk/buildbot/scripts/shipper.py	2007-06-23 02:25:37 UTC (rev 7408)
+++ cs/buildbot/trunk/buildbot/scripts/shipper.py	2007-06-23 03:13:18 UTC (rev 7409)
@@ -8,5 +8,11 @@
     if not revision:
         revision = "forced"
     tag = "b%04d-%s" % (buildnumber, revision)
-    command = "scp -o BatchMode=yes " + tag + "* www.geodynamics.org:/home/buildbot/public_html/shipping"
+    files = tag + "*"
+    # BuildBot sets restrictive umask.
+    command = "chmod go+r " + files
+    print command
     os.system(command)
+    command = "scp -o BatchMode=yes " + files + " www.geodynamics.org:/home/buildbot/public_html/shipping"
+    print command
+    os.system(command)



More information about the cig-commits mailing list