From 4147c27f7c5990365b21514acdcff42aff81712b Mon Sep 17 00:00:00 2001 From: yincong Date: Mon, 13 Jan 2025 13:58:15 +0800 Subject: [PATCH 1/7] dir add slash --- src/archive/zip/writer.go | 1 + 1 file changed, 1 insertion(+) diff --git a/src/archive/zip/writer.go b/src/archive/zip/writer.go index cbe5ba262747f6..abb91de9524493 100644 --- a/src/archive/zip/writer.go +++ b/src/archive/zip/writer.go @@ -526,6 +526,7 @@ func (w *Writer) AddFS(fsys fs.FS) error { return err } if d.IsDir() { + h.Name += "/" return nil } f, err := fsys.Open(name) From d68d049b132b952595ad50ff85b3ee5615de489f Mon Sep 17 00:00:00 2001 From: yincong Date: Mon, 13 Jan 2025 18:00:25 +0800 Subject: [PATCH 2/7] update unit test --- src/archive/zip/writer_test.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/archive/zip/writer_test.go b/src/archive/zip/writer_test.go index 27a99b6b3a13b9..f306f4b7cb4ff7 100644 --- a/src/archive/zip/writer_test.go +++ b/src/archive/zip/writer_test.go @@ -642,6 +642,9 @@ func TestWriterAddFS(t *testing.T) { t.Fatal(err) } for i, wt := range tests { + if wt.Mode.IsDir() { + wt.Name += "/" + } testReadFile(t, r.File[i], &wt) } } From 4e338b6d4603a830107108c0ac91aa7a21d43385 Mon Sep 17 00:00:00 2001 From: yincong Date: Thu, 16 Jan 2025 10:42:47 +0800 Subject: [PATCH 3/7] tar dir add slash --- src/archive/tar/writer.go | 3 +++ src/archive/tar/writer_test.go | 6 +++++- src/archive/zip/writer.go | 4 +++- 3 files changed, 11 insertions(+), 2 deletions(-) diff --git a/src/archive/tar/writer.go b/src/archive/tar/writer.go index 059669767f2b9d..f966c5b4c648f5 100644 --- a/src/archive/tar/writer.go +++ b/src/archive/tar/writer.go @@ -424,6 +424,9 @@ func (tw *Writer) AddFS(fsys fs.FS) error { return err } h.Name = name + if d.IsDir() { + h.Name += "/" + } if err := tw.WriteHeader(h); err != nil { return err } diff --git a/src/archive/tar/writer_test.go b/src/archive/tar/writer_test.go index 2a01915d368c5a..7b10bf6a700d7f 100644 --- a/src/archive/tar/writer_test.go +++ b/src/archive/tar/writer_test.go @@ -1382,7 +1382,11 @@ func TestWriterAddFS(t *testing.T) { t.Fatal(err) } - if hdr.Name != name { + tmpName := name + if entryInfo.IsDir() { + tmpName += "/" + } + if hdr.Name != tmpName { t.Errorf("test fs has filename %v; archive header has %v", name, hdr.Name) } diff --git a/src/archive/zip/writer.go b/src/archive/zip/writer.go index abb91de9524493..0a310054e37678 100644 --- a/src/archive/zip/writer.go +++ b/src/archive/zip/writer.go @@ -520,13 +520,15 @@ func (w *Writer) AddFS(fsys fs.FS) error { return err } h.Name = name + if d.IsDir() { + h.Name += "/" + } h.Method = Deflate fw, err := w.CreateHeader(h) if err != nil { return err } if d.IsDir() { - h.Name += "/" return nil } f, err := fsys.Open(name) From ebac3e8ec15ab2b7ce5e170742b3f2ee0f98eca3 Mon Sep 17 00:00:00 2001 From: yincong Date: Fri, 17 Jan 2025 10:13:44 +0800 Subject: [PATCH 4/7] optimize --- src/archive/tar/reader.go | 3 +++ src/archive/tar/writer.go | 3 --- src/archive/zip/reader.go | 4 ++++ src/archive/zip/writer.go | 3 --- 4 files changed, 7 insertions(+), 6 deletions(-) diff --git a/src/archive/tar/reader.go b/src/archive/tar/reader.go index 8483fb52a28f66..00ce3120698615 100644 --- a/src/archive/tar/reader.go +++ b/src/archive/tar/reader.go @@ -380,6 +380,9 @@ func (tr *Reader) readHeader() (*Header, *block, error) { v7 := tr.blk.toV7() hdr.Typeflag = v7.typeFlag()[0] hdr.Name = p.parseString(v7.name()) + if hdr.FileInfo().IsDir() && !strings.HasSuffix(hdr.Name, "/") { + hdr.Name += "/" + } hdr.Linkname = p.parseString(v7.linkName()) hdr.Size = p.parseNumeric(v7.size()) hdr.Mode = p.parseNumeric(v7.mode()) diff --git a/src/archive/tar/writer.go b/src/archive/tar/writer.go index f966c5b4c648f5..059669767f2b9d 100644 --- a/src/archive/tar/writer.go +++ b/src/archive/tar/writer.go @@ -424,9 +424,6 @@ func (tw *Writer) AddFS(fsys fs.FS) error { return err } h.Name = name - if d.IsDir() { - h.Name += "/" - } if err := tw.WriteHeader(h); err != nil { return err } diff --git a/src/archive/zip/reader.go b/src/archive/zip/reader.go index 2246d56558bbee..55946149f3f0d3 100644 --- a/src/archive/zip/reader.go +++ b/src/archive/zip/reader.go @@ -384,6 +384,10 @@ func readDirectoryHeader(f *File, r io.Reader) error { return err } f.Name = string(d[:filenameLen]) + if f.FileInfo().IsDir() && !strings.HasSuffix(f.Name, "/") { + f.Name += "/" + } + f.Extra = d[filenameLen : filenameLen+extraLen] f.Comment = string(d[filenameLen+extraLen:]) diff --git a/src/archive/zip/writer.go b/src/archive/zip/writer.go index 0a310054e37678..cbe5ba262747f6 100644 --- a/src/archive/zip/writer.go +++ b/src/archive/zip/writer.go @@ -520,9 +520,6 @@ func (w *Writer) AddFS(fsys fs.FS) error { return err } h.Name = name - if d.IsDir() { - h.Name += "/" - } h.Method = Deflate fw, err := w.CreateHeader(h) if err != nil { From c5d79ca79281cc995e4b8c560dc4c2ed5c11c0f6 Mon Sep 17 00:00:00 2001 From: yincong Date: Fri, 17 Jan 2025 10:15:16 +0800 Subject: [PATCH 5/7] format --- src/archive/zip/writer_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/archive/zip/writer_test.go b/src/archive/zip/writer_test.go index f306f4b7cb4ff7..44592ce8318826 100644 --- a/src/archive/zip/writer_test.go +++ b/src/archive/zip/writer_test.go @@ -633,7 +633,7 @@ func TestWriterAddFS(t *testing.T) { t.Fatal(err) } - // Add subfolder into fsys to match what we'll read from the tar. + // Add subfolder into fsys to match what we'll read from the zip. tests = append(tests[:2:2], WriteTest{Name: "subfolder", Mode: 0o555 | os.ModeDir}, tests[2]) // read it back From 0ebc591e8e99a127988108917b529df75581cc4e Mon Sep 17 00:00:00 2001 From: yincong Date: Mon, 20 Jan 2025 10:29:33 +0800 Subject: [PATCH 6/7] optimize --- src/archive/tar/reader.go | 3 --- src/archive/tar/writer.go | 2 +- src/archive/zip/reader.go | 4 ---- src/archive/zip/struct.go | 4 ++++ src/archive/zip/writer.go | 2 +- 5 files changed, 6 insertions(+), 9 deletions(-) diff --git a/src/archive/tar/reader.go b/src/archive/tar/reader.go index 00ce3120698615..8483fb52a28f66 100644 --- a/src/archive/tar/reader.go +++ b/src/archive/tar/reader.go @@ -380,9 +380,6 @@ func (tr *Reader) readHeader() (*Header, *block, error) { v7 := tr.blk.toV7() hdr.Typeflag = v7.typeFlag()[0] hdr.Name = p.parseString(v7.name()) - if hdr.FileInfo().IsDir() && !strings.HasSuffix(hdr.Name, "/") { - hdr.Name += "/" - } hdr.Linkname = p.parseString(v7.linkName()) hdr.Size = p.parseNumeric(v7.size()) hdr.Mode = p.parseNumeric(v7.mode()) diff --git a/src/archive/tar/writer.go b/src/archive/tar/writer.go index 059669767f2b9d..caea8efab7a4e7 100644 --- a/src/archive/tar/writer.go +++ b/src/archive/tar/writer.go @@ -423,7 +423,7 @@ func (tw *Writer) AddFS(fsys fs.FS) error { if err != nil { return err } - h.Name = name + h.Name = strings.TrimSuffix(name, info.Name()) + h.Name if err := tw.WriteHeader(h); err != nil { return err } diff --git a/src/archive/zip/reader.go b/src/archive/zip/reader.go index 55946149f3f0d3..2246d56558bbee 100644 --- a/src/archive/zip/reader.go +++ b/src/archive/zip/reader.go @@ -384,10 +384,6 @@ func readDirectoryHeader(f *File, r io.Reader) error { return err } f.Name = string(d[:filenameLen]) - if f.FileInfo().IsDir() && !strings.HasSuffix(f.Name, "/") { - f.Name += "/" - } - f.Extra = d[filenameLen : filenameLen+extraLen] f.Comment = string(d[filenameLen+extraLen:]) diff --git a/src/archive/zip/struct.go b/src/archive/zip/struct.go index 3ebf39f5a694a2..68377049b5fc79 100644 --- a/src/archive/zip/struct.go +++ b/src/archive/zip/struct.go @@ -201,6 +201,7 @@ func (fi headerFileInfo) String() string { // of the returned header to provide the full path name of the file. // If compression is desired, callers should set the FileHeader.Method // field; it is unset by default. +// If fi describes a directory, a slash is appended to the name. func FileInfoHeader(fi fs.FileInfo) (*FileHeader, error) { size := fi.Size() fh := &FileHeader{ @@ -214,6 +215,9 @@ func FileInfoHeader(fi fs.FileInfo) (*FileHeader, error) { } else { fh.UncompressedSize = uint32(fh.UncompressedSize64) } + if fi.IsDir() { + fh.Name = fh.Name + "/" + } return fh, nil } diff --git a/src/archive/zip/writer.go b/src/archive/zip/writer.go index cbe5ba262747f6..197c627796a6d3 100644 --- a/src/archive/zip/writer.go +++ b/src/archive/zip/writer.go @@ -519,7 +519,7 @@ func (w *Writer) AddFS(fsys fs.FS) error { if err != nil { return err } - h.Name = name + h.Name = strings.TrimSuffix(name, info.Name()) + h.Name h.Method = Deflate fw, err := w.CreateHeader(h) if err != nil { From 6e0fba07dd128e20e32a3a6258edf80ee91d4690 Mon Sep 17 00:00:00 2001 From: yincong Date: Wed, 22 Jan 2025 10:14:06 +0800 Subject: [PATCH 7/7] optimize --- src/archive/tar/writer.go | 5 ++++- src/archive/zip/struct.go | 4 ---- src/archive/zip/writer.go | 5 ++++- 3 files changed, 8 insertions(+), 6 deletions(-) diff --git a/src/archive/tar/writer.go b/src/archive/tar/writer.go index caea8efab7a4e7..f966c5b4c648f5 100644 --- a/src/archive/tar/writer.go +++ b/src/archive/tar/writer.go @@ -423,7 +423,10 @@ func (tw *Writer) AddFS(fsys fs.FS) error { if err != nil { return err } - h.Name = strings.TrimSuffix(name, info.Name()) + h.Name + h.Name = name + if d.IsDir() { + h.Name += "/" + } if err := tw.WriteHeader(h); err != nil { return err } diff --git a/src/archive/zip/struct.go b/src/archive/zip/struct.go index 68377049b5fc79..3ebf39f5a694a2 100644 --- a/src/archive/zip/struct.go +++ b/src/archive/zip/struct.go @@ -201,7 +201,6 @@ func (fi headerFileInfo) String() string { // of the returned header to provide the full path name of the file. // If compression is desired, callers should set the FileHeader.Method // field; it is unset by default. -// If fi describes a directory, a slash is appended to the name. func FileInfoHeader(fi fs.FileInfo) (*FileHeader, error) { size := fi.Size() fh := &FileHeader{ @@ -215,9 +214,6 @@ func FileInfoHeader(fi fs.FileInfo) (*FileHeader, error) { } else { fh.UncompressedSize = uint32(fh.UncompressedSize64) } - if fi.IsDir() { - fh.Name = fh.Name + "/" - } return fh, nil } diff --git a/src/archive/zip/writer.go b/src/archive/zip/writer.go index 197c627796a6d3..0a310054e37678 100644 --- a/src/archive/zip/writer.go +++ b/src/archive/zip/writer.go @@ -519,7 +519,10 @@ func (w *Writer) AddFS(fsys fs.FS) error { if err != nil { return err } - h.Name = strings.TrimSuffix(name, info.Name()) + h.Name + h.Name = name + if d.IsDir() { + h.Name += "/" + } h.Method = Deflate fw, err := w.CreateHeader(h) if err != nil {