Ruby Git差异行信息解析器

时间:2019-03-14 14:17:50

标签: ruby git-diff

如何解析git diff的输出并获取行信息(即已添加/修改了哪些行)?

我想要类似的东西

raw = `git diff`
parsed = Git.Diff.parse(raw)
parsed.each do |file|
  file.each do |line|
     puts "#{file.name} - #{line.number} - #{line.type}"
  end
end

编辑:

样本输出

[
  {
    "file": "path/to/file1",
    "lines": [
      { number: "1", type: "modified"},
      { number: "4", type: "deleted"},
      { number: "9", type: "added"}
    ]
  },
  {
    "file": "path/to/file2",
    "lines": [
      { number: "4", type: "modified"},
      { number: "5", type: "added"}
    ]
  }
]

3 个答案:

答案 0 :(得分:1)

您需要的是将输出正确分组为文件块,并保留所需的内容。

获取差异

您只需运行

即可获得它
task bootRunDev {
    bootRun.configure {
        systemProperty "spring.profiles.active", 'Dev'
    }
}

bootRunDev.finalizedBy bootRun

需要哪些行?

  • `git --diff` 开头的行,您可以在其中获取文件名
  • 'diff --git'开头的行是已添加的
  • '+ '开头的
  • 行已被删除

如何将它们分组?

对于这些事情,Enumerable#slice_before浮现在脑海。

放在一起

我最终得到了这个原型:

'- '

输出示例

raw_data = `git diff`.split("\n")

# Keep what is needed
clean_data = raw_data.select { |li|
  li.starts_with?('diff --git') ||
  li.starts_with?('- ') ||
  li.starts_with?('+ ')
}

# Group the by file
# [[file_1, line1, line2, line3], [file_2, line1]]
file_data = clean_data.slice_before { |li| li.starts_with?('diff --git') }

# This is the output format
output = Hash.new {|h,k| h[k] = { added: 0, removed: 0 } }

# Populate the output
file_data.each_with_object(output) do |f_data, memo|
  file, *file_info = f_data
  file = file.split(' b/').first.gsub('diff --git a/', '')
  file_info.each { |f_info|
    memo[file][f_info[0] == '+' ? :added : :removed] += 1
  }
end

我相信它会变得更好:-)

答案 1 :(得分:1)

这就是我最后得到的

function more {
    param([string[]]$paths)

    $OutputEncoding = [System.Console]::OutputEncoding

    if($paths) {
        foreach ($file in $paths) {
            Get-Content $file | more.com
        }
    }
    else {
        $input | more.com
    }
}

答案 2 :(得分:0)

您可以试试 https://github.com/bguban/git_modified_lines gem。它只返回修改过的行,但可能会有用