diff --git a/.reviewboardrc b/.reviewboardrc deleted file mode 100644 index b4e20125f7..0000000000 --- a/.reviewboardrc +++ /dev/null @@ -1,3 +0,0 @@ -REPOSITORY = "git://anongit.kde.org/kdevelop" -REVIEWBOARD_URL = "https://git.reviewboard.kde.org" -TARGET_GROUPS = "kdevelop" diff --git a/CMakeLists.txt b/CMakeLists.txt index 9c11860f91..26465cb78d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,5 +1,5 @@ cmake_minimum_required(VERSION 3.0) -project(KDevelop VERSION 5.2.0) +project(KDevelop VERSION 5.2.1) # KDevelop SOVERSION # E.g. for KDevelop 5.2.0 => SOVERSION 52 (we only promise ABI compatibility between patch version updates) @@ -31,6 +31,13 @@ include(CheckFunctionExists) include(KDEInstallDirs) include(KDECMakeSettings) +if(POLICY CMP0071) + # CMake 3.10 generates warnings when projects combine AUTOMOC with qt5_wrap_ui() or qt5_add_resources() + # Avoid that by setting this policy (cf. https://bugreports.qt.io/browse/QTBUG-63442) + # Note: Once we depend on a Qt which has this fix (likely Qt 5.9.4+), remove this + cmake_policy(SET CMP0071 OLD) +endif() + set(QT_MIN_VERSION "5.5.0") find_package(Qt5 ${QT_MIN_VERSION} CONFIG REQUIRED Widgets Concurrent Quick QuickWidgets) if(BUILD_TESTING) @@ -74,6 +81,14 @@ set_package_properties(KDevelop-PG-Qt PROPERTIES find_package(SharedMimeInfo REQUIRED) +if(NOT CMAKE_VERSION VERSION_LESS "3.10.0" AND KF5_VERSION VERSION_LESS "5.42.0") + # CMake 3.9+ warns about automoc on files without Q_OBJECT, and doesn't know about other macros. + # 3.10+ lets us provide more macro names that require automoc. + # KF5 >= 5.42 takes care itself of adding its macros in its cmake config files + list(APPEND CMAKE_AUTOMOC_MACRO_NAMES + "K_PLUGIN_FACTORY_WITH_JSON" "K_EXPORT_PLASMA_DATAENGINE_WITH_JSON" "K_EXPORT_PLASMA_RUNNER") +endif() + add_definitions( -DQT_DEPRECATED_WARNINGS -DQT_DISABLE_DEPRECATED_BEFORE=0x050500 @@ -160,6 +175,6 @@ configure_file(${CMAKE_SOURCE_DIR}/CTestCustom.cmake ${CMAKE_BINARY_DIR}/CTestCu install(FILES org.kde.kdevelop.appdata.xml DESTINATION ${KDE_INSTALL_METAINFODIR}) # Make it possible to use the po files fetched by the fetch-translations step -ki18n_install("${CMAKE_CURRENT_BINARY_DIR}/po") +ki18n_install(po) feature_summary(WHAT ALL INCLUDE_QUIET_PACKAGES FATAL_ON_MISSING_REQUIRED_PACKAGES) diff --git a/app/3rdparty/qtsingleapplication/CMakeLists.txt b/app/3rdparty/qtsingleapplication/CMakeLists.txt new file mode 100644 index 0000000000..fca5aa70e5 --- /dev/null +++ b/app/3rdparty/qtsingleapplication/CMakeLists.txt @@ -0,0 +1,8 @@ +set(qtsingleapplication_SRCS qtlocalpeer.cpp qtsingleapplication.cpp qtlockedfile.cpp) +if(WIN32) + list(APPEND qtsingleapplication_SRCS qtlockedfile_win.cpp) +else() + list(APPEND qtsingleapplication_SRCS qtlockedfile_unix.cpp) +endif() +add_library(qtsingleapplication STATIC ${qtsingleapplication_SRCS}) +target_link_libraries(qtsingleapplication Qt5::Core Qt5::Network Qt5::Widgets) diff --git a/app/qtlocalpeer.cpp b/app/3rdparty/qtsingleapplication/qtlocalpeer.cpp similarity index 100% rename from app/qtlocalpeer.cpp rename to app/3rdparty/qtsingleapplication/qtlocalpeer.cpp diff --git a/app/qtlocalpeer.h b/app/3rdparty/qtsingleapplication/qtlocalpeer.h similarity index 100% rename from app/qtlocalpeer.h rename to app/3rdparty/qtsingleapplication/qtlocalpeer.h diff --git a/app/qtlockedfile.cpp b/app/3rdparty/qtsingleapplication/qtlockedfile.cpp similarity index 100% rename from app/qtlockedfile.cpp rename to app/3rdparty/qtsingleapplication/qtlockedfile.cpp diff --git a/app/qtlockedfile.h b/app/3rdparty/qtsingleapplication/qtlockedfile.h similarity index 100% rename from app/qtlockedfile.h rename to app/3rdparty/qtsingleapplication/qtlockedfile.h diff --git a/app/qtlockedfile_unix.cpp b/app/3rdparty/qtsingleapplication/qtlockedfile_unix.cpp similarity index 100% rename from app/qtlockedfile_unix.cpp rename to app/3rdparty/qtsingleapplication/qtlockedfile_unix.cpp diff --git a/app/qtlockedfile_win.cpp b/app/3rdparty/qtsingleapplication/qtlockedfile_win.cpp similarity index 100% rename from app/qtlockedfile_win.cpp rename to app/3rdparty/qtsingleapplication/qtlockedfile_win.cpp diff --git a/app/qtsingleapplication.cpp b/app/3rdparty/qtsingleapplication/qtsingleapplication.cpp similarity index 100% rename from app/qtsingleapplication.cpp rename to app/3rdparty/qtsingleapplication/qtsingleapplication.cpp diff --git a/app/qtsingleapplication.h b/app/3rdparty/qtsingleapplication/qtsingleapplication.h similarity index 100% rename from app/qtsingleapplication.h rename to app/3rdparty/qtsingleapplication/qtsingleapplication.h diff --git a/app/CMakeLists.txt b/app/CMakeLists.txt index 43574b58e4..d9f9481a61 100644 --- a/app/CMakeLists.txt +++ b/app/CMakeLists.txt @@ -9,17 +9,7 @@ endif() option(KDEVELOP_SINGLE_APP "Use QtSingleApplication as KDevelop's base" OFF) -set(singleapp_SRCS qtlocalpeer.cpp qtsingleapplication.cpp qtlockedfile.cpp) -if(WIN32) - set(singleapp_SRCS ${singleapp_SRCS} qtlockedfile_win.cpp) -else() - set(singleapp_SRCS ${singleapp_SRCS} qtlockedfile_unix.cpp) -endif() - set(kdevelop_SRCS main.cpp kdevideextension.cpp) -if(KDEVELOP_SINGLE_APP) - set(kdevelop_SRCS ${kdevelop_SRCS} ${singleapp_SRCS}) -endif() ecm_qt_declare_logging_category(kdevelop_SRCS HEADER debug.h @@ -46,7 +36,6 @@ ecm_add_app_icon(kdevelop_SRCS ICONS qt5_add_resources(kdevelop_SRCS kdevelop.qrc) add_executable(kdevelop ${kdevelop_SRCS} ) - target_link_libraries(kdevelop KDev::Interfaces KDev::Shell @@ -55,10 +44,16 @@ target_link_libraries(kdevelop KF5::Declarative KF5::IconThemes KF5::Crash + + Qt5::Quick ) IF(APPLE) target_link_libraries(kdevelop "-framework CoreFoundation") ENDIF() +if(KDEVELOP_SINGLE_APP) + add_subdirectory(3rdparty/qtsingleapplication) + target_link_libraries(kdevelop qtsingleapplication) +endif() install(TARGETS kdevelop ${KDE_INSTALL_TARGETS_DEFAULT_ARGS} ) diff --git a/app/kdevelop! b/app/kdevelop! index 88fb659f09..5d97a25664 100755 --- a/app/kdevelop! +++ b/app/kdevelop! @@ -24,7 +24,7 @@ export APPLICATION=KDevelop if ! [ "$KDEV_ATTACHED_PID" ]; then ARGS="" if [ $# -eq 0 ]; then - ARGS="-pss" + ARGS="--pss" else ARGS="$@" fi diff --git a/app/kdevelop.xml b/app/kdevelop.xml index 32ea019d02..cbc42947f8 100644 --- a/app/kdevelop.xml +++ b/app/kdevelop.xml @@ -9,6 +9,7 @@ KDevelop-Projektdatei KDevelop Project File Archivo de proyecto de KDevelop + Fichiers de projet KDevelop Ficheiro de proxecto de KDevelop File di progetto di KDevelop Projectbestand van KDevelop diff --git a/app/main.cpp b/app/main.cpp index d5821f6688..f17223fe85 100644 --- a/app/main.cpp +++ b/app/main.cpp @@ -49,6 +49,8 @@ #include #include +#include + #include #include #include @@ -94,7 +96,7 @@ void openFiles(const QVector& infos) { foreach (const UrlInfo& info, infos) { if (!ICore::self()->documentController()->openDocument(info.url, info.cursor)) { - qWarning() << i18n("Could not open %1", info.url.toDisplayString(QUrl::PreferLocalFile)); + qWarning(APP) << i18n("Could not open %1", info.url.toDisplayString(QUrl::PreferLocalFile)); } } } @@ -164,7 +166,7 @@ private Q_SLOTS: QString x11SessionId = QStringLiteral("%1_%2").arg(sm.sessionId()).arg(sm.sessionKey()); const auto activeSession = KDevelop::Core::self()->sessionController()->activeSession(); if (!activeSession) { - qWarning() << "No active session, can't save state"; + qWarning(APP) << "No active session, can't save state"; return; } @@ -304,6 +306,13 @@ int main( int argc, char *argv[] ) QElapsedTimer timer; timer.start(); +#if QT_VERSION >= QT_VERSION_CHECK(5, 8, 0) + // If possible, use the Software backend for QQuickWidget (currently used in the + // welcome page plugin). This means we don't need OpenGL at all, avoiding issues + // like https://bugs.kde.org/show_bug.cgi?id=386527. + QQuickWindow::setSceneGraphBackend(QSGRendererInterface::Software); +#endif + // TODO: Maybe generalize, add KDEVELOP_STANDALONE build option #if defined(Q_OS_WIN) || defined(Q_OS_MAC) qputenv("KDE_FORK_SLAVES", "1"); // KIO slaves will be forked off instead of being started via DBus @@ -658,7 +667,7 @@ int main( int argc, char *argv[] ) const KDevelop::SessionInfo* sessionData = findSessionInList(availableSessionInfos, session); if( !sessionData ) { - qCritical() << "session not given or does not exist"; + qCritical(APP) << "session not given or does not exist"; return 5; } @@ -668,7 +677,7 @@ int main( int argc, char *argv[] ) std::cout << pid << std::endl; return 0; } else { - qCritical() << sessionData->uuid.toString() << sessionData->name << "is not running"; + qCritical(APP) << sessionData->uuid.toString() << sessionData->name << "is not running"; return 5; } } diff --git a/app/org.kde.kdevelop.desktop b/app/org.kde.kdevelop.desktop index cf4d287164..4fbc23eedf 100644 --- a/app/org.kde.kdevelop.desktop +++ b/app/org.kde.kdevelop.desktop @@ -73,7 +73,10 @@ GenericName[zh_TW]=整合開發環境 Comment=Plugin-extensible IDE for C/C++ and other programming languages Comment[ca]=Un IDE ampliable amb connectors per al C/C++ i altres llenguatges de programació Comment[ca@valencia]=Un IDE ampliable amb connectors per al C/C++ i altres llenguatges de programació +Comment[de]=Eine integrierte Entwicklungsumgebung (IDE) für C/C++ und andere Programmiersprachen, die durch Module erweitert werden kann. +Comment[en_GB]=Plugin-extensible IDE for C/C++ and other programming languages Comment[es]=Entorno de desarrollo integrado para C/C++ y otros lenguajes de programación que se puede extender con complementos +Comment[fr]=Il s'agit d'un environnement de développement complet et extensible pour le C / C++ et d'autres langages de programmation. Comment[it]=IDE estensibile per C/C++ ed altri linguaggi di programmazione Comment[nl]=IDE voor C/C++ en andere programmeertalen, uit te breiden met plug-ins. Comment[pl]=Zintegrowane środowisko programistyczne dla C/C++ i innych języków programowania z możliwością rozszerzenia o wtyczki diff --git a/app/org.kde.kdevelop_ps.desktop b/app/org.kde.kdevelop_ps.desktop index 0dc29a0779..b8bd1e278e 100644 --- a/app/org.kde.kdevelop_ps.desktop +++ b/app/org.kde.kdevelop_ps.desktop @@ -68,7 +68,10 @@ GenericName[zh_TW]=整合開發環境(選擇要開始的工作階段) Comment=Plugin-extensible IDE for C/C++ and other programming languages (Pick Session to start with) Comment[ca]=Un IDE ampliable amb connectors per al C/C++ i altres llenguatges de programació (trieu Sessió per a començar-hi) Comment[ca@valencia]=Un IDE ampliable amb connectors per al C/C++ i altres llenguatges de programació (trieu Sessió per a començar-hi) +Comment[de]=Eine integrierte Entwicklungsumgebung (IDE) für C/C++ und andere Programmiersprachen, die durch Module erweitert werden kann. Wählen Sie eine Sitzung zum Starten aus. +Comment[en_GB]=Plugin-extensible IDE for C/C++ and other programming languages (Pick Session to start with) Comment[es]=Entorno de desarrollo integrado para C/C++ y otros lenguajes de programación que se puede extender con complementos (escoger sesión con la que empezar) +Comment[fr]=Il s'agit d'un environnement de développement complet et extensible pour le C / C++ et d'autres langages de programmation (sélectionnez la session avec laquelle vous voulez commencer). Comment[it]=IDE estensibile per C/C++ ed altri linguaggi di programmazione (Scegliere la sessione con cui iniziare) Comment[nl]=IDE voor C/C++ en andere programmeertalen, uit te breiden met plug-ins. (Kies sessie om mee te beginnen) Comment[pl]=Zintegrowane środowisko programistyczne dla C/C++ i innych języków programowania z możliwością rozszerzenia o wtyczki (Wybór sesji do rozpoczęcia) diff --git a/app_templates/cpp/CMake/cmake_kdevplugin/src/%{APPNAMELC}.json b/app_templates/cpp/CMake/cmake_kdevplugin/src/%{APPNAMELC}.json index 9ca38b6403..e4a61a3260 100644 --- a/app_templates/cpp/CMake/cmake_kdevplugin/src/%{APPNAMELC}.json +++ b/app_templates/cpp/CMake/cmake_kdevplugin/src/%{APPNAMELC}.json @@ -1,10 +1,8 @@ { "KPlugin": { "Description": "%{APPNAME}", - "Description[x-test]": "xx%{APPNAME}xx", "Id": "%{APPNAMELC}", "Name": "%{APPNAME}", - "Name[x-test]": "xx%{APPNAME}xx", "ServiceTypes": [ "KDevelop/Plugin" ] diff --git a/app_templates/cpp/QMake/qmake_qt5guiapp/qmake_qt5guiapp.kdevtemplate b/app_templates/cpp/QMake/qmake_qt5guiapp/qmake_qt5guiapp.kdevtemplate index 6ed64f0df2..4ba41cd243 100644 --- a/app_templates/cpp/QMake/qmake_qt5guiapp/qmake_qt5guiapp.kdevtemplate +++ b/app_templates/cpp/QMake/qmake_qt5guiapp/qmake_qt5guiapp.kdevtemplate @@ -3,6 +3,7 @@ Name=QMake Qt5 QWidgets GUI Application Name[ca]=Una aplicació IGU per a QMake Qt5 QWidgets Name[ca@valencia]=Una aplicació IGU per a QMake Qt5 QWidgets Name[cs]=Aplikace prostředí QMake Qt5 QWidgets +Name[en_GB]=QMake Qt5 QWidgets GUI Application Name[es]=Aplicación con interfaz gráfica con QWidgets de Qt5 y QMake Name[fr]=Une application graphique avec Qt5, QMake et QWidgets Name[it]=Applicazione con GUI in QWidgets di Qt5 e QMake @@ -20,8 +21,9 @@ Comment=Generate a QMake/Qt5 based GUI application (crossplatform compatible) Comment[ca]=Genera una aplicació IGU basada en QMake/Qt5 (compatible amb multiplataforma) Comment[ca@valencia]=Genera una aplicació IGU basada en QMake/Qt5 (compatible amb multiplataforma) Comment[cs]=Vytvořit aplikaci založenou na QMake/Qt5 (multiplatformní) +Comment[en_GB]=Generate a QMake/Qt5 based GUI application (crossplatform compatible) Comment[es]=Genera una aplicación con interfaz gráfica basada en QMake/Qt5 (compatible multiplataforma) -Comment[fr]=Générer une application graphique basée sur QMake/Qt5 (compatible multi-plate-forme) +Comment[fr]=Générer une application graphique fondée sur QMake/Qt5 (compatible multi-plate-forme) Comment[it]=Genera un'applicazione basata su QMake/Qt5 con interfaccia utente grafica (compatibile multipiattaforma) Comment[nl]=Op QMake/Qt5 gebaseerde GUI-toepassing genereren (crossplatform compatibel) Comment[pl]=Uwórz aplikację opartą na interfejsie użytkownika QMake/Qt5 (zgodne na wielu platformach) diff --git a/appimage/Dockerfile b/appimage/Dockerfile index 2beedbbef2..e08cba3ee4 100644 --- a/appimage/Dockerfile +++ b/appimage/Dockerfile @@ -1,21 +1,34 @@ FROM centos:6.8 -RUN yum -y update && yum -y install wget && yum -y install centos-release-scl epel-release && yum -y update && yum -y install devtoolset-4-gcc devtoolset-4-gcc-c++ devtoolset-4-binutils wget tar bzip2 git libtool which fuse fuse-devel libpng-devel automake cppunit-devel cmake glibc-headers libstdc++-devel gcc-c++ freetype-devel fontconfig-devel libxml2-devel libstdc++-devel libXrender-devel patch xcb-util-keysyms-devel libXi-devel libudev-devel.x86_64 openssl-devel sqlite-devel.x86_64 gperftools.x86_64 gperf.x86_64 libicu-devel.x86_64 boost-devel.x86_64 libxslt-devel.x86_64 docbook-style-xsl.noarch python27.x86_64 cmake3.x86_64 ruby bison flex bison-devel ruby-devel flex-devel xz pcre-devel pcre2-devel pcre pcre2 mesa-libEGL-devel mesa-libGL-devel glib-devel gettext perl-URI.noarch bzip2-devel.x86_64 subversion-devel.x86_64 subversion.x86_64 sqlite2-devel.x86_64 hunspell-devel aspell-devel hspell-devel vim sudo unzip +RUN yum -y update && yum -y install wget && yum -y install centos-release-scl epel-release && yum -y update && yum -y install devtoolset-4-gcc devtoolset-4-gcc-c++ devtoolset-4-binutils wget tar bzip2 git libtool which fuse fuse-devel libpng-devel automake cppunit-devel cmake glibc-headers libstdc++-devel gcc-c++ freetype-devel fontconfig-devel libxml2-devel libstdc++-devel libXrender-devel patch xcb-util-keysyms-devel libXi-devel libudev-devel.x86_64 openssl-devel sqlite-devel.x86_64 gperftools.x86_64 gperf.x86_64 libicu-devel.x86_64 boost-devel.x86_64 libxslt-devel.x86_64 docbook-style-xsl.noarch python27.x86_64 cmake3.x86_64 ruby bison flex bison-devel ruby-devel flex-devel xz pcre-devel pcre2-devel pcre pcre2 mesa-libEGL-devel mesa-libGL-devel glib-devel gettext perl-URI.noarch bzip2-devel.x86_64 subversion-devel.x86_64 subversion.x86_64 sqlite2-devel.x86_64 hunspell-devel aspell-devel hspell-devel vim sudo unzip xkeyboard-config RUN cd /tmp && wget http://opensource.wandisco.com/rhel/6/svn-1.9/RPMS/x86_64/subversion-1.9.4-3.x86_64.rpm http://opensource.wandisco.com/rhel/6/svn-1.9/RPMS/x86_64/subversion-devel-1.9.4-3.x86_64.rpm http://opensource.wandisco.com/rhel/6/svn-1.9/RPMS/x86_64/serf-1.3.7-1.x86_64.rpm && yum -y install subversion* serf*; rm subversion* serf* RUN echo ". /opt/rh/devtoolset-4/enable && chmod +x /opt/rh/python27/enable && . /opt/rh/python27/enable" >> /root/.bashrc -ENV LC_ALL=en_US.UTF-8 LANG=en_us.UTF-8 QTVERSION=5.7.1 QVERSION_SHORT=5.7 LLVM_ROOT=/opt/llvm/ QTV=5.7.1 LD_LIBRARY_PATH=$QTDIR/lib/ +ENV LC_ALL=en_US.UTF-8 LANG=en_us.UTF-8 QTVERSION=5.9.2 QTVERSION_SHORT=5.9 LLVM_VERSION=5.0.0 LLVM_ROOT=/opt/llvm/ LD_LIBRARY_PATH=$QTDIR/lib/ ENV QTDIR=/usr/local/Qt-${QTVERSION}/ -RUN bash -c "mkdir -p /qt && cd /qt && wget http://download.qt.io/archive/qt/${QVERSION_SHORT}/${QTVERSION}/single/qt-everywhere-opensource-src-${QTVERSION}.tar.xz && tar xvf qt-everywhere-opensource-src-${QTVERSION}.tar.xz && ln -sf /opt/rh/devtoolset-4/root/usr/bin/g++ /usr/bin/g++ && ln -sf /opt/rh/devtoolset-4/root/usr/bin/c++ /usr/bin/c++ && cd /qt/qt-everywhere-opensource-src-$QTV && ./configure -v -skip qt3d -skip qtgamepad -platform linux-g++ -qt-pcre -qt-xcb -qt-xkbcommon -xkb-config-root /usr/share/X11/xkb -no-pch -qt-sql-sqlite -qt-sql-sqlite2 -nomake tests -nomake examples -confirm-license -opensource && make -j$(nproc) || make -j 1 install; make -j$(nproc) install && rm -Rf /qt" +RUN bash -c "ln -sf /opt/rh/devtoolset-4/root/usr/bin/g++ /usr/bin/g++ && ln -sf /opt/rh/devtoolset-4/root/usr/bin/c++ /usr/bin/c++" -RUN bash -c "ln -sf /usr/local/Qt-$QTV/bin/qmake /usr/bin/qmake-qt5 && mkdir -p /qtwk && cd /qtwk && wget http://download.qt.io/community_releases/${QVERSION_SHORT}/${QTV}/qtwebkit-opensource-src-${QTV}.tar.xz && tar xvf qtwebkit-opensource-src-${QTV}.tar.xz && cd /qtwk/qtwebkit-opensource-src-${QTV} && $QTDIR/bin/qmake && make -j$(nproc) || make -j$(nproc) && make -j$(nproc) install && rm -Rf /qtwk" +# Build Qt5 +RUN bash -c "mkdir -p /qt && cd /qt && wget http://download.qt.io/archive/qt/${QTVERSION_SHORT}/${QTVERSION}/single/qt-everywhere-opensource-src-${QTVERSION}.tar.xz && tar xvf qt-everywhere-opensource-src-${QTVERSION}.tar.xz " +RUN bash -c "export MAKEFLAGS=-j$(nproc) && cd /qt/qt-everywhere-opensource-src-${QTVERSION} && ./configure -v -skip qt3d -skip qtgamepad -platform linux-g++ -qt-pcre -qt-xcb -qt-xkbcommon-x11 -xkb-config-root /usr/share/X11/xkb -no-pch -nomake tests -nomake examples -confirm-license -opensource && make -j$(nproc) || make -j 1 install; make -j$(nproc) install && rm -Rf /qt" -RUN bash -c "mkdir -p /llvm && cd /llvm && wget http://llvm.org/releases/3.9.1/llvm-3.9.1.src.tar.xz && tar xvf llvm-3.9.1.src.tar.xz && cd llvm-3.9.1.src && cd tools && wget http://llvm.org/releases/3.9.1/cfe-3.9.1.src.tar.xz && tar xvf cfe-3.9.1.src.tar.xz && . /opt/rh/python27/enable && . /opt/rh/devtoolset-4/enable && python --version && cd /llvm/llvm-3.9.1.src && mkdir -p build && cd build && cmake3 .. -DCMAKE_INSTALL_PREFIX=/opt/llvm/ -DCMAKE_BUILD_TYPE=Release && make -j$(nproc) install && rm -Rf /llvm" +RUN ln -sf /usr/local/Qt-${QTVERSION}/bin/qmake /usr/bin/qmake-qt5 -RUN bash -c "mkdir -p /python && cd /python && wget https://www.python.org/ftp/python/3.6.0/Python-3.6.0.tar.xz && tar xvf Python-3.6.0.tar.xz && cd /python/Python-3.6.0 && mkdir -p /usr/lib/pkgconfig && ./configure --prefix=/usr --enable-shared && make -j$(nproc) install && rm -Rf /python" +# Build qtwebkit +RUN bash -c "mkdir -p /qtwk && cd /qtwk && wget http://download.qt.io/archive/qt/${QTVERSION_SHORT}/5.9.1/submodules/qtwebkit-opensource-src-5.9.1.tar.xz && tar xvf qtwebkit-opensource-src-5.9.1.tar.xz" +RUN bash -c "cd /qtwk/qtwebkit-opensource-src-5.9.1 && $QTDIR/bin/qmake && make -j$(nproc) || make -j$(nproc) && make -j$(nproc) install && rm -Rf /qtwk" +# Install ninja RUN bash -c "yum install unzip && mkdir -p /tmp/deploy && cd /tmp/deploy && wget https://github.com/ninja-build/ninja/releases/download/v1.7.2/ninja-linux.zip && unzip ninja-linux.zip && mv -f ninja /usr/local/bin && cd .. && rm -Rf deploy" +# Build Clang/LLVM +RUN bash -c "mkdir -p /llvm && cd /llvm && wget http://llvm.org/releases/${LLVM_VERSION}/llvm-${LLVM_VERSION}.src.tar.xz && tar xvf llvm-${LLVM_VERSION}.src.tar.xz && cd llvm-${LLVM_VERSION}.src && cd tools && wget http://llvm.org/releases/${LLVM_VERSION}/cfe-${LLVM_VERSION}.src.tar.xz && tar xvf cfe-${LLVM_VERSION}.src.tar.xz" +RUN bash -c ". /opt/rh/python27/enable && . /opt/rh/devtoolset-4/enable && python --version && cd /llvm/llvm-${LLVM_VERSION}.src && mkdir -p build && cd build && cmake3 -G Ninja .. -DCMAKE_INSTALL_PREFIX=/opt/llvm/ -DCMAKE_BUILD_TYPE=Release && ninja install && rm -Rf /llvm" + +# Build Python +RUN bash -c "mkdir -p /python && cd /python && wget https://www.python.org/ftp/python/3.6.0/Python-3.6.0.tar.xz && tar xvf Python-3.6.0.tar.xz && cd /python/Python-3.6.0 && mkdir -p /usr/lib/pkgconfig && ./configure --prefix=/usr --enable-shared && make -j$(nproc) install && rm -Rf /python" + + CMD /bin/bash diff --git a/appimage/kdevelop-recipe-centos6.sh b/appimage/kdevelop-recipe-centos6.sh index 20ab7459d7..fcd227045d 100755 --- a/appimage/kdevelop-recipe-centos6.sh +++ b/appimage/kdevelop-recipe-centos6.sh @@ -19,8 +19,8 @@ git_pull_rebase_helper() SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" -QTVERSION=5.7.1 -QVERSION_SHORT=5.7 +QTVERSION=5.9.2 +QTVERSION_SHORT=5.9 QTDIR=/usr/local/Qt-${QTVERSION}/ if [ -z "$KDEVELOP_VERSION" ]; then @@ -29,7 +29,7 @@ fi if [ -z "$KDEV_PG_QT_VERSION" ]; then KDEV_PG_QT_VERSION=2.0 fi -KF5_VERSION=v5.32.0 +KF5_VERSION=v5.37.0 KDE_PLASMA_VERSION=master # need libksysguard master (contains a0e69617442d720c76da5ebe3323e7a977929db4 -- patch which makes plasma dep optional) KDE_APPLICATION_VERSION=v16.12.3 GRANTLEE_VERSION=v5.1.0 diff --git a/file_templates/classes/qdialog_pimpl/qdialog_pimpl.desktop b/file_templates/classes/qdialog_pimpl/qdialog_pimpl.desktop index 685dbeea9d..8988198d28 100644 --- a/file_templates/classes/qdialog_pimpl/qdialog_pimpl.desktop +++ b/file_templates/classes/qdialog_pimpl/qdialog_pimpl.desktop @@ -2,7 +2,9 @@ Name=Dialog (pimpl) with a UI File Name[ca]=Diàleg (pimpl) amb un fitxer IU Name[ca@valencia]=Diàleg (pimpl) amb un fitxer IU +Name[en_GB]=Dialogue (pimpl) with a UI File Name[es]=Diálogo (pimpl) con un archivo de interfaz gráfica +Name[fr]=Dialogue (pimpl) avec un fichier d'interface utilisateur Name[it]=Finestra di dialogo (pimpl) con un file UI Name[nl]=Dialoog (pimpl) met een UI-bestand Name[pl]=Okno dialogowe (pimpl) z plikiem UI @@ -16,7 +18,9 @@ Name[zh_CN]=使用 UI 文件的对话框 (pimpl) Comment=QDialog subclass with a separate Qt Designer file and private implementation Comment[ca]=Subclasse QDialog amb un fitxer separat del Qt Designer i una implementació privada Comment[ca@valencia]=Subclasse QDialog amb un fitxer separat del Qt Designer i una implementació privada +Comment[en_GB]=QDialog subclass with a separate Qt Designer file and private implementation Comment[es]=Subclase de QDialog con un archivo separado del Diseñador de Qt y una implementación privada +Comment[fr]=Sous-classe QDialog avec un fichier Qt  Designer séparé et une implémentation privée Comment[it]=Sottoclasse di QDialog con un file separato di Qt Designer e implementazione privata Comment[nl]=QDialog subklasse met een apart Qt Designer bestand en private implementatie Comment[pl]=Podklasa QDialog z osobnym plikiem Projektanta Qt i prywatną implementacją @@ -177,6 +181,7 @@ OutputFile={{ name }}.cpp [UI] Name=User Interface +Name[bg]=Потребителски интерфейс Name[bs]=Korisnički interfejs Name[ca]=Interfície d'usuari Name[ca@valencia]=Interfície d'usuari @@ -193,13 +198,16 @@ Name[gl]=Interface de usuario Name[hu]=Felhasználói felület Name[it]=Interfaccia utente Name[kk]=Пайдаланушы интерфейсі +Name[lv]=Lietotāja saskarne Name[mr]=वापरकर्ता संवाद Name[nb]=Brukerflate Name[nds]=Böversiet Name[nl]=Gebruikersinterface +Name[pa]=ਯੂਜ਼ਰ ਇੰਟਰਫੇਸ Name[pl]=Interfejs użytkownika Name[pt]=Interface do Utilizador Name[pt_BR]=Interface do usuário +Name[ro]=Interfață utilizator Name[ru]=Пользовательский интерфейс Name[sk]=Užívateľské rozhranie Name[sl]=Uporabniški vmesnik diff --git a/file_templates/classes/qobject_pimpl/qobject_pimpl.desktop b/file_templates/classes/qobject_pimpl/qobject_pimpl.desktop index 8a597a314f..b213948892 100644 --- a/file_templates/classes/qobject_pimpl/qobject_pimpl.desktop +++ b/file_templates/classes/qobject_pimpl/qobject_pimpl.desktop @@ -3,6 +3,7 @@ Name=QObject pimpl subclass Name[ca]=Subclasse QObject «pimpl» Name[ca@valencia]=Subclasse QObject «pimpl» Name[cs]=Podtřída QObject pimpl +Name[en_GB]=QObject pimpl subclass Name[es]=Subclase «pimpl» de QObject Name[fr]=Sous-classe QObject Name[it]=Sottoclasse pimpl di QObject @@ -19,6 +20,8 @@ Name[zh_CN]=QObject pimpl 子类 Comment=QObject subclass with private implementation Comment[ca]=Una subclasse QObject amb implementació privada Comment[ca@valencia]=Una subclasse QObject amb implementació privada +Comment[de]=QObject-Unterklasse mit privater Implementierung +Comment[en_GB]=QObject subclass with private implementation Comment[es]=Una subclase de QObject con una implementación privada Comment[fr]=Une sous-classe QObject avec une implémentation privée Comment[it]=Una sottoclasse di QObject con un'implementazione privata diff --git a/file_templates/classes/qt_interface/qt_interface.desktop b/file_templates/classes/qt_interface/qt_interface.desktop index e0c6a9a14f..5f7100d191 100644 --- a/file_templates/classes/qt_interface/qt_interface.desktop +++ b/file_templates/classes/qt_interface/qt_interface.desktop @@ -3,6 +3,8 @@ Name=QObject interface class Name[ca]=Classe d'interfície QObject Name[ca@valencia]=Classe d'interfície QObject Name[cs]=Třída QObject interface +Name[de]=QObject-Schnittstellenklasse +Name[en_GB]=QObject interface class Name[es]=Clase de interfaz para QObject Name[fr]=Classe d'interface QObject Name[it]=Classe interfaccia di QObject @@ -19,6 +21,8 @@ Name[zh_CN]=QObject 接口类 Comment=QObject interface class with properties Comment[ca]=Classe d'interfície QObject amb propietats Comment[ca@valencia]=Classe d'interfície QObject amb propietats +Comment[de]=QObject-Schnittstellenklasse mit Eigenschaften +Comment[en_GB]=QObject interface class with properties Comment[es]=Clase de interfaz para QObject con propiedades Comment[fr]=Interface QObject avec des propriétés Comment[it]=Classe interfaccia di QObject con delle proprietà diff --git a/file_templates/classes/qt_widget/qt_widget.desktop b/file_templates/classes/qt_widget/qt_widget.desktop index a5159d2d04..ad4c902a86 100644 --- a/file_templates/classes/qt_widget/qt_widget.desktop +++ b/file_templates/classes/qt_widget/qt_widget.desktop @@ -174,6 +174,7 @@ OutputFile={{ name }}.cpp [UI] Name=User Interface +Name[bg]=Потребителски интерфейс Name[bs]=Korisnički interfejs Name[ca]=Interfície d'usuari Name[ca@valencia]=Interfície d'usuari @@ -190,13 +191,16 @@ Name[gl]=Interface de usuario Name[hu]=Felhasználói felület Name[it]=Interfaccia utente Name[kk]=Пайдаланушы интерфейсі +Name[lv]=Lietotāja saskarne Name[mr]=वापरकर्ता संवाद Name[nb]=Brukerflate Name[nds]=Böversiet Name[nl]=Gebruikersinterface +Name[pa]=ਯੂਜ਼ਰ ਇੰਟਰਫੇਸ Name[pl]=Interfejs użytkownika Name[pt]=Interface do Utilizador Name[pt_BR]=Interface do usuário +Name[ro]=Interfață utilizator Name[ru]=Пользовательский интерфейс Name[sk]=Užívateľské rozhranie Name[sl]=Uporabniški vmesnik diff --git a/kdevplatform/CMakeLists.txt b/kdevplatform/CMakeLists.txt index 2cf4815726..59a45499d8 100644 --- a/kdevplatform/CMakeLists.txt +++ b/kdevplatform/CMakeLists.txt @@ -2,8 +2,9 @@ # E.g. for KDevelop 5.2.0 => SOVERSION 52 (we only promise ABI compatibility between patch version updates) set(KDEVPLATFORM_SOVERSION ${KDEVELOP_SOVERSION}) -# Increase this to reset incompatible item-repositories -set(KDEV_ITEMREPOSITORY_VERSION 87) +# Increase this to reset incompatible item-repositories. +# Changing KDEVELOP_VERSION automatically resets the itemrepository as well. +set(KDEV_ITEMREPOSITORY_INCREMENT 0) set(KDevPlatform_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}) set(KDevPlatform_BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR}) diff --git a/kdevplatform/KDevPlatformConfig.cmake.in b/kdevplatform/KDevPlatformConfig.cmake.in index 8905df8844..019682c16e 100644 --- a/kdevplatform/KDevPlatformConfig.cmake.in +++ b/kdevplatform/KDevPlatformConfig.cmake.in @@ -18,6 +18,7 @@ find_dependency(KF5ConfigWidgets "@KF5_DEP_VERSION@") find_dependency(KF5GuiAddons "@KF5_DEP_VERSION@") find_dependency(KF5I18n "@KF5_DEP_VERSION@") find_dependency(KF5IconThemes "@KF5_DEP_VERSION@") +find_dependency(KF5ItemModels "@KF5_DEP_VERSION@") find_dependency(KF5ItemViews "@KF5_DEP_VERSION@") find_dependency(KF5JobWidgets "@KF5_DEP_VERSION@") find_dependency(KF5KCMUtils "@KF5_DEP_VERSION@") diff --git a/kdevplatform/config-kdevplatform.h.cmake b/kdevplatform/config-kdevplatform.h.cmake index 7e3bdd9e0a..ddb6cb407a 100644 --- a/kdevplatform/config-kdevplatform.h.cmake +++ b/kdevplatform/config-kdevplatform.h.cmake @@ -1,6 +1,11 @@ #ifndef CONFIG_KDEVPLATFORM_H #define CONFIG_KDEVPLATFORM_H -#define KDEV_ITEMREPOSITORY_VERSION @KDEV_ITEMREPOSITORY_VERSION@ +#include "kdevelop_version.h" + +#define KDEV_ITEMREPOSITORY_VERSION (KDEVELOP_VERSION_MAJOR << 24) \ + + (KDEVELOP_VERSION_MINOR << 16) \ + + (KDEVELOP_VERSION_PATCH << 8) \ + + @KDEV_ITEMREPOSITORY_INCREMENT@ #endif diff --git a/kdevplatform/documentation/standarddocumentationview.cpp b/kdevplatform/documentation/standarddocumentationview.cpp index 64680e5faa..b173e50847 100644 --- a/kdevplatform/documentation/standarddocumentationview.cpp +++ b/kdevplatform/documentation/standarddocumentationview.cpp @@ -92,6 +92,7 @@ class KDevelop::StandardDocumentationViewPrivate { m_view = new QWebView(parent); m_view->setContextMenuPolicy(Qt::NoContextMenu); + QObject::connect(m_view, &QWebView::linkClicked, parent, &StandardDocumentationView::linkClicked); } #else QWebEngineView* m_view = nullptr; diff --git a/kdevplatform/interfaces/idocumentcontroller.h b/kdevplatform/interfaces/idocumentcontroller.h index 3d8fe7a783..398dc9aef2 100644 --- a/kdevplatform/interfaces/idocumentcontroller.h +++ b/kdevplatform/interfaces/idocumentcontroller.h @@ -103,6 +103,8 @@ class KDEVPLATFORMINTERFACES_EXPORT IDocumentController: public QObject { */ virtual KTextEditor::View* activeTextDocumentView() const = 0; + virtual void updateDirectoryHint(const QString&) = 0; + public Q_SLOTS: /** * Opens a new or existing document. diff --git a/kdevplatform/interfaces/iplugin.h b/kdevplatform/interfaces/iplugin.h index f78127e96f..aa3d58cd46 100644 --- a/kdevplatform/interfaces/iplugin.h +++ b/kdevplatform/interfaces/iplugin.h @@ -60,7 +60,6 @@ struct ProjectConfigOptions; * Type=Service * Exec=blubb * Name= - * GenericName= * Comment= * Icon= * ServiceTypes=KDevelop/Plugin @@ -83,8 +82,6 @@ struct ProjectConfigOptions; * Description of parameters in .desktop file: * - Name is a translatable name of a plugin, it is used in the plugin * selection list (required); - * - GenericName is a translatable generic name of a plugin, it should - * describe in general what the plugin can do (required); * - Comment is a short description about the plugin (optional); * - Icon is a plugin icon (preferred); * X-KDE-librarythis is the name of the .so file to load for this plugin (required); diff --git a/kdevplatform/interfaces/kdevelopplugin.desktop b/kdevplatform/interfaces/kdevelopplugin.desktop index c5db2106a6..d1a8662bfb 100644 --- a/kdevplatform/interfaces/kdevelopplugin.desktop +++ b/kdevplatform/interfaces/kdevelopplugin.desktop @@ -3,12 +3,15 @@ Type=ServiceType X-KDE-ServiceType=KDevelop/Plugin X-KDE-Derived=KPluginInfo Name=KDevelop Plugin +Name[bg]=KDevelop приставка Name[ca]=Connector del KDevelop Name[ca@valencia]=Connector del KDevelop Name[cs]=Modul KDevelop Name[de]=KDevelop-Modul +Name[en_GB]=KDevelop Plugin Name[es]=Complemento de KDevelop Name[fr]=Module externe pour KDevelop +Name[hr]=KDevelop priključak Name[it]=Estensione per KDevelop Name[nb]=KDevelop programtillegg Name[nl]=Plugin van KDevelop diff --git a/kdevplatform/language/backgroundparser/tests/test_backgroundparser.cpp b/kdevplatform/language/backgroundparser/tests/test_backgroundparser.cpp index fae0233177..1c62892c4f 100644 --- a/kdevplatform/language/backgroundparser/tests/test_backgroundparser.cpp +++ b/kdevplatform/language/backgroundparser/tests/test_backgroundparser.cpp @@ -307,9 +307,15 @@ void TestBackgroundparser::benchmarkDocumentChanges() QVERIFY(editor); KTextEditor::Document* doc = editor->createDocument(this); QVERIFY(doc); - QTemporaryFile file; - QVERIFY(file.open()); - doc->saveAs(QUrl::fromLocalFile(file.fileName())); + + QString tmpFileName; + { + QTemporaryFile file; + QVERIFY(file.open()); + tmpFileName = file.fileName(); + } + + doc->saveAs(QUrl::fromLocalFile(tmpFileName)); DocumentChangeTracker tracker(doc); diff --git a/kdevplatform/language/codegen/templateengine.cpp b/kdevplatform/language/codegen/templateengine.cpp index 14176b5aa5..e70b6b5c89 100644 --- a/kdevplatform/language/codegen/templateengine.cpp +++ b/kdevplatform/language/codegen/templateengine.cpp @@ -21,6 +21,7 @@ #include "templateengine.h" +#include "debug.h" #include "templateengine_p.h" #include "codedescription.h" @@ -44,7 +45,17 @@ TemplateEngine::TemplateEngine() { d->engine.setSmartTrimEnabled(true); - addTemplateDirectories(QStandardPaths::locateAll(QStandardPaths::GenericDataLocation, QStringLiteral("kdevcodegen/templates"), QStandardPaths::LocateDirectory)); + qCDebug(LANGUAGE) << "Generic data locations:" << QStandardPaths::standardLocations(QStandardPaths::GenericDataLocation); + + const auto templateDirectories = QStandardPaths::locateAll(QStandardPaths::GenericDataLocation, + QStringLiteral("kdevcodegen/templates"), QStandardPaths::LocateDirectory); + + if (!templateDirectories.isEmpty()) { + qCDebug(LANGUAGE) << "Found template directories:" << templateDirectories; + addTemplateDirectories(QStandardPaths::locateAll(QStandardPaths::GenericDataLocation, QStringLiteral("kdevcodegen/templates"), QStandardPaths::LocateDirectory)); + } else { + qCWarning(LANGUAGE) << "No template directories found -- templating engine will not work!"; + } Grantlee::registerMetaType(); Grantlee::registerMetaType(); diff --git a/kdevplatform/language/codegen/templatesmodel.cpp b/kdevplatform/language/codegen/templatesmodel.cpp index 017c93ff32..7144a65f37 100644 --- a/kdevplatform/language/codegen/templatesmodel.cpp +++ b/kdevplatform/language/codegen/templatesmodel.cpp @@ -102,10 +102,6 @@ TemplatesModel::TemplatesModel(const QString& typePrefix, QObject* parent) : QStandardItemModel(parent) , d(new TemplatesModelPrivate(typePrefix)) { - const QStringList dataPaths = {QStandardPaths::writableLocation(QStandardPaths::GenericDataLocation)}; - foreach(const QString& dataPath, dataPaths) { - addDataPath(dataPath); - } } TemplatesModel::~TemplatesModel() = default; diff --git a/kdevplatform/language/duchain/navigation/abstractnavigationwidget.cpp b/kdevplatform/language/duchain/navigation/abstractnavigationwidget.cpp index 50f82c1ff2..6eaa1de9f0 100644 --- a/kdevplatform/language/duchain/navigation/abstractnavigationwidget.cpp +++ b/kdevplatform/language/duchain/navigation/abstractnavigationwidget.cpp @@ -253,6 +253,8 @@ void AbstractNavigationWidget::navigateDeclaration(const IndexedDeclaration& dec void AbstractNavigationWidgetPrivate::anchorClicked(const QUrl& url) { + DUChainReadLocker lock; + //We may get deleted while the call to acceptLink, so make sure we don't crash in that case QPointer thisPtr(q); NavigationContextPointer nextContext = m_context->acceptLink(url.toString()); diff --git a/kdevplatform/language/duchain/navigation/problemnavigationcontext.cpp b/kdevplatform/language/duchain/navigation/problemnavigationcontext.cpp index 39bd7505c9..1ae2adfe45 100644 --- a/kdevplatform/language/duchain/navigation/problemnavigationcontext.cpp +++ b/kdevplatform/language/duchain/navigation/problemnavigationcontext.cpp @@ -55,11 +55,11 @@ QString iconForSeverity(IProblem::Severity severity) QString htmlImg(const QString& iconName, KIconLoader::Group group) { - KIconLoader loader; - const int size = loader.currentSize(group); + auto* loader = KIconLoader::global(); + const int size = loader->currentSize(group); return QStringLiteral("") .arg(size) - .arg(loader.iconPath(iconName, group)); + .arg(loader->iconPath(iconName, group)); } } diff --git a/kdevplatform/language/highlighting/codehighlighting.cpp b/kdevplatform/language/highlighting/codehighlighting.cpp index 5e5ecb3fb4..6e22462146 100644 --- a/kdevplatform/language/highlighting/codehighlighting.cpp +++ b/kdevplatform/language/highlighting/codehighlighting.cpp @@ -639,4 +639,4 @@ void CodeHighlighting::aboutToRemoveText( const KTextEditor::Range& range ) } -// kate: space-indent on; indent-width 2; replace-trailing-space-save on; show-tabs on; tab-indents on; tab-width 2; +// kate: space-indent on; indent-width 2; remove-trailing-spaces all; show-tabs on; tab-indents on; tab-width 2; diff --git a/kdevplatform/project/projectmodel.cpp b/kdevplatform/project/projectmodel.cpp index 2aae7e1a28..86825e25c3 100644 --- a/kdevplatform/project/projectmodel.cpp +++ b/kdevplatform/project/projectmodel.cpp @@ -455,6 +455,19 @@ QString ProjectBaseItem::baseName() const return text(); } +QString ProjectBaseItem::directory() const +{ + ProjectBaseItem *item; + if ((item = folder())) + return item->path().path(); + if ((item = file())) + return item->path().toUrl().adjusted( + QUrl::RemoveScheme | + QUrl::RemoveFilename | + QUrl::StripTrailingSlash).toString(); + return project()->projectItem()->path().path(); +} + void ProjectBaseItem::setPath( const Path& path) { Q_D(ProjectBaseItem); diff --git a/kdevplatform/project/projectmodel.h b/kdevplatform/project/projectmodel.h index 559df60845..a44d3b2df8 100644 --- a/kdevplatform/project/projectmodel.h +++ b/kdevplatform/project/projectmodel.h @@ -216,6 +216,8 @@ class KDEVPLATFORMPROJECT_EXPORT ProjectBaseItem */ QString baseName() const; + QString directory() const; + /** * Renames the item to the new name. * @returns status information whether the renaming succeeded. diff --git a/kdevplatform/qtcompat_p.h b/kdevplatform/qtcompat_p.h index 12024b2249..c71bbcefdd 100644 --- a/kdevplatform/qtcompat_p.h +++ b/kdevplatform/qtcompat_p.h @@ -22,6 +22,8 @@ #include +#include + #if QT_VERSION < QT_VERSION_CHECK(5,7,0) namespace QtPrivate { @@ -38,8 +40,6 @@ template void qAsConst(const T &&) Q_DECL_EQ_DELETE; #endif -#endif - // compat for Q_FALLTHROUGH #if QT_VERSION < QT_VERSION_CHECK(5,8,0) @@ -62,3 +62,21 @@ void qAsConst(const T &&) Q_DECL_EQ_DELETE; #endif #endif + +namespace QtCompat { +// TODO: Just use QDir::listSeparator once we depend on Qt 5.6 +Q_DECL_CONSTEXPR inline QChar listSeparator() Q_DECL_NOTHROW +{ +#if QT_VERSION < QT_VERSION_CHECK(5,6,0) +#ifdef Q_OS_WIN + return QLatin1Char(';'); +#else + return QLatin1Char(':'); +#endif +#else + return QDir::listSeparator(); +#endif +} +} + +#endif diff --git a/kdevplatform/serialization/indexedstring.cpp b/kdevplatform/serialization/indexedstring.cpp index 91584dfd50..e55a0f2f0b 100644 --- a/kdevplatform/serialization/indexedstring.cpp +++ b/kdevplatform/serialization/indexedstring.cpp @@ -261,7 +261,7 @@ IndexedString::IndexedString(const QString& string) {} IndexedString::IndexedString(const char* str) - : IndexedString(str, str ? strlen(str) : 0) + : IndexedString(str, str ? qstrlen(str) : 0) {} IndexedString::IndexedString(const QByteArray& str) diff --git a/kdevplatform/serialization/itemrepositoryregistry.cpp b/kdevplatform/serialization/itemrepositoryregistry.cpp index f95e4a83d9..d623b9ef1c 100644 --- a/kdevplatform/serialization/itemrepositoryregistry.cpp +++ b/kdevplatform/serialization/itemrepositoryregistry.cpp @@ -74,7 +74,7 @@ bool shouldClear(const QString& path) } if (!dir.exists(QStringLiteral("version_%1").arg(staticItemRepositoryVersion()))) { - qCWarning(SERIALIZATION) << "version-hint not found, seems to be an old version"; + qCWarning(SERIALIZATION) << "version mismatch or no version hint; expected version:" << staticItemRepositoryVersion(); return true; } diff --git a/kdevplatform/shell/documentcontroller.cpp b/kdevplatform/shell/documentcontroller.cpp index f100103540..1e42280d4d 100644 --- a/kdevplatform/shell/documentcontroller.cpp +++ b/kdevplatform/shell/documentcontroller.cpp @@ -119,13 +119,7 @@ class DocumentControllerPrivate OpenFileResult showOpenFile() const { - QUrl dir; - if ( controller->activeDocument() ) { - dir = controller->activeDocument()->url().adjusted(QUrl::RemoveFilename); - } else { - const auto cfg = KSharedConfig::openConfig()->group("Open File"); - dir = cfg.readEntry( "Last Open File Directory", Core::self()->projectController()->projectsBaseDirectory() ); - } + QUrl dir = QUrl::fromLocalFile(controller->currentDirectory()); const auto caption = i18n("Open File"); const auto filter = i18n("*|Text File\n"); @@ -233,15 +227,19 @@ class DocumentControllerPrivate return nullptr; } - KSharedConfig::openConfig()->group("Open File").writeEntry( "Last Open File Directory", url.adjusted(QUrl::RemoveFilename) ); + bool emptyDocument = DocumentController::isEmptyDocumentUrl(url); + if (!emptyDocument) { + KSharedConfig::openConfig()->group("Open File"). + writeEntry( "Last Open File Directory", url.adjusted(QUrl::RemoveFilename) ); - // clean it and resolve possible symlink - url = url.adjusted( QUrl::NormalizePathSegments ); - if ( url.isLocalFile() ) - { - QString path = QFileInfo( url.toLocalFile() ).canonicalFilePath(); - if ( !path.isEmpty() ) - url = QUrl::fromLocalFile( path ); + // clean it and resolve possible symlink + url = url.adjusted( QUrl::NormalizePathSegments ); + if ( url.isLocalFile() ) + { + QString path = QFileInfo( url.toLocalFile() ).canonicalFilePath(); + if ( !path.isEmpty() ) + url = QUrl::fromLocalFile( path ); + } } //get a part document @@ -250,7 +248,7 @@ class DocumentControllerPrivate { QMimeType mimeType; - if (DocumentController::isEmptyDocumentUrl(url)) + if (emptyDocument) { mimeType = QMimeDatabase().mimeTypeForName(QStringLiteral("text/plain")); } @@ -555,6 +553,7 @@ class DocumentControllerPrivate QPointer closeAllOthers; KRecentFilesAction* fileOpenRecent; KTextEditor::Document* globalTextEditorInstance; + QString directoryHint; }; DocumentController::DocumentController( QObject *parent ) @@ -1004,6 +1003,9 @@ QStringList DocumentController::documentTypes() const static const QRegularExpression& emptyDocumentPattern() { + /* A hack that binds empty document to directory tree. + * It must be always bound to root dir, otherwise it may clash with existing + * files. */ static const QRegularExpression pattern(QStringLiteral("^/%1(?:\\s\\((\\d+)\\))?$").arg(EMPTY_DOCUMENT_URL)); return pattern; } @@ -1013,6 +1015,31 @@ bool DocumentController::isEmptyDocumentUrl(const QUrl &url) return emptyDocumentPattern().match(url.toDisplayString(QUrl::PreferLocalFile)).hasMatch(); } +void DocumentController::updateDirectoryHint(const QString& path) +{ + d->directoryHint = path; +} + +QString DocumentController::currentDirectory() const +{ + if ( activeDocument() ) { + QUrl url = activeDocument()->url(); + if (!isEmptyDocumentUrl(url)) { + return url.adjusted( + QUrl::RemoveScheme | + QUrl::RemoveFilename | + QUrl::StripTrailingSlash).toString(); + } + } + if (!d->directoryHint.isEmpty()) { + return d->directoryHint; + } else { + const auto cfg = KSharedConfig::openConfig()->group("Open File"); + return cfg.readEntry( "Last Open File Directory", Core::self()->projectController()->projectsBaseDirectory() ).toString(); + } + return QString(); +} + QUrl DocumentController::nextEmptyDocumentUrl() { int nextEmptyDocNumber = 0; diff --git a/kdevplatform/shell/documentcontroller.h b/kdevplatform/shell/documentcontroller.h index 8070ec8523..a4de94fd80 100644 --- a/kdevplatform/shell/documentcontroller.h +++ b/kdevplatform/shell/documentcontroller.h @@ -103,6 +103,8 @@ class KDEVPLATFORMSHELL_EXPORT DocumentController: public IDocumentController { /**checks that url is an url of empty document*/ static bool isEmptyDocumentUrl(const QUrl &url); static QUrl nextEmptyDocumentUrl(); + void updateDirectoryHint(const QString& path) override; + QString currentDirectory() const; IDocumentFactory* factory(const QString& mime) const override; diff --git a/kdevplatform/shell/plugincontroller.cpp b/kdevplatform/shell/plugincontroller.cpp index 43e73ed57d..1d920bec6e 100644 --- a/kdevplatform/shell/plugincontroller.cpp +++ b/kdevplatform/shell/plugincontroller.cpp @@ -86,7 +86,10 @@ bool hasMandatoryProperties( const KPluginMetaData& info ) if (mode.isEmpty()) { return false; } - + static const QString plugin_prefix = qgetenv("KDEV_PLUGIN_PREFIX"); + if (!plugin_prefix.isEmpty() && info.fileName().contains(plugin_prefix)) { + return true; + } // when the plugin is installed into the versioned plugin path, it's good to go if (info.fileName().contains(QLatin1String("/kdevplatform/" QT_STRINGIFY(KDEVELOP_PLUGIN_VERSION) "/"))) { return true; @@ -289,7 +292,11 @@ PluginController::PluginController(Core *core) } }); - qCDebug(SHELL) << "Found" << newPlugins.size() << " plugins:" << foundPlugins; + qCDebug(SHELL) << "Found" << newPlugins.size() << "plugins:" << foundPlugins; + if (newPlugins.isEmpty()) { + qCWarning(SHELL) << "Did not find any plugins, check your environment."; + qCWarning(SHELL) << " Note: QT_PLUGIN_PATH is set to:" << qgetenv("QT_PLUGIN_PATH"); + } d->plugins = newPlugins; diff --git a/kdevplatform/shell/project.cpp b/kdevplatform/shell/project.cpp index d8b11e3513..57bd7399cf 100644 --- a/kdevplatform/shell/project.cpp +++ b/kdevplatform/shell/project.cpp @@ -372,8 +372,16 @@ class ProjectPrivate foreach( IPlugin* p, plugins ) { IBasicVersionControl* iface = p->extension(); - if( iface && iface->isVersionControlled( topItem->path().toUrl() ) ) + if (!iface) { + continue; + } + + const auto url = topItem->path().toUrl(); + qCDebug(SHELL) << "Checking whether" << url << "is version controlled by" << iface->name(); + if(iface->isVersionControlled(url)) { + qDebug(SHELL) << "Detected that" << url << "is a" << iface->name() << "project"; + vcsPlugin = p; projectGroup.writeEntry("VersionControlSupport", pluginManager->pluginInfo(p).pluginId()); projectGroup.sync(); diff --git a/kdevplatform/shell/projectcontroller.cpp b/kdevplatform/shell/projectcontroller.cpp index 2d19b637d8..d687c269d2 100644 --- a/kdevplatform/shell/projectcontroller.cpp +++ b/kdevplatform/shell/projectcontroller.cpp @@ -105,7 +105,7 @@ class ProjectControllerPrivate ProjectBuildSetModel* buildset; bool m_foundProjectFile; //Temporary flag used while searching the hierarchy for a project file bool m_cleaningUp; //Temporary flag enabled while destroying the project-controller - QPointer m_changesModel; + ProjectChangesModel* m_changesModel = nullptr; QHash< IProject*, QPointer > m_parseJobs; // parse jobs that add files from the project to the background parser. explicit ProjectControllerPrivate( ProjectController* p ) @@ -640,6 +640,8 @@ void ProjectController::initialize() connect( this, &ProjectController::projectClosed, d->buildset, &ProjectBuildSetModel::projectClosed ); + d->m_changesModel = new ProjectChangesModel(this); + loadSettings(false); d->dialog = new ProjectDialogProvider(d.data()); @@ -1140,9 +1142,6 @@ ProjectBuildSetModel* ProjectController::buildSetModel() ProjectChangesModel* ProjectController::changesModel() { - if(!d->m_changesModel) - d->m_changesModel=new ProjectChangesModel(this); - return d->m_changesModel; } diff --git a/kdevplatform/shell/runtimecontroller.cpp b/kdevplatform/shell/runtimecontroller.cpp index e2ad831a05..6556e8942e 100644 --- a/kdevplatform/shell/runtimecontroller.cpp +++ b/kdevplatform/shell/runtimecontroller.cpp @@ -40,8 +40,8 @@ class IdentityRuntime : public IRuntime #else connect(process, &QProcess::errorOccurred, #endif - this, [process](QProcess::ProcessError error) { - qCWarning(SHELL) << "error:" << error << process->program() << process->errorString(); + this, [](QProcess::ProcessError error) { + qCWarning(SHELL) << "process finished with error:" << error; }); process->start(); } @@ -51,8 +51,8 @@ class IdentityRuntime : public IRuntime #else connect(process, &QProcess::errorOccurred, #endif - this, [process](QProcess::ProcessError error) { - qCWarning(SHELL) << "error:" << error << process->program() << process->errorString(); + this, [](QProcess::ProcessError error) { + qCWarning(SHELL) << "process finished with error:" << error; }); process->start(); } diff --git a/kdevplatform/shell/tests/test_documentcontroller.cpp b/kdevplatform/shell/tests/test_documentcontroller.cpp index d833e959cf..54603f7939 100644 --- a/kdevplatform/shell/tests/test_documentcontroller.cpp +++ b/kdevplatform/shell/tests/test_documentcontroller.cpp @@ -40,7 +40,7 @@ using namespace KDevelop; void TestDocumentController::initTestCase() { - AutoTestShell::init(); + AutoTestShell::init({{}}); // do not load plugins at all TestCore::initialize(); Core::self()->languageController()->backgroundParser()->disableProcessing(); m_subject = Core::self()->documentController(); diff --git a/kdevplatform/shell/tests/test_shellbuddy.cpp b/kdevplatform/shell/tests/test_shellbuddy.cpp index a0b466b8f3..fb7e51d694 100644 --- a/kdevplatform/shell/tests/test_shellbuddy.cpp +++ b/kdevplatform/shell/tests/test_shellbuddy.cpp @@ -82,7 +82,7 @@ class TestBuddyFinder : public KDevelop::IBuddyDocumentFinder void TestShellBuddy::initTestCase() { - AutoTestShell::init(); + AutoTestShell::init({{}}); // do not load plugins at all TestCore::initialize(); m_documentController = Core::self()->documentController(); m_uiController = Core::self()->uiControllerInternal(); diff --git a/kdevplatform/shell/tests/test_shelldocumentoperation.cpp b/kdevplatform/shell/tests/test_shelldocumentoperation.cpp index 5b4c638475..aa0e6fc604 100644 --- a/kdevplatform/shell/tests/test_shelldocumentoperation.cpp +++ b/kdevplatform/shell/tests/test_shelldocumentoperation.cpp @@ -41,7 +41,7 @@ using namespace KDevelop; void TestShellDocumentOperation::initTestCase() { - AutoTestShell::init(); + AutoTestShell::init({{}}); // do not load plugins at all TestCore::initialize(); } diff --git a/kdevplatform/shell/workingsets/workingset.cpp b/kdevplatform/shell/workingsets/workingset.cpp index 1d483762ff..fa0096c6bb 100644 --- a/kdevplatform/shell/workingsets/workingset.cpp +++ b/kdevplatform/shell/workingsets/workingset.cpp @@ -138,6 +138,10 @@ void WorkingSet::saveFromArea( Sublime::Area* a, Sublime::AreaIndex * area, KCon //The working set config gets an updated list of files QString docSpec = view->document()->documentSpecifier(); + if (DocumentController::isEmptyDocumentUrl(QUrl(docSpec))) { + continue; + } + //only save the documents from protocols KIO understands //otherwise we try to load kdev:// too early if (!KProtocolInfo::isKnownProtocol(QUrl(docSpec))) { diff --git a/kdevplatform/sublime/idealdockwidget.cpp b/kdevplatform/sublime/idealdockwidget.cpp index 4f63ec1507..91cda624f5 100644 --- a/kdevplatform/sublime/idealdockwidget.cpp +++ b/kdevplatform/sublime/idealdockwidget.cpp @@ -100,7 +100,14 @@ void IdealDockWidget::contextMenuRequested(const QPoint &point) QList< QAction* > viewActions = m_view->contextMenuActions(); if(!viewActions.isEmpty()) { - menu.addActions(viewActions); + // add the view's actions to the context menu, + // checking each if it can be represented + foreach (const auto action, viewActions) { + if (!action->text().isEmpty() && !action->iconText().isEmpty()) { + // avoid adding empty menu items + menu.addAction(action); + } + } menu.addSeparator(); } diff --git a/kdevplatform/sublime/mainwindow.cpp b/kdevplatform/sublime/mainwindow.cpp index ef2233715a..1faa91df11 100644 --- a/kdevplatform/sublime/mainwindow.cpp +++ b/kdevplatform/sublime/mainwindow.cpp @@ -222,8 +222,8 @@ void MainWindow::saveSettings() if (area()) group += '_' + area()->objectName(); KConfigGroup cg = KSharedConfig::openConfig()->group(group); - /* This will try to save window size, too. But it's OK, since we - won't use this information when loading. */ + // This will try to save also the window size and the enabled state of the statusbar. + // But it's OK, since we won't use this information when loading. saveMainWindowSettings(cg); //debugToolBar visibility is stored separately to allow a area dependent default value @@ -253,15 +253,10 @@ void MainWindow::loadSettings() // What follows is copy-paste from applyMainWindowSettings. Unfortunately, // we don't really want that one to try restoring window size, and we also // cannot stop it from doing that in any clean way. - QStatusBar* sb = findChild(); - if (sb) { - QString entry = cg.readEntry("StatusBar", "Enabled"); - if ( entry == QLatin1String("Disabled") ) - sb->hide(); - else - sb->show(); - } - + // We also do not want that one do it for the enabled state of the statusbar: + // KMainWindow scans the widget tree for a QStatusBar-inheriting instance and + // set enabled state by the config value stored by the key "StatusBar", + // while the QStatusBar subclass used in sublime should always be enabled. QMenuBar* mb = findChild(); if (mb) { QString entry = cg.readEntry ("MenuBar", "Enabled"); diff --git a/kdevplatform/util/kdevplatform_shell_environment.sh b/kdevplatform/util/kdevplatform_shell_environment.sh index 46d954d662..54f2261875 100755 --- a/kdevplatform/util/kdevplatform_shell_environment.sh +++ b/kdevplatform/util/kdevplatform_shell_environment.sh @@ -786,7 +786,7 @@ function setenv! { executeInAppSync "if ! [ -e $(getCurrentShellEnvPath) ]; then touch $(getCurrentShellEnvPath); fi" "" fi source $TEMP - rm $TEMP + rm -f $TEMP } function showenv! { diff --git a/kdevplatform/util/tests/test_kdevformatsource.cpp b/kdevplatform/util/tests/test_kdevformatsource.cpp index ee725663c2..7ad67bad1d 100644 --- a/kdevplatform/util/tests/test_kdevformatsource.cpp +++ b/kdevplatform/util/tests/test_kdevformatsource.cpp @@ -23,13 +23,22 @@ #include #include -#include #include +#include +#include QTEST_MAIN(KDevelop::TestKdevFormatSource) using namespace KDevelop; +TestKdevFormatSource::TestKdevFormatSource() +{ +} + +TestKdevFormatSource::~TestKdevFormatSource() +{ +} + void TestKdevFormatSource::testNotFound_data() { static const QStringList formatFileData = {}; @@ -128,21 +137,14 @@ bool TestKdevFormatSource::initTest(const QStringList& formatFileData) QTest::addColumn("isApplied"); QTest::addColumn("lines"); - QString workPath = QStandardPaths::standardLocations(QStandardPaths::TempLocation).first(); - workPath += QLatin1String("/test_kdevformatsource/"); - - if (QDir(workPath).exists() && !QDir(workPath).removeRecursively()) { - qDebug() << "unable to remove existing directory" << workPath; - return false; - } - - if (!mkPath(workPath)) - return false; + m_temporaryDir.reset(new QTemporaryDir); + const QString workPath = m_temporaryDir->path(); + qDebug() << "Using temporary dir:" << workPath; - if (!mkPath(workPath + "src1")) + if (!mkPath(workPath + "/src1")) return false; - if (!mkPath(workPath + "src2")) + if (!mkPath(workPath + "/src2")) return false; if (!QDir::setCurrent(workPath)) { @@ -152,14 +154,14 @@ bool TestKdevFormatSource::initTest(const QStringList& formatFileData) m_sources.resize(3); - m_sources[0].path = workPath + "src1/source_1.cpp"; + m_sources[0].path = workPath + "/src1/source_1.cpp"; m_sources[0].lines = QStringList({ QStringLiteral("void foo(int x) {"), QStringLiteral(" printf(\"squared x = %d\\n\", x * x);"), QStringLiteral("}") }); - m_sources[1].path = workPath + "src2/source_2.cpp"; + m_sources[1].path = workPath + "/src2/source_2.cpp"; m_sources[1].lines = QStringList({ QStringLiteral("void bar(double x) {"), QStringLiteral(" x = sqrt(x);"), @@ -167,7 +169,7 @@ bool TestKdevFormatSource::initTest(const QStringList& formatFileData) QStringLiteral("}") }); - m_sources[2].path = workPath + "source_3.cpp"; + m_sources[2].path = workPath + "/source_3.cpp"; m_sources[2].lines = QStringList({ QStringLiteral("void baz(double x, double y) {"), QStringLiteral(" double z = pow(x, y);"), @@ -232,6 +234,7 @@ bool TestKdevFormatSource::writeLines(const QString& path, const QStringList& li for (const QString& line : lines) { outStream << line << "\n"; } + outStream.flush(); outFile.close(); return true; diff --git a/kdevplatform/util/tests/test_kdevformatsource.h b/kdevplatform/util/tests/test_kdevformatsource.h index 8cfd020967..8abb3b6328 100644 --- a/kdevplatform/util/tests/test_kdevformatsource.h +++ b/kdevplatform/util/tests/test_kdevformatsource.h @@ -19,8 +19,11 @@ #pragma once #include +#include #include +class QTemporaryDir; + namespace KDevelop { @@ -30,9 +33,14 @@ struct Source QStringList lines; }; -class TestKdevFormatSource: public QObject { +class TestKdevFormatSource : public QObject +{ Q_OBJECT +public: + TestKdevFormatSource(); + ~TestKdevFormatSource() override; + private Q_SLOTS: void testNotFound(); void testNotFound_data(); @@ -57,6 +65,7 @@ private Q_SLOTS: bool writeLines(const QString& path, const QStringList& lines) const; bool readLines(const QString& path, QStringList& lines) const; + QScopedPointer m_temporaryDir; QVector m_sources; }; diff --git a/kdevplatform/util/tests/test_path.cpp b/kdevplatform/util/tests/test_path.cpp index 648c7b39a1..6fea9ba94f 100644 --- a/kdevplatform/util/tests/test_path.cpp +++ b/kdevplatform/util/tests/test_path.cpp @@ -24,9 +24,6 @@ #include -#include -#include - #include #include @@ -109,14 +106,10 @@ void runBenchmark() void TestPath::initTestCase() { - // TODO: is this really needed? It doesn't seem like any kdevelop shell is needed - AutoTestShell::init(); - TestCore::initialize(Core::NoUi); } void TestPath::cleanupTestCase() { - TestCore::shutdown(); } void TestPath::bench_qurl() @@ -281,7 +274,11 @@ void TestPath::testPath() QCOMPARE(optUrl.isRemote(), optUrl.isValid() && !optUrl.isLocalFile()); QCOMPARE(optUrl.isRemote(), optUrl.isValid() && !optUrl.remotePrefix().isEmpty()); - url.setPath(url.path() + "/test/foo/bar"); + if (url.path() == QLatin1String("/")) { + url.setPath("/test/foo/bar"); + } else { + url.setPath(url.path() + "/test/foo/bar"); + } if (url.scheme().isEmpty()) { url.setScheme(QStringLiteral("file")); } @@ -430,8 +427,12 @@ void TestPath::testPathAddData() QUrl baseUrl = QUrl::fromUserInput(base); if (QDir::isRelativePath(pathToAdd)) { baseUrl = resolvedUrl(baseUrl, QUrl(pathToAdd)); - } else { + } else if (QDir::isRelativePath(pathToAdd) || baseUrl.path() != QLatin1String("/")) { + // if pathToAdd == /absolute && baseUrl == "/", below call would lead to an invalid QUrl + // with qtbase.git/f62768d046528636789f901ac79e2cfa1843a7b7 baseUrl.setPath(baseUrl.path() + pathToAdd); + } else { + baseUrl.setPath(pathToAdd); } baseUrl = baseUrl.adjusted(QUrl::NormalizePathSegments); @@ -588,10 +589,14 @@ void TestPath::testHasParent_data() QTest::addColumn("hasParent"); QTest::newRow("empty") << QString() << false; +#ifdef Q_OS_WIN + QTest::newRow("\\") << QStringLiteral("\\") << true; // true b/c parent could be e.g. 'C:' +#else QTest::newRow("/") << QStringLiteral("/") << false; QTest::newRow("/foo") << QStringLiteral("/foo") << true; QTest::newRow("/foo/bar") << QStringLiteral("/foo/bar") << true; QTest::newRow("//foo/bar") << QStringLiteral("//foo/bar") << true; +#endif QTest::newRow("http://foo.bar") << QStringLiteral("http://foo.bar") << false; QTest::newRow("http://foo.bar/") << QStringLiteral("http://foo.bar/") << false; QTest::newRow("http://foo.bar/asdf") << QStringLiteral("http://foo.bar/asdf") << true; diff --git a/kdevplatform/vcs/models/vcsannotationmodel.cpp b/kdevplatform/vcs/models/vcsannotationmodel.cpp index 49eec20fa6..ac8cc5ca14 100644 --- a/kdevplatform/vcs/models/vcsannotationmodel.cpp +++ b/kdevplatform/vcs/models/vcsannotationmodel.cpp @@ -153,7 +153,7 @@ QVariant VcsAnnotationModel::data( int line, Qt::ItemDataRole role ) const } else if( role == Qt::DisplayRole ) { return QVariant( QStringLiteral("%1 ").arg(aline.date().date().year()) + abbreviateLastName(aline.author()) ); - } else if( role == KTextEditor::AnnotationModel::GroupIdentifierRole ) + } else if( role == (int) KTextEditor::AnnotationModel::GroupIdentifierRole ) { return aline.revision().revisionValue(); } else if( role == Qt::ToolTipRole ) @@ -171,7 +171,7 @@ VcsRevision VcsAnnotationModel::revisionForLine( int line ) const return VcsRevision(); } - Q_ASSERT(line > 0 && d->m_annotation.containsLine( line )); + Q_ASSERT(line >= 0 && d->m_annotation.containsLine(line)); return d->m_annotation.line( line ).revision(); } diff --git a/org.kde.kdevelop.appdata.xml b/org.kde.kdevelop.appdata.xml index 319c3ef7e8..63844f8813 100644 --- a/org.kde.kdevelop.appdata.xml +++ b/org.kde.kdevelop.appdata.xml @@ -33,6 +33,8 @@ Featureful, plugin-extensible IDE for C/C++ and other programming languages És un IDE, extensible amb connectors, amb totes les característiques per a C/C++ i altres llenguatges de programació. És un IDE, extensible amb connectors, amb totes les característiques per a C/C++ i altres llenguatges de programació. + Eine leistungsfähige integrierte Entwicklungsumgebung (IDE) für C/C++ und andere Programmiersprachen, die durch Module erweitert werden kann. + Featureful, plugin-extensible IDE for C/C++ and other programming languages Entorno de desarrollo integrado para C/C++ y otros lenguajes de programación con múltiples funcionalidades y que se puede extender con complementos. Environnement de développement complet et extensible pour le C/C++ et d'autres langages de programmation. IDE per C/C++ e altri linguaggi di programmazione completo ed estensibile @@ -49,6 +51,8 @@

