machineconfig 1.95__py3-none-any.whl → 1.96__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.

Files changed (499) hide show
  1. machineconfig/cluster/cloud_manager.py +445 -343
  2. machineconfig/cluster/data_transfer.py +63 -57
  3. machineconfig/cluster/distribute.py +284 -280
  4. machineconfig/cluster/file_manager.py +234 -237
  5. machineconfig/cluster/job_params.py +133 -133
  6. machineconfig/cluster/loader_runner.py +183 -149
  7. machineconfig/cluster/remote_machine.py +269 -252
  8. machineconfig/cluster/script_execution.py +215 -209
  9. machineconfig/cluster/script_notify_upon_completion.py +50 -43
  10. machineconfig/cluster/self_ssh.py +52 -54
  11. machineconfig/cluster/sessions_managers/__init__.py +0 -0
  12. machineconfig/cluster/sessions_managers/archive/__init__.py +0 -0
  13. machineconfig/{jobs/python → cluster/sessions_managers/archive}/create_zellij_template.py +5 -3
  14. machineconfig/cluster/sessions_managers/archive/session_managers.py +184 -0
  15. machineconfig/cluster/sessions_managers/demo_rich_zellij.py +0 -0
  16. machineconfig/cluster/sessions_managers/enhanced_command_runner.py +160 -0
  17. machineconfig/cluster/sessions_managers/wt_local.py +494 -0
  18. machineconfig/cluster/sessions_managers/wt_local_manager.py +577 -0
  19. machineconfig/cluster/sessions_managers/wt_remote.py +288 -0
  20. machineconfig/cluster/sessions_managers/wt_remote_manager.py +483 -0
  21. machineconfig/cluster/sessions_managers/wt_utils/layout_generator.py +196 -0
  22. machineconfig/cluster/sessions_managers/wt_utils/process_monitor.py +418 -0
  23. machineconfig/cluster/sessions_managers/wt_utils/remote_executor.py +175 -0
  24. machineconfig/cluster/sessions_managers/wt_utils/session_manager.py +300 -0
  25. machineconfig/cluster/sessions_managers/wt_utils/status_reporter.py +228 -0
  26. machineconfig/cluster/sessions_managers/zellij_local.py +418 -0
  27. machineconfig/cluster/sessions_managers/zellij_local_manager.py +533 -0
  28. machineconfig/cluster/sessions_managers/zellij_remote.py +229 -0
  29. machineconfig/cluster/sessions_managers/zellij_remote_manager.py +188 -0
  30. machineconfig/cluster/sessions_managers/zellij_utils/example_usage.py +64 -0
  31. machineconfig/cluster/sessions_managers/zellij_utils/layout_generator.py +126 -0
  32. machineconfig/cluster/sessions_managers/zellij_utils/process_monitor.py +334 -0
  33. machineconfig/cluster/sessions_managers/zellij_utils/remote_executor.py +68 -0
  34. machineconfig/cluster/sessions_managers/zellij_utils/session_manager.py +119 -0
  35. machineconfig/cluster/sessions_managers/zellij_utils/status_reporter.py +85 -0
  36. machineconfig/cluster/templates/cli_click.py +0 -1
  37. machineconfig/cluster/templates/cli_gooey.py +102 -104
  38. machineconfig/cluster/templates/run_cloud.py +51 -51
  39. machineconfig/cluster/templates/run_cluster.py +103 -59
  40. machineconfig/cluster/templates/run_remote.py +57 -58
  41. machineconfig/cluster/templates/utils.py +69 -36
  42. machineconfig/jobs/__pycache__/__init__.cpython-311.pyc +0 -0
  43. machineconfig/jobs/python/__pycache__/__init__.cpython-311.pyc +0 -0
  44. machineconfig/jobs/python/check_installations.py +258 -190
  45. machineconfig/jobs/python/create_bootable_media.py +7 -3
  46. machineconfig/jobs/python/python_cargo_build_share.py +50 -50
  47. machineconfig/jobs/python/python_ve_symlink.py +6 -6
  48. machineconfig/jobs/python/vscode/__pycache__/select_interpreter.cpython-311.pyc +0 -0
  49. machineconfig/jobs/python/vscode/api.py +1 -1
  50. machineconfig/jobs/python/vscode/link_ve.py +2 -2
  51. machineconfig/jobs/python/vscode/select_interpreter.py +9 -5
  52. machineconfig/jobs/python/vscode/sync_code.py +8 -5
  53. machineconfig/jobs/python_custom_installers/__pycache__/__init__.cpython-311.pyc +0 -0
  54. machineconfig/jobs/python_custom_installers/archive/ngrok.py +1 -1
  55. machineconfig/jobs/python_custom_installers/dev/alacritty.py +3 -2
  56. machineconfig/jobs/python_custom_installers/dev/brave.py +7 -3
  57. machineconfig/jobs/python_custom_installers/dev/bypass_paywall.py +3 -4
  58. machineconfig/jobs/python_custom_installers/dev/code.py +3 -1
  59. machineconfig/jobs/python_custom_installers/dev/cursor.py +66 -5
  60. machineconfig/jobs/python_custom_installers/dev/docker_desktop.py +0 -1
  61. machineconfig/jobs/python_custom_installers/dev/espanso.py +13 -9
  62. machineconfig/jobs/python_custom_installers/dev/goes.py +2 -8
  63. machineconfig/jobs/python_custom_installers/dev/lvim.py +3 -2
  64. machineconfig/jobs/python_custom_installers/dev/nerdfont.py +1 -1
  65. machineconfig/jobs/python_custom_installers/dev/redis.py +7 -3
  66. machineconfig/jobs/python_custom_installers/dev/wezterm.py +8 -4
  67. machineconfig/jobs/python_custom_installers/dev/winget.py +194 -0
  68. machineconfig/jobs/python_custom_installers/{dev/docker.py → docker.py} +8 -3
  69. machineconfig/jobs/python_custom_installers/gh.py +4 -3
  70. machineconfig/jobs/python_custom_installers/hx.py +9 -8
  71. machineconfig/jobs/python_custom_installers/scripts/linux/vscode.sh +97 -30
  72. machineconfig/jobs/python_custom_installers/{dev/warp-cli.py → warp-cli.py} +1 -1
  73. machineconfig/jobs/python_generic_installers/__pycache__/__init__.cpython-311.pyc +0 -0
  74. machineconfig/jobs/python_generic_installers/config.json +133 -9
  75. machineconfig/jobs/python_generic_installers/dev/config.json +208 -37
  76. machineconfig/jobs/python_generic_installers/update.py +3 -0
  77. machineconfig/jobs/python_linux_installers/__pycache__/__init__.cpython-311.pyc +0 -0
  78. machineconfig/jobs/python_linux_installers/config.json +42 -6
  79. machineconfig/jobs/python_linux_installers/dev/config.json +79 -11
  80. machineconfig/jobs/python_windows_installers/config.json +6 -0
  81. machineconfig/profile/__pycache__/__init__.cpython-311.pyc +0 -0
  82. machineconfig/profile/__pycache__/create.cpython-311.pyc +0 -0
  83. machineconfig/profile/__pycache__/shell.cpython-311.pyc +0 -0
  84. machineconfig/profile/create.py +5 -5
  85. machineconfig/profile/create_hardlinks.py +5 -5
  86. machineconfig/profile/shell.py +44 -17
  87. machineconfig/scripts/__pycache__/__init__.cpython-311.pyc +0 -0
  88. machineconfig/scripts/__pycache__/__init__.cpython-313.pyc +0 -0
  89. machineconfig/scripts/linux/fire_agents +27 -0
  90. machineconfig/scripts/linux/wifi_conn +24 -0
  91. machineconfig/scripts/python/__pycache__/__init__.cpython-311.pyc +0 -0
  92. machineconfig/scripts/python/__pycache__/__init__.cpython-313.pyc +0 -0
  93. machineconfig/scripts/python/__pycache__/cloud_copy.cpython-311.pyc +0 -0
  94. machineconfig/scripts/python/__pycache__/cloud_mount.cpython-311.pyc +0 -0
  95. machineconfig/scripts/python/__pycache__/cloud_sync.cpython-311.pyc +0 -0
  96. machineconfig/scripts/python/__pycache__/croshell.cpython-311.pyc +0 -0
  97. machineconfig/scripts/python/__pycache__/devops.cpython-311.pyc +0 -0
  98. machineconfig/scripts/python/__pycache__/devops_backup_retrieve.cpython-311.pyc +0 -0
  99. machineconfig/scripts/python/__pycache__/devops_devapps_install.cpython-311.pyc +0 -0
  100. machineconfig/scripts/python/__pycache__/devops_update_repos.cpython-311.pyc +0 -0
  101. machineconfig/scripts/python/__pycache__/fire_agents.cpython-311.pyc +0 -0
  102. machineconfig/scripts/python/__pycache__/fire_jobs.cpython-311.pyc +0 -0
  103. machineconfig/scripts/python/__pycache__/fire_jobs.cpython-313.pyc +0 -0
  104. machineconfig/scripts/python/__pycache__/get_zellij_cmd.cpython-311.pyc +0 -0
  105. machineconfig/scripts/python/__pycache__/repos.cpython-311.pyc +0 -0
  106. machineconfig/scripts/python/archive/im2text.py +1 -3
  107. machineconfig/scripts/python/choose_wezterm_theme.py +3 -3
  108. machineconfig/scripts/python/cloud_copy.py +10 -10
  109. machineconfig/scripts/python/cloud_manager.py +77 -99
  110. machineconfig/scripts/python/cloud_mount.py +13 -12
  111. machineconfig/scripts/python/cloud_repo_sync.py +14 -11
  112. machineconfig/scripts/python/croshell.py +24 -21
  113. machineconfig/scripts/python/devops.py +12 -17
  114. machineconfig/scripts/python/devops_add_identity.py +32 -10
  115. machineconfig/scripts/python/devops_add_ssh_key.py +10 -10
  116. machineconfig/scripts/python/devops_backup_retrieve.py +9 -8
  117. machineconfig/scripts/python/devops_devapps_install.py +6 -6
  118. machineconfig/scripts/python/devops_update_repos.py +4 -3
  119. machineconfig/scripts/python/dotfile.py +10 -7
  120. machineconfig/scripts/python/fire_agents.py +69 -0
  121. machineconfig/scripts/python/fire_jobs.py +56 -65
  122. machineconfig/scripts/python/ftpx.py +8 -8
  123. machineconfig/scripts/python/get_zellij_cmd.py +3 -3
  124. machineconfig/scripts/python/gh_models.py +6 -4
  125. machineconfig/scripts/python/helpers/__pycache__/__init__.cpython-311.pyc +0 -0
  126. machineconfig/scripts/python/helpers/__pycache__/__init__.cpython-313.pyc +0 -0
  127. machineconfig/scripts/python/helpers/__pycache__/cloud_helpers.cpython-311.pyc +0 -0
  128. machineconfig/scripts/python/helpers/__pycache__/helpers2.cpython-311.pyc +0 -0
  129. machineconfig/scripts/python/helpers/__pycache__/helpers4.cpython-311.pyc +0 -0
  130. machineconfig/scripts/python/helpers/__pycache__/helpers4.cpython-313.pyc +0 -0
  131. machineconfig/scripts/python/helpers/__pycache__/repo_sync_helpers.cpython-311.pyc +0 -0
  132. machineconfig/scripts/python/helpers/cloud_helpers.py +12 -12
  133. machineconfig/scripts/python/helpers/helpers2.py +9 -8
  134. machineconfig/scripts/python/helpers/helpers4.py +23 -35
  135. machineconfig/scripts/python/helpers/repo_sync_helpers.py +17 -16
  136. machineconfig/scripts/python/mount_nfs.py +8 -11
  137. machineconfig/scripts/python/mount_nw_drive.py +4 -4
  138. machineconfig/scripts/python/mount_ssh.py +2 -2
  139. machineconfig/scripts/python/onetimeshare.py +56 -57
  140. machineconfig/scripts/python/pomodoro.py +55 -55
  141. machineconfig/scripts/python/repos.py +26 -18
  142. machineconfig/scripts/python/scheduler.py +70 -53
  143. machineconfig/scripts/python/snapshot.py +21 -24
  144. machineconfig/scripts/python/start_slidev.py +6 -5
  145. machineconfig/scripts/python/start_terminals.py +3 -1
  146. machineconfig/scripts/python/viewer.py +5 -4
  147. machineconfig/scripts/python/viewer_template.py +138 -140
  148. machineconfig/scripts/python/wifi_conn.py +412 -60
  149. machineconfig/scripts/python/wsl_windows_transfer.py +18 -3
  150. machineconfig/settings/linters/.pylintrc +6 -7
  151. machineconfig/settings/lvim/windows/config.lua +0 -0
  152. machineconfig/settings/shells/bash/init.sh +6 -0
  153. machineconfig/settings/shells/ipy/profiles/default/startup/playext.py +7 -6
  154. machineconfig/settings/shells/pwsh/init.ps1 +6 -6
  155. machineconfig/settings/shells/wt/settings.json +51 -266
  156. machineconfig/setup_linux/web_shortcuts/interactive.sh +5 -2
  157. machineconfig/setup_windows/wt_and_pwsh/set_pwsh_theme.py +3 -6
  158. machineconfig/setup_windows/wt_and_pwsh/set_wt_settings.py +11 -9
  159. machineconfig/utils/ai/url2md.py +2 -2
  160. machineconfig/utils/cloud/onedrive/setup_oauth.py +59 -0
  161. machineconfig/utils/cloud/onedrive/transaction.py +796 -0
  162. machineconfig/utils/code.py +22 -13
  163. machineconfig/utils/installer.py +78 -35
  164. machineconfig/utils/installer_utils/installer_abc.py +7 -6
  165. machineconfig/utils/installer_utils/installer_class.py +44 -25
  166. machineconfig/utils/io_save.py +107 -0
  167. machineconfig/utils/links.py +19 -15
  168. machineconfig/utils/options.py +4 -8
  169. machineconfig/utils/path.py +91 -78
  170. machineconfig/utils/path_reduced.py +608 -0
  171. machineconfig/utils/procs.py +110 -45
  172. machineconfig/utils/scheduling.py +312 -222
  173. machineconfig/utils/utils.py +7 -7
  174. machineconfig/utils/utils2.py +42 -0
  175. machineconfig/utils/utils5.py +84 -0
  176. machineconfig/utils/ve.py +49 -87
  177. {machineconfig-1.95.dist-info → machineconfig-1.96.dist-info}/METADATA +2 -2
  178. machineconfig-1.96.dist-info/RECORD +437 -0
  179. machineconfig/cluster/session_managers.py +0 -183
  180. machineconfig/cluster/templates/f.py +0 -4
  181. machineconfig/jobs/python/__pycache__/check_installations.cpython-311.pyc +0 -0
  182. machineconfig/jobs/python/__pycache__/checkout_version.cpython-311.pyc +0 -0
  183. machineconfig/jobs/python/__pycache__/python_ve_symlink.cpython-311.pyc +0 -0
  184. machineconfig/jobs/python/checkout_version.py +0 -123
  185. machineconfig/jobs/python/vscode/__pycache__/api.cpython-311.pyc +0 -0
  186. machineconfig/jobs/python/vscode/__pycache__/link_ve.cpython-311.pyc +0 -0
  187. machineconfig/jobs/python_custom_installers/__pycache__/hx.cpython-311.pyc +0 -0
  188. machineconfig/jobs/python_windows_installers/__pycache__/__init__.cpython-311.pyc +0 -0
  189. machineconfig/scripts/python/.mypy_cache/.gitignore +0 -2
  190. machineconfig/scripts/python/.mypy_cache/3.11/@plugins_snapshot.json +0 -1
  191. machineconfig/scripts/python/.mypy_cache/3.11/__future__.data.json +0 -1
  192. machineconfig/scripts/python/.mypy_cache/3.11/__future__.meta.json +0 -1
  193. machineconfig/scripts/python/.mypy_cache/3.11/_ast.data.json +0 -1
  194. machineconfig/scripts/python/.mypy_cache/3.11/_ast.meta.json +0 -1
  195. machineconfig/scripts/python/.mypy_cache/3.11/_bz2.data.json +0 -1
  196. machineconfig/scripts/python/.mypy_cache/3.11/_bz2.meta.json +0 -1
  197. machineconfig/scripts/python/.mypy_cache/3.11/_codecs.data.json +0 -1
  198. machineconfig/scripts/python/.mypy_cache/3.11/_codecs.meta.json +0 -1
  199. machineconfig/scripts/python/.mypy_cache/3.11/_collections_abc.data.json +0 -1
  200. machineconfig/scripts/python/.mypy_cache/3.11/_collections_abc.meta.json +0 -1
  201. machineconfig/scripts/python/.mypy_cache/3.11/_compression.data.json +0 -1
  202. machineconfig/scripts/python/.mypy_cache/3.11/_compression.meta.json +0 -1
  203. machineconfig/scripts/python/.mypy_cache/3.11/_decimal.data.json +0 -1
  204. machineconfig/scripts/python/.mypy_cache/3.11/_decimal.meta.json +0 -1
  205. machineconfig/scripts/python/.mypy_cache/3.11/_frozen_importlib.data.json +0 -1
  206. machineconfig/scripts/python/.mypy_cache/3.11/_frozen_importlib.meta.json +0 -1
  207. machineconfig/scripts/python/.mypy_cache/3.11/_frozen_importlib_external.data.json +0 -1
  208. machineconfig/scripts/python/.mypy_cache/3.11/_frozen_importlib_external.meta.json +0 -1
  209. machineconfig/scripts/python/.mypy_cache/3.11/_io.data.json +0 -1
  210. machineconfig/scripts/python/.mypy_cache/3.11/_io.meta.json +0 -1
  211. machineconfig/scripts/python/.mypy_cache/3.11/_locale.data.json +0 -1
  212. machineconfig/scripts/python/.mypy_cache/3.11/_locale.meta.json +0 -1
  213. machineconfig/scripts/python/.mypy_cache/3.11/_stat.data.json +0 -1
  214. machineconfig/scripts/python/.mypy_cache/3.11/_stat.meta.json +0 -1
  215. machineconfig/scripts/python/.mypy_cache/3.11/_struct.data.json +0 -1
  216. machineconfig/scripts/python/.mypy_cache/3.11/_struct.meta.json +0 -1
  217. machineconfig/scripts/python/.mypy_cache/3.11/_thread.data.json +0 -1
  218. machineconfig/scripts/python/.mypy_cache/3.11/_thread.meta.json +0 -1
  219. machineconfig/scripts/python/.mypy_cache/3.11/_typeshed/__init__.data.json +0 -1
  220. machineconfig/scripts/python/.mypy_cache/3.11/_typeshed/__init__.meta.json +0 -1
  221. machineconfig/scripts/python/.mypy_cache/3.11/_typeshed/importlib.data.json +0 -1
  222. machineconfig/scripts/python/.mypy_cache/3.11/_typeshed/importlib.meta.json +0 -1
  223. machineconfig/scripts/python/.mypy_cache/3.11/_warnings.data.json +0 -1
  224. machineconfig/scripts/python/.mypy_cache/3.11/_warnings.meta.json +0 -1
  225. machineconfig/scripts/python/.mypy_cache/3.11/_weakref.data.json +0 -1
  226. machineconfig/scripts/python/.mypy_cache/3.11/_weakref.meta.json +0 -1
  227. machineconfig/scripts/python/.mypy_cache/3.11/_weakrefset.data.json +0 -1
  228. machineconfig/scripts/python/.mypy_cache/3.11/_weakrefset.meta.json +0 -1
  229. machineconfig/scripts/python/.mypy_cache/3.11/abc.data.json +0 -1
  230. machineconfig/scripts/python/.mypy_cache/3.11/abc.meta.json +0 -1
  231. machineconfig/scripts/python/.mypy_cache/3.11/argparse.data.json +0 -1
  232. machineconfig/scripts/python/.mypy_cache/3.11/argparse.meta.json +0 -1
  233. machineconfig/scripts/python/.mypy_cache/3.11/ast.data.json +0 -1
  234. machineconfig/scripts/python/.mypy_cache/3.11/ast.meta.json +0 -1
  235. machineconfig/scripts/python/.mypy_cache/3.11/binascii.data.json +0 -1
  236. machineconfig/scripts/python/.mypy_cache/3.11/binascii.meta.json +0 -1
  237. machineconfig/scripts/python/.mypy_cache/3.11/builtins.data.json +0 -1
  238. machineconfig/scripts/python/.mypy_cache/3.11/builtins.meta.json +0 -1
  239. machineconfig/scripts/python/.mypy_cache/3.11/bz2.data.json +0 -1
  240. machineconfig/scripts/python/.mypy_cache/3.11/bz2.meta.json +0 -1
  241. machineconfig/scripts/python/.mypy_cache/3.11/calendar.data.json +0 -1
  242. machineconfig/scripts/python/.mypy_cache/3.11/calendar.meta.json +0 -1
  243. machineconfig/scripts/python/.mypy_cache/3.11/codecs.data.json +0 -1
  244. machineconfig/scripts/python/.mypy_cache/3.11/codecs.meta.json +0 -1
  245. machineconfig/scripts/python/.mypy_cache/3.11/collections/__init__.data.json +0 -1
  246. machineconfig/scripts/python/.mypy_cache/3.11/collections/__init__.meta.json +0 -1
  247. machineconfig/scripts/python/.mypy_cache/3.11/collections/abc.data.json +0 -1
  248. machineconfig/scripts/python/.mypy_cache/3.11/collections/abc.meta.json +0 -1
  249. machineconfig/scripts/python/.mypy_cache/3.11/configparser.data.json +0 -1
  250. machineconfig/scripts/python/.mypy_cache/3.11/configparser.meta.json +0 -1
  251. machineconfig/scripts/python/.mypy_cache/3.11/contextlib.data.json +0 -1
  252. machineconfig/scripts/python/.mypy_cache/3.11/contextlib.meta.json +0 -1
  253. machineconfig/scripts/python/.mypy_cache/3.11/dataclasses.data.json +0 -1
  254. machineconfig/scripts/python/.mypy_cache/3.11/dataclasses.meta.json +0 -1
  255. machineconfig/scripts/python/.mypy_cache/3.11/datetime.data.json +0 -1
  256. machineconfig/scripts/python/.mypy_cache/3.11/datetime.meta.json +0 -1
  257. machineconfig/scripts/python/.mypy_cache/3.11/decimal.data.json +0 -1
  258. machineconfig/scripts/python/.mypy_cache/3.11/decimal.meta.json +0 -1
  259. machineconfig/scripts/python/.mypy_cache/3.11/dis.data.json +0 -1
  260. machineconfig/scripts/python/.mypy_cache/3.11/dis.meta.json +0 -1
  261. machineconfig/scripts/python/.mypy_cache/3.11/email/__init__.data.json +0 -1
  262. machineconfig/scripts/python/.mypy_cache/3.11/email/__init__.meta.json +0 -1
  263. machineconfig/scripts/python/.mypy_cache/3.11/email/_policybase.data.json +0 -1
  264. machineconfig/scripts/python/.mypy_cache/3.11/email/_policybase.meta.json +0 -1
  265. machineconfig/scripts/python/.mypy_cache/3.11/email/charset.data.json +0 -1
  266. machineconfig/scripts/python/.mypy_cache/3.11/email/charset.meta.json +0 -1
  267. machineconfig/scripts/python/.mypy_cache/3.11/email/contentmanager.data.json +0 -1
  268. machineconfig/scripts/python/.mypy_cache/3.11/email/contentmanager.meta.json +0 -1
  269. machineconfig/scripts/python/.mypy_cache/3.11/email/errors.data.json +0 -1
  270. machineconfig/scripts/python/.mypy_cache/3.11/email/errors.meta.json +0 -1
  271. machineconfig/scripts/python/.mypy_cache/3.11/email/header.data.json +0 -1
  272. machineconfig/scripts/python/.mypy_cache/3.11/email/header.meta.json +0 -1
  273. machineconfig/scripts/python/.mypy_cache/3.11/email/message.data.json +0 -1
  274. machineconfig/scripts/python/.mypy_cache/3.11/email/message.meta.json +0 -1
  275. machineconfig/scripts/python/.mypy_cache/3.11/email/policy.data.json +0 -1
  276. machineconfig/scripts/python/.mypy_cache/3.11/email/policy.meta.json +0 -1
  277. machineconfig/scripts/python/.mypy_cache/3.11/enum.data.json +0 -1
  278. machineconfig/scripts/python/.mypy_cache/3.11/enum.meta.json +0 -1
  279. machineconfig/scripts/python/.mypy_cache/3.11/fnmatch.data.json +0 -1
  280. machineconfig/scripts/python/.mypy_cache/3.11/fnmatch.meta.json +0 -1
  281. machineconfig/scripts/python/.mypy_cache/3.11/functools.data.json +0 -1
  282. machineconfig/scripts/python/.mypy_cache/3.11/functools.meta.json +0 -1
  283. machineconfig/scripts/python/.mypy_cache/3.11/gc.data.json +0 -1
  284. machineconfig/scripts/python/.mypy_cache/3.11/gc.meta.json +0 -1
  285. machineconfig/scripts/python/.mypy_cache/3.11/genericpath.data.json +0 -1
  286. machineconfig/scripts/python/.mypy_cache/3.11/genericpath.meta.json +0 -1
  287. machineconfig/scripts/python/.mypy_cache/3.11/getpass.data.json +0 -1
  288. machineconfig/scripts/python/.mypy_cache/3.11/getpass.meta.json +0 -1
  289. machineconfig/scripts/python/.mypy_cache/3.11/git/__init__.data.json +0 -1
  290. machineconfig/scripts/python/.mypy_cache/3.11/git/__init__.meta.json +0 -1
  291. machineconfig/scripts/python/.mypy_cache/3.11/git/cmd.data.json +0 -1
  292. machineconfig/scripts/python/.mypy_cache/3.11/git/cmd.meta.json +0 -1
  293. machineconfig/scripts/python/.mypy_cache/3.11/git/compat.data.json +0 -1
  294. machineconfig/scripts/python/.mypy_cache/3.11/git/compat.meta.json +0 -1
  295. machineconfig/scripts/python/.mypy_cache/3.11/git/config.data.json +0 -1
  296. machineconfig/scripts/python/.mypy_cache/3.11/git/config.meta.json +0 -1
  297. machineconfig/scripts/python/.mypy_cache/3.11/git/db.data.json +0 -1
  298. machineconfig/scripts/python/.mypy_cache/3.11/git/db.meta.json +0 -1
  299. machineconfig/scripts/python/.mypy_cache/3.11/git/diff.data.json +0 -1
  300. machineconfig/scripts/python/.mypy_cache/3.11/git/diff.meta.json +0 -1
  301. machineconfig/scripts/python/.mypy_cache/3.11/git/exc.data.json +0 -1
  302. machineconfig/scripts/python/.mypy_cache/3.11/git/exc.meta.json +0 -1
  303. machineconfig/scripts/python/.mypy_cache/3.11/git/index/__init__.data.json +0 -1
  304. machineconfig/scripts/python/.mypy_cache/3.11/git/index/__init__.meta.json +0 -1
  305. machineconfig/scripts/python/.mypy_cache/3.11/git/index/base.data.json +0 -1
  306. machineconfig/scripts/python/.mypy_cache/3.11/git/index/base.meta.json +0 -1
  307. machineconfig/scripts/python/.mypy_cache/3.11/git/index/fun.data.json +0 -1
  308. machineconfig/scripts/python/.mypy_cache/3.11/git/index/fun.meta.json +0 -1
  309. machineconfig/scripts/python/.mypy_cache/3.11/git/index/typ.data.json +0 -1
  310. machineconfig/scripts/python/.mypy_cache/3.11/git/index/typ.meta.json +0 -1
  311. machineconfig/scripts/python/.mypy_cache/3.11/git/index/util.data.json +0 -1
  312. machineconfig/scripts/python/.mypy_cache/3.11/git/index/util.meta.json +0 -1
  313. machineconfig/scripts/python/.mypy_cache/3.11/git/objects/__init__.data.json +0 -1
  314. machineconfig/scripts/python/.mypy_cache/3.11/git/objects/__init__.meta.json +0 -1
  315. machineconfig/scripts/python/.mypy_cache/3.11/git/objects/base.data.json +0 -1
  316. machineconfig/scripts/python/.mypy_cache/3.11/git/objects/base.meta.json +0 -1
  317. machineconfig/scripts/python/.mypy_cache/3.11/git/objects/blob.data.json +0 -1
  318. machineconfig/scripts/python/.mypy_cache/3.11/git/objects/blob.meta.json +0 -1
  319. machineconfig/scripts/python/.mypy_cache/3.11/git/objects/commit.data.json +0 -1
  320. machineconfig/scripts/python/.mypy_cache/3.11/git/objects/commit.meta.json +0 -1
  321. machineconfig/scripts/python/.mypy_cache/3.11/git/objects/fun.data.json +0 -1
  322. machineconfig/scripts/python/.mypy_cache/3.11/git/objects/fun.meta.json +0 -1
  323. machineconfig/scripts/python/.mypy_cache/3.11/git/objects/submodule/__init__.data.json +0 -1
  324. machineconfig/scripts/python/.mypy_cache/3.11/git/objects/submodule/__init__.meta.json +0 -1
  325. machineconfig/scripts/python/.mypy_cache/3.11/git/objects/submodule/base.data.json +0 -1
  326. machineconfig/scripts/python/.mypy_cache/3.11/git/objects/submodule/base.meta.json +0 -1
  327. machineconfig/scripts/python/.mypy_cache/3.11/git/objects/submodule/root.data.json +0 -1
  328. machineconfig/scripts/python/.mypy_cache/3.11/git/objects/submodule/root.meta.json +0 -1
  329. machineconfig/scripts/python/.mypy_cache/3.11/git/objects/submodule/util.data.json +0 -1
  330. machineconfig/scripts/python/.mypy_cache/3.11/git/objects/submodule/util.meta.json +0 -1
  331. machineconfig/scripts/python/.mypy_cache/3.11/git/objects/tag.data.json +0 -1
  332. machineconfig/scripts/python/.mypy_cache/3.11/git/objects/tag.meta.json +0 -1
  333. machineconfig/scripts/python/.mypy_cache/3.11/git/objects/tree.data.json +0 -1
  334. machineconfig/scripts/python/.mypy_cache/3.11/git/objects/tree.meta.json +0 -1
  335. machineconfig/scripts/python/.mypy_cache/3.11/git/objects/util.data.json +0 -1
  336. machineconfig/scripts/python/.mypy_cache/3.11/git/objects/util.meta.json +0 -1
  337. machineconfig/scripts/python/.mypy_cache/3.11/git/refs/__init__.data.json +0 -1
  338. machineconfig/scripts/python/.mypy_cache/3.11/git/refs/__init__.meta.json +0 -1
  339. machineconfig/scripts/python/.mypy_cache/3.11/git/refs/head.data.json +0 -1
  340. machineconfig/scripts/python/.mypy_cache/3.11/git/refs/head.meta.json +0 -1
  341. machineconfig/scripts/python/.mypy_cache/3.11/git/refs/log.data.json +0 -1
  342. machineconfig/scripts/python/.mypy_cache/3.11/git/refs/log.meta.json +0 -1
  343. machineconfig/scripts/python/.mypy_cache/3.11/git/refs/reference.data.json +0 -1
  344. machineconfig/scripts/python/.mypy_cache/3.11/git/refs/reference.meta.json +0 -1
  345. machineconfig/scripts/python/.mypy_cache/3.11/git/refs/remote.data.json +0 -1
  346. machineconfig/scripts/python/.mypy_cache/3.11/git/refs/remote.meta.json +0 -1
  347. machineconfig/scripts/python/.mypy_cache/3.11/git/refs/symbolic.data.json +0 -1
  348. machineconfig/scripts/python/.mypy_cache/3.11/git/refs/symbolic.meta.json +0 -1
  349. machineconfig/scripts/python/.mypy_cache/3.11/git/refs/tag.data.json +0 -1
  350. machineconfig/scripts/python/.mypy_cache/3.11/git/refs/tag.meta.json +0 -1
  351. machineconfig/scripts/python/.mypy_cache/3.11/git/remote.data.json +0 -1
  352. machineconfig/scripts/python/.mypy_cache/3.11/git/remote.meta.json +0 -1
  353. machineconfig/scripts/python/.mypy_cache/3.11/git/repo/__init__.data.json +0 -1
  354. machineconfig/scripts/python/.mypy_cache/3.11/git/repo/__init__.meta.json +0 -1
  355. machineconfig/scripts/python/.mypy_cache/3.11/git/repo/base.data.json +0 -1
  356. machineconfig/scripts/python/.mypy_cache/3.11/git/repo/base.meta.json +0 -1
  357. machineconfig/scripts/python/.mypy_cache/3.11/git/repo/fun.data.json +0 -1
  358. machineconfig/scripts/python/.mypy_cache/3.11/git/repo/fun.meta.json +0 -1
  359. machineconfig/scripts/python/.mypy_cache/3.11/git/types.data.json +0 -1
  360. machineconfig/scripts/python/.mypy_cache/3.11/git/types.meta.json +0 -1
  361. machineconfig/scripts/python/.mypy_cache/3.11/git/util.data.json +0 -1
  362. machineconfig/scripts/python/.mypy_cache/3.11/git/util.meta.json +0 -1
  363. machineconfig/scripts/python/.mypy_cache/3.11/glob.data.json +0 -1
  364. machineconfig/scripts/python/.mypy_cache/3.11/glob.meta.json +0 -1
  365. machineconfig/scripts/python/.mypy_cache/3.11/gzip.data.json +0 -1
  366. machineconfig/scripts/python/.mypy_cache/3.11/gzip.meta.json +0 -1
  367. machineconfig/scripts/python/.mypy_cache/3.11/importlib/__init__.data.json +0 -1
  368. machineconfig/scripts/python/.mypy_cache/3.11/importlib/__init__.meta.json +0 -1
  369. machineconfig/scripts/python/.mypy_cache/3.11/importlib/_abc.data.json +0 -1
  370. machineconfig/scripts/python/.mypy_cache/3.11/importlib/_abc.meta.json +0 -1
  371. machineconfig/scripts/python/.mypy_cache/3.11/importlib/_bootstrap.data.json +0 -1
  372. machineconfig/scripts/python/.mypy_cache/3.11/importlib/_bootstrap.meta.json +0 -1
  373. machineconfig/scripts/python/.mypy_cache/3.11/importlib/_bootstrap_external.data.json +0 -1
  374. machineconfig/scripts/python/.mypy_cache/3.11/importlib/_bootstrap_external.meta.json +0 -1
  375. machineconfig/scripts/python/.mypy_cache/3.11/importlib/abc.data.json +0 -1
  376. machineconfig/scripts/python/.mypy_cache/3.11/importlib/abc.meta.json +0 -1
  377. machineconfig/scripts/python/.mypy_cache/3.11/importlib/machinery.data.json +0 -1
  378. machineconfig/scripts/python/.mypy_cache/3.11/importlib/machinery.meta.json +0 -1
  379. machineconfig/scripts/python/.mypy_cache/3.11/importlib/metadata/__init__.data.json +0 -1
  380. machineconfig/scripts/python/.mypy_cache/3.11/importlib/metadata/__init__.meta.json +0 -1
  381. machineconfig/scripts/python/.mypy_cache/3.11/importlib/metadata/_meta.data.json +0 -1
  382. machineconfig/scripts/python/.mypy_cache/3.11/importlib/metadata/_meta.meta.json +0 -1
  383. machineconfig/scripts/python/.mypy_cache/3.11/importlib/readers.data.json +0 -1
  384. machineconfig/scripts/python/.mypy_cache/3.11/importlib/readers.meta.json +0 -1
  385. machineconfig/scripts/python/.mypy_cache/3.11/importlib/resources/__init__.data.json +0 -1
  386. machineconfig/scripts/python/.mypy_cache/3.11/importlib/resources/__init__.meta.json +0 -1
  387. machineconfig/scripts/python/.mypy_cache/3.11/importlib/resources/_common.data.json +0 -1
  388. machineconfig/scripts/python/.mypy_cache/3.11/importlib/resources/_common.meta.json +0 -1
  389. machineconfig/scripts/python/.mypy_cache/3.11/importlib/resources/abc.data.json +0 -1
  390. machineconfig/scripts/python/.mypy_cache/3.11/importlib/resources/abc.meta.json +0 -1
  391. machineconfig/scripts/python/.mypy_cache/3.11/inspect.data.json +0 -1
  392. machineconfig/scripts/python/.mypy_cache/3.11/inspect.meta.json +0 -1
  393. machineconfig/scripts/python/.mypy_cache/3.11/io.data.json +0 -1
  394. machineconfig/scripts/python/.mypy_cache/3.11/io.meta.json +0 -1
  395. machineconfig/scripts/python/.mypy_cache/3.11/itertools.data.json +0 -1
  396. machineconfig/scripts/python/.mypy_cache/3.11/itertools.meta.json +0 -1
  397. machineconfig/scripts/python/.mypy_cache/3.11/locale.data.json +0 -1
  398. machineconfig/scripts/python/.mypy_cache/3.11/locale.meta.json +0 -1
  399. machineconfig/scripts/python/.mypy_cache/3.11/logging/__init__.data.json +0 -1
  400. machineconfig/scripts/python/.mypy_cache/3.11/logging/__init__.meta.json +0 -1
  401. machineconfig/scripts/python/.mypy_cache/3.11/mimetypes.data.json +0 -1
  402. machineconfig/scripts/python/.mypy_cache/3.11/mimetypes.meta.json +0 -1
  403. machineconfig/scripts/python/.mypy_cache/3.11/mmap.data.json +0 -1
  404. machineconfig/scripts/python/.mypy_cache/3.11/mmap.meta.json +0 -1
  405. machineconfig/scripts/python/.mypy_cache/3.11/numbers.data.json +0 -1
  406. machineconfig/scripts/python/.mypy_cache/3.11/numbers.meta.json +0 -1
  407. machineconfig/scripts/python/.mypy_cache/3.11/opcode.data.json +0 -1
  408. machineconfig/scripts/python/.mypy_cache/3.11/opcode.meta.json +0 -1
  409. machineconfig/scripts/python/.mypy_cache/3.11/os/__init__.data.json +0 -1
  410. machineconfig/scripts/python/.mypy_cache/3.11/os/__init__.meta.json +0 -1
  411. machineconfig/scripts/python/.mypy_cache/3.11/os/path.data.json +0 -1
  412. machineconfig/scripts/python/.mypy_cache/3.11/os/path.meta.json +0 -1
  413. machineconfig/scripts/python/.mypy_cache/3.11/pathlib.data.json +0 -1
  414. machineconfig/scripts/python/.mypy_cache/3.11/pathlib.meta.json +0 -1
  415. machineconfig/scripts/python/.mypy_cache/3.11/platform.data.json +0 -1
  416. machineconfig/scripts/python/.mypy_cache/3.11/platform.meta.json +0 -1
  417. machineconfig/scripts/python/.mypy_cache/3.11/posixpath.data.json +0 -1
  418. machineconfig/scripts/python/.mypy_cache/3.11/posixpath.meta.json +0 -1
  419. machineconfig/scripts/python/.mypy_cache/3.11/re.data.json +0 -1
  420. machineconfig/scripts/python/.mypy_cache/3.11/re.meta.json +0 -1
  421. machineconfig/scripts/python/.mypy_cache/3.11/resource.data.json +0 -1
  422. machineconfig/scripts/python/.mypy_cache/3.11/resource.meta.json +0 -1
  423. machineconfig/scripts/python/.mypy_cache/3.11/shlex.data.json +0 -1
  424. machineconfig/scripts/python/.mypy_cache/3.11/shlex.meta.json +0 -1
  425. machineconfig/scripts/python/.mypy_cache/3.11/shutil.data.json +0 -1
  426. machineconfig/scripts/python/.mypy_cache/3.11/shutil.meta.json +0 -1
  427. machineconfig/scripts/python/.mypy_cache/3.11/signal.data.json +0 -1
  428. machineconfig/scripts/python/.mypy_cache/3.11/signal.meta.json +0 -1
  429. machineconfig/scripts/python/.mypy_cache/3.11/src/__init__.data.json +0 -1
  430. machineconfig/scripts/python/.mypy_cache/3.11/src/__init__.meta.json +0 -1
  431. machineconfig/scripts/python/.mypy_cache/3.11/src/machineconfig/__init__.data.json +0 -1
  432. machineconfig/scripts/python/.mypy_cache/3.11/src/machineconfig/__init__.meta.json +0 -1
  433. machineconfig/scripts/python/.mypy_cache/3.11/src/machineconfig/scripts/__init__.data.json +0 -1
  434. machineconfig/scripts/python/.mypy_cache/3.11/src/machineconfig/scripts/__init__.meta.json +0 -1
  435. machineconfig/scripts/python/.mypy_cache/3.11/src/machineconfig/scripts/python/__init__.data.json +0 -1
  436. machineconfig/scripts/python/.mypy_cache/3.11/src/machineconfig/scripts/python/__init__.meta.json +0 -1
  437. machineconfig/scripts/python/.mypy_cache/3.11/sre_compile.data.json +0 -1
  438. machineconfig/scripts/python/.mypy_cache/3.11/sre_compile.meta.json +0 -1
  439. machineconfig/scripts/python/.mypy_cache/3.11/sre_constants.data.json +0 -1
  440. machineconfig/scripts/python/.mypy_cache/3.11/sre_constants.meta.json +0 -1
  441. machineconfig/scripts/python/.mypy_cache/3.11/sre_parse.data.json +0 -1
  442. machineconfig/scripts/python/.mypy_cache/3.11/sre_parse.meta.json +0 -1
  443. machineconfig/scripts/python/.mypy_cache/3.11/stat.data.json +0 -1
  444. machineconfig/scripts/python/.mypy_cache/3.11/stat.meta.json +0 -1
  445. machineconfig/scripts/python/.mypy_cache/3.11/string.data.json +0 -1
  446. machineconfig/scripts/python/.mypy_cache/3.11/string.meta.json +0 -1
  447. machineconfig/scripts/python/.mypy_cache/3.11/struct.data.json +0 -1
  448. machineconfig/scripts/python/.mypy_cache/3.11/struct.meta.json +0 -1
  449. machineconfig/scripts/python/.mypy_cache/3.11/subprocess.data.json +0 -1
  450. machineconfig/scripts/python/.mypy_cache/3.11/subprocess.meta.json +0 -1
  451. machineconfig/scripts/python/.mypy_cache/3.11/sys/__init__.data.json +0 -1
  452. machineconfig/scripts/python/.mypy_cache/3.11/sys/__init__.meta.json +0 -1
  453. machineconfig/scripts/python/.mypy_cache/3.11/tarfile.data.json +0 -1
  454. machineconfig/scripts/python/.mypy_cache/3.11/tarfile.meta.json +0 -1
  455. machineconfig/scripts/python/.mypy_cache/3.11/tempfile.data.json +0 -1
  456. machineconfig/scripts/python/.mypy_cache/3.11/tempfile.meta.json +0 -1
  457. machineconfig/scripts/python/.mypy_cache/3.11/textwrap.data.json +0 -1
  458. machineconfig/scripts/python/.mypy_cache/3.11/textwrap.meta.json +0 -1
  459. machineconfig/scripts/python/.mypy_cache/3.11/threading.data.json +0 -1
  460. machineconfig/scripts/python/.mypy_cache/3.11/threading.meta.json +0 -1
  461. machineconfig/scripts/python/.mypy_cache/3.11/time.data.json +0 -1
  462. machineconfig/scripts/python/.mypy_cache/3.11/time.meta.json +0 -1
  463. machineconfig/scripts/python/.mypy_cache/3.11/types.data.json +0 -1
  464. machineconfig/scripts/python/.mypy_cache/3.11/types.meta.json +0 -1
  465. machineconfig/scripts/python/.mypy_cache/3.11/typing.data.json +0 -1
  466. machineconfig/scripts/python/.mypy_cache/3.11/typing.meta.json +0 -1
  467. machineconfig/scripts/python/.mypy_cache/3.11/typing_extensions.data.json +0 -1
  468. machineconfig/scripts/python/.mypy_cache/3.11/typing_extensions.meta.json +0 -1
  469. machineconfig/scripts/python/.mypy_cache/3.11/urllib/__init__.data.json +0 -1
  470. machineconfig/scripts/python/.mypy_cache/3.11/urllib/__init__.meta.json +0 -1
  471. machineconfig/scripts/python/.mypy_cache/3.11/urllib/parse.data.json +0 -1
  472. machineconfig/scripts/python/.mypy_cache/3.11/urllib/parse.meta.json +0 -1
  473. machineconfig/scripts/python/.mypy_cache/3.11/uuid.data.json +0 -1
  474. machineconfig/scripts/python/.mypy_cache/3.11/uuid.meta.json +0 -1
  475. machineconfig/scripts/python/.mypy_cache/3.11/warnings.data.json +0 -1
  476. machineconfig/scripts/python/.mypy_cache/3.11/warnings.meta.json +0 -1
  477. machineconfig/scripts/python/.mypy_cache/3.11/weakref.data.json +0 -1
  478. machineconfig/scripts/python/.mypy_cache/3.11/weakref.meta.json +0 -1
  479. machineconfig/scripts/python/.mypy_cache/3.11/zipfile/__init__.data.json +0 -1
  480. machineconfig/scripts/python/.mypy_cache/3.11/zipfile/__init__.meta.json +0 -1
  481. machineconfig/scripts/python/.mypy_cache/3.11/zlib.data.json +0 -1
  482. machineconfig/scripts/python/.mypy_cache/3.11/zlib.meta.json +0 -1
  483. machineconfig/scripts/python/.mypy_cache/CACHEDIR.TAG +0 -3
  484. machineconfig/scripts/python/__pycache__/cloud_repo_sync.cpython-311.pyc +0 -0
  485. machineconfig/scripts/python/__pycache__/gh_models.cpython-311.pyc +0 -0
  486. machineconfig/scripts/python/__pycache__/url2md.cpython-311.pyc +0 -0
  487. machineconfig/scripts/python/__pycache__/viewer.cpython-311.pyc +0 -0
  488. machineconfig/scripts/python/__pycache__/vscode_api.cpython-311.pyc +0 -0
  489. machineconfig/settings/__pycache__/__init__.cpython-311.pyc +0 -0
  490. machineconfig/settings/linters/.ruff_cache/.gitignore +0 -2
  491. machineconfig/settings/linters/.ruff_cache/CACHEDIR.TAG +0 -1
  492. machineconfig/settings/shells/ipy/profiles/default/__pycache__/__init__.cpython-311.pyc +0 -0
  493. machineconfig/settings/shells/ipy/profiles/default/startup/__pycache__/__init__.cpython-311.pyc +0 -0
  494. machineconfig/settings/shells/ipy/profiles/default/startup/__pycache__/playext.cpython-311.pyc +0 -0
  495. machineconfig/utils/ve_utils/ve1.py +0 -111
  496. machineconfig/utils/ve_utils/ve2.py +0 -155
  497. machineconfig-1.95.dist-info/RECORD +0 -712
  498. {machineconfig-1.95.dist-info → machineconfig-1.96.dist-info}/WHEEL +0 -0
  499. {machineconfig-1.95.dist-info → machineconfig-1.96.dist-info}/top_level.txt +0 -0
