Как разобрать git diff определенного файла, используя Ruby? - PullRequest
1 голос
/ 15 марта 2019

У меня есть Android XML (строковый) файл, который редактируется в сценарии Ruby.Я хотел бы перечислить и вывести изменения, которые были сделаны тогда.Я пробовал это с Nokogiri и nokogiri/diff.Но у него нет желаемого результата.

У меня также есть ощущение, что у него возникают проблемы при добавлении новой строки в середине.В общем, я думаю, было бы проще, если бы я мог использовать git diff.

Я также нашел ruby-git драгоценный камень, но я все еще не мог заставить его работать.Тем более, что мне нужен только diff конкретного файла.

require 'git'

Git.configure do |config|
 #not sure if I actually need something?
end

g = Git.open(path_to_my_dir, :log => Logger.new(STDOUT))    
g.diff(path_to_file)
#or
g.diff().path(path_to_file)

Может кто-нибудь помочь мне?: - (

Ответы [ 2 ]

2 голосов
/ 15 марта 2019

Вы подумали в правильном направлении.

Для этой цели используйте

require 'git'
g = Git.open('path/to/dir')
g.diff('your.file').patch #=> changes in your.file

Например, у нас были пустые файлы git.rb и smth в нашем git-repo.

Затем мы изменили их и проверили разницу:

$ git diff
diff --git a/git.rb b/git.rb
index e69de29..3ff224d 100644
--- a/git.rb
+++ b/git.rb
@@ -0,0 +1,3 @@
+require 'git'
+g = Git.open(__dir__)
+puts g.diff('smth').patch
diff --git a/smth b/smth
index e69de29..7c5bd35 100644
--- a/smth
+++ b/smth
@@ -0,0 +1 @@
+we want to know changes

Как уже догадались по измененному git.rb, теперь мы увидим изменения только в smth:

$ ruby git.rb
diff --git a/smth b/smth
index e69de29..7c5bd35 100644
--- a/smth
+++ b/smth
@@ -0,0 +1 @@
+we want to know changes

В случае отсутствия изменений вы получите пустую строку "".

1 голос
/ 15 марта 2019

Возможно, вы захотите использовать алгоритм самой длинной общей подпоследовательности (LCS) McIlroy-Hunt напрямую, а не его производные / обертки.

См. https://github.com/halostatue/diff-lcs

Разница изменится, есливы сравниваете изменения a и b в противоположность изменениям b и a, но вы можете, конечно, запустить его для массива или для всего файла.

Драгоценный камень также имеет классическое форматирование инструмента diff (используется diff или git), если вы предпочитаете это вместо использования прямого вывода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...