|
Boost-Commit : |
Subject: [Boost-commit] svn:boost r77598 - in trunk/tools/quickbook: src test/python test/python/sub1 test/python/sub2
From: dnljms_at_[hidden]
Date: 2012-03-27 19:00:49
Author: danieljames
Date: 2012-03-27 19:00:48 EDT (Tue, 27 Mar 2012)
New Revision: 77598
URL: http://svn.boost.org/trac/boost/changeset/77598
Log:
Quickbook: Further dependencies development. Refs #6691
- Include relevant locations on path where file wasn't found.
- Improve `include_search` while I'm at it.
- Normalize paths for non-existent files.
- Tests, not integrated with Boost.Build yet. Needs to check that
python is available then run the script with the location of the
quickbook executable.
Added:
trunk/tools/quickbook/test/python/
trunk/tools/quickbook/test/python/include_path.qbk (contents, props changed)
trunk/tools/quickbook/test/python/include_path.txt (contents, props changed)
trunk/tools/quickbook/test/python/missing_relative.qbk (contents, props changed)
trunk/tools/quickbook/test/python/missing_relative.txt (contents, props changed)
trunk/tools/quickbook/test/python/output-deps.py (contents, props changed)
trunk/tools/quickbook/test/python/sub1/
trunk/tools/quickbook/test/python/sub1/a.qbk (contents, props changed)
trunk/tools/quickbook/test/python/sub2/
trunk/tools/quickbook/test/python/sub2/b.qbk (contents, props changed)
trunk/tools/quickbook/test/python/svg_missing.qbk (contents, props changed)
trunk/tools/quickbook/test/python/svg_missing.txt (contents, props changed)
Text files modified:
trunk/tools/quickbook/src/actions.cpp | 39 +++++++++++++++++++++++++++------------
trunk/tools/quickbook/src/quickbook.cpp | 4 ++--
trunk/tools/quickbook/src/state.cpp | 22 +++++++++++++++++-----
trunk/tools/quickbook/src/state.hpp | 4 ++--
4 files changed, 48 insertions(+), 21 deletions(-)
Modified: trunk/tools/quickbook/src/actions.cpp
==============================================================================
--- trunk/tools/quickbook/src/actions.cpp (original)
+++ trunk/tools/quickbook/src/actions.cpp 2012-03-27 19:00:48 EDT (Tue, 27 Mar 2012)
@@ -936,7 +936,7 @@
//
// Now load the SVG file:
//
- state.add_loaded_file(img);
+ state.add_dependency(img);
std::string svg_text;
fs::ifstream fs(img);
char c;
@@ -1860,29 +1860,33 @@
};
std::set<include_search_return> include_search(path_details const& details,
- quickbook::state const& state)
+ quickbook::state& state, string_iterator pos)
{
std::set<include_search_return> result;
- fs::path current = state.current_file->path.parent_path();
- fs::path path(details.value);
+ fs::path path = detail::generic_to_path(details.value);
// If the path is relative, try and resolve it.
if (!path.has_root_directory() && !path.has_root_name())
{
+ fs::path local_path =
+ state.current_file->path.parent_path() / path;
+ state.add_dependency(local_path);
+
// See if it can be found locally first.
- if (fs::exists(current / path))
+ if (fs::exists(local_path))
{
result.insert(include_search_return(
- current / path,
+ local_path,
state.filename_relative.parent_path() / path));
return result;
}
- // Search in each of the include path locations.
BOOST_FOREACH(fs::path full, include_path)
{
full /= path;
+ state.add_dependency(full);
+
if (fs::exists(full))
{
result.insert(include_search_return(full, path));
@@ -1890,9 +1894,22 @@
}
}
}
+ else
+ {
+ state.add_dependency(path);
+
+ if (fs::exists(path)) {
+ result.insert(include_search_return(path, path));
+ return result;
+ }
+ }
+
+ detail::outerr(state.current_file, pos)
+ << "Unable to find file: "
+ << details.value
+ << std::endl;
+ ++state.error_count;
- result.insert(include_search_return(path,
- state.filename_relative.parent_path() / path));
return result;
}
}
@@ -1921,7 +1938,6 @@
qbk_version_n >= 106u ? file_state::scope_callables :
file_state::scope_macros);
- state.add_loaded_file(paths.filename);
state.current_file = load(paths.filename); // Throws load_error
state.filename_relative = paths.filename_relative;
state.imported = (load_type == block_tags::import);
@@ -1953,7 +1969,6 @@
std::string ext = paths.filename.extension().generic_string();
std::vector<template_symbol> storage;
- state.add_loaded_file(paths.filename);
// Throws load_error
state.error_count +=
load_snippets(paths.filename, storage, ext, load_type);
@@ -2004,7 +2019,7 @@
path_details details = check_path(values.consume(), state);
values.finish();
- std::set<include_search_return> search = include_search(details, state);
+ std::set<include_search_return> search = include_search(details, state, first);
std::set<include_search_return>::iterator i = search.begin();
std::set<include_search_return>::iterator e = search.end();
for (; i != e; ++i)
Modified: trunk/tools/quickbook/src/quickbook.cpp
==============================================================================
--- trunk/tools/quickbook/src/quickbook.cpp (original)
+++ trunk/tools/quickbook/src/quickbook.cpp 2012-03-27 19:00:48 EDT (Tue, 27 Mar 2012)
@@ -130,7 +130,7 @@
set_macros(state);
if (state.error_count == 0) {
- state.add_loaded_file(filein_);
+ state.add_dependency(filein_);
state.current_file = load(filein_); // Throws load_error
parse_file(state);
@@ -146,7 +146,7 @@
if (!deps_out_.empty())
{
fs::ofstream deps_out(deps_out_);
- BOOST_FOREACH(fs::path const& f, state.loaded_files)
+ BOOST_FOREACH(fs::path const& f, state.dependencies)
deps_out << detail::path_to_generic(f) << std::endl;
}
Modified: trunk/tools/quickbook/src/state.cpp
==============================================================================
--- trunk/tools/quickbook/src/state.cpp (original)
+++ trunk/tools/quickbook/src/state.cpp 2012-03-27 19:00:48 EDT (Tue, 27 Mar 2012)
@@ -71,11 +71,23 @@
return *grammar_;
}
- void state::add_loaded_file(fs::path const& f) {
- boost::system::error_code ec;
- fs::path p = fs::canonical(f, ec);
- if (ec) p = fs::absolute(f);
- loaded_files.insert(p);
+ void state::add_dependency(fs::path const& f) {
+ fs::path p = fs::absolute(f);
+ fs::path extra;
+ while (!fs::exists(fs::status(p))) {
+ fs::path name = p.filename();
+ p = p.parent_path();
+ if (name == "..") {
+ p = p.parent_path();
+ }
+ else if (name == ".") {
+ }
+ else {
+ extra = name / extra;
+ }
+ }
+ p = fs::canonical(p) / extra;
+ dependencies.insert(p);
}
file_state::file_state(quickbook::state& state, scope_flags scope)
Modified: trunk/tools/quickbook/src/state.hpp
==============================================================================
--- trunk/tools/quickbook/src/state.hpp (original)
+++ trunk/tools/quickbook/src/state.hpp 2012-03-27 19:00:48 EDT (Tue, 27 Mar 2012)
@@ -50,7 +50,7 @@
id_manager& ids;
value_builder callouts; // callouts are global as
int callout_depth; // they don't nest.
- std::set<fs::path> loaded_files;
+ std::set<fs::path> dependencies;
// state saved for files and templates.
bool imported;
@@ -79,7 +79,7 @@
// Call this before loading any file so that it will be included in the
// list of dependencies.
- void add_loaded_file(fs::path const&);
+ void add_dependency(fs::path const&);
void start_list(char mark);
void end_list(char mark);
Added: trunk/tools/quickbook/test/python/include_path.qbk
==============================================================================
--- (empty file)
+++ trunk/tools/quickbook/test/python/include_path.qbk 2012-03-27 19:00:48 EDT (Tue, 27 Mar 2012)
@@ -0,0 +1,4 @@
+[quickbook 1.5]
+[article Include Path]
+[include a.qbk]
+[include b.qbk]
Added: trunk/tools/quickbook/test/python/include_path.txt
==============================================================================
--- (empty file)
+++ trunk/tools/quickbook/test/python/include_path.txt 2012-03-27 19:00:48 EDT (Tue, 27 Mar 2012)
@@ -0,0 +1,6 @@
+include_path.qbk
+a.qbk
+sub1/a.qbk
+b.qbk
+sub1/b.qbk
+sub2/b.qbk
Added: trunk/tools/quickbook/test/python/missing_relative.qbk
==============================================================================
--- (empty file)
+++ trunk/tools/quickbook/test/python/missing_relative.qbk 2012-03-27 19:00:48 EDT (Tue, 27 Mar 2012)
@@ -0,0 +1,5 @@
+[quickbook 1.5]
+[article Missing Relative]
+
+[include ../missing.qbk]
+[include missing-dir/x.qbk]
Added: trunk/tools/quickbook/test/python/missing_relative.txt
==============================================================================
--- (empty file)
+++ trunk/tools/quickbook/test/python/missing_relative.txt 2012-03-27 19:00:48 EDT (Tue, 27 Mar 2012)
@@ -0,0 +1,3 @@
+missing_relative.qbk
+../missing.qbk
+missing-dir/x.qbk
Added: trunk/tools/quickbook/test/python/output-deps.py
==============================================================================
--- (empty file)
+++ trunk/tools/quickbook/test/python/output-deps.py 2012-03-27 19:00:48 EDT (Tue, 27 Mar 2012)
@@ -0,0 +1,97 @@
+#!/usr/bin/env python
+
+import sys, os, subprocess, tempfile
+
+def main(args, directory):
+ if len(args) != 1:
+ print "Usage: output-deps.py quickbook-command"
+ exit(1)
+ quickbook_command = args[0]
+ failures = 0
+ failures += run_quickbook(quickbook_command, 'svg_missing.qbk',
+ deps_gold = 'svg_missing.txt')
+ failures += run_quickbook(quickbook_command, 'missing_relative.qbk',
+ deps_gold = 'missing_relative.txt')
+ failures += run_quickbook(quickbook_command, 'include_path.qbk',
+ deps_gold = 'include_path.txt',
+ input_path = ['sub1', 'sub2'])
+ print "Failures:",failures
+ exit(failures)
+
+def run_quickbook(quickbook_command, filename, output_gold = None,
+ deps_gold = None, input_path = []):
+ failures = 0
+
+ command = [quickbook_command, '--debug', filename]
+
+ output_filename = None
+ if output_gold or not deps_gold:
+ output_filename = temp_filename('.qbk')
+ command.extend(['--output-file', output_filename])
+
+ deps_filename = None
+ if deps_gold:
+ deps_filename = temp_filename('.txt')
+ command.extend(['--output-deps', deps_filename])
+
+ try:
+ for path in input_path:
+ command.extend(['-I', path])
+ print 'Running: ' + ' '.join(command)
+ print
+ exit_code = subprocess.call(command)
+ print
+ success = not exit_code
+
+ if output_filename:
+ output = load_file(output_filename)
+ else:
+ output = None
+
+ if deps_filename:
+ deps = load_file(deps_filename)
+ else:
+ deps = None
+ finally:
+ if output_filename: os.unlink(output_filename)
+ if deps_filename: os.unlink(deps_filename)
+
+ if deps_gold:
+ gold_deps = set(os.path.realpath(x) for x in
+ load_file(deps_gold).strip().split('\n'))
+ test_deps = set(deps.strip().split('\n'))
+ if test_deps != gold_deps:
+ failures = failures + 1
+ print "Dependencies doesn't match:"
+ print "Gold:", gold_deps
+ print "Result:", test_deps
+ print
+
+ if output_gold:
+ gold = load_file(output_gold)
+ if output_gold != output:
+ failures = failures + 1
+ print "Output doesn't match:"
+ print
+ print output_gold
+ print
+ print gold
+ print
+
+ return failures
+
+def temp_filename(extension):
+ file = tempfile.mkstemp(suffix = extension)
+ os.close(file[0])
+ return file[1]
+
+def load_file(filename):
+ f = open(filename, 'r')
+ try:
+ return f.read()
+ finally:
+ f.close()
+
+ return None
+
+main(sys.argv[1:], os.path.dirname(sys.argv[0]))
Added: trunk/tools/quickbook/test/python/sub1/a.qbk
==============================================================================
--- (empty file)
+++ trunk/tools/quickbook/test/python/sub1/a.qbk 2012-03-27 19:00:48 EDT (Tue, 27 Mar 2012)
@@ -0,0 +1 @@
+a
Added: trunk/tools/quickbook/test/python/sub2/b.qbk
==============================================================================
--- (empty file)
+++ trunk/tools/quickbook/test/python/sub2/b.qbk 2012-03-27 19:00:48 EDT (Tue, 27 Mar 2012)
@@ -0,0 +1 @@
+b
Added: trunk/tools/quickbook/test/python/svg_missing.qbk
==============================================================================
--- (empty file)
+++ trunk/tools/quickbook/test/python/svg_missing.qbk 2012-03-27 19:00:48 EDT (Tue, 27 Mar 2012)
@@ -0,0 +1,3 @@
+[article Dependencies for missing svg]
+
+[$missing.svg]
Added: trunk/tools/quickbook/test/python/svg_missing.txt
==============================================================================
--- (empty file)
+++ trunk/tools/quickbook/test/python/svg_missing.txt 2012-03-27 19:00:48 EDT (Tue, 27 Mar 2012)
@@ -0,0 +1,2 @@
+html/missing.svg
+svg_missing.qbk
Boost-Commit list run by bdawes at acm.org, david.abrahams at rcn.com, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk