From 970dfb4c1ef80c63562859859bc3369df6c711fc Mon Sep 17 00:00:00 2001 From: Petr Nyc Date: Mon, 20 Apr 2026 17:26:56 +0200 Subject: [PATCH] Config cleanup, create_mrshughes refactoring --- .codex/config.toml | 120 ++++- .config/alacritty/alacritty.toml | 46 +- .config/zellij/config.kdl | 39 +- .hgrc | 2 +- .spacemacs | 70 +-- .ssh/config.oci | 10 +- .ssh/config.solaris | 4 + .tridactylrc | 6 +- .zshrc | 2 +- .../DynamicProfiles/solarized_dark.json | 1 + bin/codex-devops-auth.sh | 57 ++- bin/create_mrshughes | 419 ++++++++++++------ 12 files changed, 553 insertions(+), 223 deletions(-) diff --git a/.codex/config.toml b/.codex/config.toml index dc1459e..7719edf 100644 --- a/.codex/config.toml +++ b/.codex/config.toml @@ -40,26 +40,35 @@ writable_roots = [ "/Users/jetpac/.codex/skills" ] [analytics] enabled = false + + [model_providers.oca-responses] base_url = "https://code-internal.aiservice.us-chicago-1.oci.oraclecloud.com/20250206/app/litellm" http_headers = { "client" = "codex-cli", "client-version" = "0" } model = "gpt5" name = "Oracle Code Assist Responses" wire_api = "responses" +stream_max_retries = 20 +request_max_retries = 20 + + [model_providers.oca-chat] base_url = "https://code-internal.aiservice.us-chicago-1.oci.oraclecloud.com/20250206/app/litellm" http_headers = { "client" = "codex-cli", "client-version" = "0" } model = "gpt5" name = "Oracle Code Assist Chat" wire_api = "responses" + [profiles.grok-4] model = "grok4" model_provider = "oca-chat" review_model = "grok4" + [profiles.grok-4-fast-reasoning] model = "grok4-fast-reasoning" model_provider = "oca-chat" review_model = "grok4-fast-reasoning" + [profiles.grok-code-fast-1] model = "grok-code-fast-1" model_provider = "oca-chat" @@ -157,6 +166,9 @@ PLAYWRIGHT_BROWSERS_PATH = "0" [mcp_servers.playwright.tools.browser_navigate] approval_mode = "approve" +[mcp_servers.playwright.tools.browser_resize] +approval_mode = "approve" + [mcp_servers.oci-kb] command = "/Users/jetpac/.local/bin/ocikb-mcp-server" @@ -178,6 +190,52 @@ command = "/Users/jetpac/bin/devops-mcp-wrapper.sh" env_vars = ["OP_TOKEN", "OPERATOR_ACCESS_TOKEN"] startup_timeout_sec = 180.0 +[mcp_servers.mcp_shepherd] +command = "uvx" +args = [ + "--default-index", + "https://artifactory.oci.oraclecorp.com/api/pypi/global-release-pypi/simple/", + "--from", + "mcp-shepherd-server", + "mcp-shepherd", + "--transport", + "stdio", +] +env_vars = ["OP_TOKEN", "OPERATOR_ACCESS_TOKEN", "SSH_AUTH_SOCK"] +startup_timeout_sec = 60.0 + +[mcp_servers.mcp_shepherd.env] +MCP_SHEPHERD_AUTH_PROVIDER = "OP_TOKEN" +MCP_SHEPHERD_TOOL_PROFILE = "core" +MCP_SHEPHERD_MAX_REGISTERED_TOOLS = "128" +MCP_SHEPHERD_ENABLE_WRITES = "1" +MCP_SHEPHERD_TIMEOUT_SECONDS = "25" +UV_SKIP_WHEEL_FILENAME_CHECK = "1" + +[mcp_servers.mcp_shepherd.tools.shepherd_list_releases] +approval_mode = "approve" + +[mcp_servers.mcp_shepherd.tools.shepherd_get_release] +approval_mode = "approve" + +[mcp_servers.mcp_shepherd.tools.shepherd_list_release_phases] +approval_mode = "approve" + +[mcp_servers.mcp_shepherd.tools.shepherd_list_flocks] +approval_mode = "approve" + +[mcp_servers.mcp_shepherd.tools.shepherd_list_execution_targets_for_flock] +approval_mode = "approve" + +[mcp_servers.mcp_shepherd.tools.shepherd_get_flock] +approval_mode = "approve" + +[mcp_servers.mcp_shepherd.tools.shepherd_list_flock_configs] +approval_mode = "approve" + +[mcp_servers.mcp_shepherd.tools.shepherd_get_flock_config] +approval_mode = "approve" + [mcp_servers.devops_mcp.tools.get_regions] approval_mode = "approve" @@ -199,6 +257,15 @@ approval_mode = "approve" [mcp_servers.devops_mcp.tools.get_tenancy_by_name] approval_mode = "approve" +[mcp_servers.devops_mcp.tools.get_shepherd_projects] +approval_mode = "approve" + +[mcp_servers.devops_mcp.tools.get_shepherd_phase_execution_targets] +approval_mode = "approve" + +[mcp_servers.devops_mcp.tools.get_release_details] +approval_mode = "approve" + [projects."/Users/jetpac/bin"] trust_level = "trusted" @@ -352,6 +419,30 @@ trust_level = "trusted" [projects."/Users/jetpac/Documents/OSD/oc21-mfo/oci-desktop-service-shepherd"] trust_level = "trusted" +[projects."/Users/jetpac/Documents/vlad_mutt_notmuch"] +trust_level = "trusted" + +[projects."/private/var/tmp/deleteme/oci-desktop-service-shepherd"] +trust_level = "trusted" + +[projects."/Users/jetpac/PycharmProjects/kucharka"] +trust_level = "trusted" + +[projects."/private/tmp/review"] +trust_level = "trusted" + +[projects."/private/tmp/kube"] +trust_level = "trusted" + +[projects."/Users/jetpac/Documents/OSD/tartan-alarms"] +trust_level = "trusted" + +[projects."/private/tmp/qqq"] +trust_level = "trusted" + +[projects."/private/tmp/conf"] +trust_level = "trusted" + [mcp_servers.grt] command = "/Users/jetpac/.codex/bin/grt-mcp" startup_timeout_sec = 30 @@ -372,6 +463,12 @@ startup_timeout_sec = 30 [mcp_servers.webrti.tools."webrti.get_entry"] approval_mode = "approve" +[mcp_servers.webrti.tools."webrti.list_by_date"] +approval_mode = "approve" + +[mcp_servers.webrti.tools."webrti.get_repo_list"] +approval_mode = "approve" + [mcp_servers.bugdb] command = "/Users/jetpac/.codex/bin/bugdb-mcp" startup_timeout_sec = 30 @@ -397,6 +494,9 @@ approval_mode = "approve" [mcp_servers.bugdb.tools."bugdb.search_bugs"] approval_mode = "approve" +[mcp_servers.bugdb.tools."bugdb.get_children"] +approval_mode = "approve" + [mcp_servers.central_confluence] command = "uvx" args = [ @@ -415,6 +515,9 @@ approval_mode = "approve" [mcp_servers.central_confluence.tools.confluence_get_page] approval_mode = "approve" +[mcp_servers.central_confluence.tools.confluence_search] +approval_mode = "approve" + [mcp_servers.notmuch] command = "node" args = ["/Users/jetpac/Documents/codex-tools/MCPs/notmuch/dist/index.js"] @@ -429,11 +532,26 @@ approval_mode = "approve" [mcp_servers.notmuch.tools.notmuch_get_message] approval_mode = "approve" +[mcp_servers.notmuch.tools.notmuch_count_messages] +approval_mode = "approve" + +[mcp_servers.notmuch.tools.notmuch_list_tags] +approval_mode = "approve" + [mcp_servers.vm] command = "node" args = ["/Users/jetpac/Documents/codex-tools/MCPs/vm/dist/index.js"] startup_timeout_sec = 30 +[mcp_servers.vm.tools.vm_list_machines] +approval_mode = "approve" + +[mcp_servers.vm.tools.vm_get_machine_info] +approval_mode = "approve" + +[mcp_servers.vm.tools.vm_guest_exec] +approval_mode = "approve" + [mcp_servers.oracle-bitbucket] command = "node" args = ["/Users/jetpac/Documents/codex-tools/MCPs/bitbucket-mcp/build/index.js"] @@ -490,4 +608,4 @@ JIRA_URL = "https://jira.oci.oraclecorp.com/" JIRA_USERNAME = "petr.nyc@oracle.com" JIRA_PERSONAL_TOKEN = "MDM2MDg0OTkxNDE1OmRcmNouX2Uw1M3/riCygQz9ogos" JIRA_SSL_VERIFY = "false" -READ_ONLY_MODE = "false" \ No newline at end of file +READ_ONLY_MODE = "false" diff --git a/.config/alacritty/alacritty.toml b/.config/alacritty/alacritty.toml index 1ab4c31..05a9283 100644 --- a/.config/alacritty/alacritty.toml +++ b/.config/alacritty/alacritty.toml @@ -57,31 +57,31 @@ history = 20000 [keyboard] bindings = [ - # tmux bindings - # alt + switches to window - { key = "1" , mods = "Option", chars = "\u0001\u0031" }, # C-a 1 - { key = "2" , mods = "Option", chars = "\u0001\u0032" }, # C-a 2 - { key = "3" , mods = "Option", chars = "\u0001\u0033" }, # C-a 3 - { key = "4" , mods = "Option", chars = "\u0001\u0034" }, # C-a 4 - { key = "5" , mods = "Option", chars = "\u0001\u0035" }, # C-a 5 - { key = "6" , mods = "Option", chars = "\u0001\u0036" }, # C-a 6 - { key = "7" , mods = "Option", chars = "\u0001\u0037" }, # C-a 7 - { key = "8" , mods = "Option", chars = "\u0001\u0038" }, # C-a 8 - { key = "9" , mods = "Option", chars = "\u0001\u0039" }, # C-a 9 - { key = "h" , mods = "Option", chars = "\u0001\u0068" }, # C-a left - { key = "j" , mods = "Option", chars = "\u0001\u006a" }, # C-a down - { key = "k" , mods = "Option", chars = "\u0001\u006b" }, # C-a up - { key = "l" , mods = "Option", chars = "\u0001\u006c" }, # C-a right + # # tmux bindings + # # alt + switches to window + # { key = "1" , mods = "Option", chars = "\u0001\u0031" }, # C-a 1 + # { key = "2" , mods = "Option", chars = "\u0001\u0032" }, # C-a 2 + # { key = "3" , mods = "Option", chars = "\u0001\u0033" }, # C-a 3 + # { key = "4" , mods = "Option", chars = "\u0001\u0034" }, # C-a 4 + # { key = "5" , mods = "Option", chars = "\u0001\u0035" }, # C-a 5 + # { key = "6" , mods = "Option", chars = "\u0001\u0036" }, # C-a 6 + # { key = "7" , mods = "Option", chars = "\u0001\u0037" }, # C-a 7 + # { key = "8" , mods = "Option", chars = "\u0001\u0038" }, # C-a 8 + # { key = "9" , mods = "Option", chars = "\u0001\u0039" }, # C-a 9 + # { key = "h" , mods = "Option", chars = "\u0001\u0068" }, # C-a left + # { key = "j" , mods = "Option", chars = "\u0001\u006a" }, # C-a down + # { key = "k" , mods = "Option", chars = "\u0001\u006b" }, # C-a up + # { key = "l" , mods = "Option", chars = "\u0001\u006c" }, # C-a right - # for tmux resizing - # option + command + for resizing - { key = "k" , mods = "Option|command", chars = "\u0001\u001b\u005b\u0031\u003b\u0035\u0041" }, # C-a C-up - { key = "j" , mods = "Option|command", chars = "\u0001\u001b\u005b\u0031\u003b\u0035\u0042" }, # C-a C-down - { key = "l" , mods = "Option|command", chars = "\u0001\u001b\u005b\u0031\u003b\u0035\u0043" }, # C-a C-right - { key = "h" , mods = "Option|command", chars = "\u0001\u001b\u005b\u0031\u003b\u0035\u0044" }, # C-a C-left + # # for tmux resizing + # # option + command + for resizing + # { key = "k" , mods = "Option|command", chars = "\u0001\u001b\u005b\u0031\u003b\u0035\u0041" }, # C-a C-up + # { key = "j" , mods = "Option|command", chars = "\u0001\u001b\u005b\u0031\u003b\u0035\u0042" }, # C-a C-down + # { key = "l" , mods = "Option|command", chars = "\u0001\u001b\u005b\u0031\u003b\u0035\u0043" }, # C-a C-right + # { key = "h" , mods = "Option|command", chars = "\u0001\u001b\u005b\u0031\u003b\u0035\u0044" }, # C-a C-left - { key = "n" , mods = "Alt", chars = "\u0001\u006e" }, # alt+n -> C-a n - { key = "p" , mods = "Alt", chars = "\u0001\u0070" }, # alt+p -> C-a p + # { key = "n" , mods = "Alt", chars = "\u0001\u006e" }, # alt+n -> C-a n + # { key = "p" , mods = "Alt", chars = "\u0001\u0070" }, # alt+p -> C-a p { key = "ArrowLeft", mods = "Command|Shift", action = "SelectPreviousTab" }, { key = "ArrowRight", mods = "Command|Shift", action = "SelectNextTab" }, diff --git a/.config/zellij/config.kdl b/.config/zellij/config.kdl index 71f5610..3152954 100644 --- a/.config/zellij/config.kdl +++ b/.config/zellij/config.kdl @@ -1,6 +1,6 @@ keybinds clear-defaults=true { locked { - bind "Ctrl g" { SwitchToMode "normal"; } + bind "Ctrl Alt g" { SwitchToMode "normal"; } } pane { bind "left" { MoveFocus "left"; } @@ -71,10 +71,10 @@ keybinds clear-defaults=true { bind "Ctrl n" { SwitchToMode "normal"; } } move { - bind "left" { MovePane "left"; } - bind "down" { MovePane "down"; } - bind "up" { MovePane "up"; } - bind "right" { MovePane "right"; } + bind "Alt left" { MovePane "left"; } + bind "Alt down" { MovePane "down"; } + bind "Alt up" { MovePane "up"; } + bind "Alt right" { MovePane "right"; } bind "h" { MovePane "left"; } bind "Ctrl h" { SwitchToMode "normal"; } bind "j" { MovePane "down"; } @@ -134,17 +134,17 @@ keybinds clear-defaults=true { } } shared_except "locked" { - bind "Alt left" { MoveFocusOrTab "left"; } +// bind "Alt left" { MoveFocusOrTab "left"; } bind "Alt down" { MoveFocus "down"; } bind "Alt up" { MoveFocus "up"; } - bind "Alt right" { MoveFocusOrTab "right"; } +// bind "Alt right" { MoveFocusOrTab "right"; } bind "Alt +" { Resize "Increase"; } bind "Alt -" { Resize "Decrease"; } bind "Alt =" { Resize "Increase"; } bind "Alt [" { PreviousSwapLayout; } bind "Alt ]" { NextSwapLayout; } bind "Alt f" { ToggleFloatingPanes; } - bind "Ctrl g" { SwitchToMode "locked"; } + bind "Ctrl Alt g" { SwitchToMode "locked"; } bind "Alt h" { MoveFocusOrTab "left"; } bind "Alt i" { MoveTab "left"; } bind "Alt j" { MoveFocus "down"; } @@ -163,7 +163,7 @@ keybinds clear-defaults=true { bind "Ctrl o" { SwitchToMode "session"; } } shared_except "locked" "scroll" "search" "tmux" { - bind "Ctrl b" { SwitchToMode "tmux"; } + bind "Ctrl a" { SwitchToMode "tmux"; } } shared_except "locked" "scroll" "search" { bind "Ctrl s" { SwitchToMode "scroll"; } @@ -241,6 +241,16 @@ keybinds clear-defaults=true { bind "o" { FocusNextPane; } bind "p" { GoToPreviousTab; SwitchToMode "normal"; } bind "z" { ToggleFocusFullscreen; SwitchToMode "normal"; } + bind "1" { GoToTab 1; SwitchToMode "normal"; } + bind "2" { GoToTab 2; SwitchToMode "normal"; } + bind "3" { GoToTab 3; SwitchToMode "normal"; } + bind "4" { GoToTab 4; SwitchToMode "normal"; } + bind "5" { GoToTab 5; SwitchToMode "normal"; } + bind "6" { GoToTab 6; SwitchToMode "normal"; } + bind "7" { GoToTab 7; SwitchToMode "normal"; } + bind "8" { GoToTab 8; SwitchToMode "normal"; } + bind "9" { GoToTab 9; SwitchToMode "normal"; } + bind "-" { NewPane "down"; SwitchToMode "normal"; } } } @@ -283,7 +293,8 @@ web_client { // Default: default // // theme "dracula" - theme "solarized-dark" +// theme "solarized-dark" +theme "nord" // Choose the base input mode of zellij. // Default: normal @@ -321,14 +332,14 @@ web_client { // - true (default) // - false // -// mouse_mode false +mouse_mode true // Toggle having pane frames around the panes // Options: // - true (default, enabled) // - false // -// pane_frames false + pane_frames false // When attaching to an existing session with other users, // should the session be mirrored (true) @@ -366,7 +377,7 @@ web_client { // copy_command "wl-copy" // wayland // copy_command "pbcopy" // osx // -// copy_command "pbcopy" +copy_command "pbcopy" // Choose the destination for copied text // Allows using the primary selection buffer (on x11/wayland) instead of the system clipboard. @@ -384,7 +395,7 @@ web_client { // Path to the default editor to use to edit pane scrollbuffer // Default: $EDITOR or $VISUAL -// scrollback_editor "/usr/bin/vim" + scrollback_editor "/usr/bin/vim" // A fixed name to always give the Zellij session. // Consider also setting `attach_to_session true,` diff --git a/.hgrc b/.hgrc index ec7e203..768d9ad 100644 --- a/.hgrc +++ b/.hgrc @@ -4,7 +4,7 @@ [ui] username =Petr Nyc -merge = +merge = vimdiff [extensions] diff --git a/.spacemacs b/.spacemacs index 9b17836..f4f998d 100644 --- a/.spacemacs +++ b/.spacemacs @@ -32,7 +32,8 @@ This function should only modify configuration layer settings." ;; List of configuration layers to load. dotspacemacs-configuration-layers - '(windows-scripts + '(typescript + windows-scripts swift multiple-cursors ;; https://www.spacemacs.org/layers/+misc/multiple-cursors/README.html#key-bindings (aider :variables @@ -672,7 +673,7 @@ before packages are loaded." notmuch-search-oldest-first nil ;; new email on top notmuch-column-control 1.0 ;; just one columnt for searches notmuch-hello-insert-recent-searches nil ;; don't display recent searches in notmuch-helo - ;; notmuch-address-command "/Users/jetpac/bin/notmuch-address" + notmuch-address-command "/Users/jetpac/bin/notmuch-address" ;; these are default ;; notmuch-hello-sections '(notmuch-hello-insert-header notmuch-hello-insert-saved-searches @@ -1345,7 +1346,6 @@ This function is called at the very end of Spacemacs initialization." ;; If you edit it by hand, you could mess it up, so be careful. ;; Your init file should contain only one such instance. ;; If there is more than one, they won't work right. - ;; '(custom-enabled-themes '(doom-solarized-dark)) '(custom-safe-themes '("d97ac0baa0b67be4f7523795621ea5096939a47e8b46378f79e78846e0e4ad3d" "21d2bf8d4d1df4859ff94422b5e41f6f2eeff14dd12f01428fa3cb4cb50ea0fb" @@ -1500,11 +1500,11 @@ This function is called at the very end of Spacemacs initialization." '(notmuch-search-oldest-first nil) '(org-hide-leading-stars t) '(package-selected-packages - '(a ace-jump-helm-line ace-link afternoon-theme aggressive-indent ai-code - aidermacs aio alect-themes alert all-the-icons ample-theme - ample-zen-theme anaconda-mode anti-zenburn-theme apropospriate-theme - auto-compile auto-highlight-symbol auto-yasnippet autothemer - badwolf-theme birds-of-paradise-plus-theme blacken bmx-mode + '(a ace-jump-helm-line ace-link add-node-modules-path afternoon-theme + aggressive-indent ai-code aidermacs aio alect-themes alert all-the-icons + ample-theme ample-zen-theme anaconda-mode anti-zenburn-theme + apropospriate-theme auto-compile auto-highlight-symbol auto-yasnippet + autothemer badwolf-theme birds-of-paradise-plus-theme blacken bmx-mode bubbleberry-theme bui busybee-theme centered-cursor-mode cherry-blossom-theme chocolate-theme clean-aindent-mode closql clues-theme code-cells code-review color-theme-sanityinc-solarized @@ -1527,31 +1527,31 @@ This function is called at the very end of Spacemacs initialization." farmhouse-themes fish-mode flatland-theme flatui-theme flx-ido flycheck forge frame-local gandalf-theme ggtags gh-md ghub git-link git-messenger git-modes git-timemachine gitignore-templates gntp gnuplot golden-ratio - google-translate gotham-theme grandshell-theme groovy-imports groovy-mode - gruber-darker-theme gruvbox-theme haml-mode hc-zenburn-theme hcl-mode - helm helm-ag helm-c-yasnippet helm-comint helm-company helm-css-scss - helm-descbinds helm-git-grep helm-ls-git helm-lsp helm-make + google-translate gotham-theme grandshell-theme grizzl groovy-imports + groovy-mode gruber-darker-theme gruvbox-theme haml-mode hc-zenburn-theme + hcl-mode helm helm-ag helm-c-yasnippet helm-comint helm-company + helm-css-scss helm-descbinds helm-git-grep helm-ls-git helm-lsp helm-make helm-mode-manager helm-notmuch helm-org helm-org-rifle helm-projectile helm-purpose helm-pydoc helm-swoop helm-themes helm-xref hemisu-theme heroku-theme hide-comnt hierarchy highlight-indentation highlight-numbers highlight-parentheses hl-todo holy-mode htmlize hungry-delete hybrid-mode - impatient-mode importmagic indent-guide info+ inkpot-theme insert-shebang - inspector ir-black-theme jazz-theme jbeans-theme js-doc js2-mode - js2-refactor json-mode json-navigator json-reformat json-snatcher - kaolin-themes light-soap-theme link-hint live-py-mode livid-mode - load-env-vars log4e lorem-ipsum lsp-docker lsp-mode lsp-origami - lsp-pyright lsp-treemacs lsp-ui lush-theme macrostep madhat2r-theme magit - magit-section markdown-mode markdown-toc material-theme minimal-theme - modus-themes moe-theme molokai-theme monochrome-theme monokai-theme - multi-line multi-term multi-vterm multiple-cursors mustang-theme nameless - naquadah-theme nginx-mode noctilux-theme nodejs-repl nose notmuch - npm-mode obsidian-theme occidental-theme ol-notmuch oldlace-theme - omtose-phellack-themes open-junk-file org-alert org-caldav - org-category-capture org-cliplink org-contrib org-download org-jira - org-mac-link org-mime org-msg org-pomodoro org-present - org-project-capture org-projectile org-rich-yank org-superstar - organic-green-theme orgit orgit-forge origami overseer ox-jira ox-twbs - pandoc-mode paradox password-generator pcache pcre2el + impatient-mode import-js importmagic indent-guide info+ inkpot-theme + insert-shebang inspector ir-black-theme jazz-theme jbeans-theme js-doc + js2-mode js2-refactor json-mode json-navigator json-reformat + json-snatcher kaolin-themes light-soap-theme link-hint live-py-mode + livid-mode load-env-vars log4e lorem-ipsum lsp-docker lsp-mode + lsp-origami lsp-pyright lsp-treemacs lsp-ui lush-theme macrostep + madhat2r-theme magit magit-section markdown-mode markdown-toc + material-theme minimal-theme modus-themes moe-theme molokai-theme + monochrome-theme monokai-theme multi-line multi-term multi-vterm + multiple-cursors mustang-theme nameless naquadah-theme nginx-mode + noctilux-theme nodejs-repl nose notmuch npm-mode obsidian-theme + occidental-theme ol-notmuch oldlace-theme omtose-phellack-themes + open-junk-file org-alert org-caldav org-category-capture org-cliplink + org-contrib org-download org-jira org-mac-link org-mime org-msg + org-pomodoro org-present org-project-capture org-projectile org-rich-yank + org-superstar organic-green-theme orgit orgit-forge origami overseer + ox-jira ox-twbs pandoc-mode paradox password-generator pcache pcre2el phoenix-dark-mono-theme phoenix-dark-pink-theme pip-requirements pipenv pippel planet-theme poetry popwin pos-tip powershell prettier-js professional-theme pug-mode purple-haze-theme py-isort pydoc pyenv-mode @@ -1567,12 +1567,12 @@ This function is called at the very end of Spacemacs initialization." term-cursor terminal-here tern terraform-mode toc-org toml-mode toxi-theme transient treemacs-evil treemacs-icons-dired treemacs-magit treemacs-persp treemacs-projectile treepy twilight-anti-bright-theme - twilight-bright-theme twilight-theme ujelly-theme underwater-theme - undo-fu undo-fu-session vi-tilde-fringe volatile-highlights vterm vundo - web-beautify web-completion-data web-mode which-key white-sand-theme - winum with-editor writeroom-mode ws-butler yaml yaml-mode yapfify - yasnippet yasnippet-snippets zen-and-art-theme zenburn-theme - zonokai-emacs))) + twilight-bright-theme twilight-theme typescript-mode ujelly-theme + underwater-theme undo-fu undo-fu-session vi-tilde-fringe + volatile-highlights vterm vundo web-beautify web-completion-data web-mode + which-key white-sand-theme winum with-editor writeroom-mode ws-butler + yaml yaml-mode yapfify yasnippet yasnippet-snippets zen-and-art-theme + zenburn-theme zonokai-emacs))) (custom-set-faces ;; custom-set-faces was added by Custom. ;; If you edit it by hand, you could mess it up, so be careful. diff --git a/.ssh/config.oci b/.ssh/config.oci index 1ebaebd..621898f 100644 --- a/.ssh/config.oci +++ b/.ssh/config.oci @@ -11,9 +11,9 @@ Host bitbucket.oci.oraclecorp.com Host dabel dabel.us.oracle.com andel andel.us.oracle.com gates gates.us.oracle.com on10-patch.us.oracle.com User pnyc IdentityFile ~/.ssh/dabel.key - RequestTTY yes + RequestTTY yes - -Host oci.private.devops.scmservice.us-phoenix-1.oci.oracleiaas.com - PKCS11Provider /Library/OpenSC/lib/opensc-pkcs11.so - User pnyc@bmc_operator_access +Host codex.webad1phx.solarisx86phx.oraclevcn.com + User pnyc + IdentityFile ~/.ssh/id_rsa + IdentitiesOnly yes diff --git a/.ssh/config.solaris b/.ssh/config.solaris index b268d5d..3743606 100644 --- a/.ssh/config.solaris +++ b/.ssh/config.solaris @@ -23,6 +23,10 @@ Host osd-fra HostName 100.109.60.126 IdentityFile ~/.ssh/id_ed25519 +Host codex.webad1phx.solarisx86phx.oraclevcn.com + User pnyc + IdentitiesOnly ~/.ssh/id_rsa + Host gitlab.com User git IdentityFile ~/.ssh/gitlab diff --git a/.tridactylrc b/.tridactylrc index 23f4ac9..0ce4d89 100644 --- a/.tridactylrc +++ b/.tridactylrc @@ -13,8 +13,12 @@ bind J tabnext bind K tabprev blacklistadd https://www.youtube.com/ +blacklistadd https://127.0.0.1 +blacklistadd http://127.0.0.1 blacklistadd https://login.us-phoenix-1.idp.mc1.oracleiaas.com/ blacklistadd https://jellyfin.cloud.jetpac.org +blacklistadd https://freshrss.cloud.jetpac.org +blacklistadd https://firefox.cloud.jetpac.org " blacklistadd https://grt.us.oracle.com " auto-contain @@ -28,4 +32,4 @@ seturl youtube.com modeindicator false " nbind " For syntax highlighting see https://github.com/tridactyl/vim-tridactyl -" vim: set filetype=tridactyl \ No newline at end of file +" vim: set filetype=tridactyl diff --git a/.zshrc b/.zshrc index 3e6bd50..dbc2852 100644 --- a/.zshrc +++ b/.zshrc @@ -320,5 +320,5 @@ fi unset _zellij_comp_src _zellij_comp_safe ### MANAGED BY RANCHER DESKTOP START (DO NOT EDIT) -# export PATH="/Users/jetpac/.rd/bin:$PATH" +export PATH="/Users/jetpac/.rd/bin:$PATH" ### MANAGED BY RANCHER DESKTOP END (DO NOT EDIT) diff --git a/Library/Application Support/iTerm2/DynamicProfiles/solarized_dark.json b/Library/Application Support/iTerm2/DynamicProfiles/solarized_dark.json index 62116ba..6bf9d22 100644 --- a/Library/Application Support/iTerm2/DynamicProfiles/solarized_dark.json +++ b/Library/Application Support/iTerm2/DynamicProfiles/solarized_dark.json @@ -4,6 +4,7 @@ "Name": "Solarized Dark", "Guid": "EAAE4823-98F2-4CF1-909C-E2C37013889C", "Dynamic Profile Parent Name": "tmux keys", + "Window Type": 12, "Badge Color" : { "Red Component" : 1, "Color Space" : "sRGB", diff --git a/bin/codex-devops-auth.sh b/bin/codex-devops-auth.sh index 40f4f0c..18c5de4 100755 --- a/bin/codex-devops-auth.sh +++ b/bin/codex-devops-auth.sh @@ -8,6 +8,7 @@ SSH_CONFIG_FILE="${SSH_CONFIG_FILE:-$HOME/.ssh/config.oci}" OCI_BIN="${OCI_BIN:-/opt/homebrew/bin/oci}" OCI_SESSION_REGION="${OCI_SESSION_REGION:-us-chicago-1}" OCI_PROFILE_NAME="${OCI_PROFILE_NAME:-DEFAULT}" +OCI_SESSION_VALIDATE_TIMEOUT_SECONDS="${OCI_SESSION_VALIDATE_TIMEOUT_SECONDS:-2}" RESET_AGENT="${RESET_AGENT:-0}" DEDICATED_AGENT_PID="" DEDICATED_AGENT_SOCK="" @@ -26,14 +27,64 @@ run_oci() { "${OCI_BIN}" --profile "${OCI_PROFILE_NAME}" "$@" } +resolve_timeout_bin() { + local candidate + + for candidate in timeout gtimeout /opt/homebrew/bin/timeout /opt/homebrew/bin/gtimeout; do + if [[ "${candidate}" == /* ]]; then + if [[ -x "${candidate}" ]]; then + print -r -- "${candidate}" + return 0 + fi + continue + fi + + if command -v "${candidate}" >/dev/null 2>&1; then + command -v "${candidate}" + return 0 + fi + done + + return 1 +} + +get_validate_timeout_seconds() { + local timeout_seconds="${OCI_SESSION_VALIDATE_TIMEOUT_SECONDS}" + + if [[ ! "${timeout_seconds}" =~ '^[0-9]+([.][0-9]+)?$' ]]; then + log "Warning: invalid OCI_SESSION_VALIDATE_TIMEOUT_SECONDS=${timeout_seconds}; using 2 seconds." + print -r -- "2" + return 0 + fi + + print -r -- "${timeout_seconds}" +} + +run_oci_with_timeout() { + local timeout_seconds="$1" + shift + + local timeout_bin + if ! timeout_bin="$(resolve_timeout_bin)"; then + log "Warning: no timeout binary found; running OCI command without a timeout." + run_oci "$@" + return $? + fi + + "${timeout_bin}" "${timeout_seconds}" "${OCI_BIN}" --profile "${OCI_PROFILE_NAME}" "$@" +} + ensure_oci_session() { if [[ ! -x "${OCI_BIN}" ]]; then print -u2 "OCI CLI not found or not executable: ${OCI_BIN}" exit 1 fi + local validate_timeout_seconds + validate_timeout_seconds="$(get_validate_timeout_seconds)" + set +e - run_oci session validate >/dev/null 2>&1 + run_oci_with_timeout "${validate_timeout_seconds}" session validate >/dev/null 2>&1 local validate_rc=$? set -e @@ -42,6 +93,10 @@ ensure_oci_session() { return 0 fi + if [[ ${validate_rc} -eq 124 ]]; then + log "OCI CLI session validation timed out after ${validate_timeout_seconds} seconds; treating session as invalid." + fi + log "OCI CLI session is not valid; attempting refresh." set +e run_oci session refresh >/dev/null 2>&1 diff --git a/bin/create_mrshughes b/bin/create_mrshughes index 25573f9..5ca87bb 100755 --- a/bin/create_mrshughes +++ b/bin/create_mrshughes @@ -1,197 +1,334 @@ #!/bin/zsh -set -e -set -x +set -eu + +SCRIPT_NAME=${0:t} +SCRIPT_DIR=${0:A:h} + +DEFAULT_PARENT_WS='ssh://pnyc@dabel.us.oracle.com//workspace/pnyc/solaris-reviews/on-sru' +DEFAULT_DEST_ROOT="${HOME}/PycharmProjects" +DEFAULT_FOLDER_PREFIX='PetrN/' +DEFAULT_POINT_OF_CONTACT='petr.nyc@oracle.com' +DEFAULT_SLACK_CHANNEL='@pnyc' +DEFAULT_PYTHON='/opt/homebrew/bin/python3.11' +OS_NAME="$(uname -s)" + +export PATH="/opt/homebrew/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin${PATH:+:$PATH}" usage() { - print "Usage: ${0:t} [-r repo_url] [-d dest_dir] [-h]" - print "" - print " -r repo_url Mercurial repo URL to clone." - print " Default: ssh://pnyc@dabel.us.oracle.com//workspace/pnyc/solaris-reviews/on-sru" - print " -d dest_dir Local directory to clone into." - print " Default: ~/PycharmProjects/" - print " -h Show this help text." - print "" - print "The script exits if dest_dir already exists." + cat < + -f folder_prefix Jenkins folder prefix. + Default: ${DEFAULT_FOLDER_PREFIX} + -c point_of_contact Contact email for generated config. + Default: ${DEFAULT_POINT_OF_CONTACT} + -s slack_channel Slack handle/channel for generated config. + Default: ${DEFAULT_SLACK_CHANNEL} + -p python_exe Python executable for virtualenv creation. + Default: ${DEFAULT_PYTHON} + -j python_jenkins_path Optional local checkout to inject into requirements.txt. + Default: disabled + -h Show this help text. + +Environment overrides: + MRSHUGHES_PARENT_WS + MRSHUGHES_DEST_DIR + MRSHUGHES_FOLDER_PREFIX + MRSHUGHES_POINT_OF_CONTACT + MRSHUGHES_SLACK_CHANNEL + MRSHUGHES_PYTHON + MRSHUGHES_PYTHON_JENKINS_PATH + +The script exits if dest_dir already exists. +EOF +} + +die() { + print -u2 -- "$@" + exit 1 +} + +require_command() { + command -v "$1" >/dev/null 2>&1 || die "Missing required command: $1" +} + +resolve_executable() { + local executable=${~1} + + if [[ "$executable" == */* ]]; then + [[ -x "$executable" ]] || die "Executable not found or not executable: $executable" + print -r -- "$executable" + return + fi + + command -v "$executable" >/dev/null 2>&1 || die "Command not found in PATH: $executable" + command -v "$executable" +} + +disable_proxy() { + local proxy_script="${SCRIPT_DIR}/proxy" + + if [[ -f "$proxy_script" ]]; then + source "$proxy_script" off >/dev/null + fi } ensure_clone_identity_loaded() { - local ssh_host="$1" - local identity_file="" - local identity_pub="" - - ssh_host="${ssh_host%%:*}" + local ssh_host=$1 + local identity_file + local identity_pub identity_file=$(ssh -G "$ssh_host" 2>/dev/null | awk '/^identityfile / {print $2; exit}') - if [[ -z "$identity_file" ]]; then - return 0 - fi + [[ -n "$identity_file" ]] || return identity_file=${~identity_file} identity_pub="${identity_file}.pub" - - if [[ ! -f "$identity_file" || ! -f "$identity_pub" ]]; then - return 0 - fi + [[ -f "$identity_file" && -f "$identity_pub" ]] || return if ssh-add -T "$identity_pub" >/dev/null 2>&1; then - return 0 + return fi - print "Loading SSH identity for ${ssh_host}: ${identity_file}" - ssh-add --apple-use-keychain "$identity_file" >/dev/null 2>&1 || ssh-add "$identity_file" + print -- "Loading SSH identity for ${ssh_host}: ${identity_file}" + if [[ "$OS_NAME" == "Darwin" ]]; then + ssh-add --apple-use-keychain "$identity_file" >/dev/null + else + ssh-add "$identity_file" >/dev/null + fi } -DEFAULT_PARENT_WS='ssh://pnyc@dabel.us.oracle.com//workspace/pnyc/solaris-reviews/on-sru' -# Example repo URLs: -# ssh://pnyc@andel.us.oracle.com//workspace/pnyc/solaris-reviews/secure-integrate/userland11.4 -# ssh://pnyc@andel.us.oracle.com//workspace/pnyc/solaris-reviews/userland-pipeline -# ssh://pnyc@andel.us.oracle.com//workspace/pnyc/solaris-reviews/akidr-text -# ssh://pnyc@andel.us.oracle.com//workspace/pnyc/solaris-reviews/akidr -PARENT_WS="$DEFAULT_PARENT_WS" -DEST_DIR='' +apply_python_jenkins_override() { + local checkout_path=$1 + local tmp_requirements -while getopts ":r:d:h" opt; do + tmp_requirements=$(mktemp) + sed -E "s|^git.*$|git+file://${checkout_path}|" requirements.txt > "$tmp_requirements" + /bin/mv "$tmp_requirements" requirements.txt +} + +yaml_escape() { + local value=$1 + + value=${value//\\/\\\\} + value=${value//\"/\\\"} + print -r -- "$value" +} + +set_yaml_key() { + local file=$1 + local key=$2 + local value + local tmp_file + + value=$(yaml_escape "$3") + tmp_file=$(mktemp) + + if ! awk -v key="$key" -v value="$value" ' + $0 ~ "^[[:space:]]*" key ":[[:space:]]*" { + match($0, /^[[:space:]]*/) + print substr($0, 1, RLENGTH) key ": \"" value "\"" + changed = 1 + next + } + { print } + END { exit changed ? 0 : 1 } + ' "$file" > "$tmp_file"; then + /bin/rm -f "$tmp_file" + die "Expected key not found in ${file}: ${key}" + fi + + /bin/mv "$tmp_file" "$file" +} + +insert_yaml_key_after() { + local file=$1 + local anchor=$2 + local key=$3 + local value + local tmp_file + + value=$(yaml_escape "$4") + tmp_file=$(mktemp) + + if ! awk -v anchor="$anchor" -v key="$key" -v value="$value" ' + { + print + if (!inserted && $0 ~ "^[[:space:]]*" anchor ":[[:space:]]*") { + match($0, /^[[:space:]]*/) + print substr($0, 1, RLENGTH) key ": \"" value "\"" + inserted = 1 + } + } + END { exit inserted ? 0 : 1 } + ' "$file" > "$tmp_file"; then + /bin/rm -f "$tmp_file" + die "Expected anchor not found in ${file}: ${anchor}" + fi + + /bin/mv "$tmp_file" "$file" +} + +configure_defaults_devel() { + local file=$1 + + set_yaml_key "$file" script_dir_base "$SCRIPT_DIR_BASE" + if grep -Eq '^[[:space:]]*pipeline_workspace:[[:space:]]*' "$file"; then + set_yaml_key "$file" pipeline_workspace "$JENKINS_CLONE_FROM" + else + insert_yaml_key_after "$file" script_dir_base pipeline_workspace "$JENKINS_CLONE_FROM" + fi + set_yaml_key "$file" folder_prefix "$FOLDER_PREFIX" + set_yaml_key "$file" point_of_contact "$POINT_OF_CONTACT" + set_yaml_key "$file" slack_channel "$SLACK_CHANNEL" +} + +find_lint_dir() { + if [[ -d "${DEST_DIR}/solaris/on/production" ]]; then + print -r -- "${DEST_DIR}/solaris/on/production" + return + fi + + if [[ -d "${DEST_DIR}/solaris/userland/sru" ]]; then + print -r -- "${DEST_DIR}/solaris/userland/sru" + return + fi + + die "Unable to determine lint directory under ${DEST_DIR}/solaris" +} + +print_config() { + print -- "Parent workspace: ${PARENT_WS}" + print -- "Destination directory: ${DEST_DIR}" + print -- "Folder prefix: ${FOLDER_PREFIX}" + print -- "Point of contact: ${POINT_OF_CONTACT}" + print -- "Slack channel: ${SLACK_CHANNEL}" + print -- "Python executable: ${PYTHON_EXE}" + if [[ -n "$PYTHON_JENKINS_PATH" ]]; then + print -- "python-jenkins override: ${PYTHON_JENKINS_PATH}" + else + print -- "python-jenkins override: disabled" + fi +} + +PARENT_WS="${MRSHUGHES_PARENT_WS:-$DEFAULT_PARENT_WS}" +DEST_DIR="${MRSHUGHES_DEST_DIR:-}" +FOLDER_PREFIX="${MRSHUGHES_FOLDER_PREFIX:-$DEFAULT_FOLDER_PREFIX}" +POINT_OF_CONTACT="${MRSHUGHES_POINT_OF_CONTACT:-$DEFAULT_POINT_OF_CONTACT}" +SLACK_CHANNEL="${MRSHUGHES_SLACK_CHANNEL:-$DEFAULT_SLACK_CHANNEL}" +PYTHON_EXE="${MRSHUGHES_PYTHON:-$DEFAULT_PYTHON}" +PYTHON_JENKINS_PATH="${MRSHUGHES_PYTHON_JENKINS_PATH:-}" + +while getopts ":r:d:f:c:s:p:j:h" opt; do case "$opt" in - r) - PARENT_WS="$OPTARG" - ;; - d) - DEST_DIR="$OPTARG" - ;; + r) PARENT_WS="$OPTARG" ;; + d) DEST_DIR="$OPTARG" ;; + f) FOLDER_PREFIX="$OPTARG" ;; + c) POINT_OF_CONTACT="$OPTARG" ;; + s) SLACK_CHANNEL="$OPTARG" ;; + p) PYTHON_EXE="$OPTARG" ;; + j) PYTHON_JENKINS_PATH="$OPTARG" ;; h) usage exit 0 ;; :) - print -u2 "Missing argument for -$OPTARG" - usage >&2 - exit 1 + die "Missing argument for -$OPTARG" ;; \?) - print -u2 "Unknown option: -$OPTARG" usage >&2 - exit 1 + die "Unknown option: -$OPTARG" ;; esac done shift $((OPTIND - 1)) +[[ $# -eq 0 ]] || die "Unexpected positional arguments: $*" -if [[ $# -ne 0 ]]; then - print -u2 "Unexpected positional arguments: $*" - usage >&2 - exit 1 -fi +for command_name in hg awk sed mktemp grep make; do + require_command "$command_name" +done -# remove trailing slash PARENT_WS="${PARENT_WS%/}" +REPO=${PARENT_WS##*/} +[[ -n "$DEST_DIR" ]] || DEST_DIR="${DEFAULT_DEST_ROOT}/${REPO}" -REPO=${PARENT_WS##*/} # userland11.4 +DEST_DIR=${~DEST_DIR:A} +PYTHON_EXE=$(resolve_executable "$PYTHON_EXE") -if [[ -z "$DEST_DIR" ]]; then - DEST_DIR=~/PycharmProjects/${REPO} +if [[ -n "$PYTHON_JENKINS_PATH" ]]; then + PYTHON_JENKINS_PATH=${~PYTHON_JENKINS_PATH:A} + [[ -d "$PYTHON_JENKINS_PATH" ]] || die "Required directory not found: ${PYTHON_JENKINS_PATH}" fi -DEST_DIR=${~DEST_DIR} -DEST_DIR=${DEST_DIR:A} +[[ ! -e "$DEST_DIR" ]] || die "Destination already exists: ${DEST_DIR}" -if [[ -e "$DEST_DIR" ]]; then - print -u2 "Destination already exists: $DEST_DIR" - exit 1 -fi - -HG_CLONE_ARGS=() +JENKINS_CLONE_FROM=$PARENT_WS if [[ "$PARENT_WS" == ssh://* ]]; then - SSH_CLONE_HOST=${${PARENT_WS#ssh://}%%/*} - SSH_CLONE_HOST=${SSH_CLONE_HOST#*@} - ensure_clone_identity_loaded "$SSH_CLONE_HOST" - - # Avoid exhausting ssh-agent identities before ssh reaches the host-specific - # IdentityFile from ~/.ssh/config (for example ~/.ssh/dabel.key). - HG_CLONE_ARGS+=(--config "ui.ssh=ssh -o BatchMode=yes -o IdentitiesOnly=yes") + JENKINS_CLONE_FROM="ssh://${${PARENT_WS#ssh://}#*@}" + ensure_clone_identity_loaded "${${PARENT_WS#ssh://}%%/*}" fi -JENKINS_CLONE_FROM="ssh://${${PARENT_WS#ssh://}#*@}" -FOLDER_PREFIX='PetrN/' -POINT_OF_CONTACT='petr.nyc@oracle.com' -SLACK_CHANNEL='@pnyc' +SCRIPT_DIR_BASE=$PARENT_WS +if [[ "$PARENT_WS" == *'//'* ]]; then + SCRIPT_DIR_BASE="/${PARENT_WS##*//}" +fi -# /workspace/pnyc/solaris-reviews/secure-integrate/userland11.4 -SCRIPT_DIR_BASE=$(echo "$PARENT_WS" | awk '{sub(/^.*\/\//,"/"); print}') -MV=/bin/mv -RM=/bin/rm -CP=/bin/cp -CAT=/bin/cat +print_config -pwd +print -- "Validating Mercurial access to ${PARENT_WS}" +hg identify "$PARENT_WS" >/dev/null + +print -- "Cloning ${PARENT_WS} into ${DEST_DIR}" mkdir -p "${DEST_DIR:h}" -hg "${HG_CLONE_ARGS[@]}" clone "$PARENT_WS" "$DEST_DIR" -pwd +hg clone "$PARENT_WS" "$DEST_DIR" + cd "$DEST_DIR" -pwd -source proxy off -$RM -rf venv +for required_path in \ + requirements.txt \ + Makefile.inc \ + common/tools/create_virtualenv \ + common/etc/passwd.template \ + common/jobs/defaults.devel.tmpl \ + common/jobs/defaults.stage.tmpl +do + [[ -e "$required_path" ]] || die "Required path not found: ${DEST_DIR}/${required_path}" +done -# this holds upgraded python-jenkins - will it work? -sed -E 's/^git.*$/git+file:\/\/\/Users\/jetpac\/PycharmProjects\/python-jenkins/' requirements.txt > /tmp/r -mv /tmp/r requirements.txt +[[ -x common/tools/create_virtualenv ]] || die "Required executable not found: ${DEST_DIR}/common/tools/create_virtualenv" -common/tools/create_virtualenv /opt/homebrew/bin/python3.11 requirements.txt venv +disable_proxy +/bin/rm -rf venv -echo '[alias]' >> .hg/hgrc -echo 'ci = ci -X Makefile.inc' >> .hg/hgrc -echo 'st = st -X Makefile.inc' >> .hg/hgrc - -tmpmake=$(mktemp) -sed 's:PYTHON3=python3.7:PYTHON3=python3.11:g' < Makefile.inc > "$tmpmake" -$MV "$tmpmake" Makefile.inc - - -# set up pwd -cd "$DEST_DIR/common/etc" -$CP passwd.template passwd - -# set up dev defaults -cd "$DEST_DIR/common/jobs/" -cp defaults.devel.tmpl defaults.devel.yml -cp defaults.stage.tmpl defaults.stage.yml - -$CAT > defaults_devel_patch <<- CATT -9c9 -< script_dir_base: "/workspace/pzahradn/jenkins/mrspatmore" ---- -> script_dir_base: "${SCRIPT_DIR_BASE=}" -11a12 -> pipeline_workspace: "${JENKINS_CLONE_FROM}" -14c15 -< folder_prefix: "pez-" # Could be used to deploy the devel jobs to different jenkins folder ---- -> folder_prefix: "${FOLDER_PREFIX}" # Could be used to deploy the devel jobs to different jenkins folder -16c17 -< point_of_contact: "petr.zahradnik@oracle.com" ---- -> point_of_contact: "${POINT_OF_CONTACT}" -21c22 -< slack_channel: "@pzahradn" ---- -> slack_channel: "${SLACK_CHANNEL}" -CATT - - - -patch -p0 defaults.devel.yml < defaults_devel_patch - -if [[ -d "$DEST_DIR/solaris/on/production" ]]; then - LINT_DIR="$DEST_DIR/solaris/on/production" -elif [[ -d "$DEST_DIR/solaris/userland/sru" ]]; then - LINT_DIR="$DEST_DIR/solaris/userland/sru" -else - print -u2 "Unable to determine lint directory under $DEST_DIR/solaris" - exit 1 +if [[ -n "$PYTHON_JENKINS_PATH" ]]; then + print -- "Applying local python-jenkins override from ${PYTHON_JENKINS_PATH}" + apply_python_jenkins_override "$PYTHON_JENKINS_PATH" fi -source proxy off +/usr/bin/env PATH="$PATH" /bin/bash -lc 'common/tools/create_virtualenv "$@"' bash "$PYTHON_EXE" requirements.txt venv + +{ + print -- '[alias]' + print -- 'ci = ci -X Makefile.inc' + print -- 'st = st -X Makefile.inc' +} >> .hg/hgrc + +tmp_makefile=$(mktemp) +sed 's:PYTHON3=python3.7:PYTHON3=python3.11:g' Makefile.inc > "$tmp_makefile" +/bin/mv "$tmp_makefile" Makefile.inc + +/bin/cp common/etc/passwd.template common/etc/passwd +/bin/cp common/jobs/defaults.devel.tmpl common/jobs/defaults.devel.yml +/bin/cp common/jobs/defaults.stage.tmpl common/jobs/defaults.stage.yml + +configure_defaults_devel common/jobs/defaults.devel.yml + +LINT_DIR=$(find_lint_dir) +disable_proxy cd "$LINT_DIR" make FAKE_DEVEL_ENV=yes lint