machineconfig 5.15__py3-none-any.whl → 7.66__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of machineconfig might be problematic. Click here for more details.
- machineconfig/__init__.py +0 -28
- machineconfig/cluster/remote/distribute.py +0 -1
- machineconfig/cluster/remote/file_manager.py +0 -2
- machineconfig/cluster/remote/script_execution.py +0 -1
- machineconfig/cluster/sessions_managers/{utils → helpers}/enhanced_command_runner.py +4 -6
- machineconfig/cluster/sessions_managers/utils/load_balancer.py +1 -1
- machineconfig/cluster/sessions_managers/utils/maker.py +69 -0
- machineconfig/cluster/sessions_managers/wt_local.py +114 -289
- machineconfig/cluster/sessions_managers/wt_local_manager.py +50 -193
- machineconfig/cluster/sessions_managers/wt_remote.py +51 -43
- machineconfig/cluster/sessions_managers/wt_remote_manager.py +49 -197
- machineconfig/cluster/sessions_managers/wt_utils/layout_generator.py +6 -19
- machineconfig/cluster/sessions_managers/wt_utils/manager_persistence.py +52 -0
- machineconfig/cluster/sessions_managers/wt_utils/monitoring_helpers.py +50 -0
- machineconfig/cluster/sessions_managers/wt_utils/status_reporter.py +4 -2
- machineconfig/cluster/sessions_managers/wt_utils/status_reporting.py +76 -0
- machineconfig/cluster/sessions_managers/wt_utils/wt_helpers.py +199 -0
- machineconfig/cluster/sessions_managers/zellij_local.py +81 -375
- machineconfig/cluster/sessions_managers/zellij_local_manager.py +22 -169
- machineconfig/cluster/sessions_managers/zellij_remote.py +40 -41
- machineconfig/cluster/sessions_managers/zellij_remote_manager.py +13 -10
- machineconfig/cluster/sessions_managers/zellij_utils/example_usage.py +4 -8
- machineconfig/cluster/sessions_managers/zellij_utils/layout_generator.py +5 -20
- machineconfig/cluster/sessions_managers/zellij_utils/process_monitor.py +3 -9
- machineconfig/cluster/sessions_managers/zellij_utils/status_reporter.py +3 -1
- machineconfig/cluster/sessions_managers/zellij_utils/zellij_local_helper.py +298 -0
- machineconfig/cluster/sessions_managers/zellij_utils/zellij_local_helper_restart.py +77 -0
- machineconfig/cluster/sessions_managers/zellij_utils/zellij_local_helper_with_panes.py +228 -0
- machineconfig/cluster/sessions_managers/zellij_utils/zellij_local_manager_helper.py +165 -0
- machineconfig/jobs/{python → installer}/check_installations.py +2 -3
- machineconfig/jobs/installer/custom/boxes.py +61 -0
- machineconfig/jobs/installer/custom/hx.py +76 -19
- machineconfig/jobs/installer/custom_dev/alacritty.py +4 -4
- machineconfig/jobs/installer/custom_dev/brave.py +1 -7
- machineconfig/jobs/installer/custom_dev/cloudflare_warp_cli.py +23 -0
- machineconfig/jobs/installer/custom_dev/code.py +4 -1
- machineconfig/jobs/installer/custom_dev/dubdb_adbc.py +30 -0
- machineconfig/jobs/installer/custom_dev/nerfont_windows_helper.py +9 -18
- machineconfig/jobs/installer/custom_dev/sysabc.py +119 -0
- machineconfig/jobs/installer/custom_dev/wezterm.py +2 -19
- machineconfig/jobs/installer/installer_data.json +1101 -115
- machineconfig/jobs/installer/linux_scripts/brave.sh +4 -14
- machineconfig/jobs/installer/linux_scripts/{warp-cli.sh → cloudflare_warp_cli.sh} +5 -17
- machineconfig/jobs/installer/linux_scripts/docker.sh +5 -17
- machineconfig/jobs/installer/linux_scripts/docker_start.sh +6 -14
- machineconfig/jobs/installer/linux_scripts/edge.sh +3 -11
- machineconfig/jobs/{linux/msc → installer/linux_scripts}/lid.sh +2 -8
- machineconfig/jobs/installer/linux_scripts/nerdfont.sh +5 -17
- machineconfig/jobs/{linux/msc → installer/linux_scripts}/network.sh +2 -8
- machineconfig/jobs/installer/linux_scripts/q.sh +1 -0
- machineconfig/jobs/installer/linux_scripts/redis.sh +6 -17
- machineconfig/jobs/installer/linux_scripts/vscode.sh +5 -17
- machineconfig/jobs/installer/linux_scripts/wezterm.sh +4 -12
- machineconfig/jobs/installer/package_groups.py +108 -180
- machineconfig/logger.py +0 -1
- machineconfig/profile/backup.toml +49 -0
- machineconfig/profile/bash_shell_profiles.md +11 -0
- machineconfig/profile/create_helper.py +74 -0
- machineconfig/profile/create_links.py +288 -0
- machineconfig/profile/create_links_export.py +100 -0
- machineconfig/profile/create_shell_profile.py +136 -0
- machineconfig/profile/mapper.toml +258 -0
- machineconfig/scripts/Restore-ThunderbirdProfile.ps1 +92 -0
- machineconfig/scripts/__init__.py +0 -4
- machineconfig/scripts/linux/{share_cloud.sh → other/share_cloud.sh} +14 -25
- machineconfig/scripts/linux/wrap_mcfg +47 -0
- machineconfig/scripts/nu/wrap_mcfg.nu +69 -0
- machineconfig/scripts/python/agents.py +92 -103
- machineconfig/scripts/python/ai/command_runner/command_runner.sh +9 -0
- machineconfig/scripts/python/ai/command_runner/prompt.txt +9 -0
- machineconfig/scripts/python/ai/generate_files.py +307 -42
- machineconfig/scripts/python/ai/initai.py +3 -28
- machineconfig/scripts/python/ai/scripts/lint_and_type_check.ps1 +17 -18
- machineconfig/scripts/python/ai/scripts/lint_and_type_check.sh +17 -18
- machineconfig/scripts/python/ai/solutions/_shared.py +9 -1
- machineconfig/scripts/python/ai/solutions/copilot/instructions/python/dev.instructions.md +1 -1
- machineconfig/scripts/python/ai/solutions/copilot/prompts/pyright_fix.md +16 -0
- machineconfig/scripts/python/ai/solutions/generic.py +27 -4
- machineconfig/scripts/python/ai/vscode_tasks.py +37 -0
- machineconfig/scripts/python/cloud.py +29 -0
- machineconfig/scripts/python/croshell.py +111 -114
- machineconfig/scripts/python/define.py +31 -0
- machineconfig/scripts/python/devops.py +44 -103
- machineconfig/scripts/python/devops_navigator.py +10 -0
- machineconfig/scripts/python/env_manager/__init__.py +1 -0
- machineconfig/scripts/python/env_manager/path_manager_backend.py +47 -0
- machineconfig/scripts/python/env_manager/path_manager_tui.py +228 -0
- machineconfig/scripts/python/explore.py +49 -0
- machineconfig/scripts/python/fire_jobs.py +115 -152
- machineconfig/scripts/python/ftpx.py +29 -24
- machineconfig/scripts/python/helpers_agents/agentic_frameworks/fire_crush.json +14 -0
- machineconfig/scripts/python/helpers_agents/agentic_frameworks/fire_crush.py +37 -0
- machineconfig/scripts/python/helpers_agents/agentic_frameworks/fire_cursor_agents.py +22 -0
- machineconfig/scripts/python/helpers_agents/agentic_frameworks/fire_gemini.py +42 -0
- machineconfig/scripts/python/helpers_agents/agentic_frameworks/fire_qwen.py +30 -0
- machineconfig/scripts/python/{fire_agents_help_launch.py → helpers_agents/fire_agents_help_launch.py} +34 -44
- machineconfig/scripts/python/helpers_agents/fire_agents_helper_types.py +34 -0
- machineconfig/scripts/python/helpers_agents/templates/prompt.txt +6 -0
- machineconfig/scripts/python/helpers_agents/templates/template.ps1 +14 -0
- machineconfig/scripts/python/helpers_agents/templates/template.sh +24 -0
- machineconfig/scripts/python/{cloud_copy.py → helpers_cloud/cloud_copy.py} +30 -23
- machineconfig/scripts/python/{cloud_mount.py → helpers_cloud/cloud_mount.py} +10 -18
- machineconfig/scripts/python/{cloud_sync.py → helpers_cloud/cloud_sync.py} +12 -18
- machineconfig/scripts/python/{helpers → helpers_cloud}/helpers2.py +1 -1
- machineconfig/scripts/python/helpers_croshell/crosh.py +39 -0
- machineconfig/scripts/python/{start_slidev.py → helpers_croshell/start_slidev.py} +2 -2
- machineconfig/scripts/python/helpers_devops/cli_config.py +95 -0
- machineconfig/scripts/python/helpers_devops/cli_config_dotfile.py +89 -0
- machineconfig/scripts/python/helpers_devops/cli_data.py +25 -0
- machineconfig/scripts/python/helpers_devops/cli_nw.py +134 -0
- machineconfig/scripts/python/helpers_devops/cli_repos.py +182 -0
- machineconfig/scripts/python/helpers_devops/cli_self.py +134 -0
- machineconfig/scripts/python/helpers_devops/cli_share_file.py +137 -0
- machineconfig/scripts/python/helpers_devops/cli_share_server.py +141 -0
- machineconfig/scripts/python/{share_terminal.py → helpers_devops/cli_terminal.py} +35 -23
- machineconfig/scripts/python/helpers_devops/cli_utils.py +96 -0
- machineconfig/scripts/python/{devops_backup_retrieve.py → helpers_devops/devops_backup_retrieve.py} +7 -10
- machineconfig/scripts/python/helpers_devops/devops_status.py +511 -0
- machineconfig/scripts/python/{devops_update_repos.py → helpers_devops/devops_update_repos.py} +68 -49
- machineconfig/scripts/python/helpers_devops/themes/choose_pwsh_theme.ps1 +81 -0
- machineconfig/scripts/python/helpers_devops/themes/choose_starship_theme.bash +3 -0
- machineconfig/scripts/python/{choose_wezterm_theme.py → helpers_devops/themes/choose_wezterm_theme.py} +2 -2
- machineconfig/scripts/python/helpers_fire_command/__init__.py +0 -0
- machineconfig/scripts/python/{helpers/helpers4.py → helpers_fire_command/file_wrangler.py} +56 -20
- machineconfig/scripts/python/{fire_jobs_args_helper.py → helpers_fire_command/fire_jobs_args_helper.py} +5 -1
- machineconfig/scripts/python/{fire_jobs_route_helper.py → helpers_fire_command/fire_jobs_route_helper.py} +47 -2
- machineconfig/scripts/python/helpers_fire_command/fire_jobs_streamlit_helper.py +0 -0
- machineconfig/scripts/python/helpers_msearch/__init__.py +5 -0
- machineconfig/scripts/{linux → python/helpers_msearch/scripts_linux}/fzfag +1 -1
- machineconfig/scripts/{linux → python/helpers_msearch/scripts_linux}/fzfg +1 -1
- machineconfig/scripts/{linux → python/helpers_msearch/scripts_linux}/fzfrga +1 -1
- machineconfig/scripts/python/helpers_navigator/__init__.py +20 -0
- machineconfig/scripts/python/helpers_navigator/command_builder.py +111 -0
- machineconfig/scripts/python/helpers_navigator/command_detail.py +44 -0
- machineconfig/scripts/python/helpers_navigator/command_tree.py +588 -0
- machineconfig/scripts/python/helpers_navigator/data_models.py +28 -0
- machineconfig/scripts/python/helpers_navigator/main_app.py +272 -0
- machineconfig/scripts/python/helpers_navigator/search_bar.py +15 -0
- machineconfig/scripts/python/helpers_repos/action.py +209 -0
- machineconfig/scripts/python/helpers_repos/action_helper.py +150 -0
- machineconfig/scripts/python/{repos_helper_clone.py → helpers_repos/clone.py} +2 -3
- machineconfig/scripts/python/helpers_repos/cloud_repo_sync.py +218 -0
- machineconfig/scripts/python/{count_lines.py → helpers_repos/count_lines.py} +10 -10
- machineconfig/scripts/python/helpers_repos/count_lines_frontend.py +17 -0
- machineconfig/scripts/python/{repos_helper.py → helpers_repos/entrypoint.py} +9 -17
- machineconfig/scripts/python/helpers_repos/grource.py +340 -0
- machineconfig/scripts/python/{repos_helper_record.py → helpers_repos/record.py} +4 -3
- machineconfig/scripts/python/helpers_repos/sync.py +66 -0
- machineconfig/scripts/python/{repos_helper_update.py → helpers_repos/update.py} +3 -3
- machineconfig/scripts/python/helpers_sessions/__init__.py +0 -0
- machineconfig/scripts/python/helpers_sessions/sessions_multiprocess.py +58 -0
- machineconfig/scripts/python/helpers_utils/download.py +152 -0
- machineconfig/scripts/python/helpers_utils/path.py +108 -0
- machineconfig/scripts/python/interactive.py +64 -84
- machineconfig/scripts/python/machineconfig.py +63 -0
- machineconfig/scripts/python/msearch.py +21 -0
- machineconfig/scripts/python/nw/__init__.py +0 -0
- machineconfig/scripts/python/{devops_add_identity.py → nw/devops_add_identity.py} +0 -2
- machineconfig/scripts/python/{devops_add_ssh_key.py → nw/devops_add_ssh_key.py} +73 -43
- machineconfig/scripts/{linux → python/nw}/mount_nfs +1 -1
- machineconfig/scripts/python/{mount_nfs.py → nw/mount_nfs.py} +3 -3
- machineconfig/scripts/{linux → python/nw}/mount_nw_drive +1 -2
- machineconfig/scripts/python/{mount_ssh.py → nw/mount_ssh.py} +3 -3
- machineconfig/scripts/python/{onetimeshare.py → nw/onetimeshare.py} +0 -1
- machineconfig/scripts/python/nw/ssh_debug_linux.py +391 -0
- machineconfig/scripts/python/nw/ssh_debug_windows.py +338 -0
- machineconfig/scripts/python/{wifi_conn.py → nw/wifi_conn.py} +1 -53
- machineconfig/scripts/python/{wsl_windows_transfer.py → nw/wsl_windows_transfer.py} +5 -4
- machineconfig/scripts/python/sessions.py +64 -44
- machineconfig/scripts/python/terminal.py +127 -0
- machineconfig/scripts/python/utils.py +66 -0
- machineconfig/scripts/windows/{mount_nfs.ps1 → mounts/mount_nfs.ps1} +1 -3
- machineconfig/scripts/windows/{mount_ssh.ps1 → mounts/mount_ssh.ps1} +1 -1
- machineconfig/scripts/windows/{share_smb.ps1 → mounts/share_smb.ps1} +0 -6
- machineconfig/scripts/windows/wrap_mcfg.ps1 +60 -0
- machineconfig/settings/broot/br.sh +0 -4
- machineconfig/settings/broot/conf.toml +1 -1
- machineconfig/settings/helix/config.toml +16 -0
- machineconfig/settings/helix/languages.toml +13 -4
- machineconfig/settings/helix/yazi-picker.sh +12 -0
- machineconfig/settings/lf/linux/exe/lfcd.sh +1 -0
- machineconfig/settings/lf/linux/exe/previewer.sh +9 -3
- machineconfig/settings/lf/linux/lfrc +10 -12
- machineconfig/settings/lf/windows/fzf_edit.ps1 +2 -2
- machineconfig/settings/lf/windows/lfrc +18 -38
- machineconfig/settings/lf/windows/mkfile.ps1 +1 -1
- machineconfig/settings/linters/.ruff.toml +1 -1
- machineconfig/settings/lvim/windows/archive/config_additional.lua +0 -6
- machineconfig/settings/marimo/marimo.toml +80 -0
- machineconfig/settings/marimo/snippets/globalize.py +34 -0
- machineconfig/settings/pistol/pistol.conf +1 -1
- machineconfig/settings/shells/bash/init.sh +55 -31
- machineconfig/settings/shells/nushell/config.nu +1 -34
- machineconfig/settings/shells/nushell/init.nu +127 -0
- machineconfig/settings/shells/pwsh/init.ps1 +60 -43
- machineconfig/settings/shells/starship/starship.toml +16 -0
- machineconfig/settings/shells/wezterm/wezterm.lua +2 -0
- machineconfig/settings/shells/wt/settings.json +32 -17
- machineconfig/settings/shells/zsh/init.sh +89 -0
- machineconfig/settings/svim/linux/init.toml +0 -4
- machineconfig/settings/svim/windows/init.toml +0 -3
- machineconfig/settings/yazi/init.lua +57 -0
- machineconfig/settings/yazi/keymap_linux.toml +79 -0
- machineconfig/settings/yazi/keymap_windows.toml +78 -0
- machineconfig/settings/yazi/shell/yazi_cd.ps1 +33 -0
- machineconfig/settings/yazi/shell/yazi_cd.sh +8 -0
- machineconfig/settings/yazi/yazi.toml +13 -0
- machineconfig/setup_linux/__init__.py +10 -0
- machineconfig/setup_linux/apps_desktop.sh +89 -0
- machineconfig/setup_linux/apps_gui.sh +64 -0
- machineconfig/setup_linux/{nix → others}/cli_installation.sh +9 -29
- machineconfig/setup_linux/ssh/openssh_all.sh +25 -0
- machineconfig/setup_linux/ssh/openssh_wsl.sh +38 -0
- machineconfig/setup_linux/uv.sh +15 -0
- machineconfig/setup_linux/web_shortcuts/interactive.sh +26 -6
- machineconfig/setup_mac/__init__.py +16 -0
- machineconfig/setup_mac/apps_gui.sh +248 -0
- machineconfig/setup_mac/ssh/openssh_setup.sh +114 -0
- machineconfig/setup_mac/uv.sh +36 -0
- machineconfig/setup_windows/__init__.py +8 -0
- machineconfig/setup_windows/others/power_options.ps1 +7 -0
- machineconfig/setup_windows/ssh/add-sshkey.ps1 +29 -0
- machineconfig/setup_windows/ssh/add_identity.ps1 +11 -0
- machineconfig/setup_windows/ssh/openssh-server.ps1 +37 -0
- machineconfig/setup_windows/uv.ps1 +10 -0
- machineconfig/setup_windows/web_shortcuts/interactive.ps1 +27 -10
- machineconfig/setup_windows/web_shortcuts/quick_init.ps1 +16 -0
- machineconfig/utils/accessories.py +7 -5
- machineconfig/utils/cloud/onedrive/README.md +139 -0
- machineconfig/utils/code.py +133 -106
- machineconfig/utils/files/art/fat_croco.txt +10 -0
- machineconfig/utils/files/art/halfwit_croco.txt +9 -0
- machineconfig/utils/files/art/happy_croco.txt +22 -0
- machineconfig/utils/files/art/water_croco.txt +11 -0
- machineconfig/utils/files/ascii_art.py +1 -1
- machineconfig/utils/files/dbms.py +257 -0
- machineconfig/utils/files/headers.py +11 -14
- machineconfig/utils/files/ouch/__init__.py +0 -0
- machineconfig/utils/files/ouch/decompress.py +45 -0
- machineconfig/utils/files/read.py +10 -18
- machineconfig/utils/installer_utils/installer_class.py +68 -126
- machineconfig/utils/installer_utils/{installer.py → installer_cli.py} +109 -117
- machineconfig/utils/installer_utils/{installer_abc.py → installer_locator_utils.py} +31 -81
- machineconfig/utils/{installer.py → installer_utils/installer_runner.py} +44 -74
- machineconfig/utils/io.py +77 -23
- machineconfig/utils/links.py +254 -162
- machineconfig/utils/meta.py +255 -0
- machineconfig/utils/notifications.py +1 -1
- machineconfig/utils/options.py +13 -3
- machineconfig/utils/path_extended.py +46 -100
- machineconfig/utils/path_helper.py +75 -22
- machineconfig/utils/procs.py +50 -70
- machineconfig/utils/scheduler.py +94 -97
- machineconfig/utils/scheduling.py +0 -3
- machineconfig/utils/schemas/fire_agents/fire_agents_input.py +1 -1
- machineconfig/utils/schemas/layouts/layout_types.py +1 -1
- machineconfig/utils/source_of_truth.py +3 -6
- machineconfig/utils/ssh.py +742 -264
- machineconfig/utils/ssh_utils/utils.py +0 -0
- machineconfig/utils/terminal.py +2 -113
- machineconfig/utils/tst.py +20 -0
- machineconfig/utils/upgrade_packages.py +109 -28
- machineconfig/utils/ve.py +11 -4
- machineconfig-7.66.dist-info/METADATA +124 -0
- machineconfig-7.66.dist-info/RECORD +451 -0
- machineconfig-7.66.dist-info/entry_points.txt +15 -0
- machineconfig/cluster/sessions_managers/ffile.py +0 -4
- machineconfig/jobs/installer/linux_scripts/pgsql.sh +0 -49
- machineconfig/jobs/installer/linux_scripts/timescaledb.sh +0 -85
- machineconfig/jobs/linux/msc/cli_agents.sh +0 -16
- machineconfig/jobs/python/python_ve_symlink.py +0 -37
- machineconfig/jobs/python/vscode/api.py +0 -57
- machineconfig/jobs/python/vscode/sync_code.py +0 -73
- machineconfig/jobs/windows/archive/archive_pygraphviz.ps1 +0 -14
- machineconfig/jobs/windows/start_terminal.ps1 +0 -6
- machineconfig/jobs/windows/startup_file.cmd +0 -2
- machineconfig/profile/create.py +0 -303
- machineconfig/profile/shell.py +0 -176
- machineconfig/scripts/cloud/init.sh +0 -119
- machineconfig/scripts/linux/agents +0 -2
- machineconfig/scripts/linux/choose_wezterm_theme +0 -3
- machineconfig/scripts/linux/cloud_copy +0 -2
- machineconfig/scripts/linux/cloud_mount +0 -2
- machineconfig/scripts/linux/cloud_repo_sync +0 -2
- machineconfig/scripts/linux/cloud_sync +0 -2
- machineconfig/scripts/linux/croshell +0 -3
- machineconfig/scripts/linux/devops +0 -2
- machineconfig/scripts/linux/fire +0 -2
- machineconfig/scripts/linux/ftpx +0 -2
- machineconfig/scripts/linux/fzf2g +0 -21
- machineconfig/scripts/linux/fzffg +0 -25
- machineconfig/scripts/linux/gh_models +0 -2
- machineconfig/scripts/linux/initai +0 -2
- machineconfig/scripts/linux/kill_process +0 -2
- machineconfig/scripts/linux/scheduler +0 -2
- machineconfig/scripts/linux/sessions +0 -2
- machineconfig/scripts/linux/share_smb +0 -1
- machineconfig/scripts/linux/start_slidev +0 -2
- machineconfig/scripts/linux/start_terminals +0 -3
- machineconfig/scripts/linux/warp-cli.sh +0 -122
- machineconfig/scripts/linux/wifi_conn +0 -2
- machineconfig/scripts/linux/z_ls +0 -104
- machineconfig/scripts/python/ai/solutions/copilot/prompts/allLintersAndTypeCheckers.prompt.md +0 -5
- machineconfig/scripts/python/cloud_repo_sync.py +0 -190
- machineconfig/scripts/python/count_lines_frontend.py +0 -16
- machineconfig/scripts/python/dotfile.py +0 -78
- machineconfig/scripts/python/fire_agents_helper_types.py +0 -12
- machineconfig/scripts/python/get_zellij_cmd.py +0 -15
- machineconfig/scripts/python/gh_models.py +0 -104
- machineconfig/scripts/python/helpers/repo_sync_helpers.py +0 -116
- machineconfig/scripts/python/repos.py +0 -132
- machineconfig/scripts/python/repos_helper_action.py +0 -378
- machineconfig/scripts/python/snapshot.py +0 -25
- machineconfig/scripts/python/start_terminals.py +0 -121
- machineconfig/scripts/python/t4.py +0 -17
- machineconfig/scripts/windows/agents.ps1 +0 -1
- machineconfig/scripts/windows/choose_wezterm_theme.ps1 +0 -1
- machineconfig/scripts/windows/cloud_copy.ps1 +0 -1
- machineconfig/scripts/windows/cloud_mount.ps1 +0 -1
- machineconfig/scripts/windows/cloud_repo_sync.ps1 +0 -1
- machineconfig/scripts/windows/cloud_sync.ps1 +0 -1
- machineconfig/scripts/windows/croshell.ps1 +0 -1
- machineconfig/scripts/windows/devops.ps1 +0 -1
- machineconfig/scripts/windows/dotfile.ps1 +0 -1
- machineconfig/scripts/windows/fire.ps1 +0 -1
- machineconfig/scripts/windows/ftpx.ps1 +0 -1
- machineconfig/scripts/windows/gpt.ps1 +0 -1
- machineconfig/scripts/windows/grep.ps1 +0 -2
- machineconfig/scripts/windows/initai.ps1 +0 -1
- machineconfig/scripts/windows/kill_process.ps1 +0 -1
- machineconfig/scripts/windows/nano.ps1 +0 -3
- machineconfig/scripts/windows/pomodoro.ps1 +0 -1
- machineconfig/scripts/windows/reload_path.ps1 +0 -3
- machineconfig/scripts/windows/scheduler.ps1 +0 -1
- machineconfig/scripts/windows/sessions.ps1 +0 -1
- machineconfig/scripts/windows/snapshot.ps1 +0 -1
- machineconfig/scripts/windows/start_slidev.ps1 +0 -1
- machineconfig/scripts/windows/start_terminals.ps1 +0 -1
- machineconfig/scripts/windows/wifi_conn.ps1 +0 -2
- machineconfig/scripts/windows/wsl_rdp_windows_port_forwarding.ps1 +0 -46
- machineconfig/scripts/windows/wsl_ssh_windows_port_forwarding.ps1 +0 -76
- machineconfig/settings/lf/linux/exe/fzf_nano.sh +0 -16
- machineconfig/setup_linux/others/openssh-server_add_pub_key.sh +0 -57
- machineconfig/setup_linux/web_shortcuts/croshell.sh +0 -11
- machineconfig/setup_linux/web_shortcuts/ssh.sh +0 -52
- machineconfig/setup_windows/web_shortcuts/all.ps1 +0 -18
- machineconfig/setup_windows/web_shortcuts/ascii_art.ps1 +0 -36
- machineconfig/setup_windows/web_shortcuts/croshell.ps1 +0 -16
- machineconfig/setup_windows/web_shortcuts/ssh.ps1 +0 -11
- machineconfig/utils/ai/generate_file_checklist.py +0 -68
- machineconfig-5.15.dist-info/METADATA +0 -188
- machineconfig-5.15.dist-info/RECORD +0 -415
- machineconfig-5.15.dist-info/entry_points.txt +0 -18
- machineconfig/cluster/sessions_managers/{utils → helpers}/load_balancer_helper.py +0 -0
- machineconfig/scripts/linux/{share_nfs → other/share_nfs} +0 -0
- machineconfig/scripts/linux/{start_docker → other/start_docker} +0 -0
- machineconfig/scripts/linux/{switch_ip → other/switch_ip} +0 -0
- machineconfig/{jobs/python → scripts/python/helpers_agents}/__init__.py +0 -0
- machineconfig/scripts/python/{helpers → helpers_agents/agentic_frameworks}/__init__.py +0 -0
- machineconfig/scripts/python/{fire_agents_help_search.py → helpers_agents/fire_agents_help_search.py} +0 -0
- machineconfig/scripts/python/{fire_agents_load_balancer.py → helpers_agents/fire_agents_load_balancer.py} +0 -0
- machineconfig/{jobs/windows/msc/cli_agents.bat → scripts/python/helpers_cloud/__init__.py} +0 -0
- machineconfig/scripts/python/{helpers → helpers_cloud}/cloud_helpers.py +1 -1
- /machineconfig/scripts/python/{helpers → helpers_cloud}/helpers5.py +0 -0
- /machineconfig/{jobs/windows/msc/cli_agents.ps1 → scripts/python/helpers_croshell/__init__.py} +0 -0
- /machineconfig/scripts/python/{pomodoro.py → helpers_croshell/pomodoro.py} +0 -0
- /machineconfig/scripts/python/{scheduler.py → helpers_croshell/scheduler.py} +0 -0
- /machineconfig/scripts/python/{viewer.py → helpers_croshell/viewer.py} +0 -0
- /machineconfig/scripts/python/{viewer_template.py → helpers_croshell/viewer_template.py} +0 -0
- /machineconfig/scripts/python/{fire_jobs_streamlit_helper.py → helpers_devops/__init__.py} +0 -0
- /machineconfig/scripts/{windows/share_nfs.ps1 → python/helpers_devops/themes/__init__.py} +0 -0
- /machineconfig/{settings/yazi/keymap.toml → scripts/python/helpers_devops/themes/choose_starship_theme.ps1} +0 -0
- /machineconfig/scripts/python/{cloud_manager.py → helpers_fire_command/cloud_manager.py} +0 -0
- /machineconfig/scripts/{linux → python/helpers_msearch/scripts_linux}/skrg +0 -0
- /machineconfig/scripts/{windows → python/helpers_msearch/scripts_windows}/fzfb.ps1 +0 -0
- /machineconfig/scripts/{windows → python/helpers_msearch/scripts_windows}/fzfg.ps1 +0 -0
- /machineconfig/scripts/{windows → python/helpers_msearch/scripts_windows}/fzfrga.bat +0 -0
- /machineconfig/scripts/{linux → python/nw}/mount_drive +0 -0
- /machineconfig/scripts/python/{mount_nw_drive.py → nw/mount_nw_drive.py} +0 -0
- /machineconfig/scripts/{linux → python/nw}/mount_smb +0 -0
- /machineconfig/scripts/windows/{mount_nw.ps1 → mounts/mount_nw.ps1} +0 -0
- /machineconfig/scripts/windows/{mount_smb.ps1 → mounts/mount_smb.ps1} +0 -0
- /machineconfig/scripts/windows/{share_cloud.cmd → mounts/share_cloud.cmd} +0 -0
- /machineconfig/scripts/windows/{unlock_bitlocker.ps1 → mounts/unlock_bitlocker.ps1} +0 -0
- /machineconfig/setup_linux/{web_shortcuts → others}/android.sh +0 -0
- /machineconfig/{jobs/windows/archive → setup_windows/ssh}/openssh-server_add_key.ps1 +0 -0
- /machineconfig/{jobs/windows/archive → setup_windows/ssh}/openssh-server_copy-ssh-id.ps1 +0 -0
- {machineconfig-5.15.dist-info → machineconfig-7.66.dist-info}/WHEEL +0 -0
- {machineconfig-5.15.dist-info → machineconfig-7.66.dist-info}/top_level.txt +0 -0
machineconfig/utils/links.py
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
from machineconfig.utils.path_extended import PathExtended, PLike
|
|
2
|
+
from machineconfig.profile.create_links_export import ON_CONFLICT_STRICT
|
|
2
3
|
from machineconfig.utils.accessories import randstr
|
|
3
4
|
from rich.console import Console
|
|
4
5
|
from rich.panel import Panel
|
|
@@ -8,39 +9,40 @@ from typing import TypedDict, Literal
|
|
|
8
9
|
console = Console()
|
|
9
10
|
|
|
10
11
|
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
12
|
+
ActionType = Literal[
|
|
13
|
+
"already_linked",
|
|
14
|
+
"relinking",
|
|
15
|
+
"fixing_broken_link",
|
|
16
|
+
"identical_files",
|
|
17
|
+
"backupConfigDefaultPath",
|
|
18
|
+
"backing_up_source",
|
|
19
|
+
"backing_up_target",
|
|
20
|
+
"relink2newSelfManagedPath",
|
|
21
|
+
"relinking_to_new_target",
|
|
22
|
+
"move2selfManagedPath",
|
|
23
|
+
"moving_to_target",
|
|
24
|
+
"new_link",
|
|
25
|
+
"newLinkAndSelfManagedPath",
|
|
26
|
+
"new_link_and_target",
|
|
27
|
+
"linking",
|
|
28
|
+
"copying",
|
|
29
|
+
"error"
|
|
30
|
+
]
|
|
31
|
+
|
|
27
32
|
|
|
33
|
+
class OperationResult(TypedDict):
|
|
34
|
+
action: ActionType
|
|
35
|
+
details: str
|
|
28
36
|
|
|
29
|
-
class
|
|
30
|
-
action:
|
|
31
|
-
"already_linked",
|
|
32
|
-
"relinking",
|
|
33
|
-
"fixing_broken_link",
|
|
34
|
-
"backing_up_source",
|
|
35
|
-
"backing_up_target",
|
|
36
|
-
"relinking_to_new_target",
|
|
37
|
-
"moving_to_target",
|
|
38
|
-
"new_link",
|
|
39
|
-
"new_link_and_target",
|
|
40
|
-
"copying",
|
|
41
|
-
"error"
|
|
42
|
-
]
|
|
37
|
+
class OperationRecord(TypedDict):
|
|
38
|
+
action: ActionType
|
|
43
39
|
details: str
|
|
40
|
+
program: str
|
|
41
|
+
file_key: str
|
|
42
|
+
defaultPath: str
|
|
43
|
+
selfManaged: str
|
|
44
|
+
operation: str
|
|
45
|
+
status: str
|
|
44
46
|
|
|
45
47
|
|
|
46
48
|
def files_are_identical(file1: PathExtended, file2: PathExtended) -> bool:
|
|
@@ -79,200 +81,290 @@ def build_links(target_paths: list[tuple[PLike, str]], repo_root: PLike):
|
|
|
79
81
|
tmp_results_root.mkdir(parents=True, exist_ok=True)
|
|
80
82
|
target_dirs_filtered.append((tmp_results_root, "tmp_results"))
|
|
81
83
|
|
|
84
|
+
links_dir = repo_root_obj.joinpath("links")
|
|
85
|
+
links_dir.mkdir(parents=True, exist_ok=True)
|
|
86
|
+
|
|
82
87
|
for a_target_path, a_name in target_dirs_filtered:
|
|
83
|
-
links_path =
|
|
84
|
-
links_path.
|
|
88
|
+
links_path = links_dir.joinpath(a_name)
|
|
89
|
+
if links_path.exists() or links_path.is_symlink():
|
|
90
|
+
if links_path.is_symlink() and links_path.resolve() == a_target_path.resolve():
|
|
91
|
+
continue
|
|
92
|
+
links_path.unlink(missing_ok=True)
|
|
93
|
+
try:
|
|
94
|
+
links_path.symlink_to(target=a_target_path)
|
|
95
|
+
except OSError as ex:
|
|
96
|
+
console.print(Panel(f"❌ Failed to create symlink {links_path} -> {a_target_path}: {ex}", title="Symlink Error", expand=False))
|
|
85
97
|
|
|
86
98
|
|
|
87
|
-
def
|
|
88
|
-
|
|
99
|
+
def symlink_map(config_file_default_path: PathExtended, self_managed_config_file_path: PathExtended,
|
|
100
|
+
on_conflict: ON_CONFLICT_STRICT
|
|
101
|
+
) -> OperationResult:
|
|
102
|
+
"""helper function. creates a symlink from `config_file_default_path` to `self_managed_config_file_path`.
|
|
89
103
|
|
|
90
104
|
Returns a dict with 'action' and 'details' keys describing what was done.
|
|
91
105
|
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
this: exists AND to_this doesn't exist AND this is a concrete path ===> Resolution: AUTO: move this to to_this, then create symlink from this to to_this.
|
|
106
|
+
on_conflict strategies:
|
|
107
|
+
- throw-error: Raise exception when files differ
|
|
108
|
+
- overwrite-self-managed: Delete self_managed_config_file_path (self-managed), move config_file_default_path to self_managed_config_file_path, create symlink
|
|
109
|
+
- backup-self-managed: Backup self_managed_config_file_path (self-managed), move config_file_default_path to self_managed_config_file_path, create symlink
|
|
110
|
+
- overwrite-default-path: Delete config_file_default_path (default path), create symlink to self_managed_config_file_path
|
|
111
|
+
- backup-default-path: Backup config_file_default_path (default path), create symlink to self_managed_config_file_path
|
|
99
112
|
|
|
100
|
-
|
|
101
|
-
this: doesn't exist AND to_this doesn't exist ===> Resolution: AUTO: create link from this to to_this (touch to_this)
|
|
113
|
+
Note: `config_file_default_path` is the default system location, `self_managed_config_file_path` is the self-managed config location
|
|
102
114
|
|
|
103
115
|
"""
|
|
104
|
-
|
|
105
|
-
|
|
116
|
+
config_file_default_path = PathExtended(config_file_default_path).expanduser().absolute()
|
|
117
|
+
self_managed_config_file_path = PathExtended(self_managed_config_file_path).expanduser().absolute()
|
|
118
|
+
|
|
119
|
+
if config_file_default_path.resolve() == self_managed_config_file_path.resolve():
|
|
120
|
+
raise ValueError(f"config_file_default_path and self_managed_config_file_path resolve to the same location: {config_file_default_path.resolve()}")
|
|
121
|
+
|
|
106
122
|
action_taken = ""
|
|
107
123
|
details = ""
|
|
108
124
|
|
|
125
|
+
# Handle broken symlinks first - they exist as symlinks but point to non-existent targets
|
|
126
|
+
if config_file_default_path.is_symlink() and not config_file_default_path.exists():
|
|
127
|
+
action_taken = "fixing_broken_link"
|
|
128
|
+
details = "Removed broken symlink and will create new one"
|
|
129
|
+
console.print(Panel(f"🔄 FIXING BROKEN LINK | Removing broken symlink {config_file_default_path}, will create link to {self_managed_config_file_path}", title="Fixing Broken Link", expand=False))
|
|
130
|
+
config_file_default_path.unlink()
|
|
131
|
+
|
|
109
132
|
# Case analysis based on docstring
|
|
110
|
-
if
|
|
111
|
-
if
|
|
112
|
-
if
|
|
133
|
+
if config_file_default_path.exists():
|
|
134
|
+
if self_managed_config_file_path.exists():
|
|
135
|
+
if config_file_default_path.is_symlink():
|
|
113
136
|
# Check if symlink already points to correct target
|
|
114
137
|
try:
|
|
115
|
-
if
|
|
116
|
-
# Case:
|
|
138
|
+
if config_file_default_path.resolve() == self_managed_config_file_path.resolve():
|
|
139
|
+
# Case: config_file_default_path exists AND self_managed_config_file_path exists AND config_file_default_path is a symlink pointing to self_managed_config_file_path
|
|
117
140
|
action_taken = "already_linked"
|
|
118
141
|
details = "Symlink already correctly points to target"
|
|
119
|
-
console.print(Panel(f"✅ ALREADY LINKED | {
|
|
142
|
+
console.print(Panel(f"✅ ALREADY LINKED | {config_file_default_path} ➡️ {self_managed_config_file_path}", title="Already Linked", expand=False))
|
|
120
143
|
return {"action": action_taken, "details": details}
|
|
121
144
|
else:
|
|
122
|
-
# Case:
|
|
145
|
+
# Case: config_file_default_path exists AND self_managed_config_file_path exists AND config_file_default_path is a symlink pointing to somewhere else
|
|
123
146
|
action_taken = "relinking"
|
|
124
147
|
details = "Updated existing symlink to point to new target"
|
|
125
|
-
console.print(Panel(f"🔄 RELINKING | Updating symlink from {
|
|
126
|
-
|
|
148
|
+
console.print(Panel(f"🔄 RELINKING | Updating symlink from {config_file_default_path} ➡️ {self_managed_config_file_path}", title="Relinking", expand=False))
|
|
149
|
+
config_file_default_path.delete(sure=True)
|
|
127
150
|
except OSError:
|
|
128
151
|
# Broken symlink case
|
|
129
152
|
action_taken = "fixing_broken_link"
|
|
130
153
|
details = "Removed broken symlink and will create new one"
|
|
131
|
-
console.print(Panel(f"🔄 FIXING BROKEN LINK | Fixing broken symlink from {
|
|
132
|
-
|
|
154
|
+
console.print(Panel(f"🔄 FIXING BROKEN LINK | Fixing broken symlink from {config_file_default_path} ➡️ {self_managed_config_file_path}", title="Fixing Broken Link", expand=False))
|
|
155
|
+
config_file_default_path.delete(sure=True)
|
|
133
156
|
else:
|
|
134
|
-
# Case:
|
|
135
|
-
if files_are_identical(
|
|
157
|
+
# Case: config_file_default_path exists AND self_managed_config_file_path exists AND config_file_default_path is a concrete path
|
|
158
|
+
if files_are_identical(config_file_default_path, self_managed_config_file_path):
|
|
136
159
|
# Files are identical, just delete this and create symlink
|
|
137
160
|
action_taken = "identical_files"
|
|
138
|
-
details = "Files identical, removed
|
|
139
|
-
console.print(Panel(f"🔗 IDENTICAL FILES | Files are identical, deleting {
|
|
140
|
-
|
|
161
|
+
details = "Files identical, removed config_file_default_path and will create symlink"
|
|
162
|
+
console.print(Panel(f"🔗 IDENTICAL FILES | Files are identical, deleting {config_file_default_path} and creating symlink to {self_managed_config_file_path}", title="Identical Files", expand=False))
|
|
163
|
+
config_file_default_path.delete(sure=True)
|
|
141
164
|
else:
|
|
142
|
-
# Files are different, use
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
165
|
+
# Files are different, use on_conflict strategy
|
|
166
|
+
import subprocess
|
|
167
|
+
command = f"""delta --side-by-side "{config_file_default_path}" "{self_managed_config_file_path}" """
|
|
168
|
+
try:
|
|
169
|
+
console.print(Panel(f"🆘 CONFLICT DETECTED | Showing diff between {config_file_default_path} and {self_managed_config_file_path}", title="Conflict Detected", expand=False))
|
|
170
|
+
subprocess.run(command, shell=True, check=True)
|
|
171
|
+
except Exception:
|
|
172
|
+
console.print(Panel("⚠️ Could not show diff using 'delta'. Please install 'delta' for better diff visualization.", title="Delta Not Found", expand=False))
|
|
173
|
+
|
|
174
|
+
match on_conflict:
|
|
175
|
+
case "throw-error":
|
|
176
|
+
raise RuntimeError(f"Conflict detected: {config_file_default_path} and {self_managed_config_file_path} both exist with different content")
|
|
177
|
+
case "overwrite-self-managed":
|
|
178
|
+
action_taken = "backing_up_target"
|
|
179
|
+
details = "Overwriting self-managed config, moving default path to self-managed location"
|
|
180
|
+
console.print(Panel(f"📦 OVERWRITE SELF-MANAGED | Deleting {self_managed_config_file_path}, moving {config_file_default_path} to {self_managed_config_file_path}", title="Overwrite Self-Managed", expand=False))
|
|
181
|
+
self_managed_config_file_path.delete(sure=True)
|
|
182
|
+
config_file_default_path.move(path=self_managed_config_file_path)
|
|
183
|
+
case "backup-self-managed":
|
|
184
|
+
backup_name = f"{self_managed_config_file_path}.orig_{randstr()}"
|
|
185
|
+
action_taken = "backing_up_target"
|
|
186
|
+
details = f"Backed up self-managed config to {backup_name}"
|
|
187
|
+
console.print(Panel(f"📦 BACKUP SELF-MANAGED | Moving {self_managed_config_file_path} to {backup_name}, moving {config_file_default_path} to {self_managed_config_file_path}", title="Backup Self-Managed", expand=False))
|
|
188
|
+
self_managed_config_file_path.move(path=backup_name)
|
|
189
|
+
config_file_default_path.move(path=self_managed_config_file_path)
|
|
190
|
+
case "overwrite-default-path":
|
|
191
|
+
action_taken = "backupConfigDefaultPath"
|
|
192
|
+
details = "Overwriting default path, creating symlink to self-managed config"
|
|
193
|
+
console.print(Panel(f"📦 OVERWRITE DEFAULT | Deleting {config_file_default_path}, creating symlink to {self_managed_config_file_path}", title="Overwrite Default", expand=False))
|
|
194
|
+
config_file_default_path.delete(sure=True)
|
|
195
|
+
case "backup-default-path":
|
|
196
|
+
backup_name = f"{config_file_default_path}.orig_{randstr()}"
|
|
197
|
+
action_taken = "backupConfigDefaultPath"
|
|
198
|
+
details = f"Backed up default path to {backup_name}"
|
|
199
|
+
console.print(Panel(f"📦 BACKUP DEFAULT | Moving {config_file_default_path} to {backup_name}, creating symlink to {self_managed_config_file_path}", title="Backup Default", expand=False))
|
|
200
|
+
config_file_default_path.move(path=backup_name)
|
|
158
201
|
else:
|
|
159
|
-
#
|
|
160
|
-
if
|
|
161
|
-
# Case:
|
|
162
|
-
action_taken = "
|
|
163
|
-
details = "Removed existing symlink, will create
|
|
164
|
-
console.print(Panel(f"🔄 RELINKING | Updating symlink from {
|
|
165
|
-
|
|
166
|
-
# Create
|
|
167
|
-
|
|
168
|
-
|
|
202
|
+
# self_managed_config_file_path doesn't exist
|
|
203
|
+
if config_file_default_path.is_symlink():
|
|
204
|
+
# Case: config_file_default_path exists AND self_managed_config_file_path doesn't exist AND config_file_default_path is a symlink (pointing anywhere)
|
|
205
|
+
action_taken = "relink2newSelfManagedPath"
|
|
206
|
+
details = "Removed existing symlink, will create self_managed_config_file_path and new symlink"
|
|
207
|
+
console.print(Panel(f"🔄 RELINKING | Updating symlink from {config_file_default_path} ➡️ {self_managed_config_file_path}", title="Relinking", expand=False))
|
|
208
|
+
config_file_default_path.delete(sure=True)
|
|
209
|
+
# Create self_managed_config_file_path
|
|
210
|
+
self_managed_config_file_path.parent.mkdir(parents=True, exist_ok=True)
|
|
211
|
+
self_managed_config_file_path.touch()
|
|
169
212
|
else:
|
|
170
|
-
# Case:
|
|
171
|
-
action_taken = "
|
|
172
|
-
details = "Moved
|
|
173
|
-
console.print(Panel(f"📁 MOVING | Moving {
|
|
174
|
-
|
|
213
|
+
# Case: config_file_default_path exists AND self_managed_config_file_path doesn't exist AND config_file_default_path is a concrete path
|
|
214
|
+
action_taken = "move2selfManagedPath"
|
|
215
|
+
details = "Moved config_file_default_path to self_managed_config_file_path location, will create symlink"
|
|
216
|
+
console.print(Panel(f"📁 MOVING | Moving {config_file_default_path} to {self_managed_config_file_path}, then creating symlink", title="Moving", expand=False))
|
|
217
|
+
config_file_default_path.move(path=self_managed_config_file_path)
|
|
175
218
|
else:
|
|
176
|
-
#
|
|
177
|
-
if
|
|
178
|
-
# Case:
|
|
219
|
+
# config_file_default_path doesn't exist
|
|
220
|
+
if self_managed_config_file_path.exists():
|
|
221
|
+
# Case: config_file_default_path doesn't exist AND self_managed_config_file_path exists
|
|
179
222
|
action_taken = "new_link"
|
|
180
|
-
details = "Creating new symlink to existing
|
|
181
|
-
console.print(Panel(f"🆕 NEW LINK | Creating new symlink from {
|
|
223
|
+
details = "Creating new symlink to existing self_managed_config_file_path"
|
|
224
|
+
console.print(Panel(f"🆕 NEW LINK | Creating new symlink from {config_file_default_path} ➡️ {self_managed_config_file_path}", title="New Link", expand=False))
|
|
182
225
|
else:
|
|
183
|
-
# Case:
|
|
184
|
-
action_taken = "
|
|
185
|
-
details = "Creating
|
|
186
|
-
console.print(Panel(f"🆕 NEW LINK & TARGET | Creating {
|
|
187
|
-
|
|
188
|
-
|
|
226
|
+
# Case: config_file_default_path doesn't exist AND self_managed_config_file_path doesn't exist
|
|
227
|
+
action_taken = "newLinkAndSelfManagedPath"
|
|
228
|
+
details = "Creating self_managed_config_file_path file and new symlink"
|
|
229
|
+
console.print(Panel(f"🆕 NEW LINK & TARGET | Creating {self_managed_config_file_path} and symlink from {config_file_default_path} ➡️ {self_managed_config_file_path}", title="New Link & Target", expand=False))
|
|
230
|
+
self_managed_config_file_path.parent.mkdir(parents=True, exist_ok=True)
|
|
231
|
+
self_managed_config_file_path.touch()
|
|
189
232
|
|
|
190
233
|
# Create the symlink
|
|
191
234
|
try:
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
235
|
+
if not action_taken:
|
|
236
|
+
action_taken = "linking"
|
|
237
|
+
details = "Creating symlink"
|
|
238
|
+
console.print(Panel(f"🔗 LINKING | Creating symlink from {config_file_default_path} ➡️ {self_managed_config_file_path}", title="Linking", expand=False))
|
|
239
|
+
PathExtended(config_file_default_path).symlink_to(target=self_managed_config_file_path, verbose=True, overwrite=False)
|
|
196
240
|
return {"action": action_taken, "details": details}
|
|
197
241
|
except Exception as ex:
|
|
198
242
|
action_taken = "error"
|
|
199
243
|
details = f"Failed to create symlink: {str(ex)}"
|
|
200
|
-
console.print(Panel(f"❌ ERROR | Failed at linking {
|
|
244
|
+
console.print(Panel(f"❌ ERROR | Failed at linking {config_file_default_path} ➡️ {self_managed_config_file_path}. Reason: {ex}", title="Error", expand=False))
|
|
201
245
|
return {"action": action_taken, "details": details}
|
|
202
246
|
|
|
203
247
|
|
|
204
|
-
def
|
|
205
|
-
|
|
206
|
-
|
|
248
|
+
def copy_map(config_file_default_path: PathExtended, self_managed_config_file_path: PathExtended, on_conflict: ON_CONFLICT_STRICT) -> OperationResult:
|
|
249
|
+
config_file_default_path = PathExtended(config_file_default_path).expanduser().absolute()
|
|
250
|
+
self_managed_config_file_path = PathExtended(self_managed_config_file_path).expanduser().absolute()
|
|
251
|
+
|
|
252
|
+
if config_file_default_path.resolve() == self_managed_config_file_path.resolve():
|
|
253
|
+
raise ValueError(f"config_file_default_path and self_managed_config_file_path resolve to the same location: {config_file_default_path.resolve()}")
|
|
254
|
+
|
|
207
255
|
action_taken = ""
|
|
208
256
|
details = ""
|
|
209
257
|
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
258
|
+
# Handle broken symlinks first - they exist as symlinks but point to non-existent targets
|
|
259
|
+
if config_file_default_path.is_symlink() and not config_file_default_path.exists():
|
|
260
|
+
action_taken = "fixing_broken_link"
|
|
261
|
+
details = "Removed broken symlink and will copy new file"
|
|
262
|
+
console.print(Panel(f"🔄 FIXING BROKEN LINK | Removing broken symlink {config_file_default_path}, will copy from {self_managed_config_file_path}", title="Fixing Broken Link", expand=False))
|
|
263
|
+
config_file_default_path.unlink()
|
|
264
|
+
|
|
265
|
+
match (config_file_default_path.exists(), self_managed_config_file_path.exists()):
|
|
266
|
+
case (True, True):
|
|
267
|
+
# Both files exist
|
|
268
|
+
if config_file_default_path.is_symlink():
|
|
213
269
|
try:
|
|
214
|
-
if
|
|
270
|
+
if config_file_default_path.resolve() == self_managed_config_file_path.resolve():
|
|
215
271
|
action_taken = "already_linked"
|
|
216
|
-
details = "
|
|
217
|
-
console.print(Panel(f"✅ ALREADY
|
|
272
|
+
details = "File at default path is already a symlink to self-managed config"
|
|
273
|
+
console.print(Panel(f"✅ ALREADY CORRECT | {config_file_default_path} already points to {self_managed_config_file_path}", title="Already Correct", expand=False))
|
|
218
274
|
return {"action": action_taken, "details": details}
|
|
219
275
|
else:
|
|
220
276
|
action_taken = "relinking"
|
|
221
|
-
details = "
|
|
222
|
-
console.print(Panel(f"🔄
|
|
223
|
-
|
|
277
|
+
details = "Removing symlink at default path that points elsewhere"
|
|
278
|
+
console.print(Panel(f"🔄 REMOVING SYMLINK | Removing symlink {config_file_default_path} (points elsewhere), will copy from {self_managed_config_file_path}", title="Removing Symlink", expand=False))
|
|
279
|
+
config_file_default_path.delete(sure=True)
|
|
224
280
|
except OSError:
|
|
225
281
|
action_taken = "fixing_broken_link"
|
|
226
|
-
details = "Removed broken symlink
|
|
227
|
-
console.print(Panel(f"🔄 FIXING BROKEN
|
|
228
|
-
|
|
282
|
+
details = "Removed broken symlink at default path"
|
|
283
|
+
console.print(Panel(f"🔄 FIXING BROKEN SYMLINK | Removing broken symlink {config_file_default_path}, will copy from {self_managed_config_file_path}", title="Fixing Broken Symlink", expand=False))
|
|
284
|
+
config_file_default_path.delete(sure=True)
|
|
229
285
|
else:
|
|
230
|
-
if
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
286
|
+
# Check if files are identical first
|
|
287
|
+
if files_are_identical(config_file_default_path, self_managed_config_file_path):
|
|
288
|
+
# Files are identical, just delete this and proceed with copy
|
|
289
|
+
action_taken = "identical_files"
|
|
290
|
+
details = "Files identical, removed config_file_default_path and will copy"
|
|
291
|
+
console.print(Panel(f"🔗 IDENTICAL FILES | Files are identical, deleting {config_file_default_path} and copying from {self_managed_config_file_path}", title="Identical Files", expand=False))
|
|
292
|
+
config_file_default_path.delete(sure=True)
|
|
236
293
|
else:
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
294
|
+
# Files are different, use on_conflict strategy
|
|
295
|
+
import subprocess
|
|
296
|
+
command = f"""delta --side-by-side "{config_file_default_path}" "{self_managed_config_file_path}" """
|
|
297
|
+
try:
|
|
298
|
+
console.print(Panel(f"🆘 CONFLICT DETECTED | Showing diff between {config_file_default_path} and {self_managed_config_file_path}", title="Conflict Detected", expand=False))
|
|
299
|
+
subprocess.run(command, shell=True, check=True)
|
|
300
|
+
except Exception:
|
|
301
|
+
console.print(Panel("⚠️ Could not show diff using 'delta'. Please install 'delta' for better diff visualization.", title="Delta Not Found", expand=False))
|
|
302
|
+
|
|
303
|
+
match on_conflict:
|
|
304
|
+
case "throw-error":
|
|
305
|
+
raise RuntimeError(f"Conflict detected: {config_file_default_path} and {self_managed_config_file_path} both exist with different content")
|
|
306
|
+
case "overwrite-self-managed":
|
|
307
|
+
action_taken = "backing_up_target"
|
|
308
|
+
details = "Overwriting self-managed config with default path content"
|
|
309
|
+
console.print(Panel(f"📦 OVERWRITE SELF-MANAGED | Deleting {self_managed_config_file_path}, moving {config_file_default_path} to {self_managed_config_file_path}", title="Overwrite Self-Managed", expand=False))
|
|
310
|
+
self_managed_config_file_path.delete(sure=True)
|
|
311
|
+
config_file_default_path.move(path=self_managed_config_file_path)
|
|
312
|
+
case "backup-self-managed":
|
|
313
|
+
backup_name = f"{self_managed_config_file_path}.orig_{randstr()}"
|
|
314
|
+
action_taken = "backing_up_target"
|
|
315
|
+
details = f"Backed up self-managed config to {backup_name}"
|
|
316
|
+
console.print(Panel(f"📦 BACKUP SELF-MANAGED | Moving {self_managed_config_file_path} to {backup_name}, moving {config_file_default_path} to {self_managed_config_file_path}", title="Backup Self-Managed", expand=False))
|
|
317
|
+
self_managed_config_file_path.move(path=backup_name)
|
|
318
|
+
config_file_default_path.move(path=self_managed_config_file_path)
|
|
319
|
+
case "overwrite-default-path":
|
|
320
|
+
action_taken = "backupConfigDefaultPath"
|
|
321
|
+
details = "Overwriting default path with self-managed config"
|
|
322
|
+
console.print(Panel(f"📦 OVERWRITE DEFAULT | Deleting {config_file_default_path}, will copy from {self_managed_config_file_path}", title="Overwrite Default", expand=False))
|
|
323
|
+
config_file_default_path.delete(sure=True)
|
|
324
|
+
case "backup-default-path":
|
|
325
|
+
backup_name = f"{config_file_default_path}.orig_{randstr()}"
|
|
326
|
+
action_taken = "backupConfigDefaultPath"
|
|
327
|
+
details = f"Backed up default path to {backup_name}"
|
|
328
|
+
console.print(Panel(f"📦 BACKUP DEFAULT | Moving {config_file_default_path} to {backup_name}, will copy from {self_managed_config_file_path}", title="Backup Default", expand=False))
|
|
329
|
+
config_file_default_path.move(path=backup_name)
|
|
330
|
+
case (True, False):
|
|
331
|
+
# config_file_default_path exists, self_managed_config_file_path doesn't
|
|
332
|
+
if config_file_default_path.is_symlink():
|
|
333
|
+
action_taken = "relink2newSelfManagedPath"
|
|
334
|
+
details = "Removed existing symlink, will create self_managed_config_file_path and copy"
|
|
335
|
+
console.print(Panel(f"🔄 REMOVING SYMLINK | Removing symlink {config_file_default_path}, creating {self_managed_config_file_path}", title="Removing Symlink", expand=False))
|
|
336
|
+
config_file_default_path.delete(sure=True)
|
|
337
|
+
self_managed_config_file_path.parent.mkdir(parents=True, exist_ok=True)
|
|
338
|
+
self_managed_config_file_path.touch()
|
|
251
339
|
else:
|
|
252
|
-
action_taken = "
|
|
253
|
-
details = "Moved
|
|
254
|
-
console.print(Panel(f"📁 MOVING | Moving {
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
340
|
+
action_taken = "move2selfManagedPath"
|
|
341
|
+
details = "Moved config_file_default_path to self_managed_config_file_path location, will copy back"
|
|
342
|
+
console.print(Panel(f"📁 MOVING | Moving {config_file_default_path} to {self_managed_config_file_path}, then copying back", title="Moving", expand=False))
|
|
343
|
+
config_file_default_path.move(path=self_managed_config_file_path)
|
|
344
|
+
case (False, True):
|
|
345
|
+
# config_file_default_path doesn't exist, self_managed_config_file_path does
|
|
258
346
|
action_taken = "new_link"
|
|
259
|
-
details = "Copying existing
|
|
260
|
-
console.print(Panel(f"🆕 NEW
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
347
|
+
details = "Copying existing self_managed_config_file_path to config_file_default_path location"
|
|
348
|
+
console.print(Panel(f"🆕 NEW COPY | Copying {self_managed_config_file_path} to {config_file_default_path}", title="New Copy", expand=False))
|
|
349
|
+
case (False, False):
|
|
350
|
+
# Neither exists
|
|
351
|
+
action_taken = "newLinkAndSelfManagedPath"
|
|
352
|
+
details = "Creating self_managed_config_file_path file and copying to config_file_default_path"
|
|
353
|
+
console.print(Panel(f"🆕 NEW FILE & COPY | Creating {self_managed_config_file_path} and copying to {config_file_default_path}", title="New File & Copy", expand=False))
|
|
354
|
+
self_managed_config_file_path.parent.mkdir(parents=True, exist_ok=True)
|
|
355
|
+
self_managed_config_file_path.touch()
|
|
267
356
|
|
|
268
357
|
try:
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
358
|
+
if not action_taken:
|
|
359
|
+
action_taken = "copying"
|
|
360
|
+
details = "Copying file"
|
|
361
|
+
console.print(Panel(f"📋 COPYING | Copying {self_managed_config_file_path} to {config_file_default_path}", title="Copying", expand=False))
|
|
362
|
+
self_managed_config_file_path.copy(path=config_file_default_path, overwrite=True, verbose=True)
|
|
273
363
|
return {"action": action_taken, "details": details}
|
|
274
364
|
except Exception as ex:
|
|
275
365
|
action_taken = "error"
|
|
276
366
|
details = f"Failed to copy file: {str(ex)}"
|
|
277
|
-
console.print(Panel(f"❌ ERROR | Failed at copying {
|
|
367
|
+
console.print(Panel(f"❌ ERROR | Failed at copying {self_managed_config_file_path} to {config_file_default_path}. Reason: {ex}", title="Error", expand=False))
|
|
278
368
|
return {"action": action_taken, "details": details}
|
|
369
|
+
|
|
370
|
+
|