Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

What manual page do you want? #1227

Open
permezel opened this issue Jan 9, 2024 · 7 comments
Open

What manual page do you want? #1227

permezel opened this issue Jan 9, 2024 · 7 comments
Labels

Comments

@permezel
Copy link

permezel commented Jan 9, 2024

Describe the bug
Activating a direnv asks me which man page I wanted.

To Reproduce
cd somewhere/where/direnv/will/activate

Expected behavior
Not to be bothered about manual page reading.

Environment
macos 14.2.1
zsh
direnv: 2.33.0

Additional context

┌──(dap 💀 hubris)-[~]
└─% env | grep MAN
┌──(dap 💀 hubris)-[~]
└─% pushd
~/proj/smb-mount ~
direnv: loading ~/proj/smb-mount/.envrc
direnv: using python 3.12.1
What manual page do you want?
<string>:1: DeprecationWarning: 'pkgutil.find_loader' is deprecated and slated for removal in Python 3.14; use importlib.util.find_spec() instead
direnv: export +CPATH +LD_LIBRARY_PATH +LIBRARY_PATH +MANPATH +PKG_CONFIG_PATH +VIRTUAL_ENV ~PATH
┌──(dap 💀 hubris)-[~/proj/smb-mount]
└─% env | grep MAN
MANPATH=/Users/dap/.pyenv/versions/3.12.1/share/man:/Users/dap/.pyenv/versions/3.12.1/man:
┌──(dap 💀 hubris)-[~/proj/smb-mount]
└─% pushd
~ ~/proj/smb-mount
direnv: unloading
┌──(dap 💀 hubris)-[~]
└─% export MANPATH=/Users/dap/.pyenv/versions/3.12.1/share/man:/Users/dap/.pyenv/versions/3.12.1/man:
┌──(dap 💀 hubris)-[~]
└─% pushd
~/proj/smb-mount ~
direnv: loading ~/proj/smb-mount/.envrc
direnv: using python 3.12.1
<string>:1: DeprecationWarning: 'pkgutil.find_loader' is deprecated and slated for removal in Python 3.14; use importlib.util.find_spec() instead
direnv: export +CPATH +LD_LIBRARY_PATH +LIBRARY_PATH +PKG_CONFIG_PATH +VIRTUAL_ENV ~MANPATH ~PATH
┌──(dap 💀 hubris)-[~/proj/smb-mount]
└─% env | grep MAN                                                                                   
MANPATH=/Users/dap/.pyenv/versions/3.12.1/share/man:/Users/dap/.pyenv/versions/3.12.1/man:/Users/dap/.pyenv/versions/3.12.1/share/man:/Users/dap/.pyenv/versions/3.12.1/man:
┌──(dap 💀 hubris)-[~/proj/smb-mount]
└─% 

The problem is that man -w is run if MANPATH is not set.

