diff --git a/src/plugins/git/commitdata.cpp b/src/plugins/git/commitdata.cpp index 5b2f096e4fb7f36e2c8ee49aeb501c0ff92b2a44..8c81dd4059a39801cd20fd8e2e7b53d5005f4c4e 100644 --- a/src/plugins/git/commitdata.cpp +++ b/src/plugins/git/commitdata.cpp @@ -88,25 +88,25 @@ void CommitData::clear() files.clear(); } -static CommitData::FileState stateFor(const QChar &c) +static FileStates stateFor(const QChar &c) { switch (c.unicode()) { case ' ': - return CommitData::UntrackedFile; + return UntrackedFile; case 'M': - return CommitData::ModifiedFile; + return ModifiedFile; case 'A': - return CommitData::AddedFile; + return AddedFile; case 'D': - return CommitData::DeletedFile; + return DeletedFile; case 'R': - return CommitData::RenamedFile; + return RenamedFile; case 'C': - return CommitData::CopiedFile; + return CopiedFile; case 'U': - return CommitData::UpdatedFile; + return UnmergedFile; default: - return CommitData::UnknownFileState; + return UnknownFileState; } } @@ -115,25 +115,25 @@ bool CommitData::checkLine(const QString &stateInfo, const QString &file) QTC_ASSERT(stateInfo.count() == 2, return false); if (stateInfo == QLatin1String("??")) { - files.append(qMakePair(UntrackedFile, file)); + files.append(qMakePair(FileStates(UntrackedFile), file)); return true; } - FileState stagedState = stateFor(stateInfo.at(0)); + FileStates stagedState = stateFor(stateInfo.at(0)); if (stagedState == UnknownFileState) return false; - stagedState = static_cast<FileState>(stagedState | StagedFile); + stagedState |= StagedFile; if (stagedState != StagedFile) files.append(qMakePair(stagedState, file)); - FileState state = stateFor(stateInfo.at(1)); + FileStates state = stateFor(stateInfo.at(1)); if (state == UnknownFileState) return false; if (state != UntrackedFile) { QString newFile = file; - if (stagedState == RenamedStagedFile || stagedState == CopiedStagedFile) + if (stagedState & (RenamedFile | CopiedFile)) newFile = file.mid(file.indexOf(QLatin1String(" -> ")) + 4); files.append(qMakePair(state, newFile)); @@ -171,7 +171,7 @@ bool CommitData::parseFilesFromStatus(const QString &output) return true; } -QStringList CommitData::filterFiles(const CommitData::FileState &state) const +QStringList CommitData::filterFiles(const FileStates &state) const { QStringList result; foreach (const StateFilePair &p, files) { @@ -181,7 +181,7 @@ QStringList CommitData::filterFiles(const CommitData::FileState &state) const return result; } -QString CommitData::stateDisplayName(const FileState &state) +QString CommitData::stateDisplayName(const FileStates &state) { QString resultState; if (state == UntrackedFile) @@ -199,8 +199,8 @@ QString CommitData::stateDisplayName(const FileState &state) resultState.append(QCoreApplication::translate("Git::Internal::CommitData", "renamed")); else if (state & CopiedFile) resultState.append(QCoreApplication::translate("Git::Internal::CommitData", "copied")); - else if (state & UpdatedFile) - resultState.append(QCoreApplication::translate("Git::Internal::CommitData", "updated")); + else if (state & UnmergedFile) + resultState.append(QCoreApplication::translate("Git::Internal::CommitData", "unmerged")); return resultState; } diff --git a/src/plugins/git/commitdata.h b/src/plugins/git/commitdata.h index 093c7cc138f1d67b3a404afeaadc0aa329e82df6..27293746a1ad3accf6d5fdaf8eeafd3671b3322c 100644 --- a/src/plugins/git/commitdata.h +++ b/src/plugins/git/commitdata.h @@ -64,33 +64,26 @@ struct GitSubmitEditorPanelData QDebug operator<<(QDebug d, const GitSubmitEditorPanelData &); +enum FileState { + UntrackedFile = 0, + + StagedFile = 0x01, + ModifiedFile = 0x02, + AddedFile = 0x04, + DeletedFile = 0x08, + RenamedFile = 0x10, + CopiedFile = 0x20, + UnmergedFile = 0x40, + + UnknownFileState = 0x800 +}; +Q_DECLARE_FLAGS(FileStates, FileState) + class CommitData { public: - enum FileState { - UntrackedFile = 0, - - StagedFile = 0x01, - ModifiedFile = 0x02, - AddedFile = 0x04, - DeletedFile = 0x08, - RenamedFile = 0x10, - CopiedFile = 0x20, - UpdatedFile = 0x40, - - ModifiedStagedFile = StagedFile | ModifiedFile, - AddedStagedFile = StagedFile | AddedFile, - DeletedStagedFile = StagedFile | DeletedFile, - RenamedStagedFile = StagedFile | RenamedFile, - CopiedStagedFile = StagedFile | CopiedFile, - UpdatedStagedFile = StagedFile | UpdatedFile, - - AllStates = UpdatedFile | CopiedFile | RenamedFile | DeletedFile | AddedFile | ModifiedFile | StagedFile, - UnknownFileState - }; - // A pair of state string/file name ('modified', 'file.cpp'). - typedef QPair<FileState, QString> StateFilePair; + typedef QPair<FileStates, QString> StateFilePair; void clear(); // Parse the files and the branch of panelInfo @@ -99,9 +92,9 @@ public: // Convenience to retrieve the file names from // the specification list. Optionally filter for a certain state - QStringList filterFiles(const FileState &state) const; + QStringList filterFiles(const FileStates &state) const; - static QString stateDisplayName(const FileState &state); + static QString stateDisplayName(const FileStates &state); QString amendSHA1; QString commitEncoding; @@ -117,4 +110,6 @@ private: } // namespace Internal } // namespace Git +Q_DECLARE_OPERATORS_FOR_FLAGS(Git::Internal::FileStates) + #endif // COMMITDATA_H diff --git a/src/plugins/git/gitclient.cpp b/src/plugins/git/gitclient.cpp index 4a185c9ebca8daaefdc69765b51fad947b33c088..4ccdb0132664cbefb0827ce1d9131f5595ff4d5a 100644 --- a/src/plugins/git/gitclient.cpp +++ b/src/plugins/git/gitclient.cpp @@ -1750,13 +1750,13 @@ bool GitClient::getCommitData(const QString &workingDirectory, } // Filter out untracked files that are not part of the project - QStringList untrackedFiles = commitData->filterFiles(CommitData::UntrackedFile); + QStringList untrackedFiles = commitData->filterFiles(UntrackedFile); VcsBase::VcsBaseSubmitEditor::filterUntrackedFilesOfProject(repoDirectory, &untrackedFiles); QList<CommitData::StateFilePair> filteredFiles; QList<CommitData::StateFilePair>::const_iterator it = commitData->files.constBegin(); for ( ; it != commitData->files.constEnd(); ++it) { - if (it->first == CommitData::UntrackedFile && !untrackedFiles.contains(it->second)) + if (it->first == UntrackedFile && !untrackedFiles.contains(it->second)) continue; filteredFiles.append(*it); } @@ -1836,47 +1836,41 @@ bool GitClient::addAndCommit(const QString &repositoryDirectory, int commitCount = 0; for (int i = 0; i < model->rowCount(); ++i) { - const CommitData::FileState state = static_cast<CommitData::FileState>(model->extraData(i).toInt()); + const FileStates state = static_cast<FileStates>(model->extraData(i).toInt()); QString file = model->file(i); const bool checked = model->checked(i); if (checked) ++commitCount; - if (state == CommitData::UntrackedFile && checked) + if (state == UntrackedFile && checked) filesToAdd.append(file); - if (state == CommitData::ModifiedStagedFile && !checked) { - filesToReset.append(file); - } else if (state == CommitData::AddedStagedFile && !checked) { - filesToReset.append(file); - } else if (state == CommitData::DeletedStagedFile && !checked) { - filesToReset.append(file); - } else if (state == CommitData::RenamedStagedFile && !checked) { - const int pos = file.indexOf(QLatin1String(" -> ")); - const QString newFile = file.mid(pos + 4); - filesToReset.append(newFile); - } else if (state == CommitData::CopiedStagedFile && !checked) { - const QString newFile = file.mid(file.indexOf(renameSeparator) + renameSeparator.count()); - filesToReset.append(newFile); - } else if (state == CommitData::UpdatedStagedFile && !checked) { - QTC_ASSERT(false, continue); // There should not be updated files when commiting! + if ((state & StagedFile) && !checked) { + if (state & (AddedFile | DeletedFile)) { + filesToReset.append(file); + } else if (state & (RenamedFile | CopiedFile)) { + const QString newFile = file.mid(file.indexOf(renameSeparator) + renameSeparator.count()); + filesToReset.append(newFile); + } + } else if (state & UnmergedFile && checked) { + QTC_ASSERT(false, continue); // There should not be unmerged files when commiting! } - if (state == CommitData::ModifiedFile && checked) { + if (state == ModifiedFile && checked) { filesToReset.removeAll(file); filesToAdd.append(file); - } else if (state == CommitData::AddedFile && checked) { + } else if (state == AddedFile && checked) { QTC_ASSERT(false, continue); // these should be untracked! - } else if (state == CommitData::DeletedFile && checked) { + } else if (state == DeletedFile && checked) { filesToReset.removeAll(file); filesToRemove.append(file); - } else if (state == CommitData::RenamedFile && checked) { + } else if (state == RenamedFile && checked) { QTC_ASSERT(false, continue); // git mv directly stages. - } else if (state == CommitData::CopiedFile && checked) { + } else if (state == CopiedFile && checked) { QTC_ASSERT(false, continue); // only is noticed after adding a new file to the index - } else if (state == CommitData::UpdatedFile && checked) { - QTC_ASSERT(false, continue); // There should not be updated files when commiting! + } else if (state == UnmergedFile && checked) { + QTC_ASSERT(false, continue); // There should not be unmerged files when commiting! } } @@ -1965,8 +1959,8 @@ GitClient::RevertResult GitClient::revertI(QStringList files, } // From the status output, determine all modified [un]staged files. - const QStringList allStagedFiles = data.filterFiles(CommitData::ModifiedStagedFile); - const QStringList allUnstagedFiles = data.filterFiles(CommitData::ModifiedFile); + const QStringList allStagedFiles = data.filterFiles(StagedFile | ModifiedFile); + const QStringList allUnstagedFiles = data.filterFiles(ModifiedFile); // Unless a directory was passed, filter all modified files for the // argument file list. QStringList stagedFiles = allStagedFiles; diff --git a/src/plugins/git/gitplugin.cpp b/src/plugins/git/gitplugin.cpp index 123b69bd75dfacbb0f278be2e3b52cd847bb7dc5..7759c24ed21f8ff254044be8fbd09d0f1d271b77 100644 --- a/src/plugins/git/gitplugin.cpp +++ b/src/plugins/git/gitplugin.cpp @@ -1069,44 +1069,42 @@ GitClient *GitPlugin::gitClient() const #ifdef WITH_TESTS #include <QTest> -Q_DECLARE_METATYPE(CommitData::FileState) +Q_DECLARE_METATYPE(FileStates) void GitPlugin::testStatusParsing_data() { - QTest::addColumn<QString>("line"); - QTest::addColumn<CommitData::FileState>("first"); - QTest::addColumn<CommitData::FileState>("second"); - -#define STATUS_TEST(status, first, second) \ - QTest::newRow(status) << QString::fromLatin1(status) << CommitData::first << CommitData::second; - STATUS_TEST(" M", ModifiedFile, UnknownFileState); - STATUS_TEST(" D", DeletedFile, UnknownFileState); - STATUS_TEST("M ", ModifiedStagedFile, UnknownFileState); - STATUS_TEST("MM", ModifiedStagedFile, ModifiedFile); - STATUS_TEST("MD", ModifiedStagedFile, DeletedFile); - STATUS_TEST("A ", AddedStagedFile, UnknownFileState); - STATUS_TEST("AM", AddedStagedFile, ModifiedFile); - STATUS_TEST("AD", AddedStagedFile, DeletedFile); - STATUS_TEST("D ", DeletedStagedFile, UnknownFileState); - STATUS_TEST("DM", DeletedStagedFile, ModifiedFile); - STATUS_TEST("R ", RenamedStagedFile, UnknownFileState); - STATUS_TEST("RM", RenamedStagedFile, ModifiedFile); - STATUS_TEST("RD", RenamedStagedFile, DeletedFile); - STATUS_TEST("C ", CopiedStagedFile, UnknownFileState); - STATUS_TEST("CM", CopiedStagedFile, ModifiedFile); - STATUS_TEST("CD", CopiedStagedFile, DeletedFile); + QTest::addColumn<FileStates>("first"); + QTest::addColumn<FileStates>("second"); + + QTest::newRow(" M") << FileStates(ModifiedFile) << FileStates(UnknownFileState); + QTest::newRow(" D") << FileStates(DeletedFile) << FileStates(UnknownFileState); + QTest::newRow("M ") << (ModifiedFile | StagedFile) << FileStates(UnknownFileState); + QTest::newRow("MM") << (ModifiedFile | StagedFile) << FileStates(ModifiedFile); + QTest::newRow("MD") << (ModifiedFile | StagedFile) << FileStates(DeletedFile); + QTest::newRow("A ") << (AddedFile | StagedFile) << FileStates(UnknownFileState); + QTest::newRow("AM") << (AddedFile | StagedFile) << FileStates(ModifiedFile); + QTest::newRow("AD") << (AddedFile | StagedFile) << FileStates(DeletedFile); + QTest::newRow("D ") << (DeletedFile | StagedFile) << FileStates(UnknownFileState); + QTest::newRow("DM") << (DeletedFile | StagedFile) << FileStates(ModifiedFile); + QTest::newRow("R ") << (RenamedFile | StagedFile) << FileStates(UnknownFileState); + QTest::newRow("RM") << (RenamedFile | StagedFile) << FileStates(ModifiedFile); + QTest::newRow("RD") << (RenamedFile | StagedFile) << FileStates(DeletedFile); + QTest::newRow("C ") << (CopiedFile | StagedFile) << FileStates(UnknownFileState); + QTest::newRow("CM") << (CopiedFile | StagedFile) << FileStates(ModifiedFile); + QTest::newRow("CD") << (CopiedFile | StagedFile) << FileStates(DeletedFile); } void GitPlugin::testStatusParsing() { CommitData data; - QFETCH(QString, line); - QFETCH(CommitData::FileState, first); - QFETCH(CommitData::FileState, second); + QFETCH(FileStates, first); + QFETCH(FileStates, second); QString output = QLatin1String("## master...origin/master [ahead 1]\n"); - output += line + QLatin1String(" main.cpp\n"); + output += QString::fromLatin1(QTest::currentDataTag()) + QLatin1String(" main.cpp\n"); data.parseFilesFromStatus(output); QCOMPARE(data.files.at(0).first, first); - if (second != CommitData::UnknownFileState) + if (second == UnknownFileState) + QCOMPARE(data.files.size(), 1); + else QCOMPARE(data.files.at(1).first, second); } #endif diff --git a/src/plugins/git/gitsubmiteditor.cpp b/src/plugins/git/gitsubmiteditor.cpp index 7b56aa7fdd50bc8441d76c7413dfb6a300e73ab5..895efe61a1085e70dd2ca586a843587abb75ab95 100644 --- a/src/plugins/git/gitsubmiteditor.cpp +++ b/src/plugins/git/gitsubmiteditor.cpp @@ -70,9 +70,9 @@ void GitSubmitEditor::setCommitData(const CommitData &d) if (!d.files.isEmpty()) { for (QList<CommitData::StateFilePair>::const_iterator it = d.files.constBegin(); it != d.files.constEnd(); ++it) { - const CommitData::FileState state = it->first; + const FileStates state = it->first; const QString file = it->second; - m_model->addFile(file, CommitData::stateDisplayName(state), state & CommitData::StagedFile, + m_model->addFile(file, CommitData::stateDisplayName(state), state & StagedFile, QVariant(static_cast<int>(state))); } } @@ -89,10 +89,10 @@ void GitSubmitEditor::slotDiffSelected(const QStringList &files) for (int r = 0; r < rowCount; r++) { const QString fileName = m_model->item(r, fileColumn)->text(); if (files.contains(fileName)) { - const CommitData::FileState state = static_cast<CommitData::FileState>(m_model->extraData(r).toInt()); - if (state & CommitData::StagedFile) + const FileStates state = static_cast<FileStates>(m_model->extraData(r).toInt()); + if (state & StagedFile) stagedFiles.push_back(fileName); - else if (state != CommitData::UntrackedFile) + else if (state != UntrackedFile) unstagedFiles.push_back(fileName); } }