gitpod/components/gitpod-cli/cmd/git-track-command.go
2022-01-07 11:07:00 +01:00

87 lines
2.4 KiB
Go

// Copyright (c) 2021 Gitpod GmbH. All rights reserved.
// Licensed under the GNU Affero General Public License (AGPL).
// See License-AGPL.txt in the project root for license information.
package cmd
import (
"context"
"io"
"os"
"time"
log "github.com/sirupsen/logrus"
"github.com/spf13/cobra"
gitpod "github.com/gitpod-io/gitpod/gitpod-cli/pkg/gitpod"
serverapi "github.com/gitpod-io/gitpod/gitpod-protocol"
)
var gitTrackCommandOpts struct {
GitCommand string
}
var gitTrackCommand = &cobra.Command{
Use: "git-track-command",
Short: "Gitpod's Git command tracker",
Long: "Sending anonymous statistics about the executed git commands inside a workspace",
Args: cobra.ExactArgs(0),
Hidden: true,
Run: func(cmd *cobra.Command, args []string) {
log.SetOutput(io.Discard)
f, err := os.OpenFile(os.TempDir()+"/gitpod-git-credential-helper.log", os.O_WRONLY|os.O_CREATE|os.O_APPEND, 0644)
if err == nil {
defer f.Close()
log.SetOutput(f)
}
log.Infof("gp git-track-command")
ctx, cancel := context.WithTimeout(context.Background(), 1*time.Minute)
defer cancel()
wsInfo, err := gitpod.GetWSInfo(ctx)
if err != nil {
fail(err.Error())
}
client, err := gitpod.ConnectToServer(ctx, wsInfo, []string{"function:trackEvent"})
if err != nil {
log.WithError(err).Fatal("error connecting to supervisor")
}
defer client.Close()
type GitEventParams struct {
Command string `json:"command,omitempty"`
WorkspaceId string `json:"workspaceId,omitempty"`
WorkspaceInstanceId string `json:"workspaceInstanceId,omitempty"`
Timestamp int64 `json:"timestamp,omitempty"`
}
params := &GitEventParams{
Command: gitTrackCommandOpts.GitCommand,
WorkspaceId: wsInfo.WorkspaceId,
WorkspaceInstanceId: wsInfo.InstanceId,
Timestamp: time.Now().Unix(),
}
event := &serverapi.RemoteTrackMessage{
Event: "git_command",
Properties: *params,
}
log.WithField("command", gitTrackCommandOpts.GitCommand).
Info("tracking the GitCommand event")
err = client.TrackEvent(ctx, event)
if err != nil {
log.WithError(err).Fatal("error tracking git event")
}
},
}
func init() {
rootCmd.AddCommand(gitTrackCommand)
gitTrackCommand.Flags().StringVarP(&gitTrackCommandOpts.GitCommand, "gitCommand", "c", "", "The Git command to be recorded")
gitTrackCommand.MarkFlagRequired("gitCommand")
}