Ignore:
Timestamp:
Nov 14, 2010, 6:34:10 AM (11 years ago)
Author:
Peter Johansson
Message:

rewrite svndigest-copy-cache in C++. closes #463

File:
1 copied

Legend:

Unmodified
Added
Removed
  • trunk/bin/AbstractParameter.cc

    r1291 r1293  
    2323#include <config.h> // this header file is created by configure
    2424
    25 #include "Parameter.h"
     25#include "AbstractParameter.h"
    2626
    2727#include "lib/OptionVersion.h"
     
    4848namespace svndigest {
    4949
    50   Parameter::Parameter(void)
     50  AbstractParameter::AbstractParameter(void)
    5151    : cmd_( std::string("Mandatory arguments to long options ") +
    5252            std::string("are mandatory for short options too.")),
    53       config_file_(cmd_, "config-file",
    54                    "configuration file [<ROOT>/.svndigest/config]"),
    55       generate_config_(cmd_, "g,generate-config",
    56                        "write configuration to standard output"),
    5753      help_(cmd_),
    58       ignore_cache_(cmd_, "ignore-cache",
    59                     std::string("ignore cache files and analyze ") +
    60                     std::string("everything from repository")),
    6154      root_(cmd_, "r,root",
    6255            "svn controlled directory to perform statistics on [.]"),
     
    6760
    6861
    69   void Parameter::parse(int argc, char* argv[])
    70   {
    71     init();
    72     cmd_.parse(argc, argv);
    73     set_default();
    74     // analyse arguments
    75     analyse();
    76   }
    77 
    78 
    79   Parameter::~Parameter(void)
     62  AbstractParameter::~AbstractParameter(void)
    8063  {
    8164  }
    8265
    8366
    84   void Parameter::analyse(void)
     67  void AbstractParameter::analyse(void)
    8568  {
    86     std::string save_wd = pwd();
    87 
    88     // check root but not if -g option given
    89     if (!generate_config()) {
    90       check_existence(root_.value());
    91       check_readable(root_.value());
    92       check_is_dir(root_.value());
    93 
    94       chdir(root_.value());
    95       root_full_ = pwd();
    96       chdir(save_wd);
    97 
    98       // take care of when root is a symlink (see ticket #477)
    99       struct stat stats;
    100       lstat(root_.value().c_str(), &stats);
    101       if (S_ISLNK(stats.st_mode))
    102         root_basename_ = file_name(root_.value());
    103       else
    104         root_basename_ = file_name(root_full_);
    105     }
    106 
    107     // check config file
    108     struct stat nodestat;
    109     // true also if there is a broken symlink named...
    110     bool config_exists = !lstat(config_file_.value().c_str(), &nodestat);
    111     // the latter case in order to catch broken symlink
    112     if (config_file_.present() || config_exists)
    113       // throws if file does not exists
    114       check_existence(config_file_.value());
    115     if (config_exists) {
    116       // throws if file is not readable
    117       check_readable(config_file_.value());
    118       stat(config_file_.value().c_str(), &nodestat);
    119       if (S_ISDIR(nodestat.st_mode)) {
    120         std::stringstream ss;
    121         ss << cmd_.program_name() << ": '" << config_file_.value()
    122            << "' is a directory";
    123         throw yat::utility::cmd_error(ss.str());
    124       }
    125     }
    126     analyse2();
     69    // call pure virtual function
     70    analyse1();
    12771  }
    12872
    12973
    130   void Parameter::check_existence(std::string path) const
     74  void AbstractParameter::analyse_root(const std::string root)
     75  {
     76    check_existence(root);
     77    check_readable(root);
     78    check_is_dir(root);
     79   
     80    std::string save_wd = pwd();
     81    chdir(root);
     82    root_full_ = pwd();
     83    chdir(save_wd);
     84   
     85    // take care of when root is a symlink (see ticket #477)
     86    struct stat stats;
     87    lstat(root.c_str(), &stats);
     88    if (S_ISLNK(stats.st_mode))
     89      root_basename_ = file_name(root);
     90    else
     91      root_basename_ = file_name(root_full_);
     92  }
     93
     94
     95  void AbstractParameter::check_existence(std::string path) const
    13196  {
    13297    if (node_exist(path))
     
    139104
    140105 
    141   void Parameter::check_is_dir(std::string path) const
     106  void AbstractParameter::check_is_dir(std::string path) const
    142107  {
    143108    if (node_exist(path)) {
     
    154119
    155120 
    156   void Parameter::check_readable(std::string path) const
     121  void AbstractParameter::check_readable(std::string path) const
    157122  {
    158123    if (!access_rights(path, "r"))
     
    165130 
    166131
    167   std::string Parameter::config_file(void) const
    168   {
    169     return config_file_.value();
    170   }
    171 
    172 
    173   bool Parameter::generate_config(void) const
    174   {
    175     return generate_config_.present();
    176   }
    177 
    178 
    179   bool Parameter::ignore_cache(void) const
    180   {
    181     return ignore_cache_.present();
    182   }
    183 
    184 
    185   void Parameter::init(void)
     132  void AbstractParameter::init(void)
    186133  {
    187134    // we like the options sorted alphabetically
    188135    cmd_.sort();
    189     config_file_.print_arg("=FILE");
    190136    root_.print_arg("=ROOT");
    191137    std::stringstream ss;
     
    193139       << PACKAGE << " home page: <" << PACKAGE_URL << ">.\n";
    194140    help_.post_arguments() = ss.str();
    195     init2();
     141    init1();
    196142  }
    197143
    198144
    199   std::string Parameter::root(void) const
     145  void AbstractParameter::parse(int argc, char* argv[])
     146  {
     147    init();
     148    cmd_.parse(argc, argv);
     149    set_default();
     150    // analyse arguments
     151    analyse();
     152  }
     153
     154
     155  std::string AbstractParameter::root(void) const
    200156  {
    201157    return root_full_;
     
    203159
    204160
    205   const std::string& Parameter::root_basename(void) const
     161  const std::string& AbstractParameter::root_basename(void) const
    206162  {
    207163    assert(root_basename_.size());
     
    210166
    211167
    212   void Parameter::set_default(void)
     168  void AbstractParameter::set_default(void)
    213169  {
    214170    if (!root_.present())
    215171      root_.value(".");
    216172
    217     if (!config_file_.present())
    218       config_file_.value(concatenate_path(root_.value(),".svndigest/config"));
    219 
    220     set_default2();
     173    set_default1();
    221174  }
    222175
    223176
    224   bool Parameter::verbose(void) const
     177  bool AbstractParameter::verbose(void) const
    225178  {
    226179    return verbose_.present();
Note: See TracChangeset for help on using the changeset viewer.