MCPcopy
hub / github.com/kopia/kopia / untar

Function untar

tools/gettool/autodownload/autodownload.go:65–125  ·  view source on GitHub ↗
(dir string, r io.Reader, stripPathComponents int)

Source from the content-addressed store, hash-verified

63}
64
65func untar(dir string, r io.Reader, stripPathComponents int) error {
66 var (
67 err error
68 header *tar.Header
69 )
70
71 if err := os.MkdirAll(dir, dirMode); err != nil {
72 return errors.Wrapf(err, "error creating output directory %q", dir)
73 }
74
75 outDir, err := os.OpenRoot(dir)
76 if err != nil {
77 return errors.Wrapf(err, "could not open output directory root %q", dir)
78 }
79
80 defer outDir.Close() //nolint:errcheck
81
82 tr := tar.NewReader(r)
83
84 for header, err = tr.Next(); err == nil; header, err = tr.Next() {
85 if header == nil {
86 continue
87 }
88
89 target, ok := stripLeadingPath(header.Name, stripPathComponents)
90 if !ok {
91 continue
92 }
93
94 if derr := outDir.MkdirAll(filepath.Dir(target), dirMode); derr != nil {
95 return errors.Wrap(derr, "error creating parent directory")
96 }
97
98 switch header.Typeflag {
99 case tar.TypeDir:
100 if derr := outDir.MkdirAll(target, dirMode); derr != nil {
101 return errors.Wrap(derr, "error creating directory")
102 }
103
104 case tar.TypeReg:
105 //nolint:gosec
106 if ferr := createFile(outDir, target, os.FileMode(header.Mode), header.ModTime, tr); ferr != nil {
107 return errors.Wrapf(ferr, "error creating file %v", target)
108 }
109
110 case tar.TypeSymlink:
111 if ferr := createSymlink(outDir, target, header.Linkname); ferr != nil {
112 return errors.Wrapf(ferr, "error creating file %v", target)
113 }
114
115 default:
116 return errors.Errorf("unsupported tar entry: %v %v", header.Name, header.Typeflag)
117 }
118 }
119
120 if errors.Is(err, io.EOF) {
121 return nil
122 }

Callers 1

downloadInternalFunction · 0.85

Calls 7

stripLeadingPathFunction · 0.85
createFileFunction · 0.85
createSymlinkFunction · 0.85
ErrorfMethod · 0.80
MkdirAllMethod · 0.65
CloseMethod · 0.65
NextMethod · 0.65

Tested by

no test coverage detected