Archive returns a tar by example ID.
(exampleID string)
| 120 | |
| 121 | // Archive returns a tar by example ID. |
| 122 | func Archive(exampleID string) ([]byte, error) { |
| 123 | rawData, err, _ := archives.Do(exampleID, func() (interface{}, error) { |
| 124 | examples, err := List() |
| 125 | if err != nil { |
| 126 | return nil, xerrors.Errorf("list: %w", err) |
| 127 | } |
| 128 | |
| 129 | var selected codersdk.TemplateExample |
| 130 | for _, example := range examples { |
| 131 | if example.ID != exampleID { |
| 132 | continue |
| 133 | } |
| 134 | selected = example |
| 135 | break |
| 136 | } |
| 137 | |
| 138 | if selected.ID == "" { |
| 139 | return nil, xerrors.Errorf("example with id %q not found: %w", exampleID, ErrNotFound) |
| 140 | } |
| 141 | |
| 142 | exampleFiles, err := fs.Sub(files, path.Join(rootDir, exampleID)) |
| 143 | if err != nil { |
| 144 | return nil, xerrors.Errorf("get example fs: %w", err) |
| 145 | } |
| 146 | |
| 147 | var buffer bytes.Buffer |
| 148 | tarWriter := tar.NewWriter(&buffer) |
| 149 | |
| 150 | err = fs.WalkDir(exampleFiles, ".", func(path string, entry fs.DirEntry, err error) error { |
| 151 | if err != nil { |
| 152 | return err |
| 153 | } |
| 154 | if path == "." { |
| 155 | // Tar files don't have a root directory. |
| 156 | return nil |
| 157 | } |
| 158 | |
| 159 | info, err := entry.Info() |
| 160 | if err != nil { |
| 161 | return xerrors.Errorf("stat file: %w", err) |
| 162 | } |
| 163 | |
| 164 | header, err := tar.FileInfoHeader(info, "") |
| 165 | if err != nil { |
| 166 | return xerrors.Errorf("get file header: %w", err) |
| 167 | } |
| 168 | header.Name = strings.TrimPrefix(path, "./") |
| 169 | header.Mode = 0o644 |
| 170 | |
| 171 | if entry.IsDir() { |
| 172 | // Trailing slash on entry name is not required. Our tar |
| 173 | // creation code for tarring up a local directory doesn't |
| 174 | // include slashes so this we don't include them here for |
| 175 | // consistency. |
| 176 | // header.Name += "/" |
| 177 | header.Mode = 0o755 |
| 178 | header.Typeflag = tar.TypeDir |
| 179 | err = tarWriter.WriteHeader(header) |