[v2] patch.py: Prevent git repo reinitialization

Message ID 20220221142006.6501-1-pavel@zhukoff.net
State Accepted, archived
Commit 80500ecda4c1bc8812e6e078b6b0db5ec46624de
Headers show
Series [v2] patch.py: Prevent git repo reinitialization | expand

Commit Message

Pavel Zhukov Feb. 21, 2022, 2:20 p.m. UTC
There were few bugs in the _isInitialized() function which might trigger
git repo to be reinitialized and patches failing to apply.

Signed-off-by: Pavel Zhukov <pavel.zhukov@huawei.com>
---
 .../net-tools/Add_missing_headers.patch       |  15 +++
 .../net-tools/net-tools/net-tools-config.h    |  75 +++++++++++
 .../net-tools/net-tools/net-tools-config.make |  36 ++++++
 .../recipes-test/net-tools/net-tools_2.10.bb  | 121 ++++++++++++++++++
 meta/lib/oe/patch.py                          |   6 +-
 meta/lib/oeqa/selftest/cases/bbtests.py       |  20 ++-
 6 files changed, 268 insertions(+), 5 deletions(-)
 create mode 100644 meta-selftest/recipes-test/net-tools/net-tools/Add_missing_headers.patch
 create mode 100644 meta-selftest/recipes-test/net-tools/net-tools/net-tools-config.h
 create mode 100644 meta-selftest/recipes-test/net-tools/net-tools/net-tools-config.make
 create mode 100644 meta-selftest/recipes-test/net-tools/net-tools_2.10.bb

Comments

