MCPcopy Index your code
hub / github.com/php/frankenphp / untar

Function untar

embed.go:56–157  ·  view source on GitHub ↗

untar reads the tar file from r and writes it into dir. Adapted from https://github.com/golang/build/blob/master/cmd/buildlet/buildlet.go

(dir string)

Source from the content-addressed store, hash-verified

54//
55// Adapted from https://github.com/golang/build/blob/master/cmd/buildlet/buildlet.go
56func untar(dir string) (err error) {
57 t0 := time.Now()
58 nFiles := 0
59 madeDir := map[string]bool{}
60
61 tr := tar.NewReader(bytes.NewReader(embeddedApp))
62 loggedChtimesError := false
63 for {
64 f, err := tr.Next()
65 if err == io.EOF {
66 break
67 }
68 if err != nil {
69 return fmt.Errorf("tar error: %w", err)
70 }
71 if f.Typeflag == tar.TypeXGlobalHeader {
72 // golang.org/issue/22748: git archive exports
73 // a global header ('g') which after Go 1.9
74 // (for a bit?) contained an empty filename.
75 // Ignore it.
76 continue
77 }
78 rel, err := nativeRelPath(f.Name)
79 if err != nil {
80 return fmt.Errorf("tar file contained invalid name %q: %v", f.Name, err)
81 }
82 abs := filepath.Join(dir, rel)
83
84 fi := f.FileInfo()
85 mode := fi.Mode()
86 switch {
87 case mode.IsRegular():
88 // Make the directory. This is redundant because it should
89 // already be made by a directory entry in the tar
90 // beforehand. Thus, don't check for errors; the next
91 // write will fail with the same error.
92 dir := filepath.Dir(abs)
93 if !madeDir[dir] {
94 if err := os.MkdirAll(filepath.Dir(abs), mode.Perm()); err != nil {
95 return err
96 }
97 madeDir[dir] = true
98 }
99 if runtime.GOOS == "darwin" && mode&0111 != 0 {
100 // See comment in writeFile.
101 err := os.Remove(abs)
102 if err != nil && !errors.Is(err, fs.ErrNotExist) {
103 return err
104 }
105 }
106 if _, err := os.Stat(abs); os.IsNotExist(err) {
107 wf, err := os.OpenFile(abs, os.O_RDWR|os.O_CREATE|os.O_TRUNC, mode.Perm())
108 if err != nil {
109 return err
110 }
111 n, err := io.Copy(wf, tr)
112 if closeErr := wf.Close(); closeErr != nil && err == nil {
113 err = closeErr

Callers 1

initFunction · 0.85

Calls 3

nativeRelPathFunction · 0.85
IsMethod · 0.80
CloseMethod · 0.80

Tested by

no test coverage detected