Skip to content

Commit 9c39ee8

Browse files
akosyakovfiliptronicek
authored andcommitted
track git commands
Add the TrackEvent type struct Reference fixes Only require one flag Better function description go fmt Update components/gitpod-cli/cmd/git-track-command.go Co-authored-by: bigint <[email protected]> fixes Log the correct vars and correct error messages Set test data Remove more unused code go fmt More go fmt Mock `TrackEvent` Fix destination of `gitCommand` Fix function references Spawn the git command tracker automatically Correct the script name Don't expect any results Don't return on error with tracker Use new connection syntax `go fmt` Set the correct type for params, rename args `go fmt` Fix param type names Add resource scope Move process release to an `else` block Make `TrackEvent` types emulate the backend Format `go fmt` Only use the one required scope Close the client after returning Change description [changelog] updated changelog Setup IdentitiesOnly as yes in ssh config Fixes #7335 Handle "no data" by adding 'on() vector(0)' to each numerator Relies on new variable $datasource Also fixes legend for workspace startup panel When exporting from Grafana, disable "export for sharing externally" Helm is needed to support Observability [changelog] updated changelog add missing condition for ide-proxy heml chart Improve label colors on dashboard integrations for the dark theme Send headers when connecting to the supervisor Create the version file during build Setup IdentitiesOnly as yes in ssh config Fixes #7335 Handle "no data" by adding 'on() vector(0)' to each numerator Relies on new variable $datasource Also fixes legend for workspace startup panel When exporting from Grafana, disable "export for sharing externally" Helm is needed to support Observability [changelog] updated changelog add missing condition for ide-proxy heml chart Improve label colors on dashboard integrations for the dark theme Fix Gitpod casing in proc tests [local-app] timeout the local app after special time of inactivity Set hostname to workspace ID rather than instance ID removed unused dependency [server] derive configuration when no explicit one Fixes #6921 [changelog] updated changelog Add version command Make the command available `go fmt` Try adding dummy version file Move the text file again Print the trimmed version Use the version string from the gitpod client component Remove unused version file
1 parent be64564 commit 9c39ee8

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

56 files changed

+468
-217
lines changed

CHANGELOG.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,11 @@
11
# Change Log
22