@@ -1,7 +1,8 @@
1
- from crocodile.file_management import P, Read
1
+ from machineconfig.utils.path_reduced import P as PathExtended
2
2
  from crocodile.meta import Terminal
3
3
  from machineconfig.scripts.python.get_zellij_cmd import get_zellij_cmd
4
4
  from machineconfig.utils.utils import CONFIG_PATH, DEFAULTS_PATH
5
+ from machineconfig.utils.utils2 import read_ini
5
6
  from machineconfig.utils.code import write_shell_script_to_file
6
7
  import platform
7
8
  from rich.console import Console
@@ -12,8 +13,8 @@ console = Console()
12
13
 
13
14
  def delete_remote_repo_copy_and_push_local(remote_repo: str, local_repo: str, cloud: str):
14
15
  console.print(Panel("🗑️ Deleting remote repo copy and pushing local copy", title="[bold blue]Repo Sync[/bold blue]", border_style="blue"))
15
- repo_sync_root = P(remote_repo).expanduser().absolute()
16
- repo_root_path = P(local_repo).expanduser().absolute()
16
+ repo_sync_root = PathExtended(remote_repo).expanduser().absolute()
17
+ repo_root_path = PathExtended(local_repo).expanduser().absolute()
17
18
  repo_sync_root.delete(sure=True)
