From 122fb16dfb63960f5a38b7c31a568d85162e13af Mon Sep 17 00:00:00 2001 From: bbedward Date: Mon, 26 Jan 2026 21:49:09 -0500 Subject: [PATCH] clipboard: simplify copyFile, fix copy image from history --- core/cmd/dms/commands_clipboard.go | 106 ++----------- core/cmd/dms/commands_doctor.go | 4 +- core/internal/clipboard/store.go | 6 +- core/internal/config/deployer.go | 52 +++---- core/internal/config/deployer_test.go | 12 +- core/internal/distros/base.go | 8 +- core/internal/distros/base_test.go | 10 +- core/internal/distros/opensuse.go | 6 +- core/internal/greeter/installer.go | 10 +- core/internal/keybinds/discovery_test.go | 16 +- core/internal/keybinds/providers/hyprland.go | 4 +- .../providers/hyprland_parser_test.go | 14 +- .../keybinds/providers/hyprland_test.go | 6 +- core/internal/keybinds/providers/mangowc.go | 4 +- .../keybinds/providers/mangowc_parser_test.go | 16 +- .../keybinds/providers/mangowc_test.go | 4 +- core/internal/keybinds/providers/niri.go | 4 +- .../keybinds/providers/niri_parser_test.go | 40 ++--- core/internal/keybinds/providers/niri_test.go | 12 +- .../keybinds/providers/sway_parser_test.go | 12 +- core/internal/keybinds/providers/sway_test.go | 4 +- core/internal/matugen/matugen.go | 4 +- core/internal/matugen/matugen_test.go | 30 ++-- core/internal/plugins/manager.go | 6 +- core/internal/plugins/manager_test.go | 28 ++-- core/internal/plugins/registry.go | 4 +- core/internal/plugins/registry_test.go | 16 +- core/internal/screenshot/encode.go | 2 +- core/internal/screenshot/state.go | 4 +- core/internal/server/brightness/sysfs.go | 2 +- .../server/brightness/sysfs_logind_test.go | 24 +-- core/internal/server/brightness/sysfs_test.go | 12 +- core/internal/server/brightness/udev_test.go | 10 +- core/internal/server/clipboard/handlers.go | 42 +++-- core/internal/server/clipboard/manager.go | 143 ++++++++++++------ core/internal/server/clipboard/types.go | 7 +- core/internal/server/server_test.go | 4 +- core/internal/themes/manager.go | 8 +- core/internal/themes/registry.go | 4 +- core/internal/tui/views_password.go | 2 +- core/internal/utils/flatpak_test.go | 10 +- core/internal/version/version_test.go | 20 +-- 42 files changed, 345 insertions(+), 387 deletions(-) diff --git a/core/cmd/dms/commands_clipboard.go b/core/cmd/dms/commands_clipboard.go index 75de43a0..18eb1088 100644 --- a/core/cmd/dms/commands_clipboard.go +++ b/core/cmd/dms/commands_clipboard.go @@ -194,7 +194,7 @@ func init() { clipWatchCmd.Flags().BoolVar(&clipJSONOutput, "json", false, "Output as JSON") clipHistoryCmd.Flags().BoolVar(&clipJSONOutput, "json", false, "Output as JSON") clipGetCmd.Flags().BoolVar(&clipJSONOutput, "json", false, "Output as JSON") - clipGetCmd.Flags().BoolVarP(&clipGetCopy, "copy", "c", false, "Copy entry to clipboard") + clipGetCmd.Flags().BoolVarP(&clipGetCopy, "copy", "C", false, "Copy entry to clipboard") clipSearchCmd.Flags().IntVarP(&clipSearchLimit, "limit", "l", 50, "Max results") clipSearchCmd.Flags().IntVarP(&clipSearchOffset, "offset", "o", 0, "Result offset") @@ -449,16 +449,13 @@ func runClipGet(cmd *cobra.Command, args []string) { req := models.Request{ ID: 1, Method: "clipboard.copyEntry", - Params: map[string]any{ - "id": id, - }, + Params: map[string]any{"id": id}, } resp, err := sendServerRequest(req) if err != nil { log.Fatalf("Failed to copy clipboard entry: %v", err) } - if resp.Error != "" { log.Fatalf("Error: %s", resp.Error) } @@ -735,7 +732,7 @@ func runClipExport(cmd *cobra.Command, args []string) { return } - if err := os.WriteFile(args[0], out, 0644); err != nil { + if err := os.WriteFile(args[0], out, 0o644); err != nil { log.Fatalf("Failed to write file: %v", err) } fmt.Printf("Exported to %s\n", args[0]) @@ -790,7 +787,7 @@ func runClipMigrate(cmd *cobra.Command, args []string) { log.Fatalf("Cliphist db not found: %s", dbPath) } - db, err := bolt.Open(dbPath, 0644, &bolt.Options{ + db, err := bolt.Open(dbPath, 0o644, &bolt.Options{ ReadOnly: true, Timeout: 1 * time.Second, }) @@ -906,12 +903,12 @@ func downloadToTempFile(rawURL string) (string, error) { cacheDir = "/tmp" } clipDir := filepath.Join(cacheDir, "dms", "clipboard") - if err := os.MkdirAll(clipDir, 0755); err != nil { + if err := os.MkdirAll(clipDir, 0o755); err != nil { return "", fmt.Errorf("create cache dir: %w", err) } filePath := filepath.Join(clipDir, fmt.Sprintf("%d%s", time.Now().UnixNano(), ext)) - if err := os.WriteFile(filePath, data, 0644); err != nil { + if err := os.WriteFile(filePath, data, 0o644); err != nil { return "", fmt.Errorf("write file: %w", err) } @@ -919,99 +916,18 @@ func downloadToTempFile(rawURL string) (string, error) { } func copyFileToClipboard(filePath string) error { - exportedPath, err := exportFileForFlatpak(filePath) - if err != nil { - log.Warnf("document export unavailable: %v, using local path", err) - exportedPath = filePath - } - fileURI := "file://" + exportedPath - - transferKey, err := startPortalFileTransfer(filePath) - if err != nil { - log.Warnf("portal file transfer unavailable: %v", err) - } - - portalOnly := os.Getenv("DMS_PORTAL_ONLY") == "1" - - var offers []clipboard.Offer - if transferKey != "" { - offers = append(offers, clipboard.Offer{ - MimeType: "application/vnd.portal.filetransfer", - Data: []byte(transferKey), - }) - } - if !portalOnly { - offers = append(offers, clipboard.Offer{ - MimeType: "text/uri-list", - Data: []byte(fileURI + "\r\n"), - }) - } - - if len(offers) == 0 { - return fmt.Errorf("no clipboard offers available") - } - - return clipboard.CopyMulti(offers, clipCopyForeground, clipCopyPasteOnce) -} - -func exportFileForFlatpak(filePath string) (string, error) { req := models.Request{ ID: 1, - Method: "clipboard.exportFile", - Params: map[string]any{ - "filePath": filePath, - }, + Method: "clipboard.copyFile", + Params: map[string]any{"filePath": filePath}, } resp, err := sendServerRequest(req) if err != nil { - return "", fmt.Errorf("server request: %w", err) + return fmt.Errorf("server request: %w", err) } - if resp.Error != "" { - return "", fmt.Errorf("server error: %s", resp.Error) + return fmt.Errorf("server error: %s", resp.Error) } - - result, ok := (*resp.Result).(map[string]any) - if !ok { - return "", fmt.Errorf("invalid response format") - } - - path, ok := result["path"].(string) - if !ok { - return "", fmt.Errorf("missing path in response") - } - - return path, nil -} - -func startPortalFileTransfer(filePath string) (string, error) { - req := models.Request{ - ID: 1, - Method: "clipboard.startFileTransfer", - Params: map[string]any{ - "filePath": filePath, - }, - } - - resp, err := sendServerRequest(req) - if err != nil { - return "", fmt.Errorf("server request: %w", err) - } - - if resp.Error != "" { - return "", fmt.Errorf("server error: %s", resp.Error) - } - - result, ok := (*resp.Result).(map[string]any) - if !ok { - return "", fmt.Errorf("invalid response format") - } - - key, ok := result["key"].(string) - if !ok { - return "", fmt.Errorf("missing key in response") - } - - return key, nil + return nil } diff --git a/core/cmd/dms/commands_doctor.go b/core/cmd/dms/commands_doctor.go index 72ee4587..510d74d0 100644 --- a/core/cmd/dms/commands_doctor.go +++ b/core/cmd/dms/commands_doctor.go @@ -591,7 +591,7 @@ ShellRoot { } ` - if err := os.WriteFile(testScript, []byte(qmlContent), 0644); err != nil { + if err := os.WriteFile(testScript, []byte(qmlContent), 0o644); err != nil { return nil, false } @@ -752,7 +752,7 @@ func checkConfigurationFiles() []checkResult { status := statusOK message := "Present" - if info.Mode().Perm()&0200 == 0 { + if info.Mode().Perm()&0o200 == 0 { status = statusWarn message += " (read-only)" } diff --git a/core/internal/clipboard/store.go b/core/internal/clipboard/store.go index 70a73ce4..17ad7a92 100644 --- a/core/internal/clipboard/store.go +++ b/core/internal/clipboard/store.go @@ -60,7 +60,7 @@ func StoreWithConfig(data []byte, mimeType string, cfg StoreConfig) error { return fmt.Errorf("get db path: %w", err) } - db, err := bolt.Open(dbPath, 0644, &bolt.Options{Timeout: 1 * time.Second}) + db, err := bolt.Open(dbPath, 0o644, &bolt.Options{Timeout: 1 * time.Second}) if err != nil { return fmt.Errorf("open db: %w", err) } @@ -132,7 +132,7 @@ func GetDBPath() (string, error) { oldPath := filepath.Join(oldDir, "db") if _, err := os.Stat(oldPath); err == nil { - if err := os.MkdirAll(newDir, 0700); err != nil { + if err := os.MkdirAll(newDir, 0o700); err != nil { return "", err } if err := os.Rename(oldPath, newPath); err != nil { @@ -142,7 +142,7 @@ func GetDBPath() (string, error) { return newPath, nil } - if err := os.MkdirAll(newDir, 0700); err != nil { + if err := os.MkdirAll(newDir, 0o700); err != nil { return "", err } return newPath, nil diff --git a/core/internal/config/deployer.go b/core/internal/config/deployer.go index 05eba8c5..e3a9b407 100644 --- a/core/internal/config/deployer.go +++ b/core/internal/config/deployer.go @@ -126,13 +126,13 @@ func (cd *ConfigDeployer) deployNiriConfig(terminal deps.Terminal, useSystemd bo } configDir := filepath.Dir(result.Path) - if err := os.MkdirAll(configDir, 0755); err != nil { + if err := os.MkdirAll(configDir, 0o755); err != nil { result.Error = fmt.Errorf("failed to create config directory: %w", err) return result, result.Error } dmsDir := filepath.Join(configDir, "dms") - if err := os.MkdirAll(dmsDir, 0755); err != nil { + if err := os.MkdirAll(dmsDir, 0o755); err != nil { result.Error = fmt.Errorf("failed to create dms directory: %w", err) return result, result.Error } @@ -150,7 +150,7 @@ func (cd *ConfigDeployer) deployNiriConfig(terminal deps.Terminal, useSystemd bo timestamp := time.Now().Format("2006-01-02_15-04-05") result.BackupPath = result.Path + ".backup." + timestamp - if err := os.WriteFile(result.BackupPath, existingData, 0644); err != nil { + if err := os.WriteFile(result.BackupPath, existingData, 0o644); err != nil { result.Error = fmt.Errorf("failed to create backup: %w", err) return result, result.Error } @@ -185,7 +185,7 @@ func (cd *ConfigDeployer) deployNiriConfig(terminal deps.Terminal, useSystemd bo } } - if err := os.WriteFile(result.Path, []byte(newConfig), 0644); err != nil { + if err := os.WriteFile(result.Path, []byte(newConfig), 0o644); err != nil { result.Error = fmt.Errorf("failed to write config: %w", err) return result, result.Error } @@ -220,7 +220,7 @@ func (cd *ConfigDeployer) deployNiriDmsConfigs(dmsDir, terminalCommand string) e cd.log(fmt.Sprintf("Skipping %s (already exists)", cfg.name)) continue } - if err := os.WriteFile(path, []byte(cfg.content), 0644); err != nil { + if err := os.WriteFile(path, []byte(cfg.content), 0o644); err != nil { return fmt.Errorf("failed to write %s: %w", cfg.name, err) } cd.log(fmt.Sprintf("Deployed %s", cfg.name)) @@ -238,7 +238,7 @@ func (cd *ConfigDeployer) deployGhosttyConfig() ([]DeploymentResult, error) { } configDir := filepath.Dir(mainResult.Path) - if err := os.MkdirAll(configDir, 0755); err != nil { + if err := os.MkdirAll(configDir, 0o755); err != nil { mainResult.Error = fmt.Errorf("failed to create config directory: %w", err) return []DeploymentResult{mainResult}, mainResult.Error } @@ -254,14 +254,14 @@ func (cd *ConfigDeployer) deployGhosttyConfig() ([]DeploymentResult, error) { timestamp := time.Now().Format("2006-01-02_15-04-05") mainResult.BackupPath = mainResult.Path + ".backup." + timestamp - if err := os.WriteFile(mainResult.BackupPath, existingData, 0644); err != nil { + if err := os.WriteFile(mainResult.BackupPath, existingData, 0o644); err != nil { mainResult.Error = fmt.Errorf("failed to create backup: %w", err) return []DeploymentResult{mainResult}, mainResult.Error } cd.log(fmt.Sprintf("Backed up existing config to %s", mainResult.BackupPath)) } - if err := os.WriteFile(mainResult.Path, []byte(GhosttyConfig), 0644); err != nil { + if err := os.WriteFile(mainResult.Path, []byte(GhosttyConfig), 0o644); err != nil { mainResult.Error = fmt.Errorf("failed to write config: %w", err) return []DeploymentResult{mainResult}, mainResult.Error } @@ -276,12 +276,12 @@ func (cd *ConfigDeployer) deployGhosttyConfig() ([]DeploymentResult, error) { } themesDir := filepath.Dir(colorResult.Path) - if err := os.MkdirAll(themesDir, 0755); err != nil { + if err := os.MkdirAll(themesDir, 0o755); err != nil { mainResult.Error = fmt.Errorf("failed to create themes directory: %w", err) return []DeploymentResult{mainResult}, mainResult.Error } - if err := os.WriteFile(colorResult.Path, []byte(GhosttyColorConfig), 0644); err != nil { + if err := os.WriteFile(colorResult.Path, []byte(GhosttyColorConfig), 0o644); err != nil { colorResult.Error = fmt.Errorf("failed to write color config: %w", err) return results, colorResult.Error } @@ -302,7 +302,7 @@ func (cd *ConfigDeployer) deployKittyConfig() ([]DeploymentResult, error) { } configDir := filepath.Dir(mainResult.Path) - if err := os.MkdirAll(configDir, 0755); err != nil { + if err := os.MkdirAll(configDir, 0o755); err != nil { mainResult.Error = fmt.Errorf("failed to create config directory: %w", err) return []DeploymentResult{mainResult}, mainResult.Error } @@ -318,14 +318,14 @@ func (cd *ConfigDeployer) deployKittyConfig() ([]DeploymentResult, error) { timestamp := time.Now().Format("2006-01-02_15-04-05") mainResult.BackupPath = mainResult.Path + ".backup." + timestamp - if err := os.WriteFile(mainResult.BackupPath, existingData, 0644); err != nil { + if err := os.WriteFile(mainResult.BackupPath, existingData, 0o644); err != nil { mainResult.Error = fmt.Errorf("failed to create backup: %w", err) return []DeploymentResult{mainResult}, mainResult.Error } cd.log(fmt.Sprintf("Backed up existing config to %s", mainResult.BackupPath)) } - if err := os.WriteFile(mainResult.Path, []byte(KittyConfig), 0644); err != nil { + if err := os.WriteFile(mainResult.Path, []byte(KittyConfig), 0o644); err != nil { mainResult.Error = fmt.Errorf("failed to write config: %w", err) return []DeploymentResult{mainResult}, mainResult.Error } @@ -339,7 +339,7 @@ func (cd *ConfigDeployer) deployKittyConfig() ([]DeploymentResult, error) { Path: filepath.Join(os.Getenv("HOME"), ".config", "kitty", "dank-theme.conf"), } - if err := os.WriteFile(themeResult.Path, []byte(KittyThemeConfig), 0644); err != nil { + if err := os.WriteFile(themeResult.Path, []byte(KittyThemeConfig), 0o644); err != nil { themeResult.Error = fmt.Errorf("failed to write theme config: %w", err) return results, themeResult.Error } @@ -353,7 +353,7 @@ func (cd *ConfigDeployer) deployKittyConfig() ([]DeploymentResult, error) { Path: filepath.Join(os.Getenv("HOME"), ".config", "kitty", "dank-tabs.conf"), } - if err := os.WriteFile(tabsResult.Path, []byte(KittyTabsConfig), 0644); err != nil { + if err := os.WriteFile(tabsResult.Path, []byte(KittyTabsConfig), 0o644); err != nil { tabsResult.Error = fmt.Errorf("failed to write tabs config: %w", err) return results, tabsResult.Error } @@ -374,7 +374,7 @@ func (cd *ConfigDeployer) deployAlacrittyConfig() ([]DeploymentResult, error) { } configDir := filepath.Dir(mainResult.Path) - if err := os.MkdirAll(configDir, 0755); err != nil { + if err := os.MkdirAll(configDir, 0o755); err != nil { mainResult.Error = fmt.Errorf("failed to create config directory: %w", err) return []DeploymentResult{mainResult}, mainResult.Error } @@ -390,14 +390,14 @@ func (cd *ConfigDeployer) deployAlacrittyConfig() ([]DeploymentResult, error) { timestamp := time.Now().Format("2006-01-02_15-04-05") mainResult.BackupPath = mainResult.Path + ".backup." + timestamp - if err := os.WriteFile(mainResult.BackupPath, existingData, 0644); err != nil { + if err := os.WriteFile(mainResult.BackupPath, existingData, 0o644); err != nil { mainResult.Error = fmt.Errorf("failed to create backup: %w", err) return []DeploymentResult{mainResult}, mainResult.Error } cd.log(fmt.Sprintf("Backed up existing config to %s", mainResult.BackupPath)) } - if err := os.WriteFile(mainResult.Path, []byte(AlacrittyConfig), 0644); err != nil { + if err := os.WriteFile(mainResult.Path, []byte(AlacrittyConfig), 0o644); err != nil { mainResult.Error = fmt.Errorf("failed to write config: %w", err) return []DeploymentResult{mainResult}, mainResult.Error } @@ -411,7 +411,7 @@ func (cd *ConfigDeployer) deployAlacrittyConfig() ([]DeploymentResult, error) { Path: filepath.Join(os.Getenv("HOME"), ".config", "alacritty", "dank-theme.toml"), } - if err := os.WriteFile(themeResult.Path, []byte(AlacrittyThemeConfig), 0644); err != nil { + if err := os.WriteFile(themeResult.Path, []byte(AlacrittyThemeConfig), 0o644); err != nil { themeResult.Error = fmt.Errorf("failed to write theme config: %w", err) return results, themeResult.Error } @@ -438,7 +438,7 @@ func (cd *ConfigDeployer) mergeNiriOutputSections(newConfig, existingConfig, dms outputsContent.WriteString(output) outputsContent.WriteString("\n\n") } - if err := os.WriteFile(outputsPath, []byte(outputsContent.String()), 0644); err != nil { + if err := os.WriteFile(outputsPath, []byte(outputsContent.String()), 0o644); err != nil { cd.log(fmt.Sprintf("Warning: Failed to migrate outputs to %s: %v", outputsPath, err)) } else { cd.log("Migrated output sections to dms/outputs.kdl") @@ -479,13 +479,13 @@ func (cd *ConfigDeployer) deployHyprlandConfig(terminal deps.Terminal, useSystem } configDir := filepath.Dir(result.Path) - if err := os.MkdirAll(configDir, 0755); err != nil { + if err := os.MkdirAll(configDir, 0o755); err != nil { result.Error = fmt.Errorf("failed to create config directory: %w", err) return result, result.Error } dmsDir := filepath.Join(configDir, "dms") - if err := os.MkdirAll(dmsDir, 0755); err != nil { + if err := os.MkdirAll(dmsDir, 0o755); err != nil { result.Error = fmt.Errorf("failed to create dms directory: %w", err) return result, result.Error } @@ -503,7 +503,7 @@ func (cd *ConfigDeployer) deployHyprlandConfig(terminal deps.Terminal, useSystem timestamp := time.Now().Format("2006-01-02_15-04-05") result.BackupPath = result.Path + ".backup." + timestamp - if err := os.WriteFile(result.BackupPath, existingData, 0644); err != nil { + if err := os.WriteFile(result.BackupPath, existingData, 0o644); err != nil { result.Error = fmt.Errorf("failed to create backup: %w", err) return result, result.Error } @@ -538,7 +538,7 @@ func (cd *ConfigDeployer) deployHyprlandConfig(terminal deps.Terminal, useSystem } } - if err := os.WriteFile(result.Path, []byte(newConfig), 0644); err != nil { + if err := os.WriteFile(result.Path, []byte(newConfig), 0o644); err != nil { result.Error = fmt.Errorf("failed to write config: %w", err) return result, result.Error } @@ -572,7 +572,7 @@ func (cd *ConfigDeployer) deployHyprlandDmsConfigs(dmsDir string, terminalComman cd.log(fmt.Sprintf("Skipping %s (already exists)", cfg.name)) continue } - if err := os.WriteFile(path, []byte(cfg.content), 0644); err != nil { + if err := os.WriteFile(path, []byte(cfg.content), 0o644); err != nil { return fmt.Errorf("failed to write %s: %w", cfg.name, err) } cd.log(fmt.Sprintf("Deployed %s", cfg.name)) @@ -596,7 +596,7 @@ func (cd *ConfigDeployer) mergeHyprlandMonitorSections(newConfig, existingConfig outputsContent.WriteString(monitor) outputsContent.WriteString("\n") } - if err := os.WriteFile(outputsPath, []byte(outputsContent.String()), 0644); err != nil { + if err := os.WriteFile(outputsPath, []byte(outputsContent.String()), 0o644); err != nil { cd.log(fmt.Sprintf("Warning: Failed to migrate monitors to %s: %v", outputsPath, err)) } else { cd.log("Migrated monitor sections to dms/outputs.conf") diff --git a/core/internal/config/deployer_test.go b/core/internal/config/deployer_test.go index 8cf25a60..b0a8048e 100644 --- a/core/internal/config/deployer_test.go +++ b/core/internal/config/deployer_test.go @@ -220,9 +220,9 @@ func TestConfigDeploymentFlow(t *testing.T) { t.Run("deploy ghostty config with existing file", func(t *testing.T) { existingContent := "# Old config\nfont-size = 14\n" ghosttyPath := getGhosttyPath() - err := os.MkdirAll(filepath.Dir(ghosttyPath), 0755) + err := os.MkdirAll(filepath.Dir(ghosttyPath), 0o755) require.NoError(t, err) - err = os.WriteFile(ghosttyPath, []byte(existingContent), 0644) + err = os.WriteFile(ghosttyPath, []byte(existingContent), 0o644) require.NoError(t, err) results, err := cd.deployGhosttyConfig() @@ -422,9 +422,9 @@ general { } ` hyprPath := filepath.Join(tempDir, ".config", "hypr", "hyprland.conf") - err := os.MkdirAll(filepath.Dir(hyprPath), 0755) + err := os.MkdirAll(filepath.Dir(hyprPath), 0o755) require.NoError(t, err) - err = os.WriteFile(hyprPath, []byte(existingContent), 0644) + err = os.WriteFile(hyprPath, []byte(existingContent), 0o644) require.NoError(t, err) result, err := cd.deployHyprlandConfig(deps.TerminalKitty, true) @@ -600,9 +600,9 @@ func TestAlacrittyConfigDeployment(t *testing.T) { t.Run("deploy alacritty config with existing file", func(t *testing.T) { existingContent := "# Old alacritty config\n[window]\nopacity = 0.9\n" alacrittyPath := filepath.Join(tempDir, ".config", "alacritty", "alacritty.toml") - err := os.MkdirAll(filepath.Dir(alacrittyPath), 0755) + err := os.MkdirAll(filepath.Dir(alacrittyPath), 0o755) require.NoError(t, err) - err = os.WriteFile(alacrittyPath, []byte(existingContent), 0644) + err = os.WriteFile(alacrittyPath, []byte(existingContent), 0o644) require.NoError(t, err) results, err := cd.deployAlacrittyConfig() diff --git a/core/internal/distros/base.go b/core/internal/distros/base.go index 7b6878e8..d8a4724d 100644 --- a/core/internal/distros/base.go +++ b/core/internal/distros/base.go @@ -534,7 +534,7 @@ func (b *BaseDistribution) WriteEnvironmentConfig(terminal deps.Terminal) error } envDir := filepath.Join(homeDir, ".config", "environment.d") - if err := os.MkdirAll(envDir, 0755); err != nil { + if err := os.MkdirAll(envDir, 0o755); err != nil { return fmt.Errorf("failed to create environment.d directory: %w", err) } @@ -555,7 +555,7 @@ TERMINAL=%s `, terminalCmd) envFile := filepath.Join(envDir, "90-dms.conf") - if err := os.WriteFile(envFile, []byte(content), 0644); err != nil { + if err := os.WriteFile(envFile, []byte(content), 0o644); err != nil { return fmt.Errorf("failed to write environment config: %w", err) } @@ -594,7 +594,7 @@ func (b *BaseDistribution) WriteHyprlandSessionTarget() error { } targetDir := filepath.Join(homeDir, ".config", "systemd", "user") - if err := os.MkdirAll(targetDir, 0755); err != nil { + if err := os.MkdirAll(targetDir, 0o755); err != nil { return fmt.Errorf("failed to create systemd user directory: %w", err) } @@ -605,7 +605,7 @@ Requires=graphical-session.target After=graphical-session.target ` - if err := os.WriteFile(targetPath, []byte(content), 0644); err != nil { + if err := os.WriteFile(targetPath, []byte(content), 0o644); err != nil { return fmt.Errorf("failed to write hyprland-session.target: %w", err) } diff --git a/core/internal/distros/base_test.go b/core/internal/distros/base_test.go index d4b497d9..51e86d72 100644 --- a/core/internal/distros/base_test.go +++ b/core/internal/distros/base_test.go @@ -43,7 +43,7 @@ func TestBaseDistribution_detectDMS_Installed(t *testing.T) { tempDir := t.TempDir() dmsPath := filepath.Join(tempDir, ".config", "quickshell", "dms") - os.MkdirAll(dmsPath, 0755) + os.MkdirAll(dmsPath, 0o755) originalHome := os.Getenv("HOME") defer os.Setenv("HOME", originalHome) @@ -55,7 +55,7 @@ func TestBaseDistribution_detectDMS_Installed(t *testing.T) { exec.Command("git", "-C", dmsPath, "checkout", "-b", "master").Run() testFile := filepath.Join(dmsPath, "test.txt") - os.WriteFile(testFile, []byte("test"), 0644) + os.WriteFile(testFile, []byte("test"), 0o644) exec.Command("git", "-C", dmsPath, "add", ".").Run() exec.Command("git", "-C", dmsPath, "commit", "-m", "initial").Run() @@ -87,7 +87,7 @@ func TestBaseDistribution_detectDMS_NeedsUpdate(t *testing.T) { tempDir := t.TempDir() dmsPath := filepath.Join(tempDir, ".config", "quickshell", "dms") - os.MkdirAll(dmsPath, 0755) + os.MkdirAll(dmsPath, 0o755) originalHome := os.Getenv("HOME") defer os.Setenv("HOME", originalHome) @@ -99,7 +99,7 @@ func TestBaseDistribution_detectDMS_NeedsUpdate(t *testing.T) { exec.Command("git", "-C", dmsPath, "remote", "add", "origin", "https://github.com/AvengeMedia/DankMaterialShell.git").Run() testFile := filepath.Join(dmsPath, "test.txt") - os.WriteFile(testFile, []byte("test"), 0644) + os.WriteFile(testFile, []byte("test"), 0o644) exec.Command("git", "-C", dmsPath, "add", ".").Run() exec.Command("git", "-C", dmsPath, "commit", "-m", "initial").Run() exec.Command("git", "-C", dmsPath, "tag", "v0.0.1").Run() @@ -125,7 +125,7 @@ func TestBaseDistribution_detectDMS_NeedsUpdate(t *testing.T) { func TestBaseDistribution_detectDMS_DirectoryWithoutGit(t *testing.T) { tempDir := t.TempDir() dmsPath := filepath.Join(tempDir, ".config", "quickshell", "dms") - os.MkdirAll(dmsPath, 0755) + os.MkdirAll(dmsPath, 0o755) originalHome := os.Getenv("HOME") defer os.Setenv("HOME", originalHome) diff --git a/core/internal/distros/opensuse.go b/core/internal/distros/opensuse.go index a16ba620..dfee885d 100644 --- a/core/internal/distros/opensuse.go +++ b/core/internal/distros/opensuse.go @@ -540,12 +540,12 @@ func (o *OpenSUSEDistribution) installQuickshell(ctx context.Context, variant de } cacheDir := filepath.Join(homeDir, ".cache", "dankinstall") - if err := os.MkdirAll(cacheDir, 0755); err != nil { + if err := os.MkdirAll(cacheDir, 0o755); err != nil { return fmt.Errorf("failed to create cache directory: %w", err) } tmpDir := filepath.Join(cacheDir, "quickshell-build") - if err := os.MkdirAll(tmpDir, 0755); err != nil { + if err := os.MkdirAll(tmpDir, 0o755); err != nil { return fmt.Errorf("failed to create temp directory: %w", err) } defer os.RemoveAll(tmpDir) @@ -576,7 +576,7 @@ func (o *OpenSUSEDistribution) installQuickshell(ctx context.Context, variant de } buildDir := tmpDir + "/build" - if err := os.MkdirAll(buildDir, 0755); err != nil { + if err := os.MkdirAll(buildDir, 0o755); err != nil { return fmt.Errorf("failed to create build directory: %w", err) } diff --git a/core/internal/greeter/installer.go b/core/internal/greeter/installer.go index 523f61fc..8f8133ff 100644 --- a/core/internal/greeter/installer.go +++ b/core/internal/greeter/installer.go @@ -235,7 +235,7 @@ func SetupParentDirectoryACLs(logFunc func(string), sudoPassword string) error { for _, dir := range parentDirs { if _, err := os.Stat(dir.path); os.IsNotExist(err) { - if err := os.MkdirAll(dir.path, 0755); err != nil { + if err := os.MkdirAll(dir.path, 0o755); err != nil { logFunc(fmt.Sprintf("⚠ Warning: Could not create %s: %v", dir.desc, err)) continue } @@ -295,7 +295,7 @@ func SetupDMSGroup(logFunc func(string), sudoPassword string) error { for _, dir := range configDirs { if _, err := os.Stat(dir.path); os.IsNotExist(err) { - if err := os.MkdirAll(dir.path, 0755); err != nil { + if err := os.MkdirAll(dir.path, 0o755); err != nil { logFunc(fmt.Sprintf("⚠ Warning: Could not create %s: %v", dir.path, err)) continue } @@ -355,14 +355,14 @@ func SyncDMSConfigs(dmsPath string, logFunc func(string), sudoPassword string) e for _, link := range symlinks { sourceDir := filepath.Dir(link.source) if _, err := os.Stat(sourceDir); os.IsNotExist(err) { - if err := os.MkdirAll(sourceDir, 0755); err != nil { + if err := os.MkdirAll(sourceDir, 0o755); err != nil { logFunc(fmt.Sprintf("⚠ Warning: Could not create directory %s: %v", sourceDir, err)) continue } } if _, err := os.Stat(link.source); os.IsNotExist(err) { - if err := os.WriteFile(link.source, []byte("{}"), 0644); err != nil { + if err := os.WriteFile(link.source, []byte("{}"), 0o644); err != nil { logFunc(fmt.Sprintf("⚠ Warning: Could not create %s: %v", link.source, err)) continue } @@ -455,7 +455,7 @@ user = "greeter" newConfig := strings.Join(finalLines, "\n") tmpFile := "/tmp/greetd-config.toml" - if err := os.WriteFile(tmpFile, []byte(newConfig), 0644); err != nil { + if err := os.WriteFile(tmpFile, []byte(newConfig), 0o644); err != nil { return fmt.Errorf("failed to write temp config: %w", err) } diff --git a/core/internal/keybinds/discovery_test.go b/core/internal/keybinds/discovery_test.go index 4cd6de3e..a78724eb 100644 --- a/core/internal/keybinds/discovery_test.go +++ b/core/internal/keybinds/discovery_test.go @@ -79,16 +79,16 @@ func TestFindJSONFiles(t *testing.T) { txtFile := filepath.Join(tmpDir, "readme.txt") subdir := filepath.Join(tmpDir, "subdir") - if err := os.WriteFile(file1, []byte("{}"), 0644); err != nil { + if err := os.WriteFile(file1, []byte("{}"), 0o644); err != nil { t.Fatalf("Failed to create file1: %v", err) } - if err := os.WriteFile(file2, []byte("{}"), 0644); err != nil { + if err := os.WriteFile(file2, []byte("{}"), 0o644); err != nil { t.Fatalf("Failed to create file2: %v", err) } - if err := os.WriteFile(txtFile, []byte("text"), 0644); err != nil { + if err := os.WriteFile(txtFile, []byte("text"), 0o644); err != nil { t.Fatalf("Failed to create txt file: %v", err) } - if err := os.MkdirAll(subdir, 0755); err != nil { + if err := os.MkdirAll(subdir, 0o755); err != nil { t.Fatalf("Failed to create subdir: %v", err) } @@ -143,10 +143,10 @@ func TestFindJSONFilesMultiplePaths(t *testing.T) { file1 := filepath.Join(tmpDir1, "app1.json") file2 := filepath.Join(tmpDir2, "app2.json") - if err := os.WriteFile(file1, []byte("{}"), 0644); err != nil { + if err := os.WriteFile(file1, []byte("{}"), 0o644); err != nil { t.Fatalf("Failed to create file1: %v", err) } - if err := os.WriteFile(file2, []byte("{}"), 0644); err != nil { + if err := os.WriteFile(file2, []byte("{}"), 0o644); err != nil { t.Fatalf("Failed to create file2: %v", err) } @@ -174,7 +174,7 @@ func TestAutoDiscoverProviders(t *testing.T) { }` file := filepath.Join(tmpDir, "testapp.json") - if err := os.WriteFile(file, []byte(jsonContent), 0644); err != nil { + if err := os.WriteFile(file, []byte(jsonContent), 0o644); err != nil { t.Fatalf("Failed to create test file: %v", err) } @@ -226,7 +226,7 @@ func TestAutoDiscoverProvidersNoFactory(t *testing.T) { tmpDir := t.TempDir() file := filepath.Join(tmpDir, "test.json") - if err := os.WriteFile(file, []byte("{}"), 0644); err != nil { + if err := os.WriteFile(file, []byte("{}"), 0o644); err != nil { t.Fatalf("Failed to create test file: %v", err) } diff --git a/core/internal/keybinds/providers/hyprland.go b/core/internal/keybinds/providers/hyprland.go index fad70777..e43a9ebf 100644 --- a/core/internal/keybinds/providers/hyprland.go +++ b/core/internal/keybinds/providers/hyprland.go @@ -216,7 +216,7 @@ func (h *HyprlandProvider) SetBind(key, action, description string, options map[ overridePath := h.GetOverridePath() - if err := os.MkdirAll(filepath.Dir(overridePath), 0755); err != nil { + if err := os.MkdirAll(filepath.Dir(overridePath), 0o755); err != nil { return fmt.Errorf("failed to create dms directory: %w", err) } @@ -398,7 +398,7 @@ func (h *HyprlandProvider) getBindSortPriority(action string) int { func (h *HyprlandProvider) writeOverrideBinds(binds map[string]*hyprlandOverrideBind) error { overridePath := h.GetOverridePath() content := h.generateBindsContent(binds) - return os.WriteFile(overridePath, []byte(content), 0644) + return os.WriteFile(overridePath, []byte(content), 0o644) } func (h *HyprlandProvider) generateBindsContent(binds map[string]*hyprlandOverrideBind) string { diff --git a/core/internal/keybinds/providers/hyprland_parser_test.go b/core/internal/keybinds/providers/hyprland_parser_test.go index 84dfbc15..c2872e5e 100644 --- a/core/internal/keybinds/providers/hyprland_parser_test.go +++ b/core/internal/keybinds/providers/hyprland_parser_test.go @@ -187,7 +187,7 @@ bind = SUPER, right, movefocus, r bind = SUPER, T, exec, kitty # Terminal ` - if err := os.WriteFile(configFile, []byte(content), 0644); err != nil { + if err := os.WriteFile(configFile, []byte(content), 0o644); err != nil { t.Fatalf("Failed to write test config: %v", err) } @@ -245,7 +245,7 @@ bind = SUPER, B, exec, app2 #/# = SUPER, C, exec, app3 # Custom comment ` - if err := os.WriteFile(configFile, []byte(content), 0644); err != nil { + if err := os.WriteFile(configFile, []byte(content), 0o644); err != nil { t.Fatalf("Failed to write test config: %v", err) } @@ -278,10 +278,10 @@ func TestHyprlandReadContentMultipleFiles(t *testing.T) { content1 := "bind = SUPER, Q, killactive\n" content2 := "bind = SUPER, T, exec, kitty\n" - if err := os.WriteFile(file1, []byte(content1), 0644); err != nil { + if err := os.WriteFile(file1, []byte(content1), 0o644); err != nil { t.Fatalf("Failed to write file1: %v", err) } - if err := os.WriteFile(file2, []byte(content2), 0644); err != nil { + if err := os.WriteFile(file2, []byte(content2), 0o644); err != nil { t.Fatalf("Failed to write file2: %v", err) } @@ -328,13 +328,13 @@ func TestHyprlandReadContentWithTildeExpansion(t *testing.T) { } tmpSubdir := filepath.Join(homeDir, ".config", "test-hypr-"+t.Name()) - if err := os.MkdirAll(tmpSubdir, 0755); err != nil { + if err := os.MkdirAll(tmpSubdir, 0o755); err != nil { t.Skip("Cannot create test directory in home") } defer os.RemoveAll(tmpSubdir) configFile := filepath.Join(tmpSubdir, "test.conf") - if err := os.WriteFile(configFile, []byte("bind = SUPER, Q, killactive\n"), 0644); err != nil { + if err := os.WriteFile(configFile, []byte("bind = SUPER, Q, killactive\n"), 0o644); err != nil { t.Fatalf("Failed to write test config: %v", err) } @@ -381,7 +381,7 @@ bind = SUPER, Q, killactive bind = SUPER, T, exec, kitty ` - if err := os.WriteFile(configFile, []byte(content), 0644); err != nil { + if err := os.WriteFile(configFile, []byte(content), 0o644); err != nil { t.Fatalf("Failed to write test config: %v", err) } diff --git a/core/internal/keybinds/providers/hyprland_test.go b/core/internal/keybinds/providers/hyprland_test.go index 3edf0b36..90dfe97e 100644 --- a/core/internal/keybinds/providers/hyprland_test.go +++ b/core/internal/keybinds/providers/hyprland_test.go @@ -57,7 +57,7 @@ bind = SUPER, T, exec, kitty # Terminal bind = SUPER, 1, workspace, 1 ` - if err := os.WriteFile(configFile, []byte(content), 0644); err != nil { + if err := os.WriteFile(configFile, []byte(content), 0o644); err != nil { t.Fatalf("Failed to write test config: %v", err) } @@ -134,7 +134,7 @@ func TestFormatKey(t *testing.T) { for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - if err := os.WriteFile(configFile, []byte(tt.content), 0644); err != nil { + if err := os.WriteFile(configFile, []byte(tt.content), 0o644); err != nil { t.Fatalf("Failed to write test config: %v", err) } @@ -189,7 +189,7 @@ func TestDescriptionFallback(t *testing.T) { for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - if err := os.WriteFile(configFile, []byte(tt.content), 0644); err != nil { + if err := os.WriteFile(configFile, []byte(tt.content), 0o644); err != nil { t.Fatalf("Failed to write test config: %v", err) } diff --git a/core/internal/keybinds/providers/mangowc.go b/core/internal/keybinds/providers/mangowc.go index 7e94fadc..348ee7c5 100644 --- a/core/internal/keybinds/providers/mangowc.go +++ b/core/internal/keybinds/providers/mangowc.go @@ -218,7 +218,7 @@ func (m *MangoWCProvider) SetBind(key, action, description string, options map[s overridePath := m.GetOverridePath() - if err := os.MkdirAll(filepath.Dir(overridePath), 0755); err != nil { + if err := os.MkdirAll(filepath.Dir(overridePath), 0o755); err != nil { return fmt.Errorf("failed to create dms directory: %w", err) } @@ -360,7 +360,7 @@ func (m *MangoWCProvider) getBindSortPriority(action string) int { func (m *MangoWCProvider) writeOverrideBinds(binds map[string]*mangowcOverrideBind) error { overridePath := m.GetOverridePath() content := m.generateBindsContent(binds) - return os.WriteFile(overridePath, []byte(content), 0644) + return os.WriteFile(overridePath, []byte(content), 0o644) } func (m *MangoWCProvider) generateBindsContent(binds map[string]*mangowcOverrideBind) string { diff --git a/core/internal/keybinds/providers/mangowc_parser_test.go b/core/internal/keybinds/providers/mangowc_parser_test.go index fc83cdb3..016f50e4 100644 --- a/core/internal/keybinds/providers/mangowc_parser_test.go +++ b/core/internal/keybinds/providers/mangowc_parser_test.go @@ -238,7 +238,7 @@ bind=Ctrl,1,view,1,0 bind=Ctrl,2,view,2,0 ` - if err := os.WriteFile(configFile, []byte(content), 0644); err != nil { + if err := os.WriteFile(configFile, []byte(content), 0o644); err != nil { t.Fatalf("Failed to write test config: %v", err) } @@ -276,10 +276,10 @@ func TestMangoWCReadContentMultipleFiles(t *testing.T) { content1 := "bind=ALT,q,killclient,\n" content2 := "bind=Alt,t,spawn,kitty\n" - if err := os.WriteFile(file1, []byte(content1), 0644); err != nil { + if err := os.WriteFile(file1, []byte(content1), 0o644); err != nil { t.Fatalf("Failed to write file1: %v", err) } - if err := os.WriteFile(file2, []byte(content2), 0644); err != nil { + if err := os.WriteFile(file2, []byte(content2), 0o644); err != nil { t.Fatalf("Failed to write file2: %v", err) } @@ -300,7 +300,7 @@ func TestMangoWCReadContentSingleFile(t *testing.T) { content := "bind=ALT,q,killclient,\n" - if err := os.WriteFile(configFile, []byte(content), 0644); err != nil { + if err := os.WriteFile(configFile, []byte(content), 0o644); err != nil { t.Fatalf("Failed to write config: %v", err) } @@ -347,13 +347,13 @@ func TestMangoWCReadContentWithTildeExpansion(t *testing.T) { } tmpSubdir := filepath.Join(homeDir, ".config", "test-mango-"+t.Name()) - if err := os.MkdirAll(tmpSubdir, 0755); err != nil { + if err := os.MkdirAll(tmpSubdir, 0o755); err != nil { t.Skip("Cannot create test directory in home") } defer os.RemoveAll(tmpSubdir) configFile := filepath.Join(tmpSubdir, "config.conf") - if err := os.WriteFile(configFile, []byte("bind=ALT,q,killclient,\n"), 0644); err != nil { + if err := os.WriteFile(configFile, []byte("bind=ALT,q,killclient,\n"), 0o644); err != nil { t.Fatalf("Failed to write test config: %v", err) } @@ -384,7 +384,7 @@ bind=ALT,q,killclient, bind=Alt,t,spawn,kitty ` - if err := os.WriteFile(configFile, []byte(content), 0644); err != nil { + if err := os.WriteFile(configFile, []byte(content), 0o644); err != nil { t.Fatalf("Failed to write test config: %v", err) } @@ -458,7 +458,7 @@ bind=Ctrl,2,view,2,0 bind=Ctrl,3,view,3,0 ` - if err := os.WriteFile(configFile, []byte(content), 0644); err != nil { + if err := os.WriteFile(configFile, []byte(content), 0o644); err != nil { t.Fatalf("Failed to write test config: %v", err) } diff --git a/core/internal/keybinds/providers/mangowc_test.go b/core/internal/keybinds/providers/mangowc_test.go index ce167eb4..d417ce16 100644 --- a/core/internal/keybinds/providers/mangowc_test.go +++ b/core/internal/keybinds/providers/mangowc_test.go @@ -223,7 +223,7 @@ bind=SUPER,n,switch_layout bind=ALT+SHIFT,X,incgaps,1 ` - if err := os.WriteFile(configFile, []byte(content), 0644); err != nil { + if err := os.WriteFile(configFile, []byte(content), 0o644); err != nil { t.Fatalf("Failed to write test config: %v", err) } @@ -285,7 +285,7 @@ bind=ALT,Left,focusdir,left bind=Ctrl,1,view,1,0 ` - if err := os.WriteFile(configFile, []byte(content), 0644); err != nil { + if err := os.WriteFile(configFile, []byte(content), 0o644); err != nil { t.Fatalf("Failed to write test config: %v", err) } diff --git a/core/internal/keybinds/providers/niri.go b/core/internal/keybinds/providers/niri.go index 1044d121..2d44d60f 100644 --- a/core/internal/keybinds/providers/niri.go +++ b/core/internal/keybinds/providers/niri.go @@ -235,7 +235,7 @@ func (n *NiriProvider) SetBind(key, action, description string, options map[stri overridePath := n.GetOverridePath() - if err := os.MkdirAll(filepath.Dir(overridePath), 0755); err != nil { + if err := os.MkdirAll(filepath.Dir(overridePath), 0o755); err != nil { return fmt.Errorf("failed to create dms directory: %w", err) } @@ -485,7 +485,7 @@ func (n *NiriProvider) writeOverrideBinds(binds map[string]*overrideBind) error return err } - return os.WriteFile(overridePath, []byte(content), 0644) + return os.WriteFile(overridePath, []byte(content), 0o644) } func (n *NiriProvider) getBindSortPriority(action string) int { diff --git a/core/internal/keybinds/providers/niri_parser_test.go b/core/internal/keybinds/providers/niri_parser_test.go index 937017b0..e21fde56 100644 --- a/core/internal/keybinds/providers/niri_parser_test.go +++ b/core/internal/keybinds/providers/niri_parser_test.go @@ -53,7 +53,7 @@ func TestNiriParseBasicBinds(t *testing.T) { Mod+T hotkey-overlay-title="Open Terminal" { spawn "kitty"; } } ` - if err := os.WriteFile(configFile, []byte(content), 0644); err != nil { + if err := os.WriteFile(configFile, []byte(content), 0o644); err != nil { t.Fatalf("Failed to write test config: %v", err) } @@ -112,7 +112,7 @@ func TestNiriParseRecentWindows(t *testing.T) { } } ` - if err := os.WriteFile(configFile, []byte(content), 0644); err != nil { + if err := os.WriteFile(configFile, []byte(content), 0o644); err != nil { t.Fatalf("Failed to write test config: %v", err) } @@ -148,7 +148,7 @@ func TestNiriParseRecentWindows(t *testing.T) { func TestNiriParseInclude(t *testing.T) { tmpDir := t.TempDir() subDir := filepath.Join(tmpDir, "dms") - if err := os.MkdirAll(subDir, 0755); err != nil { + if err := os.MkdirAll(subDir, 0o755); err != nil { t.Fatalf("Failed to create subdir: %v", err) } @@ -165,10 +165,10 @@ include "dms/binds.kdl" } ` - if err := os.WriteFile(mainConfig, []byte(mainContent), 0644); err != nil { + if err := os.WriteFile(mainConfig, []byte(mainContent), 0o644); err != nil { t.Fatalf("Failed to write main config: %v", err) } - if err := os.WriteFile(includeConfig, []byte(includeContent), 0644); err != nil { + if err := os.WriteFile(includeConfig, []byte(includeContent), 0o644); err != nil { t.Fatalf("Failed to write include config: %v", err) } @@ -185,7 +185,7 @@ include "dms/binds.kdl" func TestNiriParseIncludeOverride(t *testing.T) { tmpDir := t.TempDir() subDir := filepath.Join(tmpDir, "dms") - if err := os.MkdirAll(subDir, 0755); err != nil { + if err := os.MkdirAll(subDir, 0o755); err != nil { t.Fatalf("Failed to create subdir: %v", err) } @@ -202,10 +202,10 @@ include "dms/binds.kdl" } ` - if err := os.WriteFile(mainConfig, []byte(mainContent), 0644); err != nil { + if err := os.WriteFile(mainConfig, []byte(mainContent), 0o644); err != nil { t.Fatalf("Failed to write main config: %v", err) } - if err := os.WriteFile(includeConfig, []byte(includeContent), 0644); err != nil { + if err := os.WriteFile(includeConfig, []byte(includeContent), 0o644); err != nil { t.Fatalf("Failed to write include config: %v", err) } @@ -246,10 +246,10 @@ include "other.kdl" include "config.kdl" ` - if err := os.WriteFile(mainConfig, []byte(mainContent), 0644); err != nil { + if err := os.WriteFile(mainConfig, []byte(mainContent), 0o644); err != nil { t.Fatalf("Failed to write main config: %v", err) } - if err := os.WriteFile(otherConfig, []byte(otherContent), 0644); err != nil { + if err := os.WriteFile(otherConfig, []byte(otherContent), 0o644); err != nil { t.Fatalf("Failed to write other config: %v", err) } @@ -272,7 +272,7 @@ func TestNiriParseMissingInclude(t *testing.T) { } include "nonexistent/file.kdl" ` - if err := os.WriteFile(configFile, []byte(content), 0644); err != nil { + if err := os.WriteFile(configFile, []byte(content), 0o644); err != nil { t.Fatalf("Failed to write test config: %v", err) } @@ -301,7 +301,7 @@ input { } } ` - if err := os.WriteFile(configFile, []byte(content), 0644); err != nil { + if err := os.WriteFile(configFile, []byte(content), 0o644); err != nil { t.Fatalf("Failed to write test config: %v", err) } @@ -348,7 +348,7 @@ func TestNiriBindOverrideBehavior(t *testing.T) { Mod+T hotkey-overlay-title="Third" { spawn "third"; } } ` - if err := os.WriteFile(configFile, []byte(content), 0644); err != nil { + if err := os.WriteFile(configFile, []byte(content), 0o644); err != nil { t.Fatalf("Failed to write test config: %v", err) } @@ -386,7 +386,7 @@ func TestNiriBindOverrideBehavior(t *testing.T) { func TestNiriBindOverrideWithIncludes(t *testing.T) { tmpDir := t.TempDir() subDir := filepath.Join(tmpDir, "custom") - if err := os.MkdirAll(subDir, 0755); err != nil { + if err := os.MkdirAll(subDir, 0o755); err != nil { t.Fatalf("Failed to create subdir: %v", err) } @@ -409,10 +409,10 @@ binds { } ` - if err := os.WriteFile(mainConfig, []byte(mainContent), 0644); err != nil { + if err := os.WriteFile(mainConfig, []byte(mainContent), 0o644); err != nil { t.Fatalf("Failed to write main config: %v", err) } - if err := os.WriteFile(includeConfig, []byte(includeContent), 0644); err != nil { + if err := os.WriteFile(includeConfig, []byte(includeContent), 0o644); err != nil { t.Fatalf("Failed to write include config: %v", err) } @@ -471,7 +471,7 @@ func TestNiriParseMultipleArgs(t *testing.T) { } } ` - if err := os.WriteFile(configFile, []byte(content), 0644); err != nil { + if err := os.WriteFile(configFile, []byte(content), 0o644); err != nil { t.Fatalf("Failed to write test config: %v", err) } @@ -508,7 +508,7 @@ func TestNiriParseNumericWorkspaceBinds(t *testing.T) { Mod+Shift+1 hotkey-overlay-title="Move to Workspace 1" { move-column-to-workspace 1; } } ` - if err := os.WriteFile(configFile, []byte(content), 0644); err != nil { + if err := os.WriteFile(configFile, []byte(content), 0o644); err != nil { t.Fatalf("Failed to write test config: %v", err) } @@ -550,7 +550,7 @@ func TestNiriParseQuotedStringArgs(t *testing.T) { Super+Shift+Minus hotkey-overlay-title="Adjust Window Height -10%" { set-window-height "-10%"; } } ` - if err := os.WriteFile(configFile, []byte(content), 0644); err != nil { + if err := os.WriteFile(configFile, []byte(content), 0o644); err != nil { t.Fatalf("Failed to write test config: %v", err) } @@ -586,7 +586,7 @@ func TestNiriParseActionWithProperties(t *testing.T) { Alt+Tab { next-window scope="output"; } } ` - if err := os.WriteFile(configFile, []byte(content), 0644); err != nil { + if err := os.WriteFile(configFile, []byte(content), 0o644); err != nil { t.Fatalf("Failed to write test config: %v", err) } diff --git a/core/internal/keybinds/providers/niri_test.go b/core/internal/keybinds/providers/niri_test.go index 1ec88aea..b04c5b2d 100644 --- a/core/internal/keybinds/providers/niri_test.go +++ b/core/internal/keybinds/providers/niri_test.go @@ -27,7 +27,7 @@ func TestNiriProviderGetCheatSheet(t *testing.T) { Mod+Shift+E { quit; } } ` - if err := os.WriteFile(configFile, []byte(content), 0644); err != nil { + if err := os.WriteFile(configFile, []byte(content), 0o644); err != nil { t.Fatalf("Failed to write test config: %v", err) } @@ -312,7 +312,7 @@ func TestNiriGenerateBindsContentRoundTrip(t *testing.T) { tmpDir := t.TempDir() configFile := filepath.Join(tmpDir, "config.kdl") - if err := os.WriteFile(configFile, []byte(content), 0644); err != nil { + if err := os.WriteFile(configFile, []byte(content), 0o644); err != nil { t.Fatalf("Failed to write temp file: %v", err) } @@ -351,12 +351,12 @@ func TestNiriEmptyArgsPreservation(t *testing.T) { tmpDir := t.TempDir() dmsDir := filepath.Join(tmpDir, "dms") - if err := os.MkdirAll(dmsDir, 0755); err != nil { + if err := os.MkdirAll(dmsDir, 0o755); err != nil { t.Fatalf("Failed to create dms directory: %v", err) } bindsFile := filepath.Join(dmsDir, "binds.kdl") - if err := os.WriteFile(bindsFile, []byte(content), 0644); err != nil { + if err := os.WriteFile(bindsFile, []byte(content), 0o644); err != nil { t.Fatalf("Failed to write binds file: %v", err) } @@ -428,7 +428,7 @@ recent-windows { } } ` - if err := os.WriteFile(configFile, []byte(content), 0644); err != nil { + if err := os.WriteFile(configFile, []byte(content), 0o644); err != nil { t.Fatalf("Failed to write test config: %v", err) } @@ -621,7 +621,7 @@ func TestNiriGenerateWorkspaceBindsRoundTrip(t *testing.T) { tmpDir := t.TempDir() configFile := filepath.Join(tmpDir, "config.kdl") - if err := os.WriteFile(configFile, []byte(content), 0644); err != nil { + if err := os.WriteFile(configFile, []byte(content), 0o644); err != nil { t.Fatalf("Failed to write temp file: %v", err) } diff --git a/core/internal/keybinds/providers/sway_parser_test.go b/core/internal/keybinds/providers/sway_parser_test.go index 1c7ac94c..6bb5ecfa 100644 --- a/core/internal/keybinds/providers/sway_parser_test.go +++ b/core/internal/keybinds/providers/sway_parser_test.go @@ -200,7 +200,7 @@ bindsym $mod+t exec $term bindsym $mod+d exec $menu ` - if err := os.WriteFile(configFile, []byte(content), 0644); err != nil { + if err := os.WriteFile(configFile, []byte(content), 0o644); err != nil { t.Fatalf("Failed to write test config: %v", err) } @@ -247,7 +247,7 @@ bindsym $mod+Right focus right bindsym $mod+t exec kitty # Terminal ` - if err := os.WriteFile(configFile, []byte(content), 0644); err != nil { + if err := os.WriteFile(configFile, []byte(content), 0o644); err != nil { t.Fatalf("Failed to write test config: %v", err) } @@ -328,13 +328,13 @@ func TestSwayReadContentWithTildeExpansion(t *testing.T) { } tmpSubdir := filepath.Join(homeDir, ".config", "test-sway-"+t.Name()) - if err := os.MkdirAll(tmpSubdir, 0755); err != nil { + if err := os.MkdirAll(tmpSubdir, 0o755); err != nil { t.Skip("Cannot create test directory in home") } defer os.RemoveAll(tmpSubdir) configFile := filepath.Join(tmpSubdir, "config") - if err := os.WriteFile(configFile, []byte("bindsym Mod4+q kill\n"), 0644); err != nil { + if err := os.WriteFile(configFile, []byte("bindsym Mod4+q kill\n"), 0o644); err != nil { t.Fatalf("Failed to write test config: %v", err) } @@ -365,7 +365,7 @@ bindsym Mod4+q kill bindsym Mod4+t exec kitty ` - if err := os.WriteFile(configFile, []byte(content), 0644); err != nil { + if err := os.WriteFile(configFile, []byte(content), 0o644); err != nil { t.Fatalf("Failed to write test config: %v", err) } @@ -404,7 +404,7 @@ bindsym $mod+2 workspace number 2 bindsym $mod+Shift+1 move container to workspace number 1 ` - if err := os.WriteFile(configFile, []byte(content), 0644); err != nil { + if err := os.WriteFile(configFile, []byte(content), 0o644); err != nil { t.Fatalf("Failed to write test config: %v", err) } diff --git a/core/internal/keybinds/providers/sway_test.go b/core/internal/keybinds/providers/sway_test.go index 39396a0b..0b471e60 100644 --- a/core/internal/keybinds/providers/sway_test.go +++ b/core/internal/keybinds/providers/sway_test.go @@ -190,7 +190,7 @@ bindsym $mod+s layout stacking bindsym $mod+w layout tabbed ` - if err := os.WriteFile(configFile, []byte(content), 0644); err != nil { + if err := os.WriteFile(configFile, []byte(content), 0o644); err != nil { t.Fatalf("Failed to write test config: %v", err) } @@ -253,7 +253,7 @@ bindsym $mod+f fullscreen toggle bindsym $mod+1 workspace number 1 ` - if err := os.WriteFile(configFile, []byte(content), 0644); err != nil { + if err := os.WriteFile(configFile, []byte(content), 0o644); err != nil { t.Fatalf("Failed to write test config: %v", err) } diff --git a/core/internal/matugen/matugen.go b/core/internal/matugen/matugen.go index 1289d14a..e71e413a 100644 --- a/core/internal/matugen/matugen.go +++ b/core/internal/matugen/matugen.go @@ -148,7 +148,7 @@ func Run(opts Options) error { opts.AppChecker = utils.DefaultAppChecker{} } - if err := os.MkdirAll(opts.StateDir, 0755); err != nil { + if err := os.MkdirAll(opts.StateDir, 0o755); err != nil { return fmt.Errorf("failed to create state dir: %w", err) } @@ -414,7 +414,7 @@ func appendTerminalConfig(opts *Options, cfgFile *os.File, tmpDir string, checkC modified := strings.ReplaceAll(string(origData), ".default.", ".dark.") tmpPath := filepath.Join(tmpDir, templateName) - if err := os.WriteFile(tmpPath, []byte(modified), 0644); err != nil { + if err := os.WriteFile(tmpPath, []byte(modified), 0o644); err != nil { continue } diff --git a/core/internal/matugen/matugen_test.go b/core/internal/matugen/matugen_test.go index 02031578..231c4df3 100644 --- a/core/internal/matugen/matugen_test.go +++ b/core/internal/matugen/matugen_test.go @@ -15,13 +15,13 @@ func TestAppendConfigBinaryExists(t *testing.T) { shellDir := filepath.Join(tempDir, "shell") configsDir := filepath.Join(shellDir, "matugen", "configs") - if err := os.MkdirAll(configsDir, 0755); err != nil { + if err := os.MkdirAll(configsDir, 0o755); err != nil { t.Fatalf("failed to create configs dir: %v", err) } testConfig := "test config content" configPath := filepath.Join(configsDir, "test.toml") - if err := os.WriteFile(configPath, []byte(testConfig), 0644); err != nil { + if err := os.WriteFile(configPath, []byte(testConfig), 0o644); err != nil { t.Fatalf("failed to write config: %v", err) } @@ -58,13 +58,13 @@ func TestAppendConfigBinaryDoesNotExist(t *testing.T) { shellDir := filepath.Join(tempDir, "shell") configsDir := filepath.Join(shellDir, "matugen", "configs") - if err := os.MkdirAll(configsDir, 0755); err != nil { + if err := os.MkdirAll(configsDir, 0o755); err != nil { t.Fatalf("failed to create configs dir: %v", err) } testConfig := "test config content" configPath := filepath.Join(configsDir, "test.toml") - if err := os.WriteFile(configPath, []byte(testConfig), 0644); err != nil { + if err := os.WriteFile(configPath, []byte(testConfig), 0o644); err != nil { t.Fatalf("failed to write config: %v", err) } @@ -99,13 +99,13 @@ func TestAppendConfigFlatpakExists(t *testing.T) { shellDir := filepath.Join(tempDir, "shell") configsDir := filepath.Join(shellDir, "matugen", "configs") - if err := os.MkdirAll(configsDir, 0755); err != nil { + if err := os.MkdirAll(configsDir, 0o755); err != nil { t.Fatalf("failed to create configs dir: %v", err) } testConfig := "zen config content" configPath := filepath.Join(configsDir, "test.toml") - if err := os.WriteFile(configPath, []byte(testConfig), 0644); err != nil { + if err := os.WriteFile(configPath, []byte(testConfig), 0o644); err != nil { t.Fatalf("failed to write config: %v", err) } @@ -139,13 +139,13 @@ func TestAppendConfigFlatpakDoesNotExist(t *testing.T) { shellDir := filepath.Join(tempDir, "shell") configsDir := filepath.Join(shellDir, "matugen", "configs") - if err := os.MkdirAll(configsDir, 0755); err != nil { + if err := os.MkdirAll(configsDir, 0o755); err != nil { t.Fatalf("failed to create configs dir: %v", err) } testConfig := "test config content" configPath := filepath.Join(configsDir, "test.toml") - if err := os.WriteFile(configPath, []byte(testConfig), 0644); err != nil { + if err := os.WriteFile(configPath, []byte(testConfig), 0o644); err != nil { t.Fatalf("failed to write config: %v", err) } @@ -180,13 +180,13 @@ func TestAppendConfigBothExist(t *testing.T) { shellDir := filepath.Join(tempDir, "shell") configsDir := filepath.Join(shellDir, "matugen", "configs") - if err := os.MkdirAll(configsDir, 0755); err != nil { + if err := os.MkdirAll(configsDir, 0o755); err != nil { t.Fatalf("failed to create configs dir: %v", err) } testConfig := "zen config content" configPath := filepath.Join(configsDir, "test.toml") - if err := os.WriteFile(configPath, []byte(testConfig), 0644); err != nil { + if err := os.WriteFile(configPath, []byte(testConfig), 0o644); err != nil { t.Fatalf("failed to write config: %v", err) } @@ -220,13 +220,13 @@ func TestAppendConfigNeitherExists(t *testing.T) { shellDir := filepath.Join(tempDir, "shell") configsDir := filepath.Join(shellDir, "matugen", "configs") - if err := os.MkdirAll(configsDir, 0755); err != nil { + if err := os.MkdirAll(configsDir, 0o755); err != nil { t.Fatalf("failed to create configs dir: %v", err) } testConfig := "test config content" configPath := filepath.Join(configsDir, "test.toml") - if err := os.WriteFile(configPath, []byte(testConfig), 0644); err != nil { + if err := os.WriteFile(configPath, []byte(testConfig), 0o644); err != nil { t.Fatalf("failed to write config: %v", err) } @@ -261,13 +261,13 @@ func TestAppendConfigNoChecks(t *testing.T) { shellDir := filepath.Join(tempDir, "shell") configsDir := filepath.Join(shellDir, "matugen", "configs") - if err := os.MkdirAll(configsDir, 0755); err != nil { + if err := os.MkdirAll(configsDir, 0o755); err != nil { t.Fatalf("failed to create configs dir: %v", err) } testConfig := "always include" configPath := filepath.Join(configsDir, "test.toml") - if err := os.WriteFile(configPath, []byte(testConfig), 0644); err != nil { + if err := os.WriteFile(configPath, []byte(testConfig), 0o644); err != nil { t.Fatalf("failed to write config: %v", err) } @@ -298,7 +298,7 @@ func TestAppendConfigFileDoesNotExist(t *testing.T) { shellDir := filepath.Join(tempDir, "shell") configsDir := filepath.Join(shellDir, "matugen", "configs") - if err := os.MkdirAll(configsDir, 0755); err != nil { + if err := os.MkdirAll(configsDir, 0o755); err != nil { t.Fatalf("failed to create configs dir: %v", err) } diff --git a/core/internal/plugins/manager.go b/core/internal/plugins/manager.go index d09efb0d..1c0ddf58 100644 --- a/core/internal/plugins/manager.go +++ b/core/internal/plugins/manager.go @@ -116,12 +116,12 @@ func (m *Manager) Install(plugin Plugin) error { return fmt.Errorf("plugin already installed: %s", plugin.Name) } - if err := m.fs.MkdirAll(m.pluginsDir, 0755); err != nil { + if err := m.fs.MkdirAll(m.pluginsDir, 0o755); err != nil { return fmt.Errorf("failed to create plugins directory: %w", err) } reposDir := filepath.Join(m.pluginsDir, ".repos") - if err := m.fs.MkdirAll(reposDir, 0755); err != nil { + if err := m.fs.MkdirAll(reposDir, 0o755); err != nil { return fmt.Errorf("failed to create repos directory: %w", err) } @@ -168,7 +168,7 @@ func (m *Manager) Install(plugin Plugin) error { metaPath := pluginPath + ".meta" metaContent := fmt.Sprintf("repo=%s\npath=%s\nrepodir=%s", plugin.Repo, plugin.Path, repoName) - if err := afero.WriteFile(m.fs, metaPath, []byte(metaContent), 0644); err != nil { + if err := afero.WriteFile(m.fs, metaPath, []byte(metaContent), 0o644); err != nil { return fmt.Errorf("failed to write metadata: %w", err) } } else { diff --git a/core/internal/plugins/manager_test.go b/core/internal/plugins/manager_test.go index 5dd9d010..485479ee 100644 --- a/core/internal/plugins/manager_test.go +++ b/core/internal/plugins/manager_test.go @@ -66,7 +66,7 @@ func TestIsInstalled(t *testing.T) { plugin := Plugin{ID: "test-plugin", Name: "TestPlugin"} pluginPath := filepath.Join(pluginsDir, plugin.ID) - err := fs.MkdirAll(pluginPath, 0755) + err := fs.MkdirAll(pluginPath, 0o755) require.NoError(t, err) installed, err := manager.IsInstalled(plugin) @@ -100,7 +100,7 @@ func TestInstall(t *testing.T) { cloneCalled = true assert.Equal(t, filepath.Join(pluginsDir, plugin.ID), path) assert.Equal(t, plugin.Repo, url) - return fs.MkdirAll(path, 0755) + return fs.MkdirAll(path, 0o755) }, } manager.gitClient = mockGit @@ -118,7 +118,7 @@ func TestInstall(t *testing.T) { plugin := Plugin{ID: "test-plugin", Name: "TestPlugin"} pluginPath := filepath.Join(pluginsDir, plugin.ID) - err := fs.MkdirAll(pluginPath, 0755) + err := fs.MkdirAll(pluginPath, 0o755) require.NoError(t, err) err = manager.Install(plugin) @@ -137,7 +137,7 @@ func TestManagerUpdate(t *testing.T) { plugin := Plugin{ID: "test-plugin", Name: "TestPlugin"} pluginPath := filepath.Join(pluginsDir, plugin.ID) - err := fs.MkdirAll(pluginPath, 0755) + err := fs.MkdirAll(pluginPath, 0o755) require.NoError(t, err) pullCalled := false @@ -171,7 +171,7 @@ func TestUninstall(t *testing.T) { plugin := Plugin{ID: "test-plugin", Name: "TestPlugin"} pluginPath := filepath.Join(pluginsDir, plugin.ID) - err := fs.MkdirAll(pluginPath, 0755) + err := fs.MkdirAll(pluginPath, 0o755) require.NoError(t, err) err = manager.Uninstall(plugin) @@ -195,14 +195,14 @@ func TestListInstalled(t *testing.T) { t.Run("lists installed plugins", func(t *testing.T) { manager, fs, pluginsDir := setupTestManager(t) - err := fs.MkdirAll(filepath.Join(pluginsDir, "Plugin1"), 0755) + err := fs.MkdirAll(filepath.Join(pluginsDir, "Plugin1"), 0o755) require.NoError(t, err) - err = afero.WriteFile(fs, filepath.Join(pluginsDir, "Plugin1", "plugin.json"), []byte(`{"id":"Plugin1"}`), 0644) + err = afero.WriteFile(fs, filepath.Join(pluginsDir, "Plugin1", "plugin.json"), []byte(`{"id":"Plugin1"}`), 0o644) require.NoError(t, err) - err = fs.MkdirAll(filepath.Join(pluginsDir, "Plugin2"), 0755) + err = fs.MkdirAll(filepath.Join(pluginsDir, "Plugin2"), 0o755) require.NoError(t, err) - err = afero.WriteFile(fs, filepath.Join(pluginsDir, "Plugin2", "plugin.json"), []byte(`{"id":"Plugin2"}`), 0644) + err = afero.WriteFile(fs, filepath.Join(pluginsDir, "Plugin2", "plugin.json"), []byte(`{"id":"Plugin2"}`), 0o644) require.NoError(t, err) installed, err := manager.ListInstalled() @@ -223,15 +223,15 @@ func TestListInstalled(t *testing.T) { t.Run("ignores files and .repos directory", func(t *testing.T) { manager, fs, pluginsDir := setupTestManager(t) - err := fs.MkdirAll(pluginsDir, 0755) + err := fs.MkdirAll(pluginsDir, 0o755) require.NoError(t, err) - err = fs.MkdirAll(filepath.Join(pluginsDir, "Plugin1"), 0755) + err = fs.MkdirAll(filepath.Join(pluginsDir, "Plugin1"), 0o755) require.NoError(t, err) - err = afero.WriteFile(fs, filepath.Join(pluginsDir, "Plugin1", "plugin.json"), []byte(`{"id":"Plugin1"}`), 0644) + err = afero.WriteFile(fs, filepath.Join(pluginsDir, "Plugin1", "plugin.json"), []byte(`{"id":"Plugin1"}`), 0o644) require.NoError(t, err) - err = fs.MkdirAll(filepath.Join(pluginsDir, ".repos"), 0755) + err = fs.MkdirAll(filepath.Join(pluginsDir, ".repos"), 0o755) require.NoError(t, err) - err = afero.WriteFile(fs, filepath.Join(pluginsDir, "README.md"), []byte("test"), 0644) + err = afero.WriteFile(fs, filepath.Join(pluginsDir, "README.md"), []byte("test"), 0o644) require.NoError(t, err) installed, err := manager.ListInstalled() diff --git a/core/internal/plugins/registry.go b/core/internal/plugins/registry.go index f1d57b8f..a3ba2be3 100644 --- a/core/internal/plugins/registry.go +++ b/core/internal/plugins/registry.go @@ -147,7 +147,7 @@ func (r *Registry) Update() error { } if !exists { - if err := r.fs.MkdirAll(filepath.Dir(r.cacheDir), 0755); err != nil { + if err := r.fs.MkdirAll(filepath.Dir(r.cacheDir), 0o755); err != nil { return fmt.Errorf("failed to create cache directory: %w", err) } @@ -162,7 +162,7 @@ func (r *Registry) Update() error { return fmt.Errorf("failed to remove corrupted registry: %w", err) } - if err := r.fs.MkdirAll(filepath.Dir(r.cacheDir), 0755); err != nil { + if err := r.fs.MkdirAll(filepath.Dir(r.cacheDir), 0o755); err != nil { return fmt.Errorf("failed to create cache directory: %w", err) } diff --git a/core/internal/plugins/registry_test.go b/core/internal/plugins/registry_test.go index 0abcacb4..e535e6f4 100644 --- a/core/internal/plugins/registry_test.go +++ b/core/internal/plugins/registry_test.go @@ -63,13 +63,13 @@ func setupTestRegistry(t *testing.T) (*Registry, afero.Fs, string) { func createTestPlugin(t *testing.T, fs afero.Fs, dir string, filename string, plugin Plugin) { pluginsDir := filepath.Join(dir, "plugins") - err := fs.MkdirAll(pluginsDir, 0755) + err := fs.MkdirAll(pluginsDir, 0o755) require.NoError(t, err) data, err := json.Marshal(plugin) require.NoError(t, err) - err = afero.WriteFile(fs, filepath.Join(pluginsDir, filename), data, 0644) + err = afero.WriteFile(fs, filepath.Join(pluginsDir, filename), data, 0o644) require.NoError(t, err) } @@ -118,10 +118,10 @@ func TestLoadPlugins(t *testing.T) { registry, fs, tmpDir := setupTestRegistry(t) pluginsDir := filepath.Join(tmpDir, "plugins") - err := fs.MkdirAll(pluginsDir, 0755) + err := fs.MkdirAll(pluginsDir, 0o755) require.NoError(t, err) - err = afero.WriteFile(fs, filepath.Join(pluginsDir, "README.md"), []byte("# Test"), 0644) + err = afero.WriteFile(fs, filepath.Join(pluginsDir, "README.md"), []byte("# Test"), 0o644) require.NoError(t, err) plugin := Plugin{ @@ -146,7 +146,7 @@ func TestLoadPlugins(t *testing.T) { registry, fs, tmpDir := setupTestRegistry(t) pluginsDir := filepath.Join(tmpDir, "plugins") - err := fs.MkdirAll(filepath.Join(pluginsDir, "subdir"), 0755) + err := fs.MkdirAll(filepath.Join(pluginsDir, "subdir"), 0o755) require.NoError(t, err) plugin := Plugin{ @@ -170,10 +170,10 @@ func TestLoadPlugins(t *testing.T) { registry, fs, tmpDir := setupTestRegistry(t) pluginsDir := filepath.Join(tmpDir, "plugins") - err := fs.MkdirAll(pluginsDir, 0755) + err := fs.MkdirAll(pluginsDir, 0o755) require.NoError(t, err) - err = afero.WriteFile(fs, filepath.Join(pluginsDir, "invalid.json"), []byte("{invalid json}"), 0644) + err = afero.WriteFile(fs, filepath.Join(pluginsDir, "invalid.json"), []byte("{invalid json}"), 0o644) require.NoError(t, err) plugin := Plugin{ @@ -303,7 +303,7 @@ func TestUpdate(t *testing.T) { Distro: []string{"any"}, } - err := fs.MkdirAll(tmpDir, 0755) + err := fs.MkdirAll(tmpDir, 0o755) require.NoError(t, err) pullCalled := false diff --git a/core/internal/screenshot/encode.go b/core/internal/screenshot/encode.go index 2ac88d50..8b40dcaf 100644 --- a/core/internal/screenshot/encode.go +++ b/core/internal/screenshot/encode.go @@ -107,7 +107,7 @@ func GetOutputDir() string { if xdgPics := getXDGPicturesDir(); xdgPics != "" { screenshotDir := filepath.Join(xdgPics, "Screenshots") - if err := os.MkdirAll(screenshotDir, 0755); err == nil { + if err := os.MkdirAll(screenshotDir, 0o755); err == nil { return screenshotDir } return xdgPics diff --git a/core/internal/screenshot/state.go b/core/internal/screenshot/state.go index 168e27f1..0ba6c63b 100644 --- a/core/internal/screenshot/state.go +++ b/core/internal/screenshot/state.go @@ -39,7 +39,7 @@ func LoadState() (*PersistentState, error) { func SaveState(state *PersistentState) error { path := getStateFilePath() dir := filepath.Dir(path) - if err := os.MkdirAll(dir, 0755); err != nil { + if err := os.MkdirAll(dir, 0o755); err != nil { return err } @@ -47,7 +47,7 @@ func SaveState(state *PersistentState) error { if err != nil { return err } - return os.WriteFile(path, data, 0644) + return os.WriteFile(path, data, 0o644) } func GetLastRegion() Region { diff --git a/core/internal/server/brightness/sysfs.go b/core/internal/server/brightness/sysfs.go index e641568e..6ba8c68e 100644 --- a/core/internal/server/brightness/sysfs.go +++ b/core/internal/server/brightness/sysfs.go @@ -186,7 +186,7 @@ func (b *SysfsBackend) SetBrightnessWithExponent(id string, percent int, exponen brightnessPath := filepath.Join(devicePath, "brightness") data := []byte(fmt.Sprintf("%d", value)) - if err := os.WriteFile(brightnessPath, data, 0644); err != nil { + if err := os.WriteFile(brightnessPath, data, 0o644); err != nil { return fmt.Errorf("write brightness: %w", err) } diff --git a/core/internal/server/brightness/sysfs_logind_test.go b/core/internal/server/brightness/sysfs_logind_test.go index 4b761be5..6ba84b8a 100644 --- a/core/internal/server/brightness/sysfs_logind_test.go +++ b/core/internal/server/brightness/sysfs_logind_test.go @@ -15,13 +15,13 @@ func TestManager_SetBrightness_LogindSuccess(t *testing.T) { tmpDir := t.TempDir() backlightDir := filepath.Join(tmpDir, "backlight", "test_backlight") - if err := os.MkdirAll(backlightDir, 0755); err != nil { + if err := os.MkdirAll(backlightDir, 0o755); err != nil { t.Fatal(err) } - if err := os.WriteFile(filepath.Join(backlightDir, "max_brightness"), []byte("100\n"), 0644); err != nil { + if err := os.WriteFile(filepath.Join(backlightDir, "max_brightness"), []byte("100\n"), 0o644); err != nil { t.Fatal(err) } - if err := os.WriteFile(filepath.Join(backlightDir, "brightness"), []byte("50\n"), 0644); err != nil { + if err := os.WriteFile(filepath.Join(backlightDir, "brightness"), []byte("50\n"), 0o644); err != nil { t.Fatal(err) } @@ -86,13 +86,13 @@ func TestManager_SetBrightness_LogindFailsFallbackToSysfs(t *testing.T) { tmpDir := t.TempDir() backlightDir := filepath.Join(tmpDir, "backlight", "test_backlight") - if err := os.MkdirAll(backlightDir, 0755); err != nil { + if err := os.MkdirAll(backlightDir, 0o755); err != nil { t.Fatal(err) } - if err := os.WriteFile(filepath.Join(backlightDir, "max_brightness"), []byte("100\n"), 0644); err != nil { + if err := os.WriteFile(filepath.Join(backlightDir, "max_brightness"), []byte("100\n"), 0o644); err != nil { t.Fatal(err) } - if err := os.WriteFile(filepath.Join(backlightDir, "brightness"), []byte("50\n"), 0644); err != nil { + if err := os.WriteFile(filepath.Join(backlightDir, "brightness"), []byte("50\n"), 0o644); err != nil { t.Fatal(err) } @@ -158,13 +158,13 @@ func TestManager_SetBrightness_NoLogind(t *testing.T) { tmpDir := t.TempDir() backlightDir := filepath.Join(tmpDir, "backlight", "test_backlight") - if err := os.MkdirAll(backlightDir, 0755); err != nil { + if err := os.MkdirAll(backlightDir, 0o755); err != nil { t.Fatal(err) } - if err := os.WriteFile(filepath.Join(backlightDir, "max_brightness"), []byte("100\n"), 0644); err != nil { + if err := os.WriteFile(filepath.Join(backlightDir, "max_brightness"), []byte("100\n"), 0o644); err != nil { t.Fatal(err) } - if err := os.WriteFile(filepath.Join(backlightDir, "brightness"), []byte("50\n"), 0644); err != nil { + if err := os.WriteFile(filepath.Join(backlightDir, "brightness"), []byte("50\n"), 0o644); err != nil { t.Fatal(err) } @@ -215,13 +215,13 @@ func TestManager_SetBrightness_LEDWithLogind(t *testing.T) { tmpDir := t.TempDir() ledsDir := filepath.Join(tmpDir, "leds", "test_led") - if err := os.MkdirAll(ledsDir, 0755); err != nil { + if err := os.MkdirAll(ledsDir, 0o755); err != nil { t.Fatal(err) } - if err := os.WriteFile(filepath.Join(ledsDir, "max_brightness"), []byte("255\n"), 0644); err != nil { + if err := os.WriteFile(filepath.Join(ledsDir, "max_brightness"), []byte("255\n"), 0o644); err != nil { t.Fatal(err) } - if err := os.WriteFile(filepath.Join(ledsDir, "brightness"), []byte("128\n"), 0644); err != nil { + if err := os.WriteFile(filepath.Join(ledsDir, "brightness"), []byte("128\n"), 0o644); err != nil { t.Fatal(err) } diff --git a/core/internal/server/brightness/sysfs_test.go b/core/internal/server/brightness/sysfs_test.go index 7d2d7b3b..80615132 100644 --- a/core/internal/server/brightness/sysfs_test.go +++ b/core/internal/server/brightness/sysfs_test.go @@ -136,26 +136,26 @@ func TestSysfsBackend_ScanDevices(t *testing.T) { tmpDir := t.TempDir() backlightDir := filepath.Join(tmpDir, "backlight", "test_backlight") - if err := os.MkdirAll(backlightDir, 0755); err != nil { + if err := os.MkdirAll(backlightDir, 0o755); err != nil { t.Fatal(err) } - if err := os.WriteFile(filepath.Join(backlightDir, "max_brightness"), []byte("100\n"), 0644); err != nil { + if err := os.WriteFile(filepath.Join(backlightDir, "max_brightness"), []byte("100\n"), 0o644); err != nil { t.Fatal(err) } - if err := os.WriteFile(filepath.Join(backlightDir, "brightness"), []byte("50\n"), 0644); err != nil { + if err := os.WriteFile(filepath.Join(backlightDir, "brightness"), []byte("50\n"), 0o644); err != nil { t.Fatal(err) } ledsDir := filepath.Join(tmpDir, "leds", "test_led") - if err := os.MkdirAll(ledsDir, 0755); err != nil { + if err := os.MkdirAll(ledsDir, 0o755); err != nil { t.Fatal(err) } - if err := os.WriteFile(filepath.Join(ledsDir, "max_brightness"), []byte("255\n"), 0644); err != nil { + if err := os.WriteFile(filepath.Join(ledsDir, "max_brightness"), []byte("255\n"), 0o644); err != nil { t.Fatal(err) } - if err := os.WriteFile(filepath.Join(ledsDir, "brightness"), []byte("128\n"), 0644); err != nil { + if err := os.WriteFile(filepath.Join(ledsDir, "brightness"), []byte("128\n"), 0o644); err != nil { t.Fatal(err) } diff --git a/core/internal/server/brightness/udev_test.go b/core/internal/server/brightness/udev_test.go index 6281acbe..a5c406bb 100644 --- a/core/internal/server/brightness/udev_test.go +++ b/core/internal/server/brightness/udev_test.go @@ -13,13 +13,13 @@ func setupTestManager(t *testing.T) (*Manager, string) { tmpDir := t.TempDir() backlightDir := filepath.Join(tmpDir, "backlight", "intel_backlight") - if err := os.MkdirAll(backlightDir, 0755); err != nil { + if err := os.MkdirAll(backlightDir, 0o755); err != nil { t.Fatal(err) } - if err := os.WriteFile(filepath.Join(backlightDir, "max_brightness"), []byte("1000\n"), 0644); err != nil { + if err := os.WriteFile(filepath.Join(backlightDir, "max_brightness"), []byte("1000\n"), 0o644); err != nil { t.Fatal(err) } - if err := os.WriteFile(filepath.Join(backlightDir, "brightness"), []byte("500\n"), 0644); err != nil { + if err := os.WriteFile(filepath.Join(backlightDir, "brightness"), []byte("500\n"), 0o644); err != nil { t.Fatal(err) } @@ -152,7 +152,7 @@ func TestHandleEvent_ChangeAction(t *testing.T) { um := &UdevMonitor{stop: make(chan struct{})} brightnessPath := filepath.Join(tmpDir, "backlight", "intel_backlight", "brightness") - if err := os.WriteFile(brightnessPath, []byte("800\n"), 0644); err != nil { + if err := os.WriteFile(brightnessPath, []byte("800\n"), 0o644); err != nil { t.Fatal(err) } @@ -225,7 +225,7 @@ func TestHandleChange_InvalidBrightnessValue(t *testing.T) { um := &UdevMonitor{stop: make(chan struct{})} brightnessPath := filepath.Join(tmpDir, "backlight", "intel_backlight", "brightness") - if err := os.WriteFile(brightnessPath, []byte("not_a_number\n"), 0644); err != nil { + if err := os.WriteFile(brightnessPath, []byte("not_a_number\n"), 0o644); err != nil { t.Fatal(err) } diff --git a/core/internal/server/clipboard/handlers.go b/core/internal/server/clipboard/handlers.go index 19f1ba5a..84c146d9 100644 --- a/core/internal/server/clipboard/handlers.go +++ b/core/internal/server/clipboard/handlers.go @@ -45,10 +45,8 @@ func HandleRequest(conn net.Conn, req models.Request, m *Manager) { handleGetPinnedEntries(conn, req, m) case "clipboard.getPinnedCount": handleGetPinnedCount(conn, req, m) - case "clipboard.startFileTransfer": - handleStartFileTransfer(conn, req, m) - case "clipboard.exportFile": - handleExportFile(conn, req, m) + case "clipboard.copyFile": + handleCopyFile(conn, req, m) default: models.RespondError(conn, req.ID, "unknown method: "+req.Method) } @@ -130,6 +128,19 @@ func handleCopyEntry(conn net.Conn, req models.Request, m *Manager) { return } + filePath := m.EntryToFile(entry) + if filePath != "" { + if err := m.CopyFile(filePath); err != nil { + models.RespondError(conn, req.ID, err.Error()) + return + } + models.Respond(conn, req.ID, map[string]any{ + "success": true, + "filePath": filePath, + }) + return + } + if err := m.SetClipboard(entry.Data, entry.MimeType); err != nil { models.RespondError(conn, req.ID, err.Error()) return @@ -286,34 +297,17 @@ func handleGetPinnedCount(conn net.Conn, req models.Request, m *Manager) { models.Respond(conn, req.ID, map[string]int{"count": count}) } -func handleStartFileTransfer(conn net.Conn, req models.Request, m *Manager) { +func handleCopyFile(conn net.Conn, req models.Request, m *Manager) { filePath, err := params.String(req.Params, "filePath") if err != nil { models.RespondError(conn, req.ID, err.Error()) return } - key, err := m.StartFileTransfer(filePath) - if err != nil { + if err := m.CopyFile(filePath); err != nil { models.RespondError(conn, req.ID, err.Error()) return } - models.Respond(conn, req.ID, map[string]string{"key": key}) -} - -func handleExportFile(conn net.Conn, req models.Request, m *Manager) { - filePath, err := params.String(req.Params, "filePath") - if err != nil { - models.RespondError(conn, req.ID, err.Error()) - return - } - - exportedPath, err := m.ExportFileForFlatpak(filePath) - if err != nil { - models.RespondError(conn, req.ID, err.Error()) - return - } - - models.Respond(conn, req.ID, map[string]string{"path": exportedPath}) + models.Respond(conn, req.ID, models.SuccessResult{Success: true, Message: "copied"}) } diff --git a/core/internal/server/clipboard/manager.go b/core/internal/server/clipboard/manager.go index 74703c10..b5a8252e 100644 --- a/core/internal/server/clipboard/manager.go +++ b/core/internal/server/clipboard/manager.go @@ -107,7 +107,7 @@ func NewManager(wlCtx wlcontext.WaylandContext, config Config) (*Manager, error) } func openDB(path string) (*bolt.DB, error) { - db, err := bolt.Open(path, 0644, &bolt.Options{ + db, err := bolt.Open(path, 0o644, &bolt.Options{ Timeout: 1 * time.Second, }) if err != nil { @@ -885,23 +885,23 @@ func (m *Manager) compactDB() error { tmpPath := m.dbPath + ".compact" defer os.Remove(tmpPath) - srcDB, err := bolt.Open(m.dbPath, 0644, &bolt.Options{ReadOnly: true, Timeout: time.Second}) + srcDB, err := bolt.Open(m.dbPath, 0o644, &bolt.Options{ReadOnly: true, Timeout: time.Second}) if err != nil { - m.db, _ = bolt.Open(m.dbPath, 0644, &bolt.Options{Timeout: time.Second}) + m.db, _ = bolt.Open(m.dbPath, 0o644, &bolt.Options{Timeout: time.Second}) return fmt.Errorf("open source: %w", err) } - dstDB, err := bolt.Open(tmpPath, 0644, &bolt.Options{Timeout: time.Second}) + dstDB, err := bolt.Open(tmpPath, 0o644, &bolt.Options{Timeout: time.Second}) if err != nil { srcDB.Close() - m.db, _ = bolt.Open(m.dbPath, 0644, &bolt.Options{Timeout: time.Second}) + m.db, _ = bolt.Open(m.dbPath, 0o644, &bolt.Options{Timeout: time.Second}) return fmt.Errorf("open destination: %w", err) } if err := bolt.Compact(dstDB, srcDB, 0); err != nil { srcDB.Close() dstDB.Close() - m.db, _ = bolt.Open(m.dbPath, 0644, &bolt.Options{Timeout: time.Second}) + m.db, _ = bolt.Open(m.dbPath, 0o644, &bolt.Options{Timeout: time.Second}) return fmt.Errorf("compact: %w", err) } @@ -909,11 +909,11 @@ func (m *Manager) compactDB() error { dstDB.Close() if err := os.Rename(tmpPath, m.dbPath); err != nil { - m.db, _ = bolt.Open(m.dbPath, 0644, &bolt.Options{Timeout: time.Second}) + m.db, _ = bolt.Open(m.dbPath, 0o644, &bolt.Options{Timeout: time.Second}) return fmt.Errorf("rename: %w", err) } - m.db, err = bolt.Open(m.dbPath, 0644, &bolt.Options{Timeout: time.Second}) + m.db, err = bolt.Open(m.dbPath, 0o644, &bolt.Options{Timeout: time.Second}) if err != nil { return fmt.Errorf("reopen: %w", err) } @@ -1532,52 +1532,101 @@ func (m *Manager) GetPinnedCount() int { return count } -func (m *Manager) StartFileTransfer(filePath string) (string, error) { +func (m *Manager) CopyFile(filePath string) error { if _, err := os.Stat(filePath); err != nil { - return "", fmt.Errorf("file not found: %w", err) + return fmt.Errorf("file not found: %w", err) } - if m.dbusConn == nil { - conn, err := dbus.ConnectSessionBus() - if err != nil { - return "", fmt.Errorf("connect session bus: %w", err) - } - if !conn.SupportsUnixFDs() { - conn.Close() - return "", fmt.Errorf("D-Bus connection does not support Unix FD passing") - } - m.dbusConn = conn - } - - portal := m.dbusConn.Object("org.freedesktop.portal.Documents", "/org/freedesktop/portal/documents") - - var key string - options := map[string]dbus.Variant{ - "writable": dbus.MakeVariant(false), - "autostop": dbus.MakeVariant(false), - } - if err := portal.Call("org.freedesktop.portal.FileTransfer.StartTransfer", 0, options).Store(&key); err != nil { - return "", fmt.Errorf("start transfer: %w", err) - } - - file, err := os.Open(filePath) + exportedPath, err := m.ExportFileForFlatpak(filePath) if err != nil { - return "", fmt.Errorf("open file: %w", err) + exportedPath = filePath } - if _, err := file.Seek(0, 0); err != nil { - file.Close() - return "", fmt.Errorf("seek file: %w", err) - } - fd := int(file.Fd()) + fileURI := "file://" + exportedPath - addOptions := map[string]dbus.Variant{} - if err := portal.Call("org.freedesktop.portal.FileTransfer.AddFiles", 0, key, []dbus.UnixFD{dbus.UnixFD(fd)}, addOptions).Err; err != nil { - file.Close() - return "", fmt.Errorf("add files: %w", err) - } - m.transferFiles = append(m.transferFiles, file) + m.post(func() { + if m.dataControlMgr == nil || m.dataDevice == nil { + log.Error("Data control manager or device not initialized") + return + } - return key, nil + dataMgr := m.dataControlMgr.(*ext_data_control.ExtDataControlManagerV1) + source, err := dataMgr.CreateDataSource() + if err != nil { + log.Errorf("Failed to create data source: %v", err) + return + } + + type offer struct { + mime string + data []byte + } + offers := []offer{ + {"x-special/gnome-copied-files", []byte("copy\n" + fileURI)}, + {"text/uri-list", []byte(fileURI + "\r\n")}, + {"text/plain", []byte(filePath)}, + } + + offerData := make(map[string][]byte) + for _, o := range offers { + if err := source.Offer(o.mime); err != nil { + log.Errorf("Failed to offer %s: %v", o.mime, err) + return + } + offerData[o.mime] = o.data + } + + source.SetSendHandler(func(e ext_data_control.ExtDataControlSourceV1SendEvent) { + fd := e.Fd + defer syscall.Close(fd) + file := os.NewFile(uintptr(fd), "clipboard-pipe") + defer file.Close() + if data, ok := offerData[e.MimeType]; ok { + file.Write(data) + } + }) + + m.currentSource = source + device := m.dataDevice.(*ext_data_control.ExtDataControlDeviceV1) + if err := device.SetSelection(source); err != nil { + log.Errorf("Failed to set selection: %v", err) + } + }) + + return nil +} + +func (m *Manager) EntryToFile(entry *Entry) string { + switch { + case entry.MimeType == "text/uri-list": + data := strings.TrimSpace(string(entry.Data)) + lines := strings.Split(data, "\n") + if len(lines) == 0 { + return "" + } + uri := strings.TrimSuffix(strings.TrimSpace(lines[0]), "\r") + if path, ok := strings.CutPrefix(uri, "file://"); ok { + return path + } + case entry.IsImage: + ext := ".png" + if suffix, ok := strings.CutPrefix(entry.MimeType, "image/"); ok { + ext = "." + suffix + } + cacheDir, err := os.UserCacheDir() + if err != nil { + return "" + } + clipDir := filepath.Join(cacheDir, "dms", "clipboard") + if err := os.MkdirAll(clipDir, 0o755); err != nil { + return "" + } + filePath := filepath.Join(clipDir, fmt.Sprintf("%d%s", time.Now().UnixNano(), ext)) + if os.WriteFile(filePath, entry.Data, 0o644) != nil { + return "" + } + return filePath + } + return "" } func (m *Manager) ExportFileForFlatpak(filePath string) (string, error) { diff --git a/core/internal/server/clipboard/types.go b/core/internal/server/clipboard/types.go index 7b6f23d1..c7545613 100644 --- a/core/internal/server/clipboard/types.go +++ b/core/internal/server/clipboard/types.go @@ -66,7 +66,7 @@ func SaveConfig(cfg Config) error { return err } - if err := os.MkdirAll(filepath.Dir(path), 0755); err != nil { + if err := os.MkdirAll(filepath.Dir(path), 0o755); err != nil { return err } @@ -75,7 +75,7 @@ func SaveConfig(cfg Config) error { return err } - return os.WriteFile(path, data, 0644) + return os.WriteFile(path, data, 0o644) } type SearchParams struct { @@ -159,8 +159,7 @@ type Manager struct { notifierWg sync.WaitGroup lastState *State - dbusConn *dbus.Conn - transferFiles []*os.File // Keep files open for portal transfers + dbusConn *dbus.Conn } func (m *Manager) GetState() State { diff --git a/core/internal/server/server_test.go b/core/internal/server/server_test.go index b438475d..8f4377d9 100644 --- a/core/internal/server/server_test.go +++ b/core/internal/server/server_test.go @@ -163,11 +163,11 @@ func TestCleanupStaleSockets(t *testing.T) { t.Setenv("XDG_RUNTIME_DIR", tempDir) staleSocket := filepath.Join(tempDir, "danklinux-999999.sock") - err := os.WriteFile(staleSocket, []byte{}, 0600) + err := os.WriteFile(staleSocket, []byte{}, 0o600) require.NoError(t, err) activeSocket := filepath.Join(tempDir, fmt.Sprintf("danklinux-%d.sock", os.Getpid())) - err = os.WriteFile(activeSocket, []byte{}, 0600) + err = os.WriteFile(activeSocket, []byte{}, 0o600) require.NoError(t, err) cleanupStaleSockets() diff --git a/core/internal/themes/manager.go b/core/internal/themes/manager.go index 63357aec..2ebe7ae9 100644 --- a/core/internal/themes/manager.go +++ b/core/internal/themes/manager.go @@ -66,7 +66,7 @@ func (m *Manager) Install(theme Theme, registryThemeDir string) error { return fmt.Errorf("theme already installed: %s", theme.Name) } - if err := m.fs.MkdirAll(themeDir, 0755); err != nil { + if err := m.fs.MkdirAll(themeDir, 0o755); err != nil { return fmt.Errorf("failed to create theme directory: %w", err) } @@ -76,7 +76,7 @@ func (m *Manager) Install(theme Theme, registryThemeDir string) error { } themePath := filepath.Join(themeDir, "theme.json") - if err := afero.WriteFile(m.fs, themePath, data, 0644); err != nil { + if err := afero.WriteFile(m.fs, themePath, data, 0o644); err != nil { return fmt.Errorf("failed to write theme file: %w", err) } @@ -107,7 +107,7 @@ func (m *Manager) copyPreviewFiles(srcDir, dstDir string, theme Theme) { continue } dstPath := filepath.Join(dstDir, preview) - _ = afero.WriteFile(m.fs, dstPath, data, 0644) + _ = afero.WriteFile(m.fs, dstPath, data, 0o644) } } @@ -138,7 +138,7 @@ func (m *Manager) Update(theme Theme) error { return fmt.Errorf("failed to marshal theme: %w", err) } - if err := afero.WriteFile(m.fs, themePath, data, 0644); err != nil { + if err := afero.WriteFile(m.fs, themePath, data, 0o644); err != nil { return fmt.Errorf("failed to write theme file: %w", err) } diff --git a/core/internal/themes/registry.go b/core/internal/themes/registry.go index 401eb605..5a39913f 100644 --- a/core/internal/themes/registry.go +++ b/core/internal/themes/registry.go @@ -182,7 +182,7 @@ func (r *Registry) Update() error { } if !exists { - if err := r.fs.MkdirAll(filepath.Dir(r.cacheDir), 0755); err != nil { + if err := r.fs.MkdirAll(filepath.Dir(r.cacheDir), 0o755); err != nil { return fmt.Errorf("failed to create cache directory: %w", err) } @@ -195,7 +195,7 @@ func (r *Registry) Update() error { return fmt.Errorf("failed to remove corrupted registry: %w", err) } - if err := r.fs.MkdirAll(filepath.Dir(r.cacheDir), 0755); err != nil { + if err := r.fs.MkdirAll(filepath.Dir(r.cacheDir), 0o755); err != nil { return fmt.Errorf("failed to create cache directory: %w", err) } diff --git a/core/internal/tui/views_password.go b/core/internal/tui/views_password.go index 32fffc27..2f386ae8 100644 --- a/core/internal/tui/views_password.go +++ b/core/internal/tui/views_password.go @@ -281,7 +281,7 @@ func (m Model) tryFingerprint() tea.Cmd { askpassScript := filepath.Join(tmpDir, fmt.Sprintf("danklinux-fp-%d.sh", time.Now().UnixNano())) scriptContent := "#!/bin/sh\nexit 1\n" - if err := os.WriteFile(askpassScript, []byte(scriptContent), 0700); err != nil { + if err := os.WriteFile(askpassScript, []byte(scriptContent), 0o700); err != nil { return passwordValidMsg{password: "", valid: false} } defer os.Remove(askpassScript) diff --git a/core/internal/utils/flatpak_test.go b/core/internal/utils/flatpak_test.go index 5f8648ce..97282aee 100644 --- a/core/internal/utils/flatpak_test.go +++ b/core/internal/utils/flatpak_test.go @@ -144,7 +144,7 @@ func TestFlatpakExistsCommandFailure(t *testing.T) { fakeFlatpak := filepath.Join(tempDir, "flatpak") script := "#!/bin/sh\nexit 1\n" - err := os.WriteFile(fakeFlatpak, []byte(script), 0755) + err := os.WriteFile(fakeFlatpak, []byte(script), 0o755) if err != nil { t.Fatalf("failed to create fake flatpak: %v", err) } @@ -168,7 +168,7 @@ func TestFlatpakSearchBySubstringCommandFailure(t *testing.T) { fakeFlatpak := filepath.Join(tempDir, "flatpak") script := "#!/bin/sh\nexit 1\n" - err := os.WriteFile(fakeFlatpak, []byte(script), 0755) + err := os.WriteFile(fakeFlatpak, []byte(script), 0o755) if err != nil { t.Fatalf("failed to create fake flatpak: %v", err) } @@ -192,7 +192,7 @@ func TestFlatpakInstallationDirCommandFailure(t *testing.T) { fakeFlatpak := filepath.Join(tempDir, "flatpak") script := "#!/bin/sh\nexit 1\n" - err := os.WriteFile(fakeFlatpak, []byte(script), 0755) + err := os.WriteFile(fakeFlatpak, []byte(script), 0o755) if err != nil { t.Fatalf("failed to create fake flatpak: %v", err) } @@ -220,7 +220,7 @@ if [ "$1" = "info" ] && [ "$2" = "app.exists.test" ]; then fi exit 1 ` - err := os.WriteFile(fakeFlatpak, []byte(script), 0755) + err := os.WriteFile(fakeFlatpak, []byte(script), 0o755) if err != nil { t.Fatalf("failed to create fake flatpak: %v", err) } @@ -239,7 +239,7 @@ func TestAnyFlatpakExistsNoneExist(t *testing.T) { fakeFlatpak := filepath.Join(tempDir, "flatpak") script := "#!/bin/sh\nexit 1\n" - err := os.WriteFile(fakeFlatpak, []byte(script), 0755) + err := os.WriteFile(fakeFlatpak, []byte(script), 0o755) if err != nil { t.Fatalf("failed to create fake flatpak: %v", err) } diff --git a/core/internal/version/version_test.go b/core/internal/version/version_test.go index 2a8a59b5..1e424c17 100644 --- a/core/internal/version/version_test.go +++ b/core/internal/version/version_test.go @@ -39,10 +39,10 @@ func TestGetDMSVersionInfo_Structure(t *testing.T) { // Create a temp directory with a fake DMS installation tempDir := t.TempDir() dmsPath := filepath.Join(tempDir, ".config", "quickshell", "dms") - os.MkdirAll(dmsPath, 0755) + os.MkdirAll(dmsPath, 0o755) // Create a .git directory to simulate git installation - os.MkdirAll(filepath.Join(dmsPath, ".git"), 0755) + os.MkdirAll(filepath.Join(dmsPath, ".git"), 0o755) originalHome := os.Getenv("HOME") defer os.Setenv("HOME", originalHome) @@ -84,8 +84,8 @@ func TestGetDMSVersionInfo_Structure(t *testing.T) { func TestGetDMSVersionInfo_BranchVersion(t *testing.T) { tempDir := t.TempDir() dmsPath := filepath.Join(tempDir, ".config", "quickshell", "dms") - os.MkdirAll(dmsPath, 0755) - os.MkdirAll(filepath.Join(dmsPath, ".git"), 0755) + os.MkdirAll(dmsPath, 0o755) + os.MkdirAll(filepath.Join(dmsPath, ".git"), 0o755) originalHome := os.Getenv("HOME") defer os.Setenv("HOME", originalHome) @@ -116,8 +116,8 @@ func TestGetDMSVersionInfo_BranchVersion(t *testing.T) { func TestGetDMSVersionInfo_NoUpdate(t *testing.T) { tempDir := t.TempDir() dmsPath := filepath.Join(tempDir, ".config", "quickshell", "dms") - os.MkdirAll(dmsPath, 0755) - os.MkdirAll(filepath.Join(dmsPath, ".git"), 0755) + os.MkdirAll(dmsPath, 0o755) + os.MkdirAll(filepath.Join(dmsPath, ".git"), 0o755) originalHome := os.Getenv("HOME") defer os.Setenv("HOME", originalHome) @@ -157,7 +157,7 @@ func TestGetCurrentDMSVersion_GitTag(t *testing.T) { tempDir := t.TempDir() dmsPath := filepath.Join(tempDir, ".config", "quickshell", "dms") - os.MkdirAll(dmsPath, 0755) + os.MkdirAll(dmsPath, 0o755) originalHome := os.Getenv("HOME") defer os.Setenv("HOME", originalHome) @@ -168,7 +168,7 @@ func TestGetCurrentDMSVersion_GitTag(t *testing.T) { exec.Command("git", "-C", dmsPath, "config", "user.name", "Test User").Run() testFile := filepath.Join(dmsPath, "test.txt") - os.WriteFile(testFile, []byte("test"), 0644) + os.WriteFile(testFile, []byte("test"), 0o644) exec.Command("git", "-C", dmsPath, "add", ".").Run() exec.Command("git", "-C", dmsPath, "commit", "-m", "initial").Run() exec.Command("git", "-C", dmsPath, "tag", "v0.1.0").Run() @@ -190,7 +190,7 @@ func TestGetCurrentDMSVersion_GitBranch(t *testing.T) { tempDir := t.TempDir() dmsPath := filepath.Join(tempDir, ".config", "quickshell", "dms") - os.MkdirAll(dmsPath, 0755) + os.MkdirAll(dmsPath, 0o755) originalHome := os.Getenv("HOME") defer os.Setenv("HOME", originalHome) @@ -202,7 +202,7 @@ func TestGetCurrentDMSVersion_GitBranch(t *testing.T) { exec.Command("git", "-C", dmsPath, "checkout", "-b", "master").Run() testFile := filepath.Join(dmsPath, "test.txt") - os.WriteFile(testFile, []byte("test"), 0644) + os.WriteFile(testFile, []byte("test"), 0o644) exec.Command("git", "-C", dmsPath, "add", ".").Run() exec.Command("git", "-C", dmsPath, "commit", "-m", "initial").Run()