mirror of
https://github.com/RetroShare/RetroShare.git
synced 2025-06-21 12:54:26 -04:00
Restored libretroshare.pro, Sorry Chris - your cleaned-up version breaks my build.
removed some debug out from rsdir / and dht. git-svn-id: http://svn.code.sf.net/p/retroshare/code/branches/v0.5-gxs-b1@5525 b45a01b8-16f6-495d-af2f-9b41ad6348cc
This commit is contained in:
parent
c7ed9c6df7
commit
3cbef49b8e
3 changed files with 199 additions and 162 deletions
|
@ -1111,6 +1111,7 @@ int p3BitDht::minuteTick()
|
||||||
|
|
||||||
double denom = deltaT;
|
double denom = deltaT;
|
||||||
|
|
||||||
|
#ifdef SHOW_RATES
|
||||||
std::cerr << "p3BitDht::minuteTick() ";
|
std::cerr << "p3BitDht::minuteTick() ";
|
||||||
std::cerr << "DhtRead: " << dhtRead / denom << " kB/s ";
|
std::cerr << "DhtRead: " << dhtRead / denom << " kB/s ";
|
||||||
std::cerr << "DhtWrite: " << dhtWrite / denom << " kB/s ";
|
std::cerr << "DhtWrite: " << dhtWrite / denom << " kB/s ";
|
||||||
|
@ -1121,6 +1122,7 @@ int p3BitDht::minuteTick()
|
||||||
std::cerr << "RelayWrite: " << relayWrite / denom << " kB/s ";
|
std::cerr << "RelayWrite: " << relayWrite / denom << " kB/s ";
|
||||||
std::cerr << "RelayRelayed: " << relayRelayed / denom << " kB/s ";
|
std::cerr << "RelayRelayed: " << relayRelayed / denom << " kB/s ";
|
||||||
std::cerr << std::endl;
|
std::cerr << std::endl;
|
||||||
|
#endif // SHOW_RATES
|
||||||
|
|
||||||
|
|
||||||
RsStackMutex stack(dhtMtx); /********** LOCKED MUTEX ***************/
|
RsStackMutex stack(dhtMtx); /********** LOCKED MUTEX ***************/
|
||||||
|
|
|
@ -1,138 +1,121 @@
|
||||||
TEMPLATE = lib
|
TEMPLATE = lib
|
||||||
#CONFIG += staticlib release
|
|
||||||
#CONFIG += staticlib testnetwork
|
# CONFIG += staticlib release
|
||||||
CONFIG += staticlib bitdht newcache newservices
|
# CONFIG += staticlib testnetwork
|
||||||
|
CONFIG += staticlib \
|
||||||
|
bitdht
|
||||||
CONFIG -= qt
|
CONFIG -= qt
|
||||||
TARGET = retroshare
|
TARGET = retroshare
|
||||||
#DEFINES += RSSERIAL_DEBUG
|
|
||||||
CONFIG += test_voip
|
CONFIG += test_voip
|
||||||
|
|
||||||
|
# GXS Stuff.
|
||||||
|
CONFIG += newcache
|
||||||
|
CONFIG += newservices
|
||||||
|
|
||||||
# Beware: All data of the stripped services are lost
|
# Beware: All data of the stripped services are lost
|
||||||
#CONFIG += minimal
|
|
||||||
DEFINES *= PQI_DISABLE_TUNNEL
|
DEFINES *= PQI_DISABLE_TUNNEL
|
||||||
#ENABLE_CACHE_OPT
|
|
||||||
|
|
||||||
minimal {
|
|
||||||
CONFIG -= use_blogs
|
|
||||||
|
|
||||||
DEFINES += MINIMAL_LIBRS
|
|
||||||
}
|
|
||||||
|
|
||||||
|
# ENABLE_CACHE_OPT
|
||||||
profiling {
|
profiling {
|
||||||
QMAKE_CXXFLAGS -= -fomit-frame-pointer
|
QMAKE_CXXFLAGS -= -fomit-frame-pointer
|
||||||
QMAKE_CXXFLAGS *= -pg -g -fno-omit-frame-pointer
|
QMAKE_CXXFLAGS *= -pg \
|
||||||
|
-g \
|
||||||
|
-fno-omit-frame-pointer
|
||||||
}
|
}
|
||||||
|
release:
|
||||||
|
|
||||||
release {
|
# UDP and TUNNEL dont work anymore.
|
||||||
# UDP and TUNNEL dont work anymore.
|
# DEFINES *= PQI_DISABLE_UDP
|
||||||
#DEFINES *= PQI_DISABLE_UDP
|
# treat warnings as error for better removing
|
||||||
}
|
# QMAKE_CFLAGS += -Werror
|
||||||
|
# QMAKE_CXXFLAGS += -Werror
|
||||||
|
|
||||||
|
|
||||||
testnetwork {
|
testnetwork {
|
||||||
#DEFINES *= PQI_DISABLE_UDP
|
# used in rsserver/rsinit.cc Enabled Port Restrictions, and makes Proxy Port next to Dht Port.
|
||||||
DEFINES *= PQI_DISABLE_TUNNEL
|
DEFINES *= LOCALNET_TESTING
|
||||||
|
|
||||||
# DEFINES *= AUTHSSL_DEBUG GPG_DEBUG
|
# used in tcponudp/udprelay.cc Debugging Info for Relays.
|
||||||
# DEFINES *= CONN_DEBUG
|
DEFINES *= DEBUG_UDP_RELAY
|
||||||
# DEFINES *= P3DISC_DEBUG
|
|
||||||
|
|
||||||
# DEFINES *= PGRP_DEBUG
|
# used in tcponudp/udpstunner.[h | cc] enables local stun (careful - modifies class variables).
|
||||||
# DEFINES *= PERSON_DEBUG
|
DEFINES *= UDPSTUN_ALLOW_LOCALNET
|
||||||
|
|
||||||
#DEFINES *= DEBUG_UDP_SORTER DEBUG_UDP_LAYER EXTADDRSEARCH_DEBUG
|
# used in pqi/p3linkmgr.cc prints out extra debug.
|
||||||
|
DEFINES *= LINKMGR_DEBUG_LINKTYPE
|
||||||
|
|
||||||
|
# used in dht/connectstatebox to reduce connection times and display debug.
|
||||||
|
# DEFINES *= TESTING_PERIODS
|
||||||
|
# DEFINES *= DEBUG_CONNECTBOX
|
||||||
QMAKE_CXXFLAGS -= -fomit-frame-pointer
|
QMAKE_CXXFLAGS -= -fomit-frame-pointer
|
||||||
QMAKE_CXXFLAGS -= -O2
|
QMAKE_CXXFLAGS -= -O2
|
||||||
QMAKE_CXXFLAGS *= -g -fno-omit-frame-pointer
|
QMAKE_CXXFLAGS *= -g \
|
||||||
|
-fno-omit-frame-pointer
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
CONFIG += debug
|
CONFIG += debug
|
||||||
debug {
|
debug {
|
||||||
# DEFINES *= DEBUG
|
# DEFINES *= DEBUG
|
||||||
# DEFINES *= OPENDHT_DEBUG DHT_DEBUG CONN_DEBUG DEBUG_UDP_SORTER P3DISC_DEBUG DEBUG_UDP_LAYER FT_DEBUG EXTADDRSEARCH_DEBUG
|
# DEFINES *= OPENDHT_DEBUG DHT_DEBUG CONN_DEBUG DEBUG_UDP_SORTER P3DISC_DEBUG DEBUG_UDP_LAYER FT_DEBUG EXTADDRSEARCH_DEBUG
|
||||||
# DEFINES *= CONTROL_DEBUG FT_DEBUG DEBUG_FTCHUNK P3TURTLE_DEBUG
|
# DEFINES *= CONTROL_DEBUG FT_DEBUG DEBUG_FTCHUNK P3TURTLE_DEBUG
|
||||||
# DEFINES *= P3TURTLE_DEBUG
|
# DEFINES *= P3TURTLE_DEBUG
|
||||||
# DEFINES *= NET_DEBUG
|
# DEFINES *= NET_DEBUG
|
||||||
# DEFINES *= DISTRIB_DEBUG
|
# DEFINES *= DISTRIB_DEBUG
|
||||||
# DEFINES *= P3TURTLE_DEBUG FT_DEBUG DEBUG_FTCHUNK MPLEX_DEBUG
|
# DEFINES *= P3TURTLE_DEBUG FT_DEBUG DEBUG_FTCHUNK MPLEX_DEBUG
|
||||||
# DEFINES *= STATUS_DEBUG SERV_DEBUG RSSERIAL_DEBUG #CONN_DEBUG
|
# DEFINES *= STATUS_DEBUG SERV_DEBUG RSSERIAL_DEBUG #CONN_DEBUG
|
||||||
|
QMAKE_CXXFLAGS -= -O2 \
|
||||||
QMAKE_CXXFLAGS -= -O2 -fomit-frame-pointer
|
-fomit-frame-pointer
|
||||||
QMAKE_CXXFLAGS *= -g -fno-omit-frame-pointer
|
QMAKE_CXXFLAGS *= -g \
|
||||||
|
-fno-omit-frame-pointer
|
||||||
}
|
}
|
||||||
|
|
||||||
bitdht {
|
bitdht {
|
||||||
|
HEADERS += dht/p3bitdht.h \
|
||||||
HEADERS += dht/p3bitdht.h \
|
|
||||||
dht/connectstatebox.h \
|
dht/connectstatebox.h \
|
||||||
dht/stunaddrassist.h
|
dht/stunaddrassist.h
|
||||||
|
SOURCES += dht/p3bitdht.cc \
|
||||||
SOURCES += dht/p3bitdht.cc \
|
|
||||||
dht/p3bitdht_interface.cc \
|
dht/p3bitdht_interface.cc \
|
||||||
dht/p3bitdht_peers.cc \
|
dht/p3bitdht_peers.cc \
|
||||||
dht/p3bitdht_peernet.cc \
|
dht/p3bitdht_peernet.cc \
|
||||||
dht/p3bitdht_relay.cc \
|
dht/p3bitdht_relay.cc \
|
||||||
dht/connectstatebox.cc
|
dht/connectstatebox.cc
|
||||||
|
HEADERS += tcponudp/udppeer.h \
|
||||||
HEADERS += tcponudp/udppeer.h \
|
|
||||||
tcponudp/bio_tou.h \
|
tcponudp/bio_tou.h \
|
||||||
tcponudp/tcppacket.h \
|
tcponudp/tcppacket.h \
|
||||||
tcponudp/tcpstream.h \
|
tcponudp/tcpstream.h \
|
||||||
tcponudp/tou.h \
|
tcponudp/tou.h \
|
||||||
tcponudp/udpstunner.h \
|
tcponudp/udpstunner.h \
|
||||||
tcponudp/udprelay.h \
|
tcponudp/udprelay.h
|
||||||
|
SOURCES += tcponudp/udppeer.cc \
|
||||||
SOURCES += tcponudp/udppeer.cc \
|
|
||||||
tcponudp/tcppacket.cc \
|
tcponudp/tcppacket.cc \
|
||||||
tcponudp/tcpstream.cc \
|
tcponudp/tcpstream.cc \
|
||||||
tcponudp/tou.cc \
|
tcponudp/tou.cc \
|
||||||
tcponudp/bss_tou.c \
|
tcponudp/bss_tou.c \
|
||||||
tcponudp/udpstunner.cc \
|
tcponudp/udpstunner.cc \
|
||||||
tcponudp/udprelay.cc \
|
tcponudp/udprelay.cc
|
||||||
|
|
||||||
# These two aren't actually used (and don't compile) ....
|
|
||||||
# but could be useful later
|
|
||||||
#
|
|
||||||
# tcponudp/udpstunner.h \
|
|
||||||
# tcponudp/udpstunner.cc \
|
|
||||||
#
|
|
||||||
|
|
||||||
|
|
||||||
|
# These two aren't actually used (and don't compile) ....
|
||||||
|
# but could be useful later
|
||||||
|
# tcponudp/udpstunner.h \
|
||||||
|
# tcponudp/udpstunner.cc \
|
||||||
BITDHT_DIR = ../../libbitdht/src
|
BITDHT_DIR = ../../libbitdht/src
|
||||||
INCLUDEPATH += . $${BITDHT_DIR}
|
INCLUDEPATH += . \
|
||||||
|
$${BITDHT_DIR}
|
||||||
|
|
||||||
# The next line if for compliance with debian packages. Keep it!
|
# The next line if for compliance with debian packages. Keep it!
|
||||||
INCLUDEPATH += ../libbitdht
|
INCLUDEPATH += ../libbitdht
|
||||||
DEFINES *= RS_USE_BITDHT
|
DEFINES *= RS_USE_BITDHT
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
test_bitdht {
|
test_bitdht {
|
||||||
# DISABLE TCP CONNECTIONS...
|
# DISABLE TCP CONNECTIONS...
|
||||||
DEFINES *= P3CONNMGR_NO_TCP_CONNECTIONS
|
DEFINES *= P3CONNMGR_NO_TCP_CONNECTIONS
|
||||||
|
|
||||||
# NO AUTO CONNECTIONS??? FOR TESTING DHT STATUS.
|
# NO AUTO CONNECTIONS??? FOR TESTING DHT STATUS.
|
||||||
DEFINES *= P3CONNMGR_NO_AUTO_CONNECTION
|
DEFINES *= P3CONNMGR_NO_AUTO_CONNECTION
|
||||||
|
|
||||||
# ENABLED UDP NOW.
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# ENABLED UDP NOW.
|
||||||
|
|
||||||
|
|
||||||
use_blogs {
|
use_blogs {
|
||||||
|
|
||||||
HEADERS += services/p3blogs.h
|
HEADERS += services/p3blogs.h
|
||||||
SOURCES += services/p3blogs.cc
|
SOURCES += services/p3blogs.cc
|
||||||
|
|
||||||
DEFINES *= RS_USE_BLOGS
|
DEFINES *= RS_USE_BLOGS
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
PUBLIC_HEADERS = retroshare/rsblogs.h \
|
PUBLIC_HEADERS = retroshare/rsblogs.h \
|
||||||
retroshare/rschannels.h \
|
retroshare/rschannels.h \
|
||||||
retroshare/rsdisc.h \
|
retroshare/rsdisc.h \
|
||||||
|
@ -155,22 +138,74 @@ PUBLIC_HEADERS = retroshare/rsblogs.h \
|
||||||
retroshare/rsdht.h \
|
retroshare/rsdht.h \
|
||||||
retroshare/rsdsdv.h \
|
retroshare/rsdsdv.h \
|
||||||
retroshare/rsconfig.h
|
retroshare/rsconfig.h
|
||||||
|
|
||||||
HEADERS += plugins/pluginmanager.h \
|
HEADERS += plugins/pluginmanager.h \
|
||||||
plugins/dlfcn_win32.h \
|
plugins/dlfcn_win32.h \
|
||||||
serialiser/rspluginitems.h
|
serialiser/rspluginitems.h
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
HEADERS += $$PUBLIC_HEADERS
|
HEADERS += $$PUBLIC_HEADERS
|
||||||
|
|
||||||
# public headers to be...
|
# public headers to be...
|
||||||
HEADERS += retroshare/rsgame.h \
|
HEADERS += retroshare/rsgame.h \
|
||||||
retroshare/rsphoto.h
|
retroshare/rsphoto.h
|
||||||
|
|
||||||
|
|
||||||
# ################################ Linux ##########################################
|
# ################################ Linux ##########################################
|
||||||
|
linux-*:isEmpty(PREFIX) {
|
||||||
|
PREFIX = /usr \
|
||||||
|
}
|
||||||
|
isEmpty(INC_DIR) {
|
||||||
|
INC_DIR = $${PREFIX}/include/retroshare/ \
|
||||||
|
}
|
||||||
|
isEmpty(LIB_DIR) {
|
||||||
|
LIB_DIR = $${PREFIX}/lib/ \
|
||||||
|
}
|
||||||
|
|
||||||
|
# These two lines fixe compilation on ubuntu natty. Probably a ubuntu packaging error.
|
||||||
|
INCLUDEPATH *= /usr/lib/x86_64-linux-gnu/glib-2.0/include/
|
||||||
|
INCLUDEPATH *= /usr/lib/i386-linux-gnu/glib-2.0/include/
|
||||||
|
OPENPGPSDK_DIR = ../../openpgpsdk/src
|
||||||
|
INCLUDEPATH *= $${OPENPGPSDK_DIR} \
|
||||||
|
../openpgpsdk
|
||||||
|
DESTDIR = lib
|
||||||
|
QMAKE_CXXFLAGS *= -Wall \
|
||||||
|
-D_FILE_OFFSET_BITS=64
|
||||||
|
QMAKE_CC = g++
|
||||||
|
SSL_DIR = /usr/include/openssl
|
||||||
|
UPNP_DIR = /usr/include/upnp
|
||||||
|
INCLUDEPATH += . \
|
||||||
|
$${SSL_DIR} \
|
||||||
|
$${UPNP_DIR}
|
||||||
|
|
||||||
|
# gpg files
|
||||||
|
system(which gpg-error-config >/dev/null 2>&1):INCLUDEPATH += $$system(gpg-error-config --cflags | sed -e "s/-I//g")
|
||||||
|
else:message(Could not find gpg-error-config on your system, assuming gpg-error.h is in /usr/include)
|
||||||
|
system(which gpgme-config >/dev/null 2>&1):INCLUDEPATH += $$system(gpgme-config --cflags | sed -e "s/-I//g")
|
||||||
|
else:message(Could not find gpgme-config on your system, assuming gpgme.h is in /usr/include)
|
||||||
|
|
||||||
|
# libupnp implementation files
|
||||||
|
HEADERS += upnp/UPnPBase.h
|
||||||
|
SOURCES += upnp/UPnPBase.cpp
|
||||||
|
|
||||||
|
# where to put the shared library itself
|
||||||
|
target.path = $$LIB_DIR
|
||||||
|
INSTALLS *= target
|
||||||
|
|
||||||
|
# where to put the library's interface
|
||||||
|
include_rsiface.path = $${INC_DIR}
|
||||||
|
include_rsiface.files = $$PUBLIC_HEADERS
|
||||||
|
INSTALLS += include_rsiface
|
||||||
|
|
||||||
|
# CONFIG += version_detail_bash_script
|
||||||
|
DEFINES *= UBUNTU
|
||||||
|
INCLUDEPATH += /usr/include/glib-2.0/ \
|
||||||
|
/usr/lib/glib-2.0/include
|
||||||
|
LIBS *= -lgnome-keyring
|
||||||
|
|
||||||
|
linux-g++:OBJECTS_DIR = temp/linux-g++/obj
|
||||||
|
linux-g++-64:OBJECTS_DIR = temp/linux-g++-64/obj
|
||||||
|
version_detail_bash_script {
|
||||||
|
QMAKE_EXTRA_TARGETS += write_version_detail
|
||||||
|
PRE_TARGETDEPS = write_version_detail
|
||||||
|
write_version_detail.commands = ./version_detail.sh
|
||||||
|
}
|
||||||
|
|
||||||
# ################### Cross compilation for windows under Linux ####################
|
# ################### Cross compilation for windows under Linux ####################
|
||||||
win32-x-g++ {
|
win32-x-g++ {
|
||||||
|
@ -227,13 +262,10 @@ HEADERS += retroshare/rsgame.h \
|
||||||
# miniupnp implementation files
|
# miniupnp implementation files
|
||||||
HEADERS += upnp/upnputil.h
|
HEADERS += upnp/upnputil.h
|
||||||
SOURCES += upnp/upnputil.c
|
SOURCES += upnp/upnputil.c
|
||||||
UPNPC_DIR = ../../../lib/miniupnpc-1.3
|
UPNPC_DIR = ../../../miniupnpc-1.3
|
||||||
GPG_ERROR_DIR = ../../../lib/libgpg-error-1.7
|
PTHREADS_DIR = ../../../pthreads-w32-2-8-0-release
|
||||||
GPGME_DIR = ../../../lib/gpgme-1.1.8
|
ZLIB_DIR = ../../../zlib-1.2.3
|
||||||
|
SSL_DIR = ../../../openssl-1.0.1c
|
||||||
PTHREADS_DIR = ../../../lib/pthreads-w32-2-8-0-release
|
|
||||||
ZLIB_DIR = ../../../lib/zlib-1.2.7
|
|
||||||
SSL_DIR = ../../../OpenSSL
|
|
||||||
OPENPGPSDK_DIR = ../../openpgpsdk/src
|
OPENPGPSDK_DIR = ../../openpgpsdk/src
|
||||||
INCLUDEPATH += . \
|
INCLUDEPATH += . \
|
||||||
$${SSL_DIR}/include \
|
$${SSL_DIR}/include \
|
||||||
|
@ -242,7 +274,7 @@ HEADERS += retroshare/rsgame.h \
|
||||||
$${ZLIB_DIR} \
|
$${ZLIB_DIR} \
|
||||||
$${OPENPGPSDK_DIR}
|
$${OPENPGPSDK_DIR}
|
||||||
newcache {
|
newcache {
|
||||||
SQLITE_DIR = ../../../../Libraries/sqlite/sqlite-autoconf-3070900
|
SQLITE_DIR = ../../../sqlite-autoconf-3071300
|
||||||
INCLUDEPATH += . \
|
INCLUDEPATH += . \
|
||||||
$${SQLITE_DIR}
|
$${SQLITE_DIR}
|
||||||
}
|
}
|
||||||
|
@ -596,6 +628,7 @@ HEADERS += retroshare/rsgame.h \
|
||||||
util/contentvalue.h \
|
util/contentvalue.h \
|
||||||
gxs/gxscoreserver.h \
|
gxs/gxscoreserver.h \
|
||||||
gxs/gxssecurity.h
|
gxs/gxssecurity.h
|
||||||
|
|
||||||
SOURCES += serialiser/rsnxsitems.cc \
|
SOURCES += serialiser/rsnxsitems.cc \
|
||||||
gxs/rsdataservice.cc \
|
gxs/rsdataservice.cc \
|
||||||
gxs/rsgenexchange.cc \
|
gxs/rsgenexchange.cc \
|
||||||
|
@ -610,6 +643,7 @@ HEADERS += retroshare/rsgame.h \
|
||||||
gxs/gxscoreserver.cc \
|
gxs/gxscoreserver.cc \
|
||||||
gxs/gxssecurity.cc
|
gxs/gxssecurity.cc
|
||||||
}
|
}
|
||||||
|
|
||||||
newservices {
|
newservices {
|
||||||
HEADERS += services/p3photoservice.h \
|
HEADERS += services/p3photoservice.h \
|
||||||
serialiser/rsphotoitems.h \
|
serialiser/rsphotoitems.h \
|
||||||
|
@ -627,6 +661,7 @@ HEADERS += retroshare/rsgame.h \
|
||||||
services/p3posted.h \
|
services/p3posted.h \
|
||||||
services/p3photoserviceV2.h \
|
services/p3photoserviceV2.h \
|
||||||
retroshare/rsphotoV2.h
|
retroshare/rsphotoV2.h
|
||||||
|
|
||||||
SOURCES += services/p3photoservice.cc \
|
SOURCES += services/p3photoservice.cc \
|
||||||
serialiser/rsphotoitems.cc \
|
serialiser/rsphotoitems.cc \
|
||||||
services/p3gxsservice.cc \
|
services/p3gxsservice.cc \
|
||||||
|
|
|
@ -953,12 +953,12 @@ RsStackFileLock::RsStackFileLock(const std::string& file_path)
|
||||||
sleep(1) ;
|
sleep(1) ;
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
std::cerr << "Acquired file handle " << _file_handle << ", lock file:" << file_path << std::endl;
|
//std::cerr << "Acquired file handle " << _file_handle << ", lock file:" << file_path << std::endl;
|
||||||
}
|
}
|
||||||
RsStackFileLock::~RsStackFileLock()
|
RsStackFileLock::~RsStackFileLock()
|
||||||
{
|
{
|
||||||
RsDirUtil::releaseLockFile(_file_handle) ;
|
RsDirUtil::releaseLockFile(_file_handle) ;
|
||||||
std::cerr << "Released file lock with handle " << _file_handle << std::endl;
|
//std::cerr << "Released file lock with handle " << _file_handle << std::endl;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if 0 // NOT ENABLED YET!
|
#if 0 // NOT ENABLED YET!
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue