QUrl MakeJob::workingDirectory() const { ProjectBaseItem* it = item(); if(!it) return QUrl(); KDevelop::IBuildSystemManager *bldMan = it->project()->buildSystemManager(); if( bldMan ) return bldMan->buildDirectory( it ).toUrl(); // the correct build dir else { // Just build in-source, where the build directory equals the one with particular target/source. for( ProjectBaseItem* item = it; item; item = item->parent() ) { switch( item->type() ) { case KDevelop::ProjectBaseItem::Folder: case KDevelop::ProjectBaseItem::BuildFolder: return static_cast<KDevelop::ProjectFolderItem*>(item)->path().toUrl(); break; case KDevelop::ProjectBaseItem::Target: case KDevelop::ProjectBaseItem::File: break; } } return QUrl(); } }
QStringList MakeJob::privilegedExecutionCommand() const { ProjectBaseItem* it = item(); if(!it) return QStringList(); KSharedConfigPtr configPtr = it->project()->projectConfiguration(); KConfigGroup builderGroup( configPtr, "MakeBuilder" ); bool runAsRoot = builderGroup.readEntry( "Install As Root", false ); if ( runAsRoot && m_command == InstallCommand ) { int suCommand = builderGroup.readEntry( "Su Command", 0 ); QStringList arguments; QString suCommandName; switch( suCommand ) { case 1: return QStringList() << "kdesudo" << "-t"; case 2: return QStringList() << "sudo"; default: return QStringList() << "kdesu" << "-t"; } } return QStringList(); }
void TestProjectModel::testCreateTargetItems() { QFETCH( int, itemType ); QFETCH( QString, itemText ); QFETCH( QString, expectedItemText ); QFETCH( QStringList, expectedItemPath ); QFETCH( int, expectedItemRow ); ProjectBaseItem* newitem = nullptr; switch( itemType ) { case ProjectBaseItem::Target: newitem = new ProjectTargetItem( nullptr, itemText ); break; case ProjectBaseItem::LibraryTarget: newitem = new ProjectLibraryTargetItem( nullptr, itemText ); break; } int origRowCount = model->rowCount(); model->appendRow( newitem ); QCOMPARE( model->rowCount(), origRowCount+1 ); QCOMPARE( newitem->row(), expectedItemRow ); QModelIndex idx = model->index( expectedItemRow, 0, QModelIndex() ); QVERIFY( model->itemFromIndex( idx ) ); QCOMPARE( model->itemFromIndex( idx ), newitem ); QCOMPARE( newitem->text(), expectedItemText ); QCOMPARE( newitem->type(), itemType ); QCOMPARE( model->data( idx ).toString(), expectedItemText ); QCOMPARE( model->indexFromItem( newitem ), idx ); QCOMPARE( model->pathFromIndex( idx ), expectedItemPath ); QCOMPARE( model->pathToIndex( expectedItemPath ), idx ); }
void TestProjectModel::testWithProject() { TestProject* proj = new TestProject(); ProjectFolderItem* rootItem = new ProjectFolderItem( proj, Path(QUrl::fromLocalFile(QStringLiteral("/dummyprojectfolder"))), nullptr); proj->setProjectItem( rootItem ); ProjectBaseItem* item = model->itemFromIndex( model->index( 0, 0 ) ); QCOMPARE( item, rootItem ); QCOMPARE( item->text(), proj->name() ); QCOMPARE( item->path(), proj->path() ); }
void TestProjectModel::testTakeRow() { ProjectBaseItem* parent = new ProjectBaseItem( nullptr, QStringLiteral("test") ); ProjectBaseItem* child = new ProjectBaseItem( nullptr, QStringLiteral("test"), parent ); ProjectBaseItem* subchild = new ProjectBaseItem( nullptr, QStringLiteral("subtest"), child ); model->appendRow( parent ); QCOMPARE( parent->model(), model ); QCOMPARE( child->model(), model ); QCOMPARE( subchild->model(), model ); parent->takeRow( child->row() ); QCOMPARE( child->model(), static_cast<ProjectModel*>(nullptr) ); QCOMPARE( subchild->model(), static_cast<ProjectModel*>(nullptr) ); }
QStringList MakeJob::commandLine() const { ProjectBaseItem* it = item(); if(!it) return QStringList(); QStringList cmdline; KSharedConfigPtr configPtr = it->project()->projectConfiguration(); KConfigGroup builderGroup( configPtr, "MakeBuilder" ); QString makeBin = builderGroup.readEntry("Make Binary", MakeBuilderPreferences::standardMakeCommand()); cmdline << makeBin; if( ! builderGroup.readEntry("Abort on First Error", true)) { cmdline << (isNMake(makeBin) ? "/K" : "-k"); } // note: nmake does not support the -j flag if (!isNMake(makeBin)) { if (builderGroup.readEntry("Override Number Of Jobs", false)) { int jobCount = builderGroup.readEntry("Number Of Jobs", 1); if (jobCount > 0) { cmdline << QString("-j%1").arg(jobCount); } } else { // use the ideal thread count by default cmdline << QString("-j%1").arg(QThread::idealThreadCount()); } } if( builderGroup.readEntry("Display Only", false) ) { cmdline << (isNMake(makeBin) ? "/N" : "-n"); } QString extraOptions = builderGroup.readEntry("Additional Options", QString()); if( ! extraOptions.isEmpty() ) { foreach(const QString& option, KShell::splitArgs( extraOptions ) ) cmdline << option; }
void TestProjectModel::testCreateFileSystemItems() { QFETCH( int, itemType ); QFETCH( Path, itemPath ); QFETCH( Path, expectedItemPath ); QFETCH( QString, expectedItemText ); QFETCH( QStringList, expectedRelativeItemPath ); QFETCH( int, expectedItemRow ); ProjectBaseItem* newitem = nullptr; switch( itemType ) { case ProjectBaseItem::Folder: newitem = new ProjectFolderItem( nullptr, itemPath ); break; case ProjectBaseItem::BuildFolder: newitem = new ProjectBuildFolderItem( nullptr, itemPath ); break; case ProjectBaseItem::File: newitem = new ProjectFileItem( nullptr, itemPath ); break; } int origRowCount = model->rowCount(); model->appendRow( newitem ); QCOMPARE( model->rowCount(), origRowCount+1 ); QCOMPARE( newitem->row(), expectedItemRow ); QModelIndex idx = model->index( expectedItemRow, 0, QModelIndex() ); QVERIFY( model->itemFromIndex( idx ) ); QCOMPARE( model->itemFromIndex( idx ), newitem ); QCOMPARE( newitem->text(), expectedItemText ); QCOMPARE( newitem->path(), expectedItemPath ); if( itemType == ProjectBaseItem::File ) { QCOMPARE( dynamic_cast<ProjectFileItem*>( newitem )->fileName(), expectedItemText ); } if( itemType == ProjectBaseItem::Folder || itemType == ProjectBaseItem::BuildFolder ) { QCOMPARE( dynamic_cast<ProjectFolderItem*>( newitem )->folderName(), expectedItemText ); } QCOMPARE( newitem->type(), itemType ); QCOMPARE( model->data( idx ).toString(), expectedItemText ); QCOMPARE( model->indexFromItem( newitem ), idx ); QCOMPARE( model->pathFromIndex( idx ), expectedRelativeItemPath ); QCOMPARE( model->pathToIndex( expectedRelativeItemPath ), idx ); }
void TestProjectModel::testRename() { QFETCH( int, itemType ); QFETCH( QString, itemText ); QFETCH( QString, newName ); QFETCH( bool, datachangesignal ); QFETCH( QString, expectedItemText ); QFETCH( int, expectedRenameCode ); const Path projectFolder = Path(QUrl::fromLocalFile(QStringLiteral("/dummyprojectfolder"))); TestProject* proj = new TestProject; ProjectFolderItem* rootItem = new ProjectFolderItem( proj, projectFolder, nullptr); proj->setProjectItem( rootItem ); new ProjectFileItem(QStringLiteral("existing"), rootItem); ProjectBaseItem* item = nullptr; if( itemType == ProjectBaseItem::Target ) { item = new ProjectTargetItem( proj, itemText, rootItem ); } else if( itemType == ProjectBaseItem::File ) { item = new ProjectFileItem( itemText, rootItem ); } else if( itemType == ProjectBaseItem::Folder ) { item = new ProjectFolderItem( itemText, rootItem ); } else if( itemType == ProjectBaseItem::BuildFolder ) { item = new ProjectBuildFolderItem( itemText, rootItem ); } Q_ASSERT( item ); QCOMPARE(item->model(), model); QSignalSpy s( model, SIGNAL(dataChanged(QModelIndex,QModelIndex)) ); ProjectBaseItem::RenameStatus stat = item->rename( newName ); QCOMPARE( (int)stat, expectedRenameCode ); if( datachangesignal ) { QCOMPARE( s.count(), 1 ); QCOMPARE( qvariant_cast<QModelIndex>( s.takeFirst().at(0) ), item->index() ); } else { QCOMPARE( s.count(), 0 ); } QCOMPARE( item->text(), expectedItemText ); }
void MakeJob::start() { ProjectBaseItem* it = item(); qCDebug(MAKEBUILDER) << "Building with make" << m_command << m_overrideTargets.join(" "); if (!it) { setError(ItemNoLongerValidError); setErrorText(i18n("Build item no longer available")); return emitResult(); } if( it->type() == KDevelop::ProjectBaseItem::File ) { setError(IncorrectItemError); setErrorText(i18n("Internal error: cannot build a file item")); return emitResult(); } setStandardToolView(IOutputView::BuildView); setBehaviours(KDevelop::IOutputView::AllowUserClose | KDevelop::IOutputView::AutoScroll); OutputExecuteJob::start(); }
QStringList MakeJob::commandLine() const { ProjectBaseItem* it = item(); if(!it) return QStringList(); QStringList cmdline; KSharedConfigPtr configPtr = it->project()->projectConfiguration(); KConfigGroup builderGroup( configPtr, "MakeBuilder" ); #ifdef _MSC_VER QString makeBin = builderGroup.readEntry("Make Binary", "nmake"); #else QString makeBin = builderGroup.readEntry("Make Binary", "make"); #endif cmdline << makeBin; if( ! builderGroup.readEntry("Abort on First Error", true) ) { cmdline << "-k"; } int jobnumber = builderGroup.readEntry("Number Of Jobs", 2); if(jobnumber>1) { QString jobNumberArg = QString("-j%1").arg(jobnumber); cmdline << jobNumberArg; } if( builderGroup.readEntry("Display Only", false) ) { cmdline << "-n"; } QString extraOptions = builderGroup.readEntry("Additional Options", QString()); if( ! extraOptions.isEmpty() ) { foreach(const QString& option, KShell::splitArgs( extraOptions ) ) cmdline << option; }
/** * Find sub-project represented by @param item in the projects DOM document. * This will return the root-node (i.e. documentElement) if sub-project * is not found. * @param item - the ProjectFolderItem representing the sub-project * @param name - the value of the name attribute of the element to look for * @return a QDomElement representing @param item in the DOM document or the document element */ QDomElement findElementInDocument( ProjectBaseItem *item, const QString &name ) { QStack<QString> domPath; domPath.push( name ); #if KDEV_PLUGIN_VERSION >= 10 if (!item->parent()) { //this must be the project root return projectDomDocument.documentElement(); } ProjectBaseItem *wItem = item; while ((wItem = wItem->parent())){ if (wItem->folder()) domPath.push( wItem->folder()->folderName() ); }; //remove last element, because it’s the root element, we don’t want to find that domPath.pop(); #else // for older kdevplatform versions //TODO: can this be done without dynamic_cast? ProjectFolderItem *wItem = dynamic_cast<ProjectFolderItem*>( item->parent() ); if (!wItem) { //this must be the project root return projectDomDocument.documentElement(); } while (!wItem->isProjectRoot()){ domPath.push( wItem->folderName() ); //TODO: can this be done without dynamic_cast? wItem = dynamic_cast<ProjectFolderItem*>( wItem->parent() ); }; #endif QDomElement child = projectDomDocument.documentElement(); while ( !domPath.isEmpty() ){ QString nextFolder = domPath.pop(); QDomElement d = child.firstChildElement("item"); while (!d.isNull() && d.attribute("name") != nextFolder){ if (d.attribute("name") == ""){ kWarning() << "no, this shouldn't happen"; return QDomElement(); } d = d.nextSiblingElement("item"); } child = d; } return child; }
void TestProjectModel::testItemSanity() { ProjectBaseItem* parent = new ProjectBaseItem( nullptr, QStringLiteral("test") ); ProjectBaseItem* child = new ProjectBaseItem( nullptr, QStringLiteral("test"), parent ); ProjectBaseItem* child2 = new ProjectBaseItem( nullptr, QStringLiteral("ztest"), parent ); ProjectFileItem* child3 = new ProjectFileItem( nullptr, Path(QUrl(QStringLiteral("file:///bcd"))), parent ); ProjectFileItem* child4 = new ProjectFileItem( nullptr, Path(QUrl(QStringLiteral("file:///abcd"))), parent ); // Just some basic santiy checks on the API QCOMPARE( parent->child( 0 ), child ); QCOMPARE( parent->row(), -1 ); QVERIFY( !parent->child( -1 ) ); QVERIFY( !parent->file() ); QVERIFY( !parent->folder() ); QVERIFY( !parent->project() ); QVERIFY( !parent->child( parent->rowCount() ) ); QCOMPARE( parent->iconName(), QString() ); QCOMPARE( parent->index(), QModelIndex() ); QCOMPARE( child->type(), (int)ProjectBaseItem::BaseItem ); QCOMPARE( child->lessThan( child2 ), true ); QCOMPARE( child3->lessThan( child4 ), false ); // Check that model is properly emitting data-changes model->appendRow( parent ); QCOMPARE( parent->index(), model->index(0, 0, QModelIndex()) ); QSignalSpy s( model, SIGNAL(dataChanged(QModelIndex,QModelIndex)) ); parent->setPath( Path(QStringLiteral("/newtest")) ); QCOMPARE( s.count(), 1 ); QCOMPARE( model->data( parent->index() ).toString(), QStringLiteral("newtest") ); parent->removeRow( child->row() ); }