Page MenuHomeSolus

D7027.diff
No OneTemporary

D7027.diff

diff --git a/files/git_373ef7d503a161d9e165f53d916508566d892c05_to_85a0b569780dc423fc368f45b2ebbf6cd1d07a2e.patch b/files/git_373ef7d503a161d9e165f53d916508566d892c05_to_85a0b569780dc423fc368f45b2ebbf6cd1d07a2e.patch
new file mode 100644
--- /dev/null
+++ b/files/git_373ef7d503a161d9e165f53d916508566d892c05_to_85a0b569780dc423fc368f45b2ebbf6cd1d07a2e.patch
@@ -0,0 +1,1239 @@
+diff --git a/CMakeLists.txt b/CMakeLists.txt
+index 1c4e2fd..680ae3e 100644
+--- a/CMakeLists.txt
++++ b/CMakeLists.txt
+@@ -1,11 +1,11 @@
+ cmake_minimum_required(VERSION 3.0)
+
+-set(GDRIVE_VERSION 1.2.6)
++set(GDRIVE_VERSION 1.2.70)
+ project(kio-gdrive VERSION ${GDRIVE_VERSION})
+
+ set(QT_MIN_VERSION 5.2.0)
+-set(KF5_MIN_VERSION 5.14.0)
+-set(KGAPI_MIN_VERSION 5.5.0)
++set(KF5_MIN_VERSION 5.48.0)
++set(KGAPI_MIN_VERSION 5.11.41)
+ set(KACCOUNTS_MIN_VERSION 17.04.0)
+ set(QTKEYCHAIN_MIN_VERSION 0.6.0)
+
+diff --git a/autotests/urltest.cpp b/autotests/urltest.cpp
+index cb548c2..c2c9eba 100644
+--- a/autotests/urltest.cpp
++++ b/autotests/urltest.cpp
+@@ -1,5 +1,6 @@
+ /*
+ * Copyright (c) 2016 Elvis Angelaccio <elvis.angelaccio@kde.org>
++ * Copyright (c) 2019 David Barchiesi <david@barchie.si>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+@@ -36,7 +37,7 @@ void UrlTest::testGDriveUrl_data()
+ {
+ const auto gdriveUrl = [](const QString &path) {
+ QUrl url;
+- url.setScheme(QStringLiteral("gdrive"));
++ url.setScheme(GDriveUrl::Scheme);
+ url.setPath(path);
+ return url;
+ };
+@@ -45,65 +46,113 @@ void UrlTest::testGDriveUrl_data()
+ QTest::addColumn<QString>("expectedToString");
+ QTest::addColumn<QString>("expectedAccount");
+ QTest::addColumn<QString>("expectedParentPath");
++ QTest::addColumn<bool>("expectedIsTrashed");
++ QTest::addColumn<bool>("expectedIsTopLevel");
+ QTest::addColumn<QStringList>("expectedPathComponents");
++ QTest::addColumn<QString>("expectedFilename");
+
+ QTest::newRow("root url")
+ << gdriveUrl(QStringLiteral("/"))
+ << QStringLiteral("gdrive:/")
+ << QString()
+ << QString()
+- << QStringList();
++ << false
++ << false
++ << QStringList()
++ << "";
+
+ QTest::newRow("account root url")
+ << gdriveUrl(QStringLiteral("/foo@gmail.com"))
+ << QStringLiteral("gdrive:/foo@gmail.com")
+ << QStringLiteral("foo@gmail.com")
+ << QStringLiteral("/")
+- << QStringList {QStringLiteral("foo@gmail.com")};
++ << false
++ << false
++ << QStringList {QStringLiteral("foo@gmail.com")}
++ << QStringLiteral("foo@gmail.com");
++
++ QTest::newRow("account trash url")
++ << gdriveUrl(QStringLiteral("/foo@gmail.com/") + GDriveUrl::TrashDir)
++ << QStringLiteral("gdrive:/foo@gmail.com/") + GDriveUrl::TrashDir
++ << QStringLiteral("foo@gmail.com")
++ << QStringLiteral("/foo@gmail.com")
++ << false
++ << true
++ << QStringList {QStringLiteral("foo@gmail.com"), GDriveUrl::TrashDir}
++ << GDriveUrl::TrashDir;
++
++ QTest::newRow("file in trash")
++ << gdriveUrl(QStringLiteral("/foo@gmail.com/") + GDriveUrl::TrashDir + ("/baz.txt"))
++ << QStringLiteral("gdrive:/foo@gmail.com/") + GDriveUrl::TrashDir + ("/baz.txt")
++ << QStringLiteral("foo@gmail.com")
++ << QStringLiteral("/foo@gmail.com/") + GDriveUrl::TrashDir
++ << true
++ << false
++ << QStringList {QStringLiteral("foo@gmail.com"), GDriveUrl::TrashDir, QStringLiteral("baz.txt")}
++ << QStringLiteral("baz.txt");
+
+ QTest::newRow("file in account root")
+ << gdriveUrl(QStringLiteral("/foo@gmail.com/bar.txt"))
+ << QStringLiteral("gdrive:/foo@gmail.com/bar.txt")
+ << QStringLiteral("foo@gmail.com")
+ << QStringLiteral("/foo@gmail.com")
+- << QStringList {QStringLiteral("foo@gmail.com"), QStringLiteral("bar.txt")};
++ << false
++ << true
++ << QStringList {QStringLiteral("foo@gmail.com"), QStringLiteral("bar.txt")}
++ << QStringLiteral("bar.txt");
+
+ QTest::newRow("folder in account root - no trailing slash")
+ << gdriveUrl(QStringLiteral("/foo@gmail.com/bar"))
+ << QStringLiteral("gdrive:/foo@gmail.com/bar")
+ << QStringLiteral("foo@gmail.com")
+ << QStringLiteral("/foo@gmail.com")
+- << QStringList {QStringLiteral("foo@gmail.com"), QStringLiteral("bar")};
++ << false
++ << true
++ << QStringList {QStringLiteral("foo@gmail.com"), QStringLiteral("bar")}
++ << QStringLiteral("bar");
++
+ QTest::newRow("folder in account root - trailing slash")
+ << gdriveUrl(QStringLiteral("/foo@gmail.com/bar/"))
+ << QStringLiteral("gdrive:/foo@gmail.com/bar/")
+ << QStringLiteral("foo@gmail.com")
+ << QStringLiteral("/foo@gmail.com")
+- << QStringList {QStringLiteral("foo@gmail.com"), QStringLiteral("bar")};
++ << false
++ << true
++ << QStringList {QStringLiteral("foo@gmail.com"), QStringLiteral("bar")}
++ << QStringLiteral("bar");
+
+ QTest::newRow("file in subfolder")
+ << gdriveUrl(QStringLiteral("/foo@gmail.com/bar/baz.txt"))
+ << QStringLiteral("gdrive:/foo@gmail.com/bar/baz.txt")
+ << QStringLiteral("foo@gmail.com")
+ << QStringLiteral("/foo@gmail.com/bar")
+- << QStringList {QStringLiteral("foo@gmail.com"), QStringLiteral("bar"), QStringLiteral("baz.txt")};
++ << false
++ << false
++ << QStringList {QStringLiteral("foo@gmail.com"), QStringLiteral("bar"), QStringLiteral("baz.txt")}
++ << QStringLiteral("baz.txt");
+ }
+
+ void UrlTest::testGDriveUrl()
+ {
+ QFETCH(QUrl, url);
++ const auto gdriveUrl = GDriveUrl(url);
++
+ QFETCH(QString, expectedToString);
+- QCOMPARE(url.toString(), expectedToString);
++ QCOMPARE(gdriveUrl.url(), QUrl(expectedToString));
+
+ QFETCH(QString, expectedAccount);
+ QFETCH(QString, expectedParentPath);
++ QFETCH(bool, expectedIsTrashed);
++ QFETCH(bool, expectedIsTopLevel);
+ QFETCH(QStringList, expectedPathComponents);
+-
+- const auto gdriveUrl = GDriveUrl(url);
++ QFETCH(QString, expectedFilename);
+
+ QCOMPARE(gdriveUrl.account(), expectedAccount);
+ QCOMPARE(gdriveUrl.parentPath(), expectedParentPath);
+ QCOMPARE(gdriveUrl.pathComponents(), expectedPathComponents);
++ QCOMPARE(gdriveUrl.isTrashed(), expectedIsTrashed);
++ QCOMPARE(gdriveUrl.isTopLevel(), expectedIsTopLevel);
++ QCOMPARE(gdriveUrl.filename(), expectedFilename);
+
+ if (expectedPathComponents.isEmpty()) {
+ QVERIFY(gdriveUrl.isRoot());
+diff --git a/cmake/modules/FindIntltool.cmake b/cmake/modules/FindIntltool.cmake
+index 5c426a2..450dad8 100644
+--- a/cmake/modules/FindIntltool.cmake
++++ b/cmake/modules/FindIntltool.cmake
+@@ -47,4 +47,4 @@ find_package_handle_standard_args(Intltool
+
+ set(INTLTOOL_OPTIONS_DEFAULT
+ "--quiet"
+-)
+\ No newline at end of file
++)
+diff --git a/desktop/CMakeLists.txt b/desktop/CMakeLists.txt
+index c5bbcdb..da56001 100644
+--- a/desktop/CMakeLists.txt
++++ b/desktop/CMakeLists.txt
+@@ -1,4 +1,4 @@
+ install(FILES gdrive-network.desktop
+ DESTINATION ${KDE_INSTALL_DATADIR}/remoteview)
+-install(FILES org.kde.kio-gdrive.appdata.xml
++install(FILES org.kde.kio_gdrive.metainfo.xml
+ DESTINATION ${KDE_INSTALL_METAINFODIR})
+diff --git a/desktop/gdrive-network.desktop b/desktop/gdrive-network.desktop
+index 40a4a2a..0df3f54 100644
+--- a/desktop/gdrive-network.desktop
++++ b/desktop/gdrive-network.desktop
+@@ -1,16 +1,20 @@
+ [Desktop Entry]
+ Icon=folder-gdrive
+ Name=Google Drive
++Name[ar]=غوغل درايڤ
+ Name[ca]=Google Drive
+ Name[ca@valencia]=Google Drive
+ Name[cs]=Google Drive
+ Name[da]=Google Drev
+ Name[de]=Google Drive
++Name[el]=Google Drive
+ Name[en_GB]=Google Drive
+ Name[es]=Google Drive
+ Name[fi]=Google Drive
+ Name[fr]=Google Drive
+ Name[gl]=Google Drive
++Name[he]=Google Drive
++Name[ia]=Google Drive
+ Name[it]=Google Drive
+ Name[ko]=Google 드라이브
+ Name[nl]=Google Drive
+@@ -18,9 +22,11 @@ Name[nn]=Google Drive
+ Name[pl]=Dysk Google
+ Name[pt]=Google Drive
+ Name[pt_BR]=Google Drive
+-Name[ru]=Диск Google
++Name[ru]=Google Диск
+ Name[sk]=Google Drive
++Name[sl]=Google Drive
+ Name[sv]=Google Drive
++Name[tr]=Google Drive
+ Name[uk]=Google Диск
+ Name[x-test]=xxGoogle Drivexx
+ Name[zh_CN]=Google 云端硬盘
+diff --git a/desktop/org.kde.kio-gdrive.appdata.xml b/desktop/org.kde.kio_gdrive.metainfo.xml
+similarity index 55%
+rename from desktop/org.kde.kio-gdrive.appdata.xml
+rename to desktop/org.kde.kio_gdrive.metainfo.xml
+index 1fd668d..c9ea539 100644
+--- a/desktop/org.kde.kio-gdrive.appdata.xml
++++ b/desktop/org.kde.kio_gdrive.metainfo.xml
+@@ -1,6 +1,6 @@
+ <?xml version="1.0" encoding="utf-8"?>
+ <component type="addon">
+- <id>org.kde.kio-gdrive</id>
++ <id>org.kde.kio_gdrive</id>
+ <metadata_license>CC0-1.0</metadata_license>
+ <project_license>GPL-2.0+</project_license>
+ <extends>org.kde.dolphin.desktop</extends>
+@@ -11,7 +11,9 @@
+ <name xml:lang="ca">KIO GDrive</name>
+ <name xml:lang="ca-valencia">KIO GDrive</name>
+ <name xml:lang="cs">KIO GDrive</name>
++ <name xml:lang="da">KIO GDrive</name>
+ <name xml:lang="de">KIO GDrive</name>
++ <name xml:lang="el">KIO GDrive</name>
+ <name xml:lang="en-GB">KIO GDrive</name>
+ <name xml:lang="es">KIO GDrive</name>
+ <name xml:lang="fi">KIO GDrive</name>
+@@ -20,24 +22,28 @@
+ <name xml:lang="id">KIO GDrive</name>
+ <name xml:lang="it">KIO GDrive</name>
+ <name xml:lang="ko">KIO GDrive</name>
+- <name xml:lang="nl">KIO GDrive</name>
++ <name xml:lang="nl">KIO-GDrive</name>
+ <name xml:lang="nn">KIO GDrive</name>
+ <name xml:lang="pl">KIO GDrive</name>
+ <name xml:lang="pt">KIO GDrive</name>
+ <name xml:lang="pt-BR">KIO GDrive</name>
+- <name xml:lang="ru">KIO для поддержки Диска Google</name>
++ <name xml:lang="ru">KIO для поддержки Google Диска</name>
+ <name xml:lang="sk">KIO GDrive</name>
+ <name xml:lang="sv">KIO Gdrive</name>
++ <name xml:lang="tr">KIO GDrive</name>
+ <name xml:lang="uk">KIO GDrive</name>
+ <name xml:lang="x-test">xxKIO GDrivexx</name>
+ <name xml:lang="zh-CN">KIO GDrive</name>
++ <name xml:lang="zh-TW">KIO GDrive</name>
+ <summary>Google Drive integration with KDE Plasma and KDE applications</summary>
+ <summary xml:lang="ca">Integració del Drive de Google amb el Plasma del KDE i les aplicacions KDE</summary>
+ <summary xml:lang="ca-valencia">Integració del Drive de Google amb el Plasma del KDE i les aplicacions KDE</summary>
+ <summary xml:lang="cs">Integrace Google Drive do KDE Plasma a aplikací KDE</summary>
++ <summary xml:lang="da">Google Drive-integration med KDE Plasma og KDE-programmer</summary>
+ <summary xml:lang="de">Integration von Google Drive mit Plasma und den KDE-Anwendungen</summary>
++ <summary xml:lang="el">Ενσωμάτωση του Google Drive με το KDE Plasma και τις εφαρμογές του KDE</summary>
+ <summary xml:lang="en-GB">Google Drive integration with KDE Plasma and KDE applications</summary>
+- <summary xml:lang="es">Integración de Google Drive con Plasma y aplicaciones de KDE</summary>
++ <summary xml:lang="es">Integración de Google Drive con Plasma de KDE y aplicaciones de KDE</summary>
+ <summary xml:lang="fi">Google Drive -integrointi KDE Plasmaan ja KDE-sovelluksiin</summary>
+ <summary xml:lang="fr">Intégration de Google Drive à KDE Plasma et aux applications KDE</summary>
+ <summary xml:lang="gl">Integración de Google Drive con KDE Plasma e os aplicativos de KDE</summary>
+@@ -47,21 +53,25 @@
+ <summary xml:lang="nl">Integratie van Google Drive met KDE Plasma en KDE applications</summary>
+ <summary xml:lang="nn">Integrering av Google Drive, KDE Plasma og KDE-programma</summary>
+ <summary xml:lang="pl">Integracja Dysku Google z KDE Plazmą i aplikacjami KDE</summary>
+- <summary xml:lang="pt">Integração do Google Drive com o Plasma e as aplicações do KDE</summary>
++ <summary xml:lang="pt">Integração do Google Drive com o Plasma do KDE e as aplicações do KDE</summary>
+ <summary xml:lang="pt-BR">Integração do Google Drive com o KDE Plasma e aplicativos do KDE</summary>
+- <summary xml:lang="ru">Интеграция Диска Google с KDE Plasma и приложениями от KDE</summary>
+- <summary xml:lang="sk">Integrácia Google disku s KDE Plasma a KDE aplikáciami</summary>
++ <summary xml:lang="ru">Интеграция Google Диска с KDE Plasma и приложениями от KDE</summary>
++ <summary xml:lang="sk">Integrácia Google Drive integration s KDE Plasma a KDE aplikáciami</summary>
+ <summary xml:lang="sv">Integrering av Google Drive med KDE Plasma och KDE-program</summary>
++ <summary xml:lang="tr">KDE Plasma ve KDE uygulamaları ile Google Drive tümleştirmesi</summary>
+ <summary xml:lang="uk">Інтеграція Диска Google із Плазмою KDE та програмами KDE</summary>
+ <summary xml:lang="x-test">xxGoogle Drive integration with KDE Plasma and KDE applicationsxx</summary>
+ <summary xml:lang="zh-CN">KDE Plasma 和 KDE 应用的 Google 云端硬盘整合</summary>
++ <summary xml:lang="zh-TW">適用於 KDE Plasma 和 KDE 應用程式的 Google Drive 整合</summary>
+ <description>
+ <p>KIO GDrive is a KIO slave that enables KIO-aware applications (such as Dolphin, Kate or Gwenview) to access and edit Google Drive files on the cloud.</p>
+ <p xml:lang="ca">El KIO GDrive és un esclau del KIO que habilita les aplicacions preparades per al KIO (com el Dolphin, el Kate o el Gwenview) per accedir i editar fitxers del Drive de Google en el núvol.</p>
+ <p xml:lang="ca-valencia">El KIO GDrive és un esclau del KIO que habilita les aplicacions preparades per al KIO (com el Dolphin, el Kate o el Gwenview) per accedir i editar fitxers del Drive de Google en el núvol.</p>
++ <p xml:lang="da">KIO GDrive er en KIO-slave der gør det muligt for KIO-bevidste programmer (såsom Dolphin, Kate eller Gwenview) at tilgå og redigere Google Drive-filer i skyen.</p>
+ <p xml:lang="de">KIO GDrive ist ein Ein-/Ausgabemodul, mit dem Anwendungen wie Dolphin, Kate oder Gwenview auf Dateien in der Cloud Google Drive zugreifen und bearbeiten können.</p>
++ <p xml:lang="el">Το KIO GDrive είναι ένας KIO slave που ενεργοποιεί εφαρμογές με επίγνωση του KIO (όπως Dolphin, Kate ή Gwenview) για την πρόσβαση και επεξεργασία αρχείων του Google Drive στο νέφος.</p>
+ <p xml:lang="en-GB">KIO GDrive is a KIO slave that enables KIO-aware applications (such as Dolphin, Kate or Gwenview) to access and edit Google Drive files on the cloud.</p>
+- <p xml:lang="es">KIO GDrive es un esclavo KIO que permite que aplicaciones KIO-compatibles (como Dolphin, Kate o Gwenview) acceder y editar archivos de Google Drive en la nube.</p>
++ <p xml:lang="es">KIO GDrive es un esclavo de KIO que activa aplicaciones KIO-compatible (tales como, Dolphin, Kate o Gwenview) para acceder y editar archivos de Google Drive en la nube. </p>
+ <p xml:lang="fi">KIO GDrive on KIO-asiakas, joka sallii KIO-sovellusten (kuten Dolphinin, Katen tai Gwenview’n) päästä käsiksi Google Driven tiedostoihin pilvessä.</p>
+ <p xml:lang="fr">KIO GDrive est un module d'entrée / sortie qui permet aux applications prenant en charge KIO (comme Dolphin, Kate ou Gwenview) d'accéder aux fichiers stockés en ligne sur Google Drive et de les modifier.</p>
+ <p xml:lang="gl">KIO GDrive é un escravo de KIO que permite aos aplicativos que usan KIO (como Dolphin, Kate ou Gwenview) acceder e editar ficheiros de Google Drive na nube.</p>
+@@ -71,16 +81,49 @@
+ <p xml:lang="nl">KIO GDrive is een KIO-slave die met KIO bekende toepassingen (zoals Dolphin, Kate of Gwenview) toegang geeft tot bestanden en deze bewerkt op Google Drive in de cloud.</p>
+ <p xml:lang="nn">KIO GDrive er ein KIO-slave som lèt program som brukar KIO (for eksempel Dolphin, Kate og Gwenview) få lese- og skrivetilgang til filene dine på Google Drive.</p>
+ <p xml:lang="pl">KIO GDrive jest KIO slave, który umożliwia aplikacjom świadomym KIO (takim jak Dolphin, Kate lub Gwenview) na dostęp i edycję plików w chmurze Dysku Google.</p>
+- <p xml:lang="pt">O KIO GDrive é um KIO slave que permite às aplicações que suportam o KIO (como o Dolphin, o Kate ou o Gwenview) aceder e editar ficheiros do Google Drive na 'cloud'.</p>
++ <p xml:lang="pt">O KIO GDrive é um 'KIO slave' que permite às aplicações com suporte do KIO (como o Dolphin, o Kate ou o Gwenview) acederem e editarem ficheiros do Google Drive na 'cloud'.</p>
+ <p xml:lang="pt-BR">O KIO GDrive é um KIO slave que permite a aplicativos com suporte a KIO (como Dolphin, Kate ou Gwenview) acessar e editar arquivos do Google Drive na nuvem.</p>
+- <p xml:lang="sk">KIO GDrive je KIO slave, ktorý umožní KIO-aware aplikáciám (ako Dolphin, Kate alebo Gwenview) pristupovať a upravovať súbory Google disku na cloude.</p>
++ <p xml:lang="sk">KIO GDrive je KIO slave, ktorý umožňuje nie KIO aplikáciám (ako Dolphin, Kate alebo Gwenview) pristupovať a upravovať súbory na Google Drive na cloude.</p>
+ <p xml:lang="sv">KIO GDrive är en I/O-slav som gör det möjligt för program medvetna om KIO (såsom Dolphin, Kate eller Gwenview) att komma åt och redigera Google Drive-filer i molnet.</p>
++ <p xml:lang="tr">KIO GDrive, buluttaki Google Drive dosylarına erişimek ve düzenleme yapmak için, KIO uygulamalarını etkinleştiren bir KIO bağımlılığıdır.</p>
+ <p xml:lang="uk">KIO GDrive — допоміжний засіб введення-виведення даних, який уможливлює для програм із підтримкою KIO (зокрема Dolphin, Kate та Gwenview) доступ та редагування даних файлів на Диску Google у обчислювальній «хмарі».</p>
+ <p xml:lang="x-test">xxKIO GDrive is a KIO slave that enables KIO-aware applications (such as Dolphin, Kate or Gwenview) to access and edit Google Drive files on the cloud.xx</p>
++ <p xml:lang="zh-CN">KIO GDrive 是 Google 云端硬盘的 KIO 从属,它能够让支持 KIO 的程序 (例如 Dolphin,Kate 或 Gwenview) 访问和编辑 Google 云端硬盘上的文件。</p>
+ </description>
+ <url type="homepage">https://community.kde.org/KIO_GDrive</url>
+ <url type="bugtracker">https://bugs.kde.org/enter_bug.cgi?format=guided&amp;product=kio-gdrive</url>
+ <url type="help">https://docs.kde.org/index.php?application=kioslave5%2Fgdrive</url>
+ <update_contact>elvis.angelaccio_at_kde.org</update_contact>
++ <screenshots>
++ <screenshot type="default">
++ <caption>Dolphin showing KIO GDrive in lower right, and Falkon browsing Google Drive in upper left.</caption>
++ <caption xml:lang="ca">El Dolphin mostra el KIO GDrive a la part inferior dreta, i el Falkon mostra el Google Drive a la part superior esquerra.</caption>
++ <caption xml:lang="ca-valencia">El Dolphin mostra el KIO GDrive a la part inferior dreta, i el Falkon mostra el Google Drive a la part superior esquerra.</caption>
++ <caption xml:lang="de">Ansicht von Dolphin mit KIO GDrive unten rechts und Falkon auf Google Drive oben links.</caption>
++ <caption xml:lang="en-GB">Dolphin showing KIO GDrive in lower right, and Falkon browsing Google Drive in upper left.</caption>
++ <caption xml:lang="es">Dolphin mostrando KIO GDrive abajo a la derecha y Falkon navegando por Google Drive arriba a la izquierda.</caption>
++ <caption xml:lang="fi">Dolphin näyttää KIO-GDriven alaoikealla ja Falkon selaa Google Driveen ylävasemmalla.</caption>
++ <caption xml:lang="fr">Dolphin affichant IO GDrive dans le coin inférieur gauche et Falkon naviguant sur Google Drive dans le coin supérieur gauche.</caption>
++ <caption xml:lang="gl">Dolphin mostrando KIO GDrive na parte inferior dereita, e Falkon navegando Google Drive na parte superior esquerda.</caption>
++ <caption xml:lang="id">Dolphin menampilkan KIO GDrive di sebelah kanan bawah, dan Falkon menelusuri Google Drive di sebelah kiri atas</caption>
++ <caption xml:lang="it">Dolphin che mostra KIO GDrive nella parte inferiore destra, e Falkon che sfoglia Google Drive nella parte superiore sinistra.</caption>
++ <caption xml:lang="ko">오른쪽 아래: Dolphin으로 연 KIO GDrive, 왼쪽 위: Falkon으로 연 Google 드라이브.</caption>
++ <caption xml:lang="nl">Dolphin die KIO-GDrive rechtsonder toont en Falkon browsing Google Drive linksboven.</caption>
++ <caption xml:lang="nn">Dolphin-vindauge med KIO GDrive nede til høgre, samt Falkon som viser Google Drive oppe til venstre.</caption>
++ <caption xml:lang="pl">Dolphin pokazujący KIO GDrive w dolnym, prawym narożniku i Falkon przeglądający Dysk Google w górnym, lewym narożniku.</caption>
++ <caption xml:lang="pt">O Dolphin a mostrar o KIO GDrive em baixo e à direita, assim como o Falkon a navegar pelo Google Drive em cima e à esquerda.</caption>
++ <caption xml:lang="pt-BR">O Dolphin mostrando o KIO GDrive abaixo à direita, assim como o Falkon navegando pelo Google Drive acima à esquerda.</caption>
++ <caption xml:lang="sk">Dolphin zobrazuje KIO GDrive vpravo dole a Falkon prehliadajúci Google Drive vpravo hore.</caption>
++ <caption xml:lang="sv">Dolphin som visar KIO GDrive nere till höger, och Falkon som bläddrat till Google Drive uppe till vänster.</caption>
++ <caption xml:lang="uk">Dolphin із відкритим KIO GDrive внизу праворуч і Falkon з відкритою сторінкою Google Диск вгорі ліворуч.</caption>
++ <caption xml:lang="x-test">xxDolphin showing KIO GDrive in lower right, and Falkon browsing Google Drive in upper left.xx</caption>
++ <caption xml:lang="zh-CN">右下角 Dolphin 显示 KIO GDrive,左上角 Falkon 浏览 Google 云端硬盘网页版。</caption>
++ <image type="source" width="1664" height="936">https://cdn.kde.org/screenshots/kio-gdrive/kio-gdrive.png</image>
++ </screenshot>
++ </screenshots>
+ <project_group>KDE</project_group>
++ <categories>
++ <category>Network</category>
++ </categories>
++ <icon type="stock">folder-gdrive</icon>
+ </component>
+diff --git a/kaccounts/gdrive.notifyrc b/kaccounts/gdrive.notifyrc
+index 0fe8db0..c4eb65a 100644
+--- a/kaccounts/gdrive.notifyrc
++++ b/kaccounts/gdrive.notifyrc
+@@ -6,11 +6,14 @@ Comment[ca@valencia]=KIO GDrive
+ Comment[cs]=KIO GDrive
+ Comment[da]=KIO GDrive
+ Comment[de]=KIO GDrive
++Comment[el]=KIO GDrive
+ Comment[en_GB]=KIO GDrive
+ Comment[es]=KIO GDrive
+ Comment[fi]=KIO GDrive
+ Comment[fr]=KIO GDrive
+ Comment[gl]=KIO GDrive
++Comment[he]=KIO GDrive
++Comment[ia]=KIO GDrive
+ Comment[it]=KIO GDrive
+ Comment[ko]=KIO GDrive
+ Comment[nl]=KIO GDrive
+@@ -18,9 +21,11 @@ Comment[nn]=KIO GDrive
+ Comment[pl]=KIO GDrive
+ Comment[pt]=KIO GDrive
+ Comment[pt_BR]=KIO GDrive
+-Comment[ru]=KIO для поддержки Диска Google
++Comment[ru]=KIO для поддержки Google Диска
+ Comment[sk]=KIO GDrive
++Comment[sl]=KIO GDrive
+ Comment[sv]=KIO Gdrive
++Comment[tr]=KIO GDrive
+ Comment[uk]=KIO GDrive
+ Comment[x-test]=xxKIO GDrivexx
+ Comment[zh_CN]=KIO GDrive
+@@ -33,21 +38,26 @@ Name[ca@valencia]=S'ha afegit un compte nou
+ Name[cs]=Byl přidán nový účet
+ Name[da]=Ny konto tilføjet
+ Name[de]=Neuer Zugang hinzugefügt
++Name[el]=Προστέθηκε νέος λογαριασμός
+ Name[en_GB]=New Account Added
+-Name[es]=Añadida nueva cuenta
++Name[es]=Nueva cuenta añadida
+ Name[fi]=Uusi tili lisätty
+ Name[fr]=Nouveau compte ajouté
+ Name[gl]=Engadiuse unha nova conta
++Name[he]=חשבון חדש התווסף
++Name[ia]=Nove conto addite
+ Name[it]=Nuovo account aggiunto
+ Name[ko]=새 계정 추가됨
+ Name[nl]=Nieuw account toegevoegd
+ Name[nn]=Ny konto lagd til
+ Name[pl]=Dodano nowe konto
+-Name[pt]=Nova Conta Adicionada
++Name[pt]=Conta Nova Adicionada
+ Name[pt_BR]=Nova conta adicionada
+ Name[ru]=Добавлена учётная запись
+-Name[sk]=Nový účet pridaný
++Name[sk]=Pridaný nový účet
++Name[sl]=Dodan nov račun
+ Name[sv]=Nytt konto tillagt
++Name[tr]=Yeni Hesap Eklendi
+ Name[uk]=Додано новий обліковий запис
+ Name[x-test]=xxNew Account Addedxx
+ Name[zh_CN]=新帐户已添加
+@@ -55,22 +65,27 @@ Name[zh_TW]=已新增帳號
+ Comment= Shortcut to browse Google Drive files as soon as a new Google account has been added.
+ Comment[ca]=Drecera per explorar els fitxers de Google Drive tan aviat com s'afegeixi un compte nou de Google.
+ Comment[ca@valencia]=Drecera per explorar els fitxers de Google Drive tan prompte com s'afija un compte nou de Google.
+-Comment[da]=Genvej til at gennemse Google Drev-filer så snart en ny Google-konto er blevet tilføjet.
++Comment[da]=Genvej til at gennemse Google Drev-filer så snart en ny Google-konto er blevet tilføjet.
+ Comment[de]=Kurzbefehl zum Durchsuchen von Dateien auf Google Drive, sobald ein neuer Zugang für Google hinzugefügt wurde.
++Comment[el]=Συντόμευση για περιήγηση σε αρχεία του Google Drive αμέσως μόλις προστεθεί νέος λογαριασμός Google.
+ Comment[en_GB]= Shortcut to browse Google Drive files as soon as a new Google account has been added.
+-Comment[es]=Acceso directo para navegar por archivos Google Drive tan pronto como se añada una cuenta de Google.
++Comment[es]=Acceso directo para navegar por los archivos de Google Drive tan pronto como se añada una nueva cuenta de Google.
+ Comment[fi]= Oikotie Google Drive -tiedostojen selailuun heti, kun uusi Google-tili on lisätty.
+ Comment[fr]= Raccourci pour parcourir les fichiers Google Drive dès qu'un nouveau compte Google a été ajouté.
+ Comment[gl]=Atallo para examinar os ficheiros de Google Drive en canto se engada unha nova conta de Google.
++Comment[he]=קיצור לסיור בקבצי Google Drive מיד עם הוספת חשבון Google.
++Comment[ia]=Via breve pro cercar files de Google Drive quando un nove conto de Google ha essite addite.
+ Comment[it]= Scorciatoia per navigare tra i file di Google Drive dopo che è stato aggiunto un nuovo account di Google.
+ Comment[ko]= 새로운 Google 계정을 추가했을 때 Google 드라이브에 있는 파일을 볼 수 있는 바로 가기를 추가합니다.
+ Comment[nl]= Sneltoets om door Google Drive bestanden te bladeren zodra een nieuw Google account is toegevoegd.
+ Comment[nn]= Snarveg for å bla gjennom Google Drive-filer så snart ein ny Google-konto er lagd til.
+ Comment[pl]=Skrót do przeglądania Dysku Google od razu po dodaniu konta Google.
+-Comment[pt]=Um atalho para navegar pelos ficheiros do Google Drive, assim que tiver sido adicionada uma conta da Google.
++Comment[pt]=Atalho para navegar pelos ficheiros do Google Drive assim que for adicionada uma conta nova da Google.
+ Comment[pt_BR]=Atalho para navegar nos arquivos do Google Drive tão logo uma conta Google for adicionada.
+-Comment[sk]= Skratka na prehliadanie súborov Google disk hneď, ako sa pridá účet Google.
++Comment[sk]=Skratka na prehliadanie súborov na Google Drive akonáhle je pridaný nový Google účet.
++Comment[sl]=Bližnjica za brskanje po Google Drive takoj po dodatku novega računa Google.
+ Comment[sv]= Genväg för att bläddra i Google Drive-filer så snart ett nytt Google-konto har lagts till.
++Comment[tr]=Yeni bir Google hesabı eklendiğinde Google Drive dosyalarına göz atma kısayolu.
+ Comment[uk]=Кнопка для перегляду файлів Google Диск після додавання нового облікового запису Google.
+ Comment[x-test]=xx Shortcut to browse Google Drive files as soon as a new Google account has been added.xx
+ Comment[zh_CN]= 浏览 Google 云端硬盘的文件的快捷方式,只要 Google 账号被添加即可使用。
+diff --git a/kaccounts/kaccountsplugin.cpp b/kaccounts/kaccountsplugin.cpp
+index b60e59a..5499f13 100644
+--- a/kaccounts/kaccountsplugin.cpp
++++ b/kaccounts/kaccountsplugin.cpp
+@@ -50,7 +50,7 @@ void GoogleDrivePlugin::onAccountCreated(const Accounts::AccountId accountId, co
+ url.setPath(QStringLiteral("/%1").arg(account->displayName()));
+
+ connect(notification, static_cast<void (KNotification::*)(unsigned int)>(&KNotification::activated), this, [=]() {
+- KRun::runUrl(url, QStringLiteral("inode/directory"), nullptr);
++ KRun::runUrl(url, QStringLiteral("inode/directory"), nullptr, KRun::RunFlags());
+ });
+
+ notification->sendEvent();
+diff --git a/kaccounts/kaccountsplugin.h b/kaccounts/kaccountsplugin.h
+index b7cfefc..82ae739 100644
+--- a/kaccounts/kaccountsplugin.h
++++ b/kaccounts/kaccountsplugin.h
+@@ -28,7 +28,7 @@ class GoogleDrivePlugin : public KAccountsDPlugin
+ Q_INTERFACES(KAccountsDPlugin)
+
+ public:
+- GoogleDrivePlugin(QObject *parent = nullptr);
++ explicit GoogleDrivePlugin(QObject *parent = nullptr);
+
+ public slots:
+ void onAccountCreated(const Accounts::AccountId accountId, const Accounts::ServiceList &serviceList) override;
+diff --git a/src/gdrivehelper.cpp b/src/gdrivehelper.cpp
+index c52f37e..f5c17c4 100644
+--- a/src/gdrivehelper.cpp
++++ b/src/gdrivehelper.cpp
+@@ -136,7 +136,7 @@ QUrl GDriveHelper::convertFromGDocs(KGAPI2::Drive::FilePtr &file)
+ KIO::UDSEntry GDriveHelper::trash()
+ {
+ KIO::UDSEntry trashEntry;
+- trashEntry.insert(KIO::UDSEntry::UDS_NAME, QStringLiteral("trash"));
++ trashEntry.insert(KIO::UDSEntry::UDS_NAME, GDriveUrl::TrashDir);
+ trashEntry.insert(KIO::UDSEntry::UDS_DISPLAY_NAME, i18n("Trash"));
+ trashEntry.insert(KIO::UDSEntry::UDS_FILE_TYPE, S_IFDIR);
+ trashEntry.insert(KIO::UDSEntry::UDS_ICON_NAME, QStringLiteral("user-trash"));
+@@ -144,3 +144,7 @@ KIO::UDSEntry GDriveHelper::trash()
+ }
+ */
+
++QString GDriveHelper::elideToken(const QString &token)
++{
++ return token.mid(0, 30).append("...");
++}
+diff --git a/src/gdrivehelper.h b/src/gdrivehelper.h
+index ac8d26c..ee40540 100644
+--- a/src/gdrivehelper.h
++++ b/src/gdrivehelper.h
+@@ -32,6 +32,8 @@ namespace GDriveHelper
+ QUrl convertFromGDocs(KGAPI2::Drive::FilePtr &file);
+
+ KIO::UDSEntry trash();
++
++ QString elideToken(const QString &token);
+ }
+
+
+diff --git a/src/gdriveurl.cpp b/src/gdriveurl.cpp
+index 9dbae14..22bba4d 100644
+--- a/src/gdriveurl.cpp
++++ b/src/gdriveurl.cpp
+@@ -1,6 +1,7 @@
+ /*
+ * Copyright (C) 2014 Daniel Vrátil <dvratil@redhat.com>
+ * Copyright (c) 2016 Elvis Angelaccio <elvis.angelaccio@kde.org>
++ * Copyright (c) 2019 David Barchiesi <david@barchie.si>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+@@ -20,6 +21,9 @@
+
+ #include "gdriveurl.h"
+
++const QString GDriveUrl::Scheme = QStringLiteral("gdrive");
++const QString GDriveUrl::TrashDir = QStringLiteral("trash");
++
+ GDriveUrl::GDriveUrl(const QUrl &url)
+ : m_url(url)
+ {
+@@ -36,6 +40,15 @@ QString GDriveUrl::account() const
+ return m_components.at(0);
+ }
+
++QString GDriveUrl::filename() const
++{
++ if (m_components.isEmpty()) {
++ return QString();
++ }
++
++ return m_components.last();
++}
++
+ bool GDriveUrl::isRoot() const
+ {
+ return m_components.isEmpty();
+@@ -46,6 +59,26 @@ bool GDriveUrl::isAccountRoot() const
+ return m_components.length() == 1;
+ }
+
++bool GDriveUrl::isTopLevel() const
++{
++ return m_components.length() == 2;
++}
++
++bool GDriveUrl::isTrashDir() const
++{
++ return m_components.length() == 2 && m_components.at(1) == TrashDir;
++}
++
++bool GDriveUrl::isTrashed() const
++{
++ return m_components.length() > 2 && m_components.at(1) == TrashDir;
++}
++
++QUrl GDriveUrl::url() const
++{
++ return m_url;
++}
++
+ QString GDriveUrl::parentPath() const
+ {
+ if (isRoot()) {
+diff --git a/src/gdriveurl.h b/src/gdriveurl.h
+index d3b6a36..989989d 100644
+--- a/src/gdriveurl.h
++++ b/src/gdriveurl.h
+@@ -1,6 +1,7 @@
+ /*
+ * Copyright (C) 2014 Daniel Vrátil <dvratil@redhat.com>
+ * Copyright (c) 2016 Elvis Angelaccio <elvis.angelaccio@kde.org>
++ * Copyright (c) 2019 David Barchiesi <david@barchie.si>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+@@ -29,11 +30,18 @@ public:
+ explicit GDriveUrl(const QUrl &url);
+
+ QString account() const;
++ QString filename() const;
+ bool isRoot() const;
+ bool isAccountRoot() const;
++ bool isTopLevel() const;
++ bool isTrashDir() const;
++ bool isTrashed() const;
++ QUrl url() const;
+ QString parentPath() const;
+ QStringList pathComponents() const;
+
++ static const QString Scheme;
++ static const QString TrashDir;
+ private:
+ QUrl m_url;
+ QStringList m_components;
+diff --git a/src/kaccountsmanager.cpp b/src/kaccountsmanager.cpp
+index 69a4c06..3b4cd02 100644
+--- a/src/kaccountsmanager.cpp
++++ b/src/kaccountsmanager.cpp
+@@ -19,6 +19,7 @@
+
+ #include "kaccountsmanager.h"
+ #include "gdrivedebug.h"
++#include "gdrivehelper.h"
+
+ #include <Accounts/Manager>
+ #include <Accounts/Provider>
+@@ -85,8 +86,19 @@ AccountPtr KAccountsManager::createAccount()
+
+ AccountPtr KAccountsManager::refreshAccount(const AccountPtr &account)
+ {
+- Q_UNUSED(account)
+- qCWarning(GDRIVE) << Q_FUNC_INFO << "not implemented.";
++ const QString accountName = account->accountName();
++ for (auto it = m_accounts.constBegin(); it != m_accounts.constEnd(); ++it) {
++ if (it.value()->accountName() != accountName) {
++ continue;
++ }
++
++ const auto id = it.key();
++ qCDebug(GDRIVE) << "Refreshing" << accountName;
++ auto gapiAccount = getAccountCredentials(id, accountName);
++ m_accounts.insert(id, gapiAccount);
++ return gapiAccount;
++ }
++
+ return {};
+ }
+
+@@ -96,7 +108,7 @@ void KAccountsManager::removeAccount(const QString &accountName)
+ return;
+ }
+
+- for (auto it = m_accounts.constBegin(); it != m_accounts.constEnd(); it++) {
++ for (auto it = m_accounts.constBegin(); it != m_accounts.constEnd(); ++it) {
+ if (it.value()->accountName() != accountName) {
+ continue;
+ }
+@@ -143,19 +155,27 @@ void KAccountsManager::loadAccounts()
+ }
+ qCDebug(GDRIVE) << account->displayName() << "supports gdrive!";
+
+- auto job = new GetCredentialsJob(id, nullptr);
+- job->exec();
++ auto gapiAccount = getAccountCredentials(id, account->displayName());
++ m_accounts.insert(id, gapiAccount);
++ }
++ }
++}
+
+- auto gapiAccount = AccountPtr(new Account(account->displayName(),
+- job->credentialsData().value(QStringLiteral("AccessToken")).toString(),
+- job->credentialsData().value(QStringLiteral("RefreshToken")).toString()));
++AccountPtr KAccountsManager::getAccountCredentials(Accounts::AccountId id, const QString& displayName)
++{
++ auto job = new GetCredentialsJob(id, nullptr);
++ job->exec();
+
+- const auto scopes = job->credentialsData().value(QStringLiteral("Scope")).toStringList();
+- for (const auto &scope : scopes) {
+- gapiAccount->addScope(QUrl::fromUserInput(scope));
+- }
++ auto gapiAccount = AccountPtr(new Account(displayName,
++ job->credentialsData().value(QStringLiteral("AccessToken")).toString(),
++ job->credentialsData().value(QStringLiteral("RefreshToken")).toString()));
+
+- m_accounts.insert(id, gapiAccount);
+- }
++ const auto scopes = job->credentialsData().value(QStringLiteral("Scope")).toStringList();
++ for (const auto &scope : scopes) {
++ gapiAccount->addScope(QUrl::fromUserInput(scope));
+ }
++
++ qCDebug(GDRIVE) << "Got account credentials for:" << gapiAccount->accountName() << ", accessToken:" << GDriveHelper::elideToken(gapiAccount->accessToken()) << ", refreshToken:" << GDriveHelper::elideToken(gapiAccount->refreshToken());
++
++ return gapiAccount;
+ }
+diff --git a/src/kaccountsmanager.h b/src/kaccountsmanager.h
+index 235d11a..d2dbc43 100644
+--- a/src/kaccountsmanager.h
++++ b/src/kaccountsmanager.h
+@@ -40,6 +40,8 @@ public:
+ private:
+ void loadAccounts();
+
++ KGAPI2::AccountPtr getAccountCredentials(Accounts::AccountId id, const QString& displayName);
++
+ QMap<Accounts::AccountId, KGAPI2::AccountPtr> m_accounts;
+ };
+
+diff --git a/src/kio_gdrive.cpp b/src/kio_gdrive.cpp
+index 2341f27..7a27663 100644
+--- a/src/kio_gdrive.cpp
++++ b/src/kio_gdrive.cpp
+@@ -97,7 +97,7 @@ KIOGDrive::~KIOGDrive()
+
+ KIOGDrive::Action KIOGDrive::handleError(const KGAPI2::Job &job, const QUrl &url)
+ {
+- qCDebug(GDRIVE) << "Job status code:" << job.error() << "- message:" << job.errorString();
++ qCDebug(GDRIVE) << "Completed job" << (&job) << "error code:" << job.error() << "- message:" << job.errorString();
+
+ switch (job.error()) {
+ case KGAPI2::OK:
+@@ -141,22 +141,32 @@ void KIOGDrive::fileSystemFreeSpace(const QUrl &url)
+ const auto gdriveUrl = GDriveUrl(url);
+ const QString accountId = gdriveUrl.account();
+ if (accountId == QLatin1String("new-account")) {
++ qCDebug(GDRIVE) << "fileSystemFreeSpace is not supported for new-account url";
+ finished();
+ return;
+ }
+- if (!gdriveUrl.isRoot()) {
+- AboutFetchJob aboutFetch(getAccount(accountId));
+- if (runJob(aboutFetch, url, accountId)) {
+- const AboutPtr about = aboutFetch.aboutData();
+- if (about) {
+- setMetaData(QStringLiteral("total"), QString::number(about->quotaBytesTotal()));
+- setMetaData(QStringLiteral("available"), QString::number(about->quotaBytesTotal() - about->quotaBytesUsedAggregate()));
+- finished();
+- return;
+- }
++ if (gdriveUrl.isRoot()) {
++ qCDebug(GDRIVE) << "fileSystemFreeSpace is not supported for gdrive root urls";
++ error(KIO::ERR_CANNOT_STAT, url.toDisplayString());
++ return;
++ }
++
++ qCDebug(GDRIVE) << "Getting fileSystemFreeSpace for" << url;
++ AboutFetchJob aboutFetch(getAccount(accountId));
++ aboutFetch.setFields({
++ About::Fields::Kind,
++ About::Fields::QuotaBytesTotal,
++ About::Fields::QuotaBytesUsedAggregate
++ });
++ if (runJob(aboutFetch, url, accountId)) {
++ const AboutPtr about = aboutFetch.aboutData();
++ if (about) {
++ setMetaData(QStringLiteral("total"), QString::number(about->quotaBytesTotal()));
++ setMetaData(QStringLiteral("available"), QString::number(about->quotaBytesTotal() - about->quotaBytesUsedAggregate()));
++ finished();
++ return;
+ }
+ }
+- error(KIO::ERR_CANNOT_STAT, url.toDisplayString());
+ }
+
+ AccountPtr KIOGDrive::getAccount(const QString &accountName)
+@@ -187,37 +197,37 @@ KIO::UDSEntry KIOGDrive::fileToUDSEntry(const FilePtr &origFile, const QString &
+ GDriveHelper::convertFromGDocs(file);
+ }
+
+- entry.insert(KIO::UDSEntry::UDS_NAME, file->title());
+- entry.insert(KIO::UDSEntry::UDS_DISPLAY_NAME, file->title());
+- entry.insert(KIO::UDSEntry::UDS_COMMENT, file->description());
++ entry.fastInsert(KIO::UDSEntry::UDS_NAME, file->title());
++ entry.fastInsert(KIO::UDSEntry::UDS_DISPLAY_NAME, file->title());
++ entry.fastInsert(KIO::UDSEntry::UDS_COMMENT, file->description());
+
+ if (file->isFolder()) {
+- entry.insert(KIO::UDSEntry::UDS_FILE_TYPE, S_IFDIR);
+- entry.insert(KIO::UDSEntry::UDS_SIZE, 0);
++ entry.fastInsert(KIO::UDSEntry::UDS_FILE_TYPE, S_IFDIR);
++ entry.fastInsert(KIO::UDSEntry::UDS_SIZE, 0);
+ isFolder = true;
+ } else {
+- entry.insert(KIO::UDSEntry::UDS_FILE_TYPE, S_IFREG);
+- entry.insert(KIO::UDSEntry::UDS_MIME_TYPE, file->mimeType());
+- entry.insert(KIO::UDSEntry::UDS_SIZE, file->fileSize());
++ entry.fastInsert(KIO::UDSEntry::UDS_FILE_TYPE, S_IFREG);
++ entry.fastInsert(KIO::UDSEntry::UDS_MIME_TYPE, file->mimeType());
++ entry.fastInsert(KIO::UDSEntry::UDS_SIZE, file->fileSize());
+
+- entry.insert(KIO::UDSEntry::UDS_URL, fileToUrl(origFile, path).toString());
++ entry.fastInsert(KIO::UDSEntry::UDS_URL, fileToUrl(origFile, path).toString());
+ }
+
+- entry.insert(KIO::UDSEntry::UDS_CREATION_TIME, file->createdDate().toTime_t());
+- entry.insert(KIO::UDSEntry::UDS_MODIFICATION_TIME, file->modifiedDate().toTime_t());
+- entry.insert(KIO::UDSEntry::UDS_ACCESS_TIME, file->lastViewedByMeDate().toTime_t());
++ entry.fastInsert(KIO::UDSEntry::UDS_CREATION_TIME, file->createdDate().toTime_t());
++ entry.fastInsert(KIO::UDSEntry::UDS_MODIFICATION_TIME, file->modifiedDate().toTime_t());
++ entry.fastInsert(KIO::UDSEntry::UDS_ACCESS_TIME, file->lastViewedByMeDate().toTime_t());
+ if (!file->ownerNames().isEmpty()) {
+- entry.insert(KIO::UDSEntry::UDS_USER, file->ownerNames().first());
++ entry.fastInsert(KIO::UDSEntry::UDS_USER, file->ownerNames().first());
+ }
+
+ if (!isFolder) {
+ if (file->editable()) {
+- entry.insert(KIO::UDSEntry::UDS_ACCESS, S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH);
++ entry.fastInsert(KIO::UDSEntry::UDS_ACCESS, S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH);
+ } else {
+- entry.insert(KIO::UDSEntry::UDS_ACCESS, S_IRUSR | S_IRGRP | S_IROTH);
++ entry.fastInsert(KIO::UDSEntry::UDS_ACCESS, S_IRUSR | S_IRGRP | S_IROTH);
+ }
+ } else {
+- entry.insert(KIO::UDSEntry::UDS_ACCESS, S_IRUSR | S_IWUSR | S_IXUSR | S_IRGRP | S_IWGRP | S_IXGRP | S_IROTH | S_IXOTH);
++ entry.fastInsert(KIO::UDSEntry::UDS_ACCESS, S_IRUSR | S_IWUSR | S_IXUSR | S_IRGRP | S_IWGRP | S_IXGRP | S_IROTH | S_IXOTH);
+ }
+
+ return entry;
+@@ -226,7 +236,7 @@ KIO::UDSEntry KIOGDrive::fileToUDSEntry(const FilePtr &origFile, const QString &
+ QUrl KIOGDrive::fileToUrl(const FilePtr &file, const QString &path) const
+ {
+ QUrl url;
+- url.setScheme(QStringLiteral("gdrive"));
++ url.setScheme(GDriveUrl::Scheme);
+ url.setPath(path + QLatin1Char('/') + file->title());
+
+ QUrlQuery urlQuery;
+@@ -245,12 +255,12 @@ KIO::UDSEntry KIOGDrive::accountToUDSEntry(const QString &accountNAme)
+ {
+ KIO::UDSEntry entry;
+
+- entry.insert(KIO::UDSEntry::UDS_NAME, accountNAme);
+- entry.insert(KIO::UDSEntry::UDS_DISPLAY_NAME, accountNAme);
+- entry.insert(KIO::UDSEntry::UDS_FILE_TYPE, S_IFDIR);
+- entry.insert(KIO::UDSEntry::UDS_SIZE, 0);
+- entry.insert(KIO::UDSEntry::UDS_ACCESS, S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH);
+- entry.insert(KIO::UDSEntry::UDS_ICON_NAME, QStringLiteral("folder-gdrive"));
++ entry.fastInsert(KIO::UDSEntry::UDS_NAME, accountNAme);
++ entry.fastInsert(KIO::UDSEntry::UDS_DISPLAY_NAME, accountNAme);
++ entry.fastInsert(KIO::UDSEntry::UDS_FILE_TYPE, S_IFDIR);
++ entry.fastInsert(KIO::UDSEntry::UDS_SIZE, 0);
++ entry.fastInsert(KIO::UDSEntry::UDS_ACCESS, S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH);
++ entry.fastInsert(KIO::UDSEntry::UDS_ICON_NAME, QStringLiteral("folder-gdrive"));
+
+ return entry;
+ }
+@@ -288,18 +298,18 @@ void KIOGDrive::listAccounts()
+ listEntry(entry);
+ }
+ KIO::UDSEntry newAccountEntry;
+- newAccountEntry.insert(KIO::UDSEntry::UDS_NAME, QStringLiteral("new-account"));
+- newAccountEntry.insert(KIO::UDSEntry::UDS_DISPLAY_NAME, i18nc("login in a new google account", "New account"));
+- newAccountEntry.insert(KIO::UDSEntry::UDS_FILE_TYPE, S_IFDIR);
+- newAccountEntry.insert(KIO::UDSEntry::UDS_ICON_NAME, QStringLiteral("list-add-user"));
++ newAccountEntry.fastInsert(KIO::UDSEntry::UDS_NAME, QStringLiteral("new-account"));
++ newAccountEntry.fastInsert(KIO::UDSEntry::UDS_DISPLAY_NAME, i18nc("login in a new google account", "New account"));
++ newAccountEntry.fastInsert(KIO::UDSEntry::UDS_FILE_TYPE, S_IFDIR);
++ newAccountEntry.fastInsert(KIO::UDSEntry::UDS_ICON_NAME, QStringLiteral("list-add-user"));
+ listEntry(newAccountEntry);
+
+ // Create also non-writable UDSentry for "."
+ KIO::UDSEntry entry;
+- entry.insert(KIO::UDSEntry::UDS_NAME, QStringLiteral("."));
+- entry.insert(KIO::UDSEntry::UDS_FILE_TYPE, S_IFDIR);
+- entry.insert(KIO::UDSEntry::UDS_SIZE, 0);
+- entry.insert(KIO::UDSEntry::UDS_ACCESS, S_IRUSR | S_IXUSR | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH);
++ entry.fastInsert(KIO::UDSEntry::UDS_NAME, QStringLiteral("."));
++ entry.fastInsert(KIO::UDSEntry::UDS_FILE_TYPE, S_IFDIR);
++ entry.fastInsert(KIO::UDSEntry::UDS_SIZE, 0);
++ entry.fastInsert(KIO::UDSEntry::UDS_ACCESS, S_IRUSR | S_IXUSR | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH);
+ listEntry(entry);
+
+ finished();
+@@ -335,7 +345,7 @@ int RecursionDepthCounter::sDepth = 0;
+
+ QString KIOGDrive::resolveFileIdFromPath(const QString &path, PathFlags flags)
+ {
+- qCDebug(GDRIVE) << Q_FUNC_INFO << path;
++ qCDebug(GDRIVE) << "Resolving file ID for" << path;
+
+ if (path.isEmpty()) {
+ return QString();
+@@ -348,15 +358,14 @@ QString KIOGDrive::resolveFileIdFromPath(const QString &path, PathFlags flags)
+ }
+
+ QUrl url;
+- url.setScheme(QStringLiteral("gdrive"));
++ url.setScheme(GDriveUrl::Scheme);
+ url.setPath(path);
+ const auto gdriveUrl = GDriveUrl(url);
+ Q_ASSERT(!gdriveUrl.isRoot());
+
+- const QStringList components = gdriveUrl.pathComponents();
+- if (gdriveUrl.isAccountRoot() || (components.size() == 2 && components[1] == QLatin1String("trash"))) {
++ if (gdriveUrl.isAccountRoot() || gdriveUrl.isTrashDir()) {
+ qCDebug(GDRIVE) << "Resolved" << path << "to \"root\"";
+- return rootFolderId(components[0]);
++ return rootFolderId(gdriveUrl.account());
+ }
+
+ // Try to recursively resolve ID of parent path - either from cache, or by
+@@ -373,13 +382,13 @@ QString KIOGDrive::resolveFileIdFromPath(const QString &path, PathFlags flags)
+ (flags & KIOGDrive::PathIsFolder ? FileSearchQuery::Equals : FileSearchQuery::NotEquals),
+ GDriveHelper::folderMimeType());
+ }
+- query.addQuery(FileSearchQuery::Title, FileSearchQuery::Equals, components.last());
++ query.addQuery(FileSearchQuery::Title, FileSearchQuery::Equals, gdriveUrl.filename());
+ query.addQuery(FileSearchQuery::Parents, FileSearchQuery::In, parentId);
+- query.addQuery(FileSearchQuery::Trashed, FileSearchQuery::Equals, components[1] == QLatin1String("trash"));
++ query.addQuery(FileSearchQuery::Trashed, FileSearchQuery::Equals, gdriveUrl.isTrashed());
+
+ const QString accountId = gdriveUrl.account();
+ FileFetchJob fetchJob(query, getAccount(accountId));
+- fetchJob.setFields(FileFetchJob::Id | FileFetchJob::Title | FileFetchJob::Labels);
++ fetchJob.setFields({File::Fields::Id, File::Fields::Title, File::Fields::Labels});
+ if (!runJob(fetchJob, url, accountId)) {
+ return QString();
+ }
+@@ -403,7 +412,9 @@ QString KIOGDrive::rootFolderId(const QString &accountId)
+ {
+ auto it = m_rootIds.constFind(accountId);
+ if (it == m_rootIds.cend()) {
++ qCDebug(GDRIVE) << "Getting root ID for" << accountId;
+ AboutFetchJob aboutFetch(getAccount(accountId));
++ aboutFetch.setFields({About::Fields::Kind, About::Fields::RootFolderId});
+ QUrl url;
+ if (!runJob(aboutFetch, url, accountId)) {
+ return QString();
+@@ -455,11 +466,15 @@ void KIOGDrive::listDir(const QUrl &url)
+ query.addQuery(FileSearchQuery::Trashed, FileSearchQuery::Equals, false);
+ query.addQuery(FileSearchQuery::Parents, FileSearchQuery::In, folderId);
+ FileFetchJob fileFetchJob(query, getAccount(accountId));
+- fileFetchJob.setFields((FileFetchJob::BasicFields & ~FileFetchJob::Permissions)
+- | FileFetchJob::Labels
+- | FileFetchJob::ExportLinks
+- | FileFetchJob::LastViewedByMeDate);
+- runJob(fileFetchJob, url, accountId);
++ const auto extraFields =
++ QStringList({ KGAPI2::Drive::File::Fields::Labels,
++ KGAPI2::Drive::File::Fields::ExportLinks,
++ KGAPI2::Drive::File::Fields::LastViewedByMeDate,
++ });
++ fileFetchJob.setFields(KGAPI2::Drive::FileFetchJob::FieldShorthands::BasicFields + extraFields);
++ if (!runJob(fileFetchJob, url, accountId)) {
++ return;
++ }
+
+ ObjectsList objects = fileFetchJob.items();
+ Q_FOREACH (const ObjectPtr &object, objects) {
+@@ -474,10 +489,10 @@ void KIOGDrive::listDir(const QUrl &url)
+
+ // We also need a non-null and writable UDSentry for "."
+ KIO::UDSEntry entry;
+- entry.insert(KIO::UDSEntry::UDS_NAME, QStringLiteral("."));
+- entry.insert(KIO::UDSEntry::UDS_FILE_TYPE, S_IFDIR);
+- entry.insert(KIO::UDSEntry::UDS_SIZE, 0);
+- entry.insert(KIO::UDSEntry::UDS_ACCESS, S_IRUSR | S_IWUSR | S_IXUSR | S_IRGRP | S_IWGRP | S_IXGRP | S_IROTH | S_IXOTH);
++ entry.fastInsert(KIO::UDSEntry::UDS_NAME, QStringLiteral("."));
++ entry.fastInsert(KIO::UDSEntry::UDS_FILE_TYPE, S_IFDIR);
++ entry.fastInsert(KIO::UDSEntry::UDS_SIZE, 0);
++ entry.fastInsert(KIO::UDSEntry::UDS_ACCESS, S_IRUSR | S_IWUSR | S_IXUSR | S_IRGRP | S_IWGRP | S_IXGRP | S_IROTH | S_IXOTH);
+ listEntry(entry);
+
+ finished();
+@@ -501,8 +516,7 @@ void KIOGDrive::mkdir(const QUrl &url, int permissions)
+ return;
+ }
+ QString parentId;
+- const auto components = gdriveUrl.pathComponents();
+- if (components.size() == 2) {
++ if (gdriveUrl.isTopLevel()) {
+ parentId = rootFolderId(accountId);
+ } else {
+ parentId = resolveFileIdFromPath(gdriveUrl.parentPath(), KIOGDrive::PathIsFolder);
+@@ -513,19 +527,17 @@ void KIOGDrive::mkdir(const QUrl &url, int permissions)
+ return;
+ }
+
+- const QString folderName = components.last();
+-
+ FilePtr file(new File());
+- file->setTitle(folderName);
++ file->setTitle(gdriveUrl.filename());
+ file->setMimeType(File::folderMimeType());
+
+ ParentReferencePtr parent(new ParentReference(parentId));
+ file->setParents(ParentReferencesList() << parent);
+
+ FileCreateJob createJob(file, getAccount(accountId));
+- runJob(createJob, url, accountId);
+-
+- finished();
++ if (runJob(createJob, url, accountId)) {
++ finished();
++ }
+ }
+
+ void KIOGDrive::stat(const QUrl &url)
+@@ -558,7 +570,9 @@ void KIOGDrive::stat(const QUrl &url)
+ }
+
+ FileFetchJob fileFetchJob(fileId, getAccount(accountId));
+- runJob(fileFetchJob, url, accountId);
++ if (!runJob(fileFetchJob, url, accountId)) {
++ return;
++ }
+
+ const ObjectsList objects = fileFetchJob.items();
+ if (objects.count() != 1) {
+@@ -607,11 +621,10 @@ void KIOGDrive::get(const QUrl &url)
+ }
+
+ FileFetchJob fileFetchJob(fileId, getAccount(accountId));
+- fileFetchJob.setFields(FileFetchJob::Id
+- | FileFetchJob::MimeType
+- | FileFetchJob::ExportLinks
+- | FileFetchJob::DownloadUrl);
+- runJob(fileFetchJob, url, accountId);
++ fileFetchJob.setFields({File::Fields::Id, File::Fields::MimeType, File::Fields::ExportLinks, File::Fields::DownloadUrl});
++ if (!runJob(fileFetchJob, url, accountId)) {
++ return;
++ }
+
+ const ObjectsList objects = fileFetchJob.items();
+ if (objects.count() != 1) {
+@@ -630,7 +643,9 @@ void KIOGDrive::get(const QUrl &url)
+ mimeType(file->mimeType());
+
+ FileFetchContentJob contentJob(downloadUrl, getAccount(accountId));
+- runJob(contentJob, url, accountId);
++ if (!runJob(contentJob, url, accountId)) {
++ return;
++ }
+
+ QByteArray contentData = contentJob.data();
+
+@@ -691,7 +706,7 @@ bool KIOGDrive::runJob(KGAPI2::Job &job, const QUrl &url, const QString &account
+ {
+ KIOGDrive::Action action = KIOGDrive::Fail;
+ Q_FOREVER {
+- qCDebug(GDRIVE) << "Running job" << (&job) << "with accessToken" << job.account()->accessToken();
++ qCDebug(GDRIVE) << "Running job" << (&job) << "with accessToken" << GDriveHelper::elideToken(job.account()->accessToken());
+ QEventLoop eventLoop;
+ QObject::connect(&job, &KGAPI2::Job::finished,
+ &eventLoop, &QEventLoop::quit);
+@@ -754,10 +769,9 @@ bool KIOGDrive::putCreate(const QUrl &url)
+ error(KIO::ERR_ACCESS_DENIED, url.path());
+ return false;
+ }
+- const auto components = gdriveUrl.pathComponents();
+- if (components.length() == 2) {
+- // Creating in root directory
+- } else {
++
++ if (!gdriveUrl.isTopLevel()) {
++ // Not creating in root directory, fill parent references
+ const QString parentId = resolveFileIdFromPath(gdriveUrl.parentPath());
+ if (parentId.isEmpty()) {
+ error(KIO::ERR_DOES_NOT_EXIST, url.adjusted(QUrl::RemoveFilename|QUrl::StripTrailingSlash).path());
+@@ -767,7 +781,7 @@ bool KIOGDrive::putCreate(const QUrl &url)
+ }
+
+ FilePtr file(new File);
+- file->setTitle(components.last());
++ file->setTitle(gdriveUrl.filename());
+ file->setParents(parentReferences);
+ /*
+ if (hasMetaData(QLatin1String("modified"))) {
+@@ -866,9 +880,10 @@ void KIOGDrive::copy(const QUrl &src, const QUrl &dest, int permissions, KIO::Jo
+ return;
+ }
+ FileFetchJob sourceFileFetchJob(sourceFileId, getAccount(sourceAccountId));
+- sourceFileFetchJob.setFields(FileFetchJob::Id | FileFetchJob::ModifiedDate |
+- FileFetchJob::LastViewedByMeDate | FileFetchJob::Description);
+- runJob(sourceFileFetchJob, src, sourceAccountId);
++ sourceFileFetchJob.setFields({File::Fields::Id, File::Fields::ModifiedDate, File::Fields::LastViewedByMeDate, File::Fields::Description});
++ if (!runJob(sourceFileFetchJob, src, sourceAccountId)) {
++ return;
++ }
+
+ const ObjectsList objects = sourceFileFetchJob.items();
+ if (objects.count() != 1) {
+@@ -885,9 +900,7 @@ void KIOGDrive::copy(const QUrl &src, const QUrl &dest, int permissions, KIO::Jo
+ }
+
+ QString destDirId;
+- const auto destPathComps = destGDriveUrl.pathComponents();
+- const QString destFileName = destPathComps.last();
+- if (destPathComps.size() == 2) {
++ if (destGDriveUrl.isTopLevel()) {
+ destDirId = rootFolderId(destAccountId);
+ } else {
+ destDirId = resolveFileIdFromPath(destGDriveUrl.parentPath(), KIOGDrive::PathIsFolder);
+@@ -895,16 +908,16 @@ void KIOGDrive::copy(const QUrl &src, const QUrl &dest, int permissions, KIO::Jo
+ destParentReferences << ParentReferencePtr(new ParentReference(destDirId));
+
+ FilePtr destFile(new File);
+- destFile->setTitle(destFileName);
++ destFile->setTitle(destGDriveUrl.filename());
+ destFile->setModifiedDate(sourceFile->modifiedDate());
+ destFile->setLastViewedByMeDate(sourceFile->lastViewedByMeDate());
+ destFile->setDescription(sourceFile->description());
+ destFile->setParents(destParentReferences);
+
+ FileCopyJob copyJob(sourceFile, destFile, getAccount(sourceAccountId));
+- runJob(copyJob, dest, sourceAccountId);
+-
+- finished();
++ if (runJob(copyJob, dest, sourceAccountId)) {
++ finished();
++ }
+ }
+
+ void KIOGDrive::del(const QUrl &url, bool isfile)
+@@ -953,7 +966,9 @@ void KIOGDrive::del(const QUrl &url, bool isfile)
+ // child references
+ if (!isfile) {
+ ChildReferenceFetchJob referencesFetch(fileId, getAccount(accountId));
+- runJob(referencesFetch, url, accountId);
++ if (!runJob(referencesFetch, url, accountId)) {
++ return;
++ }
+ const bool isEmpty = !referencesFetch.items().count();
+
+ if (!isEmpty && metaData(QStringLiteral("recurse")) != QLatin1String("true")) {
+@@ -963,12 +978,10 @@ void KIOGDrive::del(const QUrl &url, bool isfile)
+ }
+
+ FileTrashJob trashJob(fileId, getAccount(accountId));
+- runJob(trashJob, url, accountId);
+-
+- m_cache.removePath(url.path());
+-
+- finished();
+-
++ if (runJob(trashJob, url, accountId)) {
++ m_cache.removePath(url.path());
++ finished();
++ }
+ }
+
+ void KIOGDrive::rename(const QUrl &src, const QUrl &dest, KIO::JobFlags flags)
+@@ -1009,7 +1022,9 @@ void KIOGDrive::rename(const QUrl &src, const QUrl &dest, KIO::JobFlags flags)
+
+ // We need to fetch ALL, so that we can do update later
+ FileFetchJob sourceFileFetchJob(sourceFileId, getAccount(sourceAccountId));
+- runJob(sourceFileFetchJob, src, sourceAccountId);
++ if (!runJob(sourceFileFetchJob, src, sourceAccountId)) {
++ return;
++ }
+
+ const ObjectsList objects = sourceFileFetchJob.items();
+ if (objects.count() != 1) {
+@@ -1026,8 +1041,6 @@ void KIOGDrive::rename(const QUrl &src, const QUrl &dest, KIO::JobFlags flags)
+ error(KIO::ERR_ACCESS_DENIED, dest.fileName());
+ return;
+ }
+- const auto srcPathComps = srcGDriveUrl.pathComponents();
+- const auto destPathComps = destGDriveUrl.pathComponents();
+ if (destGDriveUrl.isAccountRoot()) {
+ // user is trying to move to root -> we are only renaming
+ } else {
+@@ -1057,17 +1070,15 @@ void KIOGDrive::rename(const QUrl &src, const QUrl &dest, KIO::JobFlags flags)
+ parentReferences << ParentReferencePtr(new ParentReference(destDirId));
+ }
+
+- const QString destFileName = destPathComps.last();
+-
+ FilePtr destFile(sourceFile);
+- destFile->setTitle(destFileName);
++ destFile->setTitle(destGDriveUrl.filename());
+ destFile->setParents(parentReferences);
+
+ FileModifyJob modifyJob(destFile, getAccount(sourceAccountId));
+ modifyJob.setUpdateModifiedDate(true);
+- runJob(modifyJob, dest, sourceAccountId);
+-
+- finished();
++ if (runJob(modifyJob, dest, sourceAccountId)) {
++ finished();
++ }
+ }
+
+ void KIOGDrive::mimetype(const QUrl &url)
+@@ -1086,8 +1097,10 @@ void KIOGDrive::mimetype(const QUrl &url)
+ const QString accountId = GDriveUrl(url).account();
+
+ FileFetchJob fileFetchJob(fileId, getAccount(accountId));
+- fileFetchJob.setFields(FileFetchJob::Id | FileFetchJob::MimeType);
+- runJob(fileFetchJob, url, accountId);
++ fileFetchJob.setFields({File::Fields::Id, File::Fields::MimeType});
++ if (!runJob(fileFetchJob, url, accountId)) {
++ return;
++ }
+
+ const ObjectsList objects = fileFetchJob.items();
+ if (objects.count() != 1) {
+diff --git a/src/kio_gdrive.h b/src/kio_gdrive.h
+index bcc3aad..647afcd 100644
+--- a/src/kio_gdrive.h
++++ b/src/kio_gdrive.h
+@@ -17,8 +17,8 @@
+ *
+ */
+
+-#ifndef GDRIVESLAVE_H
+-#define GDRIVESLAVE_H
++#ifndef KIO_GDRIVE_H
++#define KIO_GDRIVE_H
+
+ #include "pathcache.h"
+
+@@ -99,6 +99,9 @@ private:
+ bool readPutData(QTemporaryFile &tmpFile);
+
+ /**
++ * Executes a KGAPI2::Job in an event loop, retrying the job until success or failure.
++ * If the Job fails, SlaveBase::error() with an appropriate error message will be called.
++ *
+ * @return Whether @p job succeeded.
+ */
+ bool runJob(KGAPI2::Job &job, const QUrl &url, const QString &accountId);
+@@ -110,4 +113,4 @@ private:
+
+ };
+
+-#endif // GDRIVESLAVE_H
++#endif // KIO_GDRIVE_H
+diff --git a/src/pathcache.cpp b/src/pathcache.cpp
+index dfdaede..5c48402 100644
+--- a/src/pathcache.cpp
++++ b/src/pathcache.cpp
+@@ -60,7 +60,7 @@ QStringList PathCache::descendants(const QString &path) const
+ }
+
+ if (iter.key().lastIndexOf(QLatin1Char('/')) >= fullPath.size()) {
+- // Not a direct descendat
++ // Not a direct descendant
+ continue;
+ }
+
diff --git a/package.yml b/package.yml
--- a/package.yml
+++ b/package.yml
@@ -1,6 +1,6 @@
name : kio-gdrive
version : 1.2.6
-release : 7
+release : 8
source :
- https://cdn.download.kde.org/stable/kio-gdrive/1.2.6/src/kio-gdrive-1.2.6.tar.xz : 7a9169e1d464641eb0ae4013ca1732b46bdfd50a13b3e87810c19ba794527f7b
license : GPL-2.0-or-later
@@ -25,6 +25,7 @@
rundeps :
- kaccounts-providers
setup : |
+ %patch -p1 < $pkgfiles/git_373ef7d503a161d9e165f53d916508566d892c05_to_85a0b569780dc423fc368f45b2ebbf6cd1d07a2e.patch
%cmake_ninja
build : |
%ninja_build
diff --git a/pspec_x86_64.xml b/pspec_x86_64.xml
--- a/pspec_x86_64.xml
+++ b/pspec_x86_64.xml
@@ -2,8 +2,8 @@
<Source>
<Name>kio-gdrive</Name>
<Packager>
- <Name>F. von Gellhorn</Name>
- <Email>flinux@vongellhorn.ch</Email>
+ <Name>Clive Johnston</Name>
+ <Email>clivejo@protonmail.com</Email>
</Packager>
<License>GPL-2.0-or-later</License>
<PartOf>kde.desktop</PartOf>
@@ -73,17 +73,17 @@
<Path fileType="localedata">/usr/share/locale/uk/LC_MESSAGES/kio5_gdrive.mo</Path>
<Path fileType="localedata">/usr/share/locale/zh_CN/LC_MESSAGES/kio5_gdrive.mo</Path>
<Path fileType="localedata">/usr/share/locale/zh_TW/LC_MESSAGES/kio5_gdrive.mo</Path>
- <Path fileType="data">/usr/share/metainfo/org.kde.kio-gdrive.appdata.xml</Path>
+ <Path fileType="data">/usr/share/metainfo/org.kde.kio_gdrive.metainfo.xml</Path>
<Path fileType="data">/usr/share/remoteview/gdrive-network.desktop</Path>
</Files>
</Package>
<History>
- <Update release="7">
- <Date>2019-07-07</Date>
+ <Update release="8">
+ <Date>2019-08-22</Date>
<Version>1.2.6</Version>
<Comment>Packaging update</Comment>
- <Name>F. von Gellhorn</Name>
- <Email>flinux@vongellhorn.ch</Email>
+ <Name>Clive Johnston</Name>
+ <Email>clivejo@protonmail.com</Email>
</Update>
</History>
</PISI>
\ No newline at end of file

File Metadata

Mime Type
text/plain
Expires
Wed, Aug 2, 12:56 AM (6 d, 21 h ago)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
5806234
Default Alt Text
D7027.diff (62 KB)

Event Timeline