Alexandre
8ecac01dc5
All checks were successful
Create and publish a Docker image / build-and-push-image (push) Successful in 55s
133 lines
2.9 KiB
Go
133 lines
2.9 KiB
Go
package main
|
|
|
|
import (
|
|
"encoding/json"
|
|
"fmt"
|
|
"io"
|
|
"io/fs"
|
|
"mime/multipart"
|
|
"net/http"
|
|
"os"
|
|
"path/filepath"
|
|
|
|
"github.com/sethvargo/go-githubactions"
|
|
)
|
|
|
|
type AddResponse struct {
|
|
Bytes int64
|
|
Hash string
|
|
Name string
|
|
Size string
|
|
}
|
|
|
|
func main() {
|
|
githubactions.Infof("Checking inputs...")
|
|
|
|
// Check inputs
|
|
path := githubactions.GetInput("path_to_add")
|
|
if path == "" {
|
|
githubactions.Fatalf("Missing: path_to_add")
|
|
}
|
|
|
|
ipfsHost := githubactions.GetInput("ipfs_host")
|
|
if ipfsHost == "" {
|
|
githubactions.Fatalf("Missing: ipfs_host")
|
|
}
|
|
|
|
ipfsPort := githubactions.GetInput("ipfs_port")
|
|
if ipfsPort == "" {
|
|
githubactions.Fatalf("Missing: ipfs_port")
|
|
}
|
|
|
|
targetPath, err := os.Open(path)
|
|
if err != nil {
|
|
githubactions.Fatalf("Unable to access path_to_add: %v", err.Error())
|
|
}
|
|
defer targetPath.Close()
|
|
|
|
targetPathInfo, err := targetPath.Stat()
|
|
if err != nil {
|
|
githubactions.Fatalf("Unable to access to access path_to_add info: %v", fmt.Errorf("%w", err))
|
|
}
|
|
|
|
if !targetPathInfo.IsDir() {
|
|
githubactions.Fatalf("%v is not a directory", path)
|
|
}
|
|
|
|
githubactions.Infof("Inputs OK")
|
|
|
|
body, writer := io.Pipe()
|
|
|
|
url := fmt.Sprintf("http://%v:%v/api/v0/add", ipfsHost, ipfsPort)
|
|
req, err := http.NewRequest(http.MethodPost, url, body)
|
|
if err != nil {
|
|
githubactions.Fatalf("Unable to create request: %v", err.Error())
|
|
}
|
|
|
|
mwriter := multipart.NewWriter(writer)
|
|
req.Header.Add("Content-Type", mwriter.FormDataContentType())
|
|
|
|
go func() {
|
|
defer mwriter.Close()
|
|
defer writer.Close()
|
|
|
|
err = filepath.Walk(path, func(innerPath string, info fs.FileInfo, err error) error {
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
if info.IsDir() {
|
|
return nil
|
|
}
|
|
|
|
relativeParh, _ := filepath.Rel(path, innerPath)
|
|
githubactions.Infof("Reading %v", relativeParh)
|
|
w, err := mwriter.CreateFormFile("file", relativeParh)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
fileReader, err := os.Open(innerPath)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
defer fileReader.Close()
|
|
|
|
written, err := io.Copy(w, fileReader)
|
|
if err != nil {
|
|
return fmt.Errorf("error copying %s (%d bytes written): %v", relativeParh, written, err)
|
|
} else {
|
|
githubactions.Infof("Read %v bytes from %s", written, relativeParh)
|
|
}
|
|
|
|
return nil
|
|
})
|
|
|
|
if err != nil {
|
|
githubactions.Fatalf("Unable to create request body: %v", fmt.Errorf("%w", err))
|
|
}
|
|
}()
|
|
|
|
githubactions.Infof("Calling node API")
|
|
client := &http.Client{}
|
|
res, err := client.Do(req)
|
|
if err != nil {
|
|
githubactions.Fatalf(err.Error())
|
|
}
|
|
|
|
githubactions.Infof("Reading response")
|
|
resBody, err := io.ReadAll(res.Body)
|
|
if err != nil {
|
|
githubactions.Fatalf(err.Error())
|
|
}
|
|
|
|
githubactions.Infof("Response: %v", string(resBody))
|
|
|
|
var ipfsAddResponse AddResponse
|
|
json.Unmarshal(resBody, &ipfsAddResponse)
|
|
|
|
githubactions.Infof("Upload size is %v", ipfsAddResponse.Bytes)
|
|
githubactions.Infof("CID is %v", ipfsAddResponse.Hash)
|
|
githubactions.SetOutput("cid", ipfsAddResponse.Hash)
|
|
}
|