是否可以从 JGit 读取补丁文件?

纳根德拉·辛格 |

我有一个生成补丁文件的 shell 脚本:

git diff --word-diff origin/$ghprbTargetBranch origin/$1 > diff1.txt

现在我需要从 JGIT 读取 diff1.txt 补丁文件以获取所有文件更改。diff1.txt 如下所示:

diff --git a/src/objects/Account.object b/src/objects/Account.object
index 0bd43e4..f827031 100644
--- a/src/objects/Account.object
+++ b/src/objects/Account.object
@@ -133,6 +133,14 @@
        <fullName>CleanStatus</fullName>
        <trackFeedHistory>false</trackFeedHistory>
    </fields>
    {+<fields>+}
{+      <fullName>MatchAddress__c</fullName>+}
{+      <defaultValue>false</defaultValue>+}
{+      <externalId>false</externalId>+}
{+      <label>MatchAddress</label>+}
{+      <trackFeedHistory>false</trackFeedHistory>+}
{+      <type>Checkbox</type>+}
{+  </fields>+}
    <fields>
        <fullName>CustomerPriority__c</fullName>
        <externalId>false</externalId>
@@ -240,6 +248,17 @@
        <type>Number</type>
        <unique>false</unique>
    </fields>
    {+<fields>+}
{+      <fullName>Check1__c</fullName>+}
{+      <externalId>false</externalId>+}
{+      <label>check1</label>+}
{+      <precision>18</precision>+}
{+      <required>false</required>+}
{+      <scale>0</scale>+}
{+      <trackFeedHistory>false</trackFeedHistory>+}
{+      <type>Number</type>+}
{+      <unique>false</unique>+}
{+  </fields>+}
    <fields>
        <fullName>NumberofLocations__c</fullName>
        <externalId>false</externalId>

是否可以从 Java 读取补丁文件并仅获取添加的行?

输出

<fields>
    <fullName>MatchAddress__c</fullName>
    <defaultValue>false</defaultValue>
    <externalId>false</externalId>
    <label>MatchAddress</label>
    <trackFeedHistory>false</trackFeedHistory>
    <type>Checkbox</type>
</fields>

and the next field Check1__C
纳根德拉·辛格 |

在浏览了 JGIT 源代码后,我发现他们如何在 JGit 中应用补丁,这里是 JGit 如何读取补丁并应用补丁,我只是想读取补丁文件。

public static void main(String[] args) throws IOException, PatchFormatException, PatchApplyException {

    for (String arg : args) {
        System.out.println(arg);
    }
    // args[0] - patch file path
    String patchFilePath = "C:\\JenkinsNew\\workspace\\ValidateJob\\diffPatch.patch";

    Patch patch = new Patch();
    patch.parse(new FileInputStream(new File(patchFilePath)));
    if (!patch.getErrors().isEmpty())
        throw new PatchFormatException(patch.getErrors());
    for (FileHeader fh : patch.getFiles()) {
        File file = getFile(fh.getOldPath(), false, "");
        List<String> apply = apply(file, fh);
        for (String s : apply) {
            System.out.println(s);
        }
    }
}

private static File getFile(String path, boolean create, String workSpacePath)
        throws PatchApplyException {
    // args[1] : the workspace
    File f = new File("C:\\JenkinsNew\\workspace\\ValidateJob", path);
    if (create)
        try {
            File parent = f.getParentFile();
            FileUtils.mkdirs(parent, true);
            FileUtils.createNewFile(f);
        } catch (IOException e) {
            throw new PatchApplyException(MessageFormat.format(JGitText.get().createNewFileFailed, f), e);
        }
    return f;
}

