在 SVN 存储库中查找修改最多的文件扩展名

Find most modified file extensions in SVN repository

给定一个 SVN 存储库url如何找出最受感动的文件扩展名。

本质上我想比较一下 JS 代码和 C# 代码做了多少改动。

谢谢你的想法。

我想到了这个(扩展名是最后一个点之后的任何内容,忽略根本没有点的路径):

svn log $url -v | grep '^   M \|^   A \|^   D \|^   R ' | grep '\.' | awk -F . '{print $NF}' | sed 's/:.*$//' | sort | uniq -c | sort -bgr

示例输出(限制为 5 次签入):

svn log http://svn.code.sf.net/p/codeblocks/code/trunk/ -v --limit 5 | grep '^   M \|^   A \|^   D \|^   R ' | grep '\.' | awk -F . '{print $NF}' | sed 's/:.*$//' | sort | uniq -c | sort -bgr
     20 xpm
     20 bmp
     19 h
     19 cpp
     16 cbp
      7 am
      4 xml
      2 wxs
      2 rc
      2 in
      1 xrc
      1 workspace
      1 m4
      1 ac

我能够使用 node.js 脚本获取统计信息。

  1. 切换到工作副本文件夹并运行以下命令获取 svn 更改(在我的例子中是 2015 年)

    svn log -v --xml -r {2015-01-01}:{2015-12-31} > svn.log

  2. 运行 脚本

var fs = require('fs'),
  xml2js = require('xml2js'),
  _ = require('lodash'),
  path = require('path');

var parser = new xml2js.Parser();

fs.readFile(__dirname + '/svn.log', function(err, data) {
  if (err) {
    console.log('Error reading: ', err);
  }

  parser.parseString(data, function(err, result) {
    if (err) {
      console.log('Error parsing: ', err);
      return;
    }

    var paths = _.reduce(result.log.logentry, function(result, n, key) {
      var revisionPaths = _.map(n.paths[0].path, '_');
      result = result.concat(revisionPaths);
      return result;
    }, []);

    var statsByExtension = _.groupBy(paths, function(p) {
      return path.extname(p);
    });

    statsByExtension = _.map(statsByExtension, function(value, index) {
      return {
        ext: index,
        count: value.length
      };
    });

    statsByExtension = _.sortByOrder(statsByExtension, ['count'], ['desc']);

    _.forEach(statsByExtension, function(value, key) {
      console.log(value.ext, ' : ', value.count);
    });

    console.log('Done');
  });
});