[mirror] Command-line application for uploading a site to a git-pages server
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

Perform streamed upload of site data.

This both speeds up the uploads and eliminates possibility of running
out of memory for large sites.

+14 -10
+14 -10
main.go
··· 89 }) 90 } 91 92 - func archiveFS(root fs.FS) (result []byte, err error) { 93 - buffer := bytes.Buffer{} 94 - zstdWriter, _ := zstd.NewWriter(&buffer) 95 tarWriter := tar.NewWriter(zstdWriter) 96 err = tarWriter.AddFS(root) 97 if err != nil { ··· 105 if err != nil { 106 return 107 } 108 - result = buffer.Bytes() 109 return 110 } 111 ··· 184 } 185 } 186 187 - requestBody, err := archiveFS(uploadDirFS.FS()) 188 - if err != nil { 189 - fmt.Fprintf(os.Stderr, "error: %s\n", err) 190 - os.Exit(1) 191 - } 192 193 - request, err = http.NewRequest("PUT", siteURL.String(), bytes.NewReader(requestBody)) 194 if err != nil { 195 fmt.Fprintf(os.Stderr, "error: %s\n", err) 196 os.Exit(1) 197 } 198 request.Header.Add("Content-Type", "application/x-tar+zstd") 199 200 case *deleteFlag:
··· 89 }) 90 } 91 92 + func archiveFS(writer io.Writer, root fs.FS) (err error) { 93 + zstdWriter, _ := zstd.NewWriter(writer) 94 tarWriter := tar.NewWriter(zstdWriter) 95 err = tarWriter.AddFS(root) 96 if err != nil { ··· 104 if err != nil { 105 return 106 } 107 return 108 } 109 ··· 182 } 183 } 184 185 + // Stream archive data without ever loading the entire working set into RAM. 186 + reader, writer := io.Pipe() 187 + go func() { 188 + err = archiveFS(writer, uploadDirFS.FS()) 189 + if err != nil { 190 + fmt.Fprintf(os.Stderr, "error: %s\n", err) 191 + os.Exit(1) 192 + } 193 + writer.Close() 194 + }() 195 196 + request, err = http.NewRequest("PUT", siteURL.String(), reader) 197 if err != nil { 198 fmt.Fprintf(os.Stderr, "error: %s\n", err) 199 os.Exit(1) 200 } 201 + request.ContentLength = -1 202 request.Header.Add("Content-Type", "application/x-tar+zstd") 203 204 case *deleteFlag: