diff --git a/docs/changelog.rst b/docs/changelog.rst index 5a0834f3fe9..c97d994255d 100644 --- a/docs/changelog.rst +++ b/docs/changelog.rst @@ -87,6 +87,8 @@ Detailed list of changes - kitten @: Fix a regression connecting to TCP sockets using plain IP addresses rather than hostnames (:iss:`7794`) +- diff kitten: Fix a regression that broke diffing against remote files (:iss:`7797`) + 0.36.1 [2024-08-24] ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ diff --git a/kittens/diff/main.go b/kittens/diff/main.go index 91005bfb8f2..e36c42c335a 100644 --- a/kittens/diff/main.go +++ b/kittens/diff/main.go @@ -58,7 +58,7 @@ func get_ssh_file(hostname, rpath string) (string, error) { for strings.HasPrefix(rpath, "/") { rpath = rpath[1:] } - cmd := []string{ssh.SSHExe(), hostname, "tar", "-c", "-f", "-"} + cmd := []string{ssh.SSHExe(), hostname, "tar", "--dereference", "--create", "--file", "-"} if is_abs { cmd = append(cmd, "-C", "/") } diff --git a/tools/utils/tar.go b/tools/utils/tar.go index 1d6ad996383..8715c84baab 100644 --- a/tools/utils/tar.go +++ b/tools/utils/tar.go @@ -48,6 +48,7 @@ func ExtractAllFromTar(tr *tar.Reader, dest_path string, optss ...TarExtractOpti var hdr *tar.Header hdr, err = tr.Next() if errors.Is(err, io.EOF) { + err = nil break } if err != nil { @@ -70,6 +71,9 @@ func ExtractAllFromTar(tr *tar.Reader, dest_path string, optss ...TarExtractOpti } case tar.TypeReg, tar.TypeRegA: var d *os.File + if err = os.MkdirAll(filepath.Dir(dest), 0o700); err != nil { + return + } if d, err = os.Create(dest); err != nil { return } @@ -82,6 +86,9 @@ func ExtractAllFromTar(tr *tar.Reader, dest_path string, optss ...TarExtractOpti return } case tar.TypeLink: + if err = os.MkdirAll(filepath.Dir(dest), 0o700); err != nil { + return + } if err = os.Link(hdr.Linkname, dest); err != nil { return } @@ -89,6 +96,9 @@ func ExtractAllFromTar(tr *tar.Reader, dest_path string, optss ...TarExtractOpti return } case tar.TypeSymlink: + if err = os.MkdirAll(filepath.Dir(dest), 0o700); err != nil { + return + } if err = os.Symlink(hdr.Linkname, dest); err != nil { return }