Skip to content

Commit 924542a

Browse files
Fix lint errors for email tracking
1 parent 8fdda5a commit 924542a

13 files changed

Lines changed: 157 additions & 94 deletions

File tree

internal/cmd/gmail_send.go

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -122,9 +122,9 @@ func (c *GmailSendCmd) Run(ctx context.Context, flags *RootFlags) error {
122122
var trackingID string
123123
htmlBody := c.BodyHTML
124124
if c.Track {
125-
trackingCfg, err := tracking.LoadConfig()
126-
if err != nil {
127-
return fmt.Errorf("load tracking config: %w", err)
125+
trackingCfg, loadErr := tracking.LoadConfig()
126+
if loadErr != nil {
127+
return fmt.Errorf("load tracking config: %w", loadErr)
128128
}
129129
if !trackingCfg.IsConfigured() {
130130
return fmt.Errorf("tracking not configured; run 'gog gmail track setup' first")
@@ -135,15 +135,15 @@ func (c *GmailSendCmd) Run(ctx context.Context, flags *RootFlags) error {
135135

136136
// Use first resolved recipient for tracking
137137
firstRecipient := toRecipients[0]
138-
pixelURL, blob, err := tracking.GeneratePixelURL(trackingCfg, strings.TrimSpace(firstRecipient), c.Subject)
139-
if err != nil {
140-
return fmt.Errorf("generate tracking pixel: %w", err)
138+
pixelURL, blob, genErr := tracking.GeneratePixelURL(trackingCfg, strings.TrimSpace(firstRecipient), c.Subject)
139+
if genErr != nil {
140+
return fmt.Errorf("generate tracking pixel: %w", genErr)
141141
}
142142
trackingID = blob
143143

144144
// Inject pixel at end of HTML body
145145
pixelHTML := tracking.GeneratePixelHTML(pixelURL)
146-
htmlBody = htmlBody + pixelHTML
146+
htmlBody += pixelHTML
147147
}
148148

149149
raw, err := buildRFC822(mailOptions{

internal/cmd/gmail_track_opens.go

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -37,13 +37,18 @@ func (c *GmailTrackOpensCmd) Run(ctx context.Context, flags *RootFlags) error {
3737
}
3838

3939
// Query via admin endpoint
40-
return c.queryAdmin(ctx, cfg, u, flags)
40+
return c.queryAdmin(ctx, cfg, u)
4141
}
4242

4343
func (c *GmailTrackOpensCmd) queryByTrackingID(ctx context.Context, cfg *tracking.Config, u *ui.UI) error {
4444
reqURL := fmt.Sprintf("%s/q/%s", cfg.WorkerURL, c.TrackingID)
4545

46-
resp, err := http.Get(reqURL)
46+
req, err := http.NewRequestWithContext(ctx, http.MethodGet, reqURL, nil)
47+
if err != nil {
48+
return fmt.Errorf("build request: %w", err)
49+
}
50+
51+
resp, err := http.DefaultClient.Do(req)
4752
if err != nil {
4853
return fmt.Errorf("query tracker: %w", err)
4954
}
@@ -88,7 +93,7 @@ func (c *GmailTrackOpensCmd) queryByTrackingID(ctx context.Context, cfg *trackin
8893
return nil
8994
}
9095

91-
func (c *GmailTrackOpensCmd) queryAdmin(ctx context.Context, cfg *tracking.Config, u *ui.UI, flags *RootFlags) error {
96+
func (c *GmailTrackOpensCmd) queryAdmin(ctx context.Context, cfg *tracking.Config, u *ui.UI) error {
9297
reqURL, _ := url.Parse(cfg.WorkerURL + "/opens")
9398
q := reqURL.Query()
9499
if c.To != "" {

internal/cmd/root.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -177,7 +177,7 @@ func helpDescription() string {
177177
backendLine := "unknown"
178178
if err != nil {
179179
backendLine = fmt.Sprintf("error: %v", err)
180-
} else {
180+
} else if backendInfo.Value != "" {
181181
backendLine = fmt.Sprintf("%s (source: %s)", backendInfo.Value, backendInfo.Source)
182182
}
183183

internal/config/config.go

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ type File struct {
1616
func ConfigPath() (string, error) {
1717
dir, err := Dir()
1818
if err != nil {
19-
return "", err
19+
return "", fmt.Errorf("config dir: %w", err)
2020
}
2121

2222
return filepath.Join(dir, "config.json"), nil
@@ -25,14 +25,15 @@ func ConfigPath() (string, error) {
2525
func ConfigExists() (bool, error) {
2626
path, err := ConfigPath()
2727
if err != nil {
28-
return false, err
28+
return false, fmt.Errorf("config path: %w", err)
2929
}
3030

3131
if _, statErr := os.Stat(path); statErr != nil {
3232
if os.IsNotExist(statErr) {
3333
return false, nil
3434
}
35-
return false, statErr
35+
36+
return false, fmt.Errorf("stat config: %w", statErr)
3637
}
3738

3839
return true, nil
@@ -41,14 +42,16 @@ func ConfigExists() (bool, error) {
4142
func ReadConfig() (File, error) {
4243
path, err := ConfigPath()
4344
if err != nil {
44-
return File{}, err
45+
return File{}, fmt.Errorf("config path: %w", err)
4546
}
4647

47-
b, err := os.ReadFile(path) //nolint:gosec // config file path
48+
//nolint:gosec // path is within the user config dir
49+
b, err := os.ReadFile(path)
4850
if err != nil {
4951
if os.IsNotExist(err) {
5052
return File{}, nil
5153
}
54+
5255
return File{}, fmt.Errorf("read config: %w", err)
5356
}
5457

@@ -58,5 +61,6 @@ func ReadConfig() (File, error) {
5861
}
5962

6063
cfg.KeyringBackend = strings.ToLower(strings.TrimSpace(cfg.KeyringBackend))
64+
6165
return cfg, nil
6266
}

internal/config/config_test.go

Lines changed: 33 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -12,14 +12,18 @@ func TestConfigPath(t *testing.T) {
1212
t.Setenv("HOME", home)
1313
t.Setenv("XDG_CONFIG_HOME", filepath.Join(home, "xdg-config"))
1414

15-
path, err := ConfigPath()
16-
if err != nil {
17-
t.Fatalf("ConfigPath: %v", err)
15+
path, pathErr := ConfigPath()
16+
if pathErr != nil {
17+
t.Fatalf("ConfigPath: %v", pathErr)
1818
}
19-
if filepath.Base(path) != "config.json" {
20-
t.Fatalf("unexpected config file: %q", filepath.Base(path))
19+
20+
base := filepath.Base(path)
21+
if base != "config.json" {
22+
t.Fatalf("unexpected config file: %q", base)
2123
}
22-
if filepath.Base(filepath.Dir(path)) != AppName {
24+
25+
dirBase := filepath.Base(filepath.Dir(path))
26+
if dirBase != AppName {
2327
t.Fatalf("unexpected config dir: %q", filepath.Dir(path))
2428
}
2529
}
@@ -29,12 +33,14 @@ func TestReadConfig_Missing(t *testing.T) {
2933
t.Setenv("HOME", home)
3034
t.Setenv("XDG_CONFIG_HOME", filepath.Join(home, "xdg-config"))
3135

32-
cfg, err := ReadConfig()
33-
if err != nil {
34-
t.Fatalf("ReadConfig: %v", err)
36+
cfg, readErr := ReadConfig()
37+
if readErr != nil {
38+
t.Fatalf("ReadConfig: %v", readErr)
3539
}
36-
if cfg.KeyringBackend != "" {
37-
t.Fatalf("expected empty config, got %q", cfg.KeyringBackend)
40+
41+
backend := cfg.KeyringBackend
42+
if backend != "" {
43+
t.Fatalf("expected empty config, got %q", backend)
3844
}
3945
}
4046

@@ -43,25 +49,31 @@ func TestReadConfig_JSON5(t *testing.T) {
4349
t.Setenv("HOME", home)
4450
t.Setenv("XDG_CONFIG_HOME", filepath.Join(home, "xdg-config"))
4551

46-
path, err := ConfigPath()
47-
if err != nil {
48-
t.Fatalf("ConfigPath: %v", err)
52+
path, pathErr := ConfigPath()
53+
if pathErr != nil {
54+
t.Fatalf("ConfigPath: %v", pathErr)
4955
}
50-
if err := os.MkdirAll(filepath.Dir(path), 0o700); err != nil {
51-
t.Fatalf("mkdir: %v", err)
56+
57+
mkdirErr := os.MkdirAll(filepath.Dir(path), 0o700)
58+
if mkdirErr != nil {
59+
t.Fatalf("mkdir: %v", mkdirErr)
5260
}
61+
5362
data := `{
5463
// allow comments + trailing commas
5564
keyring_backend: "file",
5665
}`
57-
if err := os.WriteFile(path, []byte(data), 0o600); err != nil {
58-
t.Fatalf("write config: %v", err)
66+
67+
writeErr := os.WriteFile(path, []byte(data), 0o600)
68+
if writeErr != nil {
69+
t.Fatalf("write config: %v", writeErr)
5970
}
6071

61-
cfg, err := ReadConfig()
62-
if err != nil {
63-
t.Fatalf("ReadConfig: %v", err)
72+
cfg, readErr := ReadConfig()
73+
if readErr != nil {
74+
t.Fatalf("ReadConfig: %v", readErr)
6475
}
76+
6577
if got := strings.TrimSpace(cfg.KeyringBackend); got != "file" {
6678
t.Fatalf("expected keyring_backend=file, got %q", got)
6779
}

internal/secrets/store.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,8 +67,9 @@ func ResolveKeyringBackendInfo() (KeyringBackendInfo, error) {
6767

6868
cfg, err := config.ReadConfig()
6969
if err != nil {
70-
return KeyringBackendInfo{}, err
70+
return KeyringBackendInfo{}, fmt.Errorf("read config: %w", err)
7171
}
72+
7273
if cfg.KeyringBackend != "" {
7374
return KeyringBackendInfo{Value: cfg.KeyringBackend, Source: keyringBackendSourceConfig}, nil
7475
}

internal/secrets/store_test.go

Lines changed: 42 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,11 @@ func TestResolveKeyringBackendInfo_Default(t *testing.T) {
1919
if err != nil {
2020
t.Fatalf("ResolveKeyringBackendInfo: %v", err)
2121
}
22+
2223
if info.Value != "auto" {
2324
t.Fatalf("expected auto, got %q", info.Value)
2425
}
26+
2527
if info.Source != keyringBackendSourceDefault {
2628
t.Fatalf("expected source default, got %q", info.Source)
2729
}
@@ -33,26 +35,34 @@ func TestResolveKeyringBackendInfo_Config(t *testing.T) {
3335
t.Setenv("XDG_CONFIG_HOME", filepath.Join(home, "xdg-config"))
3436
t.Setenv("GOG_KEYRING_BACKEND", "")
3537

36-
path, err := config.ConfigPath()
37-
if err != nil {
38-
t.Fatalf("ConfigPath: %v", err)
38+
path, pathErr := config.ConfigPath()
39+
if pathErr != nil {
40+
t.Fatalf("ConfigPath: %v", pathErr)
3941
}
40-
if err := os.MkdirAll(filepath.Dir(path), 0o700); err != nil {
41-
t.Fatalf("mkdir: %v", err)
42+
43+
mkdirErr := os.MkdirAll(filepath.Dir(path), 0o700)
44+
if mkdirErr != nil {
45+
t.Fatalf("mkdir: %v", mkdirErr)
4246
}
43-
if err := os.WriteFile(path, []byte(`{ keyring_backend: "file" }`), 0o600); err != nil {
44-
t.Fatalf("write config: %v", err)
47+
48+
writeErr := os.WriteFile(path, []byte(`{ keyring_backend: "file" }`), 0o600)
49+
if writeErr != nil {
50+
t.Fatalf("write config: %v", writeErr)
4551
}
4652

4753
info, err := ResolveKeyringBackendInfo()
4854
if err != nil {
4955
t.Fatalf("ResolveKeyringBackendInfo: %v", err)
5056
}
51-
if info.Value != "file" {
52-
t.Fatalf("expected file, got %q", info.Value)
57+
58+
value := info.Value
59+
if value != "file" {
60+
t.Fatalf("expected file, got %q", value)
5361
}
54-
if info.Source != keyringBackendSourceConfig {
55-
t.Fatalf("expected source config, got %q", info.Source)
62+
63+
source := info.Source
64+
if source != keyringBackendSourceConfig {
65+
t.Fatalf("expected source config, got %q", source)
5666
}
5767
}
5868

@@ -62,26 +72,34 @@ func TestResolveKeyringBackendInfo_EnvOverridesConfig(t *testing.T) {
6272
t.Setenv("XDG_CONFIG_HOME", filepath.Join(home, "xdg-config"))
6373
t.Setenv("GOG_KEYRING_BACKEND", "keychain")
6474

65-
path, err := config.ConfigPath()
66-
if err != nil {
67-
t.Fatalf("ConfigPath: %v", err)
75+
path, pathErr := config.ConfigPath()
76+
if pathErr != nil {
77+
t.Fatalf("ConfigPath: %v", pathErr)
6878
}
69-
if err := os.MkdirAll(filepath.Dir(path), 0o700); err != nil {
70-
t.Fatalf("mkdir: %v", err)
79+
80+
mkdirErr := os.MkdirAll(filepath.Dir(path), 0o700)
81+
if mkdirErr != nil {
82+
t.Fatalf("mkdir: %v", mkdirErr)
7183
}
72-
if err := os.WriteFile(path, []byte(`{ keyring_backend: "file" }`), 0o600); err != nil {
73-
t.Fatalf("write config: %v", err)
84+
85+
writeErr := os.WriteFile(path, []byte(`{ keyring_backend: "file" }`), 0o600)
86+
if writeErr != nil {
87+
t.Fatalf("write config: %v", writeErr)
7488
}
7589

7690
info, err := ResolveKeyringBackendInfo()
7791
if err != nil {
7892
t.Fatalf("ResolveKeyringBackendInfo: %v", err)
7993
}
80-
if info.Value != "keychain" {
81-
t.Fatalf("expected keychain, got %q", info.Value)
94+
95+
value := info.Value
96+
if value != "keychain" {
97+
t.Fatalf("expected keychain, got %q", value)
8298
}
83-
if info.Source != keyringBackendSourceEnv {
84-
t.Fatalf("expected source env, got %q", info.Source)
99+
100+
source := info.Source
101+
if source != keyringBackendSourceEnv {
102+
t.Fatalf("expected source env, got %q", source)
85103
}
86104
}
87105

@@ -90,7 +108,8 @@ func TestAllowedBackends_Invalid(t *testing.T) {
90108
if err == nil {
91109
t.Fatalf("expected error")
92110
}
93-
if !errors.Is(err, errInvalidKeyringBackend) {
111+
112+
if isInvalid := errors.Is(err, errInvalidKeyringBackend); !isInvalid {
94113
t.Fatalf("expected invalid backend error, got %v", err)
95114
}
96115
}

0 commit comments

Comments
 (0)