Subject: [alpine-devel] [PATCH 1/5] abuild: use id instead of whoami

From: Sören Tempel <[email-masked]>
Date: Fri, 27 Nov 2015 00:50:43 +0100

Furthermore compare the UID instead of the username.
---
 abuild.in | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/abuild.in b/abuild.in
index 38d6efd..697a186 100644
--- a/abuild.in
+++ b/abuild.in
@@ -2144,7 +2144,7 @@ done
 shift $(( $OPTIND - 1 ))
 
 # check so we are not root
-if [ "$(whoami)" = "root" ] && [ -z "$FAKEROOTKEY" ]; then
+if [ $(id -u) -eq 0 ] && [ -z "$FAKEROOTKEY" ]; then
 	[ -z "$forceroot" ] && die "Do not run abuild as root"
 	FAKEROOT=
 fi
-- 
2.6.3

---
Unsubscribe:  [email-masked]
Help:         [email-masked]
---

---

From: Sören Tempel <[email-masked]>
Date: Fri, 27 Nov 2015 00:50:44 +0100

---
 abuild.in | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/abuild.in b/abuild.in
index 697a186..4c45504 100644
--- a/abuild.in
+++ b/abuild.in
@@ -591,7 +591,7 @@ postcheck() {
 			warning "Found /usr/share/man but package name doesn't end with -doc"
 		fi
 		# check for uncompressed man pages
-		i=$(find "$dir"/usr/share/man -name '*.[0-9]' -type f | sed "s|^$dir|\t|")
+		i=$(find "$dir"/usr/share/man -name '*.[0-8]' -type f | sed "s|^$dir|\t|")
 		if [ -n "$i" ]; then
 			error "Found uncompressed man pages:"
 			echo "$i"
@@ -1405,7 +1405,7 @@ default_doc() {
 	# compress man pages
 	local previnode= prevname=  mandir="$subpkgdir"/usr/share/man
 	[ -d "$mandir" ] && find "$subpkgdir"/usr/share/man \
-		-type f \( -name \*.[0-9n] -o -name \*.[0-9][a-z]* \) \
+		-type f \( -name \*.[0-8n] -o -name \*.[0-8][a-z]* \) \
 		-exec stat -c "%i %n" {} \; | sort -n \
 		| while read inode name; do
 
@@ -1421,7 +1421,7 @@ default_doc() {
 		prevname="$name"
 	done
 	[ -d "$mandir" ] && find "$subpkgdir"/usr/share/man \
-		-type l \( -name \*.[0-9n] -o -name \*.[0-9][a-z]* \) \
+		-type l \( -name \*.[0-8n] -o -name \*.[0-8][a-z]* \) \
 		| while read symlink; do
 
 		ln -s $(readlink $symlink).gz "$symlink".gz
-- 
2.6.3

---

---

From: Sören Tempel <[email-masked]>
Date: Fri, 27 Nov 2015 00:50:45 +0100

The problem is that gzip refuses to run if it detects that a file has
more than 1 link. Our existing solution (removing hardlinks, compressing
the man page and recreating the hardlinks) made certain assumptions
about inode order that are only given on Unix v7 like filesystems
meaning it didn't work properly on 'tree-based' filesystems like BTRFS
or ZFS.

This patch has a different more bulletproof approach: It simply replaces
all hardlinks with symlinks. This is way easier because symlinks (unlike
hardlinks) can point to a file that doesn't exist, therefore we can
update all links before compressing the file in an easy way.
---
 abuild.in | 40 ++++++++++++++++++++++------------------
 1 file changed, 22 insertions(+), 18 deletions(-)

diff --git a/abuild.in b/abuild.in
index 4c45504..26b7982 100644
--- a/abuild.in
+++ b/abuild.in
@@ -1403,29 +1403,33 @@ default_doc() {
 	done
 
 	# compress man pages
-	local previnode= prevname=  mandir="$subpkgdir"/usr/share/man
-	[ -d "$mandir" ] && find "$subpkgdir"/usr/share/man \
-		-type f \( -name \*.[0-8n] -o -name \*.[0-8][a-z]* \) \
-		-exec stat -c "%i %n" {} \; | sort -n \
-		| while read inode name; do
-
-		if [ "$inode" = "$previnode" ]; then
-			# update hard link
-			rm "$name"
-			ln "$prevname".gz "$name".gz
-		else
-			gzip -9 "$name"
-		fi
+	local mandir="$subpkgdir"/usr/share/man
+	[ -d "$mandir" ] && find "$mandir" -type f \
+		-a \( -name \*.[0-8n] -o -name \*.[0-8][a-z]* \) \
+		-exec stat -c "%i %n" \{\} \; | while read inode name; do
+
+		# Skip hardlinks removed in last iteration.
+		[ -f "$name" ] || continue
+
+		local islink=0
+		find "$mandir" -type f -links +1 \
+			-a \( -name \*.[0-8n] -o -name \*.[0-8][a-z]* \) \
+			-exec stat -c "%i %n" \{\} \; | while read linode lname; do
+			if [ "$linode" = "$inode" -a "$lname" != "$name" ]; then
+				islink=1
+				rm -f "$lname"
+				ln -s "${name##*/}".gz "$lname".gz
+			fi
+		done
 
-		previnode="$inode"
-		prevname="$name"
+		[ $islink -eq 0 ] && gzip -9 "$name"
 	done
-	[ -d "$mandir" ] && find "$subpkgdir"/usr/share/man \
-		-type l \( -name \*.[0-8n] -o -name \*.[0-8][a-z]* \) \
+	[ -d "$mandir" ] && find "$mandir" -type l \
+		-a \( -name \*.[0-8n] -o -name \*.[0-8][a-z]* \) \
 		| while read symlink; do
 
-		rm "$symlink"
+		rm -f "$symlink"
 	done
 
 	rm -f "$subpkgdir/usr/share/info/dir"
-- 
2.6.3

---

---

From: Sören Tempel <[email-masked]>
Date: Fri, 27 Nov 2015 00:50:46 +0100

This should be a minimal performance improvement since hardlinks are
replaced with symlinks and should thus already point to the correct
file.
---
 abuild.in | 14 +++++++-------
 1 file changed, 7 insertions(+), 7 deletions(-)

diff --git a/abuild.in b/abuild.in
index 26b7982..65b6377 100644
--- a/abuild.in
+++ b/abuild.in
@@ -1404,6 +1404,13 @@ default_doc() {
 
 	# compress man pages
 	local mandir="$subpkgdir"/usr/share/man
+	[ -d "$mandir" ] && find "$mandir" -type l \
+		-a \( -name \*.[0-8n] -o -name \*.[0-8][a-z]* \) \
+		| while read symlink; do
+
+		ln -s $(readlink $symlink).gz "$symlink".gz
+		rm -f "$symlink"
+	done
 	[ -d "$mandir" ] && find "$mandir" -type f \
 		-a \( -name \*.[0-8n] -o -name \*.[0-8][a-z]* \) \
 		-exec stat -c "%i %n" \{\} \; | while read inode name; do
@@ -1424,13 +1431,6 @@ default_doc() {
 
 		[ $islink -eq 0 ] && gzip -9 "$name"
 	done
-	[ -d "$mandir" ] && find "$mandir" -type l \
-		-a \( -name \*.[0-8n] -o -name \*.[0-8][a-z]* \) \
-		| while read symlink; do
-
-		ln -s $(readlink $symlink).gz "$symlink".gz
-		rm -f "$symlink"
-	done

-- 
2.6.3

---

---

From: Sören Tempel <[email-masked]>
Date: Fri, 27 Nov 2015 00:50:47 +0100

---
 .gitignore | 1 +
 1 file changed, 1 insertion(+)

diff --git a/.gitignore b/.gitignore
index 9018782..ac669f6 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,6 +1,7 @@
 *.tar.bz2
 *.o
 abuild
+abuild-fetch
 abuild-keygen
 abuild-sign
 abuild-sudo
-- 
2.6.3

---