common_utils.sh 4 KB
Newer Older
1
2
#!/bin/bash
# Utilities for both OSX and Docker
3
# Python should be on the PATH
4
5
set -e

6
MULTIBUILD_DIR=$(dirname "${BASH_SOURCE[0]}")
7
if [ $(uname) == "Darwin" ]; then IS_OSX=1; fi
8

9
10
11
12
function abspath {
    python -c "import os.path; print(os.path.abspath('$1'))"
}

13
14
15
16
17
function relpath {
    # Path of first input relative to second (or $PWD if not specified)
    python -c "import os.path; print(os.path.relpath('$1','${2:-$PWD}'))"
}

Matthew Brett's avatar
Matthew Brett committed
18
19
20
21
function realpath {
    python -c "import os; print(os.path.realpath('$1'))"
}

22
23
24
25
26
27
28
29
30
31
32
33
34
35
function lex_ver {
    # Echoes dot-separated version string padded with zeros
    # Thus:
    # 3.2.1 -> 003002001
    # 3     -> 003000000
    echo $1 | awk -F "." '{printf "%03d%03d%03d", $1, $2, $3}'
}

function is_function {
    set +e
    $(declare -Ff "$1") > /dev/null && echo true
    set -e
}

36
37
38
39
40
41
42
43
44
45
46
47
function gh-clone {
    git clone https://github.com/$1
}

function rm_mkdir {
    # Remove directory if present, then make directory
    local path=$1
    [ -z "$path" ] && echo "Need not-empty path" && exit 1
    [ -d "$path" ] && rm -rf $path
    mkdir $path
}

48
49
50
51
52
53
54
55
56
57
58
59
60
function clean_code {
    local repo_dir=${1:-$REPO_DIR}
    local build_commit=${2:-$BUILD_COMMIT}
    [ -z "$repo_dir" ] && echo "repo_dir not defined" && exit 1
    [ -z "$build_commit" ] && echo "build_commit not defined" && exit 1
    (cd $repo_dir \
        && git fetch origin \
        && git checkout $build_commit \
        && git clean -fxd \
        && git reset --hard \
        && git submodule update --init --recursive)
}

61
62
63
64
65
66
67
function build_wheel_cmd {
    # Builds wheel with named command, puts into $WHEEL_SDIR
    #
    # Parameters:
    #     cmd  (optional, default "pip_wheel_cmd"
    #        Name of command for builing wheel
    #     repo_dir  (optional, default $REPO_DIR)
68
69
70
71
72
73
    #
    # Depends on
    #     REPO_DIR  (or via input argument)
    #     WHEEL_SDIR  (optional, default "wheelhouse")
    #     BUILD_DEPENDS (optional, default "")
    #     MANYLINUX_URL (optional, default "") (via pip_opts function)
74
75
    local cmd=${1:-pip_wheel_cmd}
    local repo_dir=${2:-$REPO_DIR}
76
77
78
    [ -z "$repo_dir" ] && echo "repo_dir not defined" && exit 1
    local wheelhouse=$(abspath ${WHEEL_SDIR:-wheelhouse})
    if [ -n $(is_function "pre_build") ]; then pre_build; fi
79
80
81
82
    if [ -n "$BUILD_DEPENDS" ]; then
        pip install $(pip_opts) $BUILD_DEPENDS
    fi
    (cd $repo_dir && $cmd $wheelhouse)
83
84
85
    repair_wheelhouse $wheelhouse
}

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
function pip_wheel_cmd {
    local abs_wheelhouse=$1
    pip wheel $(pip_opts) -w $abs_wheelhouse --no-deps .
}

function bdist_wheel_cmd {
    # Builds wheel with bdist_wheel, puts into wheelhouse
    #
    # It may sometimes be useful to use bdist_wheel for the wheel building
    # process.  For example, versioneer has problems with versions which are
    # fixed with bdist_wheel:
    # https://github.com/warner/python-versioneer/issues/121
    local abs_wheelhouse=$1
    python setup.py bdist_wheel
    cp dist/*.whl $abs_wheelhouse
}

function build_wheel {
    # Standard wheel building command with pip wheel
    build_wheel_cmd "pip_wheel_cmd" $@
}

function build_bdist_wheel {
    # Wheel building with bdist_wheel. See bdist_wheel_cmd
    build_wheel_cmd "bdist_wheel_cmd" $@
}

113
114
function pip_opts {
    [ -n "$MANYLINUX_URL" ] && echo "--find-links $MANYLINUX_URL"
115
}
116
117
118

function install_wheel {
    # Install test dependencies and built wheel
119
    #
120
    # Pass any input flags to pip install steps
121
    #
122
    # Depends on:
123
124
125
126
    #     WHEEL_SDIR  (optional, default "wheelhouse")
    #     TEST_DEPENDS  (optional, default "")
    #     MANYLINUX_URL (optional, default "") (via pip_opts function)
    local wheelhouse=$(abspath ${WHEEL_SDIR:-wheelhouse})
127
    if [ -n "$TEST_DEPENDS" ]; then
128
        pip install $(pip_opts) $@ $TEST_DEPENDS
129
130
    fi
    # Install compatible wheel
131
    pip install $(pip_opts) $@ \
132
        $(python $MULTIBUILD_DIR/supported_wheels.py $wheelhouse/*.whl)
133
}
134
135
136
137
138
139
140

function install_run {
    # Depends on function `run_tests` defined in `config.sh`
    install_wheel
    mkdir tmp_for_test
    (cd tmp_for_test && run_tests)
}