private static List<String> apply(File f, FileHeader fh)
        throws IOException, PatchApplyException {
    RawText rt = new RawText(f);
    List<String> oldLines = new ArrayList<>(rt.size());
    for (int i = 0; i < rt.size(); i++)
        oldLines.add(rt.getString(i));
    List<String> newLines = new ArrayList<>(oldLines);
    List<String> newLineToBeAdded = new ArrayList<>();
    for (HunkHeader hh : fh.getHunks()) {

        byte[] b = new byte[hh.getEndOffset() - hh.getStartOffset()];
        System.arraycopy(hh.getBuffer(), hh.getStartOffset(), b, 0, b.length);
        RawText hrt = new RawText(b);

        List<String> hunkLines = new ArrayList<>(hrt.size());
        for (int i = 0; i < hrt.size(); i++)
            hunkLines.add(hrt.getString(i));
        int pos = 0;
        for (int j = 1; j < hunkLines.size(); j++) {
            String hunkLine = hunkLines.get(j);
            switch (hunkLine.charAt(0)) {
                case '-':
                    if (hh.getNewStartLine() == 0) {
                        newLines.clear();
                    } else {
                        if (!(newLines.get(hh.getNewStartLine() - 1 + pos).replaceAll("([\\r\\n])", "")).equals(hunkLine.substring(1))) {
                            throw new PatchApplyException(MessageFormat.format(JGitText.get().patchApplyException, hh));
                        }
                        newLines.remove(hh.getNewStartLine() - 1 + pos);
                    }
                    break;
                case '+':
                    newLines.add(hh.getNewStartLine() - 1 + pos,hunkLine.substring(1));
                    newLineToBeAdded.add(hunkLine.substring(1));
                    pos++;
                    break;
            }
        }
    }
    return newLineToBeAdded;
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

JGit获取拉文件

来自分类Dev

是否可以使用JGit的内存中存储库将一个小文件添加到大的Git存储库而无需在本地检出它?

来自分类Dev

是否可以在编译时读取文件?

来自分类Dev

是否可以快速读取授权文件

来自分类Dev

JGit检查分支是否签出

来自分类Dev

防止JGit读取本地git配置

来自分类Dev

JGit:从子模块读取提交

来自分类Dev

是否可以在一个命令和文件中同时获得对$ HOME和系统中的补丁文件的补丁?

来自分类Dev

如何在JGit中重命名文件

来自分类Dev

JGit稀疏签出不断添加文件

来自分类Dev

通过补丁添加时,是否可以在git中添加未跟踪的文件?

来自分类Dev

是否可以用“统一”补丁替换来自 git 中不同提交的文件?

来自分类Dev

JGit遍历本地和远程分支仅HEAD并读取文件

来自分类Dev

是否可以从 BigTable 异步读取?

来自分类Dev

是否有任何包可以从python文件中读取表

来自分类Dev

是否可以使用Lua向后读取文件?

来自分类Dev

是否有任何包可以从python文件中读取表

来自分类Dev

如何验证文件是否可以被人类读取?

来自分类Dev

如何知道用户是否可以读取和列出目录文件

来自分类Dev

是否可以使用dask从远程服务读取.tiff文件?

来自分类Dev

是否可以从C或Fortran中读取.Rdata文件格式?

来自分类Dev

是否存在Excel可以读取的.xml格式文件

来自分类Dev

是否可以下载具有读取权限的php文件?

来自分类Dev

是否可以从Android资源xml文件读取gradle变量?

来自分类Dev

是否可以从文件中读取gnuplot中的标签值

来自分类Dev

是否可以在R中处理文件读取和解析

来自分类Dev

是否可以使用Lua向后读取文件?

来自分类Dev

是否可以将读取重定向到Linux中的文件?

来自分类Dev

是否可以在文件读取操作中创建动态内容?

Related 相关文章

  1. 1

    JGit获取拉文件

  2. 2

    是否可以使用JGit的内存中存储库将一个小文件添加到大的Git存储库而无需在本地检出它?

  3. 3

    是否可以在编译时读取文件?

  4. 4

    是否可以快速读取授权文件

  5. 5

    JGit检查分支是否签出

  6. 6

    防止JGit读取本地git配置

  7. 7

    JGit:从子模块读取提交

  8. 8

    是否可以在一个命令和文件中同时获得对$ HOME和系统中的补丁文件的补丁?

  9. 9

    如何在JGit中重命名文件

  10. 10

    JGit稀疏签出不断添加文件

  11. 11

    通过补丁添加时,是否可以在git中添加未跟踪的文件?

  12. 12

    是否可以用“统一”补丁替换来自 git 中不同提交的文件?

  13. 13

    JGit遍历本地和远程分支仅HEAD并读取文件

  14. 14

    是否可以从 BigTable 异步读取?

  15. 15

    是否有任何包可以从python文件中读取表

  16. 16

    是否可以使用Lua向后读取文件?

  17. 17

    是否有任何包可以从python文件中读取表

  18. 18

    如何验证文件是否可以被人类读取?

  19. 19

    如何知道用户是否可以读取和列出目录文件

  20. 20

    是否可以使用dask从远程服务读取.tiff文件?

  21. 21

    是否可以从C或Fortran中读取.Rdata文件格式?

  22. 22

    是否存在Excel可以读取的.xml格式文件

  23. 23

    是否可以下载具有读取权限的php文件?

  24. 24

    是否可以从Android资源xml文件读取gradle变量?

  25. 25

    是否可以从文件中读取gnuplot中的标签值

  26. 26

    是否可以在R中处理文件读取和解析

  27. 27

    是否可以使用Lua向后读取文件?

  28. 28

    是否可以将读取重定向到Linux中的文件?

  29. 29

    是否可以在文件读取操作中创建动态内容?

热门标签

归档