2017-04-06 13 views
1

問題:構造化コミットメッセージを持つgit logの出力をオブジェクトに解析します。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_1、およびOPTIONALVAL_2を持つオブジェクトに解析することです。オプションの値は空でもかまいませんが、VAL_AVAL_Bはできません。

私のアプローチ:

  1. は一時ファイルにgitのログ出力をダンプします。
  2. 「コミット」という単語で始まり、空白の後の文字を新しいオブジェクトのgit_commit_hashに保存すると、行ごとにファイルを読み込みます。
  3. 次の3行をスキップします。
  4. 2つの必須の値VAL_AVAL_Bの値を保存します。
  5. 値が次の行にオーバーフローしている可能性がありますので、そのまま続行してください。行の先頭にOPTIONALVAL_1が設定されているか、OPTIONALVAL_2のいずれかがあるかどうかを確認してください。
  6. "コミット"という単語に達した時点で、現在のオブジェクトの解析を停止します。新しいオブジェクトを作成し、1-5を繰り返します。

これは多少は機能しますが、柔軟性はありません。誰かが私をより洗練された解決策またはC++またはブーストライブラリに向けることができるかどうか疑問に思っていました。ありがとう。

+1

どのように何の何かを飛ばし、すべての情報を保持していない構造体やクラスの作成について。それから、必要な情報を構造体から取り出すだけで簡単です。 1回のパスでファイルを配列、ベクトル、リストに読み込み、構造体が何であれ、すべてがディスクベースではなくメモリベースです。 – PaulMcKenzie

答えて

2

あなたはこのようなかなりの形式を使用してgitのログを独自のフォーマットを使用することができます。そして、あなたは(道を解析することは容易では各要素を入れた場合例えば、あなたが必要とするデータとXMLを定義

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

とデータを抽出するにはboost::property_treeを使用します)、ファイルを簡単に読み取ることができ、ログ全体を解析せずにどの情報がどこにあるかを正確に知ることができます。このスレッドで

さらに詳しい情報:Git log output to XML, JSON, or YAML?

関連する問題