Skip to content
  • Antonio Ospite's avatar
    submodule: support reading .gitmodules when it's not in the working tree · 76e9bdc4
    Antonio Ospite authored and Junio C Hamano's avatar Junio C Hamano committed
    
    
    When the .gitmodules file is not available in the working tree, try
    using the content from the index and from the current branch. This
    covers the case when the file is part of the repository but for some
    reason it is not checked out, for example because of a sparse checkout.
    
    This makes it possible to use at least the 'git submodule' commands
    which *read* the gitmodules configuration file without fully populating
    the working tree.
    
    Writing to .gitmodules will still require that the file is checked out,
    so check for that before calling config_set_in_gitmodules_file_gently.
    
    Add a similar check also in git-submodule.sh::cmd_add() to anticipate
    the eventual failure of the "git submodule add" command when .gitmodules
    is not safely writeable; this prevents the command from leaving the
    repository in a spurious state (e.g. the submodule repository was cloned
    but .gitmodules was not updated because
    config_set_in_gitmodules_file_gently failed).
    
    Moreover, since config_from_gitmodules() now accesses the global object
    store, it is necessary to protect all code paths which call the function
    against concurrent access to the global object store. Currently this
    only happens in builtin/grep.c::grep_submodules(), so call
    grep_read_lock() before invoking code involving
    config_from_gitmodules().
    
    Finally, add t7418-submodule-sparse-gitmodules.sh to verify that reading
    from .gitmodules succeeds and that writing to it fails when the file is
    not checked out.
    
    NOTE: there is one rare case where this new feature does not work
    properly yet: nested submodules without .gitmodules in their working
    tree.  This has been documented with a warning and a test_expect_failure
    item in t7814, and in this case the current behavior is not altered: no
    config is read.
    
    Signed-off-by: default avatarAntonio Ospite <ao2@ao2.it>
    Signed-off-by: default avatarJunio C Hamano <gitster@pobox.com>
    76e9bdc4