Skip to content

Commit 7706c75

Browse files
committed
support upload one time while trz is running
1 parent f462ee5 commit 7706c75

File tree

3 files changed

+70
-5
lines changed

3 files changed

+70
-5
lines changed

go.mod

+2-2
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,10 @@ require (
1010
github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510
1111
github.com/klauspost/compress v1.17.9
1212
github.com/lucasb-eyer/go-colorful v1.2.0
13-
github.com/mattn/go-runewidth v0.0.15
13+
github.com/mattn/go-runewidth v0.0.16
1414
github.com/ncruces/zenity v0.10.13
1515
github.com/stretchr/testify v1.8.4
16-
github.com/trzsz/go-arg v1.5.3
16+
github.com/trzsz/go-arg v1.5.4
1717
github.com/trzsz/promptui v0.10.7
1818
golang.org/x/sys v0.22.0
1919
golang.org/x/term v0.22.0

go.sum

+4-3
Original file line numberDiff line numberDiff line change
@@ -35,8 +35,9 @@ github.com/lucasb-eyer/go-colorful v1.2.0 h1:1nnpGOrhyZZuNyfu1QjKiUICQ74+3FNCN69
3535
github.com/lucasb-eyer/go-colorful v1.2.0/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i7ruzyGqttikkLy0=
3636
github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=
3737
github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
38-
github.com/mattn/go-runewidth v0.0.15 h1:UNAjwbU9l54TA3KzvqLGxwWjHmMgBUVhBiTjelZgg3U=
3938
github.com/mattn/go-runewidth v0.0.15/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w=
39+
github.com/mattn/go-runewidth v0.0.16 h1:E5ScNMtiwvlvB5paMFdw9p4kSQzbXFikJ5SQO6TULQc=
40+
github.com/mattn/go-runewidth v0.0.16/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w=
4041
github.com/muesli/termenv v0.15.2 h1:GohcuySI0QmI3wN8Ok9PtKGkgkFIk7y6Vpb5PvrY+Wo=
4142
github.com/muesli/termenv v0.15.2/go.mod h1:Epx+iuz8sNs7mNKhxzH4fWXGNpZwUaJKRS1noLXviQ8=
4243
github.com/ncruces/zenity v0.10.13 h1:0Gd/EdjjEQIhrFaJ05Q5ZvyjlcjnorlZpdzgUzqQIH0=
@@ -54,8 +55,8 @@ github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXf
5455
github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
5556
github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk=
5657
github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
57-
github.com/trzsz/go-arg v1.5.3 h1:eIDwDEmvSahtr5HpQOLrSa+YMqWQQ0H20xx60XgXQJw=
58-
github.com/trzsz/go-arg v1.5.3/go.mod h1:IC6Z/FiVH7uYvcbp1/gJhDYCFPS/GkL0APYakVvgY4I=
58+
github.com/trzsz/go-arg v1.5.4 h1:8cuwV8F1UvlKRXJcdLG1cSZNGXkRped+U1rz17M7Kac=
59+
github.com/trzsz/go-arg v1.5.4/go.mod h1:IC6Z/FiVH7uYvcbp1/gJhDYCFPS/GkL0APYakVvgY4I=
5960
github.com/trzsz/promptui v0.10.7 h1:77uBrmsIPYYJS/9n+zwFRhwOz82EKXkkdjOiWSEUPpk=
6061
github.com/trzsz/promptui v0.10.7/go.mod h1:9dp59ixe32qBV9GjDxQ1PDWwbzHjTzveZenQwEoVHbg=
6162
go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=

trzsz/filter.go

+64
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,9 @@ type TrzszFilter struct {
9090
tunnelConnector atomic.Pointer[func(int) net.Conn]
9191
osc52Sequence *bytes.Buffer
9292
progressColorPair atomic.Pointer[string]
93+
oneTimeUploadFiles []string
94+
oneTimeUploadResult chan error
95+
hidingCursor bool
9396
}
9497

9598
// NewTrzszFilter create a TrzszFilter to support trzsz ( trz / tsz ).
@@ -166,6 +169,40 @@ func (filter *TrzszFilter) UploadFiles(filePaths []string) error {
166169
return nil
167170
}
168171

172+
// OneTimeUpload upload one time while the server is already running trz / rz.
173+
func (filter *TrzszFilter) OneTimeUpload(filePaths []string) (<-chan error, error) {
174+
if len(filePaths) == 0 {
175+
return nil, fmt.Errorf("nothing to upload")
176+
}
177+
for _, path := range filePaths {
178+
info, err := os.Stat(path)
179+
if err != nil {
180+
return nil, err
181+
}
182+
if _, err := checkPathsReadable([]string{path}, info.IsDir()); err != nil {
183+
return nil, err
184+
}
185+
}
186+
filter.oneTimeUploadFiles = filePaths
187+
filter.oneTimeUploadResult = make(chan error, 1)
188+
go func() {
189+
time.Sleep(10 * time.Second)
190+
if filter.oneTimeUploadFiles != nil {
191+
filter.oneTimeUploadResult <- fmt.Errorf(
192+
"The upload did not start, possibly because trzsz is not installed or trz is not found on the server")
193+
}
194+
}()
195+
return filter.oneTimeUploadResult, nil
196+
}
197+
198+
// ResetTerminal reset the terminal settings.
199+
func (filter *TrzszFilter) ResetTerminal() {
200+
if filter.hidingCursor {
201+
showCursor(filter.clientOut)
202+
filter.hidingCursor = false
203+
}
204+
}
205+
169206
// SetDefaultUploadPath set the default open path while choosing upload files.
170207
func (filter *TrzszFilter) SetDefaultUploadPath(path string) {
171208
if path == "" {
@@ -315,6 +352,11 @@ func (filter *TrzszFilter) chooseDownloadPath() (string, error) {
315352
}
316353

317354
func (filter *TrzszFilter) chooseUploadPaths(directory bool) ([]string, error) {
355+
if len(filter.oneTimeUploadFiles) > 0 {
356+
files := filter.oneTimeUploadFiles
357+
filter.oneTimeUploadFiles = nil
358+
return files, nil
359+
}
318360
if filter.dragging.Load() {
319361
files := filter.resetDragFiles()
320362
return files, nil
@@ -465,8 +507,10 @@ func (filter *TrzszFilter) handleTrzsz() {
465507
err = filter.downloadFiles(transfer)
466508
case 'R':
467509
err = filter.uploadFiles(transfer, false)
510+
filter.setOneTimeUploadResult(err)
468511
case 'D':
469512
err = filter.uploadFiles(transfer, true)
513+
filter.setOneTimeUploadResult(err)
470514
}
471515
if err != nil {
472516
transfer.clientError(err)
@@ -481,6 +525,15 @@ func (filter *TrzszFilter) handleTrzsz() {
481525
}
482526
}
483527

528+
func (filter *TrzszFilter) setOneTimeUploadResult(err error) {
529+
if filter.oneTimeUploadResult == nil {
530+
return
531+
}
532+
filter.oneTimeUploadResult <- err
533+
close(filter.oneTimeUploadResult)
534+
filter.oneTimeUploadResult = nil
535+
}
536+
484537
func (filter *TrzszFilter) resetDragFiles() []string {
485538
if !filter.dragging.Load() {
486539
return nil
@@ -742,6 +795,7 @@ func (filter *TrzszFilter) wrapOutput() {
742795
continue
743796
} else {
744797
showCursor(filter.clientOut)
798+
filter.hidingCursor = false
745799
filter.zmodem.CompareAndSwap(zmodem, nil)
746800
}
747801
}
@@ -775,11 +829,20 @@ func (filter *TrzszFilter) wrapOutput() {
775829
_ = writeAll(filter.clientOut, buf)
776830
if filter.zmodem.CompareAndSwap(nil, zmodem) {
777831
hideCursor(filter.clientOut)
832+
filter.hidingCursor = true
778833
go zmodem.handleZmodemEvent(filter.logger, filter.serverIn, filter.clientOut,
779834
func() ([]string, error) {
780835
return filter.chooseUploadPaths(false)
781836
},
782837
filter.chooseDownloadPath)
838+
if filter.oneTimeUploadResult != nil {
839+
go func() {
840+
for zmodem.isTransferringFiles() {
841+
time.Sleep(100 * time.Millisecond)
842+
}
843+
filter.setOneTimeUploadResult(nil)
844+
}()
845+
}
783846
continue
784847
}
785848
}
@@ -788,6 +851,7 @@ func (filter *TrzszFilter) wrapOutput() {
788851
_ = writeAll(filter.clientOut, buf)
789852
}
790853
if err == io.EOF {
854+
time.Sleep(100 * time.Millisecond)
791855
continue // ignore output EOF
792856
}
793857
}

0 commit comments

Comments
 (0)