Counting changed lines of code over time

16,674

Solution 1

The hg churn extension is what you want.

You can get visual results with hg activity or hg chart.

Solution 2

Edit: hg diff and hg log both support a --stat option that can do this for you, only better and quicker.


I made an alias called lines to count changed lines (not necessarily lines of code) for me. Try putting this alias in your .hgrc file:

[alias]
lines = !echo `hg log -pr $@ | grep "^+" | wc -l` Additions; echo `hg log -pr $@ | grep "^-" | wc -l` Deletions; 

Then pass it the revision first, followed by any optional arguments:

hg lines tip or hg lines 123:456 -u brian

Sometimes you want to know the number of lines changed excluding whitespace-only changes. This requires using diff -w underneath instead of log -p. I set up a linesw alias for this:

#ignore whitespace
linesw = ![[ $1 =~ : ]] && r=$1 || r="$1~1:$1"; echo `hg diff -wr $r | grep "^+\([^+]\|$\)" | wc -l` Additions; echo `hg diff -wr $r | grep "^-\([^-]\|$\)" | wc -l` Deletions; 

hg linesw tip or hg lines 123:456

Note they behave slightly differently because diff and log behave differently -- for example, log will take a --user parameter while diff will not, and when passing a range, log will show changes commited in the first revision given in the range, while diff will not.

This has only been tested using bash.

Solution 3

I needed to do this, and spent quite a bit of time with the hg churn extension and similar solutions.

In the end, I found that what worked best for me was CLOC (Count Lines of Code): http://cloc.sourceforge.net/

You can give it two folders containing two versions of a project, and it will count all of the lines that are the same, modified, added, removed. It recognises multiple languages and itemises code, comments and blank lines.

To use it, I pulled out the two versions of my code from Hg into two parallel folders, and then used cloc --diff --ignore-whitespace

Share:
16,674
Gerald Senarclens de Grancy
Author by

Gerald Senarclens de Grancy

Updated on June 02, 2022

Comments

  • Gerald Senarclens de Grancy
    Gerald Senarclens de Grancy about 2 years

    Is there any good tool that computes the number of changed lines of code over a certain time period in a mercurial repository? Something along the lines of statsvn would be great, but anything counting the number of changed lines of code within 6 months will do (including a clever combination of arguments to hg log). Thanks.

    PS: Please do not discuss the purpose of measuring this number ;)

  • Pascal
    Pascal over 12 years
    That's a nice solution to the "problem" as you just download one Perl file. Note the syntax is: ./cloc.pl --ignore-whitespace --ignore-case --diff <dir a> <dir b>
  • cmcginty
    cmcginty over 11 years
    its not a fast as git diff --shortstat, but it does a much better job of finding duplicate code that has been copied.
  • Paul
    Paul over 6 years
    Don't use the hg log command. This also includes all changes in the linear repo hostory between the two commit IDs, including commits that were not committed in the current branch.