From 0c6ce25f37cd0c44b0615b870ffbe1cbb3ebe147 Mon Sep 17 00:00:00 2001 From: lyyyuna Date: Sun, 8 Aug 2021 16:20:10 +0800 Subject: [PATCH] add merge command --- cmd/merge.go | 55 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 55 insertions(+) create mode 100644 cmd/merge.go diff --git a/cmd/merge.go b/cmd/merge.go new file mode 100644 index 0000000..b3c18ab --- /dev/null +++ b/cmd/merge.go @@ -0,0 +1,55 @@ +package cmd + +import ( + "github.com/qiniu/goc/v2/pkg/log" + "github.com/spf13/cobra" + "golang.org/x/tools/cover" + "k8s.io/test-infra/gopherage/pkg/cov" + "k8s.io/test-infra/gopherage/pkg/util" +) + +var mergeCmd = &cobra.Command{ + Use: "merge [files...]", + Short: "Merge multiple coherent Go coverage files into a single file.", + Long: `merge will merge multiple Go coverage files into a single coverage file. +merge requires that the files are 'coherent', meaning that if they both contain references to the +same paths, then the contents of those source files were identical for the binary that generated +each file. +`, + Run: func(cmd *cobra.Command, args []string) { + runMerge(args, outputMergeProfile) + }, +} + +var outputMergeProfile string + +func init() { + mergeCmd.Flags().StringVarP(&outputMergeProfile, "output", "o", "mergeprofile.cov", "output file") + + rootCmd.AddCommand(mergeCmd) +} + +func runMerge(args []string, output string) { + if len(args) == 0 { + log.Fatalf("Expected at least one coverage file.") + } + + profiles := make([][]*cover.Profile, len(args)) + for _, path := range args { + profile, err := util.LoadProfile(path) + if err != nil { + log.Fatalf("failed to open %s: %v", path, err) + } + profiles = append(profiles, profile) + } + + merged, err := cov.MergeMultipleProfiles(profiles) + if err != nil { + log.Fatalf("failed to merge files: %v", err) + } + + err = util.DumpProfile(output, merged) + if err != nil { + log.Fatalf("fail to dump the merged file: %v", err) + } +}