KDevelop is a Free and Open Source integrated development environment (IDE).

El KDevelop és un entorn de desenvolupament integrat (IDE) lliure i de codi obert.

El KDevelop és un entorn de desenvolupament integrat (IDE) lliure i de codi obert.

+

KDevelop ist eine integrierte Entwicklungsumgebung (Frei und Open Source).

+

KDevelop is a Free and Open Source integrated development environment (IDE).

KDevelop es un entorno de desarrollo integrado (IDE) libre y de código abierto.

KDevelop est un environnement de développement intégré (IDE) libre et en open source.

KDevelop è un ambiente di sviluppo integrato (IDE) libero e open source.

@@ -64,6 +68,7 @@

It provides editing, navigation and debugging features for several programming languages, as well as integration with multiple build systems and version-control systems, using a plugin-based architecture.

Proporciona característiques per a l'edició, navegació i depuració per a diversos llenguatges de programació, així com la integració amb múltiples sistemes de construcció i sistemes de control de versions, emprant una arquitectura basada en connectors.

Proporciona característiques per a l'edició, navegació i depuració per a diversos llenguatges de programació, així com la integració amb múltiples sistemes de construcció i sistemes de control de versions, emprant una arquitectura basada en connectors.

+

It provides editing, navigation and debugging features for several programming languages, as well as integration with multiple build systems and version-control systems, using a plugin-based architecture.

