DPDK patches and discussions
 help / color / mirror / Atom feed
From: Robin Jarry <rjarry@redhat.com>
To: dev@dpdk.org
Subject: [PATCH] devtools: download scripts from linux if not found
Date: Fri, 15 Mar 2024 15:14:42 +0100	[thread overview]
Message-ID: <20240315141441.259594-2-rjarry@redhat.com> (raw)

Both checkpatches.sh and get-maintainer.sh require scripts that come
from the linux sources. And they require DPDK_*_PATH variables to be set
to point at these scripts locally. For new contributors this can be
tedious since they will have to clone the whole linux sources just to
have simple perl scripts.

Update checkpatches.sh and get-maintainer.sh to have them download the
upstream scripts if they are not found locally. Store the downloaded
scripts in the .git/ folder so that they are found for future runs.

If either DPDK_CHECKPATCH_PATH or DPDK_GETMAINTAINER_PATH are set, they
will be used in priority.

Signed-off-by: Robin Jarry <rjarry@redhat.com>
---
 devtools/checkpatches.sh            |  6 ++++
 devtools/get-maintainer.sh          |  9 ++++++
 devtools/load-devel-config          | 45 +++++++++++++++++++++++++++++
 doc/guides/contributing/patches.rst |  1 +
 4 files changed, 61 insertions(+)

diff --git a/devtools/checkpatches.sh b/devtools/checkpatches.sh
index 8f245ebdabc4..bfacd77f398a 100755
--- a/devtools/checkpatches.sh
+++ b/devtools/checkpatches.sh
@@ -43,6 +43,8 @@ print_usage () {
 	Run Linux kernel checkpatch.pl with DPDK options.
 	The environment variable DPDK_CHECKPATCH_PATH can be set, if not we will
 	try to find the script in the sources of the currently running kernel.
+	If the script cannot be found, you will be prompted for downloading it
+	from the upstream linux sources.
 
 	The patches to check can be from stdin, files specified on the command line,
 	latest git commits limited with -n option, or commits in the git range
@@ -376,10 +378,14 @@ while getopts hn:qr:v ARG ; do
 done
 shift $(($OPTIND - 1))
 
+url="https://raw.githubusercontent.com/torvalds/linux/master/scripts/checkpatch.pl"
+
 if [ ! -f "$DPDK_CHECKPATCH_PATH" ] || [ ! -x "$DPDK_CHECKPATCH_PATH" ] ; then
 	default_path="/lib/modules/$(uname -r)/source/scripts/checkpatch.pl"
 	if [ -f "$default_path" ] && [ -x "$default_path" ] ; then
 		DPDK_CHECKPATCH_PATH="$default_path"
+	elif download_script DPDK_CHECKPATCH_PATH "$url"; then
+		true
 	else
 		print_usage >&2
 		echo
diff --git a/devtools/get-maintainer.sh b/devtools/get-maintainer.sh
index bba4d3f68db8..010aef221226 100755
--- a/devtools/get-maintainer.sh
+++ b/devtools/get-maintainer.sh
@@ -18,10 +18,19 @@ print_usage () {
 	the get_maintainer.pl script located in Linux kernel sources. Example:
 	DPDK_GETMAINTAINER_PATH=~/linux/scripts/get_maintainer.pl
 
+	If the script cannot be found, you will be prompted for downloading it
+	from the upstream linux sources.
+
 	Also refer to devtools/load-devel-config to store your configuration.
 	END_OF_HELP
 }
 
+if [ ! -f "$DPDK_GETMAINTAINER_PATH" ] ||
+   [ ! -x "$DPDK_GETMAINTAINER_PATH" ] ; then
+	download_script DPDK_GETMAINTAINER_PATH \
+		"https://raw.githubusercontent.com/torvalds/linux/master/scripts/get_maintainer.pl"
+fi
+
 # Requires DPDK_GETMAINTAINER_PATH devel config option set
 if [ ! -f "$DPDK_GETMAINTAINER_PATH" ] ||
    [ ! -x "$DPDK_GETMAINTAINER_PATH" ] ; then
diff --git a/devtools/load-devel-config b/devtools/load-devel-config
index 69a0ac623a6e..46baf73fc0b3 100644
--- a/devtools/load-devel-config
+++ b/devtools/load-devel-config
@@ -1,4 +1,5 @@
 # SPDX-License-Identifier: BSD-3-Clause
+# vim: ft=sh
 
 # This file is intended to be sourced into shell
 
@@ -14,3 +15,47 @@ test ! -r $(dirname $(readlink -f $0))/../.develconfig ||
         . $(dirname $(readlink -f $0))/../.develconfig
 
 # The config files must export variables in the shell style
+
+# This function is called to download missing scripts by subcommands
+#
+# Example:
+#   download_script DPDK_CHECKPATCH_PATH \
+#       https://raw.githubusercontent.com/torvalds/linux/master/scripts/checkpatch.pl
+download_script() { # <var_name> <url>
+	var_name=$1
+	url=$2
+
+	script_name=$(basename "$url")
+	git_dir=$(git rev-parse --git-dir) || return 1
+	dl_path="$git_dir/$script_name"
+
+	if [ -f "$dl_path" ] && [ -x "$dl_path" ]; then
+		eval "$var_name='$dl_path'"
+		return 0
+	fi
+
+	if ! [ -t 0 ]; then
+		# not in an interactive terminal, abort
+		return 1
+	fi
+	prompt="Download $url and set $var_name=$dl_path? [y/n] "
+
+	while printf '%s' "$prompt" && read y && ! [ "$y" = y ]; do
+		if [ "$y" = n ]; then
+			return 1
+		fi
+	done
+
+	if which curl >/dev/null 2>&1; then
+		curl -Lo "$dl_path" "$url" || return 1
+	elif which wget >/dev/null 2>&1; then
+		wget -O "$dl_path" "$url" || return 1
+	else
+		echo "error: neither curl nor wget are available." >&2
+		return 1
+	fi
+	chmod 755 "$dl_path" || return 1
+
+	eval "$var_name='$dl_path'"
+	return 0
+}
diff --git a/doc/guides/contributing/patches.rst b/doc/guides/contributing/patches.rst
index e286d9e6d59e..d24327bebb6c 100644
--- a/doc/guides/contributing/patches.rst
+++ b/doc/guides/contributing/patches.rst
@@ -462,6 +462,7 @@ This uses the Linux kernel development tool ``checkpatch.pl`` which  can be obta
 updating the Linux kernel sources.
 
 The path to the original Linux script must be set in the environment variable ``DPDK_CHECKPATCH_PATH``.
+If this variable is not set, ``checkpatches.sh`` will prompt before downloading it locally.
 
 Spell checking of commonly misspelled words is enabled
 by default if installed in ``/usr/share/codespell/dictionary.txt``.
-- 
2.44.0


                 reply	other threads:[~2024-03-15 14:15 UTC|newest]

Thread overview: [no followups] expand[flat|nested]  mbox.gz  Atom feed

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=20240315141441.259594-2-rjarry@redhat.com \
    --to=rjarry@redhat.com \
    --cc=dev@dpdk.org \
    /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).