2017-04-06 65 views
1

問題:將具有結構化提交消息的git日誌的輸出解析爲對象。C++如何將結構化git日誌的輸出解析到對象中

這是日誌看起來是這樣的特定目錄:

commit 7df03ac69f27f80887cc588ab7bec7e38a42d3db 
Author: John Doe <[email protected]> 
Date: Thu Apr 6 19:43:18 2017 +0200 

    VAL_A "Something" 
    VAL_B "Goodbye" 
    OPTIONALVAL_1 "Hello World \n" 

commit 9d9c69f2798778yyuyuu6786767tc7e38a42d3db 
Author: John Doe <[email protected]> 
Date: Thu Apr 6 19:43:18 2017 +0200 

    VAL_A "Hello World" 
    VAL_B "Goodbye World" 
    OPTIONALVAL_2 "Hello again World \n" 

commit 666669f2798778yyuyuu6786767tc7e38a42d3db 
Author: John Doe <[email protected]> 
Date: Thu Apr 6 19:43:18 2017 +0200 

    VAL_A "Hello World" 
    VAL_B "Goodbye World" 

如果每次提交被解析成擁有成員變量git_commit_hashVAL_AVAL_BOPTIONALVAL_1OPTIONALVAL_2的對象。可選值可以爲空,但VAL_AVAL_B不能。

我的方法:

  1. 轉儲git的日誌輸出到一個臨時文件。
  2. 逐行讀取文件,如果以單詞「commit」開頭,則將空格後的字符保存到新對象的git_commit_hash中。
  3. 跳過接下來的三行。
  4. 保存兩個強制性值VAL_AVAL_B的值。
  5. 由於這些值可能會溢出到下一行,因此請繼續下去,檢查是否設置了OPTIONALVAL_1或在行的開頭設置了OPTIONALVAL_2,如果是,請保存。
  6. 一旦達到單詞「commit」,停止解析當前對象。創建一個新對象,然後重複1-5。

這是一種蠻力的方法,雖然工作有些,但沒有靈活性。我想知道是否有人可以將我指向更優雅的解決方案或C++或boost庫。謝謝。

+1

如何創建一個包含所有的信息,沒有任何跳過一個結構或類。然後就像從你需要的結構中提取出結構一樣簡單。一次將文件讀入數組,向量,列表,無論結構如何,然後一切都是基於內存的,而不是基於磁盤的。 – PaulMcKenzie

回答

2

您可以用漂亮的格式,這樣使用自己的git的日誌格式:

git log --pretty=format:"<your formatting>" 

如果你把每一個元素在一個簡單的解析方式(如定義與數據的XML,你需要再使用boost::property_tree來提取數據),您可以輕鬆讀取文件,並準確知道哪些信息是在哪裏解析整個日誌。

在這個線程更多信息:Git log output to XML, JSON, or YAML?