$include_dir="/home/hyper-archives/boost-commit/include"; include("$include_dir/msg-header.inc") ?>
From: grafikrobot_at_[hidden]
Date: 2007-10-25 01:41:41
Author: grafik
Date: 2007-10-25 01:41:40 EDT (Thu, 25 Oct 2007)
New Revision: 40452
URL: http://svn.boost.org/trac/boost/changeset/40452
Log:
Add include-path (I) option so that one can refer to files to import or include outside of the usual quickbook tree without using absolute paths.
Text files modified: 
   branches/quickbook/backend/boost/tools/quickbook/detail/actions.cpp   |    46 ++++++++++++++++++++++++++------------- 
   branches/quickbook/backend/boost/tools/quickbook/detail/actions.hpp   |     1                                         
   branches/quickbook/backend/boost/tools/quickbook/detail/quickbook.cpp |     8 ++++++                                  
   3 files changed, 40 insertions(+), 15 deletions(-)
Modified: branches/quickbook/backend/boost/tools/quickbook/detail/actions.cpp
==============================================================================
--- branches/quickbook/backend/boost/tools/quickbook/detail/actions.cpp	(original)
+++ branches/quickbook/backend/boost/tools/quickbook/detail/actions.cpp	2007-10-25 01:41:40 EDT (Thu, 25 Oct 2007)
@@ -1044,17 +1044,40 @@
         boost::spirit::parse(first, last, g);
     }
 
-    void import_action::operator()(iterator first, iterator last) const
+    namespace
     {
-        fs::path path(std::string(first, last), fs::native);
-
-        // check to see if the path is complete and if not, make it relative to the current path
-        if (!path.is_complete())
+        fs::path include_search(fs::path const & current, std::string const & name)
         {
-            path = actions.filename.branch_path() / path;
-            path.normalize();
+            fs::path path(name,fs::native);
+            
+            // If the path is relative, try and resolve it.
+            if (!path.is_complete())
+            {
+                // See if it can be found locally first.
+                if (fs::exists(current / path))
+                {
+                    return current / path;
+                }
+                
+                // Search in each of the include path locations.
+                BOOST_FOREACH(std::string const & p, include_path)
+                {
+                    fs::path full(p,fs::native);
+                    full /= path;
+                    if (fs::exists(full))
+                    {
+                        return full;
+                    }
+                }
+            }
+            
+            return path;
         }
+    }
 
+    void import_action::operator()(iterator first, iterator last) const
+    {
+        fs::path path = include_search(actions.filename.branch_path(), std::string(first,last));
         std::string ext = fs::extension(path);
         std::vector<template_symbol> storage;
         load_snippets(path.string(), storage, ext, actions.doc_id);
@@ -1077,16 +1100,9 @@
 
     void include_action::operator()(iterator first, iterator last) const
     {
-        fs::path filein(std::string(first, last), fs::native);
+        fs::path filein = include_search(actions.filename.branch_path(), std::string(first,last));
         std::string doc_type, doc_id, doc_dirname, doc_last_revision;
 
-        // check to see if the path is complete and if not, make it relative to the current path
-        if (!filein.is_complete())
-        {
-            filein = actions.filename.branch_path() / filein;
-            filein.normalize();
-        }
-
         // swap the filenames
         std::swap(actions.filename, filein);
 
Modified: branches/quickbook/backend/boost/tools/quickbook/detail/actions.hpp
==============================================================================
--- branches/quickbook/backend/boost/tools/quickbook/detail/actions.hpp	(original)
+++ branches/quickbook/backend/boost/tools/quickbook/detail/actions.hpp	2007-10-25 01:41:40 EDT (Thu, 25 Oct 2007)
@@ -51,6 +51,7 @@
     extern unsigned qbk_major_version;
     extern unsigned qbk_minor_version;
     extern unsigned qbk_version_n; // qbk_major_version * 100 + qbk_minor_version
+    extern std::vector<std::string> include_path;
 
     // forward declarations
     struct actions;
Modified: branches/quickbook/backend/boost/tools/quickbook/detail/quickbook.cpp
==============================================================================
--- branches/quickbook/backend/boost/tools/quickbook/detail/quickbook.cpp	(original)
+++ branches/quickbook/backend/boost/tools/quickbook/detail/quickbook.cpp	2007-10-25 01:41:40 EDT (Thu, 25 Oct 2007)
@@ -21,6 +21,7 @@
 #include <stdexcept>
 #include <fstream>
 #include <iostream>
+#include <vector>
 
 #if (defined(BOOST_MSVC) && (BOOST_MSVC <= 1310))
 #pragma warning(disable:4355)
@@ -39,6 +40,7 @@
     unsigned qbk_minor_version = 0;
     unsigned qbk_version_n = 0; // qbk_major_version * 100 + qbk_minor_version
     bool ms_errors = false; // output errors/warnings as if for VS
+    std::vector<std::string> include_path;
 
     ///////////////////////////////////////////////////////////////////////////
     //
@@ -181,6 +183,7 @@
             ("output-file", value<std::string>(), "output file")
             ("debug", "debug mode (for developers)")
             ("ms-errors", "use Microsoft Visual Studio style error & warn message format")
+            ("include-path,I", value< std::vector<std::string> >(), "include path")
         ;
 
         positional_options_description p;
@@ -241,6 +244,11 @@
             quickbook::current_gm_time = &gmt;
             quickbook::debug_mode = false;
         }
+        
+        if (vm.count("include-path"))
+        {
+            quickbook::include_path = vm["include-path"].as< std::vector<std::string> >();
+        }
 
         if (vm.count("input-file"))
         {