[pacman-dev] [PATCH] Can place local source files in directories

Ashley Whetter ashley at awhetter.co.uk
Sun May 1 15:37:27 UTC 2016


For example a source file 'mydir/myfile.sh' is now valid,
whereas before 'myfile.sh' would have needed to be placed in the same directory
as the PKGBUILD.

Fixes FS#43020

Signed-off-by: Ashley Whetter <ashley at awhetter.co.uk>
---
I've tested this by generating checksums, making a package, and
making a source package, all with downloadable and local files.
Local files were tested in both the PKGBUILD directory and a subdirectory.

This doesn't work for files that have been placed under a fake protocol to force
makepkg not to include the file in the source package
(for example 'file://a_sub_dir/my_huge_source_file.tar.gz').
 scripts/libmakepkg/source/file.sh.in  |  4 +++-
 scripts/libmakepkg/source/local.sh.in |  2 +-
 scripts/libmakepkg/util/source.sh.in  | 17 +++++++++++++++++
 scripts/makepkg.sh.in                 |  8 ++++++--
 4 files changed, 27 insertions(+), 4 deletions(-)

diff --git a/scripts/libmakepkg/source/file.sh.in b/scripts/libmakepkg/source/file.sh.in
index 20493a6..6f17884 100644
--- a/scripts/libmakepkg/source/file.sh.in
+++ b/scripts/libmakepkg/source/file.sh.in
@@ -87,7 +87,9 @@ extract_file() {
 
 	local filepath=$(get_filepath "$file")
 	rm -f "$srcdir/${file}"
-	ln -s "$filepath" "$srcdir/"
+	local intermediatedirs=$(get_intermediate_dirs "$file")
+	mkdir -p "$srcdir/$intermediatedirs"
+	ln -s "$filepath" "$srcdir/$intermediatedirs"
 
 	if in_array "$file" "${noextract[@]}"; then
 		# skip source files in the noextract=() array
diff --git a/scripts/libmakepkg/source/local.sh.in b/scripts/libmakepkg/source/local.sh.in
index 6a4b882..ef4829a 100644
--- a/scripts/libmakepkg/source/local.sh.in
+++ b/scripts/libmakepkg/source/local.sh.in
@@ -33,7 +33,7 @@ download_local() {
 	local filepath=$(get_filepath "$netfile")
 
 	if [[ -n "$filepath" ]]; then
-		msg2 "$(gettext "Found %s")" "${filepath##*/}"
+		msg2 "$(gettext "Found %s")" "$netfile"
 	else
 		local filename=$(get_filename "$netfile")
 		error "$(gettext "%s was not found in the build directory and is not a URL.")" "$filename"
diff --git a/scripts/libmakepkg/util/source.sh.in b/scripts/libmakepkg/util/source.sh.in
index 9d4ba4a..f16d3c6 100644
--- a/scripts/libmakepkg/util/source.sh.in
+++ b/scripts/libmakepkg/util/source.sh.in
@@ -74,6 +74,10 @@ get_filename() {
 				filename=${filename%%.git*}
 			fi
 			;;
+		local)
+			# If it is a local file then leave the full path as is
+			filename=$netfile
+			;;
 		*)
 			# if it is just an URL, we only keep the last component
 			filename="${netfile##*/}"
@@ -142,3 +146,16 @@ get_downloadclient() {
 
 	printf "%s\n" "$agent"
 }
+
+# Get the directories that exist before a source file
+get_intermediate_dirs() {
+	local netfile=$1
+	local intermediatedirs
+
+	if [[ "$(get_protocol "$netfile")" = 'local' ]] && [[ "$netfile" = */* ]]
+	then
+		intermediatedirs=${netfile%/*}
+	fi
+
+	printf "%s\n" "$intermediatedirs"
+}
diff --git a/scripts/makepkg.sh.in b/scripts/makepkg.sh.in
index f80e37a..392b1b3 100644
--- a/scripts/makepkg.sh.in
+++ b/scripts/makepkg.sh.in
@@ -1231,8 +1231,12 @@ create_srcpackage() {
 		if [[ "$file" = "$(get_filename "$file")" ]] || (( SOURCEONLY == 2 )); then
 			local absfile
 			absfile=$(get_filepath "$file") || missing_source_file "$file"
-			msg2 "$(gettext "Adding %s...")" "${absfile##*/}"
-			ln -s "$absfile" "$srclinks/$pkgbase"
+			msg2 "$(gettext "Adding %s...")" "$(get_filename "$file")"
+
+			local intermediatedirs="$(get_intermediate_dirs "$file")"
+			mkdir -p "$srclinks/$pkgbase/$intermediatedirs"
+
+			ln -s "$absfile" "$srclinks/$pkgbase/$intermediatedirs"
 		fi
 	done
 
-- 
2.8.0


More information about the pacman-dev mailing list