2 # update_git_source_package.sh: (c) 2023 Jo-Philipp Wich <jo@mein.io>
3 # Licensed under the terms of the Apache License, Version 2.0
9 [ -n "$MAKEFILE" ] ||
{
11 Usage: $0 <package name or makefile path> [revision] [topdir]
13 Update an OpenWrt package Makefile with PKG_SOURCE_PROTO:=git to
14 the given upstream revision (or 'HEAD' if omitted).
16 The script either accepts a package name, like "netifd" or
17 an absolute or relative path to a Makefile, e.g.
18 "./package/utils/ucode/Makefile".
20 If the revision argument is ommitted, the package is updated
21 to the current HEAD of the remote Git repository.
23 By default, this script tries to infer the buildroot directory
24 from the package Makefile path but it may be overridden by
25 passing it as 3rd argument. This is useful in situation where
26 the Makefile to update does not reside within an OpenWrt buildroot.
28 On success, the package Makefile is automatically modified and
29 the resulting changes are committed in the currently checked
30 buildroot branch using a standard commit message format.
36 MAKE
=$
(which gmake
) || MAKE
=$
(which make)
37 FIND
=$
(which gfind
) || FIND
=$
(which find)
40 echo "Unable to locate `make` executable" >&2
45 echo "Unable to locate `find` executable" >&2
49 [ -e "$MAKEFILE" ] ||
{
50 MAKEFILE
=$
("$FIND" "${TOPDIR:-.}/package/" -type f
-path "*/$MAKEFILE/Makefile" |
head -n1)
53 [ -f "$MAKEFILE" ] ||
{
54 echo "Usage: $0 <path/to/Makefile> [target commit] [path/to/buildroot/topdir]"
58 grep -sq BuildPackage
"$MAKEFILE" ||
{
59 echo "The file '$MAKEFILE' does not appear to be an OpenWrt package Makefile." >&2
64 TOPDIR
=$
(cd "$(dirname "${MAKEFILE%/*}")"; pwd)
66 while [ "$TOPDIR" != "/" ]; do
67 TOPDIR
=$
(dirname "$TOPDIR")
68 [ -f "$TOPDIR/rules.mk" ] && break
71 [ -f "$TOPDIR/rules.mk" ] ||
{
72 echo "Unable to determine buildroot directory." >&2
78 export PATH
="$TOPDIR/staging_dir/host/bin:$PATH"
81 "$MAKE" --no-print-directory -C "$(dirname "$MAKEFILE")" \
84 var.PKG_SOURCE_PROTO \
87 var.PKG_SOURCE_VERSION \
91 case "$PKG_SOURCE_PROTO:$PKG_SOURCE_URL" in
92 git
:http
://*|git
:https
://*|git
:git
://*|git
:file:*)
96 echo "Unsupported combination of source protocol ('$PKG_SOURCE_PROTO') and url ('$PKG_SOURCE_URL')." >&2
103 for signal
in INT TERM EXIT
; do
105 [ -d "$TEMP_GIT_DIR" ] && rm -rf "$TEMP_GIT_DIR";
106 git -C "$(dirname "$MAKEFILE")" checkout --quiet "$(basename "$MAKEFILE")"
110 TEMP_GIT_DIR
=$
(mktemp
-d) ||
{
111 echo "Unable to create temporary Git directory." >&2
115 git clone
--bare "$PKG_SOURCE_URL" "$TEMP_GIT_DIR" ||
{
116 echo "Unable to clone Git repository '$PKG_SOURCE_URL'." >&2
120 GIT_LOG
="$(git -C "$TEMP_GIT_DIR" log \
121 --reverse --no-merges \
124 "$PKG_SOURCE_VERSION..
$COMMIT" \
126 echo "Unable to determine changes from commit '$PKG_SOURCE_VERSION' to '$COMMIT'." >&2
130 GIT_DATE_COMMIT
=$
(git
-C "$TEMP_GIT_DIR" log \
131 -1 --format='%cd %H' \
132 --date='format:%Y-%m-%d' \
135 echo "Unable to determine target commit ID and date." >&2
142 git -C "$TEMP_GIT_DIR" log \
144 "$PKG_SOURCE_VERSION..
$COMMIT" \
145 | sed -rne 's%^Fixes:(([ ,]*([[:alnum:]_]*#[0-9]+|https?://[^[:space:]]+))+)$%\1%p'
151 GH#[0-9]*|openwrt#[0-9]*)
152 echo "https
://github.com
/openwrt
/openwrt
/issues
/${issue#*#}"
155 echo "https
://bugs.openwrt.org
/?task_id
=${issue#FS#}"
157 [a-zA-Z0-9_]*#[0-9]*)
158 echo "https
://github.com
/openwrt
/${issue%#*}/issues
/${issue#*#}"
161 case "$PKG_SOURCE_URL" in
163 echo "${PKG_SOURCE_URL%/}/issues
/${issue#\#}"
165 *://git.openwrt.org/project/*)
166 project=${PKG_SOURCE_URL#*://git.openwrt.org/project/}
167 project=${project%.git}
168 echo "https
://github.com
/openwrt
/${project}/issues
/${issue#\#}"
174 | sort --version-sort \
176 | sed -e 's#^#Fixes: #'
180 -e "/PKG_SOURCE_VERSION/s#\<$PKG_SOURCE_VERSION\>#${GIT_DATE_COMMIT#* }#" \
181 -e "/PKG_SOURCE_DATE/s#\<$PKG_SOURCE_DATE\>#${GIT_DATE_COMMIT% *}#" \
184 if [ -n "$PKG_RELEASE" ] && [ "$PKG_RELEASE" != "1" ]; then
186 -e "/PKG_RELEASE/s#\<$PKG_RELEASE\>#1#" \
191 "$MAKE" --no-print-directory -C "$(dirname "$MAKEFILE")" \
195 "$MAKE" -C "$(dirname "$MAKEFILE")" download CONFIG_SRC_TREE_OVERRIDE
= ||
{
196 echo "Unable to download and pack updated Git sources." >&2
200 DL_HASH
=$
(sha256sum
"$TOPDIR/dl/$PKG_SOURCE") ||
{
201 echo "Unable to determine archive checksum." >&2
206 -e "/PKG_MIRROR_HASH/s#\<$PKG_MIRROR_HASH\>#${DL_HASH%% *}#" \
209 git
-C "$(dirname "$MAKEFILE")" commit \
210 --signoff --no-edit \
211 --message "$PKG_NAME: update to Git $COMMIT (${GIT_DATE_COMMIT% *})" \
212 --message "$GIT_LOG" \
213 ${GIT_FIXES:+--message "$GIT_FIXES"} \
214 "$(basename "$MAKEFILE")"
216 "$MAKE" --no-print-directory -C "$(dirname "$MAKEFILE")" check ||
{
217 echo "WARNING: Package check failed for updated Makefile!"