C ++如何将结构化git日志的输出解析为对象

时间:2017-04-06 18:02:22

标签: c++ git

问题:将具有结构化提交消息的git log的输出解析为对象。

这是此特定目录的日志:

#include<iostream>
#include<cstdlib>
#include<ctime>
using namespace std;

int main()
{
    int number1,number2, answer;
    int x=0 ;
    srand(time(NULL));
    number1 = rand() % 100 + 1;
    number2 = rand() % 100 + 1;

    x=number1 + number2;



        cout << "What is the " << number1 << " plus " << number2 << " ?" << endl;

        cin >> answer;

        if (answer!=x)
            cout << "No,Please try again.";

        else
        cout << "Very good!";

    cin.clear();
    cin.ignore();
    cin.get();




    return 0;
}

将每个提交解析为具有成员变量commit 7df03ac69f27f80887cc588ab7bec7e38a42d3db Author: John Doe <johndoe@yahoo.com> 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 <johndoe@yahoo.com> 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 <johndoe@yahoo.com> Date: Thu Apr 6 19:43:18 2017 +0200 VAL_A "Hello World" VAL_B "Goodbye World" git_commit_hashVAL_AVAL_BOPTIONALVAL_1的对象。可选值可以为空,但OPTIONALVAL_2VAL_A不能。

我的方法:

  1. 将git log输出转储到临时文件中。
  2. 逐行读取文件,如果以“commit”开头,则将空格后的字符保存到新对象的VAL_B
  3. 跳过接下来的三行。
  4. 保存两个必填git_commit_hashVAL_A值。
  5. 由于值可能会溢出到下一行,只需继续按下,检查行的开头是否设置VAL_B和/或OPTIONALVAL_1,如果是,请保存。
  6. 一旦达到“commit”一词,就停止解析当前对象。创建一个新对象,然后重复1-5。
  7. 这是一种有效的蛮力方法,但没有灵活性。我想知道是否有人可以指向更优雅的解决方案或c ++或boost库。谢谢。

1 个答案:

答案 0 :(得分:2)

你可以使用你自己的git日志格式,使用这样的漂亮格式:

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

如果您以易于解析的方式放置每个元素(例如,使用您需要的数据定义xml然后使用boost::property_tree来提取数据),您可以轻松读取文件并准确知道哪些信息在哪里没有解析整个日志。

此主题中的更多信息:Git log output to XML, JSON, or YAML?