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 ++ * Copyright (c) 2019 David Barchiesi + * + * 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("expectedToString"); + QTest::addColumn("expectedAccount"); + QTest::addColumn("expectedParentPath"); ++ QTest::addColumn("expectedIsTrashed"); ++ QTest::addColumn("expectedIsTopLevel"); + QTest::addColumn("expectedPathComponents"); ++ QTest::addColumn("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 @@ + + +- org.kde.kio-gdrive ++ org.kde.kio_gdrive + CC0-1.0 + GPL-2.0+ + org.kde.dolphin.desktop +@@ -11,7 +11,9 @@ + KIO GDrive + KIO GDrive + KIO GDrive ++ KIO GDrive + KIO GDrive ++ KIO GDrive + KIO GDrive + KIO GDrive + KIO GDrive +@@ -20,24 +22,28 @@ + KIO GDrive + KIO GDrive + KIO GDrive +- KIO GDrive ++ KIO-GDrive + KIO GDrive + KIO GDrive + KIO GDrive + KIO GDrive +- KIO для поддержки Диска Google ++ KIO для поддержки Google Диска + KIO GDrive + KIO Gdrive ++ KIO GDrive + KIO GDrive + xxKIO GDrivexx + KIO GDrive ++ KIO GDrive + Google Drive integration with KDE Plasma and KDE applications + Integració del Drive de Google amb el Plasma del KDE i les aplicacions KDE + Integració del Drive de Google amb el Plasma del KDE i les aplicacions KDE + Integrace Google Drive do KDE Plasma a aplikací KDE ++ Google Drive-integration med KDE Plasma og KDE-programmer + Integration von Google Drive mit Plasma und den KDE-Anwendungen ++ Ενσωμάτωση του Google Drive με το KDE Plasma και τις εφαρμογές του KDE + Google Drive integration with KDE Plasma and KDE applications +- Integración de Google Drive con Plasma y aplicaciones de KDE ++ Integración de Google Drive con Plasma de KDE y aplicaciones de KDE + Google Drive -integrointi KDE Plasmaan ja KDE-sovelluksiin + Intégration de Google Drive à KDE Plasma et aux applications KDE + Integración de Google Drive con KDE Plasma e os aplicativos de KDE +@@ -47,21 +53,25 @@ + Integratie van Google Drive met KDE Plasma en KDE applications + Integrering av Google Drive, KDE Plasma og KDE-programma + Integracja Dysku Google z KDE Plazmą i aplikacjami KDE +- Integração do Google Drive com o Plasma e as aplicações do KDE ++ Integração do Google Drive com o Plasma do KDE e as aplicações do KDE + Integração do Google Drive com o KDE Plasma e aplicativos do KDE +- Интеграция Диска Google с KDE Plasma и приложениями от KDE +- Integrácia Google disku s KDE Plasma a KDE aplikáciami ++ Интеграция Google Диска с KDE Plasma и приложениями от KDE ++ Integrácia Google Drive integration s KDE Plasma a KDE aplikáciami + Integrering av Google Drive med KDE Plasma och KDE-program ++ KDE Plasma ve KDE uygulamaları ile Google Drive tümleştirmesi + Інтеграція Диска Google із Плазмою KDE та програмами KDE + xxGoogle Drive integration with KDE Plasma and KDE applicationsxx + KDE Plasma 和 KDE 应用的 Google 云端硬盘整合 ++ 適用於 KDE Plasma 和 KDE 應用程式的 Google Drive 整合 + +

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.

+

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.

+

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.

++

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.

+

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.

++

Το KIO GDrive είναι ένας KIO slave που ενεργοποιεί εφαρμογές με επίγνωση του KIO (όπως Dolphin, Kate ή Gwenview) για την πρόσβαση και επεξεργασία αρχείων του Google Drive στο νέφος.

+

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.

+-

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.

++

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.

+

KIO GDrive on KIO-asiakas, joka sallii KIO-sovellusten (kuten Dolphinin, Katen tai Gwenview’n) päästä käsiksi Google Driven tiedostoihin pilvessä.

+

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.

+

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.

+@@ -71,16 +81,49 @@ +

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.

+

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.

+

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.

+-

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'.

++

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'.

+

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.

+-

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.

++

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.

+

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.

++

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.

+

KIO GDrive — допоміжний засіб введення-виведення даних, який уможливлює для програм із підтримкою KIO (зокрема Dolphin, Kate та Gwenview) доступ та редагування даних файлів на Диску Google у обчислювальній «хмарі».

+

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

++

KIO GDrive 是 Google 云端硬盘的 KIO 从属,它能够让支持 KIO 的程序 (例如 Dolphin,Kate 或 Gwenview) 访问和编辑 Google 云端硬盘上的文件。

+
+ https://community.kde.org/KIO_GDrive + https://bugs.kde.org/enter_bug.cgi?format=guided&product=kio-gdrive + https://docs.kde.org/index.php?application=kioslave5%2Fgdrive + elvis.angelaccio_at_kde.org ++ ++ ++ Dolphin showing KIO GDrive in lower right, and Falkon browsing Google Drive in upper left. ++ El Dolphin mostra el KIO GDrive a la part inferior dreta, i el Falkon mostra el Google Drive a la part superior esquerra. ++ El Dolphin mostra el KIO GDrive a la part inferior dreta, i el Falkon mostra el Google Drive a la part superior esquerra. ++ Ansicht von Dolphin mit KIO GDrive unten rechts und Falkon auf Google Drive oben links. ++ Dolphin showing KIO GDrive in lower right, and Falkon browsing Google Drive in upper left. ++ Dolphin mostrando KIO GDrive abajo a la derecha y Falkon navegando por Google Drive arriba a la izquierda. ++ Dolphin näyttää KIO-GDriven alaoikealla ja Falkon selaa Google Driveen ylävasemmalla. ++ Dolphin affichant IO GDrive dans le coin inférieur gauche et Falkon naviguant sur Google Drive dans le coin supérieur gauche. ++ Dolphin mostrando KIO GDrive na parte inferior dereita, e Falkon navegando Google Drive na parte superior esquerda. ++ Dolphin menampilkan KIO GDrive di sebelah kanan bawah, dan Falkon menelusuri Google Drive di sebelah kiri atas ++ Dolphin che mostra KIO GDrive nella parte inferiore destra, e Falkon che sfoglia Google Drive nella parte superiore sinistra. ++ 오른쪽 아래: Dolphin으로 연 KIO GDrive, 왼쪽 위: Falkon으로 연 Google 드라이브. ++ Dolphin die KIO-GDrive rechtsonder toont en Falkon browsing Google Drive linksboven. ++ Dolphin-vindauge med KIO GDrive nede til høgre, samt Falkon som viser Google Drive oppe til venstre. ++ Dolphin pokazujący KIO GDrive w dolnym, prawym narożniku i Falkon przeglądający Dysk Google w górnym, lewym narożniku. ++ O Dolphin a mostrar o KIO GDrive em baixo e à direita, assim como o Falkon a navegar pelo Google Drive em cima e à esquerda. ++ O Dolphin mostrando o KIO GDrive abaixo à direita, assim como o Falkon navegando pelo Google Drive acima à esquerda. ++ Dolphin zobrazuje KIO GDrive vpravo dole a Falkon prehliadajúci Google Drive vpravo hore. ++ Dolphin som visar KIO GDrive nere till höger, och Falkon som bläddrat till Google Drive uppe till vänster. ++ Dolphin із відкритим KIO GDrive внизу праворуч і Falkon з відкритою сторінкою Google Диск вгорі ліворуч. ++ xxDolphin showing KIO GDrive in lower right, and Falkon browsing Google Drive in upper left.xx ++ 右下角 Dolphin 显示 KIO GDrive,左上角 Falkon 浏览 Google 云端硬盘网页版。 ++ https://cdn.kde.org/screenshots/kio-gdrive/kio-gdrive.png ++ ++ + KDE ++ ++ Network ++ ++ folder-gdrive +
+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(&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 + * Copyright (c) 2016 Elvis Angelaccio ++ * Copyright (c) 2019 David Barchiesi + * + * 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 + * Copyright (c) 2016 Elvis Angelaccio ++ * Copyright (c) 2019 David Barchiesi + * + * 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 + #include +@@ -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 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 @@ kio-gdrive - F. von Gellhorn - flinux@vongellhorn.ch + Clive Johnston + clivejo@protonmail.com GPL-2.0-or-later kde.desktop @@ -73,17 +73,17 @@ /usr/share/locale/uk/LC_MESSAGES/kio5_gdrive.mo /usr/share/locale/zh_CN/LC_MESSAGES/kio5_gdrive.mo /usr/share/locale/zh_TW/LC_MESSAGES/kio5_gdrive.mo - /usr/share/metainfo/org.kde.kio-gdrive.appdata.xml + /usr/share/metainfo/org.kde.kio_gdrive.metainfo.xml /usr/share/remoteview/gdrive-network.desktop - - 2019-07-07 + + 2019-08-22 1.2.6 Packaging update - F. von Gellhorn - flinux@vongellhorn.ch + Clive Johnston + clivejo@protonmail.com \ No newline at end of file