|
Boost-Commit : |
Subject: [Boost-commit] svn:boost r86703 - in trunk/tools/quickbook: src test/python
From: dnljms_at_[hidden]
Date: 2013-11-14 14:22:09
Author: danieljames
Date: 2013-11-14 14:22:09 EST (Thu, 14 Nov 2013)
New Revision: 86703
URL: http://svn.boost.org/trac/boost/changeset/86703
Log:
Glob dependency tracking.
Added:
trunk/tools/quickbook/test/python/include_glob.qbk (contents, props changed)
trunk/tools/quickbook/test/python/include_glob_deps.txt (contents, props changed)
trunk/tools/quickbook/test/python/include_glob_locs.txt (contents, props changed)
Text files modified:
trunk/tools/quickbook/src/dependency_tracker.cpp | 54 ++++++++++++++++++++++++++++++++++++---
trunk/tools/quickbook/src/dependency_tracker.hpp | 10 +++++++
trunk/tools/quickbook/src/include_paths.cpp | 9 +++++-
trunk/tools/quickbook/test/python/include_glob.qbk | 11 ++++++++
trunk/tools/quickbook/test/python/include_glob_deps.txt | 6 ++++
trunk/tools/quickbook/test/python/include_glob_locs.txt | 9 ++++++
trunk/tools/quickbook/test/python/output-deps.py | 32 +++++++++++++++++-----
7 files changed, 116 insertions(+), 15 deletions(-)
Modified: trunk/tools/quickbook/src/dependency_tracker.cpp
==============================================================================
--- trunk/tools/quickbook/src/dependency_tracker.cpp Thu Nov 14 14:21:37 2013 (r86702)
+++ trunk/tools/quickbook/src/dependency_tracker.cpp 2013-11-14 14:22:09 EST (Thu, 14 Nov 2013) (r86703)
@@ -100,12 +100,27 @@
return generic;
}
+ dependency_tracker::dependency_tracker() :
+ dependencies(), glob_dependencies(),
+ last_glob(glob_dependencies.end()) {}
+
bool dependency_tracker::add_dependency(fs::path const& f) {
bool found = fs::exists(fs::status(f));
dependencies[normalize_path(f)] |= found;
return found;
}
+ void dependency_tracker::add_glob(fs::path const& f) {
+ std::pair<glob_list::iterator, bool> r = glob_dependencies.insert(
+ std::make_pair(normalize_path(f), glob_list::mapped_type()));
+ last_glob = r.first;
+ }
+
+ void dependency_tracker::add_glob_match(fs::path const& f) {
+ assert(last_glob != glob_dependencies.end());
+ last_glob->second.insert(normalize_path(f));
+ }
+
void dependency_tracker::write_dependencies(fs::path const& file_out,
flags f)
{
@@ -124,17 +139,46 @@
void dependency_tracker::write_dependencies(std::ostream& out,
flags f)
{
- BOOST_FOREACH(dependency_list::value_type const& d, dependencies)
- {
- if (f & checked) {
+ if (f & checked) {
+ BOOST_FOREACH(dependency_list::value_type const& d, dependencies)
+ {
out << (d.second ? "+ " : "- ")
<< get_path(d.first, f) << std::endl;
}
- else {
+
+ BOOST_FOREACH(glob_list::value_type const& g, glob_dependencies)
+ {
+ out << "g "
+ << get_path(g.first, f) << std::endl;
+
+ BOOST_FOREACH(fs::path const& p, g.second)
+ {
+ out << "+ " << get_path(p, f) << std::endl;
+ }
+ }
+ }
+ else {
+ std::set<std::string> paths;
+
+ BOOST_FOREACH(dependency_list::value_type const& d, dependencies)
+ {
if (d.second) {
- out << get_path(d.first, f) << std::endl;
+ paths.insert(get_path(d.first, f));
+ }
+ }
+
+ BOOST_FOREACH(glob_list::value_type const& g, glob_dependencies)
+ {
+ BOOST_FOREACH(fs::path const& p, g.second)
+ {
+ paths.insert(get_path(p, f));
}
}
+
+ BOOST_FOREACH(std::string const& p, paths)
+ {
+ out << p << std::endl;
+ }
}
}
}
Modified: trunk/tools/quickbook/src/dependency_tracker.hpp
==============================================================================
--- trunk/tools/quickbook/src/dependency_tracker.hpp Thu Nov 14 14:21:37 2013 (r86702)
+++ trunk/tools/quickbook/src/dependency_tracker.hpp 2013-11-14 14:22:09 EST (Thu, 14 Nov 2013) (r86703)
@@ -10,6 +10,7 @@
#define QUICKBOOK_DEPENDENCY_TRACKER_HPP
#include <map>
+#include <set>
#include <iosfwd>
#include <boost/filesystem/path.hpp>
@@ -21,7 +22,11 @@
private:
typedef std::map<fs::path, bool> dependency_list;
+ typedef std::map<fs::path, std::set<fs::path> > glob_list;
+
dependency_list dependencies;
+ glob_list glob_dependencies;
+ glob_list::iterator last_glob;
public:
@@ -31,10 +36,15 @@
escaped = 2
};
+ dependency_tracker();
+
// Call this before loading any file so that it will be included in the
// list of dependencies. Returns true if file exists.
bool add_dependency(fs::path const&);
+ void add_glob(fs::path const&);
+ void add_glob_match(fs::path const&);
+
void write_dependencies(fs::path const&, flags = default_);
void write_dependencies(std::ostream&, flags = default_);
};
Modified: trunk/tools/quickbook/src/include_paths.cpp
==============================================================================
--- trunk/tools/quickbook/src/include_paths.cpp Thu Nov 14 14:21:37 2013 (r86702)
+++ trunk/tools/quickbook/src/include_paths.cpp 2013-11-14 14:22:09 EST (Thu, 14 Nov 2013) (r86703)
@@ -81,8 +81,9 @@
{
quickbook_path complete_path = location / path;
- if (state.dependencies.add_dependency(complete_path.file_path))
+ if (fs::exists(complete_path.file_path))
{
+ state.dependencies.add_glob_match(complete_path.file_path);
result.insert(complete_path);
}
return;
@@ -125,7 +126,9 @@
{
if (fs::is_regular_file(dir_i->status()))
{
- result.insert(new_location / generic_path);
+ quickbook_path r = new_location / generic_path;
+ state.dependencies.add_glob_match(r.file_path);
+ result.insert(r);
}
}
// If it's a matching dir, we recurse looking for more files.
@@ -152,6 +155,7 @@
fs::path current = state.current_file->path.parent_path();
// Search for the current dir accumulating to the result.
+ state.dependencies.add_glob(current / parameter.value);
include_search_glob(result,
quickbook_path(current,
state.abstract_file_path.parent_path()),
@@ -160,6 +164,7 @@
// Search the include path dirs accumulating to the result.
BOOST_FOREACH(fs::path dir, include_path)
{
+ state.dependencies.add_glob(dir / parameter.value);
include_search_glob(result, quickbook_path(dir, fs::path()),
parameter.value, state);
}
Added: trunk/tools/quickbook/test/python/include_glob.qbk
==============================================================================
--- /dev/null 00:00:00 1970 (empty, because file is newly added)
+++ trunk/tools/quickbook/test/python/include_glob.qbk 2013-11-14 14:22:09 EST (Thu, 14 Nov 2013) (r86703)
@@ -0,0 +1,11 @@
+[/
+ Copyright 2012-2013 Daniel James
+
+ Distributed under the Boost Software License, Version 1.0.
+ (See accompanying file LICENSE_1_0.txt or copy at
+ http://www.boost.org/LICENSE_1_0.txt)
+]
+
+[quickbook 1.7]
+[article Include Path]
+[include ?.qbk]
Added: trunk/tools/quickbook/test/python/include_glob_deps.txt
==============================================================================
--- /dev/null 00:00:00 1970 (empty, because file is newly added)
+++ trunk/tools/quickbook/test/python/include_glob_deps.txt 2013-11-14 14:22:09 EST (Thu, 14 Nov 2013) (r86703)
@@ -0,0 +1,6 @@
+# Copyright 2012-2013 Daniel James
+# Distributed under the Boost Software License, Version 1.0.
+# (See accompanying file LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt)
+include_glob.qbk
+sub1/a.qbk
+sub2/b.qbk
Added: trunk/tools/quickbook/test/python/include_glob_locs.txt
==============================================================================
--- /dev/null 00:00:00 1970 (empty, because file is newly added)
+++ trunk/tools/quickbook/test/python/include_glob_locs.txt 2013-11-14 14:22:09 EST (Thu, 14 Nov 2013) (r86703)
@@ -0,0 +1,9 @@
+# Copyright 2012-2013 Daniel James
+# Distributed under the Boost Software License, Version 1.0.
+# (See accompanying file LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt)
++ include_glob.qbk
+g ?.qbk
+g sub1/?.qbk
++ sub1/a.qbk
+g sub2/?.qbk
++ sub2/b.qbk
Modified: trunk/tools/quickbook/test/python/output-deps.py
==============================================================================
--- trunk/tools/quickbook/test/python/output-deps.py Thu Nov 14 14:21:37 2013 (r86702)
+++ trunk/tools/quickbook/test/python/output-deps.py 2013-11-14 14:22:09 EST (Thu, 14 Nov 2013) (r86703)
@@ -24,6 +24,10 @@
deps_gold = 'include_path_deps.txt',
locations_gold = 'include_path_locs.txt',
input_path = ['sub1', 'sub2'])
+ failures += run_quickbook(quickbook_command, 'include_glob.qbk',
+ deps_gold = 'include_glob_deps.txt',
+ locations_gold = 'include_glob_locs.txt',
+ input_path = ['sub1', 'sub2'])
if failures == 0:
print "Success"
@@ -123,22 +127,34 @@
return dependencies
def load_locations(filename, adjust_paths = False):
- line_matcher = re.compile("^([+-]) (.*)$")
+ line_matcher = re.compile("^([+-g]) (.*)$")
dependencies = {}
f = open(filename, 'r')
+ glob = None
+ globs = {}
for line in f:
if line[0] == '#': continue
m = line_matcher.match(line)
- if not m:
- raise Exception("Invalid dependency file: %1s" % filename)
- found = m.group(1) == '+'
+
path = m.group(2)
if adjust_paths:
path = os.path.realpath(path)
- if path in dependencies:
- raise Exception("Duplicate path (%1s) in %2s" % (path, filename))
- dependencies[path] = found
- return dependencies
+
+ if not m:
+ raise Exception("Invalid dependency file: %1s" % filename)
+ if m.group(1) == 'g':
+ globs[path] = []
+ glob = path
+ elif glob:
+ if m.group(1) != '+':
+ raise Exception("Negative match in glob.")
+ globs[glob].append(path)
+ else:
+ found = m.group(1) == '+'
+ if path in dependencies:
+ raise Exception("Duplicate path (%1s) in %2s" % (path, filename))
+ dependencies[path] = found
+ return { 'dependencies': dependencies, 'globs': globs }
def temp_filename(extension):
file = tempfile.mkstemp(suffix = extension)
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