2011-01-17 2 views
0

Я пытаюсь последовательно создавать текстовый файл с патчами diff. Начиная с пустого текстового файла мне нужно применить 600+ патчей, чтобы закончить итоговый документ (текст, который я написал +, отслеживал изменения с помощью меркуриала). для каждого изменения в файле необходимо добавить дополнительную информацию, поэтому я не могу просто использовать diff и патч в командной строке.исправление текстовых файлов

Я провел весь день, чтобы написать (и переписать) инструмент, который анализирует файлы diff и соответственно вносит изменения в текстовый файл, но один из файлов diff делает мою программу таким образом, что я могу " т есть смысл.

эта функция вызывается для каждого из файлов различий:

# filename = name of the diff file 
# date = extra information to be added as a prefix to each added line 
def process_diff(filename, date): 
    # that's the file all the patches will be applied to 
    merge_file = open("thesis_merged.txt", "r") 
    # map its content to a list to manipulate it in memory 
    merge_file_lines = [] 
    for line in merge_file: 
     line = line.rstrip() 
     merge_file_lines.append(line) 
    merge_file.close() 

    # open for writing: 
    merge_file = open("thesis_merged.txt", "w") 

    # that's the diff file, containing all the changes 
    diff_file = open(filename, "r") 
    print "-", filename, "-" * 20 

    # also map it to a list 
    diff_file_lines = [] 
    for line in diff_file: 
     line = line.rstrip() 

     if not line.startswith("\\ No newline at end of file"): # useless information ... or not? 
     diff_file_lines.append(line) 

    # ignore header: 
    #--- thesis_words_0.txt 2010-12-04 18:16:26.020000000 +0100 
    #+++ thesis_words_1.txt 2010-12-04 18:16:26.197000000 +0100 
    diff_file_lines = diff_file_lines[2:] 

    hunks = [] 
    for i, line in enumerate(diff_file_lines): 
     if line.startswith("@@"): 
      hunks.append(get_hunk(diff_file_lines, i)) 

    for hunk in hunks: 
     head = hunk[0] 
     # @@ -252,10 +251,9 @@ 
     tmp = head[3:-3].split(" ") # [-252,10] [+251,9] 
     line_nr_minus = tmp[0].split(",")[0] 
     line_nr_minus = int(line_nr_minus[1:]) # 252 
     line_nr_plus = tmp[1].split(",")[0] 
     line_nr_plus = int(line_nr_plus[1:]) # 251 

     for j, line in enumerate(hunk[1:]): 
      if line.startswith("-"): 
      # delete line from the file in memory 
      del merge_file_lines[line_nr_minus-1] 

     plus_counter = 0 # counts the number of added lines 
     for k, line in enumerate(hunk[1:]): 
      if line.startswith("+"): 
       # insert line, one after another 
       merge_file_lines.insert((line_nr_plus-1)+plus_counter, line[1:]) 
       plus_counter += 1 

    for line in merge_file_lines: 
     # write the updated file back to the disk 
     merge_file.write(line.rstrip() + "\n") 

    merge_file.close() 
    diff_file.close() 
    print "\n\n" 


    def get_hunk(lines, i): 
     hunk = [] 
     hunk.append(lines[i]) 
     # @@ -252,10 +251,9 @@ 

     lines = lines[i+1:] 

     for line in lines: 
      if line.startswith("@@"): 
       # next hunk begins, so stop here 
       break 
      else: 
       hunk.append(line) 

      return hunk 

в дифф файлы выглядят следующим образом - вот беда мейкера:

--- thesis_words_12.txt 2011-01-17 20:35:50.804000000 +0100 
+++ thesis_words_13.txt 2011-01-17 20:35:51.057000000 +0100 
@@ -245 +245,2 @@ 
-As 
+Per 
+definition 
@@ -248,3 +249 @@ 
-already 
-proposes, 
-"generative" 
+generative 
@@ -252,10 +251,9 @@ 
-that 
-something 
-is 
-created 
-based 
-on 
-a 
-set 
-of 
-rules. 
+"having 
+the 
+ability 
+to 
+originate, 
+produce, 
+or 
+procreate." 
+<http://www.thefreedictionary.com/generative> 

