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 }