source: trunk/lib/Directory.cc @ 75

Last change on this file since 75 was 75, checked in by Peter Johansson, 18 years ago

the return of the white thin duke

  • Property svn:eol-style set to native
  • Property svn:keywords set to Id
File size: 3.2 KB
Line 
1// $Id: Directory.cc 75 2006-03-09 10:53:34Z peter $
2
3#include "Directory.h"
4#include "File.h"
5#include "Node.h"
6
7#include <algorithm>
8#include <fstream>
9#include <functional>
10#include <iostream>
11#include <iterator>
12#include <list>
13
14#include <cerrno> // Needed to check error state below.
15#include <dirent.h>
16#include <sys/stat.h>
17
18namespace theplu{
19namespace svnstat{
20
21  Directory::Directory(const std::string& path, const std::string& output)
22    : Node(path,output)
23  {
24    using namespace std;
25    DIR* directory=opendir(path.c_str());    // C API from dirent.h
26    if (!directory) {
27      // Jari, throw exception
28      cerr << "ERROR: opendir() failed; terminating" << endl;
29      exit(1);
30    }
31    list<string> entries;
32    struct dirent* entry;
33    errno=0;  // Global variable used by C to track errors, from errno.h
34    while ((entry=readdir(directory)))       // C API from dirent.h
35      entries.push_back(string(entry->d_name));
36    if (errno) {
37      // Jari, throw exception
38      cerr << "ERROR: readdir() failure; terminating" << endl;
39      exit(1);
40    }
41    closedir(directory);
42
43    // Jari, change this to some STL algo?
44    for (list<string>::iterator i=entries.begin(); i!=entries.end(); i++)
45      if ((*i)!=string(".") && (*i)!=string("..") && (*i)!=string(".svn")) {
46        string fullpath(path_+'/'+(*i));
47        struct stat nodestat;                // C api from sys/stat.h
48        lstat(fullpath.c_str(),&nodestat);   // C api from sys/stat.h
49        if (S_ISDIR(nodestat.st_mode))       // C api from sys/stat.h
50          daughters_.push_back(new Directory(fullpath, output_name()+"_"));
51        else
52          daughters_.push_back(new File(fullpath,output_name()+"_"));
53      }
54  }
55
56
57  Directory::~Directory(void)
58  {
59    for (NodeIterator i=daughters_.begin(); i!=daughters_.end(); i++)
60      delete *i;
61  }
62
63
64  const Stats& Directory::parse(const bool verbose)
65  {
66    stats_.reset();
67
68    for (NodeIterator i=daughters_.begin(); i!=daughters_.end(); i++)
69      stats_ += (*i)->parse(verbose);
70    return stats_;
71  }
72
73
74  void Directory::print(const bool verbose) const
75  {
76    std::string output(output_name() + ".html");
77    if (verbose)
78      std::cout << "Printing output for " << path_ << std::endl;
79    std::ofstream os(output.c_str());
80    print_header(os);
81    os << "<p align=center>\n<img src='" << stats_.plot(output_name()+".png")
82       << "' alt='[plot]' border=0><br>\n";
83    os << "<table>\n";
84    os << "<tr><td><strong>Node</strong></td>\n";
85    os << "<td><strong>Count</strong></td></tr>\n";
86    os << "<tr><td>Total</td>\n";
87    os << "<td align=right>" << stats_.rows() << "</td></tr>\n";
88    // print html links to daughter nodes
89    transform(daughters_.begin(), daughters_.end(), 
90              std::ostream_iterator<std::string>(os," "), 
91              std::mem_fun(&Node::html_tablerow));
92    os << "</table>\n";
93    os << "</p>";
94    print_footer(os);
95    os.close(); 
96
97    // print daughter nodes, i.e, this function is recursive
98    std::for_each(daughters_.begin(), daughters_.end(),
99                  std::bind2nd(std::mem_fun(&Node::print),verbose));
100  }
101
102  void Directory::purge(const bool verbose) 
103  {
104    if (verbose)
105      std::cout << "Purging " << path_ << std::endl;
106    for (NodeIterator i=daughters_.begin(); i!=daughters_.end(); )
107      if (!((*i)->subversion_controlled())) {
108        delete *i;
109        i=daughters_.erase(i);
110      }
111      else {
112        (*i)->purge(verbose);
113        i++;
114      }
115  }
116
117}} // end of namespace svnstat and namespace theplu
Note: See TracBrowser for help on using the repository browser.