выход:

[...] 

Per 
definition 
the 
"generative" 
generative 
means 
"having 
the 
ability 
to 
originate, 
produce, 
or 
procreate." 
<http://www.thefreedictionary.com/generative> 
that 

[...] 

все предыдущие патчи воспроизводят текст так, как ожидалось. Я переписал это много раз, но это неудобное поведение сохраняется - так что сейчас я не знаю.

Я был бы очень благодарен за советы и советы о том, как это сделать по-другому. Заранее большое спасибо!

EDIT: - в конце концов, каждая строка должна выглядеть следующим образом: {date_and_time_of_text_change}word

это основно о отслеживании на то, что дата и время слово было добавлено к тексту.

+2

Нельзя использовать один патч с помощью 'diff', внести необходимые изменения и сделать то же самое со следующим патч-файлом. Какую дополнительную информацию нужно добавить? – Elalfer

+1

Если предложение Elalfer не работает по какой-либо причине, посмотрите на [python-patch] (http://code.google.com/p/python-patch/). Или даже лучше, используйте самую меркуриальную либу - она ​​написана на Python. –

+0

Почему бы не использовать 'patch (1)'? http://linux.die.net/man/1/patch –

ответ

1

был действительно ошибкой в ​​коде - я не интерпретируя файлы различий правильно (не понимал, что нужно быть сдвигом линии, когда есть несколько скряги в один дифф файл)

def process_diff(filename, date, step_nr): 
    merge_file = open("thesis_merged.txt", "r") 
    merge_file_lines = [line.rstrip() for line in merge_file] 
    merge_file.close() 

    diff_file = open(filename, "r") 
    print "-", filename, "-"*2, step_nr, "-"*2, date 

    diff_file_lines = [line.rstrip() for line in diff_file] 
    hunks = [] 
    for i, line in enumerate(diff_file_lines): 
     if line.startswith("@@"): 
      hunks.append(get_hunk(diff_file_lines, i)) 
    diff_file.close() 

    line_shift = 0 
    for hunk in hunks: 
     head = hunk[0] 
     # @@ -252,10 +251,9 @@ 
     tmp = head[3:-3].split(" ") # [-252,10] [+251,9] 

     line_nr_minus = tmp[0].split(",")[0] 
     minusses = 1 
     if len(tmp[0].split(",")) > 1: 
      minusses = int(tmp[0].split(",")[1]) 
     line_nr_minus = int(line_nr_minus[1:]) # 252 

     line_nr_plus = tmp[1].split(",")[0] 
     plusses = 1 
     if len(tmp[1].split(",")) > 1: 
      plusses = int(tmp[1].split(",")[1]) 
     line_nr_plus = int(line_nr_plus[1:]) # 251 

     line_nr_minus += line_shift 

     #@@ -248,3 +249 @@ 
     #-already 
     #-proposes, 
     #-"generative" 
     #+generative 

     if hunk[1]: # - 
      for line in hunk[1]: 
       del merge_file_lines[line_nr_minus-1] 

     plus_counter = 0 
     if hunk[2]: # + 
      for line in hunk[2]: 
       prefix = "" 
       if len(line) > 1: 
        prefix = "{" + date + "}" 
       merge_file_lines.insert((line_nr_plus-1)+plus_counter, prefix + line[1:]) 
       plus_counter += 1 

     line_shift += plusses - minusses 
0

Попробуйте использовать парсер с python-patch - по крайней мере, вы сможете вручную использовать куски вручную, чтобы узнать, какой из них не удается. API нестабилен, но парсер, поэтому вы можете просто скопировать patch.py ​​из trunk/в ваш проект. Было бы неплохо получить некоторое предложение по желаемому API.

Смежные вопросы