Fix symlink extraction over ssh
This commit is contained in:
parent
8867317b6a
commit
b4cc38a1d9
@ -12,6 +12,7 @@ from typing import (
|
|||||||
from kitty.cli import parse_args
|
from kitty.cli import parse_args
|
||||||
from kitty.cli_stub import CopyCLIOptions
|
from kitty.cli_stub import CopyCLIOptions
|
||||||
from kitty.types import run_once
|
from kitty.types import run_once
|
||||||
|
from ..transfer.utils import expand_home, home_path
|
||||||
|
|
||||||
|
|
||||||
@run_once
|
@run_once
|
||||||
@ -48,9 +49,9 @@ def parse_copy_args(args: Optional[Sequence[str]] = None) -> Tuple[CopyCLIOption
|
|||||||
|
|
||||||
|
|
||||||
def resolve_file_spec(spec: str, is_glob: bool) -> Iterator[str]:
|
def resolve_file_spec(spec: str, is_glob: bool) -> Iterator[str]:
|
||||||
ans = os.path.expandvars(os.path.expanduser(spec))
|
ans = os.path.expandvars(expand_home(spec))
|
||||||
if not os.path.isabs(ans):
|
if not os.path.isabs(ans):
|
||||||
ans = os.path.expanduser(f'~/{ans}')
|
ans = expand_home(f'~/{ans}')
|
||||||
if is_glob:
|
if is_glob:
|
||||||
files = glob.glob(ans)
|
files = glob.glob(ans)
|
||||||
if not files:
|
if not files:
|
||||||
@ -93,7 +94,7 @@ def parse_copy_instructions(val: str) -> Iterable[Tuple[str, CopyInstruction]]:
|
|||||||
raise CopyCLIError('No files to copy specified')
|
raise CopyCLIError('No files to copy specified')
|
||||||
if len(locations) > 1 and opts.dest:
|
if len(locations) > 1 and opts.dest:
|
||||||
raise CopyCLIError('Specifying a remote location with more than one file is not supported')
|
raise CopyCLIError('Specifying a remote location with more than one file is not supported')
|
||||||
home = os.path.expanduser('~')
|
home = home_path()
|
||||||
for loc in locations:
|
for loc in locations:
|
||||||
arcname = get_arcname(loc, opts.dest, home)
|
arcname = get_arcname(loc, opts.dest, home)
|
||||||
yield loc, CopyInstruction(arcname, tuple(opts.exclude))
|
yield loc, CopyInstruction(arcname, tuple(opts.exclude))
|
||||||
|
|||||||
@ -11,6 +11,7 @@ from functools import lru_cache
|
|||||||
from kittens.ssh.config import load_config, options_for_host
|
from kittens.ssh.config import load_config, options_for_host
|
||||||
from kittens.ssh.main import bootstrap_script, get_connection_data
|
from kittens.ssh.main import bootstrap_script, get_connection_data
|
||||||
from kittens.ssh.options.utils import DELETE_ENV_VAR
|
from kittens.ssh.options.utils import DELETE_ENV_VAR
|
||||||
|
from kittens.transfer.utils import set_paths
|
||||||
from kitty.constants import is_macos
|
from kitty.constants import is_macos
|
||||||
from kitty.fast_data_types import CURSOR_BEAM
|
from kitty.fast_data_types import CURSOR_BEAM
|
||||||
from kitty.options.utils import shell_integration
|
from kitty.options.utils import shell_integration
|
||||||
@ -20,6 +21,12 @@ from . import BaseTest
|
|||||||
from .shell_integration import bash_ok, basic_shell_env
|
from .shell_integration import bash_ok, basic_shell_env
|
||||||
|
|
||||||
|
|
||||||
|
def files_in(path):
|
||||||
|
for record in os.walk(path):
|
||||||
|
for f in record[-1]:
|
||||||
|
yield os.path.relpath(os.path.join(record[0], f), path)
|
||||||
|
|
||||||
|
|
||||||
class SSHKitten(BaseTest):
|
class SSHKitten(BaseTest):
|
||||||
|
|
||||||
def test_basic_pty_operations(self):
|
def test_basic_pty_operations(self):
|
||||||
@ -70,7 +77,42 @@ print(' '.join(map(str, buf)))'''), lines=13, cols=77)
|
|||||||
return tuple(sh for sh in ('dash', 'zsh', 'bash', 'posh', 'sh') if shutil.which(sh))
|
return tuple(sh for sh in ('dash', 'zsh', 'bash', 'posh', 'sh') if shutil.which(sh))
|
||||||
|
|
||||||
def test_ssh_copy(self):
|
def test_ssh_copy(self):
|
||||||
pass
|
simple_data = 'rkjlhfwf9whoaa'
|
||||||
|
|
||||||
|
def touch(p):
|
||||||
|
with open(os.path.join(local_home, p), 'w') as f:
|
||||||
|
f.write(simple_data)
|
||||||
|
|
||||||
|
for sh in self.all_possible_sh:
|
||||||
|
with self.subTest(sh=sh), tempfile.TemporaryDirectory() as remote_home, tempfile.TemporaryDirectory() as local_home, set_paths(home=local_home):
|
||||||
|
tuple(map(touch, 'simple-file g.1 g.2'.split()))
|
||||||
|
os.makedirs(f'{local_home}/d1/d2/d3')
|
||||||
|
touch('d1/d2/x')
|
||||||
|
os.symlink('d2/x', f'{local_home}/d1/y')
|
||||||
|
|
||||||
|
conf = '''\
|
||||||
|
copy simple-file
|
||||||
|
copy --glob g.*
|
||||||
|
copy d1
|
||||||
|
'''
|
||||||
|
copy = load_config(overrides=filter(None, conf.splitlines()))['*'].copy
|
||||||
|
self.check_bootstrap(
|
||||||
|
sh, remote_home, extra_exec='env; exit 0', SHELL_INTEGRATION_VALUE='',
|
||||||
|
ssh_opts={'copy': copy}
|
||||||
|
)
|
||||||
|
self.assertTrue(os.path.lexists(f'{remote_home}/.terminfo/78'))
|
||||||
|
self.assertTrue(os.path.exists(f'{remote_home}/.terminfo/78/xterm-kitty'))
|
||||||
|
self.assertTrue(os.path.exists(f'{remote_home}/.terminfo/x/xterm-kitty'))
|
||||||
|
with open(os.path.join(remote_home, 'simple-file'), 'r') as f:
|
||||||
|
self.ae(f.read(), simple_data)
|
||||||
|
self.assertTrue(os.path.lexists(f'{remote_home}/d1/y'))
|
||||||
|
self.assertTrue(os.path.exists(f'{remote_home}/d1/y'))
|
||||||
|
self.ae(os.readlink(f'{remote_home}/d1/y'), 'd2/x')
|
||||||
|
contents = set(files_in(remote_home))
|
||||||
|
contents.discard('.zshrc') # added by check_bootstrap()
|
||||||
|
self.ae(contents, {
|
||||||
|
'g.1', 'g.2', '.terminfo/kitty.terminfo', 'simple-file', '.terminfo/x/xterm-kitty', 'd1/d2/x', 'd1/y',
|
||||||
|
})
|
||||||
|
|
||||||
def test_ssh_env_vars(self):
|
def test_ssh_env_vars(self):
|
||||||
for sh in self.all_possible_sh:
|
for sh in self.all_possible_sh:
|
||||||
|
|||||||
@ -41,6 +41,7 @@ mv_files_and_dirs() {
|
|||||||
cwd="$PWD";
|
cwd="$PWD";
|
||||||
cd "$1";
|
cd "$1";
|
||||||
command find . -type d -exec mkdir -p "$2/{}" ";"
|
command find . -type d -exec mkdir -p "$2/{}" ";"
|
||||||
|
command find . -type l -exec sh -c "tgt=\$(command readlink -n \"{}\"); command ln -s \"\$tgt\" \"$2/{}\"; command rm -f \"{}\"" ";"
|
||||||
command find . -type f -exec mv "{}" "$2/{}" ";"
|
command find . -type f -exec mv "{}" "$2/{}" ";"
|
||||||
cd "$cwd";
|
cd "$cwd";
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user