Proporciona funciones de edición, navegación y depuración para varios lenguajes de programación, además de integración con diversos sistemas de compilación y de control de versiones, usando una arquitectura basada en complementos.

Il fournit des fonctionnalités d'édition, navigation et débogage pour plusieurs langages de programmation, ainsi que l'intégration de multiples systèmes de compilation et de gestion de révision, en utilisant une architecture extensible.

Fornisce funzionalità di modifica, navigazione debug per vari linguaggi di programmazione, così come l'integrazione con vari sistemi di compilazione e di controllo versione, tramite l'uso di architettura basata sulle estensioni.

@@ -79,6 +84,7 @@

KDevelop has parser backends for C, C++ and Javascript/QML, with further external plugins supporting e.g. PHP or Python.

El KDevelop disposa de dorsals d'analitzador per a C, C ++ i Javascript/QML, amb altres connectors externs que implementen, p. ex., PHP o Python.

El KDevelop disposa de dorsals d'analitzador per a C, C ++ i Javascript/QML, amb altres connectors externs que implementen, p. ex., PHP o Python.

+

KDevelop has parser backends for C, C++ and Javascript/QML, with further external plugins supporting e.g. PHP or Python.

KDevelop dispone de motores de análisis sintáctico para C, C++ y JavaScript/QML, además de complementos externos (por ejemplo, para PHP o para Python).

KDevelop intègre des parseurs pour le C, le C++ et Javascript/QML, avec des modules externes pour prendre en charge PHP, Python, etc.

KDevelop ha dei motori di analisi per C, C++ e JavaScript/QML, come ulteriori estensioni esterne che supportano, ad esempio, PHP o Python.

diff --git a/plugins/android/kdevandroid.json b/plugins/android/kdevandroid.json index 693d6b194c..d6e184d667 100644 --- a/plugins/android/kdevandroid.json +++ b/plugins/android/kdevandroid.json @@ -24,17 +24,19 @@ "Description[uk]": "Надає доступ до середовищ виконання Android", "Description[x-test]": "xxExposes Android runtimesxx", "Description[zh_CN]": "暴露 Android 运行时", - "Icon": "android", + "Icon": "kdevelop", "Id": "kdevandroid", "License": "GPL", "Name": "Android Support", "Name[ca@valencia]": "Implementació de l'Android", "Name[ca]": "Implementació de l'Android", "Name[cs]": "Podpora Androidu", + "Name[de]": "Unterstützung für Android", "Name[es]": "Implementación de Android", "Name[fr]": "Prise en charge d'Android", "Name[it]": "Supporto per Android", "Name[nl]": "Ondersteuning voor Android", + "Name[nn]": "Android-støtte", "Name[pl]": "Obsługa Androida", "Name[pt]": "Suporte para o Android", "Name[sk]": "Podpora Androidu", diff --git a/plugins/appwizard/appwizardplugin.cpp b/plugins/appwizard/appwizardplugin.cpp index 70e6207a12..bc1538d5cf 100644 --- a/plugins/appwizard/appwizardplugin.cpp +++ b/plugins/appwizard/appwizardplugin.cpp @@ -214,6 +214,8 @@ QString AppWizardPlugin::createProject(const ApplicationInfo& info) } QString templateName = templateInfo.baseName(); + qCDebug(PLUGIN_APPWIZARD) << "Searching archive for template name:" << templateName; + QString templateArchive; const QStringList filters = {templateName + QStringLiteral(".*")}; const QStringList matchesPaths = QStandardPaths::locateAll(QStandardPaths::GenericDataLocation, QStringLiteral("kdevappwizard/templates/"), QStandardPaths::LocateDirectory); @@ -229,6 +231,8 @@ QString AppWizardPlugin::createProject(const ApplicationInfo& info) return QString(); } + qCDebug(PLUGIN_APPWIZARD) << "Using template archive:" << templateArchive; + QUrl dest = info.location; //prepare variable substitution hash diff --git a/plugins/appwizard/kdevappwizard.json b/plugins/appwizard/kdevappwizard.json index 84cae02f0e..fa796c0cdf 100644 --- a/plugins/appwizard/kdevappwizard.json +++ b/plugins/appwizard/kdevappwizard.json @@ -11,13 +11,19 @@ "Description": "Application Wizard", "Description[ca@valencia]": "Assistent d'aplicació", "Description[ca]": "Assistent d'aplicació", + "Description[cs]": "Průvodce aplikací", + "Description[de]": "Anwendungsassistent", "Description[es]": "Asistente de aplicaciones", + "Description[et]": "Rakenduse nõustaja", "Description[fr]": "Assistant application", + "Description[gl]": "Asistente para aplicativos", "Description[it]": "Procedura guidata per applicazioni", "Description[nl]": "Programma-assistent", "Description[pl]": "Pomocnik programu", "Description[pt]": "Assistente de Aplicações", + "Description[pt_BR]": "Assistente de aplicativo", "Description[sk]": "Sprievodca aplikáciou", + "Description[sl]": "Čarovnik za programe", "Description[sv]": "Programguide", "Description[tr]": "Uygulama Sihirbazı", "Description[uk]": "Майстер створення програм", @@ -33,11 +39,13 @@ "Name[de]": "Projekt-Assistent", "Name[es]": "Asistente de nuevo proyecto", "Name[fr]": "Assistant de création de nouveau projet", + "Name[gl]": "Asistente para proxectos novos", "Name[it]": "Procedura guidata nuovo progetto", "Name[nb]": "Veiviser for nytt prosjekt", "Name[nl]": "Nieuwe projectenassistent", "Name[pl]": "Pomocnik nowego projektu", "Name[pt]": "Assistente de Novos Projectos", + "Name[ru]": "Мастер создания проекта", "Name[sk]": "Sprievodca novým projektom", "Name[sv]": "Ny projektguide", "Name[tr]": "Yeni Proje Sihirbazı", diff --git a/plugins/appwizard/kdevappwizard.knsrc b/plugins/appwizard/kdevappwizard.knsrc index 65cae8f69b..627ead4296 100644 --- a/plugins/appwizard/kdevappwizard.knsrc +++ b/plugins/appwizard/kdevappwizard.knsrc @@ -4,12 +4,15 @@ Name[ca]=Plantilles d'aplicació (SDK) Name[ca@valencia]=Plantilles d'aplicació (SDK) Name[cs]=Šablony aplikací (SDK) Name[de]=Anwendungsvorlagen (SDK) +Name[en_GB]=Application Templates (SDK) Name[es]=Plantillas de aplicaciones (SDK) +Name[fr]=Modèle d'application (SDK) Name[it]=Modelli di applicazione (SDK) Name[nl]=Toepassingsjablonen (SDK) Name[pl]=Szablony aplikacji (SDK) Name[pt]=Modelos de Aplicações (SDK) Name[sk]=Aplikačné šablóny (SDK) +Name[sl]=Predloge programov (SDK) Name[sv]=Programmallar (SDK) Name[tr]=Uygulama Şablonları (SDK) Name[uk]=Шаблони програм (SDK) diff --git a/plugins/bazaar/kdevbazaar.json b/plugins/bazaar/kdevbazaar.json index b119672db2..1ee3d1a00f 100644 --- a/plugins/bazaar/kdevbazaar.json +++ b/plugins/bazaar/kdevbazaar.json @@ -13,12 +13,16 @@ "Description[ca@valencia]": "Este connector integra el Bazaar al KDevelop", "Description[ca]": "Aquest connector integra el Bazaar al KDevelop", "Description[cs]": "Tento modul integruje podporu pro Bazaar v KDevelop", + "Description[de]": "Dieses Modul integriert Bazaar in KDevelop", "Description[es]": "Este complemento integra Bazaar en KDevelop", + "Description[et]": "See plugin lõimib Bazaari KDevelopiga", "Description[fr]": "Ce module intègre Bazaar dans KDevelop", + "Description[gl]": "Este complemento integra Bazaar con KDevelop", "Description[it]": "Questa estensione integra Bazaar in KDevelop", "Description[nl]": "Deze plugin integreert Bazaar in KDevelop", "Description[pl]": "Ta wtyczka udostępnia Bazaar w KDevelopie", "Description[pt]": "Este 'plugin' integra o Bazaar no KDevelop", + "Description[pt_BR]": "Esta extensão integra o Bazaar ao KDevelop", "Description[sk]": "Tento plugin integruje Bazaar do KDevelop.", "Description[sv]": "Insticksprogrammet integrerar Bazaar i KDevelop", "Description[tr]": "Bu eklenti Bazaar uygulamasını KDevelop ile bütünleştirir", @@ -35,9 +39,11 @@ "Name[de]": "Bazaar-Unterstützung", "Name[es]": "Implementación de Bazaar", "Name[fr]": "Prise en charge de Bazaar", + "Name[gl]": "Compatibilidade con Bazaar", "Name[it]": "Supporto per Bazaar", "Name[nb]": "Bazaar-støtte", "Name[nl]": "Ondersteuning van Bazaar", + "Name[nn]": "DPMS-støtte", "Name[pl]": "Obsługa Bazaar", "Name[pt]": "Suporte para o Bazaar", "Name[sk]": "Podpora Bazaar", diff --git a/plugins/clang/.reviewboardrc b/plugins/clang/.reviewboardrc deleted file mode 100644 index cd1ef2aa08..0000000000 --- a/plugins/clang/.reviewboardrc +++ /dev/null @@ -1,3 +0,0 @@ -REPOSITORY = "kdev-clang" -REVIEWBOARD_URL = "https://git.reviewboard.kde.org" -TARGET_GROUPS = "kdevelop" diff --git a/plugins/clang/codecompletion/includepathcompletioncontext.cpp b/plugins/clang/codecompletion/includepathcompletioncontext.cpp index 46c26d60e8..c1f54a981c 100644 --- a/plugins/clang/codecompletion/includepathcompletioncontext.cpp +++ b/plugins/clang/codecompletion/includepathcompletioncontext.cpp @@ -143,26 +143,35 @@ IncludePathProperties IncludePathProperties::parseText(const QString& text, int namespace { -QVector includeItemsForUrl(const QUrl& url, const IncludePathProperties& properties, const Path::List& includePaths ) +QVector includeItemsForUrl(const QUrl& url, const IncludePathProperties& properties, + const ClangParsingEnvironment::IncludePaths& includePaths) { QVector includeItems; - Path::List paths = includePaths; + Path::List paths; if (properties.local) { - paths.push_front(Path(url).parent()); + paths.push_back(Path(url).parent()); + paths += includePaths.project; + paths += includePaths.system; + } else { + paths = includePaths.system + includePaths.project; } - std::sort(paths.begin(), paths.end()); - auto last = std::unique(paths.begin(), paths.end()); + // ensure we don't add duplicate paths + QSet handledPaths; // search paths + QSet foundIncludePaths; // found items int pathNumber = 0; - for (auto it = paths.begin(); it != last; it++ ) { - auto searchPath = *it; + for (auto searchPath : paths) { + if (handledPaths.contains(searchPath)) { + continue; + } + handledPaths.insert(searchPath); + if (!properties.prefixPath.isEmpty()) { searchPath.addPath(properties.prefixPath); } - QSet foundIncludePaths; QDirIterator dirIterator(searchPath.toLocalFile()); while (dirIterator.hasNext()) { dirIterator.next(); @@ -266,7 +275,7 @@ IncludePathCompletionContext::IncludePathCompletionContext(const DUContextPointe return; } - m_includeItems = includeItemsForUrl(url, properties, properties.local ? sessionData->environment().includes().project : sessionData->environment().includes().system); + m_includeItems = includeItemsForUrl(url, properties, sessionData->environment().includes()); } QList< CompletionTreeItemPointer > IncludePathCompletionContext::completionItems(bool& abort, bool) diff --git a/plugins/clang/duchain/builder.cpp b/plugins/clang/duchain/builder.cpp index dd69e32d92..e4115be3af 100644 --- a/plugins/clang/duchain/builder.cpp +++ b/plugins/clang/duchain/builder.cpp @@ -127,6 +127,7 @@ Identifier makeId(CXCursor cursor) return Identifier(ClangString(clang_getCursorSpelling(cursor)).toIndexed()); } +#if CINDEX_VERSION_MINOR >= 100 // FIXME https://bugs.llvm.org/show_bug.cgi?id=35333 QByteArray makeComment(CXComment comment) { if (Q_UNLIKELY(jsonTestRun())) { @@ -143,6 +144,7 @@ QByteArray makeComment(CXComment comment) return ClangString(clang_FullComment_getAsHTML(comment)).toByteArray(); } +#endif AbstractType* createDelayedType(CXType type) { @@ -595,7 +597,7 @@ struct Visitor return t; } - template = dummy> + template = dummy> AbstractType *createType(CXType type, CXCursor /*parent*/) { return createDelayedType(type); @@ -946,7 +948,11 @@ template void Visitor::setDeclData(CXCursor cursor, Declaration *decl, bool setComment) const { if (setComment) +#if CINDEX_VERSION_MINOR < 100 // FIXME https://bugs.llvm.org/show_bug.cgi?id=35333 + decl->setComment(KDevelop::formatComment(QByteArray(clang_getCString(clang_Cursor_getRawCommentText(cursor))))); +#else decl->setComment(makeComment(clang_Cursor_getParsedComment(cursor))); +#endif if (CursorKindTraits::isAliasType(CK)) { decl->setIsTypeAlias(true); } @@ -1347,6 +1353,7 @@ AbstractType *Visitor::makeType(CXType type, CXCursor parent) #if CINDEX_VERSION_MINOR >= 38 UseKind(CXType_Float128); #endif + UseKind(CXType_Complex); case CXType_Invalid: return nullptr; default: diff --git a/plugins/clang/duchain/parsesession.cpp b/plugins/clang/duchain/parsesession.cpp index 07d1067bc8..b19f41b230 100644 --- a/plugins/clang/duchain/parsesession.cpp +++ b/plugins/clang/duchain/parsesession.cpp @@ -70,6 +70,7 @@ void sanitizeArguments(QVector& arguments) // We remove the -Werror flag, and replace -Werror=foo by -Wfoo. // Warning as error may cause problem to the clang parser. const auto asError = QByteArrayLiteral("-Werror="); + const auto documentation = QByteArrayLiteral("-Wdocumentation"); for (auto& argument : arguments) { if (argument == "-Werror") { argument.clear(); @@ -77,7 +78,13 @@ void sanitizeArguments(QVector& arguments) // replace -Werror=foo by -Wfoo argument.remove(2, asError.length() - 2); } +#if CINDEX_VERSION_MINOR < 100 // FIXME https://bugs.llvm.org/show_bug.cgi?id=35333 + if (argument == documentation) { + argument.clear(); + } +#endif } + } QVector argsForSession(const QString& path, ParseSessionData::Options options, const ParserSettings& parserSettings) @@ -373,6 +380,7 @@ QByteArray ParseSessionData::writeDefinesFile(const QMap& defi void ParseSessionData::setUnit(CXTranslationUnit unit) { m_unit = unit; + m_diagnosticsCache.clear(); if (m_unit) { const ClangString unitFile(clang_getTranslationUnitSpelling(unit)); m_file = clang_getFile(m_unit, unitFile.c_str()); @@ -442,6 +450,8 @@ QList ParseSession::problemsForFile(CXFile file) const // extra clang diagnostics const uint numDiagnostics = clang_getNumDiagnostics(d->m_unit); problems.reserve(numDiagnostics); + d->m_diagnosticsCache.resize(numDiagnostics); + for (uint i = 0; i < numDiagnostics; ++i) { auto diagnostic = clang_getDiagnostic(d->m_unit, i); @@ -454,7 +464,11 @@ QList ParseSession::problemsForFile(CXFile file) const continue; } - ProblemPointer problem(ClangDiagnosticEvaluator::createProblem(diagnostic, d->m_unit)); + auto& problem = d->m_diagnosticsCache[i]; + if (!problem) { + problem = ClangDiagnosticEvaluator::createProblem(diagnostic, d->m_unit); + } + problems << problem; clang_disposeDiagnostic(diagnostic); diff --git a/plugins/clang/duchain/parsesession.h b/plugins/clang/duchain/parsesession.h index 163eae1390..a2374744e8 100644 --- a/plugins/clang/duchain/parsesession.h +++ b/plugins/clang/duchain/parsesession.h @@ -79,6 +79,8 @@ class KDEVCLANGPRIVATE_EXPORT ParseSessionData : public KDevelop::IAstContainer /// TODO: share this file for all TUs that use the same defines (probably most in a project) /// best would be a PCH, if possible QTemporaryFile m_definesFile; + // cached ProblemPointer representation for diagnostics + QVector m_diagnosticsCache; }; /** diff --git a/plugins/clang/kdevclang.xml b/plugins/clang/kdevclang.xml index ccf4bed910..2eaa068b42 100644 --- a/plugins/clang/kdevclang.xml +++ b/plugins/clang/kdevclang.xml @@ -36,6 +36,8 @@ Codi font en C per a CUDA de NVIDIA Codi font en C per a CUDA de NVIDIA Zdrojový kód NVIDIA CUDA C + NVIDIA CUDA C Quelltext + NVIDIA CUDA C source code Código fuente NVIDIA CUDA C Codice sorgente CUDA C di NVIDIA NVIDIA CUDA C broncode diff --git a/plugins/clang/tests/files/purec.c b/plugins/clang/tests/files/purec.c index 2314d9cce1..33f50c5a05 100644 --- a/plugins/clang/tests/files/purec.c +++ b/plugins/clang/tests/files/purec.c @@ -1,3 +1,16 @@ typedef enum { Zero, One } Foobar; /// "identifier" : "foo" static const Foobar foo = 0 == 1; + +#include + +/// "type" : { "toString" : "_Complex float" } +float complex f_z = I * I; +/// "type" : { "toString" : "_Complex double" } +double complex d_z = I * I; +/// "type" : { "toString" : "_Complex long double" } +long double complex ld_z = I * I; +/// "type" : { "toString" : "const _Complex long double" } +const long double complex c_z = I * I; +/// "type" : { "toString" : "volatile _Complex float" } +volatile float complex v_z = I * I; diff --git a/plugins/clang/tests/test_codecompletion.cpp b/plugins/clang/tests/test_codecompletion.cpp index 55eeef9a8d..3549b21e28 100644 --- a/plugins/clang/tests/test_codecompletion.cpp +++ b/plugins/clang/tests/test_codecompletion.cpp @@ -978,7 +978,7 @@ void TestCodeCompletion::testIncludePathCompletionLocal() IncludeTester tester(executeIncludePathCompletion(&impl, {0, 10})); QVERIFY(tester.names.contains(header.url().toUrl().fileName())); - QVERIFY(!tester.names.contains("iostream")); + QVERIFY(tester.names.contains("iostream")); } void TestCodeCompletion::testOverloadedFunctions() diff --git a/plugins/classbrowser/kdevclassbrowser.json b/plugins/classbrowser/kdevclassbrowser.json index 7c18912049..8b489e0261 100644 --- a/plugins/classbrowser/kdevclassbrowser.json +++ b/plugins/classbrowser/kdevclassbrowser.json @@ -10,13 +10,18 @@ "Description": "This plugin provides a browsable model of the currently parsed classes and other items.", "Description[ca@valencia]": "Este connector proporciona un model navegable de les classes analitzades actualment i altres elements.", "Description[ca]": "Aquest connector proporciona un model navegable de les classes analitzades actualment i altres elements.", + "Description[de]": "Dieses Modul bietet eine Liste der aktuell eingelesenen Klassen und anderer Elemente.", "Description[es]": "Este complemento proporciona un modelo navegable de las clases actualmente analizadas y de otros elementos.", + "Description[et]": "See plugin pakub parajasti parsitavate klasside ja teiste elementide sirvitavat mudelit.", "Description[fr]": "Ce module fournit un modèle navigable des classes actuellement analysées et d'autres éléments.", + "Description[gl]": "Este complemento fornece un modelo navegábel das clases e outros elementos que estean procesados.", "Description[it]": "Questa estensione fornisce un modello navigabile delle classi attualmente analizzate e di altri elementi.", "Description[nl]": "Deze plugin levert een model om door te bladeren van de nu ontlede klasse's en andere items.", "Description[pl]": "Ta wtyczka udostępnia możliwy do przeglądania model przeanalizowanych klas i innych elementów.", "Description[pt]": "Este 'plugin' oferece uma visão navegável sobre as classes e outros itens que estejam a ser processados de momento.", + "Description[pt_BR]": "Este plugin fornece um modelo navegável das classes atualmente analisadas e outros itens.", "Description[sk]": "Tento plugin poskytuje prehliadateľný model aktuálne analyzovanej triedy a iných položiek.", + "Description[sl]": "Vstavek vgradi model trenutno razčlenjenih razredov in drugih predmetov, po katerih je mogoče brskati.", "Description[sv]": "Insticksprogrammet tillhandahåller en bläddringsbar modell av klasser och andra objekt som för närvarande har tolkats.", "Description[tr]": "Bu eklenti mevcut ayrıştırılmış sınıfların ve diğer öğelerin taranabilir bir modelini sağlar.", "Description[uk]": "За допомогою цього додатка можна створити придатну для перегляду модель класів та інших елементів, над якими ви працюєте.", @@ -29,14 +34,20 @@ "Name[ca@valencia]": "Navegador de classes", "Name[ca]": "Navegador de classes", "Name[cs]": "Prohlížeč tříd", + "Name[de]": "Klassen-Browser", "Name[es]": "Navegador de clases", + "Name[et]": "Klassibrauser", "Name[fr]": "Navigateur de classes", + "Name[gl]": "Navegador de clases", "Name[it]": "Navigatore delle classi", "Name[nb]": "Klasseleser", "Name[nl]": "Klassen-browser", "Name[pl]": "Przeglądarka klas", "Name[pt]": "Navegador de Classes", + "Name[pt_BR]": "Navegador de classes", + "Name[ru]": "Дерево классов", "Name[sk]": "Prehliadač tried", + "Name[sl]": "Brskalnik po razredih", "Name[sv]": "Klassbläddrare", "Name[tr]": "Sınıf Tarayıcı", "Name[uk]": "Переглядач класів", diff --git a/plugins/cmake/cmakeprojectdata.h b/plugins/cmake/cmakeprojectdata.h index 1bb62528eb..dfe0a49b2d 100644 --- a/plugins/cmake/cmakeprojectdata.h +++ b/plugins/cmake/cmakeprojectdata.h @@ -70,6 +70,12 @@ inline QDebug &operator<<(QDebug debug, const CMakeTarget& target) { debug << target.type << ':' << target.name; return debug.maybeSpace(); } +inline bool operator==(const CMakeTarget& lhs, const CMakeTarget& rhs) +{ + return lhs.type == rhs.type + && lhs.name == rhs.name + && lhs.artifacts == rhs.artifacts; +} struct Test { diff --git a/plugins/cmake/cmakeserverimportjob.cpp b/plugins/cmake/cmakeserverimportjob.cpp index c40ba10d79..403ffe19c7 100644 --- a/plugins/cmake/cmakeserverimportjob.cpp +++ b/plugins/cmake/cmakeserverimportjob.cpp @@ -108,12 +108,19 @@ void CMakeServerImportJob::processCodeModel(const QJsonObject &response, CMakePr const auto target = targetObject.toObject(); const KDevelop::Path targetDir = rt->pathInHost(KDevelop::Path(target.value(QStringLiteral("sourceDirectory")).toString())); - data.targets[targetDir] += CMakeTarget { + CMakeTarget cmakeTarget{ typeToEnum(target), target.value(QStringLiteral("name")).toString(), kTransform(target[QLatin1String("artifacts")].toArray(), [](const QJsonValue& val) { return KDevelop::Path(val.toString()); }) }; + // ensure we don't add the same target multiple times, for different projects + // cf.: https://bugs.kde.org/show_bug.cgi?id=387095 + auto& dirTargets = data.targets[targetDir]; + if (dirTargets.contains(cmakeTarget)) + continue; + dirTargets += cmakeTarget; + const auto fileGroups = target.value(QStringLiteral("fileGroups")).toArray(); for (const auto &fileGroupValue: fileGroups) { const auto fileGroup = fileGroupValue.toObject(); diff --git a/plugins/cmake/kdevcmakemanager.json b/plugins/cmake/kdevcmakemanager.json index 6b6f88ee48..cc8df70193 100644 --- a/plugins/cmake/kdevcmakemanager.json +++ b/plugins/cmake/kdevcmakemanager.json @@ -16,7 +16,7 @@ "Description[es]": "Permite que KDevelop gestione proyectos basados en CMake", "Description[et]": "Võimaldab KDevelopil hallata CMake'i põhiseid projekte", "Description[fi]": "Sallii KDevelop-ohjelman hallinnoida CMake-perustaisia projekteja", - "Description[fr]": "Permet à KDevelop de gérer des projets basés sur CMake", + "Description[fr]": "Permet à KDevelop de gérer des projets fondés sur CMake", "Description[gl]": "Permítelle a KDevelop xestionar proxectos baseados en CMake.", "Description[it]": "Permette a KDevelop di gestire i progetti basati su CMake", "Description[nl]": "Staat KDevelop toe om op CMake gebaseerde projecten te beheren", diff --git a/plugins/cmake/tests/manual/unit_tests_kde/CMakeLists.txt b/plugins/cmake/tests/manual/unit_tests_kde/CMakeLists.txt index 3bb9e85459..71706dd44b 100644 --- a/plugins/cmake/tests/manual/unit_tests_kde/CMakeLists.txt +++ b/plugins/cmake/tests/manual/unit_tests_kde/CMakeLists.txt @@ -8,7 +8,7 @@ set(CMAKE_MODULE_PATH ${ECM_MODULE_PATH}) include(ECMAddTests) -set(ENABLE_TESTING ON) +enable_testing() set(CMAKE_AUTOMOC ON) ecm_add_test(test.cpp TEST_NAME cmake-test-unittestskde) diff --git a/plugins/cmake/tests/test_ctestfindsuites.cpp b/plugins/cmake/tests/test_ctestfindsuites.cpp index 144ecb2fee..bc69dfdb14 100644 --- a/plugins/cmake/tests/test_ctestfindsuites.cpp +++ b/plugins/cmake/tests/test_ctestfindsuites.cpp @@ -32,6 +32,8 @@ #include #include #include +#include +#include #include #include #include @@ -39,6 +41,7 @@ #include #include +#include using namespace KDevelop; @@ -61,7 +64,12 @@ void TestCTestFindSuites::initTestCase() void TestCTestFindSuites::cleanup() { - foreach(IProject* p, ICore::self()->projectController()->projects()) { + foreach(IProject* p, ICore::self()->projectController()->projects()) + { + if (p && p->buildSystemManager() && p->buildSystemManager()->builder()) + { + p->buildSystemManager()->builder()->prune(p)->exec(); + } ICore::self()->projectController()->closeProject(p); } QVERIFY(ICore::self()->projectController()->projects().isEmpty()); diff --git a/plugins/codeutils/kdevcodeutils.json b/plugins/codeutils/kdevcodeutils.json index d46b6ca960..7f6afb7412 100644 --- a/plugins/codeutils/kdevcodeutils.json +++ b/plugins/codeutils/kdevcodeutils.json @@ -4,13 +4,19 @@ "Description": "Collection of various utilities that increase productivity while programming.", "Description[ca@valencia]": "Col·lecció de diverses utilitats que augmenten la productivitat durant la programació.", "Description[ca]": "Col·lecció de diverses utilitats que augmenten la productivitat durant la programació.", + "Description[cs]": "Kolekce různých pomůcek, pro zvýšení produktivity při programování.", + "Description[de]": "Sammlung verschiedener Werkzeuge, die die Produktivität während des Programmierens erhöhen.", "Description[es]": "Colección de diversas utilidades que incrementan la productividad al programar.", + "Description[et]": "Mitmesugused tööriistad, mis suurendavad produktiivsust programmeerimisel.", "Description[fr]": "Collection d'utilitaires variés qui améliorent la productivité pour programmer.", + "Description[gl]": "Colección de varias utilidades que aumentan a produtividade durante a programación.", "Description[it]": "Raccolta di vari programmi di utilità che aumentano la produttività durante la programmazione.", "Description[nl]": "Verzameling van hulpprogramma's die de productiviteit vergroot bij het programmeren.", "Description[pl]": "Zbiór różnych narzędzi zwiększających produktywność podczas programowania.", "Description[pt]": "Uma colecção de vários utilitários que aumentam a produtividade durante o desenvolvimento.", + "Description[pt_BR]": "Uma coleção de vários utilitários que aumentam a produtividade durante a programação.", "Description[sk]": "Zbierka rôznych utilít, ktoré zvyšujú produktivitu počas programovania.", + "Description[sl]": "Zbirka raznih pripomočkov, ki povečajo učinkovitost med programiranjem.", "Description[sv]": "Samling av diverse verktyg för att öka produktiviteten vid programmering.", "Description[tr]": "Programlama sırasında verimliliği artıran çeşitli yardımcı araçlar koleksiyonu.", "Description[uk]": "Збірка різноманітних допоміжних програм, яка підвищує продуктивність програмування.", @@ -21,14 +27,20 @@ "Name": "Code Utilities", "Name[ca@valencia]": "Utilitats de codi", "Name[ca]": "Utilitats de codi", + "Name[de]": "Quelltext-Werkzeuge", "Name[es]": "Utilidades de código fuente", + "Name[et]": "Kooditööriistad", "Name[fr]": "Utilitaires de code", + "Name[gl]": "Utilidades de código", "Name[it]": "Utilità per il codice", "Name[nb]": "Kodeverktøy", "Name[nl]": "Hulpmiddelen bij coderen", "Name[pl]": "Narzędzia kodu", "Name[pt]": "Utilitários de Código", + "Name[pt_BR]": "Utilitários de código", + "Name[ru]": "Утилиты для работы с кодом", "Name[sk]": "Nástroje kódu", + "Name[sl]": "Pripomočki za kodo", "Name[sv]": "Kodverktyg", "Name[tr]": "Kod Araçları", "Name[uk]": "Допоміжні засоби", diff --git a/plugins/contextbrowser/contextbrowserview.cpp b/plugins/contextbrowser/contextbrowserview.cpp index e08be57cc1..33f81c6ec6 100644 --- a/plugins/contextbrowser/contextbrowserview.cpp +++ b/plugins/contextbrowser/contextbrowserview.cpp @@ -182,6 +182,9 @@ ContextBrowserView::ContextBrowserView( ContextBrowserPlugin* plugin, QWidget* p m_declarationMenuAction = new QAction(QIcon::fromTheme(QStringLiteral("code-class")), QString(), this); m_declarationMenuAction->setToolTip(i18n("Declaration menu")); + // expose the declaration menu via the context menu; allows hiding the toolbar to save some space + // (this will not make it behave like a submenu though) + m_declarationMenuAction->setText(m_declarationMenuAction->toolTip()); connect(m_declarationMenuAction, &QAction::triggered, this, &ContextBrowserView::declarationMenu); addAction(m_declarationMenuAction); m_lockAction = new KToggleAction(QIcon::fromTheme(QStringLiteral("object-unlocked")), i18n("Lock Current View"), this); diff --git a/plugins/contextbrowser/kdevcontextbrowser.json b/plugins/contextbrowser/kdevcontextbrowser.json index 54974955fe..31b6ab53d5 100644 --- a/plugins/contextbrowser/kdevcontextbrowser.json +++ b/plugins/contextbrowser/kdevcontextbrowser.json @@ -10,13 +10,19 @@ "Description": "This plugin shows information about the current language context in a side view, and highlights relevant declarations and uses.", "Description[ca@valencia]": "Este connector mostra informació quant al context del llenguatge actual en una vista lateral i ressalta les declaracions i els usos apropiats.", "Description[ca]": "Aquest connector mostra informació quant al context del llenguatge actual en una vista lateral i ressalta les declaracions i els usos apropiats.", + "Description[cs]": "Tento zásuvný modul ukazuje v bočním pohledu informace o současném jazykovém kontextu a zvýrazňuje důležité deklarace a použití.", + "Description[de]": "Dieses Modul zeigt Informationen über den aktuellen Sprachkontext an und hebt die wichtigen Deklarationen und Vorkommen hervor.", "Description[es]": "Este complemento muestra información de contexto sobre el lenguaje actual en una vista lateral, resaltando declaraciones relevantes y sus usos.", + "Description[et]": "See plugin pakub külgvaates teavet aktiivse keele konteksti kohta ning tõstab esile asjakohased deklaratsioonid ja kasutused.", "Description[fr]": "Ce module affiche des informations à propos du contexte du langage courant dans une vue latérale, et met en évidence les déclarations et utilisations reliées.", + "Description[gl]": "Este complemento mostra información sobre o contexto da linguaxe actual nunha vista lateral, e realza as declaracións e utilizacións relevantes.", "Description[it]": "Questa estensione mostra le informazioni sul contesto del linguaggio corrente in una vista laterale, mettendo in evidenza le dichiarazioni e gli usi.", "Description[nl]": "Deze plugin toont informatie over de huidige taalcontext in een zijvak en accentueert relevante declaraties en gebruik.", "Description[pl]": "Ta wtyczka pokazuje informacje dotyczące kontekstu bieżącego języka w widoku bocznym, podświetla deklaracja i ich użycia.", "Description[pt]": "Este 'plugin' mostra informações sobre o contexto da linguagem actual numa vista lateral, assim como realça as declarações e utilizações relevantes.", + "Description[pt_BR]": "Este plugin mostra informações sobre a linguagem utilizada no momento, numa visão lateral, e destaca declarações relevantes e seus usos.", "Description[sk]": "Tento plugin zobrazuje informácie o aktuálnom jazykovom kontexte v božnom pohľade, a zvýrazní relevantné deklarácie a použitia.", + "Description[sl]": "Vstavek prikazuje podatke o trenutnem kontekstu jezika in poudari pomembne deklaracije in uporabe.", "Description[sv]": "Insticksprogrammet visar information om nuvarande språksammanhang i en sidovy, och markerar relevanta deklarationer och användningar.", "Description[tr]": "Bu eklenti yan görünümde mevcut dil bağlamıyla ilgili bilgi gösterir, ve ilgili tanımlamaları ve kullanımları vurgular.", "Description[uk]": "За допомогою цього додатка можна переглянути у перегляді на бічній панелі відомості про поточний контекст мови, а також підсвітити пов’язані оголошення і випадки використання.", @@ -29,14 +35,20 @@ "Name[ca@valencia]": "Navegador de codi", "Name[ca]": "Navegador de codi", "Name[cs]": "Prohlížeč kódu", + "Name[de]": "Quelltext-Browser", "Name[es]": "Navegador de código", + "Name[et]": "Koodibrauser", "Name[fr]": "Navigateur de code", + "Name[gl]": "Navegador do código", "Name[it]": "Navigatore del codice", "Name[nb]": "Kodeleser", "Name[nl]": "Broncode-browser", "Name[pl]": "Przeglądarka kodu", "Name[pt]": "Navegador do Código", + "Name[pt_BR]": "Navegador de código", + "Name[ru]": "Навигация по коду", "Name[sk]": "Prehliadač kódu", + "Name[sl]": "Brskalnik po kodi", "Name[sv]": "Kodbläddrare", "Name[tr]": "Kod Tarayıcı", "Name[uk]": "Переглядач коду", diff --git a/plugins/cppcheck/kdevcppcheck.json b/plugins/cppcheck/kdevcppcheck.json index ed892e8ea2..6181b4efed 100644 --- a/plugins/cppcheck/kdevcppcheck.json +++ b/plugins/cppcheck/kdevcppcheck.json @@ -1,26 +1,4 @@ { - "GenericName": "Cppcheck Support", - "GenericName[ast]": "Sofitu Cppcheck", - "GenericName[bs]": "Cppcheck podrška", - "GenericName[ca@valencia]": "Implementació del Cppcheck", - "GenericName[ca]": "Implementació del Cppcheck", - "GenericName[cs]": "Podpora Cppcheck", - "GenericName[de]": "Cppcheck-Unterstützung", - "GenericName[es]": "Uso de Cppcheck", - "GenericName[fi]": "Cppcheck-tuki", - "GenericName[fr]": "Prise en charge de Cppcheck", - "GenericName[gl]": "Integración de Cppcheck", - "GenericName[hu]": "Cppcheck támogatás", - "GenericName[nl]": "Ondersteuning van CPPCheck", - "GenericName[pl]": "Obsługa Cppcheck", - "GenericName[pt]": "Suporte para o Cppcheck", - "GenericName[pt_BR]": "Suporte ao Cppcheck", - "GenericName[sk]": "Podpora Cppcheck", - "GenericName[sv]": "Stöd för Cppcheck", - "GenericName[tr]": "Cppcheck Desteği", - "GenericName[uk]": "Підтримка Cppcheck", - "GenericName[x-test]": "xxCppcheck Supportxx", - "GenericName[zh_CN]": "Cppcheck 支持", "KPlugin": { "Authors": [ { @@ -30,8 +8,8 @@ ], "Category": "Analyzers", "Description": "This plugin integrates Cppcheck (static analysis tool) to KDevelop", - "Description[ca@valencia]": "Este connector integra el Cppcheck (eina per a l'anàlisi estàtic) al KDevelop", - "Description[ca]": "Aquest connector integra el Cppcheck (eina per a l'anàlisi estàtic) al KDevelop", + "Description[ca@valencia]": "Este connector integra el Cppcheck (eina per a l'anàlisi estàtica) al KDevelop", + "Description[ca]": "Aquest connector integra el Cppcheck (eina per a l'anàlisi estàtica) al KDevelop", "Description[cs]": "Tento modul integruje Cppcheck (statický analytický nástroj) do KDevelop", "Description[de]": "Dieses Modul integriert Cppcheck (Werkzeug zur statischen Analyse) in KDevelop", "Description[es]": "Este complemento integra Cppcheck (herramienta de análisis sintáctico) en KDevelop", diff --git a/plugins/custom-buildsystem/kdevcustombuildsystem.json b/plugins/custom-buildsystem/kdevcustombuildsystem.json index 3449a86156..1c1726f65b 100644 --- a/plugins/custom-buildsystem/kdevcustombuildsystem.json +++ b/plugins/custom-buildsystem/kdevcustombuildsystem.json @@ -28,6 +28,7 @@ "Name[ca@valencia]": "Sistema de construcció personalitzat", "Name[ca]": "Sistema de construcció personalitzat", "Name[cs]": "Vlastní systém pro sestavení", + "Name[de]": "Eigenes Build-System", "Name[es]": "Sistema de construcción personalizado", "Name[fr]": "Système personnalisé de compilation", "Name[it]": "Sistema di compilazione personalizzato", diff --git a/plugins/custom-definesandincludes/compilerprovider/compilerprovider.cpp b/plugins/custom-definesandincludes/compilerprovider/compilerprovider.cpp index f9d8d750a9..597fb4f625 100644 --- a/plugins/custom-definesandincludes/compilerprovider/compilerprovider.cpp +++ b/plugins/custom-definesandincludes/compilerprovider/compilerprovider.cpp @@ -23,8 +23,8 @@ #include "compilerprovider.h" -#include - +#include "debug.h" +#include "qtcompat_p.h" #include "compilerfactories.h" #include "settingsmanager.h" @@ -177,7 +177,7 @@ CompilerPointer CompilerProvider::defaultCompiler() const return m_defaultProvider; auto rt = ICore::self()->runtimeController()->currentRuntime(); - const auto path = QFile::decodeName(rt->getenv("PATH")).split(':'); + const auto path = QFile::decodeName(rt->getenv("PATH")).split(QtCompat::listSeparator()); for ( const CompilerPointer& compiler : m_compilers ) { const bool absolutePath = QDir::isAbsolutePath(compiler->path()); diff --git a/plugins/custom-definesandincludes/compilerprovider/gcclikecompiler.cpp b/plugins/custom-definesandincludes/compilerprovider/gcclikecompiler.cpp index d1b6391ba8..a459135a7d 100644 --- a/plugins/custom-definesandincludes/compilerprovider/gcclikecompiler.cpp +++ b/plugins/custom-definesandincludes/compilerprovider/gcclikecompiler.cpp @@ -96,8 +96,9 @@ Defines GccLikeCompiler::defines(const QString& arguments) const auto compilerArguments = languageOptions(arguments); compilerArguments.append(QStringLiteral("-dM")); compilerArguments.append(QStringLiteral("-E")); - compilerArguments.append(QProcess::nullDevice()); + compilerArguments.append(QStringLiteral("-")); + proc.setStandardInputFile(QProcess::nullDevice()); proc.setProgram(path()); proc.setArguments(compilerArguments); rt->startProcess(&proc); @@ -150,8 +151,9 @@ Path::List GccLikeCompiler::includes(const QString& arguments) const auto compilerArguments = languageOptions(arguments); compilerArguments.append(QStringLiteral("-E")); compilerArguments.append(QStringLiteral("-v")); - compilerArguments.append(QProcess::nullDevice()); + compilerArguments.append(QStringLiteral("-")); + proc.setStandardInputFile(QProcess::nullDevice()); proc.setProgram(path()); proc.setArguments(compilerArguments); rt->startProcess(&proc); diff --git a/plugins/custom-definesandincludes/compilerprovider/tests/test_compilerprovider.cpp b/plugins/custom-definesandincludes/compilerprovider/tests/test_compilerprovider.cpp index 8b9fdb728f..f62b950cb6 100644 --- a/plugins/custom-definesandincludes/compilerprovider/tests/test_compilerprovider.cpp +++ b/plugins/custom-definesandincludes/compilerprovider/tests/test_compilerprovider.cpp @@ -25,6 +25,7 @@ #include #include +#include #include #include @@ -84,7 +85,7 @@ void testAddingEntry(SettingsManager* settings, KConfig* config){ void TestCompilerProvider::initTestCase() { - AutoTestShell::init(); + AutoTestShell::init({QStringLiteral("kdevdefinesandincludesmanager"), QStringLiteral("KDevCustomBuildSystem"), QStringLiteral("KDevStandardOutputView")}); TestCore::initialize(); } diff --git a/plugins/custom-definesandincludes/compilerprovider/widget/compilerswidget.cpp b/plugins/custom-definesandincludes/compilerprovider/widget/compilerswidget.cpp index f4487196c8..530ccd7442 100644 --- a/plugins/custom-definesandincludes/compilerprovider/widget/compilerswidget.cpp +++ b/plugins/custom-definesandincludes/compilerprovider/widget/compilerswidget.cpp @@ -33,6 +33,7 @@ #include #include #include +#include #include "ui_compilerswidget.h" #include "compilersmodel.h" @@ -162,7 +163,15 @@ void CompilersWidget::compilerSelected(const QModelIndex& index) auto compiler = index.data(CompilersModel::CompilerDataRole); if (compiler.value()) { m_ui->compilerName->setText(compiler.value()->name()); + + //NOTE: there is a bug in kLineEdit, which causes textEdited signal to be + // spuriously emitted on calling setText(). See bug report here: + // https://bugs.kde.org/show_bug.cgi?id=388798 + // The resulting spurious call of compilerEdited then fails with an assert. + //Work around this bug until it is fixed upstream by disabling signals here + const QSignalBlocker blocker(m_ui->compilerPath); m_ui->compilerPath->setText(compiler.value()->path()); + enableItems(true); } else { enableItems(false); @@ -194,6 +203,10 @@ void CompilersWidget::enableItems(bool enable) if(!enable) { m_ui->compilerName->clear(); + + //NOTE: this is to work around the + //spurious signal bug in kLineEdit + const QSignalBlocker blocker(m_ui->compilerPath); m_ui->compilerPath->clear(); } } diff --git a/plugins/custom-definesandincludes/kcm_widget/projectpathswidget.cpp b/plugins/custom-definesandincludes/kcm_widget/projectpathswidget.cpp index 13091de1f2..3bc4838e4b 100644 --- a/plugins/custom-definesandincludes/kcm_widget/projectpathswidget.cpp +++ b/plugins/custom-definesandincludes/kcm_widget/projectpathswidget.cpp @@ -241,7 +241,6 @@ void ProjectPathsWidget::batchEdit() delete dialog; return; } - delete dialog; if (includesTab) { auto includes = be.textEdit->toPlainText().split('\n', QString::SkipEmptyParts); @@ -268,6 +267,7 @@ void ProjectPathsWidget::batchEdit() } projectPathSelected(index); + delete dialog; } void ProjectPathsWidget::setCurrentCompiler(const QString& name) diff --git a/plugins/custom-definesandincludes/tests/test_definesandincludes.cpp b/plugins/custom-definesandincludes/tests/test_definesandincludes.cpp index 7d890dc8c8..424026a9d0 100644 --- a/plugins/custom-definesandincludes/tests/test_definesandincludes.cpp +++ b/plugins/custom-definesandincludes/tests/test_definesandincludes.cpp @@ -42,7 +42,7 @@ void TestDefinesAndIncludes::cleanupTestCase() void TestDefinesAndIncludes::initTestCase() { - AutoTestShell::init(); + AutoTestShell::init({QStringLiteral("kdevdefinesandincludesmanager"), QStringLiteral("KDevCustomBuildSystem"), QStringLiteral("KDevStandardOutputView")}); TestCore::initialize(); } diff --git a/plugins/cvs/cvsplugin.cpp b/plugins/cvs/cvsplugin.cpp index 5066d884a8..ca9cc6538f 100644 --- a/plugins/cvs/cvsplugin.cpp +++ b/plugins/cvs/cvsplugin.cpp @@ -49,7 +49,7 @@ #include #include -K_PLUGIN_FACTORY(KDevCvsFactory, registerPlugin();) +K_PLUGIN_FACTORY_WITH_JSON(KDevCvsFactory, "kdevcvs.json", registerPlugin();) // K_EXPORT_PLUGIN(KDevCvsFactory(KAboutData("kdevcvs", "kdevcvs", ki18n("CVS"), "0.1", ki18n("Support for CVS version control system"), KAboutData::License_GPL))) class KDevCvsViewFactory: public KDevelop::IToolViewFactory diff --git a/plugins/cvs/cvsproxy.cpp b/plugins/cvs/cvsproxy.cpp index 54b025fb12..c557ba333b 100644 --- a/plugins/cvs/cvsproxy.cpp +++ b/plugins/cvs/cvsproxy.cpp @@ -40,7 +40,7 @@ CvsProxy::~CvsProxy() bool CvsProxy::isValidDirectory(const QUrl& dirPath) const { const QFileInfo fsObject( dirPath.toLocalFile() ); - QDir dir = fsObject.isDir() ? fsObject.absoluteDir() : fsObject.dir(); + QDir dir = fsObject.isDir() ? QDir(fsObject.filePath()) : fsObject.dir(); return dir.exists(QStringLiteral("CVS")); } @@ -48,7 +48,7 @@ bool CvsProxy::isValidDirectory(const QUrl& dirPath) const bool CvsProxy::isVersionControlled(const QUrl& filePath) const { const QFileInfo fsObject( filePath.toLocalFile() ); - QDir dir = fsObject.isDir() ? fsObject.absoluteDir() : fsObject.dir(); + QDir dir = fsObject.isDir() ? QDir(fsObject.filePath()) : fsObject.dir(); if( !dir.cd(QStringLiteral("CVS")) ) return false; diff --git a/plugins/cvs/kdevcvs.json b/plugins/cvs/kdevcvs.json index 9972110533..4cc6015e59 100644 --- a/plugins/cvs/kdevcvs.json +++ b/plugins/cvs/kdevcvs.json @@ -11,19 +11,23 @@ "Description[ca@valencia]": "Este connector integra el CVS al KDevelop", "Description[ca]": "Aquest connector integra el CVS al KDevelop", "Description[cs]": "Tento modul integruje podporu pro CVS v KDevelop", + "Description[de]": "Dieses Modul integriert CVS in KDevelop.", "Description[es]": "Este complemento integra CVS en KDevelop", + "Description[et]": "See plugin lõimib CVS-i KDevelopiga", "Description[fr]": "Ce module intègre CVS dans KDevelop", + "Description[gl]": "Este complemento integra CVS en KDevelop", "Description[it]": "Questa estensione integra CVS in KDevelop", "Description[nl]": "Deze plugin integreert CVS in KDevelop", "Description[pl]": "Ta wtyczka udostępnia obsługę CVS w KDevelopie", "Description[pt]": "Este 'plugin' integra o CVS no KDevelop", + "Description[pt_BR]": "Esta extensão integra o CVS ao KDevelop", "Description[sk]": "Tento plugin integruje CVS do KDevelop.", "Description[sv]": "Insticksprogrammet integrerar CVS i KDevelop", "Description[tr]": "Bu eklenti CVS uygulamasını KDevelop ile bütünleştirir", "Description[uk]": "За допомогою цього додатка можна інтегрувати CVS до KDevelop", "Description[x-test]": "xxThis plugin integrates CVS to KDevelopxx", "Description[zh_CN]": "此插件将 CVS 整合到 KDevelop", - "Icon": "cervisia", + "Icon": "kdevelop", "Id": "kdevcvs", "License": "GPL", "Name": "CVS Support", @@ -33,6 +37,7 @@ "Name[de]": "CVS-Unterstützung", "Name[es]": "Implementación de CVS", "Name[fr]": "Prise en charge de CVS", + "Name[gl]": "Compatibilidade con CVS", "Name[it]": "Supporto per CVS", "Name[nb]": "CVS-støtte", "Name[nl]": "CVS-ondersteuning", diff --git a/plugins/debuggercommon/CMakeLists.txt b/plugins/debuggercommon/CMakeLists.txt index 2bd2795ea2..f6b395f592 100644 --- a/plugins/debuggercommon/CMakeLists.txt +++ b/plugins/debuggercommon/CMakeLists.txt @@ -5,6 +5,7 @@ set(debuggercommon_SRCS mi/miparser.cpp mi/micommand.cpp mi/micommandqueue.cpp + dbgglobal.cpp dialogs/selectcoredialog.cpp # debug session & debugger midebugger.cpp diff --git a/plugins/debuggercommon/dbgglobal.cpp b/plugins/debuggercommon/dbgglobal.cpp new file mode 100644 index 0000000000..7d1982848f --- /dev/null +++ b/plugins/debuggercommon/dbgglobal.cpp @@ -0,0 +1,22 @@ +/* This file is part of the KDE project + Copyright (C) 2018 Kevin Funk + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public License + along with this library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. +*/ + +#include "dbgglobal.h" + +#include "moc_dbgglobal.cpp" diff --git a/plugins/debuggercommon/dbgglobal.h b/plugins/debuggercommon/dbgglobal.h index 2744e2f8fe..9cf0ca9e31 100644 --- a/plugins/debuggercommon/dbgglobal.h +++ b/plugins/debuggercommon/dbgglobal.h @@ -18,10 +18,14 @@ #ifndef _DBGGLOBAL_H_ #define _DBGGLOBAL_H_ +#include #include namespace KDevMI { +#if QT_VERSION >= QT_VERSION_CHECK(5,8,0) +Q_NAMESPACE +#endif enum DBGStateFlag { @@ -46,6 +50,9 @@ enum DBGStateFlag /// Set when the debugger failed to start s_dbgFailedStart = 1 << 13, }; +#if QT_VERSION >= QT_VERSION_CHECK(5,8,0) +Q_ENUM_NS(DBGStateFlag) +#endif Q_DECLARE_FLAGS(DBGStateFlags, DBGStateFlag) enum DataType { typeUnknown, typeValue, typePointer, typeReference, diff --git a/plugins/debuggercommon/midebugger.cpp b/plugins/debuggercommon/midebugger.cpp index 2d1ac939de..621beeb30a 100644 --- a/plugins/debuggercommon/midebugger.cpp +++ b/plugins/debuggercommon/midebugger.cpp @@ -46,50 +46,50 @@ using namespace KDevMI::MI; MIDebugger::MIDebugger(QObject* parent) : QObject(parent) - , process_(nullptr) - , currentCmd_(nullptr) + , m_process(nullptr) + , m_currentCmd(nullptr) { - process_ = new KProcess(this); - process_->setOutputChannelMode(KProcess::SeparateChannels); - connect(process_, &KProcess::readyReadStandardOutput, + m_process = new KProcess(this); + m_process->setOutputChannelMode(KProcess::SeparateChannels); + connect(m_process, &KProcess::readyReadStandardOutput, this, &MIDebugger::readyReadStandardOutput); - connect(process_, &KProcess::readyReadStandardError, + connect(m_process, &KProcess::readyReadStandardError, this, &MIDebugger::readyReadStandardError); - connect(process_, + connect(m_process, static_cast(&KProcess::finished), this, &MIDebugger::processFinished); - connect(process_, static_cast(&KProcess::error), + connect(m_process, static_cast(&KProcess::error), this, &MIDebugger::processErrored); } MIDebugger::~MIDebugger() { // prevent Qt warning: QProcess: Destroyed while process is still running. - if (process_ && process_->state() == QProcess::Running) { - disconnect(process_, static_cast(&KProcess::error), + if (m_process && m_process->state() == QProcess::Running) { + disconnect(m_process, static_cast(&KProcess::error), this, &MIDebugger::processErrored); - process_->kill(); - process_->waitForFinished(10); + m_process->kill(); + m_process->waitForFinished(10); } } void MIDebugger::execute(MICommand* command) { - currentCmd_ = command; - QString commandText = currentCmd_->cmdToSend(); + m_currentCmd = command; + QString commandText = m_currentCmd->cmdToSend(); qCDebug(DEBUGGERCOMMON) << "SEND:" << commandText.trimmed(); QByteArray commandUtf8 = commandText.toUtf8(); - process_->write(commandUtf8, commandUtf8.length()); + m_process->write(commandUtf8, commandUtf8.length()); command->markAsSubmitted(); - QString prettyCmd = currentCmd_->cmdToSend(); + QString prettyCmd = m_currentCmd->cmdToSend(); prettyCmd.remove( QRegExp("set prompt \032.\n") ); prettyCmd = "(gdb) " + prettyCmd; - if (currentCmd_->isUserCommand()) + if (m_currentCmd->isUserCommand()) emit userCommandOutput(prettyCmd); else emit internalCommandOutput(prettyCmd); @@ -97,13 +97,13 @@ void MIDebugger::execute(MICommand* command) bool MIDebugger::isReady() const { - return currentCmd_ == nullptr; + return m_currentCmd == nullptr; } void MIDebugger::interrupt() { //TODO:win32 Porting needed - int pid = process_->pid(); + int pid = m_process->pid(); if (pid != 0) { ::kill(pid, SIGINT); } @@ -111,28 +111,28 @@ void MIDebugger::interrupt() MICommand* MIDebugger::currentCommand() const { - return currentCmd_; + return m_currentCmd; } void MIDebugger::kill() { - process_->kill(); + m_process->kill(); } void MIDebugger::readyReadStandardOutput() { - process_->setReadChannel(QProcess::StandardOutput); + m_process->setReadChannel(QProcess::StandardOutput); - buffer_ += process_->readAll(); + m_buffer += m_process->readAll(); for (;;) { /* In MI mode, all messages are exactly one line. See if we have any complete lines in the buffer. */ - int i = buffer_.indexOf('\n'); + int i = m_buffer.indexOf('\n'); if (i == -1) break; - QByteArray reply(buffer_.left(i)); - buffer_ = buffer_.mid(i+1); + QByteArray reply(m_buffer.left(i)); + m_buffer = m_buffer.mid(i+1); processLine(reply); } @@ -140,18 +140,20 @@ void MIDebugger::readyReadStandardOutput() void MIDebugger::readyReadStandardError() { - process_->setReadChannel(QProcess::StandardError); - emit debuggerInternalOutput(QString::fromUtf8(process_->readAll())); + m_process->setReadChannel(QProcess::StandardError); + emit debuggerInternalOutput(QString::fromUtf8(m_process->readAll())); } void MIDebugger::processLine(const QByteArray& line) { - qCDebug(DEBUGGERCOMMON) << "Debugger (" << process_->pid() <<") output: " << line; + if (line != "(gdb) ") { + qCDebug(DEBUGGERCOMMON) << "Debugger output (pid =" << m_process->pid() << "): " << line; + } FileSymbol file; file.contents = line; - std::unique_ptr r(mi_parser_.parse(&file)); + std::unique_ptr r(m_parser.parse(&file)); if (!r) { @@ -179,23 +181,23 @@ void MIDebugger::processLine(const QByteArray& line) // it's still possible for the user to issue a MI command, // emit correct signal - if (currentCmd_ && currentCmd_->isUserCommand()) { + if (m_currentCmd && m_currentCmd->isUserCommand()) { emit userCommandOutput(QString::fromUtf8(line) + '\n'); } else { emit internalCommandOutput(QString::fromUtf8(line) + '\n'); } // protect against wild replies that sometimes returned from gdb without a pending command - if (!currentCmd_) + if (!m_currentCmd) { qCWarning(DEBUGGERCOMMON) << "Received a result without a pending command"; throw std::runtime_error("Received a result without a pending command"); } - else if (currentCmd_->token() != result.token) + else if (m_currentCmd->token() != result.token) { std::stringstream ss; ss << "Received a result with token not matching pending command. " - << "Pending: " << currentCmd_->token() << "Received: " << result.token; + << "Pending: " << m_currentCmd->token() << "Received: " << result.token; qCWarning(DEBUGGERCOMMON) << ss.str().c_str(); throw std::runtime_error(ss.str()); } @@ -204,24 +206,24 @@ void MIDebugger::processLine(const QByteArray& line) if (result.reason == QLatin1String("done") || result.reason == QLatin1String("running") || result.reason == QLatin1String("exit")) { qCDebug(DEBUGGERCOMMON) << "Result token is" << result.token; - currentCmd_->markAsCompleted(); + m_currentCmd->markAsCompleted(); qCDebug(DEBUGGERCOMMON) << "Command successful, times " - << currentCmd_->totalProcessingTime() - << currentCmd_->queueTime() - << currentCmd_->gdbProcessingTime(); - currentCmd_->invokeHandler(result); + << m_currentCmd->totalProcessingTime() + << m_currentCmd->queueTime() + << m_currentCmd->gdbProcessingTime(); + m_currentCmd->invokeHandler(result); } else if (result.reason == QLatin1String("error")) { qCDebug(DEBUGGERCOMMON) << "Handling error"; - currentCmd_->markAsCompleted(); + m_currentCmd->markAsCompleted(); qCDebug(DEBUGGERCOMMON) << "Command error, times" - << currentCmd_->totalProcessingTime() - << currentCmd_->queueTime() - << currentCmd_->gdbProcessingTime(); + << m_currentCmd->totalProcessingTime() + << m_currentCmd->queueTime() + << m_currentCmd->gdbProcessingTime(); // Some commands want to handle errors themself. - if (currentCmd_->handlesError() && - currentCmd_->invokeHandler(result)) + if (m_currentCmd->handlesError() && + m_currentCmd->invokeHandler(result)) { qCDebug(DEBUGGERCOMMON) << "Invoked custom handler\n"; // Done, nothing more needed @@ -234,8 +236,8 @@ void MIDebugger::processLine(const QByteArray& line) qCDebug(DEBUGGERCOMMON) << "Unhandled result code: " << result.reason; } - delete currentCmd_; - currentCmd_ = nullptr; + delete m_currentCmd; + m_currentCmd = nullptr; emit ready(); break; } @@ -286,13 +288,13 @@ void MIDebugger::processLine(const QByteArray& line) if (s.subkind == MI::StreamRecord::Target) { emit applicationOutput(s.message); } else if (s.subkind == MI::StreamRecord::Console) { - if (currentCmd_ && currentCmd_->isUserCommand()) + if (m_currentCmd && m_currentCmd->isUserCommand()) emit userCommandOutput(s.message); else emit internalCommandOutput(s.message); - if (currentCmd_) - currentCmd_->newOutput(s.message); + if (m_currentCmd) + m_currentCmd->newOutput(s.message); } else { emit debuggerInternalOutput(s.message); } @@ -343,7 +345,7 @@ void MIDebugger::processErrored(QProcess::ProcessError error) i18n("Could not start debugger." "