Richard Purdie Feb. 21, 2022, 4:42 p.m. UTC | #1
On Mon, 2022-02-21 at 15:20 +0100, Pavel Zhukov wrote:
> There were few bugs in the _isInitialized() function which might trigger
> git repo to be reinitialized and patches failing to apply.
> 
> Signed-off-by: Pavel Zhukov <pavel.zhukov@huawei.com>
> ---
>  .../net-tools/Add_missing_headers.patch       |  15 +++
>  .../net-tools/net-tools/net-tools-config.h    |  75 +++++++++++
>  .../net-tools/net-tools/net-tools-config.make |  36 ++++++
>  .../recipes-test/net-tools/net-tools_2.10.bb  | 121 ++++++++++++++++++
>  meta/lib/oe/patch.py                          |   6 +-
>  meta/lib/oeqa/selftest/cases/bbtests.py       |  20 ++-
>  6 files changed, 268 insertions(+), 5 deletions(-)
>  create mode 100644 meta-selftest/recipes-test/net-tools/net-tools/Add_missing_headers.patch
>  create mode 100644 meta-selftest/recipes-test/net-tools/net-tools/net-tools-config.h
>  create mode 100644 meta-selftest/recipes-test/net-tools/net-tools/net-tools-config.make
>  create mode 100644 meta-selftest/recipes-test/net-tools/net-tools_2.10.bb
> 
> diff --git a/meta-selftest/recipes-test/net-tools/net-tools/Add_missing_headers.patch b/meta-selftest/recipes-test/net-tools/net-tools/Add_missing_headers.patch
> new file mode 100644
> index 0000000000..f15d3654c7
> --- /dev/null
> +++ b/meta-selftest/recipes-test/net-tools/net-tools/Add_missing_headers.patch
> @@ -0,0 +1,15 @@
> +Description: Add missing headers
> +
> +Upstream-Status: Pending
> +Signed-off-by: Martin Jansa <Martin.Jansa@gmail.com>
> +
> +--- a/netstat.c
> ++++ b/netstat.c
> +@@ -88,6 +88,7 @@
> + #include <sys/stat.h>
> + #include <net/if.h>
> + #include <dirent.h>
> ++#include <sys/types.h>
> + 
> + #include "net-support.h"
> + #include "pathnames.h"
> diff --git a/meta-selftest/recipes-test/net-tools/net-tools/net-tools-config.h b/meta-selftest/recipes-test/net-tools/net-tools/net-tools-config.h
> new file mode 100644
> index 0000000000..6d39c2a8cb
> --- /dev/null
> +++ b/meta-selftest/recipes-test/net-tools/net-tools/net-tools-config.h
> @@ -0,0 +1,75 @@
> +/*
> +* config.h	Automatically generated configuration includefile
> +*
> +* NET-TOOLS	A collection of programs that form the base set of the
> +*		NET-3 Networking Distribution for the LINUX operating
> +*		system.
> +*
> +*		DO  NOT  EDIT  DIRECTLY
> +*
> +*/
> +
> +/* 
> + * 
> + * Internationalization
> + * 
> + * The net-tools package has currently been translated to French,
> + * German and Brazilian Portugese.  Other translations are, of
> + * course, welcome.  Answer `n' here if you have no support for
> + * internationalization on your system.
> + * 
> + */
> +#define I18N 1
> +
> +/* 
> + * 
> + * Protocol Families.
> + * 
> + */
> +#define HAVE_AFUNIX 1
> +#define HAVE_AFINET 1
> +#define HAVE_AFINET6 1
> +#define HAVE_AFIPX 0
> +#define HAVE_AFATALK 0
> +#define HAVE_AFAX25 0
> +#define HAVE_AFNETROM 1
> +#define HAVE_AFROSE 0
> +#define HAVE_AFX25 0
> +#define HAVE_AFECONET 0
> +#define HAVE_AFDECnet 0
> +#define HAVE_AFASH 0
> +
> +/* 
> + * 
> + * Device Hardware types.
> + * 
> + */
> +#define HAVE_HWETHER 1
> +#define HAVE_HWARC 1
> +#define HAVE_HWSLIP 1
> +#define HAVE_HWPPP 1
> +#define HAVE_HWTUNNEL 1
> +#define HAVE_HWSTRIP 0
> +#define HAVE_HWTR 0
> +#define HAVE_HWAX25 0
> +#define HAVE_HWROSE 0
> +#define HAVE_HWNETROM 1
> +#define HAVE_HWX25 0
> +#define HAVE_HWFR 1
> +#define HAVE_HWSIT 0
> +#define HAVE_HWFDDI 0
> +#define HAVE_HWHIPPI 0
> +#define HAVE_HWASH 0
> +#define HAVE_HWHDLCLAPB 0
> +#define HAVE_HWIRDA 1
> +#define HAVE_HWEC 0
> +#define HAVE_HWIB 0
> +
> +/* 
> + * 
> + * Other Features.
> + * 
> + */
> +#define HAVE_FW_MASQUERADE 1
> +#define HAVE_IP_TOOLS 1
> +#define HAVE_MII 1
> diff --git a/meta-selftest/recipes-test/net-tools/net-tools/net-tools-config.make b/meta-selftest/recipes-test/net-tools/net-tools/net-tools-config.make
> new file mode 100644
> index 0000000000..ec516f27ee
> --- /dev/null
> +++ b/meta-selftest/recipes-test/net-tools/net-tools/net-tools-config.make
> @@ -0,0 +1,36 @@
> +I18N=1
> +HAVE_AFUNIX=1
> +HAVE_AFINET=1
> +HAVE_AFINET6=1
> +# HAVE_AFIPX=0
> +# HAVE_AFATALK=0
> +# HAVE_AFAX25=0
> +HAVE_AFNETROM=1
> +# HAVE_AFROSE=0
> +# HAVE_AFX25=0
> +# HAVE_AFECONET=0
> +# HAVE_AFDECnet=0
> +# HAVE_AFASH=0
> +HAVE_HWETHER=1
> +HAVE_HWARC=1
> +HAVE_HWSLIP=1
> +HAVE_HWPPP=1
> +HAVE_HWTUNNEL=1
> +HAVE_HWSTRIP=1
> +HAVE_HWTR=1
> +# HAVE_HWAX25=0
> +# HAVE_HWROSE=0
> +HAVE_HWNETROM=1
> +# HAVE_HWX25=0
> +HAVE_HWFR=1
> +# HAVE_HWSIT=0
> +# HAVE_HWFDDI=0
> +# HAVE_HWHIPPI=0
> +# HAVE_HWASH=0
> +# HAVE_HWHDLCLAPB=0
> +HAVE_HWIRDA=1
> +# HAVE_HWEC=0
> +# HAVE_HWIB=0
> +HAVE_FW_MASQUERADE=1
> +HAVE_IP_TOOLS=1
> +HAVE_MII=1
> diff --git a/meta-selftest/recipes-test/net-tools/net-tools_2.10.bb b/meta-selftest/recipes-test/net-tools/net-tools_2.10.bb
> new file mode 100644
> index 0000000000..33304297ec
> --- /dev/null
> +++ b/meta-selftest/recipes-test/net-tools/net-tools_2.10.bb
> @@ -0,0 +1,121 @@
> +SUMMARY = "Basic networking tools"
> +DESCRIPTION = "A collection of programs that form the base set of the NET-3 networking distribution for the Linux operating system"
> +HOMEPAGE = "http://net-tools.berlios.de/"
> +BUGTRACKER = "http://bugs.debian.org/net-tools"
> +LICENSE = "GPL-2.0-or-later"
> +LIC_FILES_CHKSUM = "file://COPYING;md5=b234ee4d69f5fce4486a80fdaf4a4263 \
> +                    file://ifconfig.c;beginline=11;endline=15;md5=d1ca372080ad5401e23ca0afc35cf9ba"
> +
> +SRCREV = "80d7b95067f1f22fece9537dea6dff53081f4886"
> +SRC_URI = "git://git.code.sf.net/p/net-tools/code;protocol=https;branch=master \
> +    file://net-tools-config.h \
> +    file://net-tools-config.make \
> +    file://Add_missing_headers.patch \
> +"
> +
> +S = "${WORKDIR}/git"
> +
> +inherit gettext
> +
> +# The Makefile is lame, no parallel build
> +PARALLEL_MAKE = ""
> +
> +PACKAGECONFIG ??= "hostname arp serial plip"
> +PACKAGECONFIG[hostname] = ""
> +PACKAGECONFIG[arp] = ""
> +PACKAGECONFIG[serial] = ""
> +PACKAGECONFIG[plip] = ""
> +PACKAGECONFIG[slattach] = ""
> +PACKAGECONFIG[plipconfig] = ""
> +
> +do_configure() {
> +	# net-tools has its own config mechanism requiring "make config"
> +	# we pre-generate desired options and copy to source directory instead
> +	cp ${WORKDIR}/net-tools-config.h    ${S}/config.h
> +	cp ${WORKDIR}/net-tools-config.make ${S}/config.make
> +
> +	if [ "${USE_NLS}" = "no" ]; then
> +		sed -i -e 's/^I18N=1/# I18N=1/' ${S}/config.make
> +	fi
> +
> +	if ${@bb.utils.contains('PACKAGECONFIG', 'hostname', 'true', 'false', d)} ; then
> +		echo "#define HAVE_HOSTNAME_TOOLS 1" >> ${S}/config.h
> +		echo "#define HAVE_HOSTNAME_SYMLINKS 1" >> ${S}/config.h
> +		echo "HAVE_HOSTNAME_TOOLS=1" >> ${S}/config.make
> +		echo "HAVE_HOSTNAME_SYMLINKS=1" >> ${S}/config.make
> +	fi
> +	if ${@bb.utils.contains('PACKAGECONFIG', 'arp', 'true', 'false', d)} ; then
> +		echo "#define HAVE_ARP_TOOLS 1" >> ${S}/config.h
> +		echo "HAVE_ARP_TOOLS=1" >> ${S}/config.make
> +	fi
> +	if ${@bb.utils.contains('PACKAGECONFIG', 'serial', 'true', 'false', d)} ; then
> +		echo "#define HAVE_SERIAL_TOOLS 1" >> ${S}/config.h
> +		echo "HAVE_SERIAL_TOOLS=1" >> ${S}/config.make
> +	fi
> +	if ${@bb.utils.contains('PACKAGECONFIG', 'plip', 'true', 'false', d)} ; then
> +		echo "#define HAVE_PLIP_TOOLS 1" >> ${S}/config.h
> +		echo "HAVE_PLIP_TOOLS=1" >> ${S}/config.make
> +	fi
> +}
> +
> +do_compile() {
> +	# net-tools use COPTS/LOPTS to allow adding custom options
> +	oe_runmake COPTS="$CFLAGS" LOPTS="$LDFLAGS"
> +}
> +
> +do_install() {
> +	# We don't need COPTS or LOPTS, but let's be consistent.
> +	oe_runmake COPTS="$CFLAGS" LOPTS="$LDFLAGS" BASEDIR=${D} INSTALLNLSDIR=${D}${datadir}/locale mandir=${mandir} install
> +
> +	if [ "${base_bindir}" != "/bin" ]; then
> +		mkdir -p ${D}/${base_bindir}
> +		mv ${D}/bin/* ${D}/${base_bindir}/
> +		rmdir ${D}/bin
> +	fi
> +	if [ "${base_sbindir}" != "/sbin" ]; then
> +		mkdir ${D}/${base_sbindir}
> +		mv ${D}/sbin/* ${D}/${base_sbindir}/
> +		rmdir ${D}/sbin
> +	fi
> +}
> +
> +inherit update-alternatives
> +
> +base_sbindir_progs = "ipmaddr iptunnel mii-tool nameif \
> +    ${@bb.utils.contains('PACKAGECONFIG', 'arp', 'arp rarp', '', d)} \
> +    ${@bb.utils.contains('PACKAGECONFIG', 'plip', 'plipconfig', '', d)} \
> +    ${@bb.utils.contains('PACKAGECONFIG', 'serial', 'slattach', '', d)} \
> +"
> +base_bindir_progs  = "ifconfig netstat route \
> +    ${@bb.utils.contains('PACKAGECONFIG', 'hostname', 'dnsdomainname domainname hostname nisdomainname ypdomainname', '', d)} \
> +"
> +
> +ALTERNATIVE:${PN} = "${base_sbindir_progs} ${base_bindir_progs}"
> +ALTERNATIVE:${PN}-doc += "${@bb.utils.contains('PACKAGECONFIG', 'hostname', 'hostname.1 dnsdomainname.1', '', d)}"
> +ALTERNATIVE_LINK_NAME[hostname.1] = "${mandir}/man1/hostname.1"
> +ALTERNATIVE_LINK_NAME[dnsdomainname.1] = "${mandir}/man1/dnsdomainname.1"
> +ALTERNATIVE_PRIORITY[hostname.1] = "10"
> +
> +python __anonymous() {
> +    for prog in d.getVar('base_sbindir_progs').split():
> +        d.setVarFlag('ALTERNATIVE_LINK_NAME', prog, '%s/%s' % (d.getVar('base_sbindir'), prog))
> +    for prog in d.getVar('base_bindir_progs').split():
> +        d.setVarFlag('ALTERNATIVE_LINK_NAME', prog, '%s/%s' % (d.getVar('base_bindir'), prog))
> +}
> +ALTERNATIVE_PRIORITY = "100"
> +
> +NETTOOLS_PACKAGES = "${PN}-mii-tool"
> +NETTOOLS_PACKAGES:class-native = ""
> +
> +PACKAGE_BEFORE_PN = "${NETTOOLS_PACKAGES}"
> +RDEPENDS:${PN} += "${NETTOOLS_PACKAGES}"
> +
> +FILES:${PN}-mii-tool = "${base_sbindir}/mii-tool"
> +
> +ALTERNATIVE:${PN}:remove = "mii-tool"
> +
> +ALTERNATIVE:${PN}-mii-tool = "mii-tool"
> +ALTERNATIVE_TARGET[mii-tool] = "${base_sbindir}/mii-tool"
> +ALTERNATIVE_LINK_NAME[mii-tool] = "${base_sbindir}/mii-tool"
> +
> +BBCLASSEXTEND = "native nativesdk"

I'm not sure we want to add a copy of net-tools to the selftest layer. This
causes conflicts with the real net-tools recipe. Perhaps we can rename it to
something different for the test? You can also likely simplify the recipe, e.g.
remove the BBCLASSEXTEND and alternatives pieces, perhaps more. I doubt we need
those for the test?

Cheers,

Richard
Christian Eggers Feb. 21, 2022, 5:29 p.m. UTC | #2
On Monday, 21 February 2022, 15:20:07 CET, Pavel Zhukov wrote:
> There were few bugs in the _isInitialized() function which might trigger
> git repo to be reinitialized and patches failing to apply.
> 
> Signed-off-by: Pavel Zhukov <pavel.zhukov@huawei.com>
> ---
>  .../net-tools/Add_missing_headers.patch       |  15 +++
>  .../net-tools/net-tools/net-tools-config.h    |  75 +++++++++++
>  .../net-tools/net-tools/net-tools-config.make |  36 ++++++
>  .../recipes-test/net-tools/net-tools_2.10.bb  | 121 ++++++++++++++++++
>  meta/lib/oe/patch.py                          |   6 +-
>  meta/lib/oeqa/selftest/cases/bbtests.py       |  20 ++-
>  6 files changed, 268 insertions(+), 5 deletions(-)
>  create mode 100644 meta-selftest/recipes-test/net-tools/net-tools/Add_missing_headers.patch
>  create mode 100644 meta-selftest/recipes-test/net-tools/net-tools/net-tools-config.h
>  create mode 100644 meta-selftest/recipes-test/net-tools/net-tools/net-tools-config.make
>  create mode 100644 meta-selftest/recipes-test/net-tools/net-tools_2.10.bb
> 
> [...]
>
> diff --git a/meta/lib/oe/patch.py b/meta/lib/oe/patch.py
> index 950fe723dc..2163e336c2 100644
> --- a/meta/lib/oe/patch.py
> +++ b/meta/lib/oe/patch.py
> @@ -304,14 +304,14 @@ class GitApplyTree(PatchTree):
>  
>      def _isInitialized(self):
>          cmd = "git rev-parse --show-toplevel"
> -        (status, output) = subprocess.getstatusoutput(cmd.split())
> +        (status, output) = subprocess.getstatusoutput(cmd)
>          ## Make sure repo is in builddir to not break top-level git repos
> -        return status == 0 and os.path.samedir(output, self.dir)
> +        return status == 0 and os.path.samefile(output, self.dir)

I have the following variable values here:
- status: 0
- output: /home/eggers/<...>/yocto
- self.dir: /home/eggers/<...>/build/devel-kirkstone/tmp/work/orbiter-poky-linux-musleabi/linux-stable-rt/5.10.100-rt62-orbiter+gitAUTOINC+ca44e6dff2-r0/git

So os.path.samefile() returns false and the existing Git repository
is still reinitialized.

regards
Christian

Patch

diff --git a/meta-selftest/recipes-test/net-tools/net-tools/Add_missing_headers.patch b/meta-selftest/recipes-test/net-tools/net-tools/Add_missing_headers.patch
new file mode 100644
index 0000000000..f15d3654c7
--- /dev/null
+++ b/meta-selftest/recipes-test/net-tools/net-tools/Add_missing_headers.patch
@@ -0,0 +1,15 @@ 
+Description: Add missing headers
+
+Upstream-Status: Pending
+Signed-off-by: Martin Jansa <Martin.Jansa@gmail.com>
+
+--- a/netstat.c
++++ b/netstat.c
+@@ -88,6 +88,7 @@
+ #include <sys/stat.h>
+ #include <net/if.h>
+ #include <dirent.h>
++#include <sys/types.h>
+ 
+ #include "net-support.h"
+ #include "pathnames.h"
diff --git a/meta-selftest/recipes-test/net-tools/net-tools/net-tools-config.h b/meta-selftest/recipes-test/net-tools/net-tools/net-tools-config.h
new file mode 100644
index 0000000000..6d39c2a8cb
--- /dev/null
+++ b/meta-selftest/recipes-test/net-tools/net-tools/net-tools-config.h
@@ -0,0 +1,75 @@ 
+/*
+* config.h	Automatically generated configuration includefile
+*
+* NET-TOOLS	A collection of programs that form the base set of the
+*		NET-3 Networking Distribution for the LINUX operating
+*		system.
+*
+*		DO  NOT  EDIT  DIRECTLY
+*
+*/
+
+/* 
+ * 
+ * Internationalization
+ * 
+ * The net-tools package has currently been translated to French,
+ * German and Brazilian Portugese.  Other translations are, of
+ * course, welcome.  Answer `n' here if you have no support for
+ * internationalization on your system.
+ * 
+ */
+#define I18N 1
+
+/* 
+ * 
+ * Protocol Families.
+ * 
+ */
+#define HAVE_AFUNIX 1
+#define HAVE_AFINET 1
+#define HAVE_AFINET6 1
+#define HAVE_AFIPX 0
+#define HAVE_AFATALK 0
+#define HAVE_AFAX25 0
+#define HAVE_AFNETROM 1
+#define HAVE_AFROSE 0
+#define HAVE_AFX25 0
+#define HAVE_AFECONET 0
+#define HAVE_AFDECnet 0
+#define HAVE_AFASH 0
+
+/* 
+ * 
+ * Device Hardware types.
+ * 
+ */
+#define HAVE_HWETHER 1
+#define HAVE_HWARC 1
+#define HAVE_HWSLIP 1
+#define HAVE_HWPPP 1
+#define HAVE_HWTUNNEL 1
+#define HAVE_HWSTRIP 0
+#define HAVE_HWTR 0
+#define HAVE_HWAX25 0
+#define HAVE_HWROSE 0
+#define HAVE_HWNETROM 1
+#define HAVE_HWX25 0
+#define HAVE_HWFR 1
+#define HAVE_HWSIT 0
+#define HAVE_HWFDDI 0
+#define HAVE_HWHIPPI 0
+#define HAVE_HWASH 0
+#define HAVE_HWHDLCLAPB 0
+#define HAVE_HWIRDA 1
+#define HAVE_HWEC 0
+#define HAVE_HWIB 0
+
+/* 
+ * 
+ * Other Features.
+ * 
+ */
+#define HAVE_FW_MASQUERADE 1
+#define HAVE_IP_TOOLS 1
+#define HAVE_MII 1
diff --git a/meta-selftest/recipes-test/net-tools/net-tools/net-tools-config.make b/meta-selftest/recipes-test/net-tools/net-tools/net-tools-config.make
new file mode 100644
index 0000000000..ec516f27ee
--- /dev/null
+++ b/meta-selftest/recipes-test/net-tools/net-tools/net-tools-config.make
@@ -0,0 +1,36 @@ 
+I18N=1
+HAVE_AFUNIX=1
+HAVE_AFINET=1
+HAVE_AFINET6=1
+# HAVE_AFIPX=0
+# HAVE_AFATALK=0
+# HAVE_AFAX25=0
+HAVE_AFNETROM=1
+# HAVE_AFROSE=0
+# HAVE_AFX25=0
+# HAVE_AFECONET=0
+# HAVE_AFDECnet=0
+# HAVE_AFASH=0
+HAVE_HWETHER=1
+HAVE_HWARC=1
+HAVE_HWSLIP=1
+HAVE_HWPPP=1
+HAVE_HWTUNNEL=1
+HAVE_HWSTRIP=1
+HAVE_HWTR=1
+# HAVE_HWAX25=0
+# HAVE_HWROSE=0
+HAVE_HWNETROM=1
+# HAVE_HWX25=0
+HAVE_HWFR=1
+# HAVE_HWSIT=0
+# HAVE_HWFDDI=0
+# HAVE_HWHIPPI=0
+# HAVE_HWASH=0
+# HAVE_HWHDLCLAPB=0
+HAVE_HWIRDA=1
+# HAVE_HWEC=0
+# HAVE_HWIB=0
+HAVE_FW_MASQUERADE=1
+HAVE_IP_TOOLS=1
+HAVE_MII=1
diff --git a/meta-selftest/recipes-test/net-tools/net-tools_2.10.bb b/meta-selftest/recipes-test/net-tools/net-tools_2.10.bb
new file mode 100644
index 0000000000..33304297ec
--- /dev/null
+++ b/meta-selftest/recipes-test/net-tools/net-tools_2.10.bb
@@ -0,0 +1,121 @@ 
+SUMMARY = "Basic networking tools"
+DESCRIPTION = "A collection of programs that form the base set of the NET-3 networking distribution for the Linux operating system"
+HOMEPAGE = "http://net-tools.berlios.de/"
+BUGTRACKER = "http://bugs.debian.org/net-tools"
+LICENSE = "GPL-2.0-or-later"
+LIC_FILES_CHKSUM = "file://COPYING;md5=b234ee4d69f5fce4486a80fdaf4a4263 \
+                    file://ifconfig.c;beginline=11;endline=15;md5=d1ca372080ad5401e23ca0afc35cf9ba"
+
+SRCREV = "80d7b95067f1f22fece9537dea6dff53081f4886"
+SRC_URI = "git://git.code.sf.net/p/net-tools/code;protocol=https;branch=master \
+    file://net-tools-config.h \
+    file://net-tools-config.make \
+    file://Add_missing_headers.patch \
+"
+
+S = "${WORKDIR}/git"
+
+inherit gettext
+
+# The Makefile is lame, no parallel build
+PARALLEL_MAKE = ""
+
+PACKAGECONFIG ??= "hostname arp serial plip"
+PACKAGECONFIG[hostname] = ""
+PACKAGECONFIG[arp] = ""
+PACKAGECONFIG[serial] = ""
+PACKAGECONFIG[plip] = ""
+PACKAGECONFIG[slattach] = ""
+PACKAGECONFIG[plipconfig] = ""
+
+do_configure() {
+	# net-tools has its own config mechanism requiring "make config"
+	# we pre-generate desired options and copy to source directory instead
+	cp ${WORKDIR}/net-tools-config.h    ${S}/config.h
+	cp ${WORKDIR}/net-tools-config.make ${S}/config.make
+
+	if [ "${USE_NLS}" = "no" ]; then
+		sed -i -e 's/^I18N=1/# I18N=1/' ${S}/config.make
+	fi
+
+	if ${@bb.utils.contains('PACKAGECONFIG', 'hostname', 'true', 'false', d)} ; then
+		echo "#define HAVE_HOSTNAME_TOOLS 1" >> ${S}/config.h
+		echo "#define HAVE_HOSTNAME_SYMLINKS 1" >> ${S}/config.h
+		echo "HAVE_HOSTNAME_TOOLS=1" >> ${S}/config.make
+		echo "HAVE_HOSTNAME_SYMLINKS=1" >> ${S}/config.make
+	fi
+	if ${@bb.utils.contains('PACKAGECONFIG', 'arp', 'true', 'false', d)} ; then
+		echo "#define HAVE_ARP_TOOLS 1" >> ${S}/config.h
+		echo "HAVE_ARP_TOOLS=1" >> ${S}/config.make
+	fi
+	if ${@bb.utils.contains('PACKAGECONFIG', 'serial', 'true', 'false', d)} ; then
+		echo "#define HAVE_SERIAL_TOOLS 1" >> ${S}/config.h
+		echo "HAVE_SERIAL_TOOLS=1" >> ${S}/config.make
+	fi
+	if ${@bb.utils.contains('PACKAGECONFIG', 'plip', 'true', 'false', d)} ; then
+		echo "#define HAVE_PLIP_TOOLS 1" >> ${S}/config.h
+		echo "HAVE_PLIP_TOOLS=1" >> ${S}/config.make
+	fi
+}
+
+do_compile() {
+	# net-tools use COPTS/LOPTS to allow adding custom options
+	oe_runmake COPTS="$CFLAGS" LOPTS="$LDFLAGS"
+}
+
+do_install() {
+	# We don't need COPTS or LOPTS, but let's be consistent.
+	oe_runmake COPTS="$CFLAGS" LOPTS="$LDFLAGS" BASEDIR=${D} INSTALLNLSDIR=${D}${datadir}/locale mandir=${mandir} install
+
+	if [ "${base_bindir}" != "/bin" ]; then
+		mkdir -p ${D}/${base_bindir}
+		mv ${D}/bin/* ${D}/${base_bindir}/
+		rmdir ${D}/bin
+	fi
+	if [ "${base_sbindir}" != "/sbin" ]; then
+		mkdir ${D}/${base_sbindir}
+		mv ${D}/sbin/* ${D}/${base_sbindir}/
+		rmdir ${D}/sbin
+	fi
+}
+
+inherit update-alternatives
+
+base_sbindir_progs = "ipmaddr iptunnel mii-tool nameif \
+    ${@bb.utils.contains('PACKAGECONFIG', 'arp', 'arp rarp', '', d)} \
+    ${@bb.utils.contains('PACKAGECONFIG', 'plip', 'plipconfig', '', d)} \
+    ${@bb.utils.contains('PACKAGECONFIG', 'serial', 'slattach', '', d)} \
+"
+base_bindir_progs  = "ifconfig netstat route \
+    ${@bb.utils.contains('PACKAGECONFIG', 'hostname', 'dnsdomainname domainname hostname nisdomainname ypdomainname', '', d)} \
+"
+
+ALTERNATIVE:${PN} = "${base_sbindir_progs} ${base_bindir_progs}"
+ALTERNATIVE:${PN}-doc += "${@bb.utils.contains('PACKAGECONFIG', 'hostname', 'hostname.1 dnsdomainname.1', '', d)}"
+ALTERNATIVE_LINK_NAME[hostname.1] = "${mandir}/man1/hostname.1"
+ALTERNATIVE_LINK_NAME[dnsdomainname.1] = "${mandir}/man1/dnsdomainname.1"
+ALTERNATIVE_PRIORITY[hostname.1] = "10"
+
+python __anonymous() {
+    for prog in d.getVar('base_sbindir_progs').split():
+        d.setVarFlag('ALTERNATIVE_LINK_NAME', prog, '%s/%s' % (d.getVar('base_sbindir'), prog))
+    for prog in d.getVar('base_bindir_progs').split():
+        d.setVarFlag('ALTERNATIVE_LINK_NAME', prog, '%s/%s' % (d.getVar('base_bindir'), prog))
+}
+ALTERNATIVE_PRIORITY = "100"
+
+NETTOOLS_PACKAGES = "${PN}-mii-tool"
+NETTOOLS_PACKAGES:class-native = ""
+
+PACKAGE_BEFORE_PN = "${NETTOOLS_PACKAGES}"
+RDEPENDS:${PN} += "${NETTOOLS_PACKAGES}"
+
+FILES:${PN}-mii-tool = "${base_sbindir}/mii-tool"
+
+ALTERNATIVE:${PN}:remove = "mii-tool"
+
+ALTERNATIVE:${PN}-mii-tool = "mii-tool"
+ALTERNATIVE_TARGET[mii-tool] = "${base_sbindir}/mii-tool"
+ALTERNATIVE_LINK_NAME[mii-tool] = "${base_sbindir}/mii-tool"
+
+BBCLASSEXTEND = "native nativesdk"
diff --git a/meta/lib/oe/patch.py b/meta/lib/oe/patch.py
index 950fe723dc..2163e336c2 100644
--- a/meta/lib/oe/patch.py
+++ b/meta/lib/oe/patch.py
@@ -304,14 +304,14 @@  class GitApplyTree(PatchTree):
 
     def _isInitialized(self):
         cmd = "git rev-parse --show-toplevel"
-        (status, output) = subprocess.getstatusoutput(cmd.split())
+        (status, output) = subprocess.getstatusoutput(cmd)
         ## Make sure repo is in builddir to not break top-level git repos
-        return status == 0 and os.path.samedir(output, self.dir)
+        return status == 0 and os.path.samefile(output, self.dir)
 
     def _initRepo(self):
         runcmd("git init".split(), self.dir)
         runcmd("git add .".split(), self.dir)
-        runcmd("git commit -a --allow-empty -m Patching_started".split(), self.dir)
+        runcmd("git commit -a --allow-empty -m bitbake_patching_started".split(), self.dir)
 
     @staticmethod
     def extractPatchHeader(patchfile):
diff --git a/meta/lib/oeqa/selftest/cases/bbtests.py b/meta/lib/oeqa/selftest/cases/bbtests.py
index ce72c4bcc6..ae3f230038 100644
--- a/meta/lib/oeqa/selftest/cases/bbtests.py
+++ b/meta/lib/oeqa/selftest/cases/bbtests.py
@@ -307,11 +307,27 @@  INHERIT:remove = \"report-error\"
         src = get_bb_var("SRC_URI",test_recipe)
         gitscm = re.search("git://", src)
         self.assertFalse(gitscm, "test_git_patchtool pre-condition failed: {} test recipe contains git repo!".format(test_recipe))
-        result = bitbake('man-db -c patch', ignore_status=False)
+        result = bitbake('{} -c patch'.format(test_recipe), ignore_status=False)
         fatal = re.search("fatal: not a git repository (or any of the parent directories)", result.output)
         self.assertFalse(fatal, "Failed to patch using PATCHTOOL=\"git\"")
         self.delete_recipeinc(test_recipe)
-        bitbake('-cclean man-db')
+        bitbake('-cclean {}'.format(test_recipe))
+
+    def test_git_patchtool2(self):
+        """ Test if PATCHTOOL=git works with git repo and doesn't reinitialize it
+        """
+        test_recipe = "net-tools"
+        self.write_recipeinc(test_recipe, 'PATCHTOOL=\"git\"')
+        src = get_bb_var("SRC_URI",test_recipe)
+        gitscm = re.search("git://", src)
+        self.assertTrue(gitscm, "test_git_patchtool pre-condition failed: {} test recipe doesn't contains git repo!".format(test_recipe))
+        result = bitbake('{} -c patch'.format(test_recipe), ignore_status=False)
+        srcdir = get_bb_var('S', test_recipe)
+        result = runCmd("git log", cwd = srcdir)
+        self.assertFalse("bitbake_patching_started" in result.output, msg = "Repository has been reinitialized. {}".format(srcdir))
+        self.delete_recipeinc(test_recipe)
+        bitbake('-cclean {}'.format(test_recipe))
+
 
     def test_git_unpack_nonetwork(self):
         """