diff options
author | John Wiegley <johnw@newartisans.com> | 2010-06-15 06:28:30 -0400 |
---|---|---|
committer | John Wiegley <johnw@newartisans.com> | 2010-06-15 06:28:30 -0400 |
commit | be91f38ab4ccdba6006106d45fd7061db2110470 (patch) | |
tree | 25874de7e90c34224c842e6b716ca9e82fe01028 | |
parent | f3bedb88b24ae8b2047ad86e57b161265c2812f5 (diff) | |
parent | 968a6f3c0ac4690a6fc74e8d84058bce91019c2e (diff) | |
download | fork-ledger-be91f38ab4ccdba6006106d45fd7061db2110470.tar.gz fork-ledger-be91f38ab4ccdba6006106d45fd7061db2110470.tar.bz2 fork-ledger-be91f38ab4ccdba6006106d45fd7061db2110470.zip |
Merge branch 'next'
-rw-r--r-- | .gitignore | 72 | ||||
-rwxr-xr-x | acprep | 27 | ||||
-rw-r--r-- | doc/ledger.1 | 47 | ||||
-rw-r--r-- | src/amount.h | 4 | ||||
-rw-r--r-- | src/chain.cc | 6 | ||||
-rw-r--r-- | src/commodity.h | 2 | ||||
-rw-r--r-- | src/expr.cc | 2 | ||||
-rw-r--r-- | src/filters.cc | 8 | ||||
-rw-r--r-- | src/filters.h | 7 | ||||
-rw-r--r-- | src/generate.cc | 4 | ||||
-rw-r--r-- | src/global.cc | 4 | ||||
-rw-r--r-- | src/main.cc | 2 | ||||
-rw-r--r-- | src/op.cc | 2 | ||||
-rw-r--r-- | src/option.cc | 4 | ||||
-rw-r--r-- | src/parser.cc | 2 | ||||
-rw-r--r-- | src/query.h | 3 | ||||
-rw-r--r-- | src/quotes.cc | 2 | ||||
-rw-r--r-- | src/report.cc | 1 | ||||
-rw-r--r-- | src/report.h | 3 | ||||
-rw-r--r-- | src/stream.cc | 6 | ||||
-rw-r--r-- | src/textual.cc | 8 | ||||
-rw-r--r-- | src/token.cc | 4 | ||||
-rw-r--r-- | src/utils.h | 4 | ||||
-rw-r--r-- | src/xact.cc | 2 | ||||
-rwxr-xr-x | test/GenerateTests.py | 43 | ||||
-rwxr-xr-x | test/LedgerHarness.py | 21 | ||||
-rwxr-xr-x | test/RegressTests.py | 63 | ||||
-rw-r--r-- | test/baseline/opt-lot-dates.test | 2 | ||||
-rw-r--r-- | test/baseline/opt-lot-prices.test | 2 | ||||
-rw-r--r-- | test/baseline/opt-lots.test | 2 | ||||
-rw-r--r-- | tools/Makefile.am | 20 | ||||
-rw-r--r-- | tools/excludes | 1 | ||||
-rw-r--r-- | version.m4 | 1 |
33 files changed, 242 insertions, 139 deletions
@@ -1,58 +1,38 @@ -.timestamp +*.[oa] *.backup *.elc +*.l[oa] *.pyc *~ +.timestamp +/*.tar.bz2 +/*.tar.gz +/.deps/ +/.libs/ /ABOUT-NLS +/BaselineTests +/Doxyfile.gen +/Makefile /Makefile.am /Makefile.in +/PyUnitTests +/RegressionTests /TAGS /acconf.h.in /aclocal.m4 /autogen.sh /autom4te.cache/ /config.guess +/config.h /config.h.in +/config.log /config.rpath +/config.status /config.sub /configure /configure.ac -/depcomp -/elisp-comp -/install-sh -/intl/ -/ledger -/ltmain.sh -/m4/ -/make.sh -/missing -/po/ -/py-compile -/src/system.hh.gch -/texinfo.tex -/version.m4 - -*.[oa] -*.l[oa] -/*.tar.bz2 -/*.tar.gz -/.deps/ -/.libs/ -/BaselineTests -/Doxyfile.gen -/Makefile -/PyUnitTests -/RegressionTests -/config.h -/config.log -/config.status /data_tests -/doc/.dirstamp -/doc/html/ -/doc/latex/ -/doc/ledger.info -/doc/refman.pdf -/doc/report/ +/depcomp /doc/*.aux /doc/*.cp /doc/*.fn @@ -63,15 +43,33 @@ /doc/*.toc /doc/*.tp /doc/*.vr +/doc/.dirstamp +/doc/html/ +/doc/latex/ +/doc/ledger.info +/doc/refman.pdf +/doc/report/ +/elisp-comp /expr_tests +/install-sh +/intl/ +/ledger /libtool +/ltmain.sh +/m4/ +/make.sh /math_tests +/missing +/mkinstalldirs +/po/ +/py-compile /report_tests /shave /shave-libtool +/src/system.hh.gch /stamp-h1 /test/python/ +/texinfo.tex /tmpcvs*/ /tmpwrk*/ /util_tests -/mkinstalldirs @@ -633,17 +633,13 @@ class PrepareBuild(CommandLineApp): def current_version(self): if not self.current_ver: - if self.git_working_tree(): - #date = self.get_stdout('git', 'log', '--format=%ci', '-1', 'HEAD') - #date = re.sub(" [-+][0-9][0-9][0-9][0-9]$", "", date) - #when = datetime.datetime.strptime(date, "%Y-%m-%d %H:%M:%S") - #self.current_ver = when.strftime("%Y%m%d_%H%M%S") - #commit = self.get_stdout('git', 'log', '--format=%h', 'HEAD^..HEAD') - #self.current_ver += "_" + commit - tag = self.get_stdout('git', 'describe', '--all', '--long') - self.current_ver = re.sub('heads/', '', tag) - else: - self.current_ver = "no-git" + version_m4 = open('version.m4', 'r') + for line in version_m4.readlines(): + match = re.match('m4_define\(\[VERSION_NUMBER\], \[([0-9.]+[-abgrc0-9]*)\]\)', + line) + assert(match) + self.current_ver = match.group(1) + version_m4.close() return self.current_ver def need_to_prepare_autotools(self): @@ -726,13 +722,6 @@ class PrepareBuild(CommandLineApp): POTFILES_in.write('\n') POTFILES_in.close() - def phase_version(self, *args): - self.log.info('Executing phase: version') - version_m4 = open('version.m4', 'w') - version_m4.write("m4_define([VERSION_NUMBER], [%s])\n" % - self.current_version()) - version_m4.close() - def copytimes(self, src, dest): os.utime(dest, (os.stat(src)[ST_ATIME], os.stat(src)[ST_MTIME])) @@ -766,7 +755,6 @@ class PrepareBuild(CommandLineApp): reason = self.need_to_prepare_autotools() if reason: self.log.info('autogen.sh must be run ' + reason) - self.phase_version() self.phase_autogen() self.phase_gettext() self.phase_aclocal() @@ -1419,6 +1407,7 @@ class PrepareBuild(CommandLineApp): if self.options.jobs > 1: make_args.append('-j%d' % self.options.jobs) + make_args.append('JOBS=%d' % self.options.jobs) self.log.debug('Configure arguments => ' + str(config_args)) self.log.debug('Makefile arguments => ' + str(make_args)) diff --git a/doc/ledger.1 b/doc/ledger.1 index 5a91ceb2..4e72c792 100644 --- a/doc/ledger.1 +++ b/doc/ledger.1 @@ -1,4 +1,4 @@ -.Dd February 2, 2010 +.Dd June 15, 2010 .Dt ledger 1 .Sh NAME .Nm ledger @@ -53,7 +53,7 @@ Also show accounts whose total is zero. Rather than display a hierarchical tree, flatten the report to show subtotals for only accounts matching .Ar report-query . -.It Fl \-no\-total +.It Fl \-no-total Suppress the summary total shown at the bottom of the report (when not zero). .El .Pp @@ -263,6 +263,7 @@ transactions they are contained in. See the manual for more information. .It Fl \-account Ar STR .It Fl \-account-width Ar INT .It Fl \-actual Pq Fl L +.It Fl \-actual-dates .It Fl \-add-budget .It Fl \-amount Ar EXPR Pq Fl t .It Fl \-amount-data Pq Fl j @@ -275,8 +276,11 @@ transactions they are contained in. See the manual for more information. .It Fl \-basis Pq Fl B .It Fl \-begin Ar DATE Pq Fl b .It Fl \-budget +.It Fl \-budget-format Ar FMT .It Fl \-by-payee Pq Fl P +.It Fl \-cache Ar FILE .It Fl \-cleared Pq Fl C +.It Fl \-cleared-format Ar FMT .It Fl \-collapse Pq Fl n .It Fl \-collapse-if-zero .It Fl \-color @@ -284,12 +288,16 @@ transactions they are contained in. See the manual for more information. .It Fl \-cost See .Fl \-basis . +.It Fl \-count .It Fl \-csv-format Ar FMT .It Fl \-current Pq Fl c .It Fl \-daily +.It Fl \-date Ar EXPR .It Fl \-date-format Ar DATEFMT Pq Fl y +.It Fl \-datetime-format Ar FMT .It Fl \-date-width Ar INT .It Fl \-debug Ar STR +.It Fl \-decimal-comma .It Fl \-depth Ar INT .It Fl \-deviation Pq Fl D .It Fl \-display Ar EXPR Pq Fl d @@ -308,13 +316,25 @@ See See .Fl \-head . .It Fl \-flat +.It Fl \-force-color +.It Fl \-force-pager .It Fl \-forecast-while Ar EXPR (Also .Fl \-forecast ). +.It Fl \-forecast-years Ar INT .It Fl \-format Ar FMT Pq Fl F +.It Fl \-full-help .It Fl \-gain Pq Fl G +.It Fl \-generated +.It Fl \-group-by Ar EXPR +.It Fl \-group-title-format Ar FMT .It Fl \-head Ar INT +.It Fl \-help +.It Fl \-help-calc +.It Fl \-help-comm +.It Fl \-help-disp +.It Fl \-import Ar STR .It Fl \-init-file Ar FILE .It Fl \-input-date-format Ar DATEFMT .It Fl \-invert @@ -329,26 +349,37 @@ See .It Fl \-lots .It Fl \-lots-actual .It Fl \-market Pq Fl V +.It Fl \-master-account Ar STR +.It Fl \-meta Ar EXPR +.It Fl \-meta-width Ar INT .It Fl \-monthly Pq Fl M +.It Fl \-no-color +.It Fl \-no-rounding +.It Fl \-no-titles +.It Fl \-no-total +.It Fl \-now Ar DATE .It Fl \-only Ar EXPR +.It Fl \-options .It Fl \-output Ar FILE Pq Fl o .It Fl \-pager Ar STR +.It Fl \-payee .It Fl \-payee-width Ar INT .It Fl \-pending -.It Fl \-percentage Pq Fl \% +.It Fl \-percent Pq Fl \% .It Fl \-period Ar PERIOD Pq Fl p .It Fl \-period-sort .It Fl \-pivot Ar STR .It Fl \-plot-amount-format Ar FMT .It Fl \-plot-total-format Ar FMT +.It Fl \-prepend-format Ar FMT +.It Fl \-prepend-width Ar INT .It Fl \-price Pq Fl I .It Fl \-price-db Ar FILE .It Fl \-price-exp Ar STR See .Fl \-leeway . .It Fl \-prices-format Ar FMT -.It Fl \-pricesdb-format Ar FMT -.It Fl \-print-format Ar FMT +.It Fl \-pricedb-format Ar FMT .It Fl \-quantity Pq Fl O .It Fl \-quarterly .It Fl \-raw @@ -365,9 +396,6 @@ appeared in the original journal file. .It Fl \-revalued-total Ar EXPR .It Fl \-seed Ar INT .It Fl \-script -.It Fl \-set-account Ar EXPR -.It Fl \-set-payee Ar EXPR -.It Fl \-set-price Ar EXPR .It Fl \-sort Ar EXPR Pq Fl S .It Fl \-sort-all .It Fl \-sort-xacts @@ -382,6 +410,9 @@ appeared in the original journal file. .It Fl \-truncate .It Fl \-unbudgeted .It Fl \-uncleared Pq Fl U +.It Fl \-unrealized +.It Fl \-unrealized-gains +.It Fl \-unrealized-losses .It Fl \-unround .It Fl \-verbose .It Fl \-verify diff --git a/src/amount.h b/src/amount.h index 929251d8..1dfb4234 100644 --- a/src/amount.h +++ b/src/amount.h @@ -60,8 +60,8 @@ namespace ledger { class commodity_t; -class annotation_t; -class keep_details_t; +struct annotation_t; +struct keep_details_t; DECLARE_EXCEPTION(amount_error, std::runtime_error); diff --git a/src/chain.cc b/src/chain.cc index 49e0e470..64550663 100644 --- a/src/chain.cc +++ b/src/chain.cc @@ -188,12 +188,6 @@ post_handler_ptr chain_post_handlers(post_handler_ptr base_handler, else handler.reset(new sort_posts(handler, report.HANDLER(sort_).str())); } -#if 0 - else if (! report.HANDLED(period_) && - ! report.HANDLED(unsorted)) { - handler.reset(new sort_posts(handler, "date")); - } -#endif // collapse_posts causes xacts with multiple posts to appear as xacts // with a subtotaled post for each commodity used. diff --git a/src/commodity.h b/src/commodity.h index f2275d0e..24cd5a08 100644 --- a/src/commodity.h +++ b/src/commodity.h @@ -49,7 +49,7 @@ namespace ledger { -class keep_details_t; +struct keep_details_t; class commodity_pool_t; DECLARE_EXCEPTION(commodity_error, std::runtime_error); diff --git a/src/expr.cc b/src/expr.cc index defa5b79..0769d575 100644 --- a/src/expr.cc +++ b/src/expr.cc @@ -76,7 +76,7 @@ value_t expr_t::real_calc(scope_t& scope) try { return ptr->calc(scope, &locus); } - catch (const std::exception& err) { + catch (const std::exception&) { if (locus) { string current_context = error_context(); diff --git a/src/filters.cc b/src/filters.cc index 69183991..03baadc6 100644 --- a/src/filters.cc +++ b/src/filters.cc @@ -93,7 +93,7 @@ pass_down_posts::pass_down_posts(post_handler_ptr handler, try { item_handler<post_t>::operator()(*post); } - catch (const std::exception& err) { + catch (const std::exception&) { add_error_context(item_context(*post, _("While handling posting"))); throw; } @@ -256,9 +256,9 @@ void anonymize_posts::render_commodity(amount_t& amt) void anonymize_posts::operator()(post_t& post) { - SHA1 sha; - uint_least32_t message_digest[5]; - bool copy_xact_details = false; + SHA1 sha; + unsigned int message_digest[5]; + bool copy_xact_details = false; if (last_xact != post.xact) { temps.copy_xact(*post.xact); diff --git a/src/filters.h b/src/filters.h index 0f414151..9102d4f1 100644 --- a/src/filters.h +++ b/src/filters.h @@ -74,9 +74,9 @@ public: report_t& _report, expr_t _group_by_expr) : post_chain(_post_chain), report(_report), - group_by_expr(_group_by_expr), - preflush_func(bind(&post_splitter::print_title, this, _1)) { + group_by_expr(_group_by_expr) { TRACE_CTOR(post_splitter, "scope_t&, post_handler_ptr, expr_t"); + preflush_func = bind(&post_splitter::print_title, this, _1); } virtual ~post_splitter() { TRACE_DTOR(post_splitter); @@ -350,8 +350,7 @@ class anonymize_posts : public item_handler<post_t> public: anonymize_posts(post_handler_ptr handler) : item_handler<post_t>(handler), next_comm_id(0), last_xact(NULL), - rnd_gen(static_cast<unsigned int>(reinterpret_cast<uintmax_t>(this) + - static_cast<uintmax_t>(std::time(0)))), + rnd_gen(static_cast<unsigned int>(static_cast<uintmax_t>(std::time(0)))), integer_range(1, 2000000000L), integer_gen(rnd_gen, integer_range) { TRACE_CTOR(anonymize_posts, "post_handler_ptr"); diff --git a/src/generate.cc b/src/generate.cc index fbfca342..05f754e6 100644 --- a/src/generate.cc +++ b/src/generate.cc @@ -367,13 +367,13 @@ post_t * generate_posts_iterator::operator()() post = posts(); } } - catch (std::exception& err) { + catch (std::exception&) { add_error_context(_("While parsing generated transaction (seed %1):") << seed); add_error_context(buf.str()); throw; } - catch (int status) { + catch (int) { add_error_context(_("While parsing generated transaction (seed %1):") << seed); add_error_context(buf.str()); diff --git a/src/global.cc b/src/global.cc index b1466cae..c0698376 100644 --- a/src/global.cc +++ b/src/global.cc @@ -422,6 +422,7 @@ expr_t::func_t global_scope_t::look_for_command(scope_t& scope, void global_scope_t::visit_man_page() const { +#ifndef WIN32 int pid = fork(); if (pid < 0) { throw std::logic_error(_("Failed to fork child process")); @@ -436,6 +437,7 @@ void global_scope_t::visit_man_page() const int status = -1; wait(&status); +#endif exit(0); // parent } @@ -471,7 +473,7 @@ void handle_debug_options(int argc, char * argv[]) // global in utils.h _trace_level = boost::lexical_cast<uint8_t>(argv[i + 1]); } - catch (const boost::bad_lexical_cast& e) { + catch (const boost::bad_lexical_cast&) { throw std::logic_error(_("Argument to --trace must be an integer")); } i++; diff --git a/src/main.cc b/src/main.cc index e0da3a25..ef611f51 100644 --- a/src/main.cc +++ b/src/main.cc @@ -70,7 +70,9 @@ int main(int argc, char * argv[], char * envp[]) filesystem::path::default_name_check(filesystem::portable_posix_name); std::signal(SIGINT, sigint_handler); +#ifndef WIN32 std::signal(SIGPIPE, sigpipe_handler); +#endif #if defined(HAVE_GETTEXT) ::textdomain("ledger"); @@ -406,7 +406,7 @@ value_t expr_t::op_t::calc(scope_t& scope, ptr_op_t * locus, const int depth) return result; } - catch (const std::exception& err) { + catch (const std::exception&) { if (locus && ! *locus) *locus = this; throw; diff --git a/src/option.cc b/src/option.cc index 16f7713d..dae0f0af 100644 --- a/src/option.cc +++ b/src/option.cc @@ -86,7 +86,7 @@ namespace { opt(args); } - catch (const std::exception& err) { + catch (const std::exception&) { if (name[0] == '-') add_error_context(_("While parsing option '%1'") << name); @@ -137,7 +137,7 @@ void process_environment(const char ** envp, const string& tag, if (! value.empty()) process_option(string("$") + buf, string(buf), scope, q + 1, value); } - catch (const std::exception& err) { + catch (const std::exception&) { add_error_context(_("While parsing environment variable option '%1':") << *p); throw; diff --git a/src/parser.cc b/src/parser.cc index a15775d1..9a1ebf6f 100644 --- a/src/parser.cc +++ b/src/parser.cc @@ -484,7 +484,7 @@ expr_t::parser_t::parse(std::istream& in, return top_node; } - catch (const std::exception& err) { + catch (const std::exception&) { if (original_string) { add_error_context(_("While parsing value expression:")); diff --git a/src/query.h b/src/query.h index e3821f19..02f8f4e7 100644 --- a/src/query.h +++ b/src/query.h @@ -48,6 +48,9 @@ namespace ledger { class query_t : public predicate_t { +protected: + class parser_t; + public: class lexer_t { diff --git a/src/quotes.cc b/src/quotes.cc index 90c1f3eb..0cc8d06b 100644 --- a/src/quotes.cc +++ b/src/quotes.cc @@ -62,6 +62,7 @@ commodity_quote_from_script(commodity_t& commodity, DEBUG("commodity.download", "invoking command: " << getquote_cmd); bool success = true; +#ifndef WIN32 if (FILE * fp = popen(getquote_cmd.c_str(), "r")) { if (std::feof(fp) || ! std::fgets(buf, 255, fp)) success = false; @@ -103,6 +104,7 @@ commodity_quote_from_script(commodity_t& commodity, // Don't try to download this commodity again. commodity.add_flags(COMMODITY_NOMARKET); } +#endif return none; } diff --git a/src/report.cc b/src/report.cc index f7455440..9626283a 100644 --- a/src/report.cc +++ b/src/report.cc @@ -1040,7 +1040,6 @@ option_t<report_t> * report_t::lookup_option(const char * p) else OPT(unrealized_gains_); else OPT(unrealized_losses_); else OPT(unround); - else OPT(unsorted); break; case 'w': OPT(weekly); diff --git a/src/report.h b/src/report.h index 6176c19b..eff375cc 100644 --- a/src/report.h +++ b/src/report.h @@ -315,7 +315,6 @@ public: HANDLER(unrealized_gains_).report(out); HANDLER(unrealized_losses_).report(out); HANDLER(unround).report(out); - HANDLER(unsorted).report(out); HANDLER(weekly).report(out); HANDLER(wide).report(out); HANDLER(yearly).report(out); @@ -914,8 +913,6 @@ public: .set_expr(string("--unround"), "unrounded(total_expr)"); }); - OPTION(report_t, unsorted); - OPTION_(report_t, weekly, DO() { // -W parent->HANDLER(period_).on(string("--weekly"), "weekly"); }); diff --git a/src/stream.cc b/src/stream.cc index 79faa05a..001e7760 100644 --- a/src/stream.cc +++ b/src/stream.cc @@ -63,6 +63,7 @@ namespace { */ int do_fork(std::ostream ** os, const path& pager_path) { +#ifndef WIN32 int pfd[2]; int status = pipe(pfd); @@ -104,6 +105,9 @@ namespace { *os = new fdstream(pfd[1]); } return pfd[1]; +#else + return 0; +#endif } } @@ -120,6 +124,7 @@ void output_stream_t::initialize(const optional<path>& output_file, void output_stream_t::close() { +#ifndef WIN32 if (os != &std::cout) { checked_delete(os); os = &std::cout; @@ -134,6 +139,7 @@ void output_stream_t::close() if (! WIFEXITED(status) || WEXITSTATUS(status) != 0) throw std::logic_error(_("Error in the pager")); } +#endif } } // namespace ledger diff --git a/src/textual.cc b/src/textual.cc index 800d0c4e..828a093d 100644 --- a/src/textual.cc +++ b/src/textual.cc @@ -611,7 +611,7 @@ void instance_t::automated_xact_directive(char * line) ae.release(); } - catch (const std::exception& err) { + catch (const std::exception&) { if (reveal_context) { add_error_context(_("While parsing automated transaction:")); add_error_context(source_context(pathname, pos, curr_pos, "> ")); @@ -657,7 +657,7 @@ void instance_t::period_xact_directive(char * line) } } - catch (const std::exception& err) { + catch (const std::exception&) { if (reveal_context) { add_error_context(_("While parsing periodic transaction:")); add_error_context(source_context(pathname, pos, curr_pos, "> ")); @@ -1359,7 +1359,7 @@ post_t * instance_t::parse_post(char * line, return post.release(); } - catch (const std::exception& err) { + catch (const std::exception&) { add_error_context(_("While parsing posting:")); add_error_context(line_context(buf, beg, len)); throw; @@ -1557,7 +1557,7 @@ xact_t * instance_t::parse_xact(char * line, return xact.release(); } - catch (const std::exception& err) { + catch (const std::exception&) { if (reveal_context) { add_error_context(_("While parsing transaction:")); add_error_context(source_context(xact->pos->pathname, diff --git a/src/token.cc b/src/token.cc index 9dfff065..67cff65e 100644 --- a/src/token.cc +++ b/src/token.cc @@ -437,7 +437,7 @@ void expr_t::token_t::next(std::istream& in, const parse_flags_t& pflags, length = static_cast<std::size_t>(in.tellg() - pos); } } - catch (const std::exception& err) { + catch (const std::exception&) { kind = ERROR; length = static_cast<std::size_t>(in.tellg() - pos); throw; @@ -449,7 +449,7 @@ void expr_t::token_t::next(std::istream& in, const parse_flags_t& pflags, void expr_t::token_t::rewind(std::istream& in) { - in.seekg(- length, std::ios::cur); + in.seekg(- int(length), std::ios::cur); if (in.fail()) throw_(parse_error, _("Failed to rewind input stream")); } diff --git a/src/utils.h b/src/utils.h index 40fa57cc..a228d166 100644 --- a/src/utils.h +++ b/src/utils.h @@ -645,7 +645,7 @@ inline char peek_next_nonws(std::istream& in) { *_p = '\0'; \ } -inline string to_hex(uint_least32_t * message_digest, const int len = 1) +inline string to_hex(unsigned int * message_digest, const int len = 1) { std::ostringstream buf; @@ -664,7 +664,7 @@ inline string sha1sum(const string& str) SHA1 sha; sha.Reset(); sha << str.c_str(); - uint_least32_t message_digest[5]; + unsigned int message_digest[5]; sha.Result(message_digest); return to_hex(message_digest, 5); } diff --git a/src/xact.cc b/src/xact.cc index d8ed3f8b..4fe3e6e6 100644 --- a/src/xact.cc +++ b/src/xact.cc @@ -787,7 +787,7 @@ void auto_xact_t::extend_xact(xact_base_t& xact) xact.verify(); } - catch (const std::exception& err) { + catch (const std::exception&) { add_error_context(item_context(*this, _("While applying automated transaction"))); add_error_context(item_context(xact, _("While extending transaction"))); throw; diff --git a/test/GenerateTests.py b/test/GenerateTests.py index d60e0581..70baee28 100755 --- a/test/GenerateTests.py +++ b/test/GenerateTests.py @@ -4,13 +4,30 @@ # final balance is the same as what the balance report shows. import sys -#import re +import re from difflib import ndiff +multiproc = False +try: + from multiprocessing import Pool + multiproc = True +except: + pass + +args = sys.argv +jobs = 1 +match = re.match('-j([0-9]+)?', args[1]) +if match: + args = [args[0]] + args[2:] + if match.group(1): + jobs = int(match.group(1)) +if jobs == 1: + multiproc = False + from LedgerHarness import LedgerHarness -harness = LedgerHarness(sys.argv) +harness = LedgerHarness(args) #def normalize(line): # match = re.match("((\s*)([A-Za-z]+)?(\s*)([-0-9.]+)(\s*)([A-Za-z]+)?)( (.+))?$", line) @@ -104,14 +121,28 @@ def generation_test(seed): beg_range = 1 end_range = 20 -if len(sys.argv) > 4: - beg_range = int(sys.argv[3]) - end_range = int(sys.argv[4]) +if len(args) > 4: + beg_range = int(args[3]) + end_range = int(args[4]) -for i in range(beg_range, end_range): +def run_gen_test(i): if generation_test(i): harness.success() else: harness.failure() +if multiproc: + pool = Pool(jobs*2) +else: + pool = None + +if pool: + pool.map(run_gen_test, range(beg_range, end_range)) +else: + for i in range(beg_range, end_range): + run_gen_test(i) + +if pool: + pool.close() + pool.join() harness.exit() diff --git a/test/LedgerHarness.py b/test/LedgerHarness.py index ea8290d4..44e4e61c 100755 --- a/test/LedgerHarness.py +++ b/test/LedgerHarness.py @@ -6,6 +6,27 @@ import re from subprocess import Popen, PIPE +import copy_reg +import types + +def _pickle_method(method): + func_name = method.im_func.__name__ + obj = method.im_self + cls = method.im_class + return _unpickle_method, (func_name, obj, cls) + +def _unpickle_method(func_name, obj, cls): + for cls in cls.mro(): + try: + func = cls.__dict__[func_name] + except KeyError: + pass + else: + break + return func.__get__(obj, cls) + +copy_reg.pickle(types.MethodType, _pickle_method, _unpickle_method) + class LedgerHarness: ledger = None sourcepath = None diff --git a/test/RegressTests.py b/test/RegressTests.py index a32bdb6b..0472ac90 100755 --- a/test/RegressTests.py +++ b/test/RegressTests.py @@ -5,18 +5,35 @@ import os import re import tempfile +multiproc = False +try: + from multiprocessing import Pool + multiproc = True +except: + pass + from string import join from difflib import unified_diff from LedgerHarness import LedgerHarness -harness = LedgerHarness(sys.argv) -tests = sys.argv[3] +args = sys.argv +jobs = 1 +match = re.match('-j([0-9]+)?', args[1]) +if match: + args = [args[0]] + args[2:] + if match.group(1): + jobs = int(match.group(1)) +if jobs == 1: + multiproc = False + +harness = LedgerHarness(args) +tests = args[3] if not os.path.isdir(tests) and not os.path.isfile(tests): sys.exit(1) -class RegressFile: +class RegressFile(object): def __init__(self, filename): self.filename = filename self.fd = open(self.filename) @@ -137,24 +154,36 @@ class RegressFile: if not use_stdin: os.remove(tempdata[1]) - def run_tests(self): + def run_tests(self, pool): test = self.read_test() while test: - self.run_test(test) + if pool: + pool.apply_async(RegressFile.run_test, (self, test,)) + else: + self.run_test(test) test = self.read_test(test) def close(self): self.fd.close() -if os.path.isdir(tests): - for test_file in os.listdir(tests): - if re.search('\.test$', test_file): - entry = RegressFile(os.path.join(tests, test_file)) - entry.run_tests() - entry.close() -else: - entry = RegressFile(tests) - entry.run_tests() - entry.close() - -harness.exit() +if __name__ == '__main__': + if multiproc: + pool = Pool(jobs*2) + else: + pool = None + + if os.path.isdir(tests): + for test_file in os.listdir(tests): + if re.search('\.test$', test_file): + entry = RegressFile(os.path.join(tests, test_file)) + entry.run_tests(pool) + entry.close() + else: + entry = RegressFile(tests) + entry.run_tests(pool) + entry.close() + + if pool: + pool.close() + pool.join() + harness.exit() diff --git a/test/baseline/opt-lot-dates.test b/test/baseline/opt-lot-dates.test index 2415fb27..bf6dee0b 100644 --- a/test/baseline/opt-lot-dates.test +++ b/test/baseline/opt-lot-dates.test @@ -1,4 +1,4 @@ -reg -F '%(justify(scrub(total_expr), 80, 80, true))\n' --lot-dates --unsorted +reg -F '%(justify(scrub(total_expr), 80, 80, true))\n' --lot-dates <<< C 1.00s = 100c C 1.00G = 100s diff --git a/test/baseline/opt-lot-prices.test b/test/baseline/opt-lot-prices.test index 2fcc79f7..d5d7d11a 100644 --- a/test/baseline/opt-lot-prices.test +++ b/test/baseline/opt-lot-prices.test @@ -1,4 +1,4 @@ -reg -F '%(justify(scrub(total_expr), 80, 80, true))\n' --lot-prices --unsorted +reg -F '%(justify(scrub(total_expr), 80, 80, true))\n' --lot-prices <<< C 1.00s = 100c C 1.00G = 100s diff --git a/test/baseline/opt-lots.test b/test/baseline/opt-lots.test index 8e54e576..808afcc0 100644 --- a/test/baseline/opt-lots.test +++ b/test/baseline/opt-lots.test @@ -1,4 +1,4 @@ -reg -F '%(justify(scrub(total_expr), 80, 80, true))\n' --lots --unsorted +reg -F '%(justify(scrub(total_expr), 80, 80, true))\n' --lots <<< C 1.00s = 100c C 1.00G = 100s diff --git a/tools/Makefile.am b/tools/Makefile.am index 87f518eb..1ca0a6a7 100644 --- a/tools/Makefile.am +++ b/tools/Makefile.am @@ -1,4 +1,4 @@ -VERSION = 3.0.0 +LIBVERSION = $(shell echo $(PACKAGE_VERSION) | sed 's/[-abgrc].*//') ACLOCAL_AMFLAGS = -I m4 dist_man_MANS = doc/ledger.1 SUBDIRS = po intl @@ -25,7 +25,7 @@ libledger_util_la_SOURCES = \ lib/sha1.cpp libledger_util_la_CPPFLAGS = $(lib_cppflags) -libledger_util_la_LDFLAGS = -release $(VERSION) +libledger_util_la_LDFLAGS = -release $(LIBVERSION) libledger_math_la_SOURCES = \ src/balance.cc \ @@ -36,7 +36,7 @@ libledger_math_la_SOURCES = \ src/amount.cc libledger_math_la_CPPFLAGS = $(lib_cppflags) -libledger_math_la_LDFLAGS = -release $(VERSION) +libledger_math_la_LDFLAGS = -release $(LIBVERSION) libledger_expr_la_SOURCES = \ src/option.cc \ @@ -51,7 +51,7 @@ libledger_expr_la_SOURCES = \ src/value.cc libledger_expr_la_CPPFLAGS = $(lib_cppflags) -libledger_expr_la_LDFLAGS = -release $(VERSION) +libledger_expr_la_LDFLAGS = -release $(LIBVERSION) libledger_data_la_SOURCES = \ src/lookup.cc \ @@ -68,7 +68,7 @@ libledger_data_la_SOURCES = \ src/item.cc libledger_data_la_CPPFLAGS = $(lib_cppflags) -libledger_data_la_LDFLAGS = -release $(VERSION) +libledger_data_la_LDFLAGS = -release $(LIBVERSION) libledger_report_la_SOURCES = \ src/stats.cc \ @@ -87,7 +87,7 @@ libledger_report_la_SOURCES = \ src/session.cc libledger_report_la_CPPFLAGS = $(lib_cppflags) -libledger_report_la_LDFLAGS = -release $(VERSION) +libledger_report_la_LDFLAGS = -release $(LIBVERSION) pkginclude_HEADERS = \ src/utils.h \ @@ -369,7 +369,7 @@ RegressTests_SOURCES = test/RegressTests.py EXTRA_DIST += test/regress test/convert.py test/LedgerHarness.py RegressTests: $(srcdir)/test/RegressTests.py - echo "$(PYTHON) $(srcdir)/test/RegressTests.py $(top_builddir)/ledger$(EXEEXT) $(srcdir) $(srcdir)/test/regress \"\$$@\"" > $@ + echo "$(PYTHON) $(srcdir)/test/RegressTests.py -j$(JOBS) $(top_builddir)/ledger$(EXEEXT) $(srcdir) $(srcdir)/test/regress \"\$$@\"" > $@ chmod 755 $@ BaselineTests_SOURCES = test/RegressTests.py @@ -377,7 +377,7 @@ BaselineTests_SOURCES = test/RegressTests.py EXTRA_DIST += test/baseline BaselineTests: $(srcdir)/test/RegressTests.py - echo "$(PYTHON) $(srcdir)/test/RegressTests.py $(top_builddir)/ledger$(EXEEXT) $(srcdir) $(srcdir)/test/baseline \"\$$@\"" > $@ + echo "$(PYTHON) $(srcdir)/test/RegressTests.py -j$(JOBS) $(top_builddir)/ledger$(EXEEXT) $(srcdir) $(srcdir)/test/baseline \"\$$@\"" > $@ chmod 755 $@ ManualTests_SOURCES = test/RegressTests.py @@ -385,7 +385,7 @@ ManualTests_SOURCES = test/RegressTests.py EXTRA_DIST += test/manual ManualTests: $(srcdir)/test/RegressTests.py - echo "$(PYTHON) $(srcdir)/test/RegressTests.py $(top_builddir)/ledger$(EXEEXT) $(srcdir) $(srcdir)/test/manual \"\$$@\"" > $@ + echo "$(PYTHON) $(srcdir)/test/RegressTests.py -j$(JOBS) $(top_builddir)/ledger$(EXEEXT) $(srcdir) $(srcdir)/test/manual \"\$$@\"" > $@ chmod 755 $@ ConfirmTests_SOURCES = test/ConfirmTests.py @@ -406,7 +406,7 @@ ConfirmTests: $(srcdir)/test/ConfirmTests.py GenerateTests_SOURCES = test/GenerateTests.py GenerateTests: $(srcdir)/test/GenerateTests.py - echo "$(PYTHON) $(srcdir)/test/GenerateTests.py $(top_builddir)/ledger$(EXEEXT) $(srcdir) 1 ${1:-20} \"\$$@\"" > $@ + echo "$(PYTHON) $(srcdir)/test/GenerateTests.py -j$(JOBS) $(top_builddir)/ledger$(EXEEXT) $(srcdir) 1 ${1:-20} \"\$$@\"" > $@ chmod 755 $@ FULLCHECK=$(srcdir)/test/fullcheck.sh diff --git a/tools/excludes b/tools/excludes index dc56eacc..d914099f 100644 --- a/tools/excludes +++ b/tools/excludes @@ -44,4 +44,3 @@ src/system.hh.gch stamp-h1 texinfo.tex util_tests -version.m4 diff --git a/version.m4 b/version.m4 new file mode 100644 index 00000000..611c8282 --- /dev/null +++ b/version.m4 @@ -0,0 +1 @@ +m4_define([VERSION_NUMBER], [3.0.0]) |