source: trunk/bin/rmdirhier.cc @ 49

Last change on this file since 49 was 49, checked in by Jari Häkkinen, 16 years ago

bin directory compiles but svnstat not finished.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Id
File size: 1.7 KB
RevLine 
[49]1// $Id: rmdirhier.cc 49 2006-01-14 00:53:56Z jari $
2
3#include "rmdirhier.h"
4
5#include <dirent.h>
6#include <fcntl.h>
7#include <iostream>
8#include <sys/stat.h>
9#include <unistd.h>
10
11
12namespace theplu {
13namespace svnstat {
14
15  void rmdirhier(const std::string& path)
16  {
17    int fd=open(".",O_RDONLY);  // remember "original" cwd
18    void rmdirhier__(const std::string&);
19
20    try {
21      rmdirhier__(path);
22    }
23    catch(const BadDirectory& x) {
24      std::cerr << "Invalid directory: " << x.what() << std::endl;
25    }
26    catch(const DirectoryOpenError& x) {
27      std::cerr << "Error opening directory: " << x.what() << std::endl;
28    }
29    catch(const FileDeleteError& x) {
30      std::cerr << "Error deleting file: " << x.what() << std::endl;
31    }
32    catch(const DirectoryDeleteError& x) {
33      std::cerr << "Error deleting directory: " << x.what() << std::endl;
34    }
35    catch(const DirectoryError& x) {
36      std::cerr << "Directory error:" << x.what() << std::endl;
37    }
38
39    fchdir(fd); // return to "original" cwd
40  }
41
42
43  void rmdirhier__(const std::string& dir)
44  {
45    if (chdir(dir.c_str()))
46      throw BadDirectory(dir);
47
48   // Delete any remaining directory entries
49    DIR *dirp;
50    struct dirent *entry;
51    if (!(dirp = opendir(".")))
52      throw DirectoryOpenError(dir);
53    while ((entry = readdir(dirp)) != NULL) {
54      struct stat finfo;
55      if (entry->d_name[0] == '.')
56        continue;
57      stat(entry->d_name,&finfo);
58      if (finfo.st_mode & S_IFDIR)
59        rmdirhier__(entry->d_name);      // sub-directory
60      else {
61        // Enable delete of file, then do it
62        chmod(entry->d_name,S_IWRITE);
63        if (unlink(entry->d_name))
64          throw FileDeleteError(entry->d_name);
65      }
66    }
67    closedir(dirp);
68
69    // Remove the directory from its parent
70    chdir("..");
71    if (rmdir(dir.c_str()))
72      throw DirectoryDeleteError(dir);
73  }
74
75}} // of namespace svnstat and namespace theplu
Note: See TracBrowser for help on using the repository browser.