diff options
Diffstat (limited to 'src/plugins/git/commitdata.cpp')
-rw-r--r-- | src/plugins/git/commitdata.cpp | 95 |
1 files changed, 59 insertions, 36 deletions
diff --git a/src/plugins/git/commitdata.cpp b/src/plugins/git/commitdata.cpp index 4ee06bbf9e..fb7092c7b8 100644 --- a/src/plugins/git/commitdata.cpp +++ b/src/plugins/git/commitdata.cpp @@ -40,14 +40,12 @@ namespace Internal { void GitSubmitEditorPanelInfo::clear() { repository.clear(); - description.clear(); branch.clear(); } QDebug operator<<(QDebug d, const GitSubmitEditorPanelInfo &data) { - d.nospace() << "Rep: " << data.repository << " Descr: " << data.description - << " branch: " << data.branch; + d.nospace() << "Rep: " << data.repository << " branch: " << data.branch; return d; } @@ -88,58 +86,77 @@ 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; } } -static bool checkLine(const QString &stateInfo, const QString &file, QList<CommitData::StateFilePair> *files) +bool operator<(const CommitData::StateFilePair &a, const CommitData::StateFilePair &b) +{ + if ((a.first & UnmergedFile) && !(b.first & UnmergedFile)) + return false; + if ((b.first & UnmergedFile) && !(a.first & UnmergedFile)) + return true; + return a.second < b.second; +} + +bool CommitData::checkLine(const QString &stateInfo, const QString &file) { QTC_ASSERT(stateInfo.count() == 2, return false); - QTC_ASSERT(files, return false); if (stateInfo == QLatin1String("??")) { - files->append(qMakePair(CommitData::UntrackedFile, file)); + files.append(qMakePair(FileStates(UntrackedFile), file)); return true; } - CommitData::FileState stagedState = stateFor(stateInfo.at(0)); - if (stagedState == CommitData::UnknownFileState) + FileStates xState = stateFor(stateInfo.at(0)); + FileStates yState = stateFor(stateInfo.at(1)); + if (xState == UnknownFileState || yState == UnknownFileState) return false; - stagedState = static_cast<CommitData::FileState>(stagedState | CommitData::StagedFile); - if (stagedState != CommitData::StagedFile) - files->append(qMakePair(stagedState, file)); - - CommitData::FileState state = stateFor(stateInfo.at(1)); - if (state == CommitData::UnknownFileState) - return false; + bool isMerge = (xState == UnmergedFile || yState == UnmergedFile || + ((xState == yState) && (xState == AddedFile || xState == DeletedFile))); + if (isMerge) { + if (xState == yState) { + if (xState == UnmergedFile) + xState = ModifiedFile; + files.append(qMakePair(xState | UnmergedFile | UnmergedUs | UnmergedThem, file)); + } else if (xState == UnmergedFile) { + files.append(qMakePair(yState | UnmergedFile | UnmergedThem, file)); + } else { + files.append(qMakePair(xState | UnmergedFile | UnmergedUs, file)); + } + } else { + xState |= StagedFile; + if (xState != StagedFile) + files.append(qMakePair(xState, file)); - if (state != CommitData::UntrackedFile) { - QString newFile = file; - if (stagedState == CommitData::RenamedStagedFile || stagedState == CommitData::CopiedStagedFile) - newFile = file.mid(file.indexOf(QLatin1String(" -> ")) + 4); + if (yState != UntrackedFile) { + QString newFile = file; + if (xState & (RenamedFile | CopiedFile)) + newFile = file.mid(file.indexOf(QLatin1String(" -> ")) + 4); - files->append(qMakePair(state, newFile)); + files.append(qMakePair(yState, newFile)); + } } - + qSort(files); return true; } @@ -165,24 +182,24 @@ bool CommitData::parseFilesFromStatus(const QString &output) QString file = line.mid(3); if (file.startsWith(QLatin1Char('"'))) file.remove(0, 1).chop(1); - if (!checkLine(line.mid(0, 2), file, &files)) + if (!checkLine(line.mid(0, 2), file)) return false; } return true; } -QStringList CommitData::filterFiles(const CommitData::FileState &state) const +QStringList CommitData::filterFiles(const FileStates &state) const { QStringList result; foreach (const StateFilePair &p, files) { - if (state == AllStates || state == p.first) + if (state == p.first) result.append(p.second); } return result; } -QString CommitData::stateDisplayName(const FileState &state) +QString CommitData::stateDisplayName(const FileStates &state) { QString resultState; if (state == UntrackedFile) @@ -200,8 +217,14 @@ 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")); + if (state & UnmergedUs) { + if (state & UnmergedThem) + resultState.append(QCoreApplication::translate("Git::Internal::CommitData", " by both")); + else + resultState.append(QCoreApplication::translate("Git::Internal::CommitData", " by us")); + } else if (state & UnmergedThem) { + resultState.append(QCoreApplication::translate("Git::Internal::CommitData", " by them")); + } return resultState; } |