Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
freebsd
GitHub Repository: freebsd/freebsd-ports-kde
Path: blob/main/Mk/Scripts/do-patch.sh
16460 views
1
#!/bin/sh
2
#
3
# MAINTAINER: [email protected]
4
5
set -e
6
set -o pipefail
7
8
. "${dp_SCRIPTSDIR}/functions.sh"
9
10
validate_env dp_BZCAT dp_CAT dp_DISTDIR dp_ECHO_MSG dp_EXTRA_PATCHES \
11
dp_EXTRA_PATCH_TREE dp_GZCAT dp_OPSYS dp_PATCH dp_PATCHDIR \
12
dp_PATCHFILES dp_PATCH_ARGS dp_PATCH_DEBUG_TMP dp_PATCH_DIST_ARGS \
13
dp_PATCH_SILENT dp_PATCH_WRKSRC dp_PKGNAME dp_PKGORIGIN \
14
dp_UNZIP_NATIVE_CMD dp_XZCAT
15
16
[ -n "${DEBUG_MK_SCRIPTS}" -o -n "${DEBUG_MK_SCRIPTS_DO_PATCH}" ] && set -x
17
18
set -u
19
20
has_failed=""
21
22
cat_file() {
23
case "$1" in
24
*.Z|*.gz)
25
${dp_GZCAT} "$1"
26
;;
27
*.bz2)
28
${dp_BZCAT} "$1"
29
;;
30
*.xz)
31
${dp_XZCAT} "$1"
32
;;
33
*.zip)
34
${dp_UNZIP_NATIVE_CMD} -p "$1"
35
;;
36
*)
37
${dp_CAT} "$1"
38
;;
39
esac
40
}
41
42
# If we want to continue when one patch fails, set the flag, otherwise, abort.
43
if [ -n "${dp_PATCH_CONTINUE_ON_FAIL}" ]; then
44
failure_fatal() {
45
has_failed=1
46
}
47
else
48
failure_fatal() {
49
false
50
}
51
fi
52
53
apply_one_patch() {
54
local file="$1"
55
local msg="$2"
56
local verbose="$3"
57
shift 3
58
local patch_strip=""
59
60
case ${file} in
61
*:-p[0-9])
62
patch_strip=${file##*:}
63
file=${file%:-p[0-9]}
64
;;
65
esac
66
67
if [ -n "${verbose}" -o -n "${dp_PATCH_DEBUG_TMP}" ]; then
68
${dp_ECHO_MSG} "===> Applying ${msg} ${file}${patch_strip:+ with ${patch_strip}}"
69
fi
70
71
if ! cat_file "$file" | do_patch "$@" ${patch_strip}; then
72
${dp_ECHO_MSG} "===> FAILED Applying ${msg} ${file}${patch_strip:+ with ${patch_strip}}"
73
false
74
fi
75
}
76
77
do_patch() {
78
"${dp_PATCH}" -d "${dp_PATCH_WRKSRC}" "$@"
79
}
80
81
patch_from_directory() {
82
local dir="$1"
83
local msg="$2"
84
local patches_applied=""
85
local patches_failed=""
86
87
if [ -d "${dir}" ]; then
88
cd "${dir}"
89
90
if [ "$(echo patch-*)" != "patch-*" ]; then
91
92
${dp_ECHO_MSG} "===> Applying ${msg} patches for ${dp_PKGNAME} from ${dir}"
93
94
95
for i in patch-*; do
96
case ${i} in
97
*.orig|*.rej|*~|*,v)
98
${dp_ECHO_MSG} "====> IGNORING patchfile ${i}"
99
;;
100
*)
101
if apply_one_patch "${i}" "${msg}" "" ${dp_PATCH_ARGS}; then
102
patches_applied="${patches_applied} ${i}"
103
else
104
patches_failed="${patches_failed} ${i}"
105
if ! failure_fatal; then
106
break
107
fi
108
fi
109
;;
110
esac
111
done
112
113
if [ -n "${patches_failed}" -a "${dp_PATCH_SILENT}" != "yes" ]; then
114
if [ -n "${patches_applied}" ]; then
115
${dp_ECHO_MSG} "===> Cleanly applied ${msg} patch(es) ${patches_applied}"
116
fi
117
${dp_ECHO_MSG} "===> FAILED to apply cleanly ${msg} patch(es) ${patches_failed}"
118
# If we want to stop after the first failure, this returns false,
119
# let its return value bubble up here and stop everything.
120
failure_fatal
121
fi
122
fi
123
fi
124
}
125
126
if [ -n "${dp_PATCHFILES}" ]; then
127
${dp_ECHO_MSG} "===> Applying distribution patches for ${dp_PKGNAME}"
128
cd "${dp_DISTDIR}"
129
for i in ${dp_PATCHFILES}; do
130
if ! apply_one_patch "${i}" \
131
"distribution patch" \
132
"" \
133
${dp_PATCH_DIST_ARGS}; then
134
failure_fatal
135
fi
136
done
137
fi
138
139
if [ -n "${dp_EXTRA_PATCHES}" ]; then
140
for i in ${dp_EXTRA_PATCHES}; do
141
if [ -d "${i}" ]; then
142
patch_from_directory "${i}" \
143
"extra patch"
144
else
145
if ! apply_one_patch "${i}" \
146
"extra patch" \
147
"verbose" \
148
${dp_PATCH_ARGS}; then
149
failure_fatal
150
fi
151
fi
152
done
153
fi
154
155
patch_from_directory "${dp_PATCHDIR}" "${dp_OPSYS}"
156
157
if [ -n "${dp_EXTRA_PATCH_TREE}" ]; then
158
patch_from_directory "${dp_EXTRA_PATCH_TREE}/${dp_PKGORIGIN}" "local"
159
fi
160
161
if [ -n "$has_failed" ]; then
162
if [ -n "${dp_PATCH_DEBUG_TMP}" ]; then
163
${dp_ECHO_MSG} "==> Some patches failed to apply cleanly."
164
${dp_ECHO_MSG} "==> Look for FAILED messages above."
165
fi
166
false
167
fi
168
169
170