33
## December 2021
4+
- Automatically propose a configuration for non-configured repositories. ([#7383](https://github.com/gitpod-io/gitpod/pull/7383)) - [@svenefftinge](https://github.com/svenefftinge)
5+
- Fix Team Workspace Success Criteria dashboard ([#7354](https://github.com/gitpod-io/gitpod/pull/7354)) - [@kylos101](https://github.com/kylos101)
6+
- Allow auth provider secrets to be passed in via a secret ([#7177](https://github.com/gitpod-io/gitpod/pull/7177)) - [@MrSimonEmms](https://github.com/MrSimonEmms)
7+
- Profile of the user who already added a project is linked. ([#7312](https://github.com/gitpod-io/gitpod/pull/7312)) - [@laushinka](https://github.com/laushinka)
8+
- Update GoLand IDE image to version 213.6461.23. ([#7327](https://github.com/gitpod-io/gitpod/pull/7327)) - [@roboquat](https://github.com/roboquat)
49
- Allow setting a name and a description for each port on .gitpod.yml ([#7012](https://github.com/gitpod-io/gitpod/pull/7012)) - [@felladrin](https://github.com/felladrin)
510
- Mention username who added project in a team ([#5128](https://github.com/gitpod-io/gitpod/pull/5128)) - [@AlexTugarev](https://github.com/AlexTugarev)
611
- Enables bitbucket.org repositories in Teams & Projects ([#7251](https://github.com/gitpod-io/gitpod/pull/7251)) - [@AlexTugarev](https://github.com/AlexTugarev)

chart/templates/ide-proxy-deny-all-allow-explicit-networkpolicy.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
# Copyright (c) 2020 Gitpod GmbH. All rights reserved.
22
# Licensed under the MIT License. See License-MIT.txt in the project root for license information.
33

4-
{{ if .Values.installNetworkPolicies -}}
4+
{{ if and (not .Values.components.ideProxy.disabled) (.Values.installNetworkPolicies) -}}
55
apiVersion: networking.k8s.io/v1
66
kind: NetworkPolicy
77
metadata:

chart/templates/ide-proxy-rolebinding.yaml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
# Copyright (c) 2020 Gitpod GmbH. All rights reserved.
22
# Licensed under the MIT License. See License-MIT.txt in the project root for license information.
33

4+
{{ if not .Values.components.ideProxy.disabled -}}
45
kind: RoleBinding
56
apiVersion: rbac.authorization.k8s.io/v1
67
metadata:
@@ -17,3 +18,4 @@ roleRef:
1718
kind: ClusterRole
1819
name: {{ .Release.Namespace }}-ns-psp:restricted-root-user
1920
apiGroup: rbac.authorization.k8s.io
21+
{{- end -}}

chart/templates/ide-proxy-serviceaccount.yaml

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
# Copyright (c) 2020 Gitpod GmbH. All rights reserved.
22
# Licensed under the MIT License. See License-MIT.txt in the project root for license information.
33

4+
{{ if not .Values.components.ideProxy.disabled -}}
45
apiVersion: v1
56
kind: ServiceAccount
67
metadata:
@@ -10,4 +11,5 @@ metadata:
1011
component: ide-proxy
1112
kind: service-account
1213
stage: {{ .Values.installation.stage }}
13-
automountServiceAccountToken: false
14+
automountServiceAccountToken: false
15+
{{- end -}}

components/dashboard/src/settings/Integrations.tsx

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -291,15 +291,15 @@ function GitProviders() {
291291
</ItemFieldIcon>
292292
<ItemField className="w-4/12 xl:w-3/12 flex flex-col my-auto">
293293
<span className="my-auto font-medium truncate overflow-ellipsis">{ap.authProviderType}</span>
294-
<span className="text-sm my-auto text-gray-400 truncate overflow-ellipsis">{ap.host}</span>
294+
<span className="text-sm my-auto text-gray-400 truncate overflow-ellipsis dark:text-gray-500">{ap.host}</span>
295295
</ItemField>
296296
<ItemField className="w-6/12 xl:w-3/12 flex flex-col my-auto">
297-
<span className="my-auto truncate text-gray-500 overflow-ellipsis">{getUsername(ap.authProviderId) || "–"}</span>
298-
<span className="text-sm my-auto text-gray-400">Username</span>
297+
<span className="my-auto truncate text-gray-500 overflow-ellipsis dark:text-gray-400">{getUsername(ap.authProviderId) || "–"}</span>
298+
<span className="text-sm my-auto text-gray-400 dark:text-gray-500">Username</span>
299299
</ItemField>
300300
<ItemField className="hidden xl:w-5/12 xl:flex xl:flex-col my-auto">
301-
<span className="my-auto truncate text-gray-500 overflow-ellipsis">{getPermissions(ap.authProviderId)?.join(", ") || "–"}</span>
302-
<span className="text-sm my-auto text-gray-400">Permissions</span>
301+
<span className="my-auto truncate text-gray-500 overflow-ellipsis dark:text-gray-400">{getPermissions(ap.authProviderId)?.join(", ") || "–"}</span>
302+
<span className="text-sm my-auto text-gray-400 dark:text-gray-500">Permissions</span>
303303
</ItemField>
304304
<ItemFieldContextMenu menuEntries={gitProviderMenu(ap)} />
305305
</Item>
@@ -375,7 +375,7 @@ function GitIntegrations() {
375375
<div className="flex items-start sm:justify-between mb-2">
376376
<div>
377377
<h3>Git Integrations</h3>
378-
<h2 className="text-gray-500">Manage Git integrations for GitLab or GitHub self-hosted instances.</h2>
378+
<h2>Manage Git integrations for GitLab or GitHub self-hosted instances.</h2>
379379
</div>
380380
{providers.length !== 0
381381
?

components/ee/agent-smith/pkg/detector/proc.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -171,7 +171,7 @@ func (p realProcfs) Environ(pid int) ([]string, error) {
171171
}
172172

173173
func parseGitpodEnviron(r io.Reader) ([]string, error) {
174-
// Note: this function is benchmarked in BenchmarkParseGitPodEnviron.
174+
// Note: this function is benchmarked in BenchmarkParseGitpodEnviron.
175175
// At the time of this wriging it consumed 3+N allocs where N is the number of
176176
// env vars starting with GITPOD_.
177177
//

components/ee/agent-smith/pkg/detector/proc_test.go

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -345,36 +345,36 @@ func TestParseGitpodEnviron(t *testing.T) {
345345
}
346346
}
347347

348-
func benchmarkParseGitPodEnviron(content string, b *testing.B) {
348+
func benchmarkParseGitpodEnviron(content string, b *testing.B) {
349349
b.ReportAllocs()
350350
b.ResetTimer()
351351
for n := 0; n < b.N; n++ {
352352
parseGitpodEnviron(bytes.NewReader([]byte(content)))
353353
}
354354
}
355355

356-
func BenchmarkParseGitPodEnvironP0(b *testing.B) { benchmarkParseGitPodEnviron("", b) }
357-
func BenchmarkParseGitPodEnvironP1(b *testing.B) {
358-
benchmarkParseGitPodEnviron("GITPOD_INSTANCE_ID=foobar\000", b)
356+
func BenchmarkParseGitpodEnvironP0(b *testing.B) { benchmarkParseGitpodEnviron("", b) }
357+
func BenchmarkParseGitpodEnvironP1(b *testing.B) {
358+
benchmarkParseGitpodEnviron("GITPOD_INSTANCE_ID=foobar\000", b)
359359
}
360-
func BenchmarkParseGitPodEnvironP2(b *testing.B) {
361-
benchmarkParseGitPodEnviron("GITPOD_INSTANCE_ID=foobar\000GITPOD_INSTANCE_ID=foobar\000", b)
360+
func BenchmarkParseGitpodEnvironP2(b *testing.B) {
361+
benchmarkParseGitpodEnviron("GITPOD_INSTANCE_ID=foobar\000GITPOD_INSTANCE_ID=foobar\000", b)
362362
}
363363
func BenchmarkParseGitPodEnvironP4(b *testing.B) {
364-
benchmarkParseGitPodEnviron("GITPOD_INSTANCE_ID=foobar\000GITPOD_INSTANCE_ID=foobar\000GITPOD_INSTANCE_ID=foobar\000GITPOD_INSTANCE_ID=foobar\000", b)
364+
benchmarkParseGitpodEnviron("GITPOD_INSTANCE_ID=foobar\000GITPOD_INSTANCE_ID=foobar\000GITPOD_INSTANCE_ID=foobar\000GITPOD_INSTANCE_ID=foobar\000", b)
365365
}
366-
func BenchmarkParseGitPodEnvironP8(b *testing.B) {
367-
benchmarkParseGitPodEnviron("GITPOD_INSTANCE_ID=foobar\000GITPOD_INSTANCE_ID=foobar\000GITPOD_INSTANCE_ID=foobar\000GITPOD_INSTANCE_ID=foobar\000GITPOD_INSTANCE_ID=foobar\000GITPOD_INSTANCE_ID=foobar\000GITPOD_INSTANCE_ID=foobar\000GITPOD_INSTANCE_ID=foobar\000", b)
366+
func BenchmarkParseGitpodEnvironP8(b *testing.B) {
367+
benchmarkParseGitpodEnviron("GITPOD_INSTANCE_ID=foobar\000GITPOD_INSTANCE_ID=foobar\000GITPOD_INSTANCE_ID=foobar\000GITPOD_INSTANCE_ID=foobar\000GITPOD_INSTANCE_ID=foobar\000GITPOD_INSTANCE_ID=foobar\000GITPOD_INSTANCE_ID=foobar\000GITPOD_INSTANCE_ID=foobar\000", b)
368368
}
369-
func BenchmarkParseGitPodEnvironN1(b *testing.B) { benchmarkParseGitPodEnviron("NOT_ME\000", b) }
370-
func BenchmarkParseGitPodEnvironN2(b *testing.B) {
371-
benchmarkParseGitPodEnviron("NOT_ME\000NOT_ME\000", b)
369+
func BenchmarkParseGitpodEnvironN1(b *testing.B) { benchmarkParseGitpodEnviron("NOT_ME\000", b) }
370+
func BenchmarkParseGitpodEnvironN2(b *testing.B) {
371+
benchmarkParseGitpodEnviron("NOT_ME\000NOT_ME\000", b)
372372
}
373-
func BenchmarkParseGitPodEnvironN4(b *testing.B) {
374-
benchmarkParseGitPodEnviron("NOT_ME\000NOT_ME\000NOT_ME\000NOT_ME\000", b)
373+
func BenchmarkParseGitpodEnvironN4(b *testing.B) {
374+
benchmarkParseGitpodEnviron("NOT_ME\000NOT_ME\000NOT_ME\000NOT_ME\000", b)
375375
}
376-
func BenchmarkParseGitPodEnvironN8(b *testing.B) {
377-
benchmarkParseGitPodEnviron("NOT_ME\000NOT_ME\000NOT_ME\000NOT_ME\000NOT_ME\000NOT_ME\000NOT_ME\000NOT_ME\000", b)
376+
func BenchmarkParseGitpodEnvironN8(b *testing.B) {
377+
benchmarkParseGitpodEnviron("NOT_ME\000NOT_ME\000NOT_ME\000NOT_ME\000NOT_ME\000NOT_ME\000NOT_ME\000NOT_ME\000", b)
378378
}
379379

380380
func TestParseStat(t *testing.T) {

components/gitpod-cli/BUILD.yaml

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,20 @@ packages:
99
- CGO_ENABLED=0
1010
- GOOS=linux
1111
deps:
12+
- :version
1213
- components/supervisor-api/go:lib
1314
- components/gitpod-protocol/go:lib
15+
argdeps:
16+
- version
1417
config:
1518
packaging: app
19+
prep:
20+
- ["cp", "_deps/components-gitpod-cli--version/version.txt", "pkg/gitpod/version.txt"]
21+
- name: version
22+
type: generic
23+
argdeps:
24+
- version
25+
config:
26+
commands:
27+
- ["sh", "-c", "echo '${version}' > version.txt"]
28+
- ["echo", "Gitpod-CLI Version: ${version}"]

components/gitpod-cli/cmd/credential-helper.go

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,19 @@ var credentialHelper = &cobra.Command{
5757
}()
5858

5959
repoURL, gitCommand := parseProcessTree()
60+
61+
// Starts another process which tracks the executed git event
62+
gitCommandTracker := exec.Command("/proc/self/exe", "git-track-command", "--gitCommand", gitCommand)
63+
err = gitCommandTracker.Start()
64+
if err != nil {
65+
log.WithError(err).Print("error spawning tracker")
66+
} else {
67+
err = gitCommandTracker.Process.Release()
68+
if err != nil {
69+
log.WithError(err).Print("error releasing tracker")
70+
}
71+
}
72+
6073
host := parseHostFromStdin()
6174
if len(host) == 0 {
6275
log.Println("'host' is missing")
Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
// Copyright (c) 2021 Gitpod GmbH. All rights reserved.
2+
// Licensed under the GNU Affero General Public License (AGPL).
3+
// See License-AGPL.txt in the project root for license information.
4+
5+
package cmd
6+
7+
import (
8+
"context"
9+
"io"
10+
"os"
11+
"time"
12+
13+
log "github.com/sirupsen/logrus"
14+
"github.com/spf13/cobra"
15+
16+
gitpod "github.com/gitpod-io/gitpod/gitpod-cli/pkg/gitpod"
17+
serverapi "github.com/gitpod-io/gitpod/gitpod-protocol"
18+
)
19+
20+
var gitTrackCommandOpts struct {
21+
GitCommand string
22+
}
23+
24+
var gitTrackCommand = &cobra.Command{
25+
Use: "git-track-command",
26+
Short: "Gitpod's Git command tracker",
27+
Long: "Sending anonymous statistics about the executed git commands inside a workspace",
28+
Args: cobra.ExactArgs(0),
29+
Hidden: true,
30+
Run: func(cmd *cobra.Command, args []string) {
31+
log.SetOutput(io.Discard)
32+
f, err := os.OpenFile(os.TempDir()+"/gitpod-git-credential-helper.log", os.O_WRONLY|os.O_CREATE|os.O_APPEND, 0644)
33+
if err == nil {
34+
defer f.Close()
35+
log.SetOutput(f)
36+
}
37+
38+
log.Infof("gp git-track-command")
39+
40+
ctx, cancel := context.WithTimeout(context.Background(), 1*time.Minute)
41+
defer cancel()
42+
wsInfo, err := gitpod.GetWSInfo(ctx)
43+
if err != nil {
44+
fail(err.Error())
45+
}
46+
47+
client, err := gitpod.ConnectToServer(ctx, wsInfo, []string{"function:trackEvent"})
48+
49+
if err != nil {
50+
log.WithError(err).Fatal("error connecting to supervisor")
51+
}
52+
53+
defer client.Close()
54+
55+
type GitEventParams struct {
56+
Command string `json:"command,omitempty"`
57+
WorkspaceId string `json:"workspaceId,omitempty"`
58+
WorkspaceInstanceId string `json:"workspaceInstanceId,omitempty"`
59+
Timestamp int64 `json:"timestamp,omitempty"`
60+
}
61+
62+
params := &GitEventParams{
63+
Command: gitTrackCommandOpts.GitCommand,
64+
WorkspaceId: wsInfo.WorkspaceId,
65+
WorkspaceInstanceId: wsInfo.InstanceId,
66+
Timestamp: time.Now().Unix(),
67+
}
68+
event := &serverapi.RemoteTrackMessage{
69+
Event: "git_command",
70+
Properties: *params,
71+
}
72+
log.WithField("command", gitTrackCommandOpts.GitCommand).
73+
Info("tracking the GitCommand event")
74+
75+
err = client.TrackEvent(ctx, event)
76+
if err != nil {
77+
log.WithError(err).Fatal("error tracking git event")
78+
}
79+
},
80+
}
81+
82+
func init() {
83+
rootCmd.AddCommand(gitTrackCommand)
84+
gitTrackCommand.Flags().StringVarP(&gitTrackCommandOpts.GitCommand, "gitCommand", "c", "", "The Git command to be recorded")
85+
gitTrackCommand.MarkFlagRequired("gitCommand")
86+
}

components/gitpod-cli/cmd/version.go

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
// Copyright (c) 2022 Gitpod GmbH. All rights reserved.
2+
// Licensed under the GNU Affero General Public License (AGPL).
3+
// See License-AGPL.txt in the project root for license information.
4+
5+
package cmd
6+
7+
import (
8+
_ "embed"
9+
"fmt"
10+
11+
gitpod "github.com/gitpod-io/gitpod/gitpod-cli/pkg/gitpod"
12+
13+
"github.com/spf13/cobra"
14+
)
15+
16+
// urlCmd represents the url command
17+
var versionCmd = &cobra.Command{
18+
Use: "version",
19+
Hidden: false,
20+
Short: "Prints the version of the CLI",
21+
Args: cobra.MaximumNArgs(1),
22+
Run: func(cmd *cobra.Command, args []string) {
23+
fmt.Println(gitpod.Version)
24+
},
25+
}
26+
27+
func init() {
28+
rootCmd.AddCommand(versionCmd)
29+
}

components/gitpod-cli/pkg/gitpod/server.go

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,9 @@ package server
66

77
import (
88
"context"
9+
_ "embed"
910
"os"
11+
"strings"
1012

1113
serverapi "github.com/gitpod-io/gitpod/gitpod-protocol"
1214
supervisor "github.com/gitpod-io/gitpod/supervisor/api"
@@ -15,6 +17,13 @@ import (
1517
"google.golang.org/grpc"
1618
)
1719

20+
var (
21+
// Version : current version
22+
Version string = strings.TrimSpace(version)
23+
//go:embed version.txt
24+
version string
25+
)
26+
1827
func GetWSInfo(ctx context.Context) (*supervisor.WorkspaceInfoResponse, error) {
1928
supervisorAddr := os.Getenv("SUPERVISOR_ADDR")
2029
if supervisorAddr == "" {
@@ -50,10 +59,15 @@ func ConnectToServer(ctx context.Context, wsInfo *supervisor.WorkspaceInfoRespon
5059
if err != nil {
5160
return nil, xerrors.Errorf("failed getting token from supervisor: %w", err)
5261
}
62+
5363
client, err := serverapi.ConnectToServer(wsInfo.GitpodApi.Endpoint, serverapi.ConnectToServerOpts{
5464
Token: clientToken.Token,
5565
Context: ctx,
5666
Log: log.NewEntry(log.StandardLogger()),
67+
ExtraHeaders: map[string]string{
68+
"User-Agent": "gitpod/cli",
69+
"X-Client-Version": Version,
70+
},
5771
})
5872
if err != nil {
5973
return nil, xerrors.Errorf("failed connecting to server: %w", err)
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
set-during-build

components/gitpod-protocol/go/gitpod-service.go

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,7 @@ type APIInterface interface {
8282
InstallUserPlugins(ctx context.Context, params *InstallPluginsParams) (res bool, err error)
8383
UninstallUserPlugin(ctx context.Context, params *UninstallPluginParams) (res bool, err error)
8484
GuessGitTokenScopes(ctx context.Context, params *GuessGitTokenScopesParams) (res *GuessedGitTokenScopes, err error)
85+
TrackEvent(ctx context.Context, event *RemoteTrackMessage) (err error)
8586

8687
InstanceUpdates(ctx context.Context, instanceID string) (<-chan *WorkspaceInstance, error)
8788
}
@@ -204,6 +205,8 @@ const (
204205
FunctionUninstallUserPlugin FunctionName = "uninstallUserPlugin"
205206
// FunctionGuessGitTokenScopes is the name of the guessGitTokenScopes function
206207
FunctionGuessGitTokenScope FunctionName = "guessGitTokenScopes"
208+
// FunctionTrackEvent is the name of the trackEvent function
209+
FunctionTrackEvent FunctionName = "trackEvent"
207210

208211
// FunctionOnInstanceUpdate is the name of the onInstanceUpdate callback function
209212
FunctionOnInstanceUpdate = "onInstanceUpdate"
@@ -1457,6 +1460,19 @@ func (gp *APIoverJSONRPC) GuessGitTokenScopes(ctx context.Context, params *Guess
14571460
return
14581461
}
14591462

1463+
// TrackEvent calls trackEvent on the server
1464+
func (gp *APIoverJSONRPC) TrackEvent(ctx context.Context, params *RemoteTrackMessage) (err error) {
1465+
if gp == nil {
1466+
err = errNotConnected
1467+
return
1468+
}
1469+
var _params []interface{}
1470+
1471+
_params = append(_params, params)
1472+
err = gp.C.Call(ctx, "trackEvent", _params, nil)
1473+
return
1474+
}
1475+
14601476
// PermissionName is the name of a permission
14611477
type PermissionName string
14621478

@@ -2030,6 +2046,11 @@ type GuessedGitTokenScopes struct {
20302046
Message string `json:"message,omitempty"`
20312047
}
20322048

2049+
type RemoteTrackMessage struct {
2050+
Event string `json:"event,omitempty"`
2051+
Properties interface{} `json:"properties,omitempty"`
2052+
}
2053+
20332054
// BrandingLink is the BrandingLink message type
20342055
type BrandingLink struct {
20352056
Name string `json:"name,omitempty"`

0 commit comments

Comments
 (0)