linux-perf-users.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: vmolnaro@redhat.com
To: linux-perf-users@vger.kernel.org, acme@kernel.org,
	acme@redhat.com, vmolnaro@redhat.com
Cc: mpetlan@redhat.com
Subject: [PATCH 2/2] perf archive: Add new option '--unpack'
Date: Tue, 12 Dec 2023 17:59:09 +0100	[thread overview]
Message-ID: <20231212165909.14459-2-vmolnaro@redhat.com> (raw)
In-Reply-To: <20231212165909.14459-1-vmolnaro@redhat.com>

From: Veronika Molnarova <vmolnaro@redhat.com>

Archives generated by the command 'perf archive' have to be unpacked
manually. Following the addition of option '--all' now there also exist
a nested structure of tars, and after further discussion with Red Hat
Global Support Services, they found a feature correctly unpacking
archives of 'perf archive' convenient.

Option '--unpack' of 'perf archive' unpacks archives generated by the
command 'perf archive' as well as archives generated when used with
option '--all'. File 'perf.data' is placed in the current directory,
while debug symbols are unpacked in '~/.debug' directory. A tar filename
can be passed as an argument, and if not provided the command tries to
find a viable perf.tar file for unpacking.

Signed-off-by: Veronika Molnarova <vmolnaro@redhat.com>
---
 tools/perf/perf-archive.sh | 66 +++++++++++++++++++++++++++++++++-----
 1 file changed, 58 insertions(+), 8 deletions(-)

diff --git a/tools/perf/perf-archive.sh b/tools/perf/perf-archive.sh
index a92042eae95a..f94795794b36 100755
--- a/tools/perf/perf-archive.sh
+++ b/tools/perf/perf-archive.sh
@@ -7,17 +7,72 @@ PERF_DATA=perf.data
 PERF_SYMBOLS=perf.symbols
 PERF_ALL=perf.all
 ALL=0
+UNPACK=0
 
 while [ $# -gt 0 ] ; do
 	if [ $1 == "--all" ]; then
 		ALL=1
 		shift
+	elif [ $1 == "--unpack" ]; then
+		UNPACK=1
+		shift
 	else
 		PERF_DATA=$1
+		UNPACK_TAR=$1
 		shift
 	fi
 done
 
+if [ $UNPACK -eq 1 ]; then
+	if [ ! -z "$UNPACK_TAR" ]; then					# tar given as an argument
+		if [ ! -e "$UNPACK_TAR" ]; then
+			echo "Provided file $UNPACK_TAR does not exist"
+			exit 1
+		fi
+		TARGET="$UNPACK_TAR"
+	else																# search for perf tar in the current directory
+		TARGET=`find . -regex "\./perf.*\.tar\.bz2"`
+		TARGET_NUM=`echo -n "$TARGET" | grep -c '^'`
+
+		if [ -z "$TARGET" -o $TARGET_NUM -gt 1 ]; then
+			echo -e "Error: $TARGET_NUM files found for unpacking:\n$TARGET"
+			echo "Provide the requested file as an argument"
+			exit 1
+		else
+			echo "Found target file for unpacking: $TARGET"
+		fi
+	fi
+
+	if [[ "$TARGET" =~ (\./)?$PERF_ALL.*.tar.bz2 ]]; then				# perf tar generated by --all option
+		TAR_CONTENTS=`tar tvf "$TARGET" | tr -s " " | cut -d " " -f 6`
+		VALID_TAR=`echo "$TAR_CONTENTS" | grep "$PERF_SYMBOLS.tar.bz2" | wc -l`		# check if it contains a sub-tar perf.symbols
+		if [ $VALID_TAR -ne 1 ]; then
+			echo "Error: $TARGET file is not valid (contains zero or multiple sub-tar files with debug symbols)"
+			exit 1
+		fi
+
+		INTERSECT=`comm -12 <(ls) <(echo "$TAR_CONTENTS") | tr "\n" " "`	# check for overwriting
+		if [ ! -z "$INTERSECT" ]; then										# prompt if file(s) already exist in the current directory
+			echo "File(s) ${INTERSECT::-1} already exist in the current directory."
+			while true; do
+				read -p 'Do you wish to overwrite them? ' yn
+				case $yn in
+					[Yy]* ) break;;
+					[Nn]* ) exit 1;;
+					* ) echo "Please answer yes or no.";;
+				esac
+			done
+		fi
+
+		# unzip the perf.data file in the current working directory	and debug symbols in ~/.debug directory
+		tar xvf $TARGET && tar xvf $PERF_SYMBOLS.tar.bz2 -C ~/.debug
+
+	else																# perf tar generated by perf archive (contains only debug symbols)
+		tar xvf $TARGET -C ~/.debug
+	fi
+	exit 0
+fi
+
 #
 # PERF_BUILDID_DIR environment variable set by perf
 # path to buildid directory, default to $HOME/.debug
@@ -55,17 +110,12 @@ if [ $ALL -eq 1 ]; then						# pack perf.data file together with tar containing
 	tar cjf $PERF_SYMBOLS.tar.bz2 -C $PERF_BUILDID_DIR -T $MANIFEST
 	tar cjf	$PERF_ALL-$HOSTNAME-$DATE.tar.bz2 $PERF_DATA $PERF_SYMBOLS.tar.bz2
 	rm $PERF_SYMBOLS.tar.bz2 $MANIFEST $BUILDIDS || true
-
-	echo -e "Now please run:\n"
-	echo -e "$ tar xvf $PERF_ALL-$HOSTNAME-$DATE.tar.bz2 && tar xvf $PERF_SYMBOLS.tar.bz2 -C ~/.debug\n"
-	echo "wherever you need to run 'perf report' on."
 else										# pack only the debug symbols
 	tar cjf $PERF_DATA.tar.bz2 -C $PERF_BUILDID_DIR -T $MANIFEST
 	rm $MANIFEST $BUILDIDS || true
-
-	echo -e "Now please run:\n"
-	echo -e "$ tar xvf $PERF_DATA.tar.bz2 -C ~/.debug\n"
-	echo "wherever you need to run 'perf report' on."
 fi
 
+echo -e "Now please run:\n"
+echo -e "$ perf archive --unpack\n"
+echo "or unpack the tar manually wherever you need to run 'perf report' on."
 exit 0
-- 
2.43.0


  reply	other threads:[~2023-12-12 16:59 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-12-12 16:59 [PATCH 1/2] perf archive: Add new option '--all' vmolnaro
2023-12-12 16:59 ` vmolnaro [this message]
2023-12-12 18:06 ` Arnaldo Carvalho de Melo
2023-12-20 13:59   ` Arnaldo Carvalho de Melo

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20231212165909.14459-2-vmolnaro@redhat.com \
    --to=vmolnaro@redhat.com \
    --cc=acme@kernel.org \
    --cc=acme@redhat.com \
    --cc=linux-perf-users@vger.kernel.org \
    --cc=mpetlan@redhat.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).