Move generated completions to cache directory

This commit is contained in:
Anurag Singh 2024-04-27 15:45:28 +08:00 committed by Johannes Altmanninger
parent 1503be4287
commit 62a8b48fd1
10 changed files with 47 additions and 13 deletions

View File

@ -163,6 +163,7 @@ Completions
^^^^^^^^^^^ ^^^^^^^^^^^
- Added completions for: - Added completions for:
- Improved some completions - Improved some completions
- Generated completions are now stored in `$XDG_CACHE_HOME/fish` or `~/.cache/fish` by default (:issue:`10369`)
Improved terminal support Improved terminal support
^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^

View File

@ -155,7 +155,7 @@ By default, Fish searches the following for completions, using the first availab
- A user-specified directory for third-party vendor completions, usually ``~/.local/share/fish/vendor_completions.d`` (controlled by the ``XDG_DATA_HOME`` environment variable); - A user-specified directory for third-party vendor completions, usually ``~/.local/share/fish/vendor_completions.d`` (controlled by the ``XDG_DATA_HOME`` environment variable);
- A directory for third-party software vendors to ship their own completions for their software, usually ``/usr/share/fish/vendor_completions.d``; - A directory for third-party software vendors to ship their own completions for their software, usually ``/usr/share/fish/vendor_completions.d``;
- The completions shipped with fish, usually installed in ``/usr/share/fish/completions``; and - The completions shipped with fish, usually installed in ``/usr/share/fish/completions``; and
- Completions automatically generated from the operating system's manual, usually stored in ``~/.local/share/fish/generated_completions``. - Completions automatically generated from the operating system's manual, usually stored in ``~/.cache/fish/generated_completions`` (controlled by ``XDG_CACHE_HOME`` environment variable).
These paths are controlled by parameters set at build, install, or run time, and may vary from the defaults listed above. These paths are controlled by parameters set at build, install, or run time, and may vary from the defaults listed above.

View File

@ -80,7 +80,7 @@ else if not contains -- $__fish_data_dir/functions $fish_function_path
end end
if not set -q fish_complete_path if not set -q fish_complete_path
set fish_complete_path $__fish_config_dir/completions $__fish_sysconf_dir/completions $__fish_vendor_completionsdirs $__fish_data_dir/completions $__fish_user_data_dir/generated_completions set fish_complete_path $__fish_config_dir/completions $__fish_sysconf_dir/completions $__fish_vendor_completionsdirs $__fish_data_dir/completions $__fish_cache_dir/generated_completions
else if not contains -- $__fish_data_dir/completions $fish_complete_path else if not contains -- $__fish_data_dir/completions $fish_complete_path
set -a fish_complete_path $__fish_data_dir/completions set -a fish_complete_path $__fish_data_dir/completions
end end

View File

@ -88,7 +88,7 @@ end" >$__fish_config_dir/config.fish
# Check if our manpage completion script exists because some distros split it out. # Check if our manpage completion script exists because some distros split it out.
# (#7183) # (#7183)
set -l script $__fish_data_dir/tools/create_manpage_completions.py set -l script $__fish_data_dir/tools/create_manpage_completions.py
if not test -d $__fish_user_data_dir/generated_completions; and test -e "$script" if not test -d $__fish_cache_dir/generated_completions; and test -e "$script"
# Generating completions from man pages needs python (see issue #3588). # Generating completions from man pages needs python (see issue #3588).
# We cannot simply do `fish_update_completions &` because it is a function. # We cannot simply do `fish_update_completions &` because it is a function.
@ -96,7 +96,7 @@ end" >$__fish_config_dir/config.fish
# We don't want to call `fish -c` since that is unnecessary and sources config.fish again. # We don't want to call `fish -c` since that is unnecessary and sources config.fish again.
# Hence we'll call python directly. # Hence we'll call python directly.
# c_m_p.py should work with any python version. # c_m_p.py should work with any python version.
set -l update_args -B $__fish_data_dir/tools/create_manpage_completions.py --manpath --cleanup-in '~/.config/fish/completions' --cleanup-in '~/.config/fish/generated_completions' set -l update_args -B $__fish_data_dir/tools/create_manpage_completions.py --manpath --cleanup-in ~/.config/fish/completions --cleanup-in $__fish_config_dir/generated_completions --cleanup-in $__fish_cache_dir/generated_completions
if set -l python (__fish_anypython) if set -l python (__fish_anypython)
# Run python directly in the background and swallow all output # Run python directly in the background and swallow all output
$python $update_args >/dev/null 2>&1 & $python $update_args >/dev/null 2>&1 &

