Ignore:
Timestamp:
Dec 27, 2007, 7:37:39 AM (14 years ago)
Author:
Peter Johansson
Message:

Blame stats is implemented - fixes #24

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/lib/BlameStats.cc

    r536 r537  
    2929#include "SVNblame.h"
    3030#include "SVNinfo.h"
     31#include "SVNlog.h"
    3132#include "utility.h"
    3233
     
    6263
    6364
     65  void BlameStats::fill_in(Author2Vector& a2v, svn_revnum_t rev)
     66  {
     67    assert(rev);
     68    for (std::set<std::string>::const_iterator iter(authors().begin());
     69         iter!=authors().end(); ++iter) {
     70      std::vector<u_int>& vec = a2v[*iter];
     71      vec.resize(revision()+1);
     72      assert(rev<static_cast<svn_revnum_t>(vec.size()));
     73      vec[rev]=vec[rev-1];
     74    }
     75  }
     76
     77
    6478  void BlameStats::do_parse(const std::string& path)
    6579  {
    6680    Parser parser(path);
    67     SVNblame svn_blame(path);
    68     while (svn_blame.valid()) {
    69       add(svn_blame.author(), svn_blame.revision(),
    70           parser.parse(svn_blame.line()));
    71       svn_blame.next_line();
     81    SVNlog log(path);
     82    typedef std::set<svn_revnum_t> RevSet;
     83    RevSet revs;
     84    std::copy(log.revision().begin(), log.revision().end(),
     85              std::inserter(revs, revs.begin()));
     86    for (RevSet::iterator rev_iter=revs.begin();rev_iter!=revs.end();++rev_iter){
     87      SVNblame svn_blame(path, *rev_iter);
     88      while (svn_blame.valid()) {
     89        add(svn_blame.author(), *rev_iter, parser.parse(svn_blame.line()));
     90        // I dont trust blame and log behave consistent (stop-on-copy).
     91        revs.insert(svn_blame.revision());
     92        svn_blame.next_line();
     93      }
     94    }
     95   
     96    // filling in pristine revisions
     97    RevSet::iterator rev_iter=revs.begin();
     98    for (svn_revnum_t rev = 1; rev<=revision(); ++rev){
     99      if (rev==*rev_iter)
     100        ++rev_iter;
     101      else {
     102        fill_in(code_,rev);
     103        fill_in(comments_,rev);
     104        fill_in(other_,rev);
     105      }
    72106    }
    73107  }
Note: See TracChangeset for help on using the changeset viewer.