18
19
  print("🧹 Removed temporary remote copy")
19
20
  from git.remote import Remote
@@ -22,7 +23,7 @@ def delete_remote_repo_copy_and_push_local(remote_repo: str, local_repo: str, cl
22
23
  Remote.remove(Repo(repo_root_path), "originEnc")
23
24
  console.print(Panel("🔗 Removed originEnc remote reference", border_style="blue"))
24
25
  except Exception: pass # type: ignore
25
- console.print(Panel(f"📈 Deleting remote repository copy and pushing local changes", width=150, border_style="blue"))
26
+ console.print(Panel("📈 Deleting remote repository copy and pushing local changes", width=150, border_style="blue"))
26
27
 
27
28
  repo_root_path.to_cloud(cloud=cloud, zip=True, encrypt=True, rel2home=True, os_specific=False)
28
29
 
@@ -33,7 +34,7 @@ def delete_remote_repo_copy_and_push_local(remote_repo: str, local_repo: str, cl
33
34
  # import subprocess
34
35
 
35
36
 
36
- def get_wt_cmd(wd1: P, wd2: P) -> str:
37
+ def get_wt_cmd(wd1: PathExtended, wd2: PathExtended) -> str:
37
38
  lines = [
38
39
  f"""wt --window 0 new-tab --profile pwsh --title "gitdiff" --tabColor `#3b04d1 --startingDirectory {wd1} ` --colorScheme "Solarized Dark" """,
39
40
  f"""split-pane --horizontal --profile pwsh --startingDirectory {wd2} --size 0.5 --colorScheme "Tango Dark" -- pwsh -Interactive """
@@ -45,12 +46,12 @@ def inspect_repos(repo_local_root: str, repo_remote_root: str):
45
46
  console.print(Panel(f"📂 Local: {repo_local_root}\n📂 Remote: {repo_remote_root}", title="[bold blue]🔍 Inspecting Repositories[/bold blue]", border_style="blue"))
46
47
 
47
48
  if platform.system() == "Windows":
48
- program = get_wt_cmd(wd1=P(repo_local_root), wd2=P(repo_local_root))
49
- write_shell_script_to_file(program=program, execute=True, desc="Inspecting repos ...", preserve_cwd=True, display=True)
49
+ program = get_wt_cmd(wd1=PathExtended(repo_local_root), wd2=PathExtended(repo_local_root))
50
+ write_shell_script_to_file(shell_script=program)
50
51
  return None
51
- elif platform.system() == "Linux":
52
- program = get_zellij_cmd(wd1=P(repo_local_root), wd2=P(repo_remote_root))
53
- write_shell_script_to_file(program=program, execute=True, desc="Inspecting repos ...", preserve_cwd=True, display=True)
52
+ elif platform.system() in ["Linux", "Darwin"]:
53
+ program = get_zellij_cmd(wd1=PathExtended(repo_local_root), wd2=PathExtended(repo_remote_root))
54
+ write_shell_script_to_file(shell_script=program)
54
55
  return None
55
56
  else: raise NotImplementedError(f"Platform {platform.system()} not implemented.")
56
57
 
@@ -58,23 +59,23 @@ def inspect_repos(repo_local_root: str, repo_remote_root: str):
58
59
  def fetch_dotfiles():
59
60
  console.print(Panel("📁 Fetching Dotfiles", title="[bold blue]Dotfiles[/bold blue]", border_style="blue"))
60
61
 
61
- cloud_resolved = Read.ini(DEFAULTS_PATH)['general']['rclone_config_name']
62
+ cloud_resolved = read_ini(DEFAULTS_PATH)['general']['rclone_config_name']
62
63
  console.print(Panel(f"⚠️ Using default cloud: `{cloud_resolved}` from {DEFAULTS_PATH}", width=150, border_style="yellow"))
63
64
 
64
- dotfiles_local = P.home().joinpath("dotfiles")
65
- CONFIG_PATH.joinpath("remote").create()
65
+ dotfiles_local = PathExtended.home().joinpath("dotfiles")
66
+ CONFIG_PATH.joinpath("remote").mkdir(parents=True, exist_ok=True)
66
67
  dotfiles_remote = CONFIG_PATH.joinpath("remote", dotfiles_local.rel2home())
67
68
  remote_path = dotfiles_local.get_remote_path(rel2home=True, os_specific=False, root="myhome") + ".zip.enc"
68
69
 
69
- console.print(Panel(f"📥 Downloading dotfiles from cloud...", width=150, border_style="blue"))
70
+ console.print(Panel("📥 Downloading dotfiles from cloud...", width=150, border_style="blue"))
70
71
 
71
72
  dotfiles_remote.from_cloud(remotepath=remote_path, cloud=cloud_resolved,
72
73
  unzip=True, decrypt=True, rel2home=True, os_specific=False, pwd=None)
73
74
 
74
- console.print(Panel(f"🗑️ Removing old dotfiles and replacing with cloud version...", width=150, border_style="blue"))
75
+ console.print(Panel("🗑️ Removing old dotfiles and replacing with cloud version...", width=150, border_style="blue"))
75
76
 
76
77
  dotfiles_local.delete(sure=True)
77
- dotfiles_remote.move(folder=P.home())
78
+ dotfiles_remote.move(folder=PathExtended.home())
78
79
  script = f"""
79
80
  # rm -rf {dotfiles_local}
80
81
  # mv {dotfiles_remote} {dotfiles_local}
@@ -1,9 +1,8 @@
1
1
  """NFS mounting script
2
2
  """
3
3
 
4
- from crocodile.file_management import P
4
+ from machineconfig.utils.path_reduced import P as PathExtended
5
5
  from crocodile.meta import SSH, Terminal
6
- from crocodile.core import List as L
7
6
  from machineconfig.utils.utils import display_options, PROGRAM_PATH, choose_ssh_host
8
7
  import platform
9
8
 
@@ -21,9 +20,7 @@ def main():
21
20
  default = f"{ssh.hostname}:{ssh.run('echo $HOME').op}/data/share_nfs"
22
21
  share_info = display_options(
23
22
  "📂 Choose a share path:",
24
- options=L(ssh.run("cat /etc/exports").op.split("\n"))
25
- .filter(lambda x: not x.startswith("#"))
26
- .apply(lambda x: f"{ssh.hostname}:{x.split(' ')[0]}").list + [default],
23
+ options=[f"{ssh.hostname}:{item.split(' ')[0]}" for item in ssh.run("cat /etc/exports").op.split("\n") if not item.startswith("#")] + [default],
27
24
  default=default
28
25
  )
29
26
  assert isinstance(share_info, str), f"❌ share_info must be a string. Got {type(share_info)}"
@@ -34,11 +31,11 @@ def main():
34
31
  print(f"\n🌐 Remote Server: {remote_server}")
35
32
  print(f"📁 Share Path: {share_path}\n")
36
33
 
37
- if platform.system() == "Linux":
38
- mount_path_1 = P(share_path)
39
- mount_path_2 = P.home().joinpath(f"data/mount_nfs/{remote_server}")
34
+ if platform.system() in ["Linux", "Darwin"]:
35
+ mount_path_1 = PathExtended(share_path)
36
+ mount_path_2 = PathExtended.home().joinpath(f"data/mount_nfs/{remote_server}")
40
37
  if str(mount_path_1).startswith("/home"):
41
- mount_path_3 = P.home().joinpath(*mount_path_1.parts[3:])
38
+ mount_path_3 = PathExtended.home().joinpath(*mount_path_1.parts[3:])
42
39
  else:
43
40
  mount_path_3 = mount_path_2
44
41
 
@@ -49,8 +46,8 @@ def main():
49
46
  default=mount_path_2,
50
47
  custom_input=True
51
48
  )
52
- assert isinstance(local_mount_point, P), f"❌ local_mount_point must be a pathlib.Path. Got {type(local_mount_point)}"
53
- local_mount_point = P(local_mount_point).expanduser()
49
+ assert isinstance(local_mount_point, PathExtended), f"❌ local_mount_point must be a pathlib.Path. Got {type(local_mount_point)}"
50
+ local_mount_point = PathExtended(local_mount_point).expanduser()
54
51
 
55
52
  PROGRAM_PATH.write_text(f"""
56
53
  share_info={share_info}
@@ -1,5 +1,5 @@
1
1
  from machineconfig.utils.utils import PROGRAM_PATH
2
- from crocodile.file_management import P
2
+ from pathlib import Path
3
3
  import platform
4
4
 
5
5
  def main():
@@ -12,9 +12,9 @@ def main():
12
12
 
13
13
  mount_point = input(f"📂 Enter the mount point directory (e.g., /mnt/network) [Default: ~/data/mount_nw/{machine_name}]: ")
14
14
  if mount_point == "":
15
- mount_point = P.home().joinpath(fr"data/mount_nw/{machine_name}")
15
+ mount_point = Path.home().joinpath(fr"data/mount_nw/{machine_name}")
16
16
  else:
17
- mount_point = P(mount_point).expanduser()
17
+ mount_point = Path(mount_point).expanduser()
18
18
 
19
19
  print(f"\n🌐 Network Drive Location: {drive_location}")
20
20
  print(f"📁 Mount Point: {mount_point}\n")
@@ -22,7 +22,7 @@ def main():
22
22
  username = input("👤 Enter the username: ")
23
23
  password = input("🔒 Enter the password: ")
24
24
 
25
- if platform.system() == "Linux":
25
+ if platform.system() in ["Linux", "Darwin"]:
26
26
  print("\n🔧 Saving configuration for Linux...")
27
27
  PROGRAM_PATH.write_text(f"""
28
28
  drive_location='{drive_location}'
@@ -3,7 +3,7 @@
3
3
 
4
4
  from platform import system
5
5
  from crocodile.meta import SSH, Terminal
6
- from crocodile.file_management import P
6
+ from machineconfig.utils.path_reduced import P as PathExtended
7
7
  from machineconfig.utils.utils import PROGRAM_PATH, choose_ssh_host
8
8
 
9
9
  def main():
@@ -32,7 +32,7 @@ def main():
32
32
 
33
33
  mount_point = input(f"📂 Enter the mount point directory (e.g., /mnt/network) [Default: ~/data/mount_ssh/{ssh.hostname}]: ")
34
34
  if mount_point == "":
35
- mount_point = P.home().joinpath(fr"data/mount_ssh/{ssh.hostname}")
35
+ mount_point = PathExtended.home().joinpath(fr"data/mount_ssh/{ssh.hostname}")
36
36
 
37
37
  print(f"\n📁 Mount Point: {mount_point}")
38
38
 
@@ -1,68 +1,67 @@
1
- """Share
2
- """
1
+ # """Share
2
+ # """
3
3
 
4
- # as per https://github.com/Luzifer/ots
5
- # this script is pure python and connects to server to create a secret
6
- # or use ots executable to do this job
4
+ # # as per https://github.com/Luzifer/ots
5
+ # # this script is pure python and connects to server to create a secret
6
+ # # or use ots executable to do this job
7
7
 
8
- import requests
9
- import crocodile.file_management as fm
10
- from crocodile.core import install_n_import
11
- import base64
12
- from typing import Optional
8
+ # import requests
9
+ # import crocodile.file_management as fm
10
+ # import base64
11
+ # from typing import Optional
13
12
 
14
- def encrypt(key: str, pwd: str):
15
- print("\n🔒 Encrypting the secret...")
16
- install_n_import(library="Crypto.Cipher", package="pycryptodome")
17
- AES = __import__("Crypto", fromlist=["Cipher"]).Cipher.AES
18
- MD5 = __import__("Crypto", fromlist=["Hash"]).Hash.MD5
19
- pwd_enc = pwd.encode("utf-8")
20
- hash_object = MD5.new(key.encode("utf-8"))
21
- key_digest = hash_object.digest()
22
- iv = b'\x00' * 16
23
- cipher = AES.new(key_digest, AES.MODE_CBC, iv)
24
- pad = 16 - (len(pwd_enc) % 16)
25
- pwd_enc += bytes([pad] * pad)
26
- encrypted_password = cipher.encrypt(pwd_enc)
27
- print("✅ Encryption completed successfully!\n")
28
- return base64.b64encode(encrypted_password).decode("utf-8")
13
+ # def encrypt(key: str, pwd: str):
14
+ # print("\n🔒 Encrypting the secret...")
15
+ # import pycryptodome
16
+ # AES = __import__("Crypto", fromlist=["Cipher"]).Cipher.AES
17
+ # MD5 = __import__("Crypto", fromlist=["Hash"]).Hash.MD5
18
+ # pwd_enc = pwd.encode("utf-8")
19
+ # hash_object = MD5.new(key.encode("utf-8"))
20
+ # key_digest = hash_object.digest()
21
+ # iv = b'\x00' * 16
22
+ # cipher = AES.new(key_digest, AES.MODE_CBC, iv)
23
+ # pad = 16 - (len(pwd_enc) % 16)
24
+ # pwd_enc += bytes([pad] * pad)
25
+ # encrypted_password = cipher.encrypt(pwd_enc)
26
+ # print("✅ Encryption completed successfully!\n")
27
+ # return base64.b64encode(encrypted_password).decode("utf-8")
29
28
 
30
- def share(secret: str, password: Optional[str]):
31
- print("\n🚀 Initiating the sharing process...")
32
- if password is not None:
33
- print("🔑 Password provided. Encrypting the secret...")
34
- encoded_secret = encrypt(password, secret)
35
- else:
36
- print("🔓 No password provided. Sharing the secret as is.")
37
- encoded_secret = secret
29
+ # def share(secret: str, password: Optional[str]):
30
+ # print("\n🚀 Initiating the sharing process...")
31
+ # if password is not None:
32
+ # print("🔑 Password provided. Encrypting the secret...")
33
+ # encoded_secret = encrypt(password, secret)
34
+ # else:
35
+ # print("🔓 No password provided. Sharing the secret as is.")
36
+ # encoded_secret = secret
38
37
 
39
- url = "https://ots.fyi/api/create"
38
+ # url = "https://ots.fyi/api/create"
40
39
 
41
- payload = {"secret": encoded_secret}
42
- headers = {'Content-Type': 'application/json'}
40
+ # payload = {"secret": encoded_secret}
41
+ # headers = {'Content-Type': 'application/json'}
43
42
 
44
- print("\n🌐 Sending request to the server...")
45
- response = requests.post(url, json=payload, headers=headers, timeout=10)
43
+ # print("\n🌐 Sending request to the server...")
44
+ # response = requests.post(url, json=payload, headers=headers, timeout=10)
46
45
 
47
- if response.status_code == 201:
48
- res = response.json()
49
- print("✅ Request successful! Response received.")
50
- assert res["success"] is True, "❌ Request failed."
51
- share_url = fm.P(f"https://ots.fyi/#{res['secret_id']}") + (f"|{password}" if password is not None else "")
52
- print(f"\n🔗 Share URL: {repr(share_url)}\n")
53
- return share_url
54
- else:
55
- print("❌ Request failed. Server returned an error.")
56
- raise RuntimeError(response.text)
46
+ # if response.status_code == 201:
47
+ # res = response.json()
48
+ # print("✅ Request successful! Response received.")
49
+ # assert res["success"] is True, "❌ Request failed."
50
+ # share_url = fm.P(f"https://ots.fyi/#{res['secret_id']}") + (f"|{password}" if password is not None else "")
51
+ # print(f"\n🔗 Share URL: {repr(share_url)}\n")
52
+ # return share_url
53
+ # else:
54
+ # print("❌ Request failed. Server returned an error.")
55
+ # raise RuntimeError(response.text)
57
56
 
58
- if __name__ == "__main__":
59
- print("\n" + "=" * 50)
60
- print("🔐 Welcome to the One-Time Secret Sharing Tool")
61
- print("=" * 50 + "\n")
57
+ # if __name__ == "__main__":
58
+ # print("\n" + "=" * 50)
59
+ # print("🔐 Welcome to the One-Time Secret Sharing Tool")
60
+ # print("=" * 50 + "\n")
62
61
 
63
- sc = input("📝 Enter the secret to share: ")
64
- pwdd = input("🔑 Enter a password (optional): ") or None
62
+ # sc = input("📝 Enter the secret to share: ")
63
+ # pwdd = input("🔑 Enter a password (optional): ") or None
65
64
 
66
- print("\n📤 Sharing the secret...")
67
- share(secret=sc, password=pwdd)
68
- print("🎉 Secret shared successfully!\n")
65
+ # print("\n📤 Sharing the secret...")
66
+ # share(secret=sc, password=pwdd)
67
+ # print("🎉 Secret shared successfully!\n")
@@ -1,55 +1,55 @@
1
- """Pomodoro
2
- """
3
-
4
- from crocodile.toolbox import Log, install_n_import, Scheduler, P
5
- import time
6
- from datetime import datetime
7
-
8
- def pomodoro(work: int = 25, rest: int = 5, repeats: int = 4):
9
- print("\n" + "=" * 50)
10
- print("🍅 Welcome to the Pomodoro Timer")
11
- print("=" * 50 + "\n")
12
-
13
- logger = Log(name="pomodoro", file=False, stream=True)
14
-
15
- def loop(sched: Scheduler):
16
- speak("Alright, time to start working...")
17
- print("\n⏳ Work session started! Stay focused.")
18
- start = datetime.now()
19
- _ = sched
20
- while (diff := work - ((datetime.now() - start).seconds / 60)) > 0:
21
- logger.debug(f"💼 Keep working. Time Left: {round(diff)} minutes")
22
- time.sleep(60 * 1)
23
-
24
- speak("Now, it's time to take a break.")
25
- print("\n☕ Break time! Relax and recharge.")
26
- start = datetime.now()
27
- while (diff := rest - ((datetime.now() - start).seconds / 60)) > 0:
28
- logger.critical(f"🛋️ Keep resting. Time Left: {round(diff)} minutes")
29
- time.sleep(60 * 1)
30
-
31
- def speak(txt: str):
32
- print(f"🔊 Speaking: {txt}")
33
- install_n_import("gtts").gTTS(txt, lang='en', tld='com.au').save(tmp := P.tmpfile(suffix=".mp3"))
34
- pyglet = install_n_import("pyglet")
35
- time.sleep(0.5)
36
- pyglet.resource.path = [tmp.parent.to_str()]
37
- pyglet.resource.reindex()
38
- pyglet.resource.media(tmp.name).play()
39
-
40
- def beep(duration: int = 1, frequency: int = 3000):
41
- print(f"🔔 Beeping with duration {duration}s and frequency {frequency}Hz")
42
- try:
43
- import winsound
44
- except ImportError:
45
- __import__("os").system(f'beep -f {frequency} -l {1000 * duration}')
46
- else:
47
- winsound.Beep(frequency, 1000 * duration) # type: ignore
48
-
49
- _ = beep
50
-
51
- print("\n🎯 Starting the Pomodoro routine...")
52
- return Scheduler(routine=loop, max_cycles=repeats, logger=logger, wait="0.1m").run()
53
-
54
- if __name__ == '__main__':
55
- pomodoro()
1
+ # """Pomodoro
2
+ # """
3
+
4
+ # import time
5
+ # from datetime import datetime
6
+
7
+ # def pomodoro(work: int = 25, rest: int = 5, repeats: int = 4):
8
+ # print("\n" + "=" * 50)
9
+ # print("🍅 Welcome to the Pomodoro Timer")
10
+ # print("=" * 50 + "\n")
11
+
12
+ # logger = Log(name="pomodoro", file=False, stream=True)
13
+
14
+ # def loop(sched: Scheduler):
15
+ # speak("Alright, time to start working...")
16
+ # print("\n⏳ Work session started! Stay focused.")
17
+ # start = datetime.now()
18
+ # _ = sched
19
+ # while (diff := work - ((datetime.now() - start).seconds / 60)) > 0:
20
+ # logger.debug(f"💼 Keep working. Time Left: {round(diff)} minutes")
21
+ # time.sleep(60 * 1)
22
+
23
+ # speak("Now, it's time to take a break.")
24
+ # print("\n☕ Break time! Relax and recharge.")
25
+ # start = datetime.now()
26
+ # while (diff := rest - ((datetime.now() - start).seconds / 60)) > 0:
27
+ # logger.critical(f"🛋️ Keep resting. Time Left: {round(diff)} minutes")
28
+ # time.sleep(60 * 1)
29
+
30
+ # def speak(txt: str):
31
+ # print(f"🔊 Speaking: {txt}")
32
+ # import pyglet
33
+ # import gtts
34
+ # gtts.gTTS(txt, lang='en', tld='com.au').save(tmp := PathExtended.tmpfile(suffix=".mp3"))
35
+ # time.sleep(0.5)
36
+ # pyglet.resource.path = [str(tmp.parent)]
37
+ # pyglet.resource.reindex()
38
+ # pyglet.resource.media(tmp.name).play()
39
+
40
+ # def beep(duration: int = 1, frequency: int = 3000):
41
+ # print(f"🔔 Beeping with duration {duration}s and frequency {frequency}Hz")
42
+ # try:
43
+ # import winsound
44
+ # except ImportError:
45
+ # __import__("os").system(f'beep -f {frequency} -l {1000 * duration}')
46
+ # else:
47
+ # winsound.Beep(frequency, 1000 * duration) # type: ignore
48
+
49
+ # _ = beep
50
+
51
+ # print("\n🎯 Starting the Pomodoro routine...")
52
+ # return Scheduler(routine=loop, max_cycles=repeats, logger=logger, wait="0.1m").run()
53
+
54
+ # if __name__ == '__main__':
55
+ # pomodoro()
@@ -7,8 +7,9 @@ in the event that username@github.com is not mentioned in the remote url.
7
7
 
8
8
  from rich import print as pprint
9
9
  from machineconfig.utils.utils import write_shell_script_to_default_program_path, CONFIG_PATH, DEFAULTS_PATH
10
- from crocodile.file_management import P, Read, Save
11
- from crocodile.core import randstr
10
+ from machineconfig.utils.path_reduced import P as PathExtended
11
+ from machineconfig.utils.io_save import save_json
12
+ from machineconfig.utils.utils2 import randstr, read_json, read_ini
12
13
  import argparse
13
14
  from dataclasses import dataclass
14
15
  from enum import Enum
@@ -29,7 +30,7 @@ class RepoRecord:
29
30
  version: dict[str, str]
30
31
 
31
32
 
32
- def git_action(path: P, action: GitAction, mess: Optional[str] = None, r: bool = False, uv_sync: bool = False) -> str:
33
+ def git_action(path: PathExtended, action: GitAction, mess: Optional[str] = None, r: bool = False, uv_sync: bool = False) -> str:
33
34
  from git.exc import InvalidGitRepositoryError
34
35
  from git.repo import Repo
35
36
  try:
@@ -54,9 +55,9 @@ git commit -am "{mess}"
54
55
  action_name = "pull" if action == GitAction.pull else "push"
55
56
  cmds = [f'echo "🔄 {action_name.capitalize()}ing from {remote.url}" ; git {action_name} {remote.name} {repo.active_branch.name}' for remote in repo.remotes]
56
57
  program += '\n' + '\n'.join(cmds) + '\n'
57
- uv_sync = "uv sync" if uv_sync else ""
58
+ uv_sync_cmd = "uv sync" if uv_sync else ""
58
59
  program = program + f'''
59
- {uv_sync}
60
+ {uv_sync_cmd}
60
61
  echo "✅"; echo ""
61
62
  '''
62
63
  return program
@@ -85,8 +86,8 @@ def main():
85
86
  parser.add_argument("--cloud", "-c", help="☁️ Cloud storage option.", default=None)
86
87
  args = parser.parse_args()
87
88
 
88
- if args.directory == "": repos_root = P.home().joinpath("code") # it is a positional argument, can never be empty.
89
- else: repos_root = P(args.directory).expanduser().absolute()
89
+ if args.directory == "": repos_root = PathExtended.home().joinpath("code") # it is a positional argument, can never be empty.
90
+ else: repos_root = PathExtended(args.directory).expanduser().absolute()
90
91
 
91
92
  program = ""
92
93
  if args.record:
@@ -94,9 +95,9 @@ def main():
94
95
  res = record_repos(repos_root=str(repos_root))
95
96
  pprint("✅ Recorded repositories:\n", res)
96
97
  save_path = CONFIG_PATH.joinpath("repos").joinpath(repos_root.rel2home()).joinpath("repos.json")
97
- Save.json(obj=res, path=save_path, indent=4)
98
- pprint(f"📁 Result saved at {P(save_path)}")
99
- if args.cloud is not None: P(save_path).to_cloud(rel2home=True, cloud=args.cloud)
98
+ save_json(obj=res, path=save_path, indent=4)
99
+ pprint(f"📁 Result saved at {PathExtended(save_path)}")
100
+ if args.cloud is not None: PathExtended(save_path).to_cloud(rel2home=True, cloud=args.cloud)
100
101
  program += """\necho '>>>>>>>>> Finished Recording'\n"""
101
102
  elif args.clone or args.checkout or args.checkout_to_branch:
102
103
  print("\n📥 Cloning or checking out repositories...")
@@ -105,7 +106,7 @@ def main():
105
106
  repos_root = CONFIG_PATH.joinpath("repos").joinpath(repos_root.rel2home()).joinpath("repos.json")
106
107
  if not repos_root.exists():
107
108
  if args.cloud is None:
108
- cloud: str=Read.ini(DEFAULTS_PATH)['general']['rclone_config_name']
109
+ cloud: str=read_ini(DEFAULTS_PATH)['general']['rclone_config_name']
109
110
  print(f"⚠️ Using default cloud: {cloud}")
110
111
  else:
111
112
  cloud = args.cloud
@@ -125,22 +126,25 @@ def main():
125
126
 
126
127
 
127
128
  def record_repos(repos_root: str, r: bool=True) -> list[dict[str, Any]]:
128
- path_obj = P(repos_root).expanduser().absolute()
129
+ path_obj = PathExtended(repos_root).expanduser().absolute()
129
130
  if path_obj.is_file(): return []
130
131
  search_res = path_obj.search("*", files=False)
131
132
  res: list[dict[str, Any]] = []
132
133
  for a_search_res in search_res:
133
134
  if a_search_res.joinpath(".git").exists():
134
- res.append(record_a_repo(a_search_res))
135
+ try:
136
+ res.append(record_a_repo(a_search_res))
137
+ except Exception as e:
138
+ print(f"⚠️ Failed to record {a_search_res}: {e}")
135
139
  else:
136
140
  if r: res += record_repos(str(a_search_res), r=r)
137
141
  return res
138
142
 
139
143
 
140
- def record_a_repo(path: P, search_parent_directories: bool=False, preferred_remote: Optional[str] = None):
144
+ def record_a_repo(path: PathExtended, search_parent_directories: bool=False, preferred_remote: Optional[str] = None):
141
145
  from git.repo import Repo
142
146
  repo = Repo(path, search_parent_directories=search_parent_directories) # get list of remotes using git python
143
- repo_root = P(repo.working_dir).absolute()
147
+ repo_root = PathExtended(repo.working_dir).absolute()
144
148
  remotes = {remote.name: remote.url for remote in repo.remotes}
145
149
  if preferred_remote is not None:
146
150
  if preferred_remote in remotes: remotes = {preferred_remote: remotes[preferred_remote]}
@@ -163,14 +167,18 @@ def record_a_repo(path: P, search_parent_directories: bool=False, preferred_remo
163
167
 
164
168
  def install_repos(specs_path: str, clone: bool=True, checkout_to_recorded_commit: bool=False, checkout_to_branch: bool=False, editable_install: bool=False, preferred_remote: Optional[str] = None):
165
169
  program = ""
166
- path_obj = P(specs_path).expanduser().absolute()
167
- repos: list[dict[str, Any]] = Read.json(path_obj)
170
+ path_obj = PathExtended(specs_path).expanduser().absolute()
171
+ repos: list[dict[str, Any]] = read_json(path_obj)
168
172
  for repo in repos:
169
- parent_dir = P(repo["parent_dir"]).expanduser().absolute().create()
173
+ parent_dir = PathExtended(repo["parent_dir"]).expanduser().absolute()
174
+ parent_dir.mkdir(parents=True, exist_ok=True)
170
175
 
171
176
  # Handle cloning and remote setup
172
177
  if clone:
173
178
  # Select the remote to use for cloning
179
+ if len(repo["remotes"]) == 0:
180
+ print(f"⚠️ No remotes found for {repo['name']}. Skipping clone.")
181
+ continue
174
182
  remote_name, remote_url = next(iter(repo["remotes"].items())) # Get first remote by default
175
183
  if preferred_remote is not None and preferred_remote in repo["remotes"]:
176
184
  remote_name = preferred_remote