Adrien Gagnon
Adrien Gagnon

Reputation: 11

How to output entire git log --stat to xml

I'm trying to turn this standard git log --stat output:

commit 8a3f15205922e524d59524fe89c4304849dd6c8c
Author: FooManChu <[email protected]>
Date:   Fri Jul 15 20:33:17 2016 -0400

    Some Commit Message Body

 foodir/foofile1.foo |    8 +
 foodir/foofile2.foo |   47 +
 foodir/foofile3.foo | 7049 +++++++++++++++++++++++
 foodir/foofile4.foo | 3563 ++++++++++++
 foodir/foofile5.foo |   24 +
 foodir/foofile6.foo |    0
 foodir/foofile7.foo |   41 +
 7 files changed, 10732 insertions(+)

commit c8bd4ca8d683c20f3cf206fdeb8dbec2f185536e
Author: FooGirlChu <[email protected]>
Date:   Fri Jul 15 00:11:24 2016 -0400

    Initial commit

 FOO       | 674 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 README.md |   1 +
 2 files changed, 675 insertions(+)

Into the xml file structure seen below. It doesn't have to be mapped directly like below, but still close enough to be customized if needed.

<?xml version="1.0" encoding="utf-8"?>
<stats>
    <commit sha1='8a3f15205922e524d59524fe89c4304849dd6c8c'>
        <author email='[email protected]'>FooManChu</author>
        <date>Fri Jul 15 20:33:17 2016 -0400</date>
        <body>Some Commit Message Body</body>
        <diff-stat>
            <filepathname insertions='8'>foodir/foofile1.foo</filepathname>
            <filepathname insertions='47'>foodir/foofile2.foo</filepathname>
            <filepathname insertions='7049'>foodir/foofile3.foo</filepathname>
            <filepathname insertions='3563'>foodir/foofile4.foo</filepathname>
            <filepathname insertions='24'>foodir/foofile5.foo</filepathname>
            <filepathname insertions='0'>foodir/foofile6.foo</filepathname>
            <filepathname insertions='41'>foodir/foofile7.foo</filepathname>
        </diff-stat>
        <summary changed='7' insertions='10732'/>
    </commit>
    <commit sha1='c8bd4ca8d683c20f3cf206fdeb8dbec2f185536e'>
        <author email='[email protected]'>FooGirlChu</author>
        <date>Fri Jul 15 00:11:24 2016 -0400</date>
        <body>Initial commit</body>
        <diff-stat>
            <filepathname insertions='674'>FOO</filepathname>
            <filepathname insertions='1'>README.md</filepathname>
        </diff-stat>
        <summary changed='2' insertions='675'/>
    </commit>
</stats>

I've looked at Parsing Git Log Output and Understand Git Log Stat Output, but I've been unable to duplicate the --stat format.

My question is therefore can this be done in git? or should I be trying to code a parsing program instead that takes --stat as input and outputs my xml file?

Upvotes: 1

Views: 877

Answers (1)

Happy
Happy

Reputation: 835

Here is the original answer: Parse git log file names to json

Parse XML file should be similar to parse JSON file.

This is an example to export git log -stat as json.

We define a function to load the files changed in one git commit

function getcommit { \
git show --pretty="format:"  --name-only $1 | \
perl -pe's/^\n//g;' | \
sed 's/\(.*\)/"\1"/g' | \
perl -0pe 's/\n(?!\Z)/,\n/g'; \
}

export -f getcommit

Then use git log -1 to show the latest one commit info:

    git log -1 --pretty=format:'{%n  "commit": "%H",%n  "author": "%an ",%n  "date": "%ad",%n  "message": "%f",%n  "files": [ COMMIT_HASH_%H  ]%n},' | \
    perl -pe 'BEGIN{print "["}; END{print "]\n"}' | \
    perl -pe 's/},]/}]/;s/COMMIT_HASH_(\w+)/`echo -n "";getcommit $1`/e'

Sample result

    [{
    "commit": "1edcef90b42afee11fbd31dcc458ae0f15a3bb6e",
    "author": "Bertrand Martel ",
    "date": "Tue Oct 13 17:35:34 2015 +0200",
    "message": "update-readme",
    "files": [ "README.md",
        "device.png",
        "screenshot.png"
        ]
    }]

Upvotes: 1

Related Questions