mirror of
https://github.com/gentoo-mirror/gentoo.git
synced 2026-08-01 23:28:08 -07:00
dev-python/pygobject: Remove old
Signed-off-by: Michał Górny <mgorny@gentoo.org>
This commit is contained in:
@@ -1,3 +1,2 @@
|
||||
DIST pygobject-2.28.6.tar.xz 747248 BLAKE2B 5f92794034b2d0559a623db4a7d273a7dc3f099cae87ede91b17e81acac085a9298c6b81b45b4b8540b6a75ced97e474a993437dbfcfc2133d3321d6a979b541 SHA512 37544ea2377258758169b25a2969d5ee1c9ffb9b6e63e05bc7a0471a49ac9169c51ec587d4489172c7d256f53df878a81c1992a08059aa7e43dbbb69f799545c
|
||||
DIST pygobject-3.34.0.tar.xz 552268 BLAKE2B a9cbeb644e0aa1b23067b591fe5c6299741395656631d39782a8c183a5d3a8e5e7f1a81acdefee186b7cc2bc34dda9271468b1828d5b9613ddc1256e24f1ecb8 SHA512 782195d22e564b88dea8d43469f0111f398b44b51a63df2fe7d07650af94d5cd037f322a5d7e405338823be3419fcdbf0113fe50b220ab1cfd07d4d01dbc4766
|
||||
DIST pygobject-3.36.1.tar.xz 556568 BLAKE2B cd38aec8e71ff230926327e77867d07ae0fd5549b71619301bb3be01821ea93e557ecf335ea238292176981a864b269eaa2a86da47e8fb320f187f54caf24dc4 SHA512 5e00dcd03dfe4f92acbf827c13c164b6b9740b2a8cef3b2dce70f96a2156fee2411c84dc669f12b910f4a93daa03ba845282832e2b09d8c887102d43764a345f
|
||||
|
||||
@@ -1,64 +0,0 @@
|
||||
From b3e852d29bfd1e90f7e0da409fd0ae36cc01675a Mon Sep 17 00:00:00 2001
|
||||
From: Gilles Dartiguelongue <eva@gentoo.org>
|
||||
Date: Fri, 8 Apr 2011 15:36:35 +0200
|
||||
Subject: [PATCH 1/3] Move codegen to a non-private directory
|
||||
|
||||
---
|
||||
codegen/Makefile.am | 2 +-
|
||||
codegen/pygobject-codegen-2.0.in | 3 ++-
|
||||
pygobject-2.0.pc.in | 3 ++-
|
||||
3 files changed, 5 insertions(+), 3 deletions(-)
|
||||
|
||||
diff --git a/codegen/Makefile.am b/codegen/Makefile.am
|
||||
index f9886eb..d714ff2 100644
|
||||
--- a/codegen/Makefile.am
|
||||
+++ b/codegen/Makefile.am
|
||||
@@ -2,7 +2,7 @@ PLATFORM_VERSION = 2.0
|
||||
|
||||
bin_SCRIPTS = pygobject-codegen-$(PLATFORM_VERSION)
|
||||
|
||||
-codegendir = $(pkgdatadir)/$(PLATFORM_VERSION)/codegen
|
||||
+codegendir = $(pyexecdir)/gtk-2.0/codegen
|
||||
|
||||
codegen_SCRIPTS = \
|
||||
code-coverage.py \
|
||||
diff --git a/codegen/pygobject-codegen-2.0.in b/codegen/pygobject-codegen-2.0.in
|
||||
index c5c912e..c04451b 100644
|
||||
--- a/codegen/pygobject-codegen-2.0.in
|
||||
+++ b/codegen/pygobject-codegen-2.0.in
|
||||
@@ -1,9 +1,10 @@
|
||||
#!/bin/sh
|
||||
|
||||
prefix=@prefix@
|
||||
+exec_prefix=@exec_prefix@
|
||||
datarootdir=@datarootdir@
|
||||
datadir=@datadir@
|
||||
-codegendir=${datadir}/pygobject/2.0/codegen
|
||||
+codegendir=@pyexecdir@/gtk-2.0/codegen
|
||||
|
||||
PYTHONPATH=$codegendir
|
||||
export PYTHONPATH
|
||||
diff --git a/pygobject-2.0.pc.in b/pygobject-2.0.pc.in
|
||||
index a47b685..0d1a811 100644
|
||||
--- a/pygobject-2.0.pc.in
|
||||
+++ b/pygobject-2.0.pc.in
|
||||
@@ -4,6 +4,7 @@ includedir=@includedir@
|
||||
datarootdir=@datarootdir@
|
||||
datadir=@datadir@
|
||||
libdir=@libdir@
|
||||
+pyexecdir=@pyexecdir@
|
||||
|
||||
# you can use the --variable=pygtkincludedir argument to
|
||||
# pkg-config to get this value. You might want to use this to
|
||||
@@ -12,7 +13,7 @@ pygtkincludedir=${includedir}/pygtk-2.0
|
||||
fixxref=${datadir}/pygobject/xsl/fixxref.py
|
||||
pygdocs=${datadir}/gtk-doc/html/pygobject
|
||||
defsdir=${datadir}/pygobject/2.0/defs
|
||||
-codegendir=${datadir}/pygobject/2.0/codegen
|
||||
+codegendir=${pyexecdir}/gtk-2.0/codegen
|
||||
overridesdir=@pyexecdir@/gi/overrides
|
||||
|
||||
Name: PyGObject
|
||||
--
|
||||
1.7.4.1
|
||||
|
||||
@@ -1,76 +0,0 @@
|
||||
From b5c4b8b97a1ccb9a4c63ab726ea9c84d81ef51ca Mon Sep 17 00:00:00 2001
|
||||
From: Gilles Dartiguelongue <eva@gentoo.org>
|
||||
Date: Fri, 5 Nov 2010 23:39:08 +0100
|
||||
Subject: [PATCH 2/3] Do not build tests unless needed
|
||||
|
||||
---
|
||||
tests/Makefile.am | 12 +++++-------
|
||||
tests/runtests.py | 2 ++
|
||||
2 files changed, 7 insertions(+), 7 deletions(-)
|
||||
|
||||
diff --git a/tests/Makefile.am b/tests/Makefile.am
|
||||
index bad15f0..5b0859a 100644
|
||||
--- a/tests/Makefile.am
|
||||
+++ b/tests/Makefile.am
|
||||
@@ -1,7 +1,7 @@
|
||||
CLEANFILES =
|
||||
-noinst_LTLIBRARIES =
|
||||
+check_LTLIBRARIES =
|
||||
if ENABLE_INTROSPECTION
|
||||
-noinst_LTLIBRARIES += libregress.la libgimarshallingtests.la
|
||||
+check_LTLIBRARIES += libregress.la libgimarshallingtests.la
|
||||
|
||||
nodist_libregress_la_SOURCES = $(GI_DATADIR)/tests/regress.c $(GI_DATADIR)/tests/regress.h
|
||||
libregress_la_CFLAGS = $(GIO_CFLAGS) $(PYCAIRO_CFLAGS)
|
||||
@@ -46,7 +46,7 @@ gschemas.compiled: org.gnome.test.gschema.xml
|
||||
CLEANFILES += Regress-1.0.gir Regress-1.0.typelib GIMarshallingTests-1.0.gir GIMarshallingTests-1.0.typelib gschemas.compiled
|
||||
endif
|
||||
|
||||
-noinst_LTLIBRARIES += testhelper.la
|
||||
+check_LTLIBRARIES += testhelper.la
|
||||
|
||||
testhelper_la_CFLAGS = -I$(top_srcdir)/gobject -I$(top_srcdir)/glib $(PYTHON_INCLUDES) $(GLIB_CFLAGS)
|
||||
testhelper_la_LDFLAGS = -module -avoid-version
|
||||
@@ -66,8 +66,6 @@ testhelper.la: $(testhelper_la_OBJECTS) $(testhelper_la_DEPENDENCIES)
|
||||
test -L $@ || $(LN_S) .libs/$@ $@
|
||||
|
||||
|
||||
-all: $(LTLIBRARIES:.la=.so)
|
||||
-
|
||||
TEST_FILES_STATIC = \
|
||||
test_gobject.py \
|
||||
test_interface.py \
|
||||
@@ -109,7 +107,7 @@ EXTRA_DIST = \
|
||||
EXTRA_DIST += $(TEST_FILES_STATIC) $(TEST_FILES_GI) $(TEST_FILES_GIO)
|
||||
|
||||
clean-local:
|
||||
- rm -f $(LTLIBRARIES:.la=.so) file.txt~
|
||||
+ rm -f $(check_LTLIBRARIES:.la=.so) file.txt~
|
||||
|
||||
DBUS_LAUNCH=$(shell which dbus-launch)
|
||||
RUN_TESTS_ENV_VARS= \
|
||||
@@ -121,7 +119,7 @@ RUN_TESTS_ENV_VARS= \
|
||||
RUN_TESTS_LAUNCH=$(RUN_TESTS_ENV_VARS) $(DBUS_LAUNCH) $(EXEC_NAME) $(PYTHON) $(srcdir)/runtests.py
|
||||
|
||||
# run tests in separately to avoid loading static and introspection bindings in the same process
|
||||
-check-local: $(LTLIBRARIES:.la=.so) Regress-1.0.typelib GIMarshallingTests-1.0.typelib gschemas.compiled
|
||||
+check-local: $(check_LTLIBRARIES:.la=.so) Regress-1.0.typelib GIMarshallingTests-1.0.typelib gschemas.compiled
|
||||
TEST_FILES="$(TEST_FILES_STATIC)" $(RUN_TESTS_LAUNCH)
|
||||
TEST_FILES="$(TEST_FILES_GI)" $(RUN_TESTS_LAUNCH)
|
||||
if BUILD_GIO
|
||||
diff --git a/tests/runtests.py b/tests/runtests.py
|
||||
index 2bb8637..4107bcf 100644
|
||||
--- a/tests/runtests.py
|
||||
+++ b/tests/runtests.py
|
||||
@@ -6,6 +6,8 @@ import sys
|
||||
|
||||
import unittest
|
||||
|
||||
+# Some tests fail with translated messages.
|
||||
+os.environ["LC_ALL"] = "C"
|
||||
|
||||
# force untranslated messages, as we check for them in some tests
|
||||
os.environ['LC_MESSAGES'] = 'C'
|
||||
--
|
||||
1.7.4.1
|
||||
|
||||
@@ -1,103 +0,0 @@
|
||||
From 2f75378f3c56f245cabdcd2c52b561dbb878db2d Mon Sep 17 00:00:00 2001
|
||||
From: Gilles Dartiguelongue <eva@gentoo.org>
|
||||
Date: Fri, 8 Apr 2011 15:43:39 +0200
|
||||
Subject: [PATCH 3/3] Enable support to build against multiple version of python
|
||||
|
||||
---
|
||||
codegen/pygobject-codegen-2.0.in | 2 +-
|
||||
gi/Makefile.am | 2 +-
|
||||
gio/Makefile.am | 2 +-
|
||||
glib/Makefile.am | 10 +++++-----
|
||||
gobject/Makefile.am | 2 +-
|
||||
5 files changed, 9 insertions(+), 9 deletions(-)
|
||||
|
||||
diff --git a/codegen/pygobject-codegen-2.0.in b/codegen/pygobject-codegen-2.0.in
|
||||
index c04451b..194e5ba 100644
|
||||
--- a/codegen/pygobject-codegen-2.0.in
|
||||
+++ b/codegen/pygobject-codegen-2.0.in
|
||||
@@ -4,7 +4,7 @@ prefix=@prefix@
|
||||
exec_prefix=@exec_prefix@
|
||||
datarootdir=@datarootdir@
|
||||
datadir=@datadir@
|
||||
-codegendir=@pyexecdir@/gtk-2.0/codegen
|
||||
+codegendir=$(@PYTHON@ -c "from distutils import sysconfig; print sysconfig.get_python_lib(1, 0, prefix='@exec_prefix@')")/gtk-2.0/codegen
|
||||
|
||||
PYTHONPATH=$codegendir
|
||||
export PYTHONPATH
|
||||
diff --git a/gi/Makefile.am b/gi/Makefile.am
|
||||
index 31f6c79..8690522 100644
|
||||
--- a/gi/Makefile.am
|
||||
+++ b/gi/Makefile.am
|
||||
@@ -25,7 +25,7 @@ _gi_la_LDFLAGS = \
|
||||
-export-symbols-regex "init_gi|PyInit__gi"
|
||||
_gi_la_LIBADD = \
|
||||
$(GI_LIBS) \
|
||||
- $(top_builddir)/glib/libpyglib-2.0-@PYTHON_BASENAME@.la
|
||||
+ $(top_builddir)/glib/libpyglib-2.0-@PYTHON_BASENAME@@PYTHON_VERSION@.la
|
||||
_gi_la_SOURCES = \
|
||||
pygi-repository.c \
|
||||
pygi-repository.h \
|
||||
diff --git a/gio/Makefile.am b/gio/Makefile.am
|
||||
index 6b3eb57..00e1c54 100644
|
||||
--- a/gio/Makefile.am
|
||||
+++ b/gio/Makefile.am
|
||||
@@ -67,7 +67,7 @@ EXTRA_DIST += $(GIO_DEFS) $(GIO_OVERRIDES)
|
||||
gio.c: $(GIO_DEFS) $(GIO_OVERRIDES)
|
||||
_gio_la_CFLAGS = $(GIO_CFLAGS)
|
||||
_gio_la_LDFLAGS = $(common_ldflags) -export-symbols-regex init_gio
|
||||
-_gio_la_LIBADD = $(GIO_LIBS) $(top_builddir)/glib/libpyglib-2.0-@PYTHON_BASENAME@.la
|
||||
+_gio_la_LIBADD = $(GIO_LIBS) $(top_builddir)/glib/libpyglib-2.0-@PYTHON_BASENAME@@PYTHON_VERSION@.la
|
||||
_gio_la_SOURCES = \
|
||||
giomodule.c \
|
||||
pygio-utils.c \
|
||||
diff --git a/glib/Makefile.am b/glib/Makefile.am
|
||||
index e210318..df39687 100644
|
||||
--- a/glib/Makefile.am
|
||||
+++ b/glib/Makefile.am
|
||||
@@ -4,7 +4,7 @@ INCLUDES = $(PYTHON_INCLUDES) $(GLIB_CFLAGS) -DPY_SSIZE_T_CLEAN
|
||||
pkgincludedir = $(includedir)/pygtk-2.0
|
||||
pkginclude_HEADERS = pyglib.h
|
||||
|
||||
-lib_LTLIBRARIES = libpyglib-2.0-@PYTHON_BASENAME@.la
|
||||
+lib_LTLIBRARIES = libpyglib-2.0-@PYTHON_BASENAME@@PYTHON_VERSION@.la
|
||||
|
||||
pkgpyexecdir = $(pyexecdir)
|
||||
|
||||
@@ -19,9 +19,9 @@ if PLATFORM_WIN32
|
||||
common_ldflags += -no-undefined
|
||||
endif
|
||||
|
||||
-libpyglib_2_0_@PYTHON_BASENAME@_la_CFLAGS = $(GLIB_CFLAGS)
|
||||
-libpyglib_2_0_@PYTHON_BASENAME@_la_LIBADD = $(GLIB_LIBS) $(FFI_LIBS)
|
||||
-libpyglib_2_0_@PYTHON_BASENAME@_la_SOURCES = \
|
||||
+libpyglib_2_0_@PYTHON_BASENAME@@PYTHON_VERSION@_la_CFLAGS = $(GLIB_CFLAGS)
|
||||
+libpyglib_2_0_@PYTHON_BASENAME@@PYTHON_VERSION@_la_LIBADD = $(GLIB_LIBS) $(FFI_LIBS)
|
||||
+libpyglib_2_0_@PYTHON_BASENAME@@PYTHON_VERSION@_la_SOURCES = \
|
||||
pyglib.c \
|
||||
pyglib.h \
|
||||
pyglib-private.h \
|
||||
@@ -29,7 +29,7 @@ libpyglib_2_0_@PYTHON_BASENAME@_la_SOURCES = \
|
||||
|
||||
_glib_la_CFLAGS = $(GLIB_CFLAGS)
|
||||
_glib_la_LDFLAGS = $(common_ldflags) -export-symbols-regex "_glib|PyInit__glib"
|
||||
-_glib_la_LIBADD = $(GLIB_LIBS) libpyglib-2.0-@PYTHON_BASENAME@.la
|
||||
+_glib_la_LIBADD = $(GLIB_LIBS) libpyglib-2.0-@PYTHON_BASENAME@@PYTHON_VERSION@.la
|
||||
_glib_la_SOURCES = \
|
||||
glibmodule.c \
|
||||
pygiochannel.c \
|
||||
diff --git a/gobject/Makefile.am b/gobject/Makefile.am
|
||||
index 7208329..3f9ad8e 100644
|
||||
--- a/gobject/Makefile.am
|
||||
+++ b/gobject/Makefile.am
|
||||
@@ -35,7 +35,7 @@ _gobject_la_LDFLAGS = $(common_ldflags) -export-symbols-regex "_gobject|PyInit__
|
||||
_gobject_la_LIBADD = \
|
||||
$(GLIB_LIBS) \
|
||||
$(FFI_LIBS) \
|
||||
- $(top_builddir)/glib/libpyglib-2.0-@PYTHON_BASENAME@.la
|
||||
+ $(top_builddir)/glib/libpyglib-2.0-@PYTHON_BASENAME@@PYTHON_VERSION@.la
|
||||
_gobject_la_SOURCES = \
|
||||
gobjectmodule.c \
|
||||
pygboxed.c \
|
||||
--
|
||||
1.7.4.1
|
||||
|
||||
@@ -1,98 +0,0 @@
|
||||
From 9d8867a7c67a14d055a0dd8db5f6a9aae5762a04 Mon Sep 17 00:00:00 2001
|
||||
From: Alexandre Rostovtsev <tetromino@gentoo.org>
|
||||
Date: Sun, 13 Jan 2013 19:50:14 -0500
|
||||
Subject: [PATCH] Disable failing tests
|
||||
|
||||
---
|
||||
tests/test_gio.py | 13 ++++++++-----
|
||||
tests/test_overrides.py | 4 ++--
|
||||
2 files changed, 10 insertions(+), 7 deletions(-)
|
||||
|
||||
diff --git a/tests/test_gio.py b/tests/test_gio.py
|
||||
index e14eddf..a4d1bc7 100644
|
||||
--- a/tests/test_gio.py
|
||||
+++ b/tests/test_gio.py
|
||||
@@ -650,10 +650,11 @@ class TestInputStream(unittest.TestCase):
|
||||
else:
|
||||
return read_data
|
||||
|
||||
+ """
|
||||
def testReadAsync(self):
|
||||
def callback(stream, result):
|
||||
- self.assertEquals(result.get_op_res_gssize(), 7)
|
||||
try:
|
||||
+ self.assertEquals(result.get_op_res_gssize(), 7)
|
||||
data = stream.read_finish(result)
|
||||
self.assertEquals(data, "testing")
|
||||
stream.close()
|
||||
@@ -694,7 +695,7 @@ class TestInputStream(unittest.TestCase):
|
||||
self.assertRaises(TypeError, self.stream.read_async, 1024,
|
||||
priority=1, cancellable="bar")
|
||||
self.assertRaises(TypeError, self.stream.read_async, 1024, 1, "bar")
|
||||
-
|
||||
+ """
|
||||
|
||||
# FIXME: this makes 'make check' freeze
|
||||
def _testCloseAsync(self):
|
||||
@@ -822,10 +823,11 @@ class TestOutputStream(unittest.TestCase):
|
||||
|
||||
self.assertEquals(stream.get_contents(), some_data)
|
||||
|
||||
+ """
|
||||
def testWriteAsync(self):
|
||||
def callback(stream, result):
|
||||
- self.assertEquals(result.get_op_res_gssize(), 7)
|
||||
try:
|
||||
+ self.assertEquals(result.get_op_res_gssize(), 7)
|
||||
self.assertEquals(stream.write_finish(result), 7)
|
||||
self.failUnless(os.path.exists("outputstream.txt"))
|
||||
self.assertEquals(open("outputstream.txt").read(), "testing")
|
||||
@@ -861,6 +863,7 @@ class TestOutputStream(unittest.TestCase):
|
||||
self.assertRaises(TypeError, self.stream.write_async, "foo",
|
||||
priority=1, cancellable="bar")
|
||||
self.assertRaises(TypeError, self.stream.write_async, "foo", 1, "bar")
|
||||
+ """
|
||||
|
||||
# FIXME: this makes 'make check' freeze
|
||||
def _testCloseAsync(self):
|
||||
@@ -1007,7 +1010,7 @@ class TestVfs(unittest.TestCase):
|
||||
class TestVolume(unittest.TestCase):
|
||||
def setUp(self):
|
||||
self.monitor = gio.volume_monitor_get()
|
||||
-
|
||||
+"""
|
||||
def testVolumeEnumerate(self):
|
||||
volumes = self.monitor.get_volumes()
|
||||
self.failUnless(isinstance(volumes, list))
|
||||
@@ -1018,7 +1021,7 @@ class TestVolume(unittest.TestCase):
|
||||
for id in ids:
|
||||
if id is not None:
|
||||
self.failUnless(isinstance(id, str))
|
||||
-
|
||||
+"""
|
||||
class TestFileInputStream(unittest.TestCase):
|
||||
def setUp(self):
|
||||
self._f = open("file.txt", "w+")
|
||||
diff --git a/tests/test_overrides.py b/tests/test_overrides.py
|
||||
index 47f38a3..063792d 100644
|
||||
--- a/tests/test_overrides.py
|
||||
+++ b/tests/test_overrides.py
|
||||
@@ -337,13 +337,13 @@ class TestPango(unittest.TestCase):
|
||||
desc = Pango.FontDescription('monospace')
|
||||
self.assertEquals(desc.get_family(), 'monospace')
|
||||
self.assertEquals(desc.get_variant(), Pango.Variant.NORMAL)
|
||||
-
|
||||
+"""
|
||||
def test_layout(self):
|
||||
self.assertRaises(TypeError, Pango.Layout)
|
||||
context = Pango.Context()
|
||||
layout = Pango.Layout(context)
|
||||
self.assertEquals(layout.get_context(), context)
|
||||
-
|
||||
+"""
|
||||
class TestGdk(unittest.TestCase):
|
||||
|
||||
def test_constructor(self):
|
||||
--
|
||||
1.8.1
|
||||
|
||||
@@ -1,50 +0,0 @@
|
||||
From 42d01f060c5d764baa881d13c103d68897163a49 Mon Sep 17 00:00:00 2001
|
||||
From: Ryan Lortie <desrt@desrt.ca>
|
||||
Date: Mon, 12 Mar 2012 16:44:14 -0400
|
||||
Subject: [PATCH] gio-types.defs: change some enums to flags
|
||||
|
||||
These flags types were originally incorrectly handled in glib as being
|
||||
enums. That bug was fixed, but they're still enums here, leading to
|
||||
warnings about the mismatch.
|
||||
|
||||
Change them to flags.
|
||||
|
||||
https://bugzilla.gnome.org/show_bug.cgi?id=668522
|
||||
---
|
||||
gio/gio-types.defs | 6 +++---
|
||||
1 files changed, 3 insertions(+), 3 deletions(-)
|
||||
|
||||
diff --git a/gio/gio-types.defs b/gio/gio-types.defs
|
||||
index 331e0bc..7eee5c8 100644
|
||||
--- a/gio/gio-types.defs
|
||||
+++ b/gio/gio-types.defs
|
||||
@@ -526,7 +526,7 @@
|
||||
)
|
||||
)
|
||||
|
||||
-(define-enum MountMountFlags
|
||||
+(define-flags MountMountFlags
|
||||
(in-module "gio")
|
||||
(c-name "GMountMountFlags")
|
||||
(gtype-id "G_TYPE_MOUNT_MOUNT_FLAGS")
|
||||
@@ -545,7 +545,7 @@
|
||||
)
|
||||
)
|
||||
|
||||
-(define-enum DriveStartFlags
|
||||
+(define-flags DriveStartFlags
|
||||
(in-module "gio")
|
||||
(c-name "GDriveStartFlags")
|
||||
(gtype-id "G_TYPE_DRIVE_START_FLAGS")
|
||||
@@ -770,7 +770,7 @@
|
||||
)
|
||||
)
|
||||
|
||||
-(define-enum SocketMsgFlags
|
||||
+(define-flags SocketMsgFlags
|
||||
(in-module "gio")
|
||||
(c-name "GSocketMsgFlags")
|
||||
(gtype-id "G_TYPE_SOCKET_MSG_FLAGS")
|
||||
--
|
||||
1.7.8.5
|
||||
|
||||
@@ -1,315 +0,0 @@
|
||||
From 9456ba70fdb98b3a4eb7ee2f630182387a54ca00 Mon Sep 17 00:00:00 2001
|
||||
From: Martin Pitt <martinpitt@gnome.org>
|
||||
Date: Tue, 19 Feb 2013 15:39:56 +0100
|
||||
Subject: [PATCH] Move property and signal creation into _class_init()
|
||||
|
||||
We must not add class interfaces after g_type_class_ref() has been called the
|
||||
first time. Move signal and property creation from pyg_type_register() into
|
||||
pyg_object_class_init(), and drop the hack of registering interfaces twice.
|
||||
|
||||
This is a backport of commit efcb0f9fd for 2.28.x. This allows old pygtk
|
||||
applications to work with pygobject 2.28.x and glib 2.35.x.
|
||||
|
||||
https://bugzilla.gnome.org/show_bug.cgi?id=694108
|
||||
---
|
||||
gobject/gobjectmodule.c | 177 +++++++++++++++++++-----------------------------
|
||||
1 file changed, 70 insertions(+), 107 deletions(-)
|
||||
|
||||
diff --git a/gobject/gobjectmodule.c b/gobject/gobjectmodule.c
|
||||
index 2a84606..91f7315 100644
|
||||
--- a/gobject/gobjectmodule.c
|
||||
+++ b/gobject/gobjectmodule.c
|
||||
@@ -312,13 +312,6 @@ pyg_object_get_property (GObject *object, guint property_id,
|
||||
pyglib_gil_state_release(state);
|
||||
}
|
||||
|
||||
-static void
|
||||
-pyg_object_class_init(GObjectClass *class, PyObject *py_class)
|
||||
-{
|
||||
- class->set_property = pyg_object_set_property;
|
||||
- class->get_property = pyg_object_get_property;
|
||||
-}
|
||||
-
|
||||
typedef struct _PyGSignalAccumulatorData {
|
||||
PyObject *callable;
|
||||
PyObject *user_data;
|
||||
@@ -484,15 +477,14 @@ override_signal(GType instance_type, const gchar *signal_name)
|
||||
}
|
||||
|
||||
static PyObject *
|
||||
-add_signals (GType instance_type, PyObject *signals)
|
||||
+add_signals (GObjectClass *klass, PyObject *signals)
|
||||
{
|
||||
gboolean ret = TRUE;
|
||||
- GObjectClass *oclass;
|
||||
Py_ssize_t pos = 0;
|
||||
PyObject *key, *value, *overridden_signals = NULL;
|
||||
+ GType instance_type = G_OBJECT_CLASS_TYPE (klass);
|
||||
|
||||
overridden_signals = PyDict_New();
|
||||
- oclass = g_type_class_ref(instance_type);
|
||||
while (PyDict_Next(signals, &pos, &key, &value)) {
|
||||
const gchar *signal_name;
|
||||
gchar *signal_name_canon, *c;
|
||||
@@ -530,7 +522,6 @@ add_signals (GType instance_type, PyObject *signals)
|
||||
if (!ret)
|
||||
break;
|
||||
}
|
||||
- g_type_class_unref(oclass);
|
||||
if (ret)
|
||||
return overridden_signals;
|
||||
else {
|
||||
@@ -800,14 +791,12 @@ pyg_param_spec_from_object (PyObject *tuple)
|
||||
}
|
||||
|
||||
static gboolean
|
||||
-add_properties (GType instance_type, PyObject *properties)
|
||||
+add_properties (GObjectClass *klass, PyObject *properties)
|
||||
{
|
||||
gboolean ret = TRUE;
|
||||
- GObjectClass *oclass;
|
||||
Py_ssize_t pos = 0;
|
||||
PyObject *key, *value;
|
||||
|
||||
- oclass = g_type_class_ref(instance_type);
|
||||
while (PyDict_Next(properties, &pos, &key, &value)) {
|
||||
const gchar *prop_name;
|
||||
GType prop_type;
|
||||
@@ -873,7 +862,7 @@ add_properties (GType instance_type, PyObject *properties)
|
||||
Py_DECREF(slice);
|
||||
|
||||
if (pspec) {
|
||||
- g_object_class_install_property(oclass, 1, pspec);
|
||||
+ g_object_class_install_property(klass, 1, pspec);
|
||||
} else {
|
||||
PyObject *type, *value, *traceback;
|
||||
ret = FALSE;
|
||||
@@ -883,7 +872,7 @@ add_properties (GType instance_type, PyObject *properties)
|
||||
g_snprintf(msg, 256,
|
||||
"%s (while registering property '%s' for GType '%s')",
|
||||
PYGLIB_PyUnicode_AsString(value),
|
||||
- prop_name, g_type_name(instance_type));
|
||||
+ prop_name, G_OBJECT_CLASS_NAME(klass));
|
||||
Py_DECREF(value);
|
||||
value = PYGLIB_PyUnicode_FromString(msg);
|
||||
}
|
||||
@@ -892,11 +881,63 @@ add_properties (GType instance_type, PyObject *properties)
|
||||
}
|
||||
}
|
||||
|
||||
- g_type_class_unref(oclass);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void
|
||||
+pyg_object_class_init(GObjectClass *class, PyObject *py_class)
|
||||
+{
|
||||
+ PyObject *gproperties, *gsignals, *overridden_signals;
|
||||
+ PyObject *class_dict = ((PyTypeObject*) py_class)->tp_dict;
|
||||
+
|
||||
+ class->set_property = pyg_object_set_property;
|
||||
+ class->get_property = pyg_object_get_property;
|
||||
+
|
||||
+ /* install signals */
|
||||
+ /* we look this up in the instance dictionary, so we don't
|
||||
+ * accidentally get a parent type's __gsignals__ attribute. */
|
||||
+ gsignals = PyDict_GetItemString(class_dict, "__gsignals__");
|
||||
+ if (gsignals) {
|
||||
+ if (!PyDict_Check(gsignals)) {
|
||||
+ PyErr_SetString(PyExc_TypeError,
|
||||
+ "__gsignals__ attribute not a dict!");
|
||||
+ return;
|
||||
+ }
|
||||
+ if (!(overridden_signals = add_signals(class, gsignals))) {
|
||||
+ return;
|
||||
+ }
|
||||
+ if (PyDict_SetItemString(class_dict, "__gsignals__",
|
||||
+ overridden_signals)) {
|
||||
+ return;
|
||||
+ }
|
||||
+ Py_DECREF(overridden_signals);
|
||||
+
|
||||
+ PyDict_DelItemString(class_dict, "__gsignals__");
|
||||
+ } else {
|
||||
+ PyErr_Clear();
|
||||
+ }
|
||||
+
|
||||
+ /* install properties */
|
||||
+ /* we look this up in the instance dictionary, so we don't
|
||||
+ * accidentally get a parent type's __gproperties__ attribute. */
|
||||
+ gproperties = PyDict_GetItemString(class_dict, "__gproperties__");
|
||||
+ if (gproperties) {
|
||||
+ if (!PyDict_Check(gproperties)) {
|
||||
+ PyErr_SetString(PyExc_TypeError,
|
||||
+ "__gproperties__ attribute not a dict!");
|
||||
+ return;
|
||||
+ }
|
||||
+ if (!add_properties(class, gproperties)) {
|
||||
+ return;
|
||||
+ }
|
||||
+ PyDict_DelItemString(class_dict, "__gproperties__");
|
||||
+ /* Borrowed reference. Py_DECREF(gproperties); */
|
||||
+ } else {
|
||||
+ PyErr_Clear();
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
+static void
|
||||
pyg_register_class_init(GType gtype, PyGClassInitFunc class_init)
|
||||
{
|
||||
GSList *list;
|
||||
@@ -1068,7 +1109,7 @@ pygobject__g_instance_init(GTypeInstance *instance,
|
||||
*/
|
||||
static void
|
||||
pyg_type_add_interfaces(PyTypeObject *class, GType instance_type,
|
||||
- PyObject *bases, gboolean new_interfaces,
|
||||
+ PyObject *bases,
|
||||
GType *parent_interfaces, guint n_parent_interfaces)
|
||||
{
|
||||
int i;
|
||||
@@ -1082,7 +1123,6 @@ pyg_type_add_interfaces(PyTypeObject *class, GType instance_type,
|
||||
guint k;
|
||||
PyObject *base = PyTuple_GET_ITEM(bases, i);
|
||||
GType itype;
|
||||
- gboolean is_new = TRUE;
|
||||
const GInterfaceInfo *iinfo;
|
||||
GInterfaceInfo iinfo_copy;
|
||||
|
||||
@@ -1099,16 +1139,6 @@ pyg_type_add_interfaces(PyTypeObject *class, GType instance_type,
|
||||
if (!G_TYPE_IS_INTERFACE(itype))
|
||||
continue;
|
||||
|
||||
- for (k = 0; k < n_parent_interfaces; ++k) {
|
||||
- if (parent_interfaces[k] == itype) {
|
||||
- is_new = FALSE;
|
||||
- break;
|
||||
- }
|
||||
- }
|
||||
-
|
||||
- if ((new_interfaces && !is_new) || (!new_interfaces && is_new))
|
||||
- continue;
|
||||
-
|
||||
iinfo = pyg_lookup_interface_info(itype);
|
||||
if (!iinfo) {
|
||||
gchar *error;
|
||||
@@ -1129,7 +1159,7 @@ pyg_type_add_interfaces(PyTypeObject *class, GType instance_type,
|
||||
int
|
||||
pyg_type_register(PyTypeObject *class, const char *type_name)
|
||||
{
|
||||
- PyObject *gtype, *gsignals, *gproperties, *overridden_signals;
|
||||
+ PyObject *gtype;
|
||||
GType parent_type, instance_type;
|
||||
GType *parent_interfaces;
|
||||
guint n_parent_interfaces;
|
||||
@@ -1216,88 +1246,22 @@ pyg_type_register(PyTypeObject *class, const char *type_name)
|
||||
}
|
||||
|
||||
/*
|
||||
- * Note: Interfaces to be implemented are searched twice. First
|
||||
- * we register interfaces that are already implemented by a parent
|
||||
- * type. The second time, the remaining interfaces are
|
||||
- * registered, i.e. the ones that are not implemented by a parent
|
||||
- * type. In between these two loops, properties and signals are
|
||||
- * registered. It has to be done this way, in two steps,
|
||||
- * otherwise glib will complain. If registering all interfaces
|
||||
- * always before properties, you get an error like:
|
||||
- *
|
||||
- * ../gobject:121: Warning: Object class
|
||||
- * test_interface+MyObject doesn't implement property
|
||||
- * 'some-property' from interface 'TestInterface'
|
||||
- *
|
||||
- * If, on the other hand, you register interfaces after
|
||||
- * registering the properties, you get something like:
|
||||
- *
|
||||
- * ../gobject:121: Warning: cannot add interface type
|
||||
- * `TestInterface' to type `test_interface+MyUnknown', since
|
||||
- * type `test_interface+MyUnknown' already conforms to
|
||||
- * interface
|
||||
- *
|
||||
- * This looks like a GLib quirk, but no bug has been filed
|
||||
- * upstream. However we have a unit test for this particular
|
||||
- * problem, which can be found in test_interfaces.py, class
|
||||
- * TestInterfaceImpl.
|
||||
+ * Note, all interfaces need to be registered before the first
|
||||
+ * g_type_class_ref(), see bug #686149.
|
||||
*
|
||||
* See also comment above pyg_type_add_interfaces().
|
||||
*/
|
||||
- pyg_type_add_interfaces(class, instance_type, class->tp_bases, FALSE,
|
||||
+ pyg_type_add_interfaces(class, instance_type, class->tp_bases,
|
||||
parent_interfaces, n_parent_interfaces);
|
||||
|
||||
- /* we look this up in the instance dictionary, so we don't
|
||||
- * accidentally get a parent type's __gsignals__ attribute. */
|
||||
- gsignals = PyDict_GetItemString(class->tp_dict, "__gsignals__");
|
||||
- if (gsignals) {
|
||||
- if (!PyDict_Check(gsignals)) {
|
||||
- PyErr_SetString(PyExc_TypeError,
|
||||
- "__gsignals__ attribute not a dict!");
|
||||
- g_free(parent_interfaces);
|
||||
- return -1;
|
||||
- }
|
||||
- if (!(overridden_signals = add_signals(instance_type, gsignals))) {
|
||||
- g_free(parent_interfaces);
|
||||
- return -1;
|
||||
- }
|
||||
- if (PyDict_SetItemString(class->tp_dict, "__gsignals__",
|
||||
- overridden_signals)) {
|
||||
- g_free(parent_interfaces);
|
||||
- return -1;
|
||||
- }
|
||||
- Py_DECREF(overridden_signals);
|
||||
- } else {
|
||||
- PyErr_Clear();
|
||||
- }
|
||||
|
||||
- /* we look this up in the instance dictionary, so we don't
|
||||
- * accidentally get a parent type's __gsignals__ attribute. */
|
||||
- gproperties = PyDict_GetItemString(class->tp_dict, "__gproperties__");
|
||||
- if (gproperties) {
|
||||
- if (!PyDict_Check(gproperties)) {
|
||||
- PyErr_SetString(PyExc_TypeError,
|
||||
- "__gproperties__ attribute not a dict!");
|
||||
- g_free(parent_interfaces);
|
||||
- return -1;
|
||||
- }
|
||||
- if (!add_properties(instance_type, gproperties)) {
|
||||
- g_free(parent_interfaces);
|
||||
- return -1;
|
||||
- }
|
||||
- PyDict_DelItemString(class->tp_dict, "__gproperties__");
|
||||
- /* Borrowed reference. Py_DECREF(gproperties); */
|
||||
- } else {
|
||||
- PyErr_Clear();
|
||||
+ gclass = g_type_class_ref(instance_type);
|
||||
+ if (PyErr_Occurred() != NULL) {
|
||||
+ g_type_class_unref(gclass);
|
||||
+ g_free(parent_interfaces);
|
||||
+ return -1;
|
||||
}
|
||||
|
||||
- /* Register new interfaces, that are _not_ already defined by
|
||||
- * the parent type. FIXME: See above.
|
||||
- */
|
||||
- pyg_type_add_interfaces(class, instance_type, class->tp_bases, TRUE,
|
||||
- parent_interfaces, n_parent_interfaces);
|
||||
-
|
||||
- gclass = g_type_class_ref(instance_type);
|
||||
if (pyg_run_class_init(instance_type, gclass, class)) {
|
||||
g_type_class_unref(gclass);
|
||||
g_free(parent_interfaces);
|
||||
@@ -1306,9 +1270,8 @@ pyg_type_register(PyTypeObject *class, const char *type_name)
|
||||
g_type_class_unref(gclass);
|
||||
g_free(parent_interfaces);
|
||||
|
||||
- if (gsignals)
|
||||
- PyDict_DelItemString(class->tp_dict, "__gsignals__");
|
||||
-
|
||||
+ if (PyErr_Occurred() != NULL)
|
||||
+ return -1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
--
|
||||
1.8.3.2
|
||||
|
||||
@@ -1,28 +0,0 @@
|
||||
From 42d871eb0b08ee6d55e95cc7e4b90844919555b9 Mon Sep 17 00:00:00 2001
|
||||
From: Ivan Stankovic <ivan.stankovic@avl.com>
|
||||
Date: Tue, 21 Feb 2012 12:24:58 +0100
|
||||
Subject: [PATCH] Fix set_qdata warning on accessing NULL gobject property
|
||||
|
||||
https://bugzilla.gnome.org/show_bug.cgi?id=661155
|
||||
---
|
||||
gobject/pygobject.c | 4 +++-
|
||||
1 files changed, 3 insertions(+), 1 deletions(-)
|
||||
|
||||
diff --git a/gobject/pygobject.c b/gobject/pygobject.c
|
||||
index 6c2f06c..70dc89a 100644
|
||||
--- a/gobject/pygobject.c
|
||||
+++ b/gobject/pygobject.c
|
||||
@@ -991,7 +991,9 @@ pygobject_new(GObject *obj)
|
||||
PyObject *
|
||||
pygobject_new_sunk(GObject *obj)
|
||||
{
|
||||
- g_object_set_qdata (obj, pygobject_ref_sunk_key, GINT_TO_POINTER (1));
|
||||
+ if (obj)
|
||||
+ g_object_set_qdata (obj, pygobject_ref_sunk_key, GINT_TO_POINTER (1));
|
||||
+
|
||||
return pygobject_new_full(obj, TRUE, NULL);
|
||||
}
|
||||
|
||||
--
|
||||
1.7.8.5
|
||||
|
||||
@@ -1,33 +0,0 @@
|
||||
From 9c8ec7495e9e73855dc284be293828572f408c92 Mon Sep 17 00:00:00 2001
|
||||
From: Alexandre Rostovtsev <tetromino@gentoo.org>
|
||||
Date: Tue, 25 Dec 2012 00:26:05 -0500
|
||||
Subject: [PATCH] Do not run introspection tests when building with
|
||||
introspection disabled
|
||||
|
||||
---
|
||||
tests/Makefile.am | 7 ++++++-
|
||||
1 file changed, 6 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/tests/Makefile.am b/tests/Makefile.am
|
||||
index e60bad5..3a0d1b7 100644
|
||||
--- a/tests/Makefile.am
|
||||
+++ b/tests/Makefile.am
|
||||
@@ -120,9 +120,14 @@ RUN_TESTS_ENV_VARS= \
|
||||
RUN_TESTS_LAUNCH=$(RUN_TESTS_ENV_VARS) $(DBUS_LAUNCH) $(EXEC_NAME) $(PYTHON) $(srcdir)/runtests.py
|
||||
|
||||
# run tests in separately to avoid loading static and introspection bindings in the same process
|
||||
-check-local: $(check_LTLIBRARIES:.la=.so) Regress-1.0.typelib GIMarshallingTests-1.0.typelib gschemas.compiled
|
||||
+if ENABLE_INTROSPECTION
|
||||
+CHECK_LOCAL_INTROSPECTION_REQ = Regress-1.0.typelib GIMarshallingTests-1.0.typelib gschemas.compiled
|
||||
+endif
|
||||
+check-local: $(check_LTLIBRARIES:.la=.so) $(CHECK_LOCAL_INTROSPECTION_REQ)
|
||||
TEST_FILES="$(TEST_FILES_STATIC)" $(RUN_TESTS_LAUNCH)
|
||||
+if ENABLE_INTROSPECTION
|
||||
TEST_FILES="$(TEST_FILES_GI)" $(RUN_TESTS_LAUNCH)
|
||||
+endif
|
||||
if BUILD_GIO
|
||||
TEST_FILES="$(TEST_FILES_GIO)" $(RUN_TESTS_LAUNCH)
|
||||
endif
|
||||
--
|
||||
1.8.0.2
|
||||
|
||||
@@ -1,132 +0,0 @@
|
||||
# Copyright 1999-2020 Gentoo Authors
|
||||
# Distributed under the terms of the GNU General Public License v2
|
||||
|
||||
EAPI="5"
|
||||
GCONF_DEBUG="no"
|
||||
GNOME2_LA_PUNT="yes"
|
||||
PYTHON_COMPAT=( python2_7 )
|
||||
|
||||
inherit autotools eutils gnome2 python-r1 virtualx
|
||||
|
||||
DESCRIPTION="GLib's GObject library bindings for Python"
|
||||
HOMEPAGE="http://www.pygtk.org/"
|
||||
|
||||
LICENSE="LGPL-2.1+"
|
||||
SLOT="2"
|
||||
KEYWORDS="~alpha amd64 arm arm64 hppa ~ia64 ~mips ppc ppc64 s390 sparc x86 ~amd64-linux ~x86-linux ~ppc-macos ~x64-macos ~x86-macos ~sparc-solaris ~x64-solaris ~x86-solaris"
|
||||
IUSE="examples libffi test"
|
||||
RESTRICT="!test? ( test )"
|
||||
REQUIRED_USE="${PYTHON_REQUIRED_USE}"
|
||||
|
||||
COMMON_DEPEND=">=dev-libs/glib-2.24.0:2
|
||||
dev-lang/python-exec:2
|
||||
libffi? ( dev-libs/libffi:= )
|
||||
${PYTHON_DEPS}
|
||||
"
|
||||
DEPEND="${COMMON_DEPEND}
|
||||
dev-util/gtk-doc-am
|
||||
virtual/pkgconfig
|
||||
test? (
|
||||
media-fonts/font-cursor-misc
|
||||
media-fonts/font-misc-misc )
|
||||
"
|
||||
RDEPEND="${COMMON_DEPEND}
|
||||
!<dev-python/pygtk-2.23"
|
||||
|
||||
src_prepare() {
|
||||
# Fix FHS compliance, see upstream bug #535524
|
||||
epatch "${FILESDIR}/${PN}-2.28.3-fix-codegen-location.patch"
|
||||
|
||||
# Do not build tests if unneeded, bug #226345
|
||||
epatch "${FILESDIR}/${PN}-2.28.3-make_check.patch"
|
||||
|
||||
# Support installation for multiple Python versions, upstream bug #648292
|
||||
epatch "${FILESDIR}/${PN}-2.28.3-support_multiple_python_versions.patch"
|
||||
|
||||
# Disable tests that fail
|
||||
epatch "${FILESDIR}/${P}-disable-failing-tests.patch"
|
||||
|
||||
# Disable introspection tests when we build with --disable-introspection
|
||||
epatch "${FILESDIR}/${P}-tests-no-introspection.patch"
|
||||
|
||||
# Fix warning spam
|
||||
epatch "${FILESDIR}/${P}-set_qdata.patch"
|
||||
epatch "${FILESDIR}/${P}-gio-types-2.32.patch"
|
||||
|
||||
# Fix glib-2.36 compatibility, bug #486602
|
||||
epatch "${FILESDIR}/${P}-glib-2.36-class_init.patch"
|
||||
|
||||
sed -i \
|
||||
-e 's:AM_CONFIG_HEADER:AC_CONFIG_HEADERS:' \
|
||||
-e 's:AM_PROG_CC_STDC:AC_PROG_CC:' \
|
||||
configure.ac || die
|
||||
|
||||
eautoreconf
|
||||
gnome2_src_prepare
|
||||
|
||||
python_copy_sources
|
||||
|
||||
prepare_shebangs() {
|
||||
# Make a backup with unconverted shebangs to keep python_doscript happy
|
||||
cp codegen/codegen.py pygobject-codegen-2.0
|
||||
sed -e "s%#! \?/usr/bin/env python%#!${PYTHON}%" \
|
||||
-i codegen/*.py || die "shebang convertion failed"
|
||||
}
|
||||
python_foreach_impl run_in_build_dir prepare_shebangs
|
||||
}
|
||||
|
||||
src_configure() {
|
||||
DOCS="AUTHORS ChangeLog* NEWS README"
|
||||
# --disable-introspection and --disable-cairo because we use pygobject:3
|
||||
# for introspection support
|
||||
G2CONF="${G2CONF}
|
||||
--disable-introspection
|
||||
--disable-cairo
|
||||
$(use_with libffi ffi)"
|
||||
|
||||
python_foreach_impl run_in_build_dir gnome2_src_configure
|
||||
}
|
||||
|
||||
src_compile() {
|
||||
python_foreach_impl run_in_build_dir gnome2_src_compile
|
||||
}
|
||||
|
||||
# FIXME: With python multiple ABI support, tests return 1 even when they pass
|
||||
src_test() {
|
||||
unset DBUS_SESSION_BUS_ADDRESS
|
||||
export GIO_USE_VFS="local" # prevents odd issues with deleting ${T}/.gvfs
|
||||
|
||||
testing() {
|
||||
export XDG_CACHE_HOME="${T}/${EPYTHON}"
|
||||
run_in_build_dir Xemake -j1 check
|
||||
unset XDG_CACHE_HOME
|
||||
}
|
||||
python_foreach_impl testing
|
||||
unset GIO_USE_VFS
|
||||
}
|
||||
|
||||
src_install() {
|
||||
installing() {
|
||||
local f prefixed_sitedir
|
||||
|
||||
gnome2_src_install
|
||||
|
||||
python_doscript pygobject-codegen-2.0
|
||||
|
||||
# Don't keep multiple copies of pygobject-codegen-2.0 script
|
||||
prefixed_sitedir=$(python_get_sitedir)
|
||||
dosym "${prefixed_sitedir#${EPREFIX}}/gtk-2.0/codegen/codegen.py" "/usr/lib/python-exec/${EPYTHON}/pygobject-codegen-2.0"
|
||||
}
|
||||
python_foreach_impl run_in_build_dir installing
|
||||
|
||||
if use examples; then
|
||||
insinto /usr/share/doc/${PF}
|
||||
doins -r examples
|
||||
fi
|
||||
}
|
||||
|
||||
run_in_build_dir() {
|
||||
pushd "${BUILD_DIR}" > /dev/null || die
|
||||
"$@"
|
||||
popd > /dev/null
|
||||
}
|
||||
Reference in New Issue
Block a user