From 1e76ffc7bd19cf7072e2c38d5d49b78cf94bb172 Mon Sep 17 00:00:00 2001
From: Christophe Monniez <moc@odoo.com>
Date: Wed, 23 Aug 2017 16:29:16 +0200
Subject: [PATCH] [IMP] package: various improvements

* Add an option to avoid signing deb package
* update windows vm name
* add memory to kvm as win10 needs 1G
* increase win VM timeout because win10 seems slower to start
* add an option to keep build dir for debugging purpose
---
 setup/package.py | 84 ++++++++++++++++++++++++++++++------------------
 1 file changed, 53 insertions(+), 31 deletions(-)

diff --git a/setup/package.py b/setup/package.py
index c3eedeee3e79..ef6511de4639 100755
--- a/setup/package.py
+++ b/setup/package.py
@@ -1,7 +1,7 @@
 #!/usr/bin/env python2
 # -*- coding: utf-8 -*-
 # Part of Odoo. See LICENSE file for full copyright and licensing details.
-
+from __future__ import print_function
 import optparse
 import os
 import pexpect
@@ -17,7 +17,7 @@ except ImportError:
 from contextlib import contextmanager
 from glob import glob
 from os.path import abspath, dirname, join
-from sys import stdout
+from sys import stdout, stderr
 from tempfile import NamedTemporaryFile
 
 # apt-get install rsync python-pexpect debhelper python-setuptools