View File

@ -49,7 +49,7 @@ function fish_delta
end end
# We don't care about generated completions. # We don't care about generated completions.
# They shouldn't be compared at all. # They shouldn't be compared at all.
contains -- $dir $default_complete_path $__fish_user_data_dir/generated_completions contains -- $dir $default_complete_path $__fish_cache_dir/generated_completions
or set -a user_complete_path $dir or set -a user_complete_path $dir
end end

View File

@ -1,7 +1,7 @@
function fish_update_completions --description "Update man-page based completions" function fish_update_completions --description "Update man-page based completions"
# Don't write .pyc files, use the manpath, clean up old completions # Don't write .pyc files, use the manpath, clean up old completions
# display progress. # display progress.
set -l update_args -B $__fish_data_dir/tools/create_manpage_completions.py --manpath --cleanup-in ~/.config/fish/generated_completions --progress $argv set -l update_args -B $__fish_data_dir/tools/create_manpage_completions.py --manpath --cleanup-in $__fish_cache_dir/generated_completions --progress $argv
if set -l python (__fish_anypython) if set -l python (__fish_anypython)
$python $update_args $python $update_args
else else

View File

@ -1136,11 +1136,11 @@ if __name__ == "__main__":
sys.exit(0) sys.exit(0)
if not args.stdout and not args.directory: if not args.stdout and not args.directory:
# Default to ~/.local/share/fish/generated_completions/ # Default to ~/.cache/fish/generated_completions
# Create it if it doesn't exist # Create it if it doesn't exist
xdg_data_home = os.getenv("XDG_DATA_HOME", "~/.local/share") xdg_cache_home = os.getenv("XDG_CACHE_HOME", "~/.cache")
args.directory = os.path.expanduser( args.directory = os.path.expanduser(
xdg_data_home + "/fish/generated_completions/" xdg_cache_home + "/fish/generated_completions/"
) )
try: try:
os.makedirs(args.directory) os.makedirs(args.directory)

View File

@ -16,8 +16,8 @@ use crate::libc::{stdout_stream, C_PATH_BSHELL, _PATH_BSHELL};
use crate::nix::{geteuid, getpid, isatty}; use crate::nix::{geteuid, getpid, isatty};
use crate::null_terminated_array::OwningNullTerminatedArray; use crate::null_terminated_array::OwningNullTerminatedArray;
use crate::path::{ use crate::path::{
path_emit_config_directory_messages, path_get_config, path_get_data, path_make_canonical, path_emit_config_directory_messages, path_get_cache, path_get_config, path_get_data,
paths_are_same_file, path_make_canonical, paths_are_same_file,
}; };
use crate::proc::is_interactive_session; use crate::proc::is_interactive_session;
use crate::termsize; use crate::termsize;
@ -429,6 +429,7 @@ const FISH_HELPDIR_VAR: &wstr = L!("__fish_help_dir");
const FISH_BIN_DIR: &wstr = L!("__fish_bin_dir"); const FISH_BIN_DIR: &wstr = L!("__fish_bin_dir");
const FISH_CONFIG_DIR: &wstr = L!("__fish_config_dir"); const FISH_CONFIG_DIR: &wstr = L!("__fish_config_dir");
const FISH_USER_DATA_DIR: &wstr = L!("__fish_user_data_dir"); const FISH_USER_DATA_DIR: &wstr = L!("__fish_user_data_dir");
const FISH_CACHE_DIR: &wstr = L!("__fish_cache_dir");
/// Maximum length of hostname. Longer hostnames are truncated. /// Maximum length of hostname. Longer hostnames are truncated.
const HOSTNAME_LEN: usize = 255; const HOSTNAME_LEN: usize = 255;
@ -648,6 +649,12 @@ pub fn env_init(paths: Option<&ConfigPaths>, do_uvars: bool, default_paths: bool
user_data_dir.unwrap_or_default(), user_data_dir.unwrap_or_default(),
); );
let user_cache_dir = path_get_cache();
vars.set_one(
FISH_CACHE_DIR,
EnvMode::GLOBAL,
user_cache_dir.unwrap_or_default(),
);
// Set up a default PATH // Set up a default PATH
setup_path(); setup_path();

