@@ -268,6 +268,12 @@ QString MerginApi::listProjectsByName( const QStringList &projectNames )
268268 return requestId;
269269}
270270
271+ void MerginApi::refetchBrokenProjects ( const QStringList &projectIds )
272+ {
273+ const QNetworkReply *reply = getProjectsDetails ( projectIds );
274+ connect ( reply, &QNetworkReply::finished, this , &MerginApi::refetchBrokenProjectsReplyFinished );
275+ }
276+
271277
272278void MerginApi::downloadNextItem ( const QString &projectId )
273279{
@@ -1674,7 +1680,7 @@ QNetworkReply *MerginApi::getProjectsDetails( const QStringList &projectIds, con
16741680{
16751681 if ( withAuth && !validateAuth () )
16761682 {
1677- for ( const QString& projectId : projectIds )
1683+ for ( const QString & projectId : projectIds )
16781684 {
16791685 emit missingAuthorizationError ( projectId );
16801686 }
@@ -1687,7 +1693,7 @@ QNetworkReply *MerginApi::getProjectsDetails( const QStringList &projectIds, con
16871693 }
16881694
16891695 QUrlQuery query;
1690- query.addQueryItem ( QStringLiteral ( " uuids" ), projectIds.join (" ," ) );
1696+ query.addQueryItem ( QStringLiteral ( " uuids" ), projectIds.join ( " ," ) );
16911697
16921698 QUrl url{};
16931699 url.setUrl ( mApiRoot + QStringLiteral ( " /v1/project/by_uuids" ) );
@@ -2083,21 +2089,49 @@ void MerginApi::getProjectsDetailsReplyFinished()
20832089 if ( mTransactionalStatus .contains ( key ) )
20842090 {
20852091 QJsonObject project = response.value ( key ).toObject ();
2086- QString projectFullName = QString (" %1/%2" ).arg ( project.value (" namespace" ).toString (), project.value (" name" ).toString ());
2092+ QString projectFullName = QString ( " %1/%2" ).arg ( project.value ( " namespace" ).toString (), project.value ( " name" ).toString () );
20872093 const bool withAuth = r->request ().attribute ( static_cast <QNetworkRequest::Attribute>( AttrAuthUsed ) ).toBool ();
2088- if (mTransactionalStatus [key].type == TransactionStatus::Pull )
2094+ if ( mTransactionalStatus [key].type == TransactionStatus::Pull )
20892095 {
2090- pullProject ( projectFullName, key, withAuth);
2091- } else
2096+ pullProject ( projectFullName, key, withAuth );
2097+ }
2098+ else
20922099 {
2093- pushProject ( projectFullName, key, withAuth);
2100+ pushProject ( projectFullName, key, withAuth );
20942101 }
20952102 }
20962103 }
20972104 }
20982105 }
20992106}
21002107
2108+ void MerginApi::refetchBrokenProjectsReplyFinished ()
2109+ {
2110+ QNetworkReply *r = qobject_cast<QNetworkReply *>( sender () );
2111+ Q_ASSERT ( r );
2112+
2113+ MerginProjectsList projectList;
2114+
2115+ if ( r->error () == QNetworkReply::NoError )
2116+ {
2117+ const QByteArray data = r->readAll ();
2118+ const QJsonDocument json = QJsonDocument::fromJson ( data );
2119+ projectList = parseProjectsFromJson ( json );
2120+ CoreUtils::log ( " refetch broken projects" , QStringLiteral ( " Success - got %1 projects" ).arg ( projectList.count () ) );
2121+ }
2122+ else
2123+ {
2124+ QString serverMsg = extractServerErrorMsg ( r->readAll () );
2125+ const QString message = QStringLiteral ( " Network API error: %1(): %2. %3" ).arg ( QStringLiteral ( " refetchBrokenProjects" ), r->errorString (), serverMsg );
2126+ emit networkErrorOccurred ( serverMsg );
2127+ CoreUtils::log ( " refetch broken projects" , QStringLiteral ( " FAILED - %1" ).arg ( message ) );
2128+ }
2129+
2130+ r->deleteLater ();
2131+
2132+ emit refetchBrokenProjectsFinished ( projectList );
2133+ }
2134+
21012135
21022136void MerginApi::finalizeProjectPullCopy ( const QString &projectFullName, const QString &projectDir, const QString &tempDir, const QString &filePath, const QList<DownloadQueueItem> &items )
21032137{
@@ -2535,7 +2569,8 @@ void MerginApi::pullInfoReplyFinished()
25352569 transaction.replyPullProjectInfo = nullptr ;
25362570
25372571 finishProjectSync ( projectFullName, projectId, false );
2538- } else
2572+ }
2573+ else
25392574 {
25402575 const QString serverMsg = extractServerErrorMsg ( r->readAll () );
25412576 const QString message = QStringLiteral ( " Network API error: %1(): %2" ).arg ( QStringLiteral ( " projectInfo" ), r->errorString () );
0 commit comments