/[soft]/mgasvnstats/trunk/main.cpp
ViewVC logotype

Annotation of /mgasvnstats/trunk/main.cpp

Parent Directory Parent Directory | Revision Log Revision Log


Revision 6856 - (hide annotations) (download)
Tue Dec 25 14:18:23 2012 UTC (11 years, 4 months ago) by kamil
File size: 3932 byte(s)
Initial import.
1 kamil 6856 /*
2     ** Copyright 2012 Kamil Rytarowski < kamil AT mageia DOT org >
3     **
4     ** This Source Code Form is subject to the terms of the Mozilla Public
5     ** License, v. 2.0. If a copy of the MPL was not distributed with this
6     ** file, You can obtain one at http://mozilla.org/MPL/2.0/.
7     */
8    
9     #include <chrono>
10     #include <cstdlib>
11     #include <ctime>
12     #include <iomanip>
13     #include <iostream>
14     #include <locale>
15     #include <map>
16     #include <set>
17     #include <sstream>
18     #include <string>
19     #include <tuple>
20     #include <vector>
21    
22     #include <boost/date_time/posix_time/posix_time.hpp>
23    
24     #include "pugixml.hpp"
25    
26     typedef std::tuple<unsigned long /* revision */,
27     std::string /* author */,
28     boost::posix_time::ptime /* date */> tuple;
29    
30     int main(int argc, char **argv)
31     {
32     /*
33     ** Read text stream from stdin
34     */
35    
36     std::cin >> std::noskipws; /* Don't skip whitespaces */
37    
38     /*
39     ** Use iterators to slurp data from the standard input
40     */
41    
42     std::istream_iterator<char> it(std::cin);
43     std::istream_iterator<char> end;
44     const std::string input(it, end);
45    
46     pugi::xml_document doc;
47     pugi::xml_parse_result result = doc.load_buffer(input.c_str(), input.size());
48    
49     #ifndef NDEBUG
50     std::cerr << "Load result: " << result.description() << "\n";
51     #endif
52    
53     /*
54     ** <?xml version="1.0" encoding="UTF-8"?>
55     ** <log>
56     ** <logentry
57     ** revision="1234">
58     ** <author>author</author>
59     ** <date>2012-01-21T10:00:00.000000Z</date>
60     ** </logentry>
61     ** </log>
62     */
63     pugi::xml_node log = doc.child("log");
64    
65     std::vector<tuple> table;
66    
67     for (pugi::xml_node logentry: log.children())
68     {
69     unsigned long revision = std::stoul(logentry.attribute("revision").value());
70     std::string author = logentry.child("author").text().get();
71    
72     #ifndef NDEBUG
73     std::cerr << revision << "\t" << author << "\t";
74     #endif
75    
76     std::string datetime = logentry.child("date").text().get();
77     boost::posix_time::time_input_facet * facet =
78     new boost::posix_time::time_input_facet("%Y-%m-%dT%H:%M:%sZ"); /* 'Z' stands for UTC */
79    
80     std::stringstream ss;
81     ss.imbue(std::locale(std::locale(), facet));
82     ss << datetime;
83     boost::posix_time::ptime date;
84     ss >> date;
85    
86     #ifndef NDEBUG
87     std::cerr << datetime << "\t" << date << "\n";
88     #endif
89    
90     table.push_back(std::make_tuple(revision, author, date));
91     }
92    
93     /*
94     ** Statistics:
95     **
96     ** 1. Overall number of the commiters
97     ** 2. Number of commits per a commiter
98     ** 3.
99     */
100    
101     /*
102     ** 1. Overall number of the commiters
103     */
104    
105     unsigned int overall_commiters = 0;
106     {
107     std::set<std::string> tmp_set;
108     overall_commiters =
109     (unsigned int) count_if(table.begin(), table.end(), [&tmp_set](tuple & t)
110     {
111     std::string author = std::get<1>(t);
112    
113     if (tmp_set.empty())
114     {
115     tmp_set.insert(author);
116     return true;
117     }
118     else
119     {
120     if (tmp_set.find(author) == tmp_set.end())
121     {
122     tmp_set.insert(author);
123     return true;
124     }
125     else
126     return false;
127     }
128     }
129     );
130     }
131    
132     #ifndef NDEBUG
133     std::cerr << "Overall commiters: " << overall_commiters << "\n";
134     #endif
135    
136     /*
137     ** 2. Number of commits per a commiter
138     */
139    
140     std::map<std::string, unsigned int> commits_per_a_commiter;
141     {
142     for(auto t : table)
143     {
144     std::string author = std::get<1>(t);
145     if (commits_per_a_commiter.empty())
146     commits_per_a_commiter.insert(std::pair<std::string, unsigned int>(author, 1));
147     else
148     {
149     auto a = commits_per_a_commiter.find(author);
150     if (a == commits_per_a_commiter.end())
151     commits_per_a_commiter.insert(std::pair<std::string, unsigned int>(author, 1));
152     else
153     commits_per_a_commiter.at(author) = (commits_per_a_commiter.at(author) + 1);
154     }
155     }
156     }
157    
158     #ifndef NDEBUG
159     std::cerr << "Commits per a commiter:\n";
160     for(auto c : commits_per_a_commiter)
161     {
162     std::cerr << "\t" << (c.first) << "\t" << (c.second) << "\n";
163     }
164     #endif
165    
166     return EXIT_SUCCESS;
167     }

Properties

Name Value
svn:eol-style native

  ViewVC Help
Powered by ViewVC 1.1.30