gogcli/internal/cmd/completion_scripts.go
salmonumbrella 05986fb6ce
fix(timezone): honor --timezone local (#79)
* feat(gmail): add timezone support for date output

Add --timezone and --local flags to gmail search and watch serve commands
to control how dates are displayed. By default uses local timezone.
Users can specify any IANA timezone (e.g., America/New_York, UTC).

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* test(gmail): fix execute test for timezone changes

Update TestExecute_GmailSearch_JSON to use explicit --timezone UTC flag
and expect the correctly converted time (22:04 UTC from 15:04 -0700).

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* feat(gmail): add -z short flag for --timezone

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* test(gmail): add unit tests for resolveOutputLocation

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* docs(gmail): clarify timezone flag help text

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* test(gmail): add timezone conversion tests for formatGmailDateInLocation

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* feat(config): add default_timezone setting

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* feat(gmail): support GOG_TIMEZONE env var and config for timezone

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* feat(config): add gog config command for timezone and settings

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* feat(calendar): respect GOG_TIMEZONE and config for timezone

Update calendar time command to follow the same timezone priority as gmail:
1. --timezone flag (explicit)
2. GOG_TIMEZONE env var
3. Config file default_timezone
4. Fall back to Google Calendar's timezone (calendar-specific fallback)

Add getConfiguredTimezone helper that returns nil when no explicit timezone
is configured, allowing calendar commands to use their own fallback behavior.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* test(gmail): add tests for GOG_TIMEZONE env var and getConfiguredTimezone

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* fix(config): warn on invalid timezone instead of error

When default_timezone in config is invalid, print a warning to stderr
and fall back to local timezone instead of returning a hard error.

Invalid flag/env var still returns errors (user mistake in current
session), but invalid config should not break the CLI (stale config).

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* refactor(gmail): remove unused formatGmailDate, add nolint directive

- Remove unused formatGmailDate wrapper function (all callers use
  formatGmailDateInLocation directly with explicit location)
- Add nolint:nilnil directive to getConfiguredTimezone with explanation
  that nil return signals caller to use its own fallback

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

* fix(timezone): honor --timezone local

* refactor(cli): unify config/timezone helpers

* test(cmd): isolate config env in timezone tests

* refactor(config): centralize config key metadata

* fix(config): drop unused key spec lookup

* fix(config): standardize config key errors

---------

Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-01-17 04:53:31 +00:00

72 lines
1.6 KiB
Go

package cmd
import "fmt"
func completionScript(shell string) (string, error) {
switch shell {
case "bash":
return bashCompletionScript(), nil
case "zsh":
return zshCompletionScript(), nil
case "fish":
return fishCompletionScript(), nil
case "powershell":
return powerShellCompletionScript(), nil
default:
return "", fmt.Errorf("unsupported shell: %s", shell)
}
}
func bashCompletionScript() string {
return `#!/usr/bin/env bash
_gog_complete() {
local IFS=$'\n'
local completions
completions=$(gog __complete --cword "$COMP_CWORD" -- "${COMP_WORDS[@]}")
COMPREPLY=()
if [[ -n "$completions" ]]; then
COMPREPLY=( $completions )
fi
}
complete -F _gog_complete gog
`
}
func zshCompletionScript() string {
return `#compdef gog
autoload -Uz bashcompinit
bashcompinit
` + bashCompletionScript()
}
func fishCompletionScript() string {
return `function __gog_complete
set -l words (commandline -opc)
set -l cur (commandline -ct)
set -l cword (count $words)
if test -n "$cur"
set cword (math $cword - 1)
end
gog __complete --cword $cword -- $words
end
complete -c gog -f -a "(__gog_complete)"
`
}
func powerShellCompletionScript() string {
return `Register-ArgumentCompleter -CommandName gog -ScriptBlock {
param($commandName, $wordToComplete, $cursorPosition, $commandAst, $fakeBoundParameter)
$elements = $commandAst.CommandElements | ForEach-Object { $_.ToString() }
$cword = $elements.Count - 1
$completions = gog __complete --cword $cword -- $elements
foreach ($completion in $completions) {
[System.Management.Automation.CompletionResult]::new($completion, $completion, 'ParameterValue', $completion)
}
}
`
}