forked from theforeman/foreman-packaging
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathbump_rpm.sh
executable file
·152 lines (129 loc) · 4.56 KB
/
bump_rpm.sh
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
#!/bin/bash -e
# Dependencies:
# curl (if no new version is specified)
# jq (if no new version is specified)
# python3-semver (for update-requirements)
# rpm-build (provides rpmspec)
# rpmdevtools (provides spectool)
# rubygem-gem2rpm
if [[ -z $1 ]] ; then
echo "Usage: $0 directory [version]"
exit 1
elif [[ ! -d $1 ]] ; then
echo "$1 is not a directory. It must be the full path"
exit 1
fi
program_exists() {
which "$@" &> /dev/null
}
ensure_program() {
package=${2:-$1}
if ! (program_exists "$1"); then
echo "$1 is not installed - you can install it with"
echo "sudo yum install $package"
exit 1
fi
}
bump_spec() {
SPEC_FILE=$1
NEW_VERSION=$2
NEW_VR=$NEW_VERSION
if grep -q -E '^Release:.+foremandist' $SPEC_FILE ; then
NEW_VR="${NEW_VERSION}-1%{?foremandist}%{?dist}"
fi
spectool --list-files $SPEC_FILE | cut -d' ' -f2 | grep http | xargs --no-run-if-empty -n 1 basename | xargs --no-run-if-empty git rm
rpmdev-bumpspec --comment "- Update to ${NEW_VERSION}" --new "${NEW_VR}" $SPEC_FILE
git add $SPEC_FILE
spectool --get-files $SPEC_FILE
spectool --list-files $SPEC_FILE | cut -d' ' -f2 | grep http | xargs --no-run-if-empty -n 1 basename | xargs --no-run-if-empty git annex add
}
ensure_program rpmspec rpm-build
SCRIPT_DIR=$(dirname "$(readlink -f "${BASH_SOURCE[0]}")")
ROOT=$(git rev-parse --show-toplevel)
PACKAGE_NAME=$(basename "$1")
SPEC_FILE=*.spec
CURRENT_VERSION=$(rpmspec --srpm -q --queryformat="%{version}" "$1"/$SPEC_FILE)
if [[ -z $2 ]] ; then
if [[ $PACKAGE_NAME == *rubygem-* ]]; then
ensure_program curl
ensure_program jq
GEM_NAME=$(awk '/^%global\s+gem_name/ { print $3 }' "$1"/$SPEC_FILE)
NEW_VERSION=$(curl -s "https://rubygems.org/api/v1/versions/${GEM_NAME}/latest.json" | jq -r .version)
else
echo "Unknown package type for $1; a version must be specified"
echo "Usage: $0 $1 VERSION"
exit 2
fi
else
NEW_VERSION=$2
if [[ $NEW_VERSION == "CONFLICT" ]] ; then
echo "${PACKAGE_NAME}: requested with a conflict."
echo "This means multiple packages requested different versions"
exit 1
fi
fi
if [[ $CURRENT_VERSION != "$NEW_VERSION" ]] ; then
ensure_program spectool rpmdevtools
echo "${PACKAGE_NAME}: $CURRENT_VERSION != $NEW_VERSION ; bumping"
if [[ $PACKAGE_NAME == *rubygem-* ]]; then
cd "$1"
GEM_NAME=$(awk '/^%global\s+gem_name/ { print $3 }' $SPEC_FILE)
bump_spec $SPEC_FILE "${NEW_VERSION}"
TEMPLATE="$(awk '/^# template: / { print $3 }' $SPEC_FILE)"
if [[ $TEMPLATE == 'scl' ]] || [[ $TEMPLATE == 'nonscl' ]] || [[ -z $TEMPLATE ]]; then
CHANGELOG=$(mktemp)
trap "rm -f $CHANGELOG" EXIT
sed -e '1,/%changelog/ d' $SPEC_FILE > "$CHANGELOG"
gem2rpm -t "$ROOT/gem2rpm/default.spec.erb" -o $SPEC_FILE ./*.gem
cat "$CHANGELOG" >> $SPEC_FILE
git add $SPEC_FILE
elif [[ -n $TEMPLATE ]] ; then
echo "* Updating requirements"
gem2rpm -t "$ROOT/gem2rpm/$TEMPLATE.spec.erb" ./*.gem | "$SCRIPT_DIR"/update-requirements specfile - $SPEC_FILE
if [[ $TEMPLATE == foreman_plugin ]]; then
UNPACKED_GEM_DIR=$(mktemp -d)
gem unpack --target "$UNPACKED_GEM_DIR" ./*.gem
PLUGIN_LIB="${UNPACKED_GEM_DIR}/${GEM_NAME}-${NEW_VERSION}/lib"
REQUIRES_FOREMAN=$(grep --extended-regexp --recursive --no-filename 'requires_foreman\s' "$PLUGIN_LIB" | sed -E 's/[^0-9.]//g; q')
if [[ -n $REQUIRES_FOREMAN ]]; then
sed -i "/%global foreman_min_version/ s/foreman_min_version.*/foreman_min_version $REQUIRES_FOREMAN/" $SPEC_FILE
fi
rm -rf "$UNPACKED_GEM_DIR"
fi
git add $SPEC_FILE
fi
if grep -q "# start package.json" $SPEC_FILE ; then
UNPACKED_GEM_DIR=$(mktemp -d)
gem unpack --target "$UNPACKED_GEM_DIR" ./*.gem
PACKAGE_JSON="${UNPACKED_GEM_DIR}/${GEM_NAME}-${NEW_VERSION}/package.json"
if [[ -f $PACKAGE_JSON ]] ; then
"$ROOT"/update-requirements npm "$PACKAGE_JSON" $SPEC_FILE
git add $SPEC_FILE
else
echo "Unable to find package.json in gem"
fi
rm -rf "$UNPACKED_GEM_DIR"
fi
elif [[ $PACKAGE_NAME == *nodejs-* ]]; then
NPM_NAME=$(awk '/^%global\s+npm_name/ { print $3 }' "$1"/$SPEC_FILE)
echo "Bumping NPM package"
SKIP_GIT_COMMIT=1
SOURCES=$(spectool --list-files "$1"/$SPEC_FILE)
if [[ $SOURCES == *registry.npmjs.org.tgz* ]]; then
NPM_STRATEGY='bundle'
else
NPM_STRATEGY='single'
fi
"$SCRIPT_DIR"/add_npm_package.sh "$NPM_NAME" "$NEW_VERSION" "$NPM_STRATEGY"
else
cd "$1"
bump_spec $SPEC_FILE "$NEW_VERSION"
echo "TODO:"
echo "* Verify the dependencies"
fi
if [[ "$SKIP_GIT_COMMIT" != "1" ]] ; then
git commit -m "Update $PACKAGE_NAME to $NEW_VERSION"
fi
else
echo "${PACKAGE_NAME}: $CURRENT_VERSION == $NEW_VERSION ; skipping"
fi