summaryrefslogtreecommitdiffstats
path: root/contrib/ci/misc.sh
blob: 9af848c766b384310140e08273c08066f2256d05 (plain)
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
#
# Miscellaneous routines.
#
# Copyright (C) 2014 Red Hat
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program.  If not, see <http://www.gnu.org/licenses/>.

if [ -z ${_MISC_SH+set} ]; then
declare -r _MISC_SH=

# Remove files and directories recursively, forcing write permissions on
# directories.
# Args: path...
function rm_rf_ro()
{
    chmod -Rf u+w -- "$@" || true
    rm -Rf -- "$@"
}

# Run "scan-build" with output to a single specified directory, instead of
# a subdirectory.
# Args: dir [scan_build_arg...]
function scan_build_single()
{
    declare -r dir="$1";    shift
    declare entry
    declare subdir
    declare status

    set +o errexit
    scan-build -o "$dir" "$@"
    status="$?"
    set -o errexit

    for entry in "$dir/"*; do
        if [ -n "${subdir+set}" ] || ! [ -d "$entry" ]; then
            echo 'Unexpected entries in scan-build output directory' >&2
            exit 1
        fi
        subdir="$entry"
    done

    mv "$subdir/"* "$dir"
    rmdir "$subdir"
    return "$status"
}

# Check if a scan-build result directory has any non-empty .plist files.
# Args: dir
function scan_check()
{
    declare -r dir="$1"
    declare f
    for f in "$dir"/*.plist; do
        if [ "`xqilla -i \"\$f\" /dev/stdin \
                <<<'count(/plist/dict/array[count(*) > 0])'`" != 0 ]; then
            return 1
        fi
    done
    return 0
}

# Extract line and function coverage percentage from a "genhtml" or "lcov
# --summary" output.
# Input: "genhtml" or "lcov --summary" output
# Output: lines funcs
function lcov_summary()
{
    sed -ne 's/^ *\(lines\|functions\)\.*: \([0-9]\+\).*$/ \2/p' |
        tr -d '\n'
    echo
}

# Check if a "genhtml" or "lcov --summary" output has a minimum coverage
# percentage of lines and functions.
# Input: "genhtml" or "lcov --summary" output
# Args: min_lines min_funcs
function lcov_check()
{
    declare -r min_lines="$1";      shift
    declare -r min_funcs="$1";      shift
    declare lines
    declare funcs

    read -r lines funcs < <(lcov_summary)
    ((lines >= min_lines && funcs >= min_funcs)) && return 0 || return 1
}

# Check if the current user belongs to a group.
# Args: group_name
function memberof()
{
    declare -r group_name="$1"
    declare group_id
    declare id
    group_id=`getent group "$group_name" | cut -d: -f3` || return 1
    for id in "${GROUPS[@]}"; do
        if [ "$id" == "$group_id" ]; then
            return 0
        fi
    done
    return 1
}

fi # _MISC_SH