┌──(dap 💀 hubris)-[~/proj/smb-mount]
└─% strings $(which direnv) | grep MANPA
# Usage: MANPATH_add <path>
# Prepends a path to the MANPATH environment variable while making sure that
# If MANPATH is not empty, man will only look in MANPATH.
# So if we set MANPATH=$path, man will only look in $path.
MANPATH_add() {
  local old_paths="${MANPATH:-$(man -w)}"
  export "MANPATH=$dir:$old_paths"
#    MANPATH
  MANPATH_add "$REPLY/man"
  MANPATH_add "$REPLY/share/man"
┌──(dap 💀 hubris)-[~/proj/smb-mount]
└─% man -w                
What manual page do you want?
┌──(dap 💀 hubris)-[~/proj/smb-mount]
└─% 

@permezel permezel added the Bug label Jan 9, 2024
@zimbatm
Copy link
Member

zimbatm commented Jan 9, 2024

Direnv itself doesn't do anything with manpages. What is the content of the .envrc?

@permezel
Copy link
Author

permezel commented Jan 9, 2024 via email

@permezel
Copy link
Author

I thought I pretty much explained it all in detail in my initial submission, but here is the function which is included in direnv in some shell builer-plate:

# Usage: MANPATH_add <path>
#
# Prepends a path to the MANPATH environment variable while making sure that
# `man` can still lookup the system manual pages.
#
# If MANPATH is not empty, man will only look in MANPATH.
# So if we set MANPATH=$path, man will only look in $path.
# Instead, prepend to `man -w` (which outputs man's default paths).
#
MANPATH_add() {
  local old_paths="${MANPATH:-$(man -w)}"
  local dir
  dir=$(expand_path "$1")
  export "MANPATH=$dir:$old_paths"
}

This needs to be os-specific, for those cases where MANPATH is not set and man -w does do return the MANPATH.

I know I can just set MANPATH to something, and it will go away, but I opened the issue on behalf of other folks who might be perplexed by the "What manual page do you want?" message every time.

If you wish to ensure on osx the man command still works after the MANPATH is set, it may require some more hacks.
Apparently, man on darwin does support the -w, but is weird.

┌──(dap 💀 hubris)-[~/proj/direnv]
└─% man -w ls
/usr/share/man/man1/ls.1
┌──(dap 💀 hubris)-[~/proj/direnv]
└─% man -w   
What manual page do you want?
┌──(dap 💀 hubris)-[~/proj/direnv]
└─% 

Found this:

┌──(dap 💀 hubris)-[~/proj/smb-mount]
└─% manpath    
/Users/dap/.pyenv/versions/3.12.1/share/man:/opt/homebrew/share/man:/usr/local/share/man:/usr/share/man:/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/share/man:/Applications/Xcode.app/Contents/Developer/usr/share/man:/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/share/man

It seems that setting MANPATH is sufficient. It appears to not be necessary to retain the system MANPATH.

There is some weird stuff happening here:

% pushd
~/proj/smb-mount ~/proj/direnv ~/proj/smb-mount
direnv: loading ~/proj/smb-mount/.envrc
direnv: using python 3.12.1
What manual page do you want?
<string>:1: DeprecationWarning: 'pkgutil.find_loader' is deprecated and slated for removal in Python 3.14; use importlib.util.find_spec() instead
direnv: export +CPATH +LD_LIBRARY_PATH +LIBRARY_PATH +MANPATH +PKG_CONFIG_PATH +VIRTUAL_ENV ~PATH
% echo ${MANPATH}   
/Users/dap/.pyenv/versions/3.12.1/share/man:/Users/dap/.pyenv/versions/3.12.1/man:
% manpath          
/Users/dap/.pyenv/versions/3.12.1/share/man:/opt/homebrew/share/man:/usr/local/share/man:/usr/share/man:/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/share/man:/Applications/Xcode.app/Contents/Developer/usr/share/man:/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/share/man
% man -w           
What manual page do you want?
% man -w python3.12
/Users/dap/.pyenv/versions/3.12.1/share/man/man1/python3.12.1
% pushd
~/proj/direnv ~/proj/smb-mount ~/proj/smb-mount
direnv: unloading
% man -w python3.12
/opt/homebrew/share/man/man1/python3.12.1
% manpath          
/opt/homebrew/share/man:/usr/local/share/man:/usr/share/man:/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/share/man:/Applications/Xcode.app/Contents/Developer/usr/share/man:/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/share/man
% echo ${MANPATH}  

% pushd
~/proj/smb-mount ~/proj/direnv ~/proj/smb-mount
direnv: loading ~/proj/smb-mount/.envrc
direnv: using python 3.12.1
What manual page do you want?
<string>:1: DeprecationWarning: 'pkgutil.find_loader' is deprecated and slated for removal in Python 3.14; use importlib.util.find_spec() instead
direnv: export +CPATH +LD_LIBRARY_PATH +LIBRARY_PATH +MANPATH +PKG_CONFIG_PATH +VIRTUAL_ENV ~PATH
% unset MANPATH
% manpath
/Users/dap/.pyenv/versions/3.12.1/share/man:/opt/homebrew/share/man:/usr/local/share/man:/usr/share/man:/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/share/man:/Applications/Xcode.app/Contents/Developer/usr/share/man:/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/share/man
% man -w python3.12
/Users/dap/.pyenv/versions/3.12.1/share/man/man1/python3.12.1
% 

@permezel
Copy link
Author

Sorry for those annoying prompt strings, but I included them for the $PWD context, but they just distracted I think.
I don't quite understand why unset MANPATH retains the direnv-specific path, but this is interesting:

% MANPATH=/tmp         
% manpath          
/tmp
% unset MANPATH
% manpath      
/Users/dap/.pyenv/versions/3.12.1/share/man:/opt/homebrew/share/man:/usr/local/share/man:/usr/share/man:/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/share/man:/Applications/Xcode.app/Contents/Developer/usr/share/man:/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/share/man

This explains it:

          -   If pathname ends with /bin: pathname/../share/man and pathname/../man

My guess is that on macos nothing is needed, or if the If pathname... kluge is not universally valid, then

${MANPATH:-$(manpath)}

As in:

% MANPATH=${MANPATH:-$(manpath)}
% echo ${MANPATH}
/Users/dap/.pyenv/versions/3.12.1/share/man:/opt/homebrew/share/man:/usr/local/share/man:/usr/share/man:/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/share/man:/Applications/Xcode.app/Contents/Developer/usr/share/man:/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/share/man
% manpath    
/Users/dap/.pyenv/versions/3.12.1/share/man:/opt/homebrew/share/man:/usr/local/share/man:/usr/share/man:/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/share/man:/Applications/Xcode.app/Contents/Developer/usr/share/man:/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/share/man
% 

@permezel
Copy link
Author

FWIW, here is the .envrc:

% cat .envrc
use python 3.12.1

% cat ~/.direnvrc          
use_python() {
    local python_root=$HOME/.pyenv/versions/$1
    load_prefix "$python_root"
    layout_python "$python_root/bin/python"
}

@cpmsmith
Copy link

Seems like #1161 is describing roughly the same problem on FreeBSD

@keitap
Copy link

keitap commented May 17, 2024

I couldn't take a much time to identify the exact cause, but after updating to 2.34.0, the DeprecationWarning was resolved.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Development

No branches or pull requests

4 participants