Ignore:
Timestamp:
Nov 16, 2009, 11:27:19 PM (14 years ago)
Author:
Jari Häkkinen
Message:

Merged trunk changes -r782:844 to replacing_gnuplot branch.

Location:
branches/replacing_gnuplot
Files:
12 deleted
46 edited
2 copied

Legend:

Unmodified
Added
Removed
  • branches/replacing_gnuplot/ChangeLog

    r784 r845  
    11$Id$
    22
     3The change history is available online. To see the change log, direct
     4your favorite web browser to:
     5
     6  http://dev.thep.lu.se/svndigest/log or
     7
     8  http://dev.thep.lu.se/svndigest/log?format=changelog
     9
     10for a more traditional ChangeLog look.
     11
     12For the log at a specific release, direct your browser to
     13
     14  http://dev.thep.lu.se/svndigest/log/tags/<VERSION>?mode=follow_copy or
     15
     16  http://dev.thep.lu.se/svndigest/log/tags/<VERSION>?mode=follow_copy&format=changelog
     17
     18for a more traditional ChangeLog look.
     19
     20The log is also available as RSS Feed suitable for subscription:
     21
     22  http://dev.thep.lu.se/svndigest/log?format=rss
     23 
     24
     25----------------------------------------------------------------------
    326{{{
    427Copyright (C) 2005, 2006 Jari Häkkinen
     
    2245}}}
    2346----------------------------------------------------------------------
    24 
    25 Changes are tracked with subversion log messages, tracs presentation
    26 of the logs, and the tickets assigned to the different versions.
    27 
    28 version 0.7:
    29   - http://dev.thep.lu.se/svndigest/log/trunk?rev=HEAD&stop_rev=418
    30   - http://dev.thep.lu.se/svndigest/query?milestone=0.7&order=id
    31 
    32 version 0.6.7:
    33   - http://dev.thep.lu.se/svndigest/log/branches/0.6-stable?rev=765&stop_rev=687
    34   - http://dev.thep.lu.se/svndigest/query?milestone=svndigest+0.6.7&order=id
    35 
    36 version 0.6.6:
    37   - http://dev.thep.lu.se/svndigest/log/branches/0.6-stable?rev=685&stop_rev=577
    38   - http://dev.thep.lu.se/svndigest/query?milestone=svndigest+0.6.6&order=id
    39 
    40 version 0.6.5:
    41   - http://dev.thep.lu.se/svndigest/log/branches/0.6-stable?rev=575&stop_rev=491
    42   - http://dev.thep.lu.se/svndigest/query?milestone=svndigest+0.6.5&order=id
    43 
    44 version 0.6.4:
    45   - http://dev.thep.lu.se/svndigest/log/branches/0.6-stable?rev=489&stop_rev=474
    46   - http://dev.thep.lu.se/svndigest/query?milestone=0.6.4&order=id
    47 
    48 version 0.6.3:
    49   - http://dev.thep.lu.se/svndigest/log/branches/0.6-stable?rev=472&stop_rev=460
    50   - http://dev.thep.lu.se/svndigest/query?milestone=0.6.3&order=id
    51 
    52 version 0.6.2:
    53   - http://dev.thep.lu.se/svndigest/log/branches/0.6-stable?rev=459&stop_rev=438
    54   - http://dev.thep.lu.se/svndigest/query?milestone=0.6.2&order=id
    55 
    56 version 0.6.1:
    57   - http://dev.thep.lu.se/svndigest/log/branches/0.6-stable?rev=437&stop_rev=417
    58   - http://dev.thep.lu.se/svndigest/query?milestone=0.6.1&order=id
    59 
    60 version 0.6:
    61   - http://dev.thep.lu.se/svndigest/log/trunk?rev=413&stop_rev=195
    62   - http://dev.thep.lu.se/svndigest/query?milestone=0.6&order=id
    63 
    64 version 0.5:
    65   - http://dev.thep.lu.se/svndigest/log/trunk?rev=194&stop_rev=151
    66   - http://dev.thep.lu.se/svndigest/query?milestone=0.5&order=id
    67 
    68 version 0.4:
    69   - http://dev.thep.lu.se/svndigest/log/trunk?rev=150&stop_rev=148
    70 
    71 version 0.3:
    72   - http://dev.thep.lu.se/svndigest/log/trunk?rev=147&stop_rev=83
    73   - http://dev.thep.lu.se/svndigest/query?milestone=0.3&order=id
    74 
    75 version 0.1 and 0.2:
    76   - http://dev.thep.lu.se/svndigest/log/trunk?rev=82&stop_rev=1
    77   - http://dev.thep.lu.se/svndigest/query?milestone=0.2&order=id
    78   - http://dev.thep.lu.se/svndigest/query?milestone=0.1&order=id
  • branches/replacing_gnuplot/Makefile.am

    r784 r845  
    2222
    2323# -I arg should be the same as arg in AC_CONFIG_MACRO_DIR in configure.ac
    24 ACLOCAL_AMFLAGS = -I m4 --install
     24ACLOCAL_AMFLAGS = -I m4
    2525
    2626SUBDIRS = lib bin man test
     
    3333if ENABLE_SVN_SUPPORT
    3434include build_support/svn_support.am
     35else
     36release:
     37  @echo "ERROR: target 'release' not activated."
     38  @echo "       You need to run configure with '--enable-svn-support'."
     39  @exit 1
    3540endif
    3641
  • branches/replacing_gnuplot/NEWS

    r784 r845  
    1111  A complete list of closed tickets can be found here [[br]]
    1212  http://dev.thep.lu.se/svndigest/query?status=closed&milestone=0.7
     13
     14version 0.6.8 (released 12 November 2009)
     15  - configure now handles --disable correctly (issue #383)
     16
     17  A complete list of closed tickets can be found here [[br]]
     18  http://dev.thep.lu.se/svndigest/query?status=closed&milestone=svndigest+0.6.8
    1319
    1420version 0.6.7 (released 1 February 2009)
  • branches/replacing_gnuplot/README

    r786 r845  
    22
    33= About svndigest =
    4 
    5 This directory contains the 0.7 release of svndigest.
    64
    75svndigest is a tool to extract development information and statistics
     
    1614
    1715Directory `bin` contains main program and is location for svndigest
    18 binary. Directory `build_support` contains additional autotool macros
     16binary. Directory `m4` contains additional autotool macros
    1917required for creating the build environment. Directory `doc` contains
    2018documentation mainly in file `readme.txt`. Most of the code can be
     
    118116{{{
    119117Copyright (C) 2005, 2006 Jari Häkkinen
    120 Copyright (C) 2007, 2008 Jari Häkkinen, Peter Johansson
     118Copyright (C) 2007, 2008, 2009 Jari Häkkinen, Peter Johansson
    121119
    122120This file is part of svndigest, http://dev.thep.lu.se/svndigest
  • branches/replacing_gnuplot/README.developer

    r784 r845  
    9696
    9797
     98=== yat library ===
     99
     100Directory `lib/yat/` contains some files from the yat library. These
     101files are not owned by svndigest and should not (if possible) be
     102edited here. For more details please see `lib/yat/README`.
     103
    98104=== Output file structure ===
    99105
     
    109115StatsType. Images for different Authors are identical and therefore
    110116shared between authors.
    111 
    112 
    113 === Create a distribution ===
    114 
    115 Create a distribution package with `make dist`. Remember to test
    116 the package with `make distcheck`. If required packages are installed
    117 in non-standard locations you need to pass this information to
    118 `distcheck`. This is done by using the variable
    119 DISTCHECK_CONFIGURE_FLAGS as
    120 
    121    `DISTCHECK_CONFIGURE_FLAGS="[OPTION]..." make distcheck`
    122 
    123 Usually you need to set DISTCHECK_CONFIGURE_FLAGS to whatever options
    124 you pass to configure.
    125117
    126118
  • branches/replacing_gnuplot/THANKS

    r784 r845  
    88implementation is available through http://ndevilla.free.fr/ .
    99
    10 svndigest build system uses an M4 macro (build_support/find_apr.m4)
    11 created within the Apache project (The Apache Software Foundation). No
    12 changes is made to the M4 script. The Apache license text is available
    13 as build_support/apache_LICENSE-2.0.txt.
     10svndigest build system uses an M4 macro (m4/find_apr.m4) created
     11within the Apache project (The Apache Software Foundation). No changes
     12is made to the M4 script. The Apache license text is available as
     13m4/apache_LICENSE-2.0.txt.
    1414
    1515The cascading style sheet generated by svndigest was initially
  • branches/replacing_gnuplot/bin/Makefile.am

    r784 r845  
    2929noinst_HEADERS = Parameter.h
    3030
    31 LDADD = $(top_builddir)/lib/libsvndigest.a $(SVNDIGEST_LIBS)
     31LDADD = $(top_builddir)/lib/libsvndigest.a \
     32  $(top_builddir)/lib/yat/libyat.a $(SVNDIGEST_LIBS)
    3233AM_LDFLAGS = $(SVNDIGEST_LDFLAGS)
    3334
  • branches/replacing_gnuplot/bin/Parameter.cc

    r784 r845  
    2222#include "Parameter.h"
    2323
    24 #include "ColumnStream.h"
    25 #include "OptionArg.h"
    26 #include "OptionHelp.h"
    27 #include "OptionSwitch.h"
    2824#include "OptionVersion.h"
    29 #include "utility.h"
     25#include "../lib/utility.h" // to avoid inclusion of yat file
     26
     27#include "yat/ColumnStream.h"
     28#include "yat/Exception.h"
     29#include "yat/OptionArg.h"
     30#include "yat/OptionHelp.h"
     31#include "yat/OptionSwitch.h"
     32
    3033#include <config.h> // this header file is created by configure
    3134
     
    4144#include <sys/stat.h>
    4245
     46// FIXME: remove this when we require autoconf 2.64
     47// autoconf 2.64 defines PACKAGE_URL in config.h (from AC_INIT)
     48#ifndef PACKAGE_URL
     49#define PACKAGE_URL "http://dev.thep.lu.se/svndigest"
     50#endif
     51
    4352namespace theplu {
    4453namespace svndigest {
    4554
    4655  Parameter::Parameter( int argc, char *argv[])
    47     : cmd_(
    48      "Mandatory arguments to long options are mandatory for short options too.")
     56    : cmd_( std::string("Mandatory arguments to long options ") +
     57            std::string("are mandatory for short options too.")),
     58      config_file_(cmd_, "config-file",
     59                   "configuration file [<ROOT>/.svndigest/config]"),
     60      copyright_(cmd_, "copyright", "update copyright statement"),
     61      force_(cmd_, "f,force",
     62             std::string("if sub-directory named <ROOT> exists in target dire")+
     63             std::string("ctory, remove sub-directory before writing results")),
     64      generate_config_(cmd_, "g,generate-config",
     65                       "write configuration to standard output"),
     66      help_(cmd_),
     67      ignore_cache_(cmd_, "ignore-cache",
     68                    std::string("ignore cache files and analyze ") +
     69                    std::string("everything from repository")),
     70      report_(cmd_, "report", "create no HTML report", true),
     71      revisions_(cmd_, "revisions",
     72                 "use revision number as time scale instead of dates [dates]"),
     73      root_(cmd_, "r,root",
     74            "svn controlled directory to perform statistics on [.]"),
     75      target_(cmd_, "t,target", "output directory [.]"),
     76      verbose_(cmd_, "v,verbose", "explain what is being done"),
     77      version_(cmd_, "version", "print version information and exit", &verbose_)
    4978  {
    5079    init();
     
    5281      cmd_.parse(argc, argv);
    5382    }
    54     catch (cmd_error& e) {
     83    catch (yat::utility::cmd_error& e) {
    5584      std::cerr << e.what() << std::endl;
    5685      exit (-1);
     
    5887
    5988    // set default values
    60     if (!root_->present())
    61       root_->value(".");
    62 
    63     if (!target_->present())
    64       target_->value(".");
    65 
    66     if (!config_file_->present())
    67       config_file_->value(concatenate_path(root_->value(),".svndigest/config"));
     89    if (!root_.present())
     90      root_.value(".");
     91
     92    if (!target_.present())
     93      target_.value(".");
     94
     95    if (!config_file_.present())
     96      config_file_.value(concatenate_path(root_.value(),".svndigest/config"));
    6897
    6998    // analyse arguments
     
    74103  Parameter::~Parameter(void)
    75104  {
    76     delete config_file_;
    77     delete copyright_;
    78     delete force_;
    79     delete generate_config_;
    80     delete help_;
    81     delete ignore_cache_;
    82     delete report_;
    83     delete revisions_;
    84     delete root_;
    85     delete target_;
    86     delete verbose_;
    87     delete version_;
    88105  }
    89106
     
    95112    // check root but not if -g option given
    96113    if (!generate_config()) {
    97       check_existence(root_->value());
    98       check_readable(root_->value());
    99       if (chdir(root_->value().c_str())) {
     114      check_existence(root_.value());
     115      check_readable(root_.value());
     116      if (chdir(root_.value().c_str())) {
    100117        std::stringstream ss;
    101         ss << "svndigest: cannot read `" << root_->value() << "': "
     118        ss << "svndigest: cannot read `" << root_.value() << "': "
    102119           << strerror(errno);
    103         throw cmd_error(ss.str());
     120        throw yat::utility::cmd_error(ss.str());
    104121      }
    105       root_->value(pwd());
     122      root_.value(pwd());
    106123      chdir(save_wd.c_str());
    107124
    108125      // check target (only if we write report)
    109126      if (report()) {
    110         check_existence(target_->value());
    111         check_readable(target_->value());
    112         std::string base_root = file_name(root_->value());
    113         std::string path = concatenate_path(target_->value(),base_root);
    114         if (access_rights(target_->value().c_str(), "w")) {
     127        check_existence(target_.value());
     128        check_readable(target_.value());
     129        std::string base_root = file_name(root_.value());
     130        std::string path = concatenate_path(target_.value(),base_root);
     131        if (access_rights(target_.value().c_str(), "w")) {
    115132          std::stringstream ss;
    116133          ss << "svndigest: cannot create directory `" << path
    117134             << "': " << strerror(errno);
    118           throw cmd_error(ss.str());
     135          throw yat::utility::cmd_error(ss.str());
    119136        }
    120137        if (node_exist(path) && !force()) {
     
    122139          ss << "svndigest: cannot create directory `" << path << "' "
    123140             << strerror(EEXIST);
    124           throw cmd_error(ss.str());
     141          throw yat::utility::cmd_error(ss.str());
    125142        }
    126         if (chdir(target_->value().c_str())) {
     143        if (chdir(target_.value().c_str())) {
    127144          std::stringstream ss;
    128           ss << "svndigest: cannot read `" << target_->value() << "': "
     145          ss << "svndigest: cannot read `" << target_.value() << "': "
    129146             << strerror(errno);
    130           throw cmd_error(ss.str());
     147          throw yat::utility::cmd_error(ss.str());
    131148        }
    132         target_->value(pwd());
     149        target_.value(pwd());
    133150        chdir(save_wd.c_str());
    134151      }
     
    138155    struct stat nodestat;
    139156    // true also if there is a broken symlink named...
    140     bool config_exists = !lstat(config_file_->value().c_str(), &nodestat);
     157    bool config_exists = !lstat(config_file_.value().c_str(), &nodestat);
    141158    // the latter case in order to catch broken symlink
    142     if (config_file_->present() || config_exists)
     159    if (config_file_.present() || config_exists)
    143160      // throws if file does not exists
    144       check_existence(config_file_->value());
     161      check_existence(config_file_.value());
    145162    if (config_exists) {
    146163      // throws if file is not readable
    147       check_readable(config_file_->value());
    148       stat(config_file_->value().c_str(), &nodestat);
     164      check_readable(config_file_.value());
     165      stat(config_file_.value().c_str(), &nodestat);
    149166      if (!S_ISREG(nodestat.st_mode)) {
    150167        std::stringstream ss;
    151         ss << "svndigest: `" << config_file_->value()
     168        ss << "svndigest: `" << config_file_.value()
    152169           << "' is not a regular file";
    153         throw cmd_error(ss.str());
     170        throw yat::utility::cmd_error(ss.str());
    154171      }
    155172    }
     
    163180    std::stringstream ss;
    164181    ss << "svndigest: cannot stat `" << path << "': " << strerror(errno);
    165     throw cmd_error(ss.str());
     182    throw yat::utility::cmd_error(ss.str());
    166183  }
    167184
     
    173190    std::stringstream ss;
    174191    ss << "svndigest: cannot open `" << path << "': " << strerror(errno);
    175     throw cmd_error(ss.str());
     192    throw yat::utility::cmd_error(ss.str());
    176193  }
    177194 
     
    179196  std::string Parameter::config_file(void) const
    180197  {
    181     return config_file_->value();
     198    return config_file_.value();
    182199  }
    183200
     
    185202  bool Parameter::copyright(void) const
    186203  {
    187     return copyright_->present();
     204    return copyright_.present();
    188205  }
    189206
     
    191208  bool Parameter::force(void) const
    192209  {
    193     return force_->present();
     210    return force_.present();
    194211  }
    195212
     
    197214  bool Parameter::generate_config(void) const
    198215  {
    199     return generate_config_->present();
     216    return generate_config_.present();
    200217  }
    201218
     
    203220  bool Parameter::ignore_cache(void) const
    204221  {
    205     return ignore_cache_->present();
     222    return ignore_cache_.present();
    206223  }
    207224
     
    211228    // don't use argv[0] because user may rename the binary
    212229    cmd_.program_name() = PACKAGE_NAME;
    213     config_file_=new OptionArg<std::string>(cmd_, "config-file",
    214                                 "configuration file [<ROOT>/.svndigest/config]");
    215     config_file_->print_arg("=FILE");
     230    config_file_.print_arg("=FILE");
     231    root_.print_arg("=ROOT");
     232    target_.print_arg("=TARGET");
    216233    std::stringstream ss;
    217     copyright_ = new OptionSwitch(cmd_, "copyright",
    218                                   "update copyright statement");
    219 
    220     ss << "if sub-directory named <ROOT> exists in target directory, remove "
    221        << "sub-directory before writing results";
    222     force_ = new OptionSwitch(cmd_, "f,force", ss.str());
    223     ss.str("");
    224 
    225     help_ = new OptionHelp(cmd_);
    226     generate_config_ =
    227       new OptionSwitch(cmd_, "g,generate-config",
    228                        "write configuration file to standard output");
    229 
    230     ss.str("");
    231     ss << "ignore cache files and analyze everything from repository";
    232     ignore_cache_ = new OptionSwitch(cmd_, "ignore-cache", ss.str());
    233          
    234     report_ = new OptionSwitch(cmd_, "report", "create no HTML report", true);
    235 
    236     ss.str("");
    237     ss << "use revision numbers as time scale instead of dates [dates]";
    238     revisions_ = new OptionSwitch(cmd_, "revisions", ss.str());
    239 
    240     root_=
    241       new OptionArg<std::string>(cmd_, "r,root",
    242                      "svn controlled directory to perform statistics on [.]");
    243     root_->print_arg("=ROOT");
    244     target_ = new OptionArg<std::string>(cmd_, "t,target",
    245                                          "output directory [.]");
    246     target_->print_arg("=TARGET");
    247    
    248     verbose_ = new OptionSwitch(cmd_, "v,verbose", "explain what is being done");
    249     version_ = new OptionVersion(cmd_, "version",
    250                                  "print version information and exit", verbose_);
    251 
    252     ss.str("");
    253     ss << "Report bugs to " << PACKAGE_BUGREPORT << ".\n";
    254     help_->post_arguments() = ss.str();
    255     help_->synopsis() =
     234    ss << "Report bugs to " << PACKAGE_BUGREPORT << ".\n"
     235       << PACKAGE << " home page: <" << PACKAGE_URL << ">.\n";
     236    help_.post_arguments() = ss.str();
     237    help_.synopsis() =
    256238      "Generate statistical report for a subversion repository\n";
    257239  }
     
    260242  bool Parameter::report(void) const
    261243  {
    262     return report_->value();
     244    return report_.value();
    263245  }
    264246
     
    266248  bool Parameter::revisions(void) const
    267249  {
    268     return revisions_->present();
     250    return revisions_.present();
    269251  }
    270252
     
    272254  std::string Parameter::root(void) const
    273255  {
    274     return root_->value();
     256    return root_.value();
    275257  }
    276258
     
    278260  std::string Parameter::targetdir(void) const
    279261  {
    280     return target_->value();
     262    return target_.value();
    281263  }
    282264
     
    284266  bool Parameter::verbose(void) const
    285267  {
    286     return verbose_->present();
     268    return verbose_.present();
    287269  }
    288270
  • branches/replacing_gnuplot/bin/Parameter.h

    r784 r845  
    2424*/
    2525
    26 #include "CommandLine.h"
    27 #include "OptionArg.h"
     26#include "OptionVersion.h"
     27
     28#include "yat/CommandLine.h"
     29#include "yat/OptionArg.h"
     30#include "yat/OptionHelp.h"
     31#include "yat/OptionSwitch.h"
     32
    2833
    2934#include <string>
    3035
    3136namespace theplu {
     37namespace yat {
     38namespace utility {
     39  class OptionHelp;
     40  class OptionSwitch;
     41}}
    3242namespace svndigest {
    3343
    34   class OptionHelp;
    35   class OptionSwitch;
    3644  class OptionVersion;
    3745
     
    6674    void init(void);
    6775
    68     CommandLine cmd_;
    69     OptionArg<std::string>* config_file_;
    70     OptionSwitch* copyright_;
    71     OptionSwitch* force_;
    72     OptionSwitch* generate_config_;
    73     OptionHelp* help_;
    74     OptionSwitch* ignore_cache_;
    75     OptionSwitch* report_;
    76     OptionSwitch* revisions_;
    77     OptionArg<std::string>* root_;
    78     OptionArg<std::string>* target_;
    79     OptionSwitch* verbose_;
    80     OptionVersion* version_;
     76    yat::utility::CommandLine cmd_;
     77    yat::utility::OptionArg<std::string> config_file_;
     78    yat::utility::OptionSwitch copyright_;
     79    yat::utility::OptionSwitch force_;
     80    yat::utility::OptionSwitch generate_config_;
     81    yat::utility::OptionHelp help_;
     82    yat::utility::OptionSwitch ignore_cache_;
     83    yat::utility::OptionSwitch report_;
     84    yat::utility::OptionSwitch revisions_;
     85    yat::utility::OptionArg<std::string> root_;
     86    yat::utility::OptionArg<std::string> target_;
     87    yat::utility::OptionSwitch verbose_;
     88    OptionVersion version_;
    8189
    8290  };
  • branches/replacing_gnuplot/bin/svndigest.cc

    r784 r845  
    2626#include "css.h"
    2727#include "Directory.h"
    28 #include "Exception.h"
    2928#include "first_page.h"
    3029#include "GnuplotFE.h"
     
    3635#include "SVNinfo.h"
    3736#include "SVNlog.h"
    38 #include "utility.h"
     37#include "../lib/utility.h"
     38
     39#include "yat/Exception.h"
    3940
    4041#include <cassert>
     
    5152int main( int argc, char* argv[])
    5253{
    53   using namespace theplu::svndigest;
     54  using namespace theplu;
     55  using namespace svndigest;
    5456
    5557  // Reading commandline options
     
    6062      std::cout << "Done parsing parameters" << std::endl;
    6163  }
    62   catch (cmd_error& e) {
     64  catch (yat::utility::cmd_error& e) {
    6365    std::cerr << e.what() << std::endl;
    6466    exit(-1);
     
    158160        std::cout << "Removing old target tree: " << target_path << "\n";
    159161      rmdirhier(target_path);
    160     }
     162      // exit if remove failed
     163      if (node_exist(target_path)) {
     164        std::cerr << "svndigest: remove failed\n";
     165        exit(-1);
     166      }
     167    }
     168
    161169
    162170    if (option->verbose())
  • branches/replacing_gnuplot/build_support/move-if-change

    r646 r845  
    33# Status is zero if successful, nonzero otherwise.
    44
    5 usage="$0: usage: $0 SOURCE DEST"
     5usage="$0: usage: $0 [-v] SOURCE DEST"
     6
     7if test "x$1" = "x-v"; then
     8  verbose=yes
     9  shift
     10fi
    611
    712case $# in
     
    1924  rm -f "$1"
    2025else
     26  if test "x$verbose" = "xyes"; then
     27    echo "updating file $2"
     28  fi
    2129  mv -f "$1" "$2"
    2230fi
  • branches/replacing_gnuplot/configure.ac

    r786 r845  
    3232
    3333m4_include([m4/version.m4])
    34 AC_INIT([svndigest],[SVNDIGEST_VERSION],[jari@thep.lu.se])
     34AC_INIT([svndigest],[SVNDIGEST_VERSION],[jari@thep.lu.se],,
     35        [http://dev.thep.lu.se/svndigest])
    3536AC_CONFIG_SRCDIR([lib/File.h])
    3637AC_CONFIG_AUX_DIR([autotools])
     
    99100
    100101AC_ARG_ENABLE([debug],
    101   [AS_HELP_STRING([--enable-debug],[turn on debug options and code])],
     102  [AS_HELP_STRING([--enable-debug],[turn on debug options and code])])
     103
     104AS_IF([test x$enable_debug = xyes],
    102105  [YAT_CXX_ADD_FLAG([SD_CXXFLAGS],[-g -O])],
    103106  [YAT_CPP_ADD_FLAG([SD_CPPFLAGS],[-DNDEBUG])
     
    109112                              [enable svn support - used by maintainer])])
    110113
    111 AS_IF([test "x$enable_svn-support" = xyes],
    112       [AC_CHECK_FILE([$srcdir/.svn],,
    113                      [AC_MSG_ERROR([svn support cannot be enabled: `$srcdir' is not an svn wc.])])])
    114 AM_CONDITIONAL([ENABLE_SVN_SUPPORT], [test "x$enable_svn-support" = "xyes"])
     114AS_IF([test "x$enable_svn_support" = xyes],
     115      [AS_IF([test -d $srcdir/.svn], [],
     116             [AC_MSG_ERROR([svn support cannot be enabled: `$srcdir' is not an svn wc.])])])
     117AM_CONDITIONAL([ENABLE_SVN_SUPPORT], [test "x$enable_svn_support" = "xyes"])
    115118
    116119# Apache Portable Runtime (APR) API checks
     
    135138  [ DISTCHECK_CONFIGURE_FLAGS="$DISTCHECK_CONFIGURE_FLAGS --with-svn=$withval"
    136139    YAT_LD_ADD_FLAG([SD_LDFLAGS], [-L$withval/lib])
    137     YAT_CPP_ADD_FLAG([SD_CPPFLAGS], [-L$withval/include])
     140    YAT_CPP_ADD_FLAG([SD_CPPFLAGS], [-I$withval/include])
    138141  ])
    139142
     
    185188
    186189# checking if we build in a subversion WC
    187 AC_CHECK_FILE([$srcdir/.svn], [wc_found="yes"], [wc_found="no"])
     190AS_IF([test -d $srcdir/.svn], [wc_found="yes"], [wc_found="no"])
    188191AM_CONDITIONAL([HAVE_SVN_WC], [test "$wc_found" = "yes"])
    189192AC_SUBST([wc_found])
     
    191194# checking if we have test repo
    192195test_repo_filename=$srcdir/test/repo;
    193 AC_CHECK_FILE([$test_repo_filename],
     196AS_IF([test -r $test_repo_filename],
    194197              [AC_DEFINE([HAVE_TEST_REPO],[1],[define if test repo is available])
    195198               test_repo_found="yes"],
     
    209212                bin/Makefile
    210213                lib/Makefile
     214                lib/yat/Makefile
    211215                man/Makefile
    212216                test/environment.h
    213217                test/Makefile])
     218
     219AC_CONFIG_HEADER([lib/yat/config_public.h])
    214220
    215221# Print failure status information about selected items, and exit if
  • branches/replacing_gnuplot/doc/readme.txt

    r784 r845  
    11$Id$
     2{{{
     3Copyright (C) 2005 Jari Häkkinen
     4Copyright (C) 2006 Jari Häkkinen, Peter Johansson
     5Copyright (C) 2007, 2008, 2009 Peter Johansson
     6
     7This file is part of svndigest, http://dev.thep.lu.se/svndigest
     8
     9svndigest is free software; you can redistribute it and/or modify it
     10under the terms of the GNU General Public License as published by the
     11Free Software Foundation; either version 3 of the License, or (at your
     12option) any later version.
     13
     14svndigest is distributed in the hope that it will be useful, but
     15WITHOUT ANY WARRANTY; without even the implied warranty of
     16MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
     17General Public License for more details.
     18
     19You should have received a copy of the GNU General Public License
     20along with svndigest. If not, see <http://www.gnu.org/licenses/>.
     21}}}
     22
    223
    324= About svndigest =
     
    7192that there is only one such a rule in use, namely the one described
    7293above that trailing `.in` in file names are discarded.
     94
     95
     96== Caching Statistics ==
     97
     98To avoid retrieving the same data repeatedly from the repository,
     99statistics is cahed in files located in `.svndigest`. Subsequent
     100svndigest runs read the cache files and retrieve information from the
     101repository only for the revisions that have been committed since the
     102cache file was created. Obviously, it is important that the cache
     103files reflect the history of the current working copy. If that is not
     104the case, for example, if you have switched working copy using `svn
     105switch`, you can make svndigest ignore the cache through option
     106`--ignore-cache`.
    73107
    74108
     
    164198  * Create the plots and HTML presentation.
    165199
    166 ----------------------------------------------------------------------
    167 {{{
    168 Copyright (C) 2005 Jari Häkkinen
    169 Copyright (C) 2006 Jari Häkkinen, Peter Johansson
    170 Copyright (C) 2007, 2008 Peter Johansson
    171 
    172 This file is part of svndigest, http://dev.thep.lu.se/svndigest
    173 
    174 svndigest is free software; you can redistribute it and/or modify it
    175 under the terms of the GNU General Public License as published by the
    176 Free Software Foundation; either version 3 of the License, or (at your
    177 option) any later version.
    178 
    179 svndigest is distributed in the hope that it will be useful, but
    180 WITHOUT ANY WARRANTY; without even the implied warranty of
    181 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
    182 General Public License for more details.
    183 
    184 You should have received a copy of the GNU General Public License
    185 along with svndigest. If not, see <http://www.gnu.org/licenses/>.
    186 }}}
  • branches/replacing_gnuplot/lib/AddStats.cc

    r784 r845  
    22
    33/*
    4   Copyright (C) 2008 Peter Johansson
     4  Copyright (C) 2008, 2009 Peter Johansson
    55
    66  This file is part of svndigest, http://dev.thep.lu.se/svndigest
     
    3333#include <string>
    3434#include <vector>
    35 
    36 //debug
    37 #include <iostream>
    3835
    3936namespace theplu{
     
    6966        if (*rev_iter==svn_blame.revision())
    7067          add(svn_blame.author(), *rev_iter, lt);
    71         // I dont trust blame and log behave consistent (stop-on-copy).
     68        // I dont trust blame and log behave consistently (stop-on-copy).
    7269        revs.insert(svn_blame.revision());
    7370        svn_blame.next_line();
  • branches/replacing_gnuplot/lib/BlameStats.cc

    r784 r845  
    44  Copyright (C) 2005 Peter Johansson
    55  Copyright (C) 2006, 2007 Jari Häkkinen, Peter Johansson
     6  Copyright (C) 2009 Peter Johansson
    67
    78  This file is part of svndigest, http://dev.thep.lu.se/svndigest
     
    6364  void BlameStats::fill_in(Author2Vector& a2v, svn_revnum_t rev)
    6465  {
    65     assert(rev);
     66    if (rev==0)
     67      return;
    6668    for (std::set<std::string>::const_iterator iter(authors().begin());
    6769         iter!=authors().end(); ++iter) {
     
    9496    }
    9597   
    96     // filling in pristine revisions
     98    // filling in pristine revisions, i.e., revs that are larger than
     99    // first_rev and not occuring in revs.
    97100    RevSet::iterator rev_iter=revs.begin();
    98     for (svn_revnum_t rev = first_rev+1; rev<=revision(); ++rev){
    99       if (rev==*rev_iter)
     101    svn_revnum_t rev = first_rev;
     102    while (rev<=revision()) {
     103      if (rev_iter!=revs.end() && rev>*rev_iter)
    100104        ++rev_iter;
     105      else if (rev_iter!=revs.end() && rev==*rev_iter) {
     106        ++rev_iter;
     107        ++rev;
     108      }
    101109      else {
    102110        fill_in(code_stats(),rev);
     
    104112        fill_in(other_stats(),rev);
    105113        fill_in(copyright_stats(),rev);
     114        ++rev;
    106115      }
    107116    }
  • branches/replacing_gnuplot/lib/ClassicStats.cc

    r784 r845  
    6161  void ClassicStats::do_parse(const std::string& path, svn_revnum_t rev)
    6262  {
     63    reset();
    6364    LineTypeParser parser(path);
    6465    SVNblame svn_blame(path);
    6566    while (svn_blame.valid()) {
    66       if (svn_blame.revision()>=rev) {
    67         add(svn_blame.author(), svn_blame.revision(),
    68             parser.parse(svn_blame.line()));
    69       }
     67      add(svn_blame.author(), svn_blame.revision(),
     68          parser.parse(svn_blame.line()));
    7069      svn_blame.next_line();
    7170    }
    72     accumulate_stats(rev);
     71    accumulate_stats();
    7372  }
    7473
  • branches/replacing_gnuplot/lib/Configuration.cc

    r784 r845  
    5858    else
    5959      iter->second.push_back(p);
     60  }
     61
     62
     63  std::string Configuration::author_str_color(const std::string& author) const
     64  {
     65    std::string res;
     66    std::map<std::string, std::string>::const_iterator iterator;
     67    if ( (iterator=author_color_.find(author)) != author_color_.end())
     68      res = iterator->second;
     69    return res;
    6070  }
    6171
     
    177187        }
    178188      }
     189      else if (section == "author-color") {
     190        author_color_[lhs] = rhs;
     191      }     
    179192      else if (section == "parsing-codons") {
    180193        if (!parsing_found) {
     
    454467
    455468    os << "\n"
     469       << "### Section for author color in blame output\n"
     470       << "[author-color]\n"
     471       << "# jdoe = 000000\n";
     472    typedef std::map<std::string,std::string> str_map;
     473    for (str_map::const_iterator i(conf.author_color_.begin());
     474         i!=conf.author_color_.end(); ++i) {
     475      os << i->first << " = " << i->second << " \n";
     476    }
     477
     478    os << "\n"
    456479       << "### Section for setting trac environment\n"
    457480       << "[trac]\n"
  • branches/replacing_gnuplot/lib/Configuration.h

    r784 r845  
    4343  public:
    4444    static Configuration& instance(void);
     45
     46    /**
     47       \return hexadecimal color code (e.g. 5aee4a) that is used in
     48       blame output. If no color is configured for \a author, an empty
     49       string is returned.
     50     */
     51    std::string author_str_color(const std::string& author) const;
    4552
    4653    /**
     
    117124    static Configuration* instance_;
    118125
     126    std::map<std::string, std::string> author_color_;
    119127    std::map<std::string, Alias> copyright_alias_;
    120128
  • branches/replacing_gnuplot/lib/Directory.cc

    r784 r845  
    109109
    110110
     111  svn_revnum_t Directory::last_changed_rev(void) const
     112  {
     113    svn_revnum_t res = svn_info().last_changed_rev();
     114    for (NodeConstIterator i=daughters_.begin(); i!=daughters_.end(); ++i)
     115      res = std::max(res, (*i)->last_changed_rev());
     116    return res;
     117  }
     118
     119
    111120  void Directory::log_core(SVNlog& log) const
    112121  {
     
    140149  {
    141150    mkdir("blame_output/" + local_path_);
    142     // print daughter nodes, i.e., this function is recursive
     151    // print daughter nodes
    143152    for (NodeConstIterator i=daughters_.begin(); i!=daughters_.end(); ++i)
    144153      (*i)->print(verbose);
     
    240249      os << "</td>\n";
    241250    }
    242     os << "<td>" << trac_revision(stats.last_changed_rev()) << "</td>\n";
     251    os << "<td>" << trac_revision(last_changed_rev()) << "</td>\n";
    243252    os << "<td>" << author() << "</td>\n";
    244253    os << "</tr>\n";
     
    254263  void Directory::print_copyright(std::map<std::string, Alias>& alias,
    255264                                  bool verbose,
    256                                   const std::map<int,svn_revnum_t>& y2r) const {
     265                                  const std::map<int,svn_revnum_t>& y2r) const
     266  {
    257267    if (!ignore()){
    258268      // print daughter nodes, i.e, this function is recursive
  • branches/replacing_gnuplot/lib/Directory.h

    r784 r845  
    7171
    7272    /**
     73       \brief Get the revision number of the latest commit.
     74
     75       Does not only check this directory but also daughter nodes.
     76    */
     77    svn_revnum_t last_changed_rev(void) const;
     78
     79    /**
    7380       @return The explicit string "directory", nothing else.
    7481    */
  • branches/replacing_gnuplot/lib/File.cc

    r789 r845  
    22
    33/*
    4   Copyright (C) 2005, 2006, 2007 Jari Häkkinen, Peter Johansson
    5   Copyright (C) 2009 Peter Johansson
     4  Copyright (C) 2005, 2006, 2007, 2009 Jari Häkkinen, Peter Johansson
    65
    76  This file is part of svndigest, http://dev.thep.lu.se/svndigest
     
    174173
    175174
     175  svn_revnum_t File::last_changed_rev(void) const
     176  {
     177    return svn_info().last_changed_rev();
     178  }
     179
     180
    176181  void File::log_core(SVNlog&) const
    177182  {
     
    222227  {
    223228    os << "<br /><h3>" << local_path() << "</h3>";
     229    os << "<div class=\"blame_legend\">\n";
     230    os << "<dl>\n";
     231    os << "<dt class=\"code\"></dt><dd>Code</dd>\n";
     232    os << "<dt class=\"comment\"></dt><dd>Comments</dd>\n";
     233    os << "<dt class=\"other\"></dt><dd>Other</dd>\n";
     234    os << "</dl>\n</div>\n";
    224235    os << "<table class=\"blame\">\n";
    225236    os << "<thead>\n";
     
    275286      hs << Date(blame.date())("%d %b %y");
    276287      os << "</font></td>\n<td class=\"author\">";
     288      std::string author_color =
     289        Configuration::instance().author_str_color(blame.author());
     290      if (!author_color.empty())
     291        os << "<font color=\"#" << author_color << "\">";
    277292      hs << blame.author();
    278293      os << "</td>\n<td class=\"";
     
    427442    catch (std::runtime_error e) {
    428443      // catch exception, cleanup, and rethrow
    429       std::cerr << "File::print_copyright: Exception caught, "
     444      std::cerr << "svndigest: File::print_copyright: Exception caught, "
    430445                << "removing temporary file " << tmpname << std::endl;
    431446      if (unlink(tmpname))
  • branches/replacing_gnuplot/lib/File.h

    r784 r845  
    4747    */
    4848    std::string href(void) const;
     49
     50    /**
     51       \brief Get the revision number of the latest commit.
     52    */
     53    svn_revnum_t last_changed_rev(void) const;
    4954
    5055    /**
  • branches/replacing_gnuplot/lib/LineTypeParser.h

    r784 r845  
    66/*
    77  Copyright (C) 2006 Jari Häkkinen, Peter Johansson
    8   Copyright (C) 2007 Peter Johansson
     8  Copyright (C) 2007, 2009 Peter Johansson
    99
    1010  This file is part of svndigest, http://dev.thep.lu.se/svndigest
     
    4343  public:
    4444    ///
    45     /// see 'doc/readmea.txt' for info on what is code, comment, and other.
     45    /// see 'doc/readme.txt' for info on what is code, comment, and other.
    4646    ///
    4747    // do not change these without checking in Stats class
  • branches/replacing_gnuplot/lib/Makefile.am

    r788 r845  
    2323# along with svndigest. If not, see <http://www.gnu.org/licenses/>.
    2424
     25MOVE_IF_CHANGE = $(SHELL) $(top_srcdir)/build_support/move-if-change
     26SVN_REVISION = `$(SVNVERSION) $(top_srcdir)`
     27
     28SUBDIRS = yat .
     29
    2530AM_CPPFLAGS = $(SVNDIGEST_CPPFLAGS)
    2631AM_CXXFLAGS = $(SVNDIGEST_CXXFLAGS)
     
    2833noinst_LIBRARIES = libsvndigest.a
    2934
    30 noinst_HEADERS = AddStats.h Alias.h BlameStats.h ClassicStats.h ColumnStream.h \
    31   CommandLine.h Commitment.h Configuration.h copyright_year.h css.h\
    32   Date.h Directory.h Exception.h File.h first_page.h Functor.h \
     35noinst_HEADERS = AddStats.h Alias.h BlameStats.h ClassicStats.h \
     36  Commitment.h Configuration.h copyright_year.h css.h\
     37  Date.h Directory.h File.h first_page.h Functor.h \
    3338  Graph.h \
    3439  HtmlBuf.h HtmlStream.h html_utility.h LineTypeParser.h \
    35   Node.h Option.h OptionArg.h OptionHelp.h OptionSwitch.h \
     40  Node.h
    3641  OptionVersion.h rmdirhier.h \
    3742  Stats.h StatsCollection.h subversion_info.h SVN.h SVNblame.h  \
     
    3944
    4045libsvndigest_a_SOURCES = AddStats.cc Alias.cc BlameStats.cc \
    41   ClassicStats.cc ColumnStream.cc \
    42   CommandLine.cc Commitment.cc Configuration.cc copyright_year.cc \
     46  ClassicStats.cc \
     47  Commitment.cc Configuration.cc copyright_year.cc \
    4348  css.cc Date.cc Directory.cc File.cc first_page.cc\
    4449  Functor.cc Graph.cc HtmlBuf.cc HtmlStream.cc \
    4550  html_utility.cc LineTypeParser.cc Node.cc \
    46   Option.cc OptionHelp.cc OptionSwitch.cc OptionVersion.cc \
     51  OptionVersion.cc \
    4752  rmdirhier.cc Stats.cc StatsCollection.cc subversion_info.cc SVN.cc \
    4853  SVNblame.cc SVNinfo.cc SVNlog.cc SVNproperty.cc Trac.cc utility.cc
     
    5863if HAVE_SVN_WC
    5964$(srcdir)/subversion_info.cc: subversion_info.cc.tmp
    60   @$(SHELL) $(top_srcdir)/build_support/move-if-change subversion_info.cc.tmp \
    61   $(srcdir)/subversion_info.cc
     65  @$(MOVE_IF_CHANGE) subversion_info.cc.tmp $@
    6266
    6367subversion_info.cc.tmp: FORCE
    6468  @echo '// subversion_info.cc generated from subversion_info.cc.in.' > $@ ;\
    65   revision=`$(SVNVERSION) $(top_srcdir)` ;\
     69  revision=$(SVN_REVISION);\
    6670  $(SED) -e 's/sub_2_svn_revision/r'$$revision'/g' \
    6771  $(srcdir)/subversion_info.cc.in >> $@ ;
     
    6973# update copyright year automatically (if we build from svn wc)
    7074$(srcdir)/copyright_year.cc: copyright_year.cc.tmp
    71   @$(SHELL) $(top_srcdir)/build_support/move-if-change $< $@
     75  @$(MOVE_IF_CHANGE) copyright_year.cc.tmp $@
    7276
    7377copyright_year.cc.tmp: FORCE
    74   @year=`svn info $(top_srcdir)|$(SED) -n  's/.*Date: \(.*\)-..-.*/\1/p'`;\
    75   $(SED) -e 's/"20[0-9][0-9]"/'\"$$year\"'/g' $(srcdir)/copyright_year.cc > $@ ;
     78  @if (echo $(SVN_REVISION) | $(GREP) M); then \
     79    $(SED) -e 's/"20[0-9][0-9]"/'\"`date -u "+%Y"`\"'/g' \
     80      $(srcdir)/copyright_year.cc > $@ ; \
     81  else \
     82    cp $(srcdir)/copyright_year.cc $@; \
     83  fi
    7684
    7785else
  • branches/replacing_gnuplot/lib/Node.cc

    r784 r845  
    3131#include "utility.h"
    3232
     33#include <algorithm>
    3334#include <cassert>
    3435#include <ctime>
     
    137138       << "<td>" << author() << "</td>\n"
    138139       << "</tr>\n";
    139   }
    140 
    141 
    142   svn_revnum_t Node::last_changed_rev(void) const
    143   {
    144     if (ignore())
    145       return svninfo_.last_changed_rev();
    146     assert(log().commits().size());
    147     return log().latest_commit().revision();
    148140  }
    149141
     
    317309    // map with last rev for every year
    318310    std::map<int, svn_revnum_t> year2rev;
    319     SVNlog log(path());
     311    // get log for entire project
     312    SVNlog log(SVNinfo(path()).repos_root_url());
    320313    typedef SVNlog::container::const_iterator LogIterator;
    321314    for (LogIterator i=log.commits().begin(); i!=log.commits().end(); ++i){
    322315      time_t sec = str2time(i->date());
    323316      tm* timeinfo = gmtime(&sec);
    324       year2rev[timeinfo->tm_year] = i->revision();
     317      // ignore commits in repository not present in wc
     318      year2rev[timeinfo->tm_year] = std::min(i->revision(), last_changed_rev());
    325319    }
    326320    print_copyright(alias, verbose, year2rev);
  • branches/replacing_gnuplot/lib/Node.h

    r784 r845  
    110110    /// @brief Get the revision number of the latest commit.
    111111    ///
    112     svn_revnum_t last_changed_rev(void) const;
     112    virtual svn_revnum_t last_changed_rev(void) const=0;
    113113
    114114    /**
     
    204204    ///
    205205    void path_anchor(std::ostream& os) const;
     206
     207    inline const SVNinfo& svn_info(void) const { return svninfo_; }
    206208
    207209    unsigned int level_;
  • branches/replacing_gnuplot/lib/OptionVersion.cc

    r784 r845  
    22
    33/*
    4   Copyright (C) 2008 Peter Johansson
     4  Copyright (C) 2008, 2009 Peter Johansson
    55
    66  This file is part of svndigest, http://dev.thep.lu.se/svndigest
     
    2424#include "copyright_year.h"
    2525#include "OptionVersion.h"
    26 #include "ColumnStream.h"
    27 #include "CommandLine.h"
    2826#include "subversion_info.h"
    2927#include "utility.h"
     28
     29#include "yat/ColumnStream.h"
     30#include "yat/CommandLine.h"
     31
     32#include <subversion-1/svn_version.h>
     33
     34#include <apr_version.h>
    3035
    3136#include <sstream>
     
    3540namespace svndigest {
    3641
    37   OptionVersion::OptionVersion(CommandLine& cmd, std::string flag,
     42  OptionVersion::OptionVersion(yat::utility::CommandLine& cmd, std::string flag,
    3843                               std::string desc, OptionSwitch* const verbose)
    39     : OptionSwitch(cmd, flag, desc, false), verbose_(verbose)
     44    : yat::utility::OptionSwitch(cmd, flag, desc, false), verbose_(verbose)
    4045  {
    4146  }
     
    4550                                std::vector<std::string>::iterator last)
    4651  {
    47     ColumnStream cs(std::cout, 1);
     52    yat::utility::ColumnStream cs(std::cout, 1);
    4853    cs.width(0)=79;
    4954    cs << PACKAGE_NAME << " " << PACKAGE_VERSION;
     
    6267       << "<http://www.gnu.org/licenses/gpl.html>.\n"
    6368       << "There is NO WARRANTY; to the extent permitted by law.\n";
     69    if (!no_verbose) {
     70      cs << "\n"
     71         << "Compiled with libsvn_subr " << SVN_VER_NUM
     72         << "; using libsvn_subr ";
     73      const svn_version_t* svn_ver = svn_subr_version();
     74      cs << svn_ver->major << '.' << svn_ver->minor << '.' << svn_ver->patch;
     75      cs << "\n"
     76         << "Compiled with libapr " << APR_VERSION_STRING
     77         << "; using libapr ";
     78      cs << apr_version_string();
     79      cs << "\n";
     80    }
    6481    exit(0);
    6582  }
  • branches/replacing_gnuplot/lib/OptionVersion.h

    r784 r845  
    2525*/
    2626
    27 #include "OptionSwitch.h"
     27#include "yat/OptionSwitch.h"
    2828
    2929#include <string>
    3030
    3131namespace theplu {
     32namespace yat {
     33namespace utility {
     34  class CommandLine;
     35}}
    3236namespace svndigest {
    3337
    34   class CommandLine;
    3538  /**
    3639     \brief Class for version option
     
    3942     version output.
    4043   */
    41   class OptionVersion : public OptionSwitch
     44  class OptionVersion : public yat::utility::OptionSwitch
    4245  {
    4346  public:
     
    5053       \param desc string used in help display
    5154    */
    52     OptionVersion(CommandLine& cmd, std::string name="version",
     55    OptionVersion(yat::utility::CommandLine& cmd, std::string name="version",
    5356                  std::string desc="print version information and exit",
    5457                  OptionSwitch* const verbose=NULL);
  • branches/replacing_gnuplot/lib/SVN.h

    r784 r845  
    2424  along with svndigest. If not, see <http://www.gnu.org/licenses/>.
    2525*/
     26
     27// Turning off warnings from using deprecated function, i.e., we are
     28// using subversion 1.4
     29#ifndef SVN_DEPRECATED
     30#define SVN_DEPRECATED
     31#endif
     32
    2633
    2734#include <map>
  • branches/replacing_gnuplot/lib/SVNinfo.h

    r784 r845  
    109109    /// @see Subversion API documentation
    110110    ///
    111     // The return type should be svn_log_message_receiver_t but I
    112     // cannot get it to compile (see comment for log_message_receiver
    113     // in SVNlog.h)
    114111    static svn_error_t * info_receiver(void *baton, const char *path,
    115112                                       const svn_info_t *info, apr_pool_t *pool);
  • branches/replacing_gnuplot/lib/SVNlog.h

    r784 r845  
    126126       \see Subversion API documentation
    127127    */
    128     // The return type should be svn_log_message_receiver_t but I
    129     // cannot get it to compile. The svn API has a typedef like
    130     // typedef svn_error_t*(* svn_log_message_receiver_t)(void *baton,
    131     // apr_hash_t *changed_paths, svn_revnum_t revision, const char
    132     // *author, const char *date,const char *message, apr_pool_t
    133     // *pool) for svn_log_message_receiver_t.
    134128    static svn_error_t*
    135129    log_message_receiver(void *baton, apr_hash_t *changed_paths,
  • branches/replacing_gnuplot/lib/Stats.cc

    r784 r845  
    44  Copyright (C) 2005 Peter Johansson
    55  Copyright (C) 2006, 2007 Jari Häkkinen, Peter Johansson
    6   Copyright (C) 2008 Peter Johansson
     6  Copyright (C) 2008, 2009 Peter Johansson
    77
    88  This file is part of svndigest, http://dev.thep.lu.se/svndigest
     
    118118      vec.reserve(rev+1);
    119119      vec.resize(rev);
     120      assert(vec.size()+1<vec.max_size());
    120121      if (x) {
    121         assert(vec.size()+1<vec.max_size());
    122122        vec.push_back(n);
    123123      }
    124124      else {
    125         assert(vec.size()+1<vec.max_size());
    126125        vec.push_back(0);
    127126      }
     
    154153  {
    155154    std::vector<unsigned int> init(revision()+1);
    156     code_stats()["all"]=std::accumulate(code_stats().begin(),
    157                                         code_stats().end(), init,
    158                                         PairValuePlus<std::string,unsigned int>());
    159     comment_stats()["all"]=std::accumulate(comment_stats().begin(),
    160                                            comment_stats().end(), init,
    161                                            PairValuePlus<std::string,unsigned int>());
    162     other_stats()["all"]=std::accumulate(other_stats().begin(),
    163                                          other_stats().end(), init,
    164                                          PairValuePlus<std::string,unsigned int>());
    165     copyright_stats()["all"]=std::accumulate(copyright_stats().begin(),
    166                                              copyright_stats().end(), init,
    167                                              PairValuePlus<std::string,unsigned int>());
     155    for (int lt=0; lt <= 4; ++lt) {
     156      stats_[lt]["all"].clear();
     157      stats_[lt]["all"] =
     158        std::accumulate(stats_[lt].begin(),
     159                        stats_[lt].end(), init,
     160                        PairValuePlus<std::string,unsigned int>());
     161    }
    168162    VectorPlus<unsigned int> vp;
    169163    comment_or_copy_stats()["all"] =
     
    171165
    172166    total_stats()["all"] =
    173       vp(vp(code_stats()["all"], comment_or_copy_stats()["all"]),
    174             other_stats()["all"]);
     167      vp(vp(code_stats()["all"], comment_or_copy_stats()["all"]), 
     168         other_stats()["all"]);
    175169  }
    176170
     
    339333  void Stats::parse(const std::string& path, svn_revnum_t rev)
    340334  {
     335    // reset stats to zero for [rev, inf)
     336    for (size_t i=0; i<stats_.size(); ++i)
     337      for (A2VIter iter=stats_[i].begin(); iter!=stats_[i].end(); ++iter) {
     338        iter->second.resize(rev,0);
     339        iter->second.resize(revision(),0);
     340      }
    341341    do_parse(path, rev);
    342342    calc_comment_or_copy();
  • branches/replacing_gnuplot/lib/StatsCollection.cc

    r784 r845  
    6363      svn_revnum_t cache_rev = i->second->load_cache(is);
    6464      if (cache_rev < i->second->last_changed_rev()) {
    65         cache_rev=0; // tmp hack to avoid partial cache
    6665        result = false;
    6766        // reset if load cache failed
  • branches/replacing_gnuplot/lib/StatsCollection.h

    r784 r845  
    6060
    6161    /**
    62        reset everything
    6362     */
    6463    void print(std::ostream&);
  • branches/replacing_gnuplot/lib/css.cc

    r784 r845  
    195195    s << "table.blame tbody td.date {text-align:right;padding-right:1.45em;}\n";
    196196    s << "table.blame tbody td.rev { text-align: right; }\n";
     197    std::string bg_lt_code("cfcfff");
     198    std::string bg_lt_comment("e8e8ff");
     199    std::string bg_lt_other("ffffff");
    197200    s << "table.blame tbody td.line-code { text-align: right; "
    198       << "background: #cfcfff; }\n";
     201      << "background: #" << bg_lt_code << "; }\n";
    199202    s << "table.blame tbody td.line-comment { text-align: right; "
    200       << "background: #e8e8ff; }\n";
     203      << "background: #" << bg_lt_comment << "; }\n";
    201204    s << "table.blame tbody td.line-other { text-align: right; "
    202       << "background: #ffffff; }\n";
     205      << "background: #" << bg_lt_other << "; }\n";
    203206    s << "table.blame tbody tr:hover { background: #eed; }\n";
    204207    s << "table.blame tbody td a { display: block; }\n";
     
    245248
    246249    s << ".sep { color: #666}\n";
     250    s << "div.blame_legend .code { background: #" << bg_lt_code << "; }\n"
     251      << "div.blame_legend .comment { background: #" << bg_lt_comment << "; }\n"
     252      << "div.blame_legend .other { background: #" << bg_lt_other << "; }\n"
     253      << "div.blame_legend {\n"
     254      << "float: left;\n"
     255      << "font-size: 9px;\n"
     256      << "margin: 1em 0;\n"
     257      << "padding: .5em;\n"
     258      << "} \n"
     259      << "div.blame_legend dt {\n"
     260      << "background: #fff;\n"
     261      << "border: 1px solid #999;\n"
     262      << "float: left;\n"
     263      << "margin: .1em .5em .1em 2em;\n"
     264      << "overflow: hidden;\n"
     265      << "width: .8em; height: .8em;\n"
     266      << "}\n"
     267      << "div.blame_legend dl, div.blame_legend dd {\n"
     268      << "display: inline;\n"
     269      << "float: left;\n"
     270      << "padding: 0;\n"
     271      << "margin: 0;\n"
     272      << "margin-right: 1.5em;\n"
     273      << "}\n";
    247274    s.close();
    248275  }
  • branches/replacing_gnuplot/lib/rmdirhier.cc

    r784 r845  
    2222
    2323#include "rmdirhier.h"
     24#include "utility.h"
    2425
     26#include <cstring>
    2527#include <dirent.h>
     28#include <cerrno>
    2629#include <fcntl.h>
    2730#include <iostream>
     
    4245    }
    4346    catch(const BadDirectory& x) {
    44       std::cerr << "Invalid directory: " << x.what() << std::endl;
     47      std::cerr << "svndigest: " << x.what() << "\n"
     48                << strerror(errno) << std::endl;
    4549    }
    4650    catch(const DirectoryOpenError& x) {
    47       std::cerr << "Error opening directory: " << x.what() << std::endl;
     51      std::cerr << "svndigest: cannot open directory " << x.what() << "\n"
     52                << strerror(errno) << "\n";
    4853    }
    4954    catch(const FileDeleteError& x) {
    50       std::cerr << "Error deleting file: " << x.what() << std::endl;
     55      std::cerr << "svndigest: cannot delete file " << x.what() << "\n"
     56                << strerror(errno) << "\n";
    5157    }
    5258    catch(const DirectoryDeleteError& x) {
    53       std::cerr << "Error deleting directory: " << x.what() << std::endl;
    54     }
    55     catch(const DirectoryError& x) {
    56       std::cerr << "Directory error:" << x.what() << std::endl;
     59      std::cerr << "svndigest: cannot delete directory " << x.what() << "\n"
     60                << strerror(errno) << "\n";
    5761    }
    5862
     
    7175      chmod(dir.c_str(),S_IWRITE);
    7276      if (unlink(dir.c_str()))
    73         throw FileDeleteError(dir);
     77        throw FileDeleteError(concatenate_path(pwd(),dir));
    7478      return;
    7579    }
    7680    if (chdir(dir.c_str()))
    77       throw BadDirectory(dir);
     81      throw BadDirectory(concatenate_path(pwd(),dir));
    7882
    7983   // Delete any remaining directory entries
     
    8185    struct dirent *entry;
    8286    if (!(dp=opendir(".")))
    83       throw DirectoryOpenError(dir);
     87      throw DirectoryOpenError(concatenate_path(pwd(),dir));
    8488    while ((entry=readdir(dp)) != NULL) {
    8589      if ((std::string(entry->d_name) == ".") ||
     
    9397    chdir("..");
    9498    if (rmdir(dir.c_str()))
    95       throw DirectoryDeleteError(dir);
     99      throw DirectoryDeleteError(concatenate_path(pwd(),dir));
    96100  }
    97101
  • branches/replacing_gnuplot/lib/utility.cc

    r784 r845  
    33/*
    44  Copyright (C) 2006, 2007, 2009 Jari Häkkinen, Peter Johansson
    5   Copyright (C) 2008 Peter Johansson
     5  Copyright (C) 2008, 2009 Peter Johansson
    66
    77  This file is part of svndigest, http://dev.thep.lu.se/svndigest
     
    167167
    168168
    169   bool is_int(std::string s)
    170   {
    171     std::stringstream ss(s);
    172     int a;
    173     ss >> a;
    174     if(ss.fail())
    175       return false;
    176     // Check that nothing is left on stream
    177     std::string b;
    178     ss >> b;
    179     return b.empty();
    180   }
    181 
    182 
    183169  std::string ltrim(std::string str)
    184170  {
     
    197183      throw std::runtime_error(ss.str());
    198184    }
     185  }
     186
     187
     188  void mkdir_p(const std::string& dir)
     189  {
     190    if (node_exist(dir))
     191      return;
     192    std::string mother = directory_name(dir);
     193    mkdir_p(mother);
     194    mkdir(dir);
    199195  }
    200196
  • branches/replacing_gnuplot/lib/utility.h

    r784 r845  
    77  Copyright (C) 2005 Peter Johansson
    88  Copyright (C) 2006, 2007, 2008 Jari Häkkinen, Peter Johansson
     9  Copyright (C) 2009 Peter Johansson
    910
    1011  This file is part of svndigest, http://dev.thep.lu.se/svndigest
     
    6162
    6263  /**
    63      \brief convert string to (numerical) type
    64 
    65      \throw runtime_error if conversion fails
    66    */
    67   template<typename T>
    68   T convert(const std::string& s);
    69 
    70   /**
    7164     @brief Copy file \a source to \a target.
    7265
     
    118111  ///
    119112  std::string htrim(std::string str);
    120 
    121   /**
    122      @return true if string \a s fulfills regular expression \verbatim
    123      ^\w* \endverbatim \a other \verbatim \w*$ \endverbatim (case
    124      insensitive)
    125   */
    126   bool is_equal(std::string s, std::string other);
    127 
    128   ///
    129   /// @return true if \a str is an integer
    130   ///
    131   bool is_int(std::string str);
    132 
    133   ///
    134   /// @return true if string is "nan" (case-insensitive)
    135   ///
    136   bool is_nan(const std::string& s);
    137113
    138114  ///
     
    160136  ///
    161137  void mkdir(const std::string& dir);
     138
     139  ///
     140  /// Create directory \a dir and parents directories if needed. No
     141  /// error if \a dir already exists.
     142  ///
     143  void mkdir_p(const std::string& dir);
    162144
    163145  ///
     
    244226                    std::string);
    245227
    246   // template implementations
    247   template<typename T>
    248   T convert(const std::string& s)
    249   {
    250     if (is_nan(s))
    251       return std::numeric_limits<T>::quiet_NaN();
    252     if (is_equal(s, "inf"))
    253       return std::numeric_limits<T>::infinity();
    254     if (is_equal(s, "-inf")) {
    255       if (std::numeric_limits<T>::is_signed)
    256         return -std::numeric_limits<T>::infinity();
    257       else
    258         throw std::runtime_error(std::string("convert(\"")+s+
    259                                  std::string("\"): type is unsigned") );
    260     }
    261 
    262     std::stringstream ss(s);
    263     T a;
    264     ss >> a;
    265     bool ok = true;
    266     if(ss.fail())
    267       ok = false;
    268     // Check that nothing is left on stream
    269     std::string b;
    270     ss >> b;
    271     if (!b.empty() || !ok)
    272       throw std::runtime_error(std::string("convert(\"")+s+std::string("\")"));
    273     return a;
    274   }
    275 
    276228}} // end of namespace svndigest end of namespace theplu
    277229
  • branches/replacing_gnuplot/man/Makefile.am

    r784 r845  
    2222dist_man1_MANS = $(srcdir)/svndigest.1
    2323
     24EXTRA_DIST = svndigest.x
     25
    2426MAINTAINERCLEANFILES = $(dist_man1_MANS)
    2527
     
    2830# is distributed it is recommended to depend on only distributed files
    2931# (see automake manual 27.5).
    30 $(srcdir)/svndigest.1: $(top_srcdir)/configure $(srcdir)/Makefile.in
     32$(srcdir)/svndigest.1: $(top_srcdir)/configure $(srcdir)/Makefile.in \
     33  $(srcdir)/svndigest.x
    3134  @$(HELP2MAN) --no-info -o $@ \
     35  --include $(srcdir)/svndigest.x \
    3236  --version-option="--no-verbose --version" \
    3337  $(top_builddir)/bin/svndigest$(EXEEXT)
    3438else
    3539$(srcdir)/svndigest.1:
    36         echo "WARNING: bogus svndigest.1 is created" >&2; \
     40  echo "WARNING: bogus svndigest.1 is created" >&2; \
    3741  echo 'ab help2man is required to generate this page' > $@
    3842
  • branches/replacing_gnuplot/test/Makefile.am

    r787 r845  
    33## $Id$
    44
    5 # Copyright (C) 2005, 2006, 2007, 2008 Jari Häkkinen, Peter Johansson
    6 # Copyright (C) 2009 Peter Johansson
     5# Copyright (C) 2005, 2006, 2007, 2008, 2009 Jari Häkkinen, Peter Johansson
    76#
    87# This file is part of svndigest, http://dev.thep.lu.se/svndigest
     
    2322check_SCRIPTS = svn_update.sh
    2423
    25 check_PROGRAMS = config_test copyright_test date_test \
     24check_PROGRAMS = cache_partial_test config_test copyright_test  \
     25  date_test \
    2626  parser_test stats_test trac_test utility_test
    2727
     
    3838LDADD = $(builddir)/libsvndigesttest.a \
    3939  $(top_builddir)/lib/libsvndigest.a \
     40  $(top_builddir)/lib/yat/libyat.a \
    4041  $(SVNDIGEST_LIBS)
    4142AM_LDFLAGS = $(SVNDIGEST_LDFLAGS)
     
    4647libsvndigesttest_a_SOURCES = Suite.cc
    4748
     49cache_partial_test_SOURCES = cache_partial_test.cc
    4850config_test_SOURCES = config_test.cc
    4951copyright_test_SOURCES = copyright_test.cc
  • branches/replacing_gnuplot/test/Suite.cc

    r784 r845  
    2525#include "environment.h"
    2626
    27 #include "utility.h"
    28 
     27#include "Stats.h"
     28#include "StatsCollection.h"
     29#include "../lib/utility.h"
     30
     31#include <algorithm>
    2932#include <cassert>
    3033#include <fstream>
    3134#include <iostream>
     35#include <iterator>
    3236#include <string>
    3337
     
    9094
    9195
     96  bool check_all(const Stats& stats, test::Suite& suite)
     97  {
     98    for (int lt=0; lt<=LineTypeParser::total; ++lt) {
     99      for (svn_revnum_t rev=0; rev<=stats.revision(); ++rev) {
     100        size_t all = 0;
     101        for (std::set<std::string>::const_iterator a=stats.authors().begin();
     102             a!=stats.authors().end(); ++a) {
     103          all += stats(lt, *a, rev);
     104        }
     105        if (all!=stats(lt, "all", rev)) {
     106          suite.out() << "error: check_all\n"
     107                      << " lt = " << lt << "\n"
     108                      << " rev = " << rev << "\n"
     109                      << " all = " << all << "\n"
     110                      << " stats = " << stats(lt, "all", rev) << "\n";
     111          for (std::set<std::string>::const_iterator a=stats.authors().begin();
     112               a!=stats.authors().end(); ++a) {
     113            suite.out() << *a << " " << stats(lt, *a, rev) << "\n";
     114          }
     115          return false;
     116        }
     117      }
     118    }
     119    return true;
     120  }
     121 
     122
     123  bool check_total(const Stats& stats, test::Suite& suite)
     124  {
     125    for (svn_revnum_t rev=0; rev<=stats.revision(); ++rev) {
     126      for (std::set<std::string>::const_iterator a=stats.authors().begin();
     127           a!=stats.authors().end(); ++a) {
     128        unsigned int total=0;
     129        for (int lt=0; lt<4; ++lt) {
     130          total += stats(lt, *a, rev);
     131        }
     132        unsigned int total2=stats(LineTypeParser::total, *a, rev);
     133       
     134        if (total!=total2) {
     135          suite.out() << "error: check_total\n"
     136                      << " author = " << *a << "\n"
     137                      << " rev = " << rev << "\n"
     138                      << " sum = " << total << "\n"
     139                      << " total = " << total2 << "\n";
     140          return false;
     141        }
     142      }
     143    }
     144    return true;
     145  }
     146 
     147
     148  bool check_comment_or_copy(const Stats& stats, test::Suite& suite)
     149  {
     150    for (svn_revnum_t rev=0; rev<=stats.revision(); ++rev) {
     151      for (std::set<std::string>::const_iterator a=stats.authors().begin();
     152           a!=stats.authors().end(); ++a) {
     153        unsigned int x=stats(LineTypeParser::comment, *a, rev);
     154        x+=stats(LineTypeParser::copyright, *a, rev);
     155        unsigned int y=stats(LineTypeParser::comment_or_copy, *a, rev);
     156       
     157        if (x!=y) {
     158          suite.out() << "error: check_total\n"
     159                      << " author = " << *a << "\n"
     160                      << " rev = " << rev << "\n"
     161                      << " comment + copyright = " << x << "\n"
     162                      << " comment_or_copy = " << y << "\n";
     163          return false;
     164        }
     165      }
     166    }
     167    return true;
     168  }
     169
     170
     171  bool consistent(const StatsCollection& sc, test::Suite& suite)
     172  {
     173    std::map<std::string, Stats*>::const_iterator iter = sc.stats().begin();
     174    while (iter != sc.stats().end()) {
     175      if (!consistent(*iter->second, suite)) {
     176        suite.out() << "error in " << iter->first << "\n";
     177        return false;
     178      }
     179      ++iter;
     180    }
     181    return true;
     182  }
     183
     184
     185  bool consistent(const Stats& stats, test::Suite& suite)
     186  {
     187    suite.add(check_all(stats, suite));
     188    suite.add(check_total(stats, suite));
     189    suite.add(check_comment_or_copy(stats, suite));
     190    return true;
     191  }
     192
     193
     194  bool equal(const StatsCollection& a, const StatsCollection& b,
     195             Suite& suite)
     196  {
     197    if (a.stats().size() != b.stats().size()) {
     198      suite.out() << "size mismatch\n";
     199      return false;
     200    }
     201    std::map<std::string, Stats*>::const_iterator iter1 = a.stats().begin();
     202    std::map<std::string, Stats*>::const_iterator iter2 = b.stats().begin();
     203    while (iter1 != a.stats().end()) {
     204      if (iter1->first != iter2->first) {
     205        suite.out() << "key mismatch\n";
     206        suite.out() << iter1->first << " vs " << iter2->first << "\n";
     207        return false;
     208      }
     209      if (!equal(*iter1->second, *iter2->second, suite)) {
     210        suite.out() << "error in " << iter1->first << "\n";
     211        return false;
     212      }
     213      ++iter1;
     214      ++iter2;
     215    }
     216    return true;
     217  }
     218 
     219
     220  bool equal(const Stats& a, const Stats& b, test::Suite& suite)
     221  {
     222    if (a.authors() != b.authors()) {
     223      suite.out() << "authors are not equal\n";
     224      suite.out() << "lhs:\n";
     225      std::copy(a.authors().begin(), a.authors().end(),
     226                std::ostream_iterator<std::string>(suite.out(), "\n"));
     227      suite.out() << "rhs:\n";
     228      std::copy(b.authors().begin(), b.authors().end(),
     229                std::ostream_iterator<std::string>(suite.out(), "\n"));
     230      return false;
     231    }
     232    if (a.revision() != b.revision()) {
     233      suite.out() << "revision mismatch\n";
     234      return false;
     235    }
     236    std::vector<std::string> authors;
     237    authors.reserve(a.authors().size()+1);
     238    std::copy(a.authors().begin(), a.authors().end(),
     239              std::back_inserter(authors));
     240    authors.push_back("all");
     241    for (int linetype=0; linetype <= LineTypeParser::total; ++linetype) {
     242      for (std::vector<std::string>::const_iterator author=authors.begin();
     243           author!=authors.end(); ++author) {
     244        for (svn_revnum_t rev=0; rev<a.revision(); ++rev) {
     245          size_t ax = a(linetype, *author, rev);
     246          size_t bx = b(linetype, *author, rev);
     247          if (ax != bx) {
     248            suite.out() << "error: linetype: " << linetype
     249                        << " author " << *author 
     250                        << " rev " << rev << "\n"
     251                        << "   a: " << ax << "\n"
     252                        << "   b: " << bx << "\n";
     253            return false;
     254          }
     255        }
     256      }
     257    }
     258    return true;
     259  }
     260
     261
    92262  void Suite::update_test_wc(void) const
    93263  {
     
    114284
    115285
     286  std::string src_filename(const std::string& path)
     287  {
     288    return abs_srcdir()+"/"+path;
     289  }
     290
     291
    116292}}}
  • branches/replacing_gnuplot/test/Suite.h

    r784 r845  
    2929namespace theplu {
    3030namespace svndigest {
     31  class Stats;
     32  class StatsCollection;
     33
    3134namespace test {
    3235
     
    6568  };
    6669
     70  bool check_all(const Stats&, test::Suite&);
     71  bool check_total(const Stats&, test::Suite&);
     72  bool check_comment_or_copy(const Stats&, test::Suite&);
     73
     74  bool consistent(const StatsCollection&, test::Suite&);
     75  bool consistent(const Stats&, test::Suite&);
     76
     77  bool equal(const StatsCollection& a, const StatsCollection& b,
     78             test::Suite& suite);
     79
     80  bool equal(const Stats& a, const Stats& b, test::Suite& suite);
     81
    6782  /**
    6883     \return absolute path to file
    69      \param local_path path relative to srcdir
     84     \param local_path path relative to builddir
    7085   */
    7186  std::string filename(const std::string& local_path);
    7287
     88  /**
     89     \return absolute path to file
     90     \param path path relative to srcdir
     91   */
     92  std::string src_filename(const std::string& path);
    7393}}}
    7494
  • branches/replacing_gnuplot/test/config_test.cc

    r784 r845  
    22
    33/*
    4   Copyright (C) 2008 Peter Johansson
     4  Copyright (C) 2008, 2009 Peter Johansson
    55
    66  This file is part of svndigest, http://dev.thep.lu.se/svndigest
     
    4949    bool ok =true;
    5050    if (!c.codon("foo.h")){
    51       std::cerr << "No codon for test.cc\n";
     51      std::cerr << "No codon for foo.h\n";
    5252      ok = false;
    5353    }
  • branches/replacing_gnuplot/test/repo/db/current

    r591 r845  
    1 61 1n 4
     164 1y 4
  • branches/replacing_gnuplot/test/test_repo.sh.in

    r784 r845  
    3232fi
    3333
     34while test $# -gt 0; do
     35    case "$1" in
     36    -v)
     37    VERBOSE=1
     38    ;;
     39    esac
     40    shift
     41done
     42
     43if test -z "$VERBOSE"; then
     44  exec > /dev/null
     45fi
     46
    3447cd $abs_builddir && @SHELL@ svn_update.sh || exit 1;
    3548
     
    3750
    3851$abs_top_builddir/bin/svndigest -r $rootdir -t $targetdir \
    39 --ignore-cache --no-report $1;
     52--ignore-cache --no-report --verbose;
    4053
    41 $abs_top_builddir/bin/svndigest -r $rootdir -t $targetdir -f $1;
    42 
     54$abs_top_builddir/bin/svndigest -r $rootdir -t $targetdir -vf;
  • branches/replacing_gnuplot/test/utility_test.cc

    r784 r845  
    2121*/
    2222
    23 #include "utility.h"
     23#include "../lib/utility.h"
    2424
    2525#include <algorithm>
Note: See TracChangeset for help on using the changeset viewer.