From: sgn <sgn@users.noreply.github.com>
To: ml@inbox.vuxu.org
Subject: Re: [PR PATCH] [Updated] vsrcextract
Date: Tue, 01 Aug 2023 15:32:37 +0200 [thread overview]
Message-ID: <20230801133237.SgdB_f_yHNoDSwcM_2F6M9h-IevQb0_GVzwxc2vhkbs@z> (raw)
In-Reply-To: <gh-mailinglist-notifications-41a7ca26-5023-4802-975b-f1789d68868e-void-packages-44982@inbox.vuxu.org>
[-- Attachment #1: Type: text/plain, Size: 1228 bytes --]
There is an updated pull request by sgn against master on the void-packages repository
https://github.com/sgn/void-packages vsrcextract
https://github.com/void-linux/void-packages/pull/44982
vsrcextract
<!-- Uncomment relevant sections and delete options which are not applicable -->
#### Testing the changes
- I tested the changes in this PR: **briefly**
<!--
#### New package
- This new package conforms to the [package requirements](https://github.com/void-linux/void-packages/blob/master/CONTRIBUTING.md#package-requirements): **YES**|**NO**
-->
<!-- Note: If the build is likely to take more than 2 hours, please add ci skip tag as described in
https://github.com/void-linux/void-packages/blob/master/CONTRIBUTING.md#continuous-integration
and test at least one native build and, if supported, at least one cross build.
Ignore this section if this PR is not skipping CI.
-->
<!--
#### Local build testing
- I built this PR locally for my native architecture, (ARCH-LIBC)
- I built this PR locally for these architectures (if supported. mark crossbuilds):
- aarch64-musl
- armv7l
- armv6l-musl
-->
A patch file from https://github.com/void-linux/void-packages/pull/44982.patch is attached
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: github-pr-vsrcextract-44982.patch --]
[-- Type: text/x-diff, Size: 15366 bytes --]
From bb60d62b5c3e6a6a1904e1d4026f1cddd6416711 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=C4=90o=C3=A0n=20Tr=E1=BA=A7n=20C=C3=B4ng=20Danh?=
<congdanhqx@gmail.com>
Date: Tue, 11 Jul 2023 23:02:44 +0700
Subject: [PATCH 1/5] do-extract: move main logic into helper function
---
common/environment/setup/archive.sh | 164 ++++++++++++++++++++++++
| 123 +-----------------
2 files changed, 165 insertions(+), 122 deletions(-)
create mode 100644 common/environment/setup/archive.sh
diff --git a/common/environment/setup/archive.sh b/common/environment/setup/archive.sh
new file mode 100644
index 0000000000000..4920bcdb41cbd
--- /dev/null
+++ b/common/environment/setup/archive.sh
@@ -0,0 +1,164 @@
+vextract() {
+ local sc=--strip-components=1
+ local dst=
+ while [ "$#" -ne 1 ]; do
+ case "$1" in
+ -C)
+ if [ -z "$2" ]; then
+ msg_error "$pkgver: vextract -C <directory>.\n"
+ fi
+ dst="$2"
+ mkdir -p "$dst"
+ shift 2
+ ;;
+ --no-strip-components)
+ sc=
+ shift
+ ;;
+ --strip-components=*)
+ sc="$1"
+ shift
+ ;;
+ --)
+ shift; break ;;
+ *)
+ break ;;
+ esac
+ done
+
+ local TAR_CMD sfx
+ local archive="$1"
+ local ret=0
+
+ TAR_CMD="$(command -v bsdtar)"
+ [ -z "$TAR_CMD" ] && TAR_CMD="$(command -v tar)"
+ [ -z "$TAR_CMD" ] && msg_error "xbps-src: no suitable tar cmd (bsdtar, tar)\n"
+ case "$archive" in
+ *.tar.lzma) sfx="txz";;
+ *.tar.lz) sfx="tlz";;
+ *.tlz) sfx="tlz";;
+ *.tar.xz) sfx="txz";;
+ *.txz) sfx="txz";;
+ *.tar.bz2) sfx="tbz";;
+ *.tbz) sfx="tbz";;
+ *.tar.gz) sfx="tgz";;
+ *.tgz) sfx="tgz";;
+ *.tar.zst) sfx="tzst";;
+ *.tzst) sfx="tzst";;
+ *.gz) sfx="gz";;
+ *.xz) sfx="xz";;
+ *.bz2) sfx="bz2";;
+ *.zst) sfx="zst";;
+ *.tar) sfx="tar";;
+ *.zip) sfx="zip";;
+ *.rpm) sfx="rpm";;
+ *.deb) sfx="deb";;
+ *.patch) sfx="txt";;
+ *.diff) sfx="txt";;
+ *.txt) sfx="txt";;
+ *.sh) sfx="txt";;
+ *.7z) sfx="7z";;
+ *.gem) sfx="gem";;
+ *.crate) sfx="crate";;
+ *) msg_error "$pkgver: unknown distfile suffix for $archive.\n";;
+ esac
+
+ case ${sfx} in
+ tar|txz|tbz|tlz|tgz|tzst|crate)
+ $TAR_CMD ${sc:+"$sc"} ${dst:+-C "$dst"} -x \
+ --no-same-permissions --no-same-owner \
+ -f $archive
+ ;;
+ gz|bz2|xz|zst)
+ cp -f $archive "$dst"
+ (
+ if [ "$dst" ]; then cd "$dst"; fi
+ case ${sfx} in
+ gz)
+ gunzip -f $archive
+ ;;
+ bz2)
+ bunzip2 -f $archive
+ ;;
+ xz)
+ unxz -f $archive
+ ;;
+ zst)
+ unzstd $archive
+ ;;
+ esac
+ )
+ ;;
+ zip)
+ if command -v unzip &>/dev/null; then
+ unzip -o -q $archive ${dst:+-d "$dst"}
+ elif command -v bsdtar &>/dev/null; then
+ bsdtar ${sc:+"$sc"} ${dst:+-C "$dst"} -xf $archive
+ else
+ msg_error "$pkgver: cannot find unzip or bsdtar bin for extraction.\n"
+ fi
+ ;;
+ rpm)
+ if ! command -v bsdtar &>/dev/null; then
+ msg_error "$pkgver: cannot find bsdtar for extraction.\n"
+ fi
+ bsdtar ${sc:+"$sc"} ${dst:+-C "$dst"} -x \
+ --no-same-permissions --no-same-owner -f $archive
+ ;;
+ deb)
+ if command -v bsdtar &>/dev/null; then
+ bsdtar -x -O -f "$archive" "data.tar.*" |
+ bsdtar ${sc:+"$sc"} ${dst:+-C "$dst"} -x \
+ --no-same-permissions --no-same-owner -f -
+ else
+ msg_error "$pkgver: cannot find bsdtar for extraction.\n"
+ fi
+ ;;
+ txt)
+ cp -f $archive "$dst"
+ ;;
+ 7z)
+ if command -v 7z &>/dev/null; then
+ 7z x $archive -o"$dst"
+ elif command -v bsdtar &>/dev/null; then
+ bsdtar ${sc:+"$sc"} ${dst:+-C "$dst"} -xf $archive
+ else
+ msg_error "$pkgver: cannot find 7z or bsdtar bin for extraction.\n"
+ fi
+ ;;
+ gem)
+ $TAR_CMD -xOf $archive data.tar.gz |
+ $TAR_CMD ${sc:+"$sc"} ${dst:+-C "$dst"} -xz -f -
+ ;;
+ *)
+ msg_error "$pkgver: cannot guess $archive extract suffix. ($sfx)\n"
+ ;;
+ esac
+ if [ "$?" -ne 0 ]; then
+ msg_error "$pkgver: extracting $archive.\n"
+ fi
+}
+
+vsrcextract() {
+ local sc=--strip-components=1
+ local dst=
+ while [ "$#" -ge 1 ]; do
+ case "$1" in
+ -C)
+ if [ -z "$2" ]; then
+ msg_error "$pkgver: vsrcextract -C <directory>.\n"
+ fi
+ dst="$2"
+ shift 2
+ ;;
+ --no-strip-components|--strip-components=*)
+ sc="$1"
+ shift
+ ;;
+ *)
+ break ;;
+ esac
+ done
+ vextract "$sc" ${dst:+-C "$dst"} \
+ "${XBPS_SRCDISTDIR}/${pkgname}-${version}/$1"
+}
--git a/common/hooks/do-extract/00-distfiles.sh b/common/hooks/do-extract/00-distfiles.sh
index 07e987a6862be..445346299e34d 100644
--- a/common/hooks/do-extract/00-distfiles.sh
+++ b/common/hooks/do-extract/00-distfiles.sh
@@ -45,128 +45,7 @@ hook() {
unset found
continue
fi
-
- case $curfile in
- *.tar.lzma) cursufx="txz";;
- *.tar.lz) cursufx="tlz";;
- *.tlz) cursufx="tlz";;
- *.tar.xz) cursufx="txz";;
- *.txz) cursufx="txz";;
- *.tar.bz2) cursufx="tbz";;
- *.tbz) cursufx="tbz";;
- *.tar.gz) cursufx="tgz";;
- *.tgz) cursufx="tgz";;
- *.tar.zst) cursufx="tzst";;
- *.tzst) cursufx="tzst";;
- *.gz) cursufx="gz";;
- *.xz) cursufx="xz";;
- *.bz2) cursufx="bz2";;
- *.zst) cursufx="zst";;
- *.tar) cursufx="tar";;
- *.zip) cursufx="zip";;
- *.rpm) cursufx="rpm";;
- *.deb) cursufx="deb";;
- *.patch) cursufx="txt";;
- *.diff) cursufx="txt";;
- *.txt) cursufx="txt";;
- *.sh) cursufx="txt";;
- *.7z) cursufx="7z";;
- *.gem) cursufx="gem";;
- *.crate) cursufx="crate";;
- *) msg_error "$pkgver: unknown distfile suffix for $curfile.\n";;
- esac
-
- case ${cursufx} in
- tar|txz|tbz|tlz|tgz|tzst|crate)
- $TAR_CMD -x --no-same-permissions --no-same-owner -f $srcdir/$curfile -C "$extractdir"
- if [ $? -ne 0 ]; then
- msg_error "$pkgver: extracting $curfile into $XBPS_BUILDDIR.\n"
- fi
- ;;
- gz|bz2|xz|zst)
- cp -f $srcdir/$curfile "$extractdir"
- cd "$extractdir"
- case ${cursufx} in
- gz)
- gunzip -f $curfile
- ;;
- bz2)
- bunzip2 -f $curfile
- ;;
- xz)
- unxz -f $curfile
- ;;
- zst)
- unzstd $curfile
- ;;
- esac
- ;;
- zip)
- if command -v unzip &>/dev/null; then
- unzip -o -q $srcdir/$curfile -d "$extractdir"
- if [ $? -ne 0 ]; then
- msg_error "$pkgver: extracting $curfile into $XBPS_BUILDDIR.\n"
- fi
- elif command -v bsdtar &>/dev/null; then
- bsdtar -xf $srcdir/$curfile -C "$extractdir"
- if [ $? -ne 0 ]; then
- msg_error "$pkgver: extracting $curfile into $XBPS_BUILDDIR.\n"
- fi
- else
- msg_error "$pkgver: cannot find unzip or bsdtar bin for extraction.\n"
- fi
- ;;
- rpm)
- if ! command -v bsdtar &>/dev/null; then
- msg_error "$pkgver: cannot find bsdtar for extraction.\n"
- fi
- bsdtar -x --no-same-permissions --no-same-owner -f $srcdir/$curfile -C "$extractdir"
- if [ $? -ne 0 ]; then
- msg_error "$pkgver: extracting $curfile into $XBPS_BUILDDIR.\n"
- fi
- ;;
- deb)
- if command -v bsdtar &>/dev/null; then
- bsdtar -x -O -f "$srcdir/$curfile" "data.tar.*" |
- bsdtar -C "$extractdir" -x --no-same-permissions --no-same-owner
- if [ $? -ne 0 ]; then
- msg_error "$pkgver: extracting $curfile into $XBPS_BUILDDIR.\n"
- fi
- else
- msg_error "$pkgver: cannot find bsdtar for extraction.\n"
- fi
- ;;
- txt)
- cp -f $srcdir/$curfile "$extractdir"
- ;;
- 7z)
- if command -v 7z &>/dev/null; then
- 7z x $srcdir/$curfile -o"$extractdir"
- if [ $? -ne 0 ]; then
- msg_error "$pkgver: extracting $curfile into $XBPS_BUILDDIR.\n"
- fi
- elif command -v bsdtar &>/dev/null; then
- bsdtar -xf $srcdir/$curfile -C "$extractdir"
- if [ $? -ne 0 ]; then
- msg_error "$pkgver: extracting $curfile into $XBPS_BUILDDIR.\n"
- fi
- else
- msg_error "$pkgver: cannot find 7z or bsdtar bin for extraction.\n"
- fi
- ;;
- gem)
- innerdir="$extractdir/${wrksrc##*/}"
- mkdir -p "$innerdir"
- $TAR_CMD -xOf $srcdir/$curfile data.tar.gz |
- $TAR_CMD -xz -C "$innerdir" -f -
- if [ $? -ne 0 ]; then
- msg_error "$pkgver: extracting $curfile into $XBPS_BUILDDIR.\n"
- fi
- ;;
- *)
- msg_error "$pkgver: cannot guess $curfile extract suffix. ($cursufx)\n"
- ;;
- esac
+ vsrcextract --no-strip-components -C "$extractdir" "$curfile"
done
cd "$extractdir"
From 8b5e8d83cd78ecfdd9bda6ce5e8a2e61baf9dd8e Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=C4=90o=C3=A0n=20Tr=E1=BA=A7n=20C=C3=B4ng=20Danh?=
<congdanhqx@gmail.com>
Date: Tue, 11 Jul 2023 23:13:54 +0700
Subject: [PATCH 2/5] kexec-tools: drop custom do_extract
---
common/environment/setup/archive.sh | 7 ++++++-
srcpkgs/kexec-tools/template | 10 ----------
2 files changed, 6 insertions(+), 11 deletions(-)
diff --git a/common/environment/setup/archive.sh b/common/environment/setup/archive.sh
index 4920bcdb41cbd..38853b87a8fdc 100644
--- a/common/environment/setup/archive.sh
+++ b/common/environment/setup/archive.sh
@@ -30,7 +30,12 @@ vextract() {
local archive="$1"
local ret=0
- TAR_CMD="$(command -v bsdtar)"
+ # When tar is explicitly put *first* in hostmakedepends
+ # Some packages require tar to build but not for extraction
+ case "$hostmakedepends " in
+ "tar "*) TAR_CMD="tar" ;;
+ esac
+ [ -z "$TAR_CMD" ] && TAR_CMD="$(command -v bsdtar)"
[ -z "$TAR_CMD" ] && TAR_CMD="$(command -v tar)"
[ -z "$TAR_CMD" ] && msg_error "xbps-src: no suitable tar cmd (bsdtar, tar)\n"
case "$archive" in
diff --git a/srcpkgs/kexec-tools/template b/srcpkgs/kexec-tools/template
index 6bd5b65e18206..aa68b6f60a56f 100644
--- a/srcpkgs/kexec-tools/template
+++ b/srcpkgs/kexec-tools/template
@@ -2,7 +2,6 @@
pkgname=kexec-tools
version=2.0.26
revision=1
-create_wrksrc=yes
build_style=gnu-configure
hostmakedepends="tar xz"
makedepends="zlib-devel liblzma-devel"
@@ -12,7 +11,6 @@ license="GPL-2.0-only"
homepage="http://kernel.org/pub/linux/utils/kernel/kexec/"
distfiles="${KERNEL_SITE}/utils/kernel/kexec/${pkgname}-${version}.tar.xz"
checksum=7fe36a064101cd5c515e41b2be393dce3ca88adce59d6ee668e0af7c0c4570cd
-skip_extraction="${pkgname}-${version}.tar.xz"
CFLAGS="-fcommon"
@@ -20,14 +18,6 @@ case "$XBPS_TARGET_MACHINE" in
ppc-musl) nopie=yes;; # textrels not supported
esac
-do_extract() {
- # bsdtar fails to extract version 2.0.20 tarball which
- # contains (buggy) hard links from files to themselves.
- tar --strip-components 1 --no-same-owner --extract --file \
- ${XBPS_SRCDISTDIR}/${pkgname}-${version}/${pkgname}-${version}.tar.xz \
- --directory ${wrksrc}
-}
-
pre_build() {
rm ${XBPS_WRAPPERDIR}/strip
case "$XBPS_TARGET_MACHINE" in
From 6914567d90c9c02302bda468938639143ccb2907 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=C4=90o=C3=A0n=20Tr=E1=BA=A7n=20C=C3=B4ng=20Danh?=
<congdanhqx@gmail.com>
Date: Tue, 11 Jul 2023 23:46:41 +0700
Subject: [PATCH 3/5] epson-inkjet-printer-escpr2: abstract bsdtar usage
---
srcpkgs/epson-inkjet-printer-escpr2/template | 3 +--
1 file changed, 1 insertion(+), 2 deletions(-)
diff --git a/srcpkgs/epson-inkjet-printer-escpr2/template b/srcpkgs/epson-inkjet-printer-escpr2/template
index 6fa318254b1e8..818217056b926 100644
--- a/srcpkgs/epson-inkjet-printer-escpr2/template
+++ b/srcpkgs/epson-inkjet-printer-escpr2/template
@@ -18,8 +18,7 @@ restricted=yes
repository=nonfree
post_extract() {
- bsdtar --strip-components=1 -xf \
- epson-inkjet-printer-escpr2-${version}-1lsb3.2.tar.gz
+ vextract epson-inkjet-printer-escpr2-${version}-1lsb3.2.tar.gz
}
post_install() {
From a46f1753b8f4de091533c8d7e89f7533b467f21b Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=C4=90o=C3=A0n=20Tr=E1=BA=A7n=20C=C3=B4ng=20Danh?=
<congdanhqx@gmail.com>
Date: Tue, 11 Jul 2023 23:47:16 +0700
Subject: [PATCH 4/5] qbittorrent: hide bsdtar usage
---
srcpkgs/qbittorrent/template | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/srcpkgs/qbittorrent/template b/srcpkgs/qbittorrent/template
index c5067b733ac48..87d58e8a502e1 100644
--- a/srcpkgs/qbittorrent/template
+++ b/srcpkgs/qbittorrent/template
@@ -22,8 +22,8 @@ CXXFLAGS=-std=gnu++17
do_extract() {
local n=${pkgname}-${version}
mkdir -p build-nox build-x11
- bsdtar xf ${XBPS_SRCDISTDIR}/${n}/${n}.tar.xz --strip-components=1 -C build-x11
- bsdtar xf ${XBPS_SRCDISTDIR}/${n}/${n}.tar.xz --strip-components=1 -C build-nox
+ vsrcextract -C build-x11 ${n}.tar.xz
+ vsrcextract -C build-nox ${n}.tar.xz
}
do_configure() {
From f504b0094dce59ae2c75515beda231d81fe9841e Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=C4=90o=C3=A0n=20Tr=E1=BA=A7n=20C=C3=B4ng=20Danh?=
<congdanhqx@gmail.com>
Date: Wed, 12 Jul 2023 12:42:07 +0700
Subject: [PATCH 5/5] xen: use vsrcextract
---
common/environment/setup/archive.sh | 17 +++++++++++++++++
srcpkgs/xen/template | 28 ++++++++++++----------------
2 files changed, 29 insertions(+), 16 deletions(-)
diff --git a/common/environment/setup/archive.sh b/common/environment/setup/archive.sh
index 38853b87a8fdc..45fa96a8b1cfd 100644
--- a/common/environment/setup/archive.sh
+++ b/common/environment/setup/archive.sh
@@ -167,3 +167,20 @@ vsrcextract() {
vextract "$sc" ${dst:+-C "$dst"} \
"${XBPS_SRCDISTDIR}/${pkgname}-${version}/$1"
}
+
+vtar() {
+ bsdtar "$@"
+}
+
+vsrccopy() {
+ local _tgt
+ if [ $# -lt 2 ]; then
+ msg_error "vsrccopy <file>... <target>"
+ fi
+ _tgt="${@:-1}"
+ mkdir -p "$_tgt"
+ while [ $# -gt 1 ]; do
+ cp -a "${XBPS_SRCDISTDIR}/${pkgname}-${version}/$1" "$_tgt"
+ shift
+ done
+}
diff --git a/srcpkgs/xen/template b/srcpkgs/xen/template
index 160db8e659295..9f08f0eb13868 100644
--- a/srcpkgs/xen/template
+++ b/srcpkgs/xen/template
@@ -104,15 +104,11 @@ conf_files="
/etc/xen/xl.conf"
post_extract() {
- local _src="${XBPS_SRCDISTDIR}/${pkgname}-${version}"
-
msg_normal "Extracting etherboot ipxe files ...\n"
mkdir tools/firmware/etherboot/ipxe
- tar --strip-components=1 -x \
- -f ${_src}/${_git_tag_ipxe}.tar.gz \
- -C tools/firmware/etherboot/ipxe/
+ vsrcextract -C tools/firmware/etherboot/ipxe ${_git_tag_ipxe}.tar.gz
# Create a tarball w/o the git tag
- tar -czf tools/firmware/etherboot/ipxe.tar.gz \
+ vtar -czf tools/firmware/etherboot/ipxe.tar.gz \
-C tools/firmware/etherboot/ ipxe
if [ "$build_option_stubdom" ]; then
@@ -121,16 +117,16 @@ post_extract() {
-e"/RAW_ADDR/s/(int) grub_scratch_mem/(long) grub_scratch_mem/"
mkdir -p stubdom/mini-os-x86_64-grub/{arch/x86,console,lib,xenbus}
msg_normal "Copying stubdom files ...\n"
- cp -pv \
- ${_src}/grub-${_grub_version}.tar.gz \
- ${_src}/gmp-${_gmp_version}.tar.bz2 \
- ${_src}/zlib-${_zlib_version}.tar.gz \
- ${_src}/lwip-${_lwip_version}.tar.gz \
- ${_src}/polarssl-${_polarssl_version}-gpl.tgz \
- ${_src}/newlib-${_newlib_version}.tar.gz \
- ${_src}/pciutils-${_libpci_version}.tar.bz2 \
- ${_src}/tpm_emulator-${_tpmemu_version}.tar.gz \
- ${_src}/ocaml-${_ocaml_version}.tar.gz \
+ vsrccopy \
+ grub-${_grub_version}.tar.gz \
+ gmp-${_gmp_version}.tar.bz2 \
+ zlib-${_zlib_version}.tar.gz \
+ lwip-${_lwip_version}.tar.gz \
+ polarssl-${_polarssl_version}-gpl.tgz \
+ newlib-${_newlib_version}.tar.gz \
+ pciutils-${_libpci_version}.tar.bz2 \
+ tpm_emulator-${_tpmemu_version}.tar.gz \
+ ocaml-${_ocaml_version}.tar.gz \
stubdom/
fi
}
next prev parent reply other threads:[~2023-08-01 13:32 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-07-11 17:11 [PR PATCH] vsrcextract sgn
2023-07-11 23:43 ` [PR REVIEW] vsrcextract classabbyamp
2023-07-11 23:44 ` classabbyamp
2023-07-12 6:00 ` [PR PATCH] [Updated] vsrcextract sgn
2023-07-12 18:37 ` [PR REVIEW] vsrcextract classabbyamp
2023-07-17 3:01 ` [PR PATCH] [Updated] vsrcextract sgn
2023-07-28 16:04 ` sgn
2023-08-01 13:32 ` sgn [this message]
2023-08-21 4:27 ` [PR PATCH] [Merged]: vsrcextract sgn
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=20230801133237.SgdB_f_yHNoDSwcM_2F6M9h-IevQb0_GVzwxc2vhkbs@z \
--to=sgn@users.noreply.github.com \
--cc=ml@inbox.vuxu.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).