Could not run '%1'. " "Make sure that the path name is specified correctly.", - debuggerExecutable_), + m_debuggerExecutable), i18n("Could not start debugger")); emit userCommandOutput(QStringLiteral("Process failed to start\n")); @@ -356,7 +358,7 @@ void MIDebugger::processErrored(QProcess::ProcessError error) "

The debugger process '%1' crashed.
" "Because of that the debug session has to be ended.
" "Try to reproduce the crash without KDevelop and report a bug.
", - debuggerExecutable_), + m_debuggerExecutable), i18n("Debugger crashed")); emit userCommandOutput(QStringLiteral("Process crashed\n")); diff --git a/plugins/debuggercommon/midebugger.h b/plugins/debuggercommon/midebugger.h index ae9dd7f44a..f934c029cf 100644 --- a/plugins/debuggercommon/midebugger.h +++ b/plugins/debuggercommon/midebugger.h @@ -135,16 +135,15 @@ protected Q_SLOTS: void processLine(const QByteArray& line); protected: - QString debuggerExecutable_; - KProcess* process_; + QString m_debuggerExecutable; + KProcess* m_process; - MI::MICommand* currentCmd_; - - MI::MIParser mi_parser_; + MI::MICommand* m_currentCmd; + MI::MIParser m_parser; /** The unprocessed output from debugger. Output is processed as soon as we see newline. */ - QByteArray buffer_; + QByteArray m_buffer; }; } diff --git a/plugins/debuggercommon/midebugsession.cpp b/plugins/debuggercommon/midebugsession.cpp index 58d9bb7794..f7539d216e 100644 --- a/plugins/debuggercommon/midebugsession.cpp +++ b/plugins/debuggercommon/midebugsession.cpp @@ -442,7 +442,6 @@ void MIDebugSession::debuggerStateChange(DBGStateFlags oldState, DBGStateFlags n out += QString::number(i); } } - qCDebug(DEBUGGERCOMMON) << "Debugger state change:" << out; } } @@ -488,7 +487,7 @@ void MIDebugSession::handleDebuggerStateChange(DBGStateFlags oldState, DBGStateF } // And now? :-) - qCDebug(DEBUGGERCOMMON) << "Debugger state changed to: " << newState << message; + qCDebug(DEBUGGERCOMMON) << "Debugger state changed to:" << newState << message << "- changes:" << changedState; if (!message.isEmpty()) emit showMessage(message, 3000); diff --git a/plugins/debuggercommon/miframestackmodel.cpp b/plugins/debuggercommon/miframestackmodel.cpp index 643ef28076..5abbe2bb39 100644 --- a/plugins/debuggercommon/miframestackmodel.cpp +++ b/plugins/debuggercommon/miframestackmodel.cpp @@ -80,7 +80,7 @@ void MIFrameStackModel::handleThreadInfo(const ResultRecord& r) if (threadMI[QStringLiteral("state")].literal() == QLatin1String("stopped")) { threadItem.name = getFunctionOrAddress(threadMI[QStringLiteral("frame")]); } else { - i18n("(running)"); + threadItem.name = i18n("(running)"); } threadsList << threadItem; } diff --git a/plugins/debuggercommon/mivariable.cpp b/plugins/debuggercommon/mivariable.cpp index 62bbcc88eb..59f39332ed 100644 --- a/plugins/debuggercommon/mivariable.cpp +++ b/plugins/debuggercommon/mivariable.cpp @@ -35,26 +35,26 @@ using namespace KDevMI::MI; bool MIVariable::sessionIsAlive() const { - if (!debugSession) + if (!m_debugSession) return false; - IDebugSession::DebuggerState s = debugSession->state(); + IDebugSession::DebuggerState s = m_debugSession->state(); return s != IDebugSession::NotStartedState && s != IDebugSession::EndedState - && !debugSession->debuggerStateIsOn(s_shuttingDown); + && !m_debugSession->debuggerStateIsOn(s_shuttingDown); } MIVariable::MIVariable(MIDebugSession *session, TreeModel* model, TreeItem* parent, const QString& expression, const QString& display) : Variable(model, parent, expression, display) - , debugSession(session) + , m_debugSession(session) { } MIVariable *MIVariable::createChild(const Value& child) { - if (!debugSession) return nullptr; - auto var = static_cast(debugSession->variableController()->createVariable(model(), this, child[QStringLiteral("exp")].literal())); + if (!m_debugSession) return nullptr; + auto var = static_cast(m_debugSession->variableController()->createVariable(model(), this, child[QStringLiteral("exp")].literal())); var->setTopLevel(false); var->setVarobj(child[QStringLiteral("name")].literal()); bool hasMore = child[QStringLiteral("numchild")].toInt() != 0 || ( child.hasField(QStringLiteral("dynamic")) && child[QStringLiteral("dynamic")].toInt()!=0 ); @@ -71,33 +71,33 @@ MIVariable *MIVariable::createChild(const Value& child) MIVariable::~MIVariable() { - if (!varobj_.isEmpty()) + if (!m_varobj.isEmpty()) { // Delete only top-level variable objects. if (topLevel()) { if (sessionIsAlive()) { - debugSession->addCommand(VarDelete, QStringLiteral("\"%1\"").arg(varobj_)); + m_debugSession->addCommand(VarDelete, QStringLiteral("\"%1\"").arg(m_varobj)); } } - if (debugSession) - debugSession->variableMapping().remove(varobj_); + if (m_debugSession) + m_debugSession->variableMapping().remove(m_varobj); } } void MIVariable::setVarobj(const QString& v) { - if (!debugSession) { + if (!m_debugSession) { qCWarning(DEBUGGERCOMMON) << "MIVariable::setVarobj called when its session died"; return; } - if (!varobj_.isEmpty()) { + if (!m_varobj.isEmpty()) { // this should not happen // but apperently it does when attachMaybe is called a second time before // the first -var-create call returned - debugSession->variableMapping().remove(varobj_); + m_debugSession->variableMapping().remove(m_varobj); } - varobj_ = v; - debugSession->variableMapping()[varobj_] = this; + m_varobj = v; + m_debugSession->variableMapping()[m_varobj] = this; } @@ -163,15 +163,15 @@ class CreateVarobjHandler : public MICommandHandler void MIVariable::attachMaybe(QObject *callback, const char *callbackMethod) { - if (!varobj_.isEmpty()) + if (!m_varobj.isEmpty()) return; // Try find a current session and attach to it if (!ICore::self()->debugController()) return; //happens on shutdown - debugSession = static_cast(ICore::self()->debugController()->currentSession()); + m_debugSession = static_cast(ICore::self()->debugController()->currentSession()); if (sessionIsAlive()) { - debugSession->addCommand(VarCreate, + m_debugSession->addCommand(VarCreate, QStringLiteral("var%1 @ %2").arg(nextId++).arg(enquotedExpression()), new CreateVarobjHandler(this, callback, callbackMethod)); } @@ -179,7 +179,7 @@ void MIVariable::attachMaybe(QObject *callback, const char *callbackMethod) void MIVariable::markAsDead() { - varobj_.clear(); + m_varobj.clear(); } class FetchMoreChildrenHandler : public MICommandHandler @@ -249,11 +249,11 @@ void MIVariable::fetchMoreChildren() // FIXME: should not even try this if app is not started. // Probably need to disable open, or something if (sessionIsAlive()) { - debugSession->addCommand(VarListChildren, + m_debugSession->addCommand(VarListChildren, QStringLiteral("--all-values \"%1\" %2 %3") // fetch from .. to .. - .arg(varobj_).arg(c).arg(c + fetchStep), - new FetchMoreChildrenHandler(this, debugSession)); + .arg(m_varobj).arg(c).arg(c + s_fetchStep), + new FetchMoreChildrenHandler(this, m_debugSession)); } } @@ -290,7 +290,7 @@ void MIVariable::handleUpdate(const Value& var) if (var.hasField(QStringLiteral("new_children"))) { const Value& children = var[QStringLiteral("new_children")]; - if (debugSession) { + if (m_debugSession) { for (int i = 0; i < children.size(); ++i) { createChild(children[i]); // it's automatically appended to this's children list @@ -309,7 +309,7 @@ void MIVariable::handleUpdate(const Value& var) const QString& MIVariable::varobj() const { - return varobj_; + return m_varobj; } QString MIVariable::enquotedExpression() const @@ -347,8 +347,8 @@ void MIVariable::formatChanged() else { if (sessionIsAlive()) { - debugSession->addCommand(VarSetFormat, - QStringLiteral(" %1 %2 ").arg(varobj_).arg(format2str(format())), + m_debugSession->addCommand(VarSetFormat, + QStringLiteral(" %1 %2 ").arg(m_varobj).arg(format2str(format())), new SetFormatHandler(this)); } } diff --git a/plugins/debuggercommon/mivariable.h b/plugins/debuggercommon/mivariable.h index 8af24096dc..f31f7c0606 100644 --- a/plugins/debuggercommon/mivariable.h +++ b/plugins/debuggercommon/mivariable.h @@ -77,13 +77,16 @@ class MIVariable : public KDevelop::Variable bool sessionIsAlive() const; void setVarobj(const QString& v); - QString varobj_; - QPointer debugSession; +protected: + QPointer m_debugSession; + +private: + QString m_varobj; // How many children should be fetched in one // increment. - static const int fetchStep = 5; + static const int s_fetchStep = 5; }; } // end of KDevMI diff --git a/plugins/debuggercommon/tests/CMakeLists.txt b/plugins/debuggercommon/tests/CMakeLists.txt index 810d0f135f..18b292ce99 100644 --- a/plugins/debuggercommon/tests/CMakeLists.txt +++ b/plugins/debuggercommon/tests/CMakeLists.txt @@ -1,9 +1,3 @@ -if (CMAKE_VERSION VERSION_GREATER "2.9" OR NOT CMAKE_GENERATOR MATCHES "Ninja") - set(HAVE_PATH_WITH_SPACES_TEST TRUE) -else() - message(WARNING "Disabling 'path with spaces' test, this CMake version would create a faulty build.ninja file. Upgrade to at least CMake v3.0") -endif() - get_filename_component(GDB_SRC_DIR ${CMAKE_CURRENT_SOURCE_DIR}/../../gdb ABSOLUTE) get_filename_component(LLDB_SRC_DIR ${CMAKE_CURRENT_SOURCE_DIR}/../../lldb ABSOLUTE) configure_file(debuggers-tests-config.h.in debuggers-tests-config.h) diff --git a/plugins/debuggercommon/tests/debuggees/CMakeLists.txt b/plugins/debuggercommon/tests/debuggees/CMakeLists.txt index 9d346f2e3b..26cc428c3b 100644 --- a/plugins/debuggercommon/tests/debuggees/CMakeLists.txt +++ b/plugins/debuggercommon/tests/debuggees/CMakeLists.txt @@ -4,11 +4,13 @@ function(add_debuggable_executable target) ecm_mark_nongui_executable(${target}) # force debug symbols for our debuggees, disable optimizations if (WIN32) - set(_flags "/0d") + # Avoid "cl : Command line warning D9025 : overriding '/O2' with '/Od'" warnings + # Thus set COMPILE_FLAGS_RELEASE instead of COMPILE_FLAGS + # COMPILE_FLAGS_DEBUG should already have the desired flags + set_target_properties(${target} PROPERTIES COMPILE_FLAGS_RELEASE "/DEBUG /Od") else() - set(_flags "-O0") + set_target_properties(${target} PROPERTIES COMPILE_FLAGS "${CMAKE_CXX_FLAGS_DEBUG} -O0") endif() - set_target_properties(${target} PROPERTIES COMPILE_FLAGS "${CMAKE_CXX_FLAGS_DEBUG} ${_flags}") endfunction() add_debuggable_executable(debuggee_debugee SRCS debugee.cpp) @@ -30,9 +32,7 @@ target_link_libraries(debuggee_debugeeqt Qt5::Core) add_debuggable_executable(debuggee_debugeeexception SRCS debugeeexception.cpp) kde_target_enable_exceptions(debuggee_debugeeexception PRIVATE) -if (HAVE_PATH_WITH_SPACES_TEST) - add_subdirectory("path with space") -endif() +add_subdirectory("path with space") add_debuggable_executable(debuggee_qstring SRCS qstring.cpp) target_link_libraries(debuggee_qstring Qt5::Core) diff --git a/plugins/debuggercommon/tests/debuggees/qurl.cpp b/plugins/debuggercommon/tests/debuggees/qurl.cpp index e840d2385d..218a683161 100644 --- a/plugins/debuggercommon/tests/debuggees/qurl.cpp +++ b/plugins/debuggercommon/tests/debuggees/qurl.cpp @@ -1,6 +1,6 @@ #include int main() { - QUrl u(QStringLiteral("http://www.kdevelop.org/foo")); + QUrl u(QStringLiteral("http://user@www.kdevelop.org:12345/foo?xyz=bar#asdf")); return 0; } diff --git a/plugins/debuggercommon/tests/debuggers-tests-config.h.in b/plugins/debuggercommon/tests/debuggers-tests-config.h.in index 8f61090a2b..4a8e67ca15 100644 --- a/plugins/debuggercommon/tests/debuggers-tests-config.h.in +++ b/plugins/debuggercommon/tests/debuggers-tests-config.h.in @@ -4,4 +4,3 @@ #define DEBUGGEE_SRC_DIR "${CMAKE_CURRENT_SOURCE_DIR}/debuggees" #cmakedefine GDB_SRC_DIR "${GDB_SRC_DIR}" #cmakedefine LLDB_SRC_DIR "${LLDB_SRC_DIR}" -#cmakedefine01 HAVE_PATH_WITH_SPACES_TEST diff --git a/plugins/docker/dockerfile-template/dockerfile-template.desktop b/plugins/docker/dockerfile-template/dockerfile-template.desktop index 20cc512c11..432de41b97 100644 --- a/plugins/docker/dockerfile-template/dockerfile-template.desktop +++ b/plugins/docker/dockerfile-template/dockerfile-template.desktop @@ -3,7 +3,10 @@ Name=Dockerfile Name[ca]=Dockerfile Name[ca@valencia]=Dockerfile Name[cs]=Dockerfile +Name[de]=Dockerfile +Name[en_GB]=Dockerfile Name[es]=Dockerfile +Name[fr]=Fichier Docker Name[it]=Dockerfile Name[nl]=Dockerfile Name[pl]=Dockerfile @@ -17,7 +20,9 @@ Name[zh_CN]=Dockerfile Comment=A Dockerfile is a text document that contains all the commands a user could call on the command line to assemble an image Comment[ca]=Un Dockerfile és un document de text que conté totes les ordres que un usuari hauria de cridar per a muntar una imatge Comment[ca@valencia]=Un Dockerfile és un document de text que conté totes les ordes que un usuari hauria de cridar per a muntar una imatge +Comment[en_GB]=A Dockerfile is a text document that contains all the commands a user could call on the command line to assemble an image Comment[es]=Un «Dockerfile» es un documento de texto que contiene todas las órdenes que puede invocar el usuario en la línea de órdenes para ensamblar una imagen +Comment[fr]=Un fichier Docker est un document texte qui contient toutes les commandes qu'un utilisateur pourrait saisir en ligne de commande pour assembler une image Comment[it]=Un file Dockerfile è un documento di testo che contiene tutti i comandi che un utente può chiamare da riga di comando per assemblare un'immagine Comment[nl]=Een Dockerbestand is een tekstdocument dat alle opdrachten bevat die een gebruiker zou kunnen aanroepen op de opdrachtregel om een image samen te stellen Comment[pl]=Plik dokowany jest plikiem tekstowym, który zawiera wszystkie polecenia, które użytkownik może wydać w wierszu poleceń, aby złożyć obraz @@ -33,6 +38,8 @@ Language=JSON Language[ca]=JSON Language[ca@valencia]=JSON Language[cs]=JSON +Language[de]=JSON +Language[en_GB]=JSON Language[es]=JSON Language[fr]=JSON Language[it]=JSON diff --git a/plugins/docker/kdevdocker.json b/plugins/docker/kdevdocker.json index a438a59e9e..af0b869359 100644 --- a/plugins/docker/kdevdocker.json +++ b/plugins/docker/kdevdocker.json @@ -13,6 +13,7 @@ "Description[ca@valencia]": "Exposa el temps d'execució del Docker", "Description[ca]": "Exposa el temps d'execució del Docker", "Description[es]": "Expone bibliotecas en tiempo de ejecución de Docker", + "Description[fr]": "Expose les exécutifs Docker", "Description[it]": "Espone i runtime di Docker", "Description[nl]": "Toont Docker runtimes", "Description[pl]": "Udostępnia biblioteki uruchomieniowe Dockera", @@ -23,14 +24,17 @@ "Description[uk]": "Надає доступ до середовищ виконання Docker", "Description[x-test]": "xxExposes Docker runtimesxx", "Description[zh_CN]": "暴露 Docker 运行时", - "Icon": "docker", + "Icon": "kdevelop", "Id": "kdevdocker", "License": "GPL", "Name": "Docker Support", "Name[ca@valencia]": "Implementació del Docker", "Name[ca]": "Implementació del Docker", + "Name[cs]": "Podpora Dockeru", "Name[de]": "Docker-Unterstützung", "Name[es]": "Implementación de Docker", + "Name[fr]": "Prise en charge de Docker", + "Name[gl]": "Integración de Docker", "Name[it]": "Supporto per Docker", "Name[nl]": "Ondersteuning van Docker", "Name[pl]": "Obsługa Docker", diff --git a/plugins/docker/tests/test_docker.cpp b/plugins/docker/tests/test_docker.cpp index e13947a8d0..8064b1ce60 100644 --- a/plugins/docker/tests/test_docker.cpp +++ b/plugins/docker/tests/test_docker.cpp @@ -56,17 +56,15 @@ class DockerTest: public QObject m_initialRuntime = ICore::self()->runtimeController()->currentRuntime(); auto plugin = ICore::self()->pluginController()->loadPlugin("kdevdocker"); - Q_ASSERT(plugin); + QVERIFY(plugin); QSignalSpy spy(plugin, SIGNAL(imagesListed())); - Q_ASSERT(spy.wait()); - + QVERIFY(spy.wait()); auto projectPath = QUrl::fromLocalFile(QFINDTESTDATA("testproject/test.kdev4")); - qDebug() << "wuuu" << projectPath; TestCore::self()->projectController()->openProject(projectPath); QSignalSpy spy2(TestCore::self()->projectController(), &IProjectController::projectOpened); - Q_ASSERT(spy2.wait()); + QVERIFY(spy2.wait()); } IRuntime* m_initialRuntime; diff --git a/plugins/documentswitcher/documentswitchertreeview.cpp b/plugins/documentswitcher/documentswitchertreeview.cpp index a690e1a8ca..8d55767ac3 100644 --- a/plugins/documentswitcher/documentswitchertreeview.cpp +++ b/plugins/documentswitcher/documentswitchertreeview.cpp @@ -38,7 +38,12 @@ DocumentSwitcherTreeView::DocumentSwitcherTreeView(DocumentSwitcherPlugin* plugi void DocumentSwitcherTreeView::keyPressEvent(QKeyEvent* event) { - QTreeView::keyPressEvent(event); + if (event->key() == Qt::Key_Escape) { + event->accept(); + hide(); + } else { + QTreeView::keyPressEvent(event); + } } void DocumentSwitcherTreeView::keyReleaseEvent(QKeyEvent* event) diff --git a/plugins/documentswitcher/kdevdocumentswitcher.json b/plugins/documentswitcher/kdevdocumentswitcher.json index 77f8cfd940..9b4d660d2b 100644 --- a/plugins/documentswitcher/kdevdocumentswitcher.json +++ b/plugins/documentswitcher/kdevdocumentswitcher.json @@ -10,13 +10,19 @@ "Description": "A most-recently-used document switcher for KDevPlatform.", "Description[ca@valencia]": "Un commutador del document usat més recentment per KDevPlatform.", "Description[ca]": "Un commutador del document usat més recentment per KDevPlatform.", + "Description[cs]": "Přepínač nedávno použitých dokumentů pro KDevPlatform", + "Description[de]": "Ein Umschalter zwischen zuletzt geöffneten Dokumenten für KDevPlatform.", "Description[es]": "Un cambiador de documentos recientemente usados para KDevPlatform.", + "Description[et]": "KDevPlatformi viimati kasutatud dokumentide vahetaja", "Description[fr]": "Un changeur de document dernièrement utilisé pour KDevPlatform.", + "Description[gl]": "Un selector entre documentos empregados recentemente para KDevPlatform.", "Description[it]": "Uno scambia documento utilizzato più di recente per KDevPlatform.", "Description[nl]": "De meest-recent-gebruikte documentwisselaar voor KDevPlatform.", "Description[pl]": "Przełączanie między ostatnio używanymi dokumentacji w KDevPlatform.", "Description[pt]": "Um selector dos documentos usados mais recentemente para o KDevPlatform.", + "Description[pt_BR]": "Um seletor dos documentos mais recentes para o KDevPlatform.", "Description[sk]": "Prepínač posledných použitých dokumentov pre KDevPlatform.", + "Description[sl]": "Vstavek za preklapljanje med nazadnje uporabljenimi dokumenti.", "Description[sv]": "Byte till senast använda dokument för KDevelop-plattformen.", "Description[tr]": "KDevPlatform için en-son-kullanılan belge seçici bir eklenti.", "Description[uk]": "Перемикач останніх використаних документів для KDevPlatform.", @@ -28,14 +34,21 @@ "Name": "Most-Recently-Used Document Switcher", "Name[ca@valencia]": "Commutador del document usat més recentment", "Name[ca]": "Commutador del document usat més recentment", + "Name[cs]": "Přepínač nedávno používaných dokumentů ", + "Name[de]": "Zuletzt-Verwendet-Dokumentumschalter", "Name[es]": "Selector de documentos usados recientemente", + "Name[et]": "Viimati kasutatud dokumentide vahetaja", "Name[fr]": "Commutateur de documents parmi les plus récemment utilisés", + "Name[gl]": "Selector entre documentos empregados recentemente", "Name[it]": "Scambia documento utilizzato più di recente", "Name[nb]": "Sist-brukte dokumentbytter", "Name[nl]": "Meest-recent-gebruikte documentwisselaar", "Name[pl]": "Przełączanie między ostatnio używanymi dokumentami", "Name[pt]": "Selector dos Documentos Usados Mais Recentemente", + "Name[pt_BR]": "Seletor dos documentos usados mais recentemente", + "Name[ru]": "Переключатель недавних документов", "Name[sk]": "Prepínač posledných použitých dokumentov", + "Name[sl]": "Preklapljanje med nazadnje uporabljenimi dokumenti", "Name[sv]": "Byte till senast använda dokument", "Name[tr]": "Yakın Zamanda En Çok Kullanılan Belgeleri Seçici", "Name[uk]": "Перемикач нещодавно використаних документів", diff --git a/plugins/documentview/kdevdocumentview.json b/plugins/documentview/kdevdocumentview.json index c5cfe56e0c..726e71e8e9 100644 --- a/plugins/documentview/kdevdocumentview.json +++ b/plugins/documentview/kdevdocumentview.json @@ -10,13 +10,19 @@ "Description": "This plugin displays a graphical view of all documents currently loaded and separates them by mimetype.", "Description[ca@valencia]": "Este connector mostra una visualització gràfica de tots els documents carregats actualment, separats per tipus MIME.", "Description[ca]": "Aquest connector mostra una visualització gràfica de tots els documents carregats actualment, separats per tipus MIME.", + "Description[cs]": "Tento zásuvný modul zobrazuje grafický pohled všech aktuálně načtených dokumentů a odděluje je podle typu MIME.", + "Description[de]": "Dieses Modul zeigt alle aktuell geladenen Dokumente getrennt nach ihren MIME-Typen an.", "Description[es]": "Este complemento muestra una vista gráfica de todos los documentos actualmente cargados y los separa por su tipo MIME.", + "Description[et]": "See plugin näitab graafiliselt kõiki laaditud dokumente ja eraldab need MIME tüübi alusel.", "Description[fr]": "Ce module affiche une vue graphique de tous les documents actuellement chargés et les sépare par type MIME.", + "Description[gl]": "Este complemento mostra unha vista gráfica de todos os documentos que están cargados e sepáraos segundo o seu tipo mime.", "Description[it]": "Questa estensione mostra una vista grafica di tutti i documenti attualmente caricati e li separa per il tipo MIME.", "Description[nl]": "Deze plugin toont een grafische voorstelling van alle nu geladen documenten en scheidt deze door het mimetype.", "Description[pl]": "Ta wtyczka udostępnia graficzny widok wszystkich obecnie wczytanych dokumentów i dzieli je według typu MIME.", "Description[pt]": "Este 'plugin' mostra uma vista gráfica sobre todos os documentos abertos de momento e separa-os pelo seu tipo MIME.", + "Description[pt_BR]": "Este plugin mostra uma vista gráfica sobre todos os documentos carregados no momento e separa-os por tipo MIME.", "Description[sk]": "Tento plugin zobrazí grafický pohľad všetkých dokumentov aktuálne načítaných a rozdelí ich podľa mimetype.", + "Description[sl]": "Ta vstavek prikazuje vse trenutno naložene dokumente in jih ločuje glede na vrsto MIME.", "Description[sv]": "Insticksprogrammet visar en grafisk vy av alla dokument som för närvarande har laddats och delar upp dem enligt Mime-typ.", "Description[tr]": "Bu eklenti o anda yüklenmiş olan tüm belgeleri grafiksel bir görünümde gösterir ve mime türlerine göre ayırır.", "Description[uk]": "Цей додаток відображає у графічному вигляді всі відкриті документи і впорядковує їх за типом MIME.", @@ -32,11 +38,13 @@ "Name[de]": "Dokumentansicht", "Name[es]": "Vista de documento", "Name[fr]": "Vue Document", + "Name[gl]": "Vista do documento", "Name[it]": "Vista documento", "Name[nb]": "Dokumentvisning", "Name[nl]": "Documentweergave", "Name[pl]": "Widok dokumentu", "Name[pt]": "Área de Documentos", + "Name[ru]": "Панель документов", "Name[sk]": "Pohľad na dokumenty", "Name[sv]": "Dokumentvisning", "Name[tr]": "Belge Görünümü", diff --git a/plugins/documentview/settings/kcm_documentview_settings.desktop b/plugins/documentview/settings/kcm_documentview_settings.desktop index 11c537174c..14cea6282a 100644 --- a/plugins/documentview/settings/kcm_documentview_settings.desktop +++ b/plugins/documentview/settings/kcm_documentview_settings.desktop @@ -11,32 +11,43 @@ X-KDE-ParentComponents=kdevelop X-KDE-CfgDlgHierarchy=CORE Name=Document View +Name[bg]=Изглед за документи +Name[bs]=Pregled Dokumenta Name[ca]=Visor de document Name[ca@valencia]=Visor de document Name[cs]=Pohled na dokumenty Name[de]=Dokumentansicht +Name[en_GB]=Document View Name[es]=Vista de documento Name[fr]=Vue Document Name[ga]=Amharc Cáipéise +Name[gl]=Vista do documento Name[it]=Vista documento +Name[kk]=Құжат көрінісі Name[nb]=Dokumentvisning Name[nds]=Dokmenten-Ansicht Name[nl]=Documentweergave Name[pl]=Widok dokumentu Name[pt]=Área de Documentos +Name[pt_BR]=Área de documentos +Name[ru]=Панель документов Name[sk]=Pohľad na dokumenty +Name[sl]=Prikaz dokumentov Name[sv]=Dokumentvisning Name[tr]=Belge Görünümü +Name[ug]=پۈتۈك كۆرۈنۈشى Name[uk]=Перегляд документів Name[x-test]=xxDocument Viewxx Name[zh_CN]=文档视图 Name[zh_TW]=文件檢視 Comment=Configure Document View settings +Comment[bg]=Настройки на изгледа за документи Comment[ca]=Configura els arranjaments del visor de document Comment[ca@valencia]=Configura els arranjaments del visor de document Comment[cs]=Upravit nastavení zobrazení dokumentu Comment[de]=Einstellungen für Dokumentansicht Comment[el]=Ρύθμιση επιλογών προβολής εγγράφου +Comment[en_GB]=Configure Document View settings Comment[es]=Configurar las preferencias de la vista de documento Comment[et]=Dokumendivaate valikute seadistamine Comment[fr]=Configurer les paramètres de la vue Document @@ -52,6 +63,7 @@ Comment[ne]=कागजात दृश्य सेटिङ कन्फि Comment[nl]=Documentweergave-instellingen configureren Comment[pl]=Przeglądarka dokumentacji: konfiguracja Comment[pt]=Configurar as opções da Área de Documentos +Comment[pt_BR]=Configurar as opções da área de documentos Comment[sk]=Nastaviť možnosti zobrazenia dokumentov Comment[sv]=Anpassa inställningar av dokumentvisning Comment[tr]=Belge Görünümü Ayarlarını Yapılandır diff --git a/plugins/execute/kdevexecute.json b/plugins/execute/kdevexecute.json index 9ec1a2a4ea..7ceeca998c 100644 --- a/plugins/execute/kdevexecute.json +++ b/plugins/execute/kdevexecute.json @@ -10,13 +10,19 @@ "Description": "This plugin allows running of programs with no instrumentor, ie. natively by the current host.", "Description[ca@valencia]": "Este connector permet executar programes sense «instrumentor», és a dir, nativament per a la màquina actual.", "Description[ca]": "Aquest connector permet executar programes sense «instrumentor», és a dir, nativament per a la màquina actual.", + "Description[cs]": "Tento zásuvný modul umožňuje běh programů bez jakéhokoliv prostředníka, takže běží přirozeně na současném hostiteli.", + "Description[de]": "Dieses Modul erlaubt das Ausführen von Programmen im Kontext des Betriebssystems.", "Description[es]": "Este complemento permite ejecutar programas sin instrumentador (es decir, de forma nativa) en la máquina actual.", + "Description[et]": "See plugin võimaldab panna programme aktiivses masinas tööle ilma instrumentaatorita, s.t loomulikult.", "Description[fr]": "Ce module permet d'exécuter des programmes sans instrumentation, c'est-à-dire de manière native sur l'hôte courant.", + "Description[gl]": "Este complemento permite executar programas sen instrumentador, i.e. de xeito nativo na máquina actual.", "Description[it]": "Questa estensione permette l'esecuzione dei programmi senza instrumentor, vale a dire nativamente da parte dell'host attuale.", "Description[nl]": "Deze plugin staat het uitvoeren van programma's toe zonder hulpprogramma, dwz. van nature op de huidige host.", "Description[pl]": "Wtyczka ta pozwala na uruchamianie programów bez instrumentora, np. natywnie przez obecnego hosta.", "Description[pt]": "Este 'plugin' permite a execução de programas sem instrumentação, i.e. nativamente na máquina-anfitriã actual.", + "Description[pt_BR]": "Este plugin permite executar programas sem orquestrador, ou seja, nativamente pelo computador hospedeiro.", "Description[sk]": "Tento plugin umožňuje spustenie programov bez inštrumentora, teda natívne aktuálnym hostiteľom.", + "Description[sl]": "Vstavek omogoča zaganjanje programov, za katere v KDevelop ni posebnega grafičnega vmesnika.", "Description[sv]": "Insticksprogrammet tillåter att program utan instrumentering körs, dvs. direkt av nuvarande värddator.", "Description[tr]": "Bu eklenti programların ek araç olmadan çalıştırılabilmesini sağlar, örn. mevcut istemci ile doğal olarak.", "Description[uk]": "За допомогою цього додатка можна запускати програми безпосередньо на поточному вузлі.", @@ -29,14 +35,20 @@ "Name[ca@valencia]": "Executa programes", "Name[ca]": "Executa programes", "Name[cs]": "Spustit programy", + "Name[de]": "Programme ausführen", "Name[es]": "Ejecutar programas", + "Name[et]": "Programmide täitmine", "Name[fr]": "Exécuter des programmes", + "Name[gl]": "Executar programas", "Name[it]": "Esegui i programmi", "Name[nb]": "Kjør programmer", "Name[nl]": "Programma's uitvoeren", "Name[pl]": "Wykonaj programy", "Name[pt]": "Execução de Programas", + "Name[pt_BR]": "Executar programas", + "Name[ru]": "Запуск программ", "Name[sk]": "Spustiť programy", + "Name[sl]": "Izvedi programe", "Name[sv]": "Kör program", "Name[tr]": "Uygulamaları Çalıştır", "Name[uk]": "Виконання програм", diff --git a/plugins/executescript/kdevexecutescript.json b/plugins/executescript/kdevexecutescript.json index 065baee0ab..35f8eeac99 100644 --- a/plugins/executescript/kdevexecutescript.json +++ b/plugins/executescript/kdevexecutescript.json @@ -9,13 +9,19 @@ "Description": "This plugin allows running of scripts.", "Description[ca@valencia]": "Este connector permet executar scripts.", "Description[ca]": "Aquest connector permet executar scripts.", + "Description[cs]": "Tento modul umožňuje spouštění skriptů.", + "Description[de]": "Dieses Modul ermöglicht das Ausführen von Skripten.", "Description[es]": "Este complemento permite la ejecución de scripts.", + "Description[et]": "See plugin võimaldab käivitada skripte.", "Description[fr]": "Ce module permet d'exécuter des scripts.", + "Description[gl]": "Este complemento permite a execución de scripts.", "Description[it]": "Questa estensione permette l'esecuzione degli script.", "Description[nl]": "Deze plugin staat het uitvoeren van scripts toe.", "Description[pl]": "Wtyczka ta pozwala na uruchamianie skryptów.", "Description[pt]": "Este 'plugin' permite a execução de programas.", + "Description[pt_BR]": "Este plugin permite a execução de scripts.", "Description[sk]": "Tento plugin povoľuje spúšťanie skriptov.", + "Description[sl]": "Ta vstavek omogoča zaganjanje skript.", "Description[sv]": "Insticksprogrammet gör det möjligt att köra skript.", "Description[tr]": "Bu eklenti betiklerin çalıştırılmasını sağlar.", "Description[uk]": "За допомогою цього додатка можна запускати скрипти.", @@ -28,14 +34,20 @@ "Name[ca@valencia]": "Executa scripts", "Name[ca]": "Executa scripts", "Name[cs]": "Spustit skripty", + "Name[de]": "Skripte ausführen", "Name[es]": "Ejecutar scripts", + "Name[et]": "Skriptide käivitamine", "Name[fr]": "Exécution de scripts", + "Name[gl]": "Executar scripts", "Name[it]": "Esegui script", "Name[nb]": "Kjør skripter", "Name[nl]": "Scripts uitvoeren", "Name[pl]": "Wykonaj skrypty", "Name[pt]": "Executar Programas", + "Name[pt_BR]": "Executar scripts", + "Name[ru]": "Запуск сценариев", "Name[sk]": "Spustiť skripty", + "Name[sl]": "Izvedi skripte", "Name[sv]": "Kör skript", "Name[tr]": "Betikleri Çalıştır", "Name[uk]": "Виконання скриптів", diff --git a/plugins/externalscript/kdevexternalscript.json b/plugins/externalscript/kdevexternalscript.json index 271c5996de..0402b09066 100644 --- a/plugins/externalscript/kdevexternalscript.json +++ b/plugins/externalscript/kdevexternalscript.json @@ -10,13 +10,19 @@ "Description": "Run external scripts or applications to manipulate the editor contents or do other arbitrary actions.", "Description[ca@valencia]": "Executa scripts externs o aplicacions per a manipular el contingut de l'editor o altres accions arbitràries.", "Description[ca]": "Executa scripts externs o aplicacions per a manipular el contingut de l'editor o altres accions arbitràries.", + "Description[cs]": "Spouštějte externí skripty nebo aplikace a pracujte s obsahem editoru nebo dělejte jiné libovolné akce.", + "Description[de]": "Führen Sie externe Skripte oder Programme zum Verändern des Editorinhalts oder für beliebige andere Aktionen aus.", "Description[es]": "Ejecutar scripts externos o aplicaciones para manipular el contenido del editor o realizar otras acciones.", + "Description[et]": "Välised skriptid või rakendused, mis võimaldavad muuta redaktori sisu või ette võtta mingeid muid toiminguid.", "Description[fr]": "Exécuter des scripts externes ou des applications pour manipuler les contenus de l'éditeur ou autres actions arbitraires.", + "Description[gl]": "Executa scripts externos ou aplicativos para manipular os contidos do editor ou levar a cabo outras accións.", "Description[it]": "Avvia script o applicazioni esterne per manipolare il contenuto dell'editor o per eseguire altre azioni.", "Description[nl]": "Externe scripts of programma's uitvoeren om de inhoud van de bewerker te manipuleren of andere acties uit te voeren.", "Description[pl]": "Uruchamiaj zewnętrzne skrypty lub programy, aby manipulować zawartością edytora lub innymi dowolnymi działaniami.", "Description[pt]": "Executa programas ou aplicações externas para manipular o conteúdo do editor ou para efectuar outras acções arbitrárias.", + "Description[pt_BR]": "Execute scripts externos ou aplicativos para manipular os conteúdos do editor ou para fazer outras ações ordinárias.", "Description[sk]": "Spustí externé skripty alebo aplikácie na manipuláciu s obsahom editora alebo robí iné ľubovoľné akcie.", + "Description[sl]": "Zaganjajte zunanje skripte ali programe, ki upravljajo z vsebino urejevalnika ali pa opravljajo druga poljubna dejanja.", "Description[sv]": "Kör externa skript eller program för att behandla editorns innehåll eller utför andra godtyckliga åtgärder.", "Description[tr]": "Düzenleyici içeriğini değiştirmek veya diğer keyfi eylemler için dış betikler veya uygulamalar çalıştır.", "Description[uk]": "Запускає зовнішні скрипти або програми для обробки текстових даних редактора або виконання інших потрібних дій.", @@ -29,14 +35,20 @@ "Name[ca@valencia]": "Scripts externs", "Name[ca]": "Scripts externs", "Name[cs]": "Externí skripty", + "Name[de]": "Externe Skripte", "Name[es]": "Scripts externos", + "Name[et]": "Välised skriptid", "Name[fr]": "Scripts externes", + "Name[gl]": "Scripts externos", "Name[it]": "Script esterni", "Name[nb]": "Eksterne skripter", "Name[nl]": "Externe scripts", "Name[pl]": "Zewnętrzne skrypty", "Name[pt]": "Programas Externos", + "Name[pt_BR]": "Scripts externos", + "Name[ru]": "Внешние сценарии", "Name[sk]": "Externé skripty", + "Name[sl]": "Zunanji skripti", "Name[sv]": "Externa skript", "Name[tr]": "Dış Betikler", "Name[uk]": "Зовнішні скрипти", diff --git a/plugins/filemanager/kdevfilemanager.json b/plugins/filemanager/kdevfilemanager.json index 951be516aa..953b98c7e5 100644 --- a/plugins/filemanager/kdevfilemanager.json +++ b/plugins/filemanager/kdevfilemanager.json @@ -12,12 +12,16 @@ "Description[ca@valencia]": "Este connector proporciona un gestor de fitxers al KDevelop.", "Description[ca]": "Aquest connector proporciona un gestor de fitxers al KDevelop.", "Description[cs]": "Tento modul do KDevelop přináší správce souborů.", + "Description[de]": "Diese Modul fügt eine Dateiverwaltung zu KDevelop hinzu.", "Description[es]": "Este complemento proporciona un gestor de archivos a KDevelop.", + "Description[et]": "See plugin võimaldab kasutada KDevelopis failihaldurit.", "Description[fr]": "Ce module apporte un gestionnaire de fichiers à KDevelop", + "Description[gl]": "Este complemento incorpora un xestor de ficheiros no KDevelop.", "Description[it]": "Questa estensione porta un gestore di file in KDevelop.", "Description[nl]": "Deze plugin brengt een bestandsbeheerder in KDevelop.", "Description[pl]": "Ta wtyczka udostępnia zarządzanie plikami w KDevelopie.", "Description[pt]": "Este 'plugin' traz um gestor de ficheiros para o KDevelop.", + "Description[pt_BR]": "Este plugin provê um gerenciador de arquivos ao KDevelop.", "Description[sk]": "Tento plugin prináša správcu súborov do KDevelop.", "Description[sv]": "Insticksprogrammet integrerar en filhanterare i KDevelop.", "Description[tr]": "Bu eklenti KDevelop için bir dosya yöneticisi sağlar.", @@ -30,14 +34,17 @@ "Name": "KDE File Manager Integration", "Name[ca@valencia]": "Integració del gestor de fitxers del KDE", "Name[ca]": "Integració del gestor de fitxers del KDE", + "Name[cs]": "Integrace správce souborů pro KDE", "Name[de]": "Integration der KDE-Dateiverwaltung", "Name[es]": "Integración del gestor de archivos de KDE", "Name[fr]": "Intégration du gestionnaire de fichiers de KDE", + "Name[gl]": "Integración co xestor de ficheiros de KDE", "Name[it]": "Integrazione gestore di file di KDE", "Name[nb]": "Integrasjon med KDE filbehandler", "Name[nl]": "KDE Bestandsbeheerder-integratie", "Name[pl]": "Integracja zarządzania plikami KDE", "Name[pt]": "Integração com o Gestor de Ficheiros do KDE", + "Name[ru]": "Интеграция файлового менеджера KDE", "Name[sk]": "Integrácia správcu súborov KDE", "Name[sv]": "Integrering av KDE:s filhanterare", "Name[tr]": "KDE Dosya Yöneticisi Bütünleşmesi", diff --git a/plugins/filetemplates/kdevfiletemplates.json b/plugins/filetemplates/kdevfiletemplates.json index c87e4b1f63..fc3b485f3b 100644 --- a/plugins/filetemplates/kdevfiletemplates.json +++ b/plugins/filetemplates/kdevfiletemplates.json @@ -11,13 +11,19 @@ "Description": "Manages templates for source files", "Description[ca@valencia]": "Gestiona les plantilles dels fitxers de codi font", "Description[ca]": "Gestiona les plantilles dels fitxers de codi font", + "Description[cs]": "Spravuje šablony pro zdrojové soubory", + "Description[de]": "Verwaltung von Vorlagen für Quelltextdateien", "Description[es]": "Gestiona plantillas para archivos de código fuente", + "Description[et]": "Lähtekoodi failide mallide haldamine", "Description[fr]": "Gère les modèles de fichiers sources", + "Description[gl]": "Xestiona modelos para os ficheiros de fonte", "Description[it]": "Gestisce i modelli per i file sorgente", "Description[nl]": "Beheert sjablonen voor broncodebestanden", "Description[pl]": "Zarządza szablonami dla plików źródłowych", "Description[pt]": "Gere os modelos de ficheiros de código", + "Description[pt_BR]": "Gerencia os modelos dos arquivos de código", "Description[sk]": "Spravuje šablóny pre zdrojové súbory", + "Description[sl]": "Upravlja predloge za datoteke z izvorno kodo", "Description[sv]": "Hanterar mallar för källkodsfiler", "Description[tr]": "Kaynak dosyaları için şablonları yönetir", "Description[uk]": "Керування шаблонами для початкових файлів коду", @@ -29,14 +35,21 @@ "Name": "File Templates Configuration", "Name[ca@valencia]": "Configuració de les plantilles de fitxer", "Name[ca]": "Configuració de les plantilles de fitxer", + "Name[cs]": "Nastavení šablon souborů", + "Name[de]": "Einrichtung der Dateivorlagen", "Name[es]": "Configuración de plantillas de archivos", + "Name[et]": "Failimallide seadistamine", "Name[fr]": "Configuration des modèles de fichiers", + "Name[gl]": "Configuración dos modelos de ficheiros", "Name[it]": "Configurazione dei file dei modelli", "Name[nb]": "Oppsett av fil-maler", "Name[nl]": "Configuratie van sjabloonbestanden", "Name[pl]": "Ustawienia szablonów plików", "Name[pt]": "Configuração dos Modelos de Ficheiros", + "Name[pt_BR]": "Configuração dos modelos de arquivos", + "Name[ru]": "Настройка шаблонов файлов", "Name[sk]": "Nastavenie šablón súborov", + "Name[sl]": "Nastavitev predlog dokumentov", "Name[sv]": "Inställning av filmallar", "Name[tr]": "Dosya Şablon Yapılandırması", "Name[uk]": "Налаштовування шаблонів файлів", diff --git a/plugins/filetemplates/kdevfiletemplates.knsrc b/plugins/filetemplates/kdevfiletemplates.knsrc index c213265aca..1a8249e4bb 100644 --- a/plugins/filetemplates/kdevfiletemplates.knsrc +++ b/plugins/filetemplates/kdevfiletemplates.knsrc @@ -3,12 +3,16 @@ Name=File Templates (SDK) Name[ca]=Plantilles de fitxer (SDK) Name[ca@valencia]=Plantilles de fitxer (SDK) Name[cs]=Šablony souborů (SDK) +Name[de]=Dateivorlagen (SDK) +Name[en_GB]=File Templates (SDK) Name[es]=Plantillas de archivos (SDK) +Name[fr]=Modèles de fichiers (SDK) Name[it]=Modelli di file (SDK) Name[nl]=Bestandssjablonen (SDK) Name[pl]=Szablony plików (SDK) Name[pt]=Modelos de Ficheiros (SDK) Name[sk]=Súborové šablóny (SDK) +Name[sl]=Predloge datotek (SDK) Name[sv]=Filmallar (SDK) Name[tr]=Dosya Şablonları (SDK) Name[uk]=Шаблони файлів (SDK) diff --git a/plugins/flatpak/flatpak-template/flatpak-builder-manifest.desktop b/plugins/flatpak/flatpak-template/flatpak-builder-manifest.desktop index be89b6ac02..a05b489537 100644 --- a/plugins/flatpak/flatpak-template/flatpak-builder-manifest.desktop +++ b/plugins/flatpak/flatpak-template/flatpak-builder-manifest.desktop @@ -2,7 +2,9 @@ Name=Flatpak Builder Manifest Name[ca]=Manifest del constructor Flatpak Name[ca@valencia]=Manifest del constructor Flatpak +Name[en_GB]=Flatpak Builder Manifest Name[es]=Manifiesto de construcción de Flatpak +Name[fr]=Manifest de construction Flatpak Name[it]=Manifesto di Flatpak Builder Name[nl]=Flatpak Builder Manifest Name[pl]=Manifest budowniczego Flatpak @@ -16,7 +18,9 @@ Name[zh_CN]=Flatpak 构建器清单文件 Comment=A file to configure how a project is built by flatpak Comment[ca]=Un fitxer per a configurar com serà construït un projecte per Flatpak Comment[ca@valencia]=Un fitxer per a configurar com serà construït un projecte per Flatpak +Comment[en_GB]=A file to configure how a project is built by flatpak Comment[es]=Un archivo para configurar cómo construye flatpak un proyecto +Comment[fr]=Un fichier pour configurer comment un projet est construit par Flatpak Comment[it]=Un file per configurare come il progetto viene generato da flatpak Comment[nl]=Een bestand om te configureren hoe een project wordt gebouwd door flatpak Comment[pl]=Plik do ustawienia sposobu budowania przez flatpak @@ -32,6 +36,8 @@ Language=JSON Language[ca]=JSON Language[ca@valencia]=JSON Language[cs]=JSON +Language[de]=JSON +Language[en_GB]=JSON Language[es]=JSON Language[fr]=JSON Language[it]=JSON diff --git a/plugins/flatpak/flatpakplugin.cpp b/plugins/flatpak/flatpakplugin.cpp index 4a1ebf1e81..32d2fed368 100644 --- a/plugins/flatpak/flatpakplugin.cpp +++ b/plugins/flatpak/flatpakplugin.cpp @@ -164,7 +164,7 @@ KDevelop::ContextMenuExtension FlatpakPlugin::contextMenuExtension(KDevelop::Con } } - const QRegularExpression nameRx(".*\\..*\\.*.json$"); + const QRegularExpression nameRx(".*\\..*\\..*\\.json$"); for(auto it = urls.begin(); it != urls.end(); ) { if (it->isLocalFile() && it->path().contains(nameRx)) { ++it; diff --git a/plugins/flatpak/kdevflatpak.json b/plugins/flatpak/kdevflatpak.json index 0574ecae18..092c818744 100644 --- a/plugins/flatpak/kdevflatpak.json +++ b/plugins/flatpak/kdevflatpak.json @@ -13,6 +13,7 @@ "Description[ca@valencia]": "Exposa el temps d'execució del Flatpak", "Description[ca]": "Exposa el temps d'execució del Flatpak", "Description[es]": "Expone bibliotecas en tiempo de ejecución de Flatpak", + "Description[fr]": "Expose les exécutifs Flatpak", "Description[it]": "Espone i runtime di Flatpak", "Description[nl]": "Toont Flatpak runtimes", "Description[pl]": "Udostępnia biblioteki uruchomieniowe Flatpak", @@ -23,13 +24,16 @@ "Description[uk]": "Надає доступ до середовищ виконання Flatpak", "Description[x-test]": "xxExposes Flatpak runtimesxx", "Description[zh_CN]": "暴露 Flatpak 运行时", - "Icon": "flatpak", + "Icon": "kdevelop", "Id": "kdevflatpak", "License": "GPL", "Name": "Flatpak Support", "Name[ca@valencia]": "Implementació del Flatpak", "Name[ca]": "Implementació del Flatpak", + "Name[cs]": "Podpora pro Flatpak", + "Name[de]": "Flatpak-Unterstützung", "Name[es]": "Implementación de Flatpak", + "Name[fr]": "Prise en charge de Flatpak", "Name[it]": "Supporto per Flatpak", "Name[nl]": "Ondersteuning van Flatpak", "Name[pl]": "Obsługa Flatpak", diff --git a/plugins/gdb/gdb.cpp b/plugins/gdb/gdb.cpp index 2d86d3b831..993e657167 100644 --- a/plugins/gdb/gdb.cpp +++ b/plugins/gdb/gdb.cpp @@ -52,10 +52,10 @@ bool GdbDebugger::start(KConfigGroup& config, const QStringList& extraArguments) // FIXME: verify that default value leads to something sensible QUrl gdbUrl = config.readEntry(Config::GdbPathEntry, QUrl()); if (gdbUrl.isEmpty()) { - debuggerExecutable_ = QStringLiteral("gdb"); + m_debuggerExecutable = QStringLiteral("gdb"); } else { // FIXME: verify its' a local path. - debuggerExecutable_ = gdbUrl.url(QUrl::PreferLocalFile | QUrl::StripTrailingSlash); + m_debuggerExecutable = gdbUrl.url(QUrl::PreferLocalFile | QUrl::StripTrailingSlash); } QStringList arguments = extraArguments; @@ -80,19 +80,19 @@ bool GdbDebugger::start(KConfigGroup& config, const QStringList& extraArguments) return false; } - arguments.insert(0, debuggerExecutable_); + arguments.insert(0, m_debuggerExecutable); arguments.insert(0, shell.toLocalFile()); - process_->setShellCommand(KShell::joinArgs(arguments)); + m_process->setShellCommand(KShell::joinArgs(arguments)); } else { - process_->setProgram(debuggerExecutable_, arguments); + m_process->setProgram(m_debuggerExecutable, arguments); } - process_->start(); + m_process->start(); - qCDebug(DEBUGGERGDB) << "Starting GDB with command" << shell.toLocalFile() + QLatin1Char(' ') + debuggerExecutable_ + qCDebug(DEBUGGERGDB) << "Starting GDB with command" << shell.toLocalFile() + QLatin1Char(' ') + m_debuggerExecutable + QLatin1Char(' ') + arguments.join(QLatin1Char(' ')); - qCDebug(DEBUGGERGDB) << "GDB process pid:" << process_->pid(); - emit userCommandOutput(shell.toLocalFile() + QLatin1Char(' ') + debuggerExecutable_ + qCDebug(DEBUGGERGDB) << "GDB process pid:" << m_process->pid(); + emit userCommandOutput(shell.toLocalFile() + QLatin1Char(' ') + m_debuggerExecutable + QLatin1Char(' ') + arguments.join(QLatin1Char(' ')) + QLatin1Char('\n')); return true; } diff --git a/plugins/gdb/kdevgdb.json b/plugins/gdb/kdevgdb.json index b5c4253dd7..29f9575b6e 100644 --- a/plugins/gdb/kdevgdb.json +++ b/plugins/gdb/kdevgdb.json @@ -22,7 +22,7 @@ "Description[uk]": "Цей додаток надає можливість користуватися клієнтським інтерфейсом GDB, зневадника вихідного коду на C, C++ тощо.", "Description[x-test]": "xxThis plugin provides a frontend for GDB, a source-level debugger for C, C++ and more.xx", "Description[zh_CN]": "此插件提供了 GDB 前端,GDB 是一个源码级的 C、C++ 等多语言的调试器。", - "Icon": "debugger", + "Icon": "kdevelop", "Id": "kdevgdb", "License": "GPL", "Name": "GDB Support", @@ -37,6 +37,7 @@ "Name[gl]": "Compatibilidade con GDB", "Name[it]": "Supporto per GDB", "Name[nl]": "Ondersteuning voor GDB", + "Name[nn]": "GDB-støtte", "Name[pl]": "Obsługa GDB", "Name[pt]": "Suporte para o GDB", "Name[pt_BR]": "Suporte ao GDB", diff --git a/plugins/gdb/unittests/test_gdb.cpp b/plugins/gdb/unittests/test_gdb.cpp index fe9872dd3c..c8a7ddfc1b 100644 --- a/plugins/gdb/unittests/test_gdb.cpp +++ b/plugins/gdb/unittests/test_gdb.cpp @@ -1041,14 +1041,14 @@ void GdbTest::testCoreFile() + findExecutable(QStringLiteral("debuggee_crash")).toLocalFile(); debugeeProcess.start(); debugeeProcess.waitForFinished(); - qDebug() << debugeeProcess.readAll(); + qDebug() << "Debuggee output:\n" << debugeeProcess.readAll(); bool coreFileFound = f.exists(); if (!coreFileFound) { // Try to use coredumpctl auto coredumpctl = QStandardPaths::findExecutable(QStringLiteral("coredumpctl")); if (!coredumpctl.isEmpty()) { - KProcess::execute(coredumpctl, {"-1", "-o", f.absoluteFilePath(), "dump", "debuggee_crash"}); + KProcess::execute(coredumpctl, {"-1", "-o", f.absoluteFilePath(), "dump", "debuggee_crash"}, 5000); coreFileFound = f.exists(); } } @@ -2044,7 +2044,6 @@ void GdbTest::testDebugInExternalTerminal() // see: https://bugs.kde.org/show_bug.cgi?id=339231 void GdbTest::testPathWithSpace() { -#ifdef HAVE_PATH_WITH_SPACES_TEST TestDebugSession* session = new TestDebugSession; auto debugee = findExecutable(QStringLiteral("path with space/debuggee_spacedebugee")); @@ -2057,7 +2056,6 @@ void GdbTest::testPathWithSpace() QCOMPARE(b->state(), KDevelop::Breakpoint::CleanState); session->run(); WAIT_FOR_STATE(session, DebugSession::EndedState); -#endif } bool GdbTest::waitForState(DebugSession *session, DebugSession::DebuggerState state, diff --git a/plugins/gdb/unittests/test_gdbprinters.cpp b/plugins/gdb/unittests/test_gdbprinters.cpp index 8f760d665b..bae2fa1998 100644 --- a/plugins/gdb/unittests/test_gdbprinters.cpp +++ b/plugins/gdb/unittests/test_gdbprinters.cpp @@ -102,9 +102,9 @@ void QtPrintersTest::testQString() GdbProcess gdb(QStringLiteral("debuggee_qstring")); gdb.execute("break qstring.cpp:5"); gdb.execute("run"); - QVERIFY(gdb.execute("print s").contains("\"test string\"")); + QVERIFY(gdb.execute("print s").contains("\"test最后一个不是特殊字符'\\\"\\\\u6211\"")); gdb.execute("next"); - QVERIFY(gdb.execute("print s").contains("\"test stringx\"")); + QVERIFY(gdb.execute("print s").contains("\"test最后一个不是特殊字符'\\\"\\\\u6211x\"")); } void QtPrintersTest::testQByteArray() @@ -113,11 +113,14 @@ void QtPrintersTest::testQByteArray() gdb.execute("break qbytearray.cpp:5"); gdb.execute("run"); QByteArray out = gdb.execute("print ba"); - QVERIFY(out.contains("\"test byte array\"")); - QVERIFY(out.contains("[0] = 116 't'")); - QVERIFY(out.contains("[4] = 32 ' '")); + qDebug() << out; + QVERIFY(out.contains("\"\xE6\x98\xAF'\\\"\\\\u6211\"")); + QVERIFY(out.contains("[0] = -26 '\\346'")); + QVERIFY(out.contains("[3] = 39 '\\''")); + QVERIFY(out.contains("[4] = 34 '\"'")); gdb.execute("next"); - QVERIFY(gdb.execute("print ba").contains("\"test byte arrayx\"")); + out = gdb.execute("print ba"); + QVERIFY(out.contains("\"\xE6\x98\xAF'\\\"\\\\u6211x\"")); } void QtPrintersTest::testQListContainer_data() diff --git a/plugins/genericprojectmanager/kdevgenericmanager.json b/plugins/genericprojectmanager/kdevgenericmanager.json index 6732e4fb45..497f13669a 100644 --- a/plugins/genericprojectmanager/kdevgenericmanager.json +++ b/plugins/genericprojectmanager/kdevgenericmanager.json @@ -10,9 +10,11 @@ "Description": "Allow KDevelop to manage generic projects", "Description[ca@valencia]": "Permet al KDevelop gestionar projectes genèrics", "Description[ca]": "Permet al KDevelop gestionar projectes genèrics", + "Description[cs]": "Umožní KDevelopu spravovat obecné projekty", "Description[de]": "Zum Verwalten allgemeiner Projekte in KDevelop", "Description[es]": "Permite que KDevelop gestione proyectos genéricos", "Description[fr]": "Permet à KDevelop de gérer des projets génériques", + "Description[gl]": "Permítelle a KDevelop xestionar proxectos xenéricos", "Description[it]": "Permette a KDevelop di gestire progetti generici", "Description[nl]": "Sta toe dat KDevelop generieke projecten beheert", "Description[pl]": "Zezwól KDevelopowi na zarządzanie zwykłymi projektami", @@ -32,11 +34,13 @@ "Name[de]": "Allgemeine Projektverwaltung", "Name[es]": "Gestor de proyectos genérico", "Name[fr]": "Gestionnaire de projets générique", + "Name[gl]": "Xestor de proxectos xenérico", "Name[it]": "Gestore progetto generico", "Name[nb]": "Generisk prosjektbehandler", "Name[nl]": "Generieke projectenbeheerder", "Name[pl]": "Zwykłe zarządzanie projektami", "Name[pt]": "Gestor de Projectos Genérico", + "Name[ru]": "Управление произвольными проектами", "Name[sk]": "Všeobecný správca projektov", "Name[sv]": "Generell projekthantering", "Name[tr]": "Genel Proje Yöneticisi", diff --git a/plugins/ghprovider/kdevghprovider.json b/plugins/ghprovider/kdevghprovider.json index b250aeb5c0..dbc0af6d2d 100644 --- a/plugins/ghprovider/kdevghprovider.json +++ b/plugins/ghprovider/kdevghprovider.json @@ -35,6 +35,7 @@ "Name[fr]": "Fournisseur GitHub", "Name[it]": "Fornitore GitHub", "Name[nl]": "Github-leverancier", + "Name[nn]": "GitHub-tilbydar", "Name[pl]": "Dostawca GitHub", "Name[pt]": "Fornecedor do GitHub", "Name[sk]": "Poskytovateľ GitHub", diff --git a/plugins/git/kdevgit.json b/plugins/git/kdevgit.json index cf28b3aa28..e6bd61fb98 100644 --- a/plugins/git/kdevgit.json +++ b/plugins/git/kdevgit.json @@ -12,12 +12,16 @@ "Description[ca@valencia]": "Este connector integra el Git al KDevelop", "Description[ca]": "Aquest connector integra el Git al KDevelop", "Description[cs]": "Tento modul integruje podporu pro Git v KDevelop", + "Description[de]": "Dieses Modul integriert Git in KDevelop.", "Description[es]": "Este complemento integra Git en KDevelop", + "Description[et]": "See plugin lõimib Giti KDevelopiga", "Description[fr]": "Ce module externe intègre la gestion de Git dans KDevelop", + "Description[gl]": "Este complemento integra Git en KDevelop", "Description[it]": "Questa estensione integra Git in KDevelop", "Description[nl]": "Deze plug-in integreert Git in KDevelop", "Description[pl]": "Wtyczka ta integruje Git z KDevelop", "Description[pt]": "Este 'plugin' integra o Git no KDevelop", + "Description[pt_BR]": "Este plugin integra o Git ao KDevelop", "Description[sk]": "Tento plugin integruje GIT do KDevelop.", "Description[sv]": "Insticksprogrammet integrerar Git i KDevelop", "Description[tr]": "Bu eklenti Git uygulamasını KDevelop ile bütünleştirir", @@ -34,6 +38,7 @@ "Name[de]": "Git-Unterstützung", "Name[es]": "Implementación de Git", "Name[fr]": "Prise en charge de Git", + "Name[gl]": "Compatibilidade con Git", "Name[it]": "Supporto per Git", "Name[nl]": "Git-ondersteuning", "Name[pl]": "Obsługa Git", diff --git a/plugins/grepview/kdevgrepview.json b/plugins/grepview/kdevgrepview.json index 1ff19c223e..49fd49b056 100644 --- a/plugins/grepview/kdevgrepview.json +++ b/plugins/grepview/kdevgrepview.json @@ -4,13 +4,19 @@ "Description": "Allows fast searching of multiple files using patterns or regular expressions. And allow to replace it too.", "Description[ca@valencia]": "Permet la busca ràpida de múltiples fitxers usant patrons o expressions regulars. I també permet substitucions.", "Description[ca]": "Permet la cerca ràpida de múltiples fitxers usant patrons o expressions regulars. I també permet substitucions.", + "Description[cs]": "Umožní rychlé vyhledávání více souborů za použití řetězců nebo regulárních výrazů. Umožní také jejich nahrazování.", + "Description[de]": "Ermöglicht es, Dateien mit Hilfe von Mustern und regulären Ausdrücken zu durchsuchen bzw. Ersetzungen vorzunehmen.", "Description[es]": "Permite la búsqueda rápida en múltiples archivos usando patrones o expresiones regulares. También permite realizar sustituciones.", + "Description[et]": "Lubab mustreid või regulaaravaldisi kasutades kiiresti paljudes failides teksti otsida, samuti asendada.", "Description[fr]": "Permet de rechercher rapidement dans plusieurs fichiers en utilisant des motifs ou des expressions rationnelles. Et permet de le remplacer aussi.", + "Description[gl]": "Permite facer unha busca rápida en varios ficheiros empregando padróns ou expresións regulares, e tamén realizar substitucións.", "Description[it]": "Consente la ricerca veloce di file multipli usando espressioni regolari o modelli. E consente anche di sostituirli.", "Description[nl]": "Staat toe snel te zoeken naar meerdere bestanden met gebruik van patronen of reguliere expressies. Staat ook vervanging toe.", "Description[pl]": "Pozwala na szybkie znajdowanie wielu plików wykorzystując wzorce lub regularne wyrażenia. Pozwala także na ich zastępowanie.", "Description[pt]": "Permite a pesquisa rápida em vários ficheiros, usando padrões ou expressões regulares. Permite também a sua substituição.", + "Description[pt_BR]": "Permite pesquisar rapidamente em vários arquivos, usando padrões ou expressões regulares e também realizar substituições.", "Description[sk]": "Umožní rýchle hľadanie viacerých súborov pomocou vzorov alebo regulárnych výrazov a umožní ich nahradiť.", + "Description[sl]": "Omogoča hitro iskanje po več datotekah z uporabo vzorcev ali regularnih izrazov. Omogoča tudi zamenjave.", "Description[sv]": "Tillåter snabb sökning i flera filer med mönster eller reguljära uttryck, och tillåter dessutom ersättning.", "Description[tr]": "Kalıplar veya düzenli ifadeler kullanarak birden çok dosyada hızlı aramaya izin verir. Yer değiştirmeye de izin verir.", "Description[uk]": "Надає можливості швидкого пошуку та заміни у декількох файлів на основі шаблонів або формальних виразів.", @@ -22,14 +28,20 @@ "Name[ca@valencia]": "Busca i substitució en fitxers", "Name[ca]": "Cerca i substitució en fitxers", "Name[cs]": "Hledat-nahradit v souborech", + "Name[de]": "In Dateien suchen/ersetzen", "Name[es]": "Buscar/sustituir en archivos", + "Name[et]": "Failides otsimine ja asendamine", "Name[fr]": "Chercher / Remplacer dans les fichiers", + "Name[gl]": "Buscar/Substituír nos ficheiros", "Name[it]": "Cerca/Sostituisci nei file", "Name[nb]": "Finn/erstatt i filer", "Name[nl]": "Zoeken/vervangen in bestanden", "Name[pl]": "Znajdź/zastąp w plikach", "Name[pt]": "Procurar/Substituir nos Ficheiros", + "Name[pt_BR]": "Procurar/substituir nos arquivos", + "Name[ru]": "Поиск/замена в файлах", "Name[sk]": "Hľadať/nahradiť v súboroch", + "Name[sl]": "Najdi/zamenjaj v datotekah", "Name[sv]": "Sök eller ersätt i filer", "Name[tr]": "Bu Dosyalarda Bul ve Değiştir", "Name[uk]": "Пошук або заміна у файлах", diff --git a/plugins/heaptrack/kdevheaptrack.json b/plugins/heaptrack/kdevheaptrack.json index 149dd479aa..be7110e073 100644 --- a/plugins/heaptrack/kdevheaptrack.json +++ b/plugins/heaptrack/kdevheaptrack.json @@ -1,6 +1,4 @@ { - "GenericName": "Heaptrack Support", - "GenericName[x-test]": "xxHeaptrack Supportxx", "KPlugin": { "Authors": [ { @@ -13,6 +11,7 @@ "Description[ca@valencia]": "Este connector integra el Heaptrack al KDevelop", "Description[ca]": "Aquest connector integra el Heaptrack al KDevelop", "Description[cs]": "Tento modul integruje Heaptrack do KDevelop", + "Description[de]": "Dieses Modul integriert Heaptrack in KDevelop", "Description[es]": "Este complemento integra Heaptrack en KDevelop", "Description[fr]": "Ce module externe intègre Heaptrack à KDevelop", "Description[it]": "Questa estensione integra Heaptrack in KDevelop", @@ -33,6 +32,7 @@ "Name[ca@valencia]": "Implementació del Heaptrack", "Name[ca]": "Implementació del Heaptrack", "Name[cs]": "Podpora Heaptracku", + "Name[de]": "Heaptrack-Unterstützung", "Name[es]": "Implementación de Heaptrack", "Name[fr]": "Prise en charge Heaptrack", "Name[it]": "Supporto per Heaptrack", diff --git a/plugins/konsole/kdevkonsoleview.json b/plugins/konsole/kdevkonsoleview.json index c9b31f05de..a76eec5638 100644 --- a/plugins/konsole/kdevkonsoleview.json +++ b/plugins/konsole/kdevkonsoleview.json @@ -4,13 +4,19 @@ "Description": "This plugin provides KDevelop with an embedded konsole for quick and easy command line access.", "Description[ca@valencia]": "Este connector proporciona al KDevelop un Konsole incrustat per accedir de manera ràpida i fàcil a la línia d'ordes.", "Description[ca]": "Aquest connector proporciona al KDevelop un Konsole incrustat per accedir de manera ràpida i fàcil a la línia d'ordres.", + "Description[cs]": "Tento zásuvný modul poskytuje vestavěnou konzoli KDevelopu pro rychlý a jednoduchý přístup do příkazové řádky.", + "Description[de]": "Dieses Modul stattet KDevelop mit einer eingebetteten Konsole zum einfachen Zugriff auf die Befehlszeile aus.", "Description[es]": "Este complemento proporciona una consola integrada a KDevelop para acceder a la línea de órdenes de forma rápida y fácil.", + "Description[et]": "See plugin pakub KDevelopile põimitud konsooli käsurea kiireks ja lihtsaks kasutamiseks.", "Description[fr]": "Ce module apporte à KDevelop une konsole intégrée pour un accès à la ligne de commande rapide et facile.", + "Description[gl]": "Este complemento fornécelle a KDevelop un konsole integrado para dispor de acceso rápido e sinxelo á liña de ordes.", "Description[it]": "Questa estensione dota KDevelop di una console integrata per un rapido e semplice accesso alla riga di comando.", "Description[nl]": "Deze plugin biedt KDevelop een ingebed konsole voor snelle en gemakkelijke toegang tot commandoregels.", "Description[pl]": "Ta wtyczka dodaje do KDevelopa wbudowaną konsolę umożliwiając szybki i łatwy dostęp do wiersza poleceń.", "Description[pt]": "Este 'plugin' oferece ao KDevelop um Konsole incorporado para aceder rápida e facilmente à linha de comandos.", + "Description[pt_BR]": "Este plugin fornece ao KDevelop um terminal embutido para acesso rápido e fácil à linha de comando.", "Description[sk]": "Tento plugin poskytuje KDevelop so zabudovanou konzolou na rýchly a ľahký prístup k príkazovému riadku.", + "Description[sl]": "Vstavek v KDevelop vgradi program Konsole za hiter in preprost dostop do ukazne vrstice.", "Description[sv]": "Insticksprogrammet ger KDevelop en inbyggd terminal för snabb och enkel åtkomst av kommandoraden.", "Description[tr]": "Bu eklenti hızlı ve kolay komut satırı erişimi için KDevelop'a gömülü bir uçbirim sağlar.", "Description[uk]": "За допомогою цього додатка у KDevelop можна буде скористатися вбудованою konsole, яка пришвидшить і полегшить доступ до командного рядка.", @@ -21,14 +27,17 @@ "Name": "Konsole Integration", "Name[ca@valencia]": "Integració del Konsole", "Name[ca]": "Integració del Konsole", + "Name[cs]": "Integrace Konsole", "Name[de]": "Konsole-Integration", "Name[es]": "Integración de Konsole", "Name[fr]": "Intégration de Konsole", + "Name[gl]": "Integración con Konsole", "Name[it]": "Integrazione di Konsole", "Name[nb]": "Konsole-integrering", "Name[nl]": "Console-integratie", "Name[pl]": "Integracja Konsoli", "Name[pt]": "Integração com o Konsole", + "Name[ru]": "Интеграция Konsole", "Name[sk]": "Integrácia Konsole", "Name[sv]": "Integrering av Konsole", "Name[tr]": "Konsole Bütünleşmesi", diff --git a/plugins/lldb/controllers/variable.cpp b/plugins/lldb/controllers/variable.cpp index 8a7a741d13..82c967d4af 100644 --- a/plugins/lldb/controllers/variable.cpp +++ b/plugins/lldb/controllers/variable.cpp @@ -41,7 +41,7 @@ LldbVariable::LldbVariable(DebugSession *session, TreeModel *model, TreeItem *pa void LldbVariable::refetch() { - if (!topLevel() || varobj_.isEmpty()) { + if (!topLevel() || varobj().isEmpty()) { return; } @@ -51,7 +51,7 @@ void LldbVariable::refetch() // update the value itself QPointer guarded_this(this); - debugSession->addCommand(VarEvaluateExpression, varobj_, [guarded_this](const ResultRecord &r){ + m_debugSession->addCommand(VarEvaluateExpression, varobj(), [guarded_this](const ResultRecord &r){ if (guarded_this && r.reason == QLatin1String("done") && r.hasField(QStringLiteral("value"))) { guarded_this->setValue(guarded_this->formatValue(r[QStringLiteral("value")].literal())); } @@ -90,9 +90,9 @@ void LldbVariable::formatChanged() { if (sessionIsAlive()) { QPointer guarded_this(this); - debugSession->addCommand( + m_debugSession->addCommand( VarSetFormat, - QStringLiteral(" %1 %2 ").arg(varobj_).arg(format2str(format())), + QStringLiteral(" %1 %2 ").arg(varobj()).arg(format2str(format())), [guarded_this](const ResultRecord &r){ if(guarded_this && r.hasField(QStringLiteral("changelist"))) { if (r[QStringLiteral("changelist")].size() > 0) { diff --git a/plugins/lldb/kdevlldb.json b/plugins/lldb/kdevlldb.json index ad5a555fc2..6580abdb1c 100644 --- a/plugins/lldb/kdevlldb.json +++ b/plugins/lldb/kdevlldb.json @@ -19,7 +19,7 @@ "Description[uk]": "Цей додаток є обгорткою до LLDB, високошвидкісного засобу діагностики коду мовами C/Obj-C/C++.", "Description[x-test]": "xxThis plugin provides a frontend for LLDB, a next generation, high-performance C/Obj-C/C++ debugger.xx", "Description[zh_CN]": "此插件提供了 GDB 前端,GDB 是一个源码级的 C、C++ 等多语言的调试器。", - "Icon": "debugger", + "Icon": "kdevelop", "Id": "kdevlldb", "License": "GPL", "Name": "LLDB Support", diff --git a/plugins/lldb/lldbdebugger.cpp b/plugins/lldb/lldbdebugger.cpp index 30910e04a5..f621e3b869 100644 --- a/plugins/lldb/lldbdebugger.cpp +++ b/plugins/lldb/lldbdebugger.cpp @@ -51,9 +51,9 @@ bool LldbDebugger::start(KConfigGroup& config, const QStringList& extraArguments // Get path to executable QUrl lldbUrl = config.readEntry(Config::LldbExecutableEntry, QUrl()); if (!lldbUrl.isValid() || !lldbUrl.isLocalFile()) { - debuggerExecutable_ = QStringLiteral("lldb-mi"); + m_debuggerExecutable = QStringLiteral("lldb-mi"); } else { - debuggerExecutable_ = lldbUrl.toLocalFile(); + m_debuggerExecutable = lldbUrl.toLocalFile(); } // Get arguments @@ -73,13 +73,13 @@ bool LldbDebugger::start(KConfigGroup& config, const QStringList& extraArguments } // Start! - process_->setProcessEnvironment(processEnv); - process_->setProgram(debuggerExecutable_, arguments); - process_->start(); + m_process->setProcessEnvironment(processEnv); + m_process->setProgram(m_debuggerExecutable, arguments); + m_process->start(); - qCDebug(DEBUGGERLLDB) << "Starting LLDB with command" << debuggerExecutable_ + QLatin1Char(' ') + arguments.join(QLatin1Char(' ')); - qCDebug(DEBUGGERLLDB) << "LLDB process pid:" << process_->pid(); - emit userCommandOutput(debuggerExecutable_ + QLatin1Char(' ') + arguments.join(QLatin1Char(' ')) + QLatin1Char('\n')); + qCDebug(DEBUGGERLLDB) << "Starting LLDB with command" << m_debuggerExecutable + QLatin1Char(' ') + arguments.join(QLatin1Char(' ')); + qCDebug(DEBUGGERLLDB) << "LLDB process pid:" << m_process->pid(); + emit userCommandOutput(m_debuggerExecutable + QLatin1Char(' ') + arguments.join(QLatin1Char(' ')) + QLatin1Char('\n')); return true; } diff --git a/plugins/lldb/unittests/test_lldb.cpp b/plugins/lldb/unittests/test_lldb.cpp index 61d1ecc659..a6dcd25332 100644 --- a/plugins/lldb/unittests/test_lldb.cpp +++ b/plugins/lldb/unittests/test_lldb.cpp @@ -207,6 +207,11 @@ void LldbTest::initTestCase() Q_ASSERT(m_iface); m_debugeeFileName = findSourceFile("debugee.cpp"); + + const QString lldbMiExecutable = QStandardPaths::findExecutable(QStringLiteral("lldb-mi")); + if (lldbMiExecutable.isEmpty()) { + QSKIP("Skipping, lldb-mi not available"); + } } // Called after the last testfunction was executed @@ -1851,10 +1856,6 @@ void LldbTest::testDebugInExternalTerminal() void LldbTest::testSpecialPath() { -#ifndef HAVE_PATH_WITH_SPACES_TEST - QSKIP("Skipping... special path test," - " this CMake version would create a faulty build.ninja file. Upgrade to at least CMake v3.0"); -#endif QSKIP("Skipping... lldb-mi itself can't handle path with space in application dir"); TestDebugSession* session = new TestDebugSession; diff --git a/plugins/lldb/unittests/test_lldbformatters.cpp b/plugins/lldb/unittests/test_lldbformatters.cpp index 72db3b4a0f..af29d9a92d 100644 --- a/plugins/lldb/unittests/test_lldbformatters.cpp +++ b/plugins/lldb/unittests/test_lldbformatters.cpp @@ -159,13 +159,18 @@ KDevelop::Breakpoint* LldbFormattersTest::addCodeBreakpoint(const QUrl& location // Called before the first testfunction is executed void LldbFormattersTest::initTestCase() { - AutoTestShell::init(); + AutoTestShell::init({QStringLiteral("kdevlldb"), QStringLiteral("kdevexecute")}); m_core = TestCore::initialize(Core::NoUi); m_iface = m_core->pluginController() ->pluginForExtension(QStringLiteral("org.kdevelop.IExecutePlugin"), QStringLiteral("kdevexecute")) ->extension(); Q_ASSERT(m_iface); + + const QString lldbMiExecutable = QStandardPaths::findExecutable(QStringLiteral("lldb-mi")); + if (lldbMiExecutable.isEmpty()) { + QSKIP("Skipping, lldb-mi not available"); + } } // Called after the last testfunction was executed @@ -936,15 +941,15 @@ void LldbFormattersTest::testQUrl() WAIT_FOR_A_WHILE_AND_IDLE(m_session, 50); QList> children; - children.append({QStringLiteral("(port)"), QStringLiteral("-1")}); + children.append({QStringLiteral("(port)"), QStringLiteral("12345")}); children.append({QStringLiteral("(scheme)"), QStringLiteral("\"http\"")}); - children.append({QStringLiteral("(userName)"), QStringLiteral("")}); + children.append({QStringLiteral("(userName)"), QStringLiteral("\"user\"")}); children.append({QStringLiteral("(password)"), QStringLiteral("")}); children.append({QStringLiteral("(host)"), QStringLiteral("\"www.kdevelop.org\"")}); children.append({QStringLiteral("(path)"), QStringLiteral("\"/foo\"")}); - children.append({QStringLiteral("(query)"), QStringLiteral("")}); - children.append({QStringLiteral("(fragment)"), QStringLiteral("")}); - VERIFY_LOCAL(0, "u", "\"http://www.kdevelop.org/foo\"", children); + children.append({QStringLiteral("(query)"), QStringLiteral("\"xyz=bar\"")}); + children.append({QStringLiteral("(fragment)"), QStringLiteral("\"asdf\"")}); + VERIFY_LOCAL(0, "u", "\"http://user@www.kdevelop.org:12345/foo?xyz=bar#asdf\"", children); } void LldbFormattersTest::testQUuid() diff --git a/plugins/manpage/kdevmanpage.json b/plugins/manpage/kdevmanpage.json index 8b43540225..e585e4fb4e 100644 --- a/plugins/manpage/kdevmanpage.json +++ b/plugins/manpage/kdevmanpage.json @@ -27,8 +27,8 @@ "Id": "KDevManPage", "License": "GPL", "Name": "Man Pages", - "Name[ca@valencia]": "Pàgines man", - "Name[ca]": "Pàgines man", + "Name[ca@valencia]": "Pàgines «man»", + "Name[ca]": "Pàgines «man»", "Name[cs]": "Manuálové stránky", "Name[de]": "Handbuch-Seiten", "Name[es]": "Páginas de manual", diff --git a/plugins/okteta/kdevokteta.json b/plugins/okteta/kdevokteta.json index 4e7a4e453f..78b30bdba3 100644 --- a/plugins/okteta/kdevokteta.json +++ b/plugins/okteta/kdevokteta.json @@ -4,6 +4,7 @@ { "Email": "kossebau@kde.org", "Name": "Friedrich W. H. Kossebau", + "Name[nn]": "Friedrich W.H. Kossebau", "Name[x-test]": "xxFriedrich W. H. Kossebauxx" } ], @@ -13,7 +14,7 @@ "Description[ca]": "Permet la visualització i edició de les dades sense processar dels fitxers (basat en l'Okteta)", "Description[de]": "Ermöglicht das Betrachten und Bearbeiten der Rohdaten von Dateien (basiert auf Okteta)", "Description[es]": "Activa la visualización y la edición de datos de archivos en bruto (basado en Okteta)", - "Description[fr]": "Permet de visualiser et éditer les données brutes de fichiers (basé sur Okteta)", + "Description[fr]": "Permet l'aperçu et l'édition des données brutes de fichiers (repose sur Okteta)", "Description[it]": "Abilita la visualizzazione e la modifica dei dati grezzi dei file (basato su Okteta)", "Description[nl]": "Schakelt het bekijken en bewerken van de ruwe gegevens van bestanden in (gebaseerd op Okteta)", "Description[pl]": "Umożliwia oglądanie i edytowanie nieprzetworzonych danych pliku (w oparciu o Oktetę)", @@ -44,6 +45,7 @@ "Name[tr]": "Hex Düzenleyici", "Name[uk]": "Шістнадцятковий редактор", "Name[x-test]": "xxHex Editorxx", + "Name[zh_CN]": "十六进制编辑器", "ServiceTypes": [ "KDevelop/Plugin" ], diff --git a/plugins/openwith/kdevopenwith.json b/plugins/openwith/kdevopenwith.json index 92e5836bda..241074b9c3 100644 --- a/plugins/openwith/kdevopenwith.json +++ b/plugins/openwith/kdevopenwith.json @@ -10,13 +10,19 @@ "Description": "This plugin allows one to open files with associated external applications.", "Description[ca@valencia]": "Este connector permet obrir fitxers amb les aplicacions externes associades.", "Description[ca]": "Aquest connector permet obrir fitxers amb les aplicacions externes associades.", + "Description[cs]": "Tento modul umožňuje otevření souborů přiřazenými externími aplikacemi.", + "Description[de]": "Mit diesem Modul können Dateien mit ihnen zugewiesenen externen Anwendungen gestartet werden.", "Description[es]": "Este complemento permite abrir archivos con las aplicaciones externas asociadas.", + "Description[et]": "See plugin võimaldab avada väliste rakendustega seostatud faile.", "Description[fr]": "Ce module permet d'ouvrir des fichiers en association avec des applications externes.", + "Description[gl]": "Este complemento permítelle abrir ficheiros cos aplicativos externos asociados.", "Description[it]": "Questa estensione permette di aprire i file con le relative applicazioni esterne.", "Description[nl]": "Deze plugin biedt u het openen van bestanden met geassocieerde externe toepassingen.", "Description[pl]": "Ta wtyczka umożliwia otwieranie plików, z którymi są powiązane zewnętrzne programy.", "Description[pt]": "Este 'plugin' permite abrir os ficheiros com as aplicações externas associadas.", + "Description[pt_BR]": "Este plugin permite abrir os arquivos com os aplicativos externos associados.", "Description[sk]": "Tento plugin umožňuje otvoriť súbory s asociovanými externými aplikáciami.", + "Description[sl]": "Vstavek omogoča odpiranje datotek v povezanih zunanjih programih.", "Description[sv]": "Insticksprogrammet tillåter att öppna filer med tillhörande externa program.", "Description[tr]": "Bu eklenti ilişkilendirilmiş dış uygulamalar ile dosyalar açmayı sağlar.", "Description[uk]": "За допомогою цього додатка ви зможете відкривати файли у пов’язаній з ними зовнішній програмі.", @@ -29,14 +35,20 @@ "Name[ca@valencia]": "Obri amb", "Name[ca]": "Obre amb", "Name[cs]": "Otevřít pomocí", + "Name[de]": "Öffnen mit", "Name[es]": "Abrir con", + "Name[et]": "Avamine rakendusega", "Name[fr]": "Ouvrir avec", + "Name[gl]": "Abrir con", "Name[it]": "Apri con", "Name[nb]": "Åpne med", "Name[nl]": "Openen met", "Name[pl]": "Otwórz za pomocą", "Name[pt]": "Abrir Com", + "Name[pt_BR]": "Abrir com", + "Name[ru]": "Открыть с помощью", "Name[sk]": "Otvoriť s", + "Name[sl]": "Odpri z", "Name[sv]": "Öppna med", "Name[tr]": "Birlikte Aç", "Name[uk]": "Відкриття у зовнішніх програмах", diff --git a/plugins/outlineview/kdevoutlineview.json b/plugins/outlineview/kdevoutlineview.json index 705448fb88..e5e9cda7d8 100644 --- a/plugins/outlineview/kdevoutlineview.json +++ b/plugins/outlineview/kdevoutlineview.json @@ -11,13 +11,18 @@ "Description": "This plugin provides a view to show the outline of the currently open document.", "Description[ca@valencia]": "Este connector proporciona una visualització que mostra una visió general del document obert actualment.", "Description[ca]": "Aquest connector proporciona una visualització que mostra una visió general del document obert actualment.", + "Description[de]": "Dieses Modul zeigt eine Ansicht der Funktions-Kurzinfos im aktuell geöffneten Dokument.", "Description[es]": "Este complemento proporciona una vista para mostrar el boceto del documento actualmente abierto.", + "Description[et]": "See plugin pakub parajasti avatud dokumendi struktuuri vaadet.", "Description[fr]": "Ce module fournit une vue pour afficher le plan du document ouvert", + "Description[gl]": "Este complemento fornece unha vista para mostrar o esquema do documento actual.", "Description[it]": "Questa estensione fornisce una vista che mostra uno schema di massima del documento attualmente aperto.", "Description[nl]": "Deze plugin biedt zicht op de outline van het nu geopende document.", "Description[pl]": "Ta wtyczka dostarcza zarys obecnie otwartego dokumentu.", "Description[pt]": "Este 'plugin' oferece uma visão geral sobre o documento aberto de momento.", + "Description[pt_BR]": "Este plugin fornece uma visão geral do documento que estiver aberto.", "Description[sk]": "Tento plugin poskytuje pohľad na zobrazenie obrysu aktuálne otvoreného dokumentu.", + "Description[sl]": "Ta vstavek ponuja prikaz za oris trenutno odprtega dokumenta.", "Description[sv]": "Insticksprogrammet tillhandahåller en vy för att visa dispositionen av dokumentet som för närvarande är öppet.", "Description[tr]": "Bu eklenti mevcut açık dosyanın çerçevesini görüntülemeyi sağlar.", "Description[uk]": "За допомогою цього додатка можна переглянути схему поточного відкритого документа.", @@ -30,12 +35,17 @@ "Name[ca@valencia]": "Visió general", "Name[ca]": "Visió general", "Name[cs]": "Obrys", + "Name[de]": "Funktions-Kurzinfo", "Name[es]": "Boceto", + "Name[et]": "Struktuur", "Name[fr]": "Plan", + "Name[gl]": "Esquema", "Name[it]": "Schema di massima", "Name[pl]": "Zarys", "Name[pt]": "Visão Geral", + "Name[pt_BR]": "Contorno", "Name[sk]": "Obrys", + "Name[sl]": "Oris", "Name[sv]": "Disposition", "Name[tr]": "Çerçeve", "Name[uk]": "Схема", diff --git a/plugins/outlineview/outlinewidget.cpp b/plugins/outlineview/outlinewidget.cpp index 6358b4a254..40f09d9526 100644 --- a/plugins/outlineview/outlinewidget.cpp +++ b/plugins/outlineview/outlinewidget.cpp @@ -57,6 +57,8 @@ OutlineWidget::OutlineWidget(QWidget* parent, OutlineViewPlugin* plugin) // sort action m_sortAlphabeticallyAction = new QAction(QIcon::fromTheme(QStringLiteral("view-sort-ascending")), QString(), this); m_sortAlphabeticallyAction->setToolTip(i18n("Sort alphabetically")); + // reuse the tooltip so the action will show up in the context menu: + m_sortAlphabeticallyAction->setText(m_sortAlphabeticallyAction->toolTip()); m_sortAlphabeticallyAction->setCheckable(true); connect(m_sortAlphabeticallyAction, &QAction::triggered, this, [this](bool sort) { // calling sort with -1 will restore the original order diff --git a/plugins/patchreview/CMakeLists.txt b/plugins/patchreview/CMakeLists.txt index 2649487bac..9449d7cb0f 100644 --- a/plugins/patchreview/CMakeLists.txt +++ b/plugins/patchreview/CMakeLists.txt @@ -4,13 +4,17 @@ set_package_properties(LibKompareDiff2 PROPERTIES TYPE REQUIRED ) -find_package(KDEExperimentalPurpose QUIET) -set_package_properties(KDEExperimentalPurpose PROPERTIES DESCRIPTION "EXPERIMENTAL. Support for patch sharing" - URL "https://projects.kde.org/projects/playground/libs/purpose" +find_package(KF5Purpose CONFIG QUIET) +set_package_properties(KF5Purpose PROPERTIES DESCRIPTION "Support for patch sharing" TYPE OPTIONAL ) - - +if (NOT KF5Purpose_FOUND) + find_package(KDEExperimentalPurpose QUIET) + set_package_properties(KDEExperimentalPurpose PROPERTIES DESCRIPTION "EXPERIMENTAL. Support for patch sharing" + URL "https://projects.kde.org/projects/playground/libs/purpose" + TYPE OPTIONAL + ) +endif() add_definitions(-DTRANSLATION_DOMAIN=\"kdevpatchreview\") kde_enable_exceptions() @@ -49,7 +53,10 @@ target_link_libraries(kdevpatchreview KF5::TextEditor KF5::Parts ) -if (KDEExperimentalPurpose_FOUND) +if (KF5Purpose_FOUND) + target_compile_definitions(kdevpatchreview PRIVATE WITH_PURPOSE) + target_link_libraries(kdevpatchreview KF5::PurposeWidgets) +elseif (KDEExperimentalPurpose_FOUND) target_compile_definitions(kdevpatchreview PRIVATE WITH_PURPOSE) target_link_libraries(kdevpatchreview KDEExperimental::PurposeWidgets) endif() diff --git a/plugins/patchreview/kdevpatchreview.json b/plugins/patchreview/kdevpatchreview.json index 660caca0d6..7100f4c16f 100644 --- a/plugins/patchreview/kdevpatchreview.json +++ b/plugins/patchreview/kdevpatchreview.json @@ -10,13 +10,19 @@ "Description": "This plugin allows reviewing patches directly in the editor.", "Description[ca@valencia]": "Este connector permet revisar pedaços directament en l'editor.", "Description[ca]": "Aquest connector permet revisar pedaços directament en l'editor.", + "Description[cs]": "Tento zásuvný modul umožňuje prohlížení záplat přímo v editoru.", + "Description[de]": "Dieses Modul ermöglicht es, Patches direkt im Editor durchzusehen.", "Description[es]": "Este complemento permite la revisión de parches directamente en el editor.", + "Description[et]": "See plugin võimaldab paiku üle vaadata otse redaktoris.", "Description[fr]": "Ce module permet de passer en revue des correctifs directement dans l'éditeur.", + "Description[gl]": "Este complemento permite revisar parches directamente no editor.", "Description[it]": "Questa estensione permette di rivedere le patch direttamente nell'editor.", "Description[nl]": "Deze plugin laat patches herzien direct in de editor.", "Description[pl]": "Ta wtyczka pozwala na przeglądanie poprawek bezpośrednio w edytorze.", "Description[pt]": "Este 'plugin' permite a revisão das modificações directamente no editor.", + "Description[pt_BR]": "Este plugin permite obter as modificações diretamente no editor.", "Description[sk]": "Tento plugin umožňuje zhodnotenie záplat priamo v editore.", + "Description[sl]": "Vstavek omogoča pregled popravkov neposredno v urejevalniku.", "Description[sv]": "Insticksprogrammet gör det möjligt att direkt granska programfixar i editorn.", "Description[tr]": "Bu eklenti yamaların doğrudan düzenleyici içerisinde gözden geçirilmesini sağlar.", "Description[uk]": "За допомогою цього додатка ви зможете рецензувати латки безпосередньо у редакторі.", @@ -28,14 +34,21 @@ "Name": "Patch Review", "Name[ca@valencia]": "Revisió del pedaç", "Name[ca]": "Revisió del pedaç", + "Name[cs]": "Kontrola záplat", + "Name[de]": "Patch-Durchsicht", "Name[es]": "Revisión de parches", + "Name[et]": "Paikade läbivaatus", "Name[fr]": "Révision de correctifs", + "Name[gl]": "Revisor de parches", "Name[it]": "Revisione patch", "Name[nb]": "Lappegjennomgang", "Name[nl]": "Patchoverzicht", "Name[pl]": "Ocena łatki", "Name[pt]": "Revisão da Modificação", + "Name[pt_BR]": "Revisão da modificação", + "Name[ru]": "Рецензирование патчей", "Name[sk]": "Zhodnotenie záplaty", + "Name[sl]": "Pregled popravkov", "Name[sv]": "Granska programfixar", "Name[tr]": "Yama Gözden Geçirmesi", "Name[uk]": "Рецензування латки", diff --git a/plugins/perforce/kdevperforce.json b/plugins/perforce/kdevperforce.json index 15c4384e85..eadccb496f 100644 --- a/plugins/perforce/kdevperforce.json +++ b/plugins/perforce/kdevperforce.json @@ -11,6 +11,7 @@ "Description[ca@valencia]": "Proporciona integració amb el sistema de control de versions Perforce", "Description[ca]": "Proporciona integració amb el sistema de control de versions Perforce", "Description[cs]": "Poskytuje integraci Perforce Version Control System", + "Description[de]": "Bietet Integration mit der Perforce-Versionsverwaltung", "Description[es]": "Proporciona integración con el sistema de control de versiones Perforce", "Description[fr]": "Fournit une intégration avec le système de contrôle de version Perforce", "Description[it]": "Fornisce l'integrazione con il sistema di controllo versione Perforce", @@ -18,6 +19,7 @@ "Description[pl]": "Dostarcza integrację z systemem kontroli wersji Perforce", "Description[pt]": "Oferece a Integração com o Sistema de Controlo de Versões Perforce", "Description[sk]": "Poskytuje integráciu s verzionovacím systémom Perforce", + "Description[sl]": "Ponuja vgradnjo sistema za nadzor različic Perforce", "Description[sv]": "Tillhandahåller integrering med Perforce versionskontrollsystem", "Description[tr]": "Perforce Sürüm Denetim Sistemi ile Bütünleşme Sağlar", "Description[uk]": "Забезпечує інтеграцію з системою керування версіями Perforce", @@ -29,6 +31,7 @@ "Name[ca@valencia]": "Implementació del Perforce", "Name[ca]": "Implementació del Perforce", "Name[cs]": "Podpora Perforce", + "Name[de]": "Perforce-Unterstützung", "Name[es]": "Implementación de Perforce", "Name[fr]": "Prise en charge de Perforce", "Name[it]": "Supporto per Perforce", diff --git a/plugins/problemreporter/kdevproblemreporter.json b/plugins/problemreporter/kdevproblemreporter.json index aa43c5e83d..f72237615a 100644 --- a/plugins/problemreporter/kdevproblemreporter.json +++ b/plugins/problemreporter/kdevproblemreporter.json @@ -10,13 +10,19 @@ "Description": "This plugin shows errors in source code.", "Description[ca@valencia]": "Este connector permet mostrar errors en el codi font.", "Description[ca]": "Aquest connector permet mostrar errors en el codi font.", + "Description[cs]": "Tento zásuvný modul ukazuje chyby ve zdrojovém kódu.", + "Description[de]": "Dieses Modul zeigt Fehler im Quelltext an.", "Description[es]": "Este complemento muestra errores en el código fuente.", + "Description[et]": "See plugin näitab vigu lähtekoodis.", "Description[fr]": "Ce module affiche les erreurs dans le code source.", + "Description[gl]": "Esta extensión mostra erros no código fonte.", "Description[it]": "Questa estensione mostra gli errori nel codice sorgente.", "Description[nl]": "Deze plugin toont fouten in broncode", "Description[pl]": "Ta wtyczka pokazuje błędy w kodzie źródłowym.", "Description[pt]": "Este 'plugin' mostra os erros no código-fonte.", + "Description[pt_BR]": "Este plugin apresenta os erros no código-fonte.", "Description[sk]": "Tento plugin ukáže chyby v zdrojovom kóde.", + "Description[sl]": "Vstavek prikazuje napake v izvorni kodi.", "Description[sv]": "Insticksprogrammet visar fel i källkod.", "Description[tr]": "Bu eklenti kaynak koddaki hataları gösterir.", "Description[uk]": "За допомогою цього додатка можна переглянути повідомлення про помилки у коді.", @@ -28,14 +34,21 @@ "Name": "Problem Reporter View", "Name[ca@valencia]": "Vista del notificador de problemes", "Name[ca]": "Vista del notificador de problemes", + "Name[cs]": "Pohled oznamovatele problému", + "Name[de]": "Ansicht für Fehlerberichte", "Name[es]": "Vista del notificador de problemas", + "Name[et]": "Probleemide teavitaja vaade", "Name[fr]": "Vue du rapporteur de problèmes", + "Name[gl]": "Vista do relator de problemas", "Name[it]": "Vista segnalazione problemi", "Name[nb]": "Problemmeldervisning", "Name[nl]": "Probleemrapporteuroverzicht", "Name[pl]": "Widok raportów o problemach", "Name[pt]": "Área de Relatórios de Erros", + "Name[pt_BR]": "Área do relatórios de erros", + "Name[ru]": "Панель диагностики проблем", "Name[sk]": "Pohľad na zadávač problémov", + "Name[sl]": "Prikaz poročevalca o težavah", "Name[sv]": "Problemrapporteringsvisning", "Name[tr]": "Sorun Bildirici Görünümü", "Name[uk]": "Перегляд інструмента звітування про проблеми", diff --git a/plugins/projectfilter/kdevprojectfilter.json b/plugins/projectfilter/kdevprojectfilter.json index fd2e377b63..24b8b19922 100644 --- a/plugins/projectfilter/kdevprojectfilter.json +++ b/plugins/projectfilter/kdevprojectfilter.json @@ -10,13 +10,18 @@ "Description": "Configure which files and folders inside the project folder should be included or excluded.", "Description[ca@valencia]": "Configura quins fitxers i carpetes dins de la carpeta del projecte s'han d'incloure o excloure.", "Description[ca]": "Configura quins fitxers i carpetes dins de la carpeta del projecte s'han d'incloure o excloure.", + "Description[de]": "Legt fest, welche Dateien und Ordner innerhalb des Projektordners ein- oder ausgeschlossen werden sollen.", "Description[es]": "Configurar los archivos y carpetas que pertenecen a la carpeta del proyecto y que deben ser incluidos o excluidos.", + "Description[et]": "Määramine, millised projektikataloogi failid ja kataloogid kaasata või välja jätta.", "Description[fr]": "Configurer quels fichiers et dossiers à l'intérieur du dossier projet doivent être inclus ou exclus.", + "Description[gl]": "Configurar cales ficheiros e cartafoles dentro do cartafol do proxecto deben incluírse ou excluírse.", "Description[it]": "Configura quali file e cartelle nella cartella del progetto devono essere incluse o escluse.", "Description[nl]": "Stel in welke bestanden en mappen in de projectmap meegenomen of uitgesloten moeten worden.", "Description[pl]": "Ustaw jakie pliki i katalogi wewnątrz katalogu projektu mają być uwzględniane albo wykluczane.", "Description[pt]": "Configurar os ficheiros ou pastas, dentro da pasta do projecto, que deverão ser incluídos ou excluídos.", + "Description[pt_BR]": "Configura os arquivos e pastas, dentro da pasta do projeto, que devem ser incluídos ou excluídos.", "Description[sk]": "Nastaviť, ktoré súbory a priečinky v priečinku projektu majú byť zahrnuté alebo vylúčené.", + "Description[sl]": "Nastavi katere datoteke in mape znotraj mape projekta naj bodo vključene ali izključene.", "Description[sv]": "Anpassa vilka filer och kataloger inne i projektkatalogen som ska inkluderas eller exkluderas.", "Description[tr]": "Proje klasörü içerisindeki hangi dosya ve klasörlerin dahil edilip edilmeyeceğini yapılandır.", "Description[uk]": "За допомогою цього модуля можна визначити, які файли і теки у теці проекту має бути включено або виключено з його складу.", @@ -31,17 +36,19 @@ "Name[de]": "Projektfilter", "Name[es]": "Filtro de proyectos", "Name[fr]": "Filtre de projet", + "Name[gl]": "Filtro do proxecto", "Name[it]": "Filtro progetto", "Name[nb]": "Prosjektfilter", "Name[nl]": "Projectfilter", "Name[pl]": "Filtr projektu", "Name[pt]": "Filtro de Projectos", + "Name[ru]": "Фильтр проекта", "Name[sk]": "Filter projektu", "Name[sv]": "Projektfilter", "Name[tr]": "Proje Süzgeci", "Name[uk]": "Фільтр проекту", "Name[x-test]": "xxProject Filterxx", - "Name[zh_CN]": "项目过滤器", + "Name[zh_CN]": "工程过滤器", "ServiceTypes": [ "KDevelop/Plugin" ] diff --git a/plugins/projectmanagerview/cutcopypastehelpers.cpp b/plugins/projectmanagerview/cutcopypastehelpers.cpp index 51cdd6982f..24311e1669 100644 --- a/plugins/projectmanagerview/cutcopypastehelpers.cpp +++ b/plugins/projectmanagerview/cutcopypastehelpers.cpp @@ -170,9 +170,9 @@ SourceToDestinationMap mapSourceToDestination(const Path::List& sourcePaths, con SourceToDestinationMap result; for (const Path& path : sortedPaths) { - if (!result.filteredPaths.isEmpty() && std::reverse_iterator(result.filteredPaths.constBegin())->isParentOf(path)) { + if (!result.filteredPaths.isEmpty() && result.filteredPaths.back().isParentOf(path)) { // think: "/tests" - const Path& previousPath = *std::reverse_iterator(result.filteredPaths.constBegin()); + const Path& previousPath = result.filteredPaths.back(); // think: "/dest" + "/".relativePath("/tests/abc.cpp") = /dest/tests/abc.cpp result.finalPaths[previousPath].append(Path(destinationPath, previousPath.parent().relativePath(path))); } else { diff --git a/plugins/projectmanagerview/kdevprojectmanagerview.json b/plugins/projectmanagerview/kdevprojectmanagerview.json index 6c2f4c20b8..cce1a7b864 100644 --- a/plugins/projectmanagerview/kdevprojectmanagerview.json +++ b/plugins/projectmanagerview/kdevprojectmanagerview.json @@ -10,13 +10,19 @@ "Description": "Lets you manage the project contents.", "Description[ca@valencia]": "Vos permet gestionar els continguts del projecte.", "Description[ca]": "Us permet gestionar els continguts del projecte.", + "Description[cs]": "Umožňuje spravovat obsah projektu.", + "Description[de]": "Lässt Sie den Inhalt Ihres Projekts verwalten.", "Description[es]": "Le permite gestionar el contenido del proyecto.", + "Description[et]": "Projektide sisu haldamine.", "Description[fr]": "Vous laisse gérer le contenu du projet.", + "Description[gl]": "Permítelle xestionar os contidos do proxecto.", "Description[it]": "Consente di gestire i contenuti del progetto.", "Description[nl]": "Laat u de projectinhoud beheren.", "Description[pl]": "Pozwala tobie na zarządzanie zawartością projektu.", "Description[pt]": "Permite-lhe gerir o conteúdo do projecto.", + "Description[pt_BR]": "Permite-lhe gerenciar o conteúdo do projeto.", "Description[sk]": "Umožní vám spravovať obsah projektu.", + "Description[sl]": "Pomaga vam upravljati z vsebino projekta.", "Description[sv]": "Låter dig hantera projektets innehåll.", "Description[tr]": "Proje içeriğini yönetmenizi sağlar.", "Description[uk]": "Надає вам змогу керувати вмістом проектів.", @@ -28,14 +34,17 @@ "Name": "Project Manager View", "Name[ca@valencia]": "Vista del gestor de projectes", "Name[ca]": "Vista del gestor de projectes", + "Name[cs]": "Pohled správce projektů", "Name[de]": "Ansicht für Projektverwaltung", "Name[es]": "Vista del gestor de proyectos", "Name[fr]": "Vue du gestionnaire de projets", + "Name[gl]": "Vista do xestor de proxectos", "Name[it]": "Vista gestore progetto", "Name[nb]": "Prosjektbehandlervisning", "Name[nl]": "Projectbeheerder-overzicht", "Name[pl]": "Widok zarządzania projektem", "Name[pt]": "Área do Gestor de Projectos", + "Name[ru]": "Панель управления проектами", "Name[sk]": "Pohľad na správcu projektu", "Name[sv]": "Projekthanteringsvisning", "Name[tr]": "Proje Yöneticisi Görünümü", diff --git a/plugins/projectmanagerview/projectmanagerview.cpp b/plugins/projectmanagerview/projectmanagerview.cpp index 63dbef6103..2ecd4fdb1f 100644 --- a/plugins/projectmanagerview/projectmanagerview.cpp +++ b/plugins/projectmanagerview/projectmanagerview.cpp @@ -91,6 +91,9 @@ ProjectManagerView::ProjectManagerView( ProjectManagerViewPlugin* plugin, QWidge m_ui->splitter->setStretchFactor(1, projectBuildSetStrechFactor); } + // keep the project tree view from collapsing (would confuse users) + m_ui->splitter->setCollapsible(0, false); + m_syncAction = plugin->actionCollection()->action(QStringLiteral("locate_document")); Q_ASSERT(m_syncAction); m_syncAction->setShortcutContext(Qt::WidgetWithChildrenShortcut); @@ -170,11 +173,18 @@ void ProjectManagerView::selectionChanged() { m_ui->buildSetView->selectionChanged(); QList selected; + bool updated = false; foreach( const QModelIndex& idx, m_ui->projectTreeView->selectionModel()->selectedRows() ) { - selected << ICore::self()->projectController()->projectModel()->itemFromIndex(indexFromView( idx )); + auto item = ICore::self()->projectController()->projectModel()->itemFromIndex(indexFromView( idx )); + if (item) { + selected << item; + if (!updated) { + ICore::self()->documentController()->updateDirectoryHint(item->directory()); + updated = true; + } + } } - selected.removeAll(nullptr); KDevelop::ICore::self()->selectionController()->updateSelection( new ProjectManagerViewItemContext( selected, this ) ); } diff --git a/plugins/qmakemanager/qmakeconfig.cpp b/plugins/qmakemanager/qmakeconfig.cpp index 955200a117..5370c653d3 100644 --- a/plugins/qmakemanager/qmakeconfig.cpp +++ b/plugins/qmakemanager/qmakeconfig.cpp @@ -18,6 +18,8 @@ #include "qmakeconfig.h" +#include "qtcompat_p.h" + #include #include #include @@ -39,19 +41,6 @@ const char QMakeConfig::EXTRA_ARGUMENTS[] = "Extra_Arguments"; const char QMakeConfig::BUILD_TYPE[] = "Build_Type"; const char QMakeConfig::ALL_BUILDS[] = "All_Builds"; -namespace { - -// TODO: Just use QDir::listSeparator once we depend on Qt 5.6 -Q_DECL_CONSTEXPR inline QChar listSeparator() Q_DECL_NOTHROW -{ -#ifdef Q_OS_WIN - return QLatin1Char(';'); -#else - return QLatin1Char(':'); -#endif -} -} - using namespace KDevelop; /// NOTE: KConfig is not thread safe @@ -141,7 +130,7 @@ QString QMakeConfig::findBasicMkSpec(const QHash& qmakeVars) QStringList paths; if (qmakeVars.contains(QStringLiteral("QMAKE_MKSPECS"))) { // qt4 - foreach (const QString& dir, qmakeVars["QMAKE_MKSPECS"].split(listSeparator())) { + foreach (const QString& dir, qmakeVars["QMAKE_MKSPECS"].split(QtCompat::listSeparator())) { paths << dir + "/default/qmake.conf"; } } else if (!qmakeVars.contains(QStringLiteral("QMAKE_MKSPECS")) && qmakeVars.contains(QStringLiteral("QMAKE_SPEC"))) { diff --git a/plugins/quickopen/kdevquickopen.json b/plugins/quickopen/kdevquickopen.json index 5bb8556a93..cb3a4edb58 100644 --- a/plugins/quickopen/kdevquickopen.json +++ b/plugins/quickopen/kdevquickopen.json @@ -10,13 +10,19 @@ "Description": "This plugin allows quick access to project files and language-items like classes/functions.", "Description[ca@valencia]": "Este connector permet un ràpid accés als fitxers del projecte i a elements del llenguatge com classes/funcions.", "Description[ca]": "Aquest connector permet un ràpid accés als fitxers del projecte i a elements del llenguatge com classes/funcions.", + "Description[cs]": "Tento zásuvný modul umožňuje rychlý přístup k souborům projektu a položkám jazyka jako jsou třídy a funkce.", + "Description[de]": "Dieses Modul bietet schnellen Zugriff auf Projektdateien und Sprachelemente wie Klassen und Funktionen.", "Description[es]": "Este complemento permite acceder rápidamente a los archivos del proyecto y a elementos del lenguaje, como clases y funciones.", + "Description[et]": "See plugin pakub kiiret ligipääsu projekti failidele ja keele elementidele, näiteks klassidele ja funktsioonidele.", "Description[fr]": "Ce module permet un accès rapide aux fichiers du projet et aux éléments de langage comme les classes / fonctions.", + "Description[gl]": "Este complemento permite acceder rapidamente a ficheiros de proxecto e elementos da linguaxe como clases e funcións.", "Description[it]": "Questa estensione permette di accedere rapidamente ai file di progetto e agli elementi del linguaggio come le classi/funzioni.", "Description[nl]": "Deze plugin biedt snel toegamg tot projectbestanden en taal-items zoals classes/functies.", "Description[pl]": "Ta wtyczka pozwala na szybki dostęp do plików projektu i elementów języka takich jak klasy i funkcje.", "Description[pt]": "Este 'plugin' permite o acesso rápido aos ficheiros dos projectos e aos itens das linguagens, como as classes ou funções.", + "Description[pt_BR]": "Este plugin permite o rápido acesso a arquivos de projeto e itens da linguagem como classes/funções.", "Description[sk]": "Tento plugin umožňuje rýchly prístup k súborom projektu a položiek jazyka ako triedy/funkcie.", + "Description[sl]": "Vstavek omogoča hiter dostop do projektnih datotek in predmetov kot so razredi in funkcije.", "Description[sv]": "Insticksprogrammet ger snabb åtkomst av projektfiler och språkobjekt som klasser och funktioner.", "Description[tr]": "Bu eklenti proje dosyalarına ve sınıflar/fonksiyonlar gibi dil öğelerine hızlı erişim sağlar.", "Description[uk]": "За допомогою цього додатка можна пришвидшити доступ до файлів проектів і елементів мови на зразок класів або функцій.", @@ -29,18 +35,25 @@ "Name[ca@valencia]": "Obertura ràpida", "Name[ca]": "Obertura ràpida", "Name[cs]": "Rychle otevřít", + "Name[de]": "Schnellöffner", "Name[es]": "Apertura rápida", + "Name[et]": "Kiiravamine", "Name[fr]": "Ouverture rapide", + "Name[gl]": "Apertura rápida", "Name[it]": "Apertura veloce", "Name[nb]": "Hurtigåpne", "Name[nl]": "Snel openen", "Name[pl]": "Szybkie otwarcie", "Name[pt]": "Abertura Rápida", + "Name[pt_BR]": "Abertura rápida", + "Name[ru]": "Быстрый переход", "Name[sk]": "Rýchlo otvoriť", + "Name[sl]": "Hitro odpiranje", "Name[sv]": "Snabböppna", "Name[tr]": "Hızlı Aç", "Name[uk]": "Швидке відкриття", "Name[x-test]": "xxQuick Openxx", + "Name[zh_CN]": "快速打开", "ServiceTypes": [ "KDevelop/Plugin" ] diff --git a/plugins/quickopen/quickopenplugin.cpp b/plugins/quickopen/quickopenplugin.cpp index a414228355..7d451c2339 100644 --- a/plugins/quickopen/quickopenplugin.cpp +++ b/plugins/quickopen/quickopenplugin.cpp @@ -930,6 +930,7 @@ QuickOpenLineEdit::QuickOpenLineEdit(QuickOpenWidgetCreator* creator) : m_widget , m_forceUpdate(false) , m_widgetCreator(creator) { + setFont(qApp->font("QToolButton")); setMinimumWidth(200); setMaximumWidth(400); diff --git a/plugins/sourceformatter/kdevsourceformatter.json b/plugins/sourceformatter/kdevsourceformatter.json index bab94ef332..5ffa7e0939 100644 --- a/plugins/sourceformatter/kdevsourceformatter.json +++ b/plugins/sourceformatter/kdevsourceformatter.json @@ -5,6 +5,7 @@ "Description[ca@valencia]": "Configura quin estil s'ha d'usar per a formatar el codi font d'un projecte.", "Description[ca]": "Configura quin estil s'ha d'usar per a formatar el codi font d'un projecte.", "Description[es]": "Configurar el estilo que se debe usar para formatear el código fuente de un proyecto.", + "Description[fr]": "Configurer le style de formatage du code source dans les projets.", "Description[it]": "Configura lo stile che sarà usato per formattare il codice sorgente in un progetto.", "Description[nl]": "Configureer welke stijl gebruikt moet worden voor formattering van de broncode in een project.", "Description[pl]": "Określ zapis kodu źródłowego w projekcie.", @@ -24,16 +25,19 @@ "Name[de]": "Quelltextformatierer", "Name[es]": "Formateador de código fuente", "Name[fr]": "Formateur de sources", + "Name[gl]": "Formatador de código", "Name[it]": "Formattatore sorgenti", "Name[nb]": "Kildeformattering", "Name[nl]": "Broncode-formatteerprogramma", "Name[pl]": "Formatowanie źródeł", "Name[pt]": "Formatação de Código", + "Name[ru]": "Форматирование кода", "Name[sk]": "Formátovač zdroja", "Name[sv]": "Källkodsformatering", "Name[tr]": "Kaynak Biçimlendirici", "Name[uk]": "Форматування коду", "Name[x-test]": "xxSource Formatterxx", + "Name[zh_CN]": "源代码格式化器", "ServiceTypes": [ "KDevelop/Plugin" ] diff --git a/plugins/standardoutputview/kdevstandardoutputview.json b/plugins/standardoutputview/kdevstandardoutputview.json index c4952c6bef..d6694ddba6 100644 --- a/plugins/standardoutputview/kdevstandardoutputview.json +++ b/plugins/standardoutputview/kdevstandardoutputview.json @@ -4,14 +4,21 @@ "Description": "Provides a text output toolview for other plugins to use, to show things like compiler messages.", "Description[ca@valencia]": "Proporciona una vista d'eina d'eixida de text per a utilitzar en altres connectors, per a visualitzar missatges del compilador, per exemple.", "Description[ca]": "Proporciona una vista d'eina de sortida de text per a utilitzar en altres connectors, per a visualitzar missatges del compilador, per exemple.", + "Description[cs]": "Umožňuje používat jiným zásuvným modulům nástrojový pohled textového výstupu, aby ukázal různé věci, jako třeba zprávy kompilátoru.", + "Description[de]": "Stellt eine Textausgabe für andere Module zur Verfügung, um Dinge wie Compiler-Nachrichten anzuzeigen.", "Description[es]": "Proporciona un visor de salida de texto para que otros complementos muestren cosas como mensajes del compilador, por ejemplo.", + "Description[et]": "Teistele pluginatele kättesaadav tekstiväljundi tööriistavaade, mis näitab kompilaatori teateid ja muud.", "Description[fr]": "Fournit un outil d'affichage de la sortie texte pour utilisation par d'autres modules, pour afficher des choses comme des messages de compilateur.", + "Description[gl]": "Fornece unha ferramenta de saída de texto a outros complementos, para mostrar cousas como mensaxes do compilador.", "Description[it]": "Fornisce una vista strumenti testuale che può essere usata dalla estensioni per mostrare cose come i messaggi del compilatore.", "Description[nl]": "Levert tekstuitvoer van hulpmiddelen voor andere te gebruiken plugins, om zaken te tonen zoals berichten van compilers.", "Description[pl]": "Zapewnia widok narzędzia wyjścia tekstu dla wykorzystania w innych wtyczkach, aby pokazać rzeczy takie jak komunikaty kompilatora.", "Description[pt]": "Oferece uma área de texto para os outros 'plugins' usarem, para apresentar algumas coisas, como as mensagens do compilador.", + "Description[pt_BR]": "Oferece uma área de resultados de texto para os outros plugins usarem, de modo a mostrar coisas como as mensagens do compilador.", "Description[sk]": "Poskytuje textový výstup pohľadu nástrojov pre iné pluginy na použitie, na zobrazenie napríklad správy prekladača.", + "Description[sl]": "Drugim vstavkom ponuja okno za prikaz besedilnega izhoda, na primer za sporočila izgrajevalnika.", "Description[sv]": "Tillhandahåller en verktygsvy för textutmatning som andra insticksprogram kan använda för att visa saker som kompilatormeddelanden.", + "Description[tr]": "Diğer eklentilerin derleyici iletileri gibi şeyleri göstermesi için metin çıktı araç görünümü sağlar.", "Description[uk]": "Забезпечує роботу панелі показу текстових даних інших додатків, зокрема попереджень компілятора.", "Description[x-test]": "xxProvides a text output toolview for other plugins to use, to show things like compiler messages.xx", "Description[zh_CN]": "提供让其它插件使用的文本输出工具视图,以便显示诸如编译器消息的信息。", @@ -21,14 +28,20 @@ "Name[ca@valencia]": "Vista de l'eixida", "Name[ca]": "Vista de la sortida", "Name[cs]": "Pohled na výstup", + "Name[de]": "Ansicht für Ausgaben", "Name[es]": "Vista de la salida", + "Name[et]": "Väljundivaade", "Name[fr]": "Vue de la sortie", + "Name[gl]": "Vista da saída", "Name[it]": "Vista output", "Name[nb]": "Utdata-visning", "Name[nl]": "Uitvoerweergave", "Name[pl]": "Widok wyjścia", "Name[pt]": "Área de Resultados", + "Name[pt_BR]": "Área de resultados", + "Name[ru]": "Панель вывода", "Name[sk]": "Pohľad na výstup", + "Name[sl]": "Prikaz izhoda", "Name[sv]": "Utmatningsvisning", "Name[tr]": "Çıktı Görünümü", "Name[uk]": "Перегляд виводу", diff --git a/plugins/subversion/kdevsubversion.json b/plugins/subversion/kdevsubversion.json index cc2c675467..259a333ffa 100644 --- a/plugins/subversion/kdevsubversion.json +++ b/plugins/subversion/kdevsubversion.json @@ -11,6 +11,7 @@ "Description[ca@valencia]": "Este connector integra el Subversion en el KDevelop.", "Description[ca]": "Aquest connector integra el Subversion en el KDevelop.", "Description[cs]": "Tento modul integruje podporu pro subversion v KDevelop", + "Description[de]": "Dieses Modul integriert Subversion in KDevelop.", "Description[es]": "Este complemento integra Subversion en KDevelop.", "Description[fr]": "Ce module intègre Subversion dans KDevelop.", "Description[it]": "Questa estensione integra Subversion in KDevelop.", @@ -29,14 +30,21 @@ "Name[ca@valencia]": "Implementació del Subversion", "Name[ca]": "Implementació del Subversion", "Name[cs]": "Podpora subversion", + "Name[de]": "Subversion-Unterstützung", "Name[es]": "Implementación de Subversion", + "Name[et]": "Subversioni toetus", "Name[fr]": "Prise en charge de Subversion", + "Name[gl]": "Soporte de Subversion", "Name[it]": "Supporto per Subversion", "Name[nb]": "Støtte for subversion", "Name[nl]": "Ondersteuning van subversion", + "Name[nn]": "Subversion-støtte", "Name[pl]": "Obsługa Subversion", "Name[pt]": "Suporte para o Subversion", + "Name[pt_BR]": "Suporte a Subversion", + "Name[ru]": "Поддержка Subversion", "Name[sk]": "Podpora subversion", + "Name[sl]": "Podpora za Subversion", "Name[sv]": "Subversion-stöd", "Name[tr]": "Suversion Desteği", "Name[uk]": "Підтримка Subversion", diff --git a/plugins/switchtobuddy/kdevswitchtobuddy.json b/plugins/switchtobuddy/kdevswitchtobuddy.json index acdc591e6e..dce39c47ba 100644 --- a/plugins/switchtobuddy/kdevswitchtobuddy.json +++ b/plugins/switchtobuddy/kdevswitchtobuddy.json @@ -4,13 +4,18 @@ "Description": "Allows switching between buddy documents like implementation and header file.", "Description[ca@valencia]": "Permet commutar entre documents associats com fitxers d'implementacions i de capçaleres.", "Description[ca]": "Permet commutar entre documents associats com fitxers d'implementacions i de capçaleres.", + "Description[de]": "Ermöglicht das Umschalten zwischen verwandten Dokumenten wie Implementations- und Header-Dateien.", "Description[es]": "Permite cambiar entre documentos asociados, como la implementación y el archivo de cabecera.", + "Description[et]": "Võimaldab lülituda sõltlasdokumentide, näiteks teostus- ja päisefaili vahel.", "Description[fr]": "Permet de basculer entre des documents amis comme l'implémentation et le fichier d'en-tête.", + "Description[gl]": "Permite trocar entre documentos tipo buddy como implementación e ficheiro de cabeceira.", "Description[it]": "Consente il passaggio tra i documenti associati come implementazioni e file header.", "Description[nl]": "Biedt omschakelen tussen buddy-documenten zoals implementatie en header-bestand.", "Description[pl]": "Pozwala na przełączanie pomiędzy stowarzyszonymi dokumentami takimi jak pliki implementacji i nagłówków.", "Description[pt]": "Permite a alternância entre os documentos associados, como o ficheiro de implementação ou o de inclusão.", + "Description[pt_BR]": "Permite a mudança de documentos associados, como os arquivos de implementação e de inclusão.", "Description[sk]": "Umožňuje prepínanie medzi dokumentmi priateľov ako súbor implementácie a hlavičky.", + "Description[sl]": "Omogoča preklapljanje med prijateljskimi dokumenti kot na primer izvedbo in datoteko glave.", "Description[sv]": "Tillåter byte mellan samhörande dokument som implementerings- och deklarationsfiler.", "Description[tr]": "Uygulama ve başlık dosyası gibi ilişkili belgeler arasında geçişe izin verir.", "Description[uk]": "Надає змогу перемикатися на споріднені документи, зокрема файли з реалізацією та файли заголовків.", @@ -21,14 +26,20 @@ "Name": "Switch to Buddy", "Name[ca@valencia]": "Commuta a associat", "Name[ca]": "Commuta a associat", + "Name[de]": "Zu verwandtem Element wechseln", "Name[es]": "Cambiar al asociado", + "Name[et]": "Lülitumine sõltlasele", "Name[fr]": "Passage à Buddy", + "Name[gl]": "Pasar a Buddy", "Name[it]": "Passa al file associato", "Name[nb]": "Bytt til kamerat", "Name[nl]": "Naar Buddy omschakelen", "Name[pl]": "Przełącz do stowarzyszonego", "Name[pt]": "Mudar para o Ficheiro Associado", + "Name[pt_BR]": "Mudar para o arquivo associado", + "Name[ru]": "Переход к связанному", "Name[sk]": "Prepnúť na Buddy", + "Name[sl]": "Preklopi na prijatelja", "Name[sv]": "Byt till samhörande", "Name[tr]": "Dosta Geçiş Yap", "Name[uk]": "Перемикання на споріднений", diff --git a/plugins/testview/kdevtestview.json b/plugins/testview/kdevtestview.json index da55569649..cd0f8e83f3 100644 --- a/plugins/testview/kdevtestview.json +++ b/plugins/testview/kdevtestview.json @@ -10,13 +10,19 @@ "Description": "Lets you see and run unit tests.", "Description[ca@valencia]": "Vos permet veure i executar proves unitàries.", "Description[ca]": "Us permet veure i executar proves unitàries.", + "Description[cs]": "Umožňuje vám zobrazit a spouštět unit testy.", + "Description[de]": "Unit-Tests anzeigen und ausführen.", "Description[es]": "Le permite ver y ejecutar pruebas unitarias.", + "Description[et]": "Ühiktestide näitamine ja käivitamine.", "Description[fr]": "Vous permet de voir et exécuter des tests unitaires.", + "Description[gl]": "Permite ver e executar probas unitarias.", "Description[it]": "Consente di vedere ed eseguire i test d'unità.", "Description[nl]": "Laat u testen van eenheden zien en uitvoeren.", "Description[pl]": "Pozwala tobie na obejrzenie i uruchomienie testów jednostkowych.", "Description[pt]": "Permite-lhe ver e executar testes unitários.", + "Description[pt_BR]": "Permite-lhe ver e executar testes unitários.", "Description[sk]": "Umožní vám vidieť a spustiť unit testy.", + "Description[sl]": "Omogoča ogled in zagon preizkusov enot.", "Description[sv]": "Låter dig titta på och köra enhetstester.", "Description[tr]": "Birim testlerini görmenizi ve çalıştırmanızı sağlar.", "Description[uk]": "Надає вам змогу переглядати і виконувати перевірки модулів.", @@ -28,14 +34,21 @@ "Name": "Unit Test View", "Name[ca@valencia]": "Vista de proves unitàries", "Name[ca]": "Vista de proves unitàries", + "Name[cs]": "Pohled na Unit testy", + "Name[de]": "Unittest-Ansicht", "Name[es]": "Vista de la prueba unitaria", + "Name[et]": "Ühiktestide vaade", "Name[fr]": "Affichage des tests unitaires", + "Name[gl]": "Vista de probas unitarias", "Name[it]": "Vista test d'unità", "Name[nb]": "Enhetstest-visning", "Name[nl]": "Weergave van test van eenheid", "Name[pl]": "Widok jednostkowego testu", "Name[pt]": "Área de Testes Unitários", + "Name[pt_BR]": "Exibição de testes unitários", + "Name[ru]": "Панель модульных тестов", "Name[sk]": "Pohľad unit testov", + "Name[sl]": "Prikaz preizkusov enot", "Name[sv]": "Visning av enhetstester", "Name[tr]": "Birim Test Görünümü", "Name[uk]": "Перегляд перевірок модулів", diff --git a/plugins/vcschangesview/kdevvcschangesview.json b/plugins/vcschangesview/kdevvcschangesview.json index 717a24a9f7..40a9955484 100644 --- a/plugins/vcschangesview/kdevvcschangesview.json +++ b/plugins/vcschangesview/kdevvcschangesview.json @@ -12,32 +12,40 @@ "Description": "This plugin provides integration between the projects and their VCS infrastructure", "Description[ca@valencia]": "Este connector proporciona la integració entre els projectes i la seua infraestructura de VCS", "Description[ca]": "Aquest connector proporciona la integració entre els projectes i la seva infraestructura de VCS", + "Description[de]": "Dieses Modul stellt eine Integration zwischen Projekten und ihrer VCS-Infrastruktur her.", "Description[es]": "Este complemento proporciona integración entre los proyectos y su infraestructura VCS", + "Description[et]": "See plugin võimaldab lõimida projektid ja nende versioonihalduse infrastruktuuri", "Description[fr]": "Ce module fournit une intégration entre les projets et leur infrastructure de contrôle de version", + "Description[gl]": "Este complemento fornece integración entre os proxectos e a súa infraestrutura VCS", "Description[it]": "Questa estensione fornisce integrazione tra i progetti e la loro infrastruttura VCS", "Description[nl]": "Deze plugin geeft integratie tussen de projecten en hun VCS-infrastructuur", "Description[pl]": "Wtyczka ta zapewnia integracje pomiędzy projektami i ich infrastrukturą systemu kontroli wersji (VCS)", "Description[pt]": "Este 'plugin' oferece a integração entre os projectos e a sua infra-estrutura de controlo de versões", + "Description[pt_BR]": "Este plugin fornece a integração entre os projetos e sua infraestrutura de VCS", "Description[sk]": "Tento plugin poskytuje integráciu medzi projektami a ich VCS infraštruktúrou", + "Description[sl]": "Ta vstavek ponuja most med projekti in njihovo infrastrukturo nadzora različic", "Description[sv]": "Det här insticksprogrammet tillhandahåller integrering mellan projekten och deras VCS infrastruktur", "Description[tr]": "Bu eklenti projeler ile VCS altyapıları arasında bütünleşme sağlar", "Description[uk]": "За допомогою цього додатка забезпечується інтеграція між проектами та інфраструктурою системи керування версіями (VCS)", "Description[x-test]": "xxThis plugin provides integration between the projects and their VCS infrastructurexx", "Description[zh_CN]": "此插件提供工程和它们的代码管理系统的集成", - "Icon": "git", + "Icon": "kdevelop", "Id": "kdevvcschangesviewplugin", "License": "GPL", "Name": "VCS Integration", "Name[ca@valencia]": "Integració de VCS", "Name[ca]": "Integració de VCS", + "Name[cs]": "Integrace VCS", "Name[de]": "VCS-Integration", "Name[es]": "Integración de VCS", "Name[fr]": "Intégration de VCS", + "Name[gl]": "Integración con VCS", "Name[it]": "Integrazione VCS", "Name[nb]": "VCS-integrering", "Name[nl]": "VCS-integratie", "Name[pl]": "Integracja VCS", "Name[pt]": "Integração com o SCV", + "Name[ru]": "Интеграция VCS", "Name[sk]": "Integrácia VCS", "Name[sv]": "Integrering av VCS", "Name[tr]": "Sürüm Kontrol Sistemi Bütünleşmesi", diff --git a/plugins/welcomepage/kdevwelcomepage.json b/plugins/welcomepage/kdevwelcomepage.json index 1dd4575640..f59086ce11 100644 --- a/plugins/welcomepage/kdevwelcomepage.json +++ b/plugins/welcomepage/kdevwelcomepage.json @@ -3,12 +3,15 @@ "Description": "Provides the welcome page visible in an empty session", "Description[ca@valencia]": "Proporciona la visibilitat de la pàgina de benvinguda en una sessió buida", "Description[ca]": "Proporciona la visibilitat de la pàgina de benvinguda en una sessió buida", + "Description[cs]": "Poskytuje uvítací obrazovku viditelnou v prázdném sezení", "Description[es]": "Proporciona la página de bienvenida visible en una sesión vacía", + "Description[fr]": "Fournit la page d'accueil visible dans une session vide", "Description[it]": "Fornisce la pagina di benvenuto visibile in una sessione vuota", "Description[nl]": "Biedt de welkomst pagina zichtbaar in een lege sessie", "Description[pl]": "Dostarcza stronę powitania widoczną przy pustych sesjach", "Description[pt]": "Oferece a página de boas-vindas que fica visível numa sessão vazia", "Description[sk]": "Poskytuje uvítaciu stránku viditeľnú v prázdnom sedení", + "Description[sl]": "Ponuja pozdravni zaslon, ki je viden v prazni seji", "Description[sv]": "Tillhandahåller välkomstsidan synlig i en tom session", "Description[tr]": "Boş oturumda görünen hoşgeldin sayfasını sağlar", "Description[uk]": "Забезпечує роботу сторінки вітання, яку програма показує, якщо сеанс порожній", @@ -19,13 +22,18 @@ "Name[ca@valencia]": "Pàgina de benvinguda del KDevelop", "Name[ca]": "Pàgina de benvinguda del KDevelop", "Name[cs]": "Uvítací stránka KDevelop", + "Name[de]": "KDevelop-Startseite", "Name[es]": "Página de bienvenida de KDevelop", + "Name[et]": "KDevelopi tervituslehekülg", "Name[fr]": "Page d'accueil de KDevelop", + "Name[gl]": "Páxina de benvida de KDevelop", "Name[it]": "Pagina di benvenuto di KDevelop", "Name[nl]": "Welkomstpagina van KDevelop", "Name[pl]": "Strona powitalna KDevelop", "Name[pt]": "Página de Boas-Vindas do KDevelop", + "Name[pt_BR]": "Página de boas-vindas do KDevelop", "Name[sk]": "Uvítacia stránka KDevelop", + "Name[sl]": "Pozdravna stran za KDevelop", "Name[sv]": "KDevelop välkomstsida", "Name[tr]": "KDevelop Karşılama Sayfası", "Name[uk]": "Сторінка вітання KDevelop", diff --git a/shortcuts/QtCreator b/shortcuts/QtCreator index 45136e0012..bd1334742e 100644 --- a/shortcuts/QtCreator +++ b/shortcuts/QtCreator @@ -49,8 +49,10 @@ - - + + + +