View File

@ -34,8 +34,7 @@ pub fn path_get_config() -> Option<WString> {
/// Returns the user data directory for fish. If the directory or one of its parents doesn't exist, /// Returns the user data directory for fish. If the directory or one of its parents doesn't exist,
/// they are first created. /// they are first created.
/// ///
/// Volatile files presumed to be local to the machine, such as the fish_history and all the /// Volatile files presumed to be local to the machine, such as the fish_history will be stored in this directory.
/// generated_completions, will be stored in this directory.
/// ///
/// \param path The directory as an out param /// \param path The directory as an out param
/// \return whether the directory was returned successfully /// \return whether the directory was returned successfully
@ -48,6 +47,23 @@ pub fn path_get_data() -> Option<WString> {
} }
} }
/// Returns the user cache directory for fish. If the directory or one of its parents doesn't exist,
/// they are first created.
///
/// Volatile files presumed to be local to the machine such as all the
/// generated_completions, will be stored in this directory.
///
/// \param path The directory as an out param
/// \return whether the directory was returned successfully
pub fn path_get_cache() -> Option<WString> {
let dir = get_cache_directory();
if dir.success() {
Some(dir.path.to_owned())
} else {
None
}
}
#[derive(Clone, Copy, Eq, PartialEq)] #[derive(Clone, Copy, Eq, PartialEq)]
pub enum DirRemoteness { pub enum DirRemoteness {
/// directory status is unknown /// directory status is unknown
@ -707,6 +723,12 @@ fn get_data_directory() -> &'static BaseDirectory {
&DIR &DIR
} }
fn get_cache_directory() -> &'static BaseDirectory {
static DIR: Lazy<BaseDirectory> =
Lazy::new(|| make_base_directory(L!("XDG_CACHE_HOME"), L!("/.cache/fish")));
&DIR
}
fn get_config_directory() -> &'static BaseDirectory { fn get_config_directory() -> &'static BaseDirectory {
static DIR: Lazy<BaseDirectory> = static DIR: Lazy<BaseDirectory> =
Lazy::new(|| make_base_directory(L!("XDG_CONFIG_HOME"), L!("/.config/fish"))); Lazy::new(|| make_base_directory(L!("XDG_CONFIG_HOME"), L!("/.config/fish")));

View File

@ -50,6 +50,10 @@ export XDG_RUNTIME_DIR
mkdir -p $XDG_RUNTIME_DIR/fish || die mkdir -p $XDG_RUNTIME_DIR/fish || die
chmod 700 "$XDG_RUNTIME_DIR" chmod 700 "$XDG_RUNTIME_DIR"
XDG_CACHE_HOME="$homedir/xdg_cache_home"
export XDG_CACHE_HOME
mkdir -p $XDG_CACHE_HOME/fish || die
# Create a temp/scratch directory for tests to use, if they want (tests shouldn't write to a # Create a temp/scratch directory for tests to use, if they want (tests shouldn't write to a
# shared temp folder). # shared temp folder).
TMPDIR="$homedir/temp" TMPDIR="$homedir/temp"