-
Notifications
You must be signed in to change notification settings - Fork 8
Expand file tree
/
Copy pathidentify-packages
More file actions
executable file
·129 lines (113 loc) · 4.35 KB
/
Copy pathidentify-packages
File metadata and controls
executable file
·129 lines (113 loc) · 4.35 KB
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
#!/bin/bash
set -euo pipefail
PACKAGES_DIR="onboarded_packages"
REVISION="$1"
RESULT_FILE="$2"
EMPTY_RESULT_FILE="$3"
echo "[DEBUG] REVISION=${REVISION} RESULT_FILE=${RESULT_FILE}" >&2
git remote -v
# Extract the "version" value from a JSON file using grep/sed.
# jq not available in the Tekton SCRIPT_RUNNER_IMAGE
extract_version() {
grep -o '"version": *"[^"]*"' | sed 's/.*"version": *"\([^"]*\)".*/\1/' || true
}
# Extract the "sdist_url" value from a JSON file using grep/sed.
# Returns empty string if the field is absent.
# jq not available in the Tekton SCRIPT_RUNNER_IMAGE
extract_sdist_url() {
grep -o '"sdist_url": *"[^"]*"' | sed 's/.*"sdist_url": *"\([^"]*\)".*/\1/' || true
}
# Extract package names from the build_extra JSON array.
# Handles both single-line and multi-line formatted arrays.
# jq not available in the Tekton SCRIPT_RUNNER_IMAGE
extract_build_extra() {
tr -d '\n' | \
sed -n 's/.*"build_extra"[[:space:]]*:[[:space:]]*\[\([^]]*\)\].*/\1/p' | \
tr ',' '\n' | \
sed 's/^[[:space:]]*"//; s/"[[:space:]]*$//; /^$/d'
}
# Find JSON files that were added or modified compared to the revision
set +e
CHANGED_FILES="$(git diff --name-only --diff-filter=AM "${REVISION}" -- "${PACKAGES_DIR}/")"
err="$?"
set -e
if [[ $err -ne 0 ]]; then
echo "[DEBUG] git diff failed (exit code ${err}), assuming all packages are new" >&2
CHANGED_FILES="$(find "${PACKAGES_DIR}" -name '*.json' -type f)"
fi
NEW_PACKAGES=""
for f in $CHANGED_FILES; do
if [[ -f "$f" ]]; then
PKG_NAME="$(basename "$f" .json)"
CURRENT_VERSION="$(extract_version < "$f")"
if [[ -z "$CURRENT_VERSION" ]]; then
continue
fi
OLD_VERSION="$(git show "${REVISION}:${f}" 2>/dev/null | extract_version || true)"
if [[ "$CURRENT_VERSION" != "$OLD_VERSION" ]]; then
SDIST_URL="$(extract_sdist_url < "$f")"
if [[ -n "$SDIST_URL" ]]; then
NEW_PACKAGES="${NEW_PACKAGES}${PKG_NAME} @ ${SDIST_URL}@${CURRENT_VERSION}"$'\n'
else
NEW_PACKAGES="${NEW_PACKAGES}${PKG_NAME}==${CURRENT_VERSION}"$'\n'
fi
fi
fi
done
NEW_PACKAGES="$(echo -n "$NEW_PACKAGES" | sed '/^$/d')"
# Resolve build_extra dependencies for each package to be built
EXTRA_PACKAGES=""
while IFS= read -r pkg_entry; do
[[ -z "$pkg_entry" ]] && continue
if [[ "$pkg_entry" == *" @ "* ]]; then
pkg_name="${pkg_entry%% @*}"
else
pkg_name="${pkg_entry%%==*}"
fi
pkg_file="${PACKAGES_DIR}/${pkg_name}.json"
if [[ -f "$pkg_file" ]]; then
extras="$(extract_build_extra < "$pkg_file")" || true
for dep in $extras; do
dep_file="${PACKAGES_DIR}/${dep}.json"
if [[ ! -f "$dep_file" ]]; then
echo "[ERROR] build_extra dependency '${dep}' in ${pkg_name}.json has no corresponding ${dep_file}" >&2
exit 1
fi
dep_version="$(extract_version < "$dep_file")"
if [[ -z "$dep_version" ]]; then
echo "[ERROR] Could not extract version from ${dep_file}" >&2
exit 1
fi
dep_sdist_url="$(extract_sdist_url < "$dep_file")"
if [[ -n "$dep_sdist_url" ]]; then
dep_entry="${dep} @ ${dep_sdist_url}@${dep_version}"
else
dep_entry="${dep}==${dep_version}"
fi
if ! echo "$NEW_PACKAGES" | grep -Fqx "$dep_entry" && \
! echo "$EXTRA_PACKAGES" | grep -Fqx "$dep_entry"; then
EXTRA_PACKAGES="${EXTRA_PACKAGES}${dep_entry}"$'\n'
fi
done
fi
done <<< "$NEW_PACKAGES"
EXTRA_PACKAGES="$(echo -n "$EXTRA_PACKAGES" | sed '/^$/d')"
if [[ -n "$EXTRA_PACKAGES" ]]; then
echo "Extra dependencies to build:" >&2
echo "${EXTRA_PACKAGES}" >&2
NEW_PACKAGES="${NEW_PACKAGES}"$'\n'"${EXTRA_PACKAGES}"
NEW_PACKAGES="$(echo -n "$NEW_PACKAGES" | sed '/^$/d')"
fi
echo "Packages to build:"
echo "${NEW_PACKAGES}"
NEW_PACKAGES_JSON='[]'
if [[ -n "$NEW_PACKAGES" ]]; then
NEW_PACKAGES_JSON="$(<<< "${NEW_PACKAGES}" sed -e ':a;N;$!ba;s/\n/", "/g' | sed -e 's/^/\["/' -e 's/$/"\]/')"
fi
echo "${NEW_PACKAGES_JSON}" | tee "${RESULT_FILE}"
if [[ "${NEW_PACKAGES_JSON}" == "[]" ]]; then
printf 'no-packages' | tee "${EMPTY_RESULT_FILE}"
else
printf 'has-packages' | tee "${EMPTY_RESULT_FILE}"
fi
echo