@@ -40,12 +40,25 @@ PUBLISH_DIRS = {
 ADDONS_NOT_TO_PUBLISH = [
 ]
 
+
+def move_glob(source, wildcards, destination):
+    """Move files matched by wildcards from source to destination
+    wildcards can be a single string wildcard like '*.deb' or a list of wildcards
+    """
+    if not os.path.isdir(destination):
+        raise BaseException('Destination "{}" is not a directory'.format(destination))
+    if isinstance(wildcards, str):
+        wildcards = [wildcards]
+    for wc in wildcards:
+        for file_path in glob(os.path.join(source, wc)):
+            shutil.move(file_path, destination)
+
 def mkdir(d):
     if not os.path.isdir(d):
         os.makedirs(d)
 
 def system(l, chdir=None):
-    print l
+    print (l)
     if chdir:
         cwd = os.getcwd()
         os.chdir(chdir)
@@ -137,7 +150,7 @@ class OdooDocker(object):
             print('Exception during docker execution: %s:' % str(e))
             print('Error during docker execution: printing the bash output:')
             with open(self.log_file.name) as f:
-                print '\n'.join(f.readlines())
+                print('\n'.join(f.readlines()))
             raise
         finally:
             self.docker.close()
@@ -165,18 +178,18 @@ class KVM(object):
         self.login = login
 
     def timeout(self,signum,frame):
-        print "vm timeout kill",self.pid
+        print("vm timeout kill",self.pid)
         os.kill(self.pid,15)
 
     def start(self):
-        l="kvm -net nic,model=rtl8139 -net user,hostfwd=tcp:127.0.0.1:10022-:22,hostfwd=tcp:127.0.0.1:18069-:8069,hostfwd=tcp:127.0.0.1:15432-:5432 -drive".split(" ")
+        l="kvm -net nic,model=rtl8139 -net user,hostfwd=tcp:127.0.0.1:10022-:22,hostfwd=tcp:127.0.0.1:18069-:8069,hostfwd=tcp:127.0.0.1:15432-:5432 -m 1024 -drive".split(" ")
         #l.append('file=%s,if=virtio,index=0,boot=on,snapshot=on'%self.image)
         l.append('file=%s,snapshot=on'%self.image)
         #l.extend(['-vnc','127.0.0.1:1'])
         l.append('-nographic')
-        print " ".join(l)
+        print( " ".join(l))
         self.pid=os.spawnvp(os.P_NOWAIT, l[0], l)
-        time.sleep(10)
+        time.sleep(20)
         signal.alarm(2400)
         signal.signal(signal.SIGALRM, self.timeout)
         try:
@@ -210,7 +223,7 @@ class KVMWinBuildExe(KVM):
         self.rsync('%s/ %s@127.0.0.1:build/server/' % (self.o.build_dir, self.login))
         self.ssh("cd build/server/setup/win32;time make allinone;")
         self.rsync('%s@127.0.0.1:build/server/setup/win32/release/ %s/' % (self.login, self.o.build_dir), '')
-        print "KVMWinBuildExe.run(): done"
+        print("KVMWinBuildExe.run(): done")
 
 class KVMWinTestExe(KVM):
     def run(self):
@@ -251,18 +264,21 @@ def build_deb(o):
     # Append timestamp to version for the .dsc to refer the right .tar.gz
     cmd=['sed', '-i', '1s/^.*$/odoo (%s.%s) stable; urgency=low/'%(version,timestamp), 'debian/changelog']
     subprocess.call(cmd, cwd=o.build_dir)
-    deb = pexpect.spawn('dpkg-buildpackage -rfakeroot -k%s' % GPGID, cwd=o.build_dir)
-    deb.logfile = stdout
-    if GPGPASSPHRASE:
-        deb.expect_exact('Enter passphrase: ', timeout=1200)
-        deb.send(GPGPASSPHRASE + '\r\n')
-        deb.expect_exact('Enter passphrase: ')
-        deb.send(GPGPASSPHRASE + '\r\n')
-    deb.expect(pexpect.EOF, timeout=1200)
-    system(['mv', glob('%s/../odoo_*.deb' % o.build_dir)[0], '%s' % o.build_dir])
-    system(['mv', glob('%s/../odoo_*.dsc' % o.build_dir)[0], '%s' % o.build_dir])
-    system(['mv', glob('%s/../odoo_*_amd64.changes' % o.build_dir)[0], '%s' % o.build_dir])
-    system(['mv', glob('%s/../odoo_*.tar.gz' % o.build_dir)[0], '%s' % o.build_dir])
+    if not o.no_debsign:
+        deb = pexpect.spawn('dpkg-buildpackage -rfakeroot -k%s' % GPGID, cwd=o.build_dir)
+        deb.logfile = stdout
+        if GPGPASSPHRASE:
+            deb.expect_exact('Enter passphrase: ', timeout=1200)
+            deb.send(GPGPASSPHRASE + '\r\n')
+            deb.expect_exact('Enter passphrase: ')
+            deb.send(GPGPASSPHRASE + '\r\n')
+        deb.expect(pexpect.EOF, timeout=1200)
+    else:
+        subprocess.call(['dpkg-buildpackage', '-rfakeroot', '-uc', '-us'], cwd=o.build_dir)
+    # As the packages are builded in the parent of the buildir, we move them back to build_dir
+    build_dir_parent = '{}/../'.format(o.build_dir)
+    wildcards = ['odoo_{}'.format(wc) for wc in ('*.deb', '*.dsc', '*_amd64.changes', '*.tar.gz', '*.tar.xz')]
+    move_glob(build_dir_parent, wildcards, o.build_dir)
 
 def build_rpm(o):
     system(['python2', 'setup.py', '--quiet', 'bdist_rpm'], o.build_dir)
@@ -367,9 +383,10 @@ def gen_deb_package(o, published_files):
     # Remove temp directory
     shutil.rmtree(temp_path)
 
-    # Generate Release.gpg (= signed Release)
-    # Options -abs: -a (Create ASCII armored output), -b (Make a detach signature), -s (Make a signature)
-    subprocess.call(['gpg', '--default-key', GPGID, '--passphrase', GPGPASSPHRASE, '--yes', '-abs', '--no-tty', '-o', 'Release.gpg', 'Release'], cwd=os.path.join(o.pub, 'deb'))
+    if not o.no_debsign:
+        # Generate Release.gpg (= signed Release)
+        # Options -abs: -a (Create ASCII armored output), -b (Make a detach signature), -s (Make a signature)
+        subprocess.call(['gpg', '--default-key', GPGID, '--passphrase', GPGPASSPHRASE, '--yes', '-abs', '--no-tty', '-o', 'Release.gpg', 'Release'], cwd=os.path.join(o.pub, 'deb'))
 
 #---------------------------------------------------------
 # Generates an RPM repo
@@ -408,15 +425,17 @@ def options():
     op.add_option("", "--no-testing", action="store_true", help="don't test the builded packages")
 
     op.add_option("", "--no-debian", action="store_true", help="don't build the debian package")
+    op.add_option("", "--no-debsign", action="store_true", help="don't sign the debian package")
     op.add_option("", "--no-rpm", action="store_true", help="don't build the rpm package")
     op.add_option("", "--no-tarball", action="store_true", help="don't build the tarball")
     op.add_option("", "--no-windows", action="store_true", help="don't build the windows package")
 
     # Windows VM
-    op.add_option("", "--vm-winxp-image", default='/home/odoo/vm/winxp27/winxp27.vdi', help="%default")
-    op.add_option("", "--vm-winxp-ssh-key", default='/home/odoo/vm/winxp27/id_rsa', help="%default")
+    op.add_option("", "--vm-winxp-image", default='/home/odoo/vm/win1034/win10.qcow2', help="%default")
+    op.add_option("", "--vm-winxp-ssh-key", default='/home/odoo/vm/win1034/id_rsa', help="%default")
     op.add_option("", "--vm-winxp-login", default='Naresh', help="Windows login (%default)")
-    op.add_option("", "--vm-winxp-python-version", default='2.7', help="Windows Python version installed in the VM (default: %default)")
+    op.add_option("", "--vm-winxp-python-version", default='3.4', help="Windows Python version installed in the VM (default: %default)")
+    op.add_option("", "--no-remove", action="store_true", help="don't remove build dir")
 
     (o, args) = op.parse_args()
     # derive other options
@@ -468,11 +487,14 @@ def main():
                 published_files = publish(o, 'windows', ['exe'])
             except Exception as e:
                 print("Won't publish the exe release.\n Exception: %s" % str(e))
-    except:
-        pass
+    except Exception, exception_text:
+        print('Something bad happened ! : {}'.format(exception_text), file=stderr)
     finally:
-        shutil.rmtree(o.build_dir)
-        print('Build dir %s removed' % o.build_dir)
+        if o.no_remove:
+            print('Build dir "{}" not removed'.format(o.build_dir))
+        else:
+            shutil.rmtree(o.build_dir)
+            print('Build dir %s removed' % o.build_dir)
 
         if not o.no_testing:
             system("docker rm -f `docker ps -a | awk '{print $1 }'` 2>>/dev/null")
-- 
GitLab