mirror of
https://github.com/kovidgoyal/kitty
synced 2026-06-08 14:18:26 +02:00
Misc fixes
This commit is contained in:
@@ -171,9 +171,10 @@ terminal emulator::
|
|||||||
→ action=file id=someid file_id=f1 name=/some/path
|
→ action=file id=someid file_id=f1 name=/some/path
|
||||||
...
|
...
|
||||||
|
|
||||||
|
The client must not send requests for directories and absolute symlinks.
|
||||||
The terminal emulator replies with the data for the files, as a sequence of
|
The terminal emulator replies with the data for the files, as a sequence of
|
||||||
``data`` commands each with a chunk of data no larger than ``4096`` bytes,
|
``data`` commands each with a chunk of data no larger than ``4096`` bytes,
|
||||||
for each file (the terminal emulator should send the data for
|
for each file (the terminal emulator must send the data for
|
||||||
one file at a time)::
|
one file at a time)::
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -237,13 +237,13 @@ func (self *remote_file) apply_metadata() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func new_remote_file(opts *Options, ftc *FileTransmissionCommand) (*remote_file, error) {
|
func new_remote_file(opts *Options, ftc *FileTransmissionCommand, file_id uint64) (*remote_file, error) {
|
||||||
spec_id, err := strconv.Atoi(ftc.File_id)
|
spec_id, err := strconv.Atoi(ftc.File_id)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
ans := &remote_file{
|
ans := &remote_file{
|
||||||
expected_size: ftc.Size, ftype: ftc.Ftype, mtime: ftc.Mtime, spec_id: spec_id,
|
expected_size: ftc.Size, ftype: ftc.Ftype, mtime: ftc.Mtime, spec_id: spec_id, file_id: strconv.FormatUint(file_id, 10),
|
||||||
permissions: ftc.Permissions, remote_path: ftc.Name, display_name: wcswidth.StripEscapeCodes(ftc.Name),
|
permissions: ftc.Permissions, remote_path: ftc.Name, display_name: wcswidth.StripEscapeCodes(ftc.Name),
|
||||||
remote_id: ftc.Status, remote_target: string(ftc.Data), parent: ftc.Parent,
|
remote_id: ftc.Status, remote_target: string(ftc.Data), parent: ftc.Parent,
|
||||||
}
|
}
|
||||||
@@ -306,6 +306,7 @@ func (self *receive_progress_tracker) file_written(af *remote_file, amt int64, i
|
|||||||
|
|
||||||
type manager struct {
|
type manager struct {
|
||||||
request_id string
|
request_id string
|
||||||
|
file_id_counter uint64
|
||||||
cli_opts *Options
|
cli_opts *Options
|
||||||
spec []string
|
spec []string
|
||||||
dest string
|
dest string
|
||||||
@@ -348,11 +349,19 @@ var files_done error = errors.New("files done")
|
|||||||
func (self *manager) request_files() transmit_iterator {
|
func (self *manager) request_files() transmit_iterator {
|
||||||
pos := 0
|
pos := 0
|
||||||
return func(queue_write func(string) loop.IdType) (last_write_id loop.IdType, err error) {
|
return func(queue_write func(string) loop.IdType) (last_write_id loop.IdType, err error) {
|
||||||
if pos >= len(self.files) {
|
var f *remote_file
|
||||||
|
for pos < len(self.files) {
|
||||||
|
f = self.files[pos]
|
||||||
|
pos++
|
||||||
|
if f.ftype == FileType_directory || (f.ftype == FileType_link && f.remote_target != "") {
|
||||||
|
f = nil
|
||||||
|
} else {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if f == nil {
|
||||||
return 0, files_done
|
return 0, files_done
|
||||||
}
|
}
|
||||||
f := self.files[pos]
|
|
||||||
pos++
|
|
||||||
read_signature := self.use_rsync
|
read_signature := self.use_rsync
|
||||||
if read_signature && f.ftype == FileType_regular {
|
if read_signature && f.ftype == FileType_regular {
|
||||||
if s, err := os.Lstat(f.expanded_local_path); err == nil {
|
if s, err := os.Lstat(f.expanded_local_path); err == nil {
|
||||||
@@ -483,7 +492,13 @@ func (self *manager) finalize_transfer() (err error) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if lt == "" {
|
||||||
|
return fmt.Errorf("Symlink %s sent without target", f.expanded_local_path)
|
||||||
|
}
|
||||||
os.Remove(f.expanded_local_path)
|
os.Remove(f.expanded_local_path)
|
||||||
|
if err = os.MkdirAll(filepath.Dir(f.expanded_local_path), 0o755); err != nil {
|
||||||
|
return fmt.Errorf("Failed to create directory with error: %w", err)
|
||||||
|
}
|
||||||
if err = os.Symlink(lt, f.expanded_local_path); err != nil {
|
if err = os.Symlink(lt, f.expanded_local_path); err != nil {
|
||||||
return fmt.Errorf(`Failed to create symlink with error: %w`, err)
|
return fmt.Errorf(`Failed to create symlink with error: %w`, err)
|
||||||
}
|
}
|
||||||
@@ -534,7 +549,8 @@ func (self *manager) on_file_transfer_response(ftc *FileTransmissionCommand) (er
|
|||||||
return fmt.Errorf(`Unexpected response from terminal (out-of-range file_id): %s`, ftc.String())
|
return fmt.Errorf(`Unexpected response from terminal (out-of-range file_id): %s`, ftc.String())
|
||||||
}
|
}
|
||||||
self.spec_counts[fid] += 1
|
self.spec_counts[fid] += 1
|
||||||
if rf, err := new_remote_file(self.cli_opts, ftc); err == nil {
|
self.file_id_counter++
|
||||||
|
if rf, err := new_remote_file(self.cli_opts, ftc, self.file_id_counter); err == nil {
|
||||||
self.files = append(self.files, rf)
|
self.files = append(self.files, rf)
|
||||||
} else {
|
} else {
|
||||||
return err
|
return err
|
||||||
|
|||||||
Reference in New Issue
Block a user