File: make-vistrails-src-build.py

package info (click to toggle)
vistrails 3.0~git%2B9dc22bd-2
  • links: PTS
  • area: main
  • in suites: bullseye
  • size: 62,860 kB
  • sloc: python: 314,054; xml: 42,697; sql: 4,113; php: 731; sh: 469; makefile: 253
file content (160 lines) | stat: -rwxr-xr-x 6,248 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
#!/usr/bin/python3
###########################################################
# Builds Source Release and uploads to Sourceforge        #
# Author: Daniel S. Rees (Modified by Tommy Ellqvist)     #
#                                                         #
# Description:                                            #
#     Creates and archives a tarball of a git             #
#     repository and uploads it to Sourceforge.           #
#     Intended for use as a scheduled task or             #
#     run by a buildbot.                                  #
#                                                         #
# Instructions:                                           #
#     Check out a clean version from git, then run        #
#     dist/common/prepare_release.py to update hash.      #
#     Running this script will create a tarball in the    #
#     root directory with the files in EXPORT_PATHS.      #
#     Specify sourceforge username and path to private    #
#     key to upload to sourceforge.                       #
#                                                         #
# Requires 'scp' to be installed and accessible from a    #
# default environment (use Cygwin if on Windows).         #
###########################################################

import os
import sys
import tarfile
import subprocess

####################
###### Config ######
####################

# Paths of files and/or directories to be included in the exported repository (relative to export dir)
EXPORT_PATHS = "vistrails doc examples extensions scripts CHANGELOG LICENSE".split()

# VisTrails Release Version
VT_VERSION = '2.x'

# Branch to be used to build release
VT_BRANCH = 'master'

# Hash used in the release
VT_HASH = '0fddb5bfe72c'

# Distribution Tarball name (Do not add ".tar.gz")
#TARBALL_NAME = "vistrails-src-%s-%s" % (VT_VERSION, VT_HASH)
TARBALL_NAME = "vistrails-src"

# Tarball file name
TARBALL_FILENAME = TARBALL_NAME + ".tar.gz"

# Flag determines if tarball is uploaded (Can be set manually here or conditionally in last_minute_changes())
SF_DO_UPLOAD = False

# Sourceforge User Name
SF_USERNAME = "CHANGEME"

# Sourceforge Project Name (unix name)
SF_PROJECT = "vistrails"

# Sourceforge target directory for upload (relative path from project root)
SF_DIRNAME = "vistrails/v%s"%VT_VERSION

# Path to private key for secure connection to Sourceforge (absolute path)
SF_PRIVKEY_PATH = "/path/to/private/key/CHANGEME"

# Number of upload attempts before giving up (Setting this to 0 guarantees that no upload will occur)
SF_UPLOAD_ATTEMPTS = 3

# Directory in which tarball archives are stored
ARCHIVE_DIR = "archive"


#########################################
###### Read command-line arguments ######
#########################################

# If called with 2 arguments, get [sf_username, sf_privkey_path] and upload so sourceforge
if len(sys.argv)==3:
    SF_DO_UPLOAD = True
    SF_USERNAME = sys.argv[1]
    SF_PRIVKEY_PATH = sys.argv[2]

    TARBALL_NAME = "vistrails-src-nightly"
    TARBALL_FILENAME = TARBALL_NAME + ".tar.gz"
    SF_DIRNAME = "vistrails/nightly"

#####################
###### Globals ######
#####################

# Sourceforge upload command
SF_UPLOAD_CMD = "scp -v -i %s %s %s,%s@frs.sourceforge.net:/home/frs/project/%s/%s/%s/%s" % (
                    SF_PRIVKEY_PATH, TARBALL_FILENAME, SF_USERNAME, SF_PROJECT, SF_PROJECT[0],
                    SF_PROJECT[0:2], SF_PROJECT, SF_DIRNAME)

if __name__ == "__main__":
    os.chdir(os.path.join(os.path.dirname(__file__), '..', '..', '..'))

    # prepare release
    proc = subprocess.Popen(['scripts/dist/common/prepare_release.py'],
                            stdin=subprocess.PIPE,
                            stdout=subprocess.PIPE,
                            stderr=subprocess.STDOUT)
    proc.wait()
    if proc.returncode != 0:
        print("ERROR: preparing release.")
        if proc.stdout:
            print(proc.stdout.readlines())
        sys.exit(1)

    print("Creating tarball: '%s' ..." % TARBALL_FILENAME)
    tarball = None
    try:
        tarball = tarfile.open(TARBALL_FILENAME, "w:gz")
        ignore = [os.path.join('scripts', 'dist'),
                  os.path.join('doc', 'dist')]

        def filter_(member):
            if any(member.name.startswith(ignored) for ignored in ignore):
                return None
            return member

        for fname in EXPORT_PATHS:
            tarball.add(fname, filter=filter_)
    except:
        print("ERROR: Failed to create tarball")
        raise
    finally:
        if tarball is not None:
            tarball.close()

    if SF_DO_UPLOAD and SF_UPLOAD_ATTEMPTS > 0:
        # Upload to sourceforge
        uploaded = False
        upload_attempts = 0
        while not uploaded and upload_attempts < SF_UPLOAD_ATTEMPTS:
            upload_attempts += 1
            print("Uploading tarball to Sourceforge (attempt %d of %d): '%s' ..." % (upload_attempts, SF_UPLOAD_ATTEMPTS, SF_UPLOAD_CMD))
            try:
                upload_proc = subprocess.Popen(SF_UPLOAD_CMD, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
                upload_log = upload_proc.communicate()[0]
                # Indent upload log and print
                upload_log = "\n".join(['    ' + line for line in upload_log.splitlines()])
                print("Sourceforge Upload Log (attempt %d of %d):\n%s" % (upload_attempts, SF_UPLOAD_ATTEMPTS, upload_log))
                if upload_proc.returncode != 0:
                    raise Exception("Tarball upload (attempt %d of %d) failed with return code: %s" % (upload_attempts, SF_UPLOAD_ATTEMPTS, upload_proc.returncode))
                else:
                    print("Tarball upload completed on attempt %d of %d." % (upload_attempts, SF_UPLOAD_ATTEMPTS))
                    uploaded = True
            except Exception as e:
                if upload_attempts == SF_UPLOAD_ATTEMPTS:
                    print("ERROR: Could not upload to sourceforge")
                else:
                    print(e.args[0])
        print("tarball uploaded to Sourceforge, deleting local tarball")
        if os.path.isfile(TARBALL_FILENAME):
            os.remove(TARBALL_FILENAME)

    print("Completed Source Build")