Advertisement
orgads

DiffEditor

Nov 12th, 2014
202
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Diff 7.06 KB | None | 0 0
  1. From: Friedemann Kleint <Friedemann.Kleint@theqtcompany.com>
  2. Date:   Tue Nov 11 16:27:23 2014 +0100
  3. Follows: v3.3.0-beta1
  4.  
  5. DiffEditor: Save description along with diff.
  6.  
  7. Save complete, git-applicable patch when saving the result of
  8. for example 'git show'. Strips some Creator-specific tags
  9. off the description and reformats the description such
  10. that it is accepted by git.
  11.  
  12. Change-Id: I739d85a7263f97e2149a2794974ba026f2eca067
  13.  
  14.  
  15. diff --git a/src/plugins/diffeditor/diffeditorcontroller.cpp b/src/plugins/diffeditor/diffeditorcontroller.cpp
  16. --- a/src/plugins/diffeditor/diffeditorcontroller.cpp
  17. +++ b/src/plugins/diffeditor/diffeditorcontroller.cpp
  18. @@ -108,6 +108,44 @@ bool DiffEditorController::isIgnoreWhitespace() const
  19.      return m_ignoreWhitespace;
  20.  }
  21.  
  22. +// ### fixme: git-specific handling should be done in the git plugin:
  23. +// Remove unexpanded branches and follows-tag, clear indentation
  24. +// and create E-mail
  25. +static void formatGitDescription(QString *description)
  26. +{
  27. +    QString result;
  28. +    result.reserve(description->size());
  29. +    foreach (QString line, description->split(QLatin1Char('\n'))) {
  30. +        if (line.startsWith(QLatin1String("commit "))
  31. +            || line.startsWith(QLatin1String("Branches: <Expand>"))) {
  32. +            continue;
  33. +        }
  34. +        if (line.startsWith(QLatin1String("Author: ")))
  35. +            line.replace(0, 8, QStringLiteral("From: "));
  36. +        else if (line.startsWith(QLatin1String("    ")))
  37. +            line.remove(0, 4);
  38. +        result.append(line);
  39. +        result.append(QLatin1Char('\n'));
  40. +    }
  41. +    *description = result;
  42. +}
  43. +
  44. +QString DiffEditorController::contents() const
  45. +{
  46. +    QString result = m_description;
  47. +    const int formattingOptions = DiffUtils::GitFormat;
  48. +    if (formattingOptions & DiffUtils::GitFormat)
  49. +        formatGitDescription(&result);
  50. +
  51. +    const QString diff = DiffUtils::makePatch(diffFiles(), formattingOptions);
  52. +    if (!diff.isEmpty()) {
  53. +        if (!result.isEmpty())
  54. +            result += QLatin1Char('\n');
  55. +        result += diff;
  56. +    }
  57. +    return result;
  58. +}
  59. +
  60.  QString DiffEditorController::makePatch(bool revert, bool addPrefix) const
  61.  {
  62.      if (m_diffFileIndex < 0 || m_chunkIndex < 0)
  63. diff --git a/src/plugins/diffeditor/diffeditorcontroller.h b/src/plugins/diffeditor/diffeditorcontroller.h
  64. --- a/src/plugins/diffeditor/diffeditorcontroller.h
  65. +++ b/src/plugins/diffeditor/diffeditorcontroller.h
  66. @@ -58,6 +58,7 @@ public:
  67.      bool isIgnoreWhitespace() const;
  68.  
  69.      QString makePatch(bool revert, bool addPrefix = false) const;
  70. +    QString contents() const;
  71.  
  72.      DiffEditorReloader *reloader() const;
  73.      void setReloader(DiffEditorReloader *reloader);
  74. diff --git a/src/plugins/diffeditor/diffeditordocument.cpp b/src/plugins/diffeditor/diffeditordocument.cpp
  75. --- a/src/plugins/diffeditor/diffeditordocument.cpp
  76. +++ b/src/plugins/diffeditor/diffeditordocument.cpp
  77. @@ -78,9 +78,7 @@ bool DiffEditorDocument::save(QString *errorString, const QString &fileName, boo
  78.      Q_UNUSED(errorString)
  79.      Q_UNUSED(autoSave)
  80.  
  81. -    const QString contents = DiffUtils::makePatch(m_controller->diffFiles());
  82. -
  83. -    const bool ok = write(fileName, format(), contents, errorString);
  84. +    const bool ok = write(fileName, format(), m_controller->contents(), errorString);
  85.  
  86.      if (!ok)
  87.          return false;
  88. diff --git a/src/plugins/diffeditor/diffutils.cpp b/src/plugins/diffeditor/diffutils.cpp
  89. --- a/src/plugins/diffeditor/diffutils.cpp
  90. +++ b/src/plugins/diffeditor/diffutils.cpp
  91. @@ -31,6 +31,7 @@
  92.  #include "diffutils.h"
  93.  #include "differ.h"
  94.  #include <QStringList>
  95. +#include <QTextStream>
  96.  #include "texteditor/fontsettings.h"
  97.  
  98.  namespace DiffEditor {
  99. @@ -483,31 +484,35 @@ QString DiffUtils::makePatch(const ChunkData &chunkData,
  100.      return diffText;
  101.  }
  102.  
  103. -QString DiffUtils::makePatch(const QList<FileData> &fileDataList)
  104. +QString DiffUtils::makePatch(const QList<FileData> &fileDataList, unsigned formatFlags)
  105.  {
  106.      QString diffText;
  107. +    QTextStream str(&diffText);
  108.  
  109.      for (int i = 0; i < fileDataList.count(); i++) {
  110.          const FileData &fileData = fileDataList.at(i);
  111. -
  112. +        if (formatFlags & GitFormat) {
  113. +            str << "diff --git a/" << fileData.leftFileInfo.fileName
  114. +                << " b/" << fileData.rightFileInfo.fileName << "\n";
  115. +        }
  116.          if (fileData.binaryFiles) {
  117. -            const QString binaryLine = QLatin1String("Binary files ")
  118. -                    + fileData.leftFileInfo.fileName
  119. -                    + QLatin1String(" and ")
  120. -                    + fileData.rightFileInfo.fileName
  121. -                    + QLatin1String(" differ\n");
  122. -            diffText += binaryLine;
  123. +            str << "Binary files ";
  124. +            if (formatFlags & AddLevel)
  125. +                str << "a/";
  126. +            str << fileData.leftFileInfo.fileName << " and ";
  127. +            if (formatFlags & AddLevel)
  128. +                str << "b/";
  129. +            str << fileData.rightFileInfo.fileName << " differ\n";
  130.          } else {
  131. -            const QString leftFileInfo = QLatin1String("--- ")
  132. -                    + fileData.leftFileInfo.fileName + QLatin1Char('\n');
  133. -            const QString rightFileInfo = QLatin1String("+++ ")
  134. -                    + fileData.rightFileInfo.fileName + QLatin1Char('\n');
  135. -
  136. -            diffText += leftFileInfo;
  137. -            diffText += rightFileInfo;
  138. -
  139. +            str << "--- ";
  140. +            if (formatFlags & AddLevel)
  141. +                str << "a/";
  142. +            str << fileData.leftFileInfo.fileName << "\n+++ ";
  143. +            if (formatFlags & AddLevel)
  144. +                str << "b/";
  145. +            str << fileData.rightFileInfo.fileName << '\n';
  146.              for (int j = 0; j < fileData.chunks.count(); j++) {
  147. -                diffText += makePatch(fileData.chunks.at(j),
  148. +                str << makePatch(fileData.chunks.at(j),
  149.                                        (j == fileData.chunks.count() - 1)
  150.                                        && fileData.lastChunkAtTheEndOfFile);
  151.              }
  152. diff --git a/src/plugins/diffeditor/diffutils.h b/src/plugins/diffeditor/diffutils.h
  153. --- a/src/plugins/diffeditor/diffutils.h
  154. +++ b/src/plugins/diffeditor/diffutils.h
  155. @@ -130,6 +130,10 @@ public:
  156.  
  157.  class DIFFEDITOR_EXPORT DiffUtils {
  158.  public:
  159. +    enum PatchFormattingFlags {
  160. +        AddLevel = 0x1, // Add 'a/' , '/b' for git am
  161. +        GitFormat = AddLevel | 0x2, // Add line 'diff ..' as git does
  162. +    };
  163.  
  164.      static ChunkData calculateOriginalData(const QList<Diff> &leftDiffList,
  165.                                             const QList<Diff> &rightDiffList);
  166. @@ -146,7 +150,8 @@ public:
  167.                               const QString &leftFileName,
  168.                               const QString &rightFileName,
  169.                               bool lastChunk = false);
  170. -    static QString makePatch(const QList<FileData> &fileDataList);
  171. +    static QString makePatch(const QList<FileData> &fileDataList,
  172. +                             unsigned formatFlags = 0);
  173.      static QList<FileData> readPatch(const QString &patch,
  174.                                       bool *ok = 0);
  175.  };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement