bin/AbstractParameter.cc

Code
Comments
Other
Rev Date Author Line
37 13 Jan 06 peter 1 // $Id$
37 13 Jan 06 peter 2
84 13 Mar 06 jari 3 /*
978 12 Dec 09 peter 4   Copyright (C) 2006, 2007, 2008 Jari Häkkinen, Peter Johansson
1635 30 Mar 23 peter 5   Copyright (C) 2009, 2010, 2011 Peter Johansson
84 13 Mar 06 jari 6
687 04 Aug 08 peter 7   This file is part of svndigest, http://dev.thep.lu.se/svndigest
84 13 Mar 06 jari 8
149 12 Aug 06 jari 9   svndigest is free software; you can redistribute it and/or modify it
84 13 Mar 06 jari 10   under the terms of the GNU General Public License as published by
693 11 Sep 08 jari 11   the Free Software Foundation; either version 3 of the License, or
84 13 Mar 06 jari 12   (at your option) any later version.
84 13 Mar 06 jari 13
149 12 Aug 06 jari 14   svndigest is distributed in the hope that it will be useful, but
84 13 Mar 06 jari 15   WITHOUT ANY WARRANTY; without even the implied warranty of
149 12 Aug 06 jari 16   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
84 13 Mar 06 jari 17   General Public License for more details.
84 13 Mar 06 jari 18
84 13 Mar 06 jari 19   You should have received a copy of the GNU General Public License
693 11 Sep 08 jari 20   along with svndigest. If not, see <http://www.gnu.org/licenses/>.
84 13 Mar 06 jari 21 */
84 13 Mar 06 jari 22
960 07 Dec 09 peter 23 #include <config.h>  // this header file is created by configure
960 07 Dec 09 peter 24
1293 14 Nov 10 peter 25 #include "AbstractParameter.h"
234 09 Apr 07 peter 26
1119 04 Jul 10 peter 27 #include "lib/OptionVersion.h"
1119 04 Jul 10 peter 28 #include "lib/utility.h" // to avoid inclusion of yat file
795 30 Jun 09 peter 29
1673 26 Aug 23 peter 30 #include <yat/utility/ColumnStream.h>
1673 26 Aug 23 peter 31 #include <yat/utility/Exception.h>
1673 26 Aug 23 peter 32 #include <yat/utility/OptionArg.h>
1673 26 Aug 23 peter 33 #include <yat/utility/OptionHelp.h>
1673 26 Aug 23 peter 34 #include <yat/utility/OptionSwitch.h>
1675 26 Aug 23 peter 35 #include <yat/utility/utility.h>
795 30 Jun 09 peter 36
705 25 Nov 08 peter 37 #include <cassert>
705 25 Nov 08 peter 38 #include <cerrno>
540 29 Dec 07 peter 39 #include <cstddef>
727 11 Dec 08 jari 40 #include <cstring>
226 11 Mar 07 peter 41 #include <fstream>
37 13 Jan 06 peter 42 #include <iostream>
226 11 Mar 07 peter 43 #include <sstream>
49 14 Jan 06 jari 44 #include <stdexcept>
37 13 Jan 06 peter 45 #include <string>
104 27 Jun 06 peter 46 #include <sys/stat.h>
37 13 Jan 06 peter 47
37 13 Jan 06 peter 48 namespace theplu {
149 12 Aug 06 jari 49 namespace svndigest {
37 13 Jan 06 peter 50
1293 14 Nov 10 peter 51   AbstractParameter::AbstractParameter(void)
1513 23 Sep 12 peter 52     : cmd_( std::string("Mandatory arguments to long options ") +
1513 23 Sep 12 peter 53             std::string("are mandatory for short options too.")),
820 12 Sep 09 peter 54       help_(cmd_),
1513 23 Sep 12 peter 55       root_(cmd_, "r,root",
820 12 Sep 09 peter 56             "svn controlled directory to perform statistics on [.]"),
820 12 Sep 09 peter 57       verbose_(cmd_, "v,verbose", "explain what is being done"),
820 12 Sep 09 peter 58       version_(cmd_, "version", "print version information and exit", &verbose_)
37 13 Jan 06 peter 59   {
1060 02 Jun 10 peter 60   }
1060 02 Jun 10 peter 61
1241 24 Oct 10 peter 62
1293 14 Nov 10 peter 63   AbstractParameter::~AbstractParameter(void)
1060 02 Jun 10 peter 64   {
705 25 Nov 08 peter 65   }
705 25 Nov 08 peter 66
705 25 Nov 08 peter 67
1293 14 Nov 10 peter 68   void AbstractParameter::analyse(void)
705 25 Nov 08 peter 69   {
1293 14 Nov 10 peter 70     // call pure virtual function
1293 14 Nov 10 peter 71     analyse1();
705 25 Nov 08 peter 72   }
705 25 Nov 08 peter 73
705 25 Nov 08 peter 74
1293 14 Nov 10 peter 75   void AbstractParameter::analyse_root(const std::string root)
705 25 Nov 08 peter 76   {
1293 14 Nov 10 peter 77     check_existence(root);
1293 14 Nov 10 peter 78     check_readable(root);
1293 14 Nov 10 peter 79     check_is_dir(root);
1513 23 Sep 12 peter 80
705 25 Nov 08 peter 81     std::string save_wd = pwd();
1675 26 Aug 23 peter 82     yat::utility::chdir(root);
1293 14 Nov 10 peter 83     root_full_ = pwd();
1675 26 Aug 23 peter 84     yat::utility::chdir(save_wd);
1513 23 Sep 12 peter 85
1293 14 Nov 10 peter 86     // take care of when root is a symlink (see ticket #477)
1293 14 Nov 10 peter 87     struct stat stats;
1293 14 Nov 10 peter 88     lstat(root.c_str(), &stats);
1293 14 Nov 10 peter 89     if (S_ISLNK(stats.st_mode))
1675 26 Aug 23 peter 90       root_basename_ = yat::utility::basename(root);
1293 14 Nov 10 peter 91     else
1675 26 Aug 23 peter 92       root_basename_ = yat::utility::basename(root_full_);
626 23 Apr 08 peter 93   }
37 13 Jan 06 peter 94
705 25 Nov 08 peter 95
1293 14 Nov 10 peter 96   void AbstractParameter::check_existence(std::string path) const
705 25 Nov 08 peter 97   {
705 25 Nov 08 peter 98     if (node_exist(path))
705 25 Nov 08 peter 99       return;
705 25 Nov 08 peter 100     std::stringstream ss;
1513 23 Sep 12 peter 101     ss << cmd_.program_name() << ": cannot stat '" << path << "': "
1066 06 Jun 10 peter 102        << strerror(errno);
795 30 Jun 09 peter 103     throw yat::utility::cmd_error(ss.str());
37 13 Jan 06 peter 104   }
37 13 Jan 06 peter 105
1513 23 Sep 12 peter 106
1293 14 Nov 10 peter 107   void AbstractParameter::check_is_dir(std::string path) const
1220 13 Oct 10 peter 108   {
1220 13 Oct 10 peter 109     if (node_exist(path)) {
1220 13 Oct 10 peter 110       struct stat buf;
1220 13 Oct 10 peter 111       stat(path.c_str(), &buf);
1220 13 Oct 10 peter 112       if (S_ISDIR(buf.st_mode))
1220 13 Oct 10 peter 113         return;
1373 10 Jun 11 peter 114       errno = ENOTDIR;
1220 13 Oct 10 peter 115     }
1220 13 Oct 10 peter 116     std::stringstream ss;
1373 10 Jun 11 peter 117     assert(errno);
1513 23 Sep 12 peter 118     ss << cmd_.program_name() << ": '" << path << "': "
1220 13 Oct 10 peter 119        << strerror(errno);
1220 13 Oct 10 peter 120     throw yat::utility::cmd_error(ss.str());
1220 13 Oct 10 peter 121   }
1220 13 Oct 10 peter 122
1513 23 Sep 12 peter 123
1293 14 Nov 10 peter 124   void AbstractParameter::check_readable(std::string path) const
705 25 Nov 08 peter 125   {
705 25 Nov 08 peter 126     if (!access_rights(path, "r"))
705 25 Nov 08 peter 127       return;
705 25 Nov 08 peter 128     std::stringstream ss;
1513 23 Sep 12 peter 129     ss << cmd_.program_name() << ": cannot open '" << path << "': "
1066 06 Jun 10 peter 130        << strerror(errno);
795 30 Jun 09 peter 131     throw yat::utility::cmd_error(ss.str());
705 25 Nov 08 peter 132   }
37 13 Jan 06 peter 133
1513 23 Sep 12 peter 134
1293 14 Nov 10 peter 135   void AbstractParameter::init(void)
37 13 Jan 06 peter 136   {
1064 05 Jun 10 peter 137     // we like the options sorted alphabetically
1064 05 Jun 10 peter 138     cmd_.sort();
820 12 Sep 09 peter 139     root_.print_arg("=ROOT");
705 25 Nov 08 peter 140     std::stringstream ss;
829 27 Oct 09 peter 141     ss << "Report bugs to " << PACKAGE_BUGREPORT << ".\n"
829 27 Oct 09 peter 142        << PACKAGE << " home page: <" << PACKAGE_URL << ">.\n";
820 12 Sep 09 peter 143     help_.post_arguments() = ss.str();
1293 14 Nov 10 peter 144     init1();
37 13 Jan 06 peter 145   }
37 13 Jan 06 peter 146
37 13 Jan 06 peter 147
1293 14 Nov 10 peter 148   void AbstractParameter::parse(int argc, char* argv[])
73 04 Mar 06 jari 149   {
1293 14 Nov 10 peter 150     init();
1293 14 Nov 10 peter 151     cmd_.parse(argc, argv);
1293 14 Nov 10 peter 152     set_default();
1293 14 Nov 10 peter 153     // analyse arguments
1293 14 Nov 10 peter 154     analyse();
1293 14 Nov 10 peter 155   }
1293 14 Nov 10 peter 156
1293 14 Nov 10 peter 157
1293 14 Nov 10 peter 158   std::string AbstractParameter::root(void) const
1293 14 Nov 10 peter 159   {
1264 02 Nov 10 peter 160     return root_full_;
705 25 Nov 08 peter 161   }
234 09 Apr 07 peter 162
1264 02 Nov 10 peter 163
1293 14 Nov 10 peter 164   const std::string& AbstractParameter::root_basename(void) const
1264 02 Nov 10 peter 165   {
1264 02 Nov 10 peter 166     assert(root_basename_.size());
1264 02 Nov 10 peter 167     return root_basename_;
1264 02 Nov 10 peter 168   }
1264 02 Nov 10 peter 169
1264 02 Nov 10 peter 170
1293 14 Nov 10 peter 171   void AbstractParameter::set_default(void)
705 25 Nov 08 peter 172   {
1060 02 Jun 10 peter 173     if (!root_.present())
1060 02 Jun 10 peter 174       root_.value(".");
234 09 Apr 07 peter 175
1293 14 Nov 10 peter 176     set_default1();
37 13 Jan 06 peter 177   }
37 13 Jan 06 peter 178
626 23 Apr 08 peter 179
1293 14 Nov 10 peter 180   bool AbstractParameter::verbose(void) const
37 13 Jan 06 peter 181   {
820 12 Sep 09 peter 182     return verbose_.present();
37 13 Jan 06 peter 183   }
37 13 Jan 06 peter 184
705 25 Nov 08 peter 185
442 16 Aug 07 peter 186 }} // of namespace svndigest and namespace theplu