# Copyright 2003 Dave Abrahams 
# Copyright 2003, 2006 Rene Rivera 
# Copyright 2003, 2006 Vladimir Prus 
# 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) 

# This module is the plug-in handler for the --help and --help-.*
# command-line options
import modules ;
import assert ;
import doc : do-scan set-option set-output set-output-file print-help-usage print-help-top ;
import sequence ;
import set ;
import project ;
import print ;
import os ;
import version ;
import path ;

# List of possible modules, but which really aren't.
#
.not-modules =
    boost-build bootstrap site-config test user-config
    -tools allyourbase boost-base features python stlport testing unit-tests ;

# The help system options are parsed here and handed off to the doc
# module to translate into documentation requests and actions. The
# understood options are:
#
#    --help-disable-<option>
#    --help-doc-options
#    --help-enable-<option>
#    --help-internal
#    --help-options
#    --help-usage
#    --help-output <type>
#    --help-output-file <file>
#    --help [<module-or-class>]
#
rule process (
    command # The option.
    : values * # The values, starting after the "=".
    )
{
    assert.result --help : MATCH ^(--help).* : $(command) ;
    local did-help = ;
    switch $(command)
    {
        case --help-internal :
        local path-to-modules = [ modules.peek : BOOST_BUILD_PATH ] ;
        path-to-modules ?= . ;
        local possible-modules = [ GLOB $(path-to-modules) : *\\.jam ] ;
        local not-modules = [ GLOB $(path-to-modules) : *$(.not-modules)\\.jam ] ;
        local modules-to-list =
            [ sequence.insertion-sort
                [ set.difference $(possible-modules:D=:S=) : $(not-modules:D=:S=) ] ] ;
        local modules-to-scan ;
        for local m in $(modules-to-list)
        {
            local module-files = [ GLOB $(path-to-modules) : $(m)\\.jam ] ;
            modules-to-scan += $(module-files[1]) ;
        }
        do-scan $(modules-to-scan) : print-help-all ;
        did-help = true ;

        case --help-enable-* :
        local option = [ MATCH --help-enable-(.*) : $(command) ] ; option = $(option:L) ;
        set-option $(option) : enabled ;
        did-help = true ;

        case --help-disable-* :
        local option = [ MATCH --help-disable-(.*) : $(command) ] ; option = $(option:L) ;
        set-option $(option) ;
        did-help = true ;

        case --help-output :
        set-output $(values[1]) ;
        did-help = true ;

        case --help-output-file :
        set-output-file $(values[1]) ;
        did-help = true ;

        case --help-doc-options :
        local doc-module-spec = [ split-symbol doc ] ;
        do-scan $(doc-module-spec[1]) : print-help-options ;
        did-help = true ;

        case --help-options :
        print-help-usage ;
        did-help = true ;

        case --help :
        local spec = $(values[1]) ;
        if $(spec)
        {
            local spec-parts = [ split-symbol $(spec) ] ;
            if $(spec-parts)
            {
                if $(spec-parts[2])
                {
                    do-scan $(spec-parts[1]) : print-help-classes $(spec-parts[2]) ;
                    do-scan $(spec-parts[1]) : print-help-rules $(spec-parts[2]) ;
                    do-scan $(spec-parts[1]) : print-help-variables $(spec-parts[2]) ;
                }
                else
                {
                    do-scan $(spec-parts[1]) : print-help-module ;
                }
            }
            else
            {
                EXIT "Unrecognized help option '"$(command)" "$(spec)"'." ;
            }
        }
        else
        {
            version.print ;
            ECHO ;
            # First print documentation from the current Jamfile, if any.            
            # FIXME: Generally, this duplication of project.jam logic is bad.
            local names = [ modules.peek project : JAMROOT ]
              [ modules.peek project : JAMFILE ] ;
            local project-file = [ path.glob . : $(names) ] ;
            if ! $(project-file)
            {
                project-file = [ path.glob-in-parents . : $(names) ] ;
            }
            
            for local p in $(project-file)
            {
                do-scan $(p) : print-help-project $(p) ;
            }
            
            # Next any user-config help.
            local user-path = [ os.home-directories ] [ os.environ BOOST_BUILD_PATH ] ;
            local user-config = [ GLOB $(user-path) : user-config.jam ] ;
            if $(user-config)
            {
                do-scan $(user-config[1]) : print-help-config user $(user-config[1]) ;
            }
            
            # Next any site-config help.
            local site-config = [ GLOB $(user-path) : site-config.jam ] ;
            if $(site-config)
            {
                do-scan $(site-config[1]) : print-help-config site $(site-config[1]) ;
            }

            # Then the overall help.
            print-help-top ;
        }
        did-help = true ;
    }
    if $(did-help)
    {
        UPDATE all ;
        NOCARE all ;
    }
    return $(did-help) ;
}

# Split a reference to a symbol into module and symbol parts.
#
local rule split-symbol (
    symbol # The symbol to split.
    )
{
    local path-to-modules = [ modules.peek : BOOST_BUILD_PATH ] ;
    path-to-modules ?= . ;
    local module-name = $(symbol) ;
    local symbol-name = ;
    local result = ;
    while ! $(result)
    {
        local module-path = [ GLOB $(path-to-modules) : $(module-name)\\.jam ] ;
        if $(module-path)
        {
            # The 'module-name' in fact refers to module. Return the full
            # module path and a symbol within it. If 'symbol' passed to this
            # rule is already module, 'symbol-name' will be empty. Otherwise,
            # it's initialized on the previous loop iteration.
            # In case there are several modules by this name,
            # use the first one.
            result = $(module-path[1]) $(symbol-name) ;
        }
        else
        {
            if ! $(module-name:S)
            {
                result = - ;
            }
            else
            {
                local next-symbol-part = [ MATCH ^.(.*) : $(module-name:S) ] ;
                if $(symbol-name)
                {
                    symbol-name = $(next-symbol-part).$(symbol-name) ;
                }
                else
                {
                    symbol-name = $(next-symbol-part) ;
                }
                module-name = $(module-name:B) ;
            }
        }
    }
    if $(result) != -
    {
        return $(result) ;
    }
}
