github.com/covergates/covergates@v0.2.2-0.20201009050117-42ef8a19fb95/cmd/cli/upload/upload.go (about)

     1  package upload
     2  
     3  import (
     4  	"context"
     5  	"encoding/json"
     6  	"fmt"
     7  	"io/ioutil"
     8  	"log"
     9  	"os"
    10  
    11  	"github.com/covergates/covergates/cmd/cli/modules"
    12  	"github.com/covergates/covergates/core"
    13  	"github.com/covergates/covergates/modules/git"
    14  	"github.com/covergates/covergates/modules/util"
    15  	"github.com/covergates/covergates/service/coverage"
    16  	"github.com/urfave/cli/v2"
    17  )
    18  
    19  // Command for upload report
    20  var Command = &cli.Command{
    21  	Name:      "upload",
    22  	Usage:     "upload coverage report",
    23  	ArgsUsage: "report",
    24  	Flags: []cli.Flag{
    25  		&cli.StringFlag{
    26  			Name:     "report",
    27  			Usage:    "report id",
    28  			EnvVars:  []string{"REPORT_ID"},
    29  			Value:    "",
    30  			Required: true,
    31  		},
    32  		&cli.StringFlag{
    33  			Name:     "type",
    34  			Usage:    "report type",
    35  			Value:    "",
    36  			Required: true,
    37  		},
    38  		&cli.StringFlag{
    39  			Name:     "branch",
    40  			Usage:    "branch to upload the report",
    41  			EnvVars:  []string{"GITHUB_HEAD_REF", "DRONE_SOURCE_BRANCH"},
    42  			Value:    "",
    43  			Required: false,
    44  		},
    45  	},
    46  	Action: upload,
    47  }
    48  
    49  func upload(c *cli.Context) error {
    50  	if c.NArg() <= 0 {
    51  		cli.ShowCommandHelp(c, "upload")
    52  		return fmt.Errorf("report path is required")
    53  	}
    54  
    55  	data, err := findReportData(c.Context, c.String("type"), c.Args().First())
    56  	if err != nil {
    57  		return err
    58  	}
    59  
    60  	cwd, err := os.Getwd()
    61  	if err != nil {
    62  		return err
    63  	}
    64  	git := &git.Service{}
    65  	repo, err := git.PlainOpen(c.Context, cwd)
    66  	if err != nil {
    67  		return err
    68  	}
    69  
    70  	branch := c.String("branch")
    71  	if branch == "" {
    72  		branch = repo.Branch()
    73  	}
    74  
    75  	files, err := repo.ListAllFiles(repo.HeadCommit())
    76  	if err != nil {
    77  		return err
    78  	}
    79  	filesData, err := json.Marshal(files)
    80  	if err != nil {
    81  		return err
    82  	}
    83  
    84  	form := util.FormData{
    85  		"type":   c.String("type"),
    86  		"commit": repo.HeadCommit(),
    87  		"ref":    branch,
    88  		"files":  string(filesData),
    89  		"root":   repo.Root(),
    90  		"file": util.FormFile{
    91  			Name: "report",
    92  			Data: data,
    93  		},
    94  	}
    95  
    96  	url := fmt.Sprintf(
    97  		"%s/reports/%s",
    98  		c.String("url"),
    99  		c.String("report"),
   100  	)
   101  
   102  	log.Printf("upload commit %s, %s\n", repo.HeadCommit(), c.String("type"))
   103  
   104  	request, err := util.CreatePostFormRequest(url, form)
   105  	if err != nil {
   106  		return nil
   107  	}
   108  	respond, err := modules.GetHTTPClient(c).Do(request)
   109  	if err != nil {
   110  		return err
   111  	}
   112  
   113  	defer respond.Body.Close()
   114  	text, err := ioutil.ReadAll(respond.Body)
   115  	if respond.StatusCode >= 400 {
   116  		log.Fatal(string(text))
   117  	}
   118  	log.Println(string(text))
   119  	return nil
   120  }
   121  
   122  func findReportData(ctx context.Context, reportType, path string) ([]byte, error) {
   123  	t := core.ReportType(reportType)
   124  	service := &coverage.Service{}
   125  	report, err := service.Find(ctx, t, path)
   126  	if err != nil {
   127  		return nil, err
   128  	}
   129  	r, err := service.Open(ctx, t, report)
   130  	if err != nil {
   131  		return nil, err
   132  	}
   133  	return ioutil.ReadAll(r)
   134  }