gitpane 1.0.0__tar.gz

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.
Files changed (357) hide show
  1. gitpane-1.0.0/LICENSE +21 -0
  2. gitpane-1.0.0/MANIFEST.in +2 -0
  3. gitpane-1.0.0/PKG-INFO +141 -0
  4. gitpane-1.0.0/THIRD_PARTY_NOTICES.md +109 -0
  5. gitpane-1.0.0/docs/PYPI_README.md +94 -0
  6. gitpane-1.0.0/pyproject.toml +93 -0
  7. gitpane-1.0.0/setup.cfg +4 -0
  8. gitpane-1.0.0/src/gitpane/__init__.py +0 -0
  9. gitpane-1.0.0/src/gitpane/account/__init__.py +0 -0
  10. gitpane-1.0.0/src/gitpane/account/account_choice.py +297 -0
  11. gitpane-1.0.0/src/gitpane/account/address_owner.py +67 -0
  12. gitpane-1.0.0/src/gitpane/account/authentication.py +1811 -0
  13. gitpane-1.0.0/src/gitpane/account/authentication_worker.py +836 -0
  14. gitpane-1.0.0/src/gitpane/account/credential_manager.py +480 -0
  15. gitpane-1.0.0/src/gitpane/account/credential_manager_install.py +171 -0
  16. gitpane-1.0.0/src/gitpane/account/keyring_reader.py +135 -0
  17. gitpane-1.0.0/src/gitpane/account/keyring_state.py +158 -0
  18. gitpane-1.0.0/src/gitpane/account/ssh.py +312 -0
  19. gitpane-1.0.0/src/gitpane/account/ssh_askpass.py +216 -0
  20. gitpane-1.0.0/src/gitpane/account/ssh_prompt.py +222 -0
  21. gitpane-1.0.0/src/gitpane/application.py +684 -0
  22. gitpane-1.0.0/src/gitpane/commit/__init__.py +0 -0
  23. gitpane-1.0.0/src/gitpane/commit/commit_metadata.py +88 -0
  24. gitpane-1.0.0/src/gitpane/commit/commit_push.py +276 -0
  25. gitpane-1.0.0/src/gitpane/commit/commit_write.py +830 -0
  26. gitpane-1.0.0/src/gitpane/config.py +1066 -0
  27. gitpane-1.0.0/src/gitpane/controller/__init__.py +0 -0
  28. gitpane-1.0.0/src/gitpane/controller/account_controller.py +677 -0
  29. gitpane-1.0.0/src/gitpane/controller/clone_controller.py +776 -0
  30. gitpane-1.0.0/src/gitpane/controller/close_readiness.py +212 -0
  31. gitpane-1.0.0/src/gitpane/controller/commit_timing_controller.py +566 -0
  32. gitpane-1.0.0/src/gitpane/controller/conflict_controller.py +885 -0
  33. gitpane-1.0.0/src/gitpane/controller/console_registry.py +38 -0
  34. gitpane-1.0.0/src/gitpane/controller/emoji_window_controller.py +95 -0
  35. gitpane-1.0.0/src/gitpane/controller/file_action_controller.py +479 -0
  36. gitpane-1.0.0/src/gitpane/controller/history_read_controller.py +671 -0
  37. gitpane-1.0.0/src/gitpane/controller/history_rewrite_controller.py +739 -0
  38. gitpane-1.0.0/src/gitpane/controller/navigation_controller.py +658 -0
  39. gitpane-1.0.0/src/gitpane/controller/opening_controller.py +375 -0
  40. gitpane-1.0.0/src/gitpane/controller/operation_policy.py +76 -0
  41. gitpane-1.0.0/src/gitpane/controller/rebase_controller.py +797 -0
  42. gitpane-1.0.0/src/gitpane/controller/rebase_editor_controller.py +309 -0
  43. gitpane-1.0.0/src/gitpane/controller/reference_form_controller.py +1677 -0
  44. gitpane-1.0.0/src/gitpane/controller/reference_read_controller.py +242 -0
  45. gitpane-1.0.0/src/gitpane/controller/refresh_controller.py +477 -0
  46. gitpane-1.0.0/src/gitpane/controller/replay_controller.py +805 -0
  47. gitpane-1.0.0/src/gitpane/controller/session_registry.py +337 -0
  48. gitpane-1.0.0/src/gitpane/controller/setting_controller.py +592 -0
  49. gitpane-1.0.0/src/gitpane/controller/shutdown_controller.py +345 -0
  50. gitpane-1.0.0/src/gitpane/controller/staging_controller.py +199 -0
  51. gitpane-1.0.0/src/gitpane/controller/staging_session_registry.py +47 -0
  52. gitpane-1.0.0/src/gitpane/controller/stash_controller.py +367 -0
  53. gitpane-1.0.0/src/gitpane/controller/transport_controller.py +813 -0
  54. gitpane-1.0.0/src/gitpane/controller/welcome_controller.py +102 -0
  55. gitpane-1.0.0/src/gitpane/controller/window_activation.py +116 -0
  56. gitpane-1.0.0/src/gitpane/controller/worktree_state_controller.py +169 -0
  57. gitpane-1.0.0/src/gitpane/emoji/__init__.py +0 -0
  58. gitpane-1.0.0/src/gitpane/emoji/emoji_catalogue.py +156 -0
  59. gitpane-1.0.0/src/gitpane/git_config/__init__.py +0 -0
  60. gitpane-1.0.0/src/gitpane/git_config/git_setting.py +441 -0
  61. gitpane-1.0.0/src/gitpane/history/__init__.py +0 -0
  62. gitpane-1.0.0/src/gitpane/history/avatar.py +241 -0
  63. gitpane-1.0.0/src/gitpane/history/file_history.py +359 -0
  64. gitpane-1.0.0/src/gitpane/history/graph.py +145 -0
  65. gitpane-1.0.0/src/gitpane/history/history_filter.py +31 -0
  66. gitpane-1.0.0/src/gitpane/history/history_parse.py +605 -0
  67. gitpane-1.0.0/src/gitpane/history/repository.py +1600 -0
  68. gitpane-1.0.0/src/gitpane/history/repository_value.py +341 -0
  69. gitpane-1.0.0/src/gitpane/history/revision.py +180 -0
  70. gitpane-1.0.0/src/gitpane/history/revision_file.py +182 -0
  71. gitpane-1.0.0/src/gitpane/history_rewrite/__init__.py +0 -0
  72. gitpane-1.0.0/src/gitpane/history_rewrite/graph.py +210 -0
  73. gitpane-1.0.0/src/gitpane/history_rewrite/guard.py +288 -0
  74. gitpane-1.0.0/src/gitpane/history_rewrite/index.py +125 -0
  75. gitpane-1.0.0/src/gitpane/history_rewrite/prepare.py +378 -0
  76. gitpane-1.0.0/src/gitpane/history_rewrite/protocol.py +320 -0
  77. gitpane-1.0.0/src/gitpane/history_rewrite/publish.py +444 -0
  78. gitpane-1.0.0/src/gitpane/history_rewrite/recovery.py +481 -0
  79. gitpane-1.0.0/src/gitpane/history_rewrite/value.py +229 -0
  80. gitpane-1.0.0/src/gitpane/operation/__init__.py +0 -0
  81. gitpane-1.0.0/src/gitpane/operation/console_line.py +313 -0
  82. gitpane-1.0.0/src/gitpane/operation/console_tone.py +76 -0
  83. gitpane-1.0.0/src/gitpane/operation/diagnostic.py +954 -0
  84. gitpane-1.0.0/src/gitpane/operation/launch_signature.py +254 -0
  85. gitpane-1.0.0/src/gitpane/operation/operation_status.py +87 -0
  86. gitpane-1.0.0/src/gitpane/operation/operation_trace.py +766 -0
  87. gitpane-1.0.0/src/gitpane/operation/repository_operation.py +781 -0
  88. gitpane-1.0.0/src/gitpane/preference/__init__.py +0 -0
  89. gitpane-1.0.0/src/gitpane/preference/preference_location.py +40 -0
  90. gitpane-1.0.0/src/gitpane/preference/preference_store.py +590 -0
  91. gitpane-1.0.0/src/gitpane/process/__init__.py +0 -0
  92. gitpane-1.0.0/src/gitpane/process/exact_arguments.py +77 -0
  93. gitpane-1.0.0/src/gitpane/process/git_output_text.py +20 -0
  94. gitpane-1.0.0/src/gitpane/process/process_group.py +851 -0
  95. gitpane-1.0.0/src/gitpane/process/process_log.py +114 -0
  96. gitpane-1.0.0/src/gitpane/process/process_runner.py +1033 -0
  97. gitpane-1.0.0/src/gitpane/process/released_child_watch.py +138 -0
  98. gitpane-1.0.0/src/gitpane/recent/__init__.py +0 -0
  99. gitpane-1.0.0/src/gitpane/recent/mount_table.py +422 -0
  100. gitpane-1.0.0/src/gitpane/recent/recent_availability.py +414 -0
  101. gitpane-1.0.0/src/gitpane/recent/recent_name.py +11 -0
  102. gitpane-1.0.0/src/gitpane/recent/recent_search.py +114 -0
  103. gitpane-1.0.0/src/gitpane/reference/__init__.py +0 -0
  104. gitpane-1.0.0/src/gitpane/reference/reference_edit.py +2030 -0
  105. gitpane-1.0.0/src/gitpane/reference/reference_snapshot.py +196 -0
  106. gitpane-1.0.0/src/gitpane/reference/stash.py +730 -0
  107. gitpane-1.0.0/src/gitpane/reference/stash_list.py +164 -0
  108. gitpane-1.0.0/src/gitpane/sequencer/__init__.py +0 -0
  109. gitpane-1.0.0/src/gitpane/sequencer/commit_message_rule.py +154 -0
  110. gitpane-1.0.0/src/gitpane/sequencer/conflict.py +506 -0
  111. gitpane-1.0.0/src/gitpane/sequencer/merge_recovery.py +163 -0
  112. gitpane-1.0.0/src/gitpane/sequencer/merge_state.py +166 -0
  113. gitpane-1.0.0/src/gitpane/sequencer/mergetool.py +856 -0
  114. gitpane-1.0.0/src/gitpane/sequencer/rebase.py +750 -0
  115. gitpane-1.0.0/src/gitpane/sequencer/rebase_edit_file.py +224 -0
  116. gitpane-1.0.0/src/gitpane/sequencer/rebase_state.py +523 -0
  117. gitpane-1.0.0/src/gitpane/sequencer/replay.py +1435 -0
  118. gitpane-1.0.0/src/gitpane/sequencer/replay_legacy.py +253 -0
  119. gitpane-1.0.0/src/gitpane/sequencer/replay_state.py +747 -0
  120. gitpane-1.0.0/src/gitpane/submodule/__init__.py +0 -0
  121. gitpane-1.0.0/src/gitpane/submodule/checkout_refusal.py +102 -0
  122. gitpane-1.0.0/src/gitpane/submodule/checkout_refusal_notice.py +111 -0
  123. gitpane-1.0.0/src/gitpane/submodule/cloned_without_checkout.py +65 -0
  124. gitpane-1.0.0/src/gitpane/submodule/submodule_discovery.py +1180 -0
  125. gitpane-1.0.0/src/gitpane/submodule/submodule_loss.py +218 -0
  126. gitpane-1.0.0/src/gitpane/system/__init__.py +0 -0
  127. gitpane-1.0.0/src/gitpane/system/appearance_portal.py +125 -0
  128. gitpane-1.0.0/src/gitpane/system/application_identity.py +48 -0
  129. gitpane-1.0.0/src/gitpane/system/command_line.py +36 -0
  130. gitpane-1.0.0/src/gitpane/system/desktop_icon_fact.py +128 -0
  131. gitpane-1.0.0/src/gitpane/system/desktop_icon_support.py +270 -0
  132. gitpane-1.0.0/src/gitpane/system/desktop_shortcut.py +536 -0
  133. gitpane-1.0.0/src/gitpane/system/icns_image.py +35 -0
  134. gitpane-1.0.0/src/gitpane/system/installed_launcher.py +136 -0
  135. gitpane-1.0.0/src/gitpane/system/linux_distribution.py +151 -0
  136. gitpane-1.0.0/src/gitpane/system/network_folder.py +46 -0
  137. gitpane-1.0.0/src/gitpane/system/path_identity.py +95 -0
  138. gitpane-1.0.0/src/gitpane/system/private_tree_removal.py +47 -0
  139. gitpane-1.0.0/src/gitpane/system/process_program.py +63 -0
  140. gitpane-1.0.0/src/gitpane/system/qt_folder.py +38 -0
  141. gitpane-1.0.0/src/gitpane/system/ready_channel_watch.py +67 -0
  142. gitpane-1.0.0/src/gitpane/system/startup_activation.py +65 -0
  143. gitpane-1.0.0/src/gitpane/system/terminal_detach.py +384 -0
  144. gitpane-1.0.0/src/gitpane/system/xdg_session.py +85 -0
  145. gitpane-1.0.0/src/gitpane/text/__init__.py +0 -0
  146. gitpane-1.0.0/src/gitpane/text/text_query.py +97 -0
  147. gitpane-1.0.0/src/gitpane/text/typed_path.py +75 -0
  148. gitpane-1.0.0/src/gitpane/text/typed_text.py +17 -0
  149. gitpane-1.0.0/src/gitpane/thread/__init__.py +0 -0
  150. gitpane-1.0.0/src/gitpane/thread/weak_signal.py +93 -0
  151. gitpane-1.0.0/src/gitpane/tool/__init__.py +0 -0
  152. gitpane-1.0.0/src/gitpane/tool/app_bundle.py +164 -0
  153. gitpane-1.0.0/src/gitpane/tool/desktop_text_editor.py +156 -0
  154. gitpane-1.0.0/src/gitpane/tool/difftool.py +429 -0
  155. gitpane-1.0.0/src/gitpane/tool/editor.py +445 -0
  156. gitpane-1.0.0/src/gitpane/tool/editor_bridge.py +193 -0
  157. gitpane-1.0.0/src/gitpane/tool/editor_recipe.py +481 -0
  158. gitpane-1.0.0/src/gitpane/tool/file_reveal.py +94 -0
  159. gitpane-1.0.0/src/gitpane/tool/git_executable.py +264 -0
  160. gitpane-1.0.0/src/gitpane/tool/git_version.py +62 -0
  161. gitpane-1.0.0/src/gitpane/tool/kdiff3.py +41 -0
  162. gitpane-1.0.0/src/gitpane/tool/kdiff3_install.py +162 -0
  163. gitpane-1.0.0/src/gitpane/tool/launch_services_text_editor.py +104 -0
  164. gitpane-1.0.0/src/gitpane/tool/mergetool_recipe.py +84 -0
  165. gitpane-1.0.0/src/gitpane/tool/system_editor_default.py +80 -0
  166. gitpane-1.0.0/src/gitpane/tool/system_text_editor.py +44 -0
  167. gitpane-1.0.0/src/gitpane/tool/system_tool.py +816 -0
  168. gitpane-1.0.0/src/gitpane/tool/terminal_recipe.py +390 -0
  169. gitpane-1.0.0/src/gitpane/transport/__init__.py +0 -0
  170. gitpane-1.0.0/src/gitpane/transport/branch_exchange.py +1690 -0
  171. gitpane-1.0.0/src/gitpane/transport/clone.py +1273 -0
  172. gitpane-1.0.0/src/gitpane/transport/credential_read_retry.py +35 -0
  173. gitpane-1.0.0/src/gitpane/transport/git_refusal.py +207 -0
  174. gitpane-1.0.0/src/gitpane/transport/push_tracking.py +121 -0
  175. gitpane-1.0.0/src/gitpane/transport/refusal_notice.py +225 -0
  176. gitpane-1.0.0/src/gitpane/transport/remote.py +747 -0
  177. gitpane-1.0.0/src/gitpane/transport/remote_config.py +544 -0
  178. gitpane-1.0.0/src/gitpane/ui/__init__.py +0 -0
  179. gitpane-1.0.0/src/gitpane/ui/console/__init__.py +0 -0
  180. gitpane-1.0.0/src/gitpane/ui/console/error_dialog.py +332 -0
  181. gitpane-1.0.0/src/gitpane/ui/console/operation_dialog.py +408 -0
  182. gitpane-1.0.0/src/gitpane/ui/console/operation_output.py +91 -0
  183. gitpane-1.0.0/src/gitpane/ui/console/operation_output_view.py +373 -0
  184. gitpane-1.0.0/src/gitpane/ui/emoji/__init__.py +0 -0
  185. gitpane-1.0.0/src/gitpane/ui/emoji/emoji_font.py +257 -0
  186. gitpane-1.0.0/src/gitpane/ui/emoji/emoji_grid.py +125 -0
  187. gitpane-1.0.0/src/gitpane/ui/emoji/emoji_window.py +154 -0
  188. gitpane-1.0.0/src/gitpane/ui/emoji/file_action_icon.py +131 -0
  189. gitpane-1.0.0/src/gitpane/ui/emoji/opentype_family_name.py +182 -0
  190. gitpane-1.0.0/src/gitpane/ui/history_rewrite/__init__.py +0 -0
  191. gitpane-1.0.0/src/gitpane/ui/history_rewrite/details.py +78 -0
  192. gitpane-1.0.0/src/gitpane/ui/history_rewrite/preview.py +565 -0
  193. gitpane-1.0.0/src/gitpane/ui/history_rewrite/preview_model.py +291 -0
  194. gitpane-1.0.0/src/gitpane/ui/history_rewrite/question.py +87 -0
  195. gitpane-1.0.0/src/gitpane/ui/history_rewrite/recovery_dialog.py +262 -0
  196. gitpane-1.0.0/src/gitpane/ui/look/__init__.py +0 -0
  197. gitpane-1.0.0/src/gitpane/ui/look/action_icon.py +504 -0
  198. gitpane-1.0.0/src/gitpane/ui/look/application_icon.py +78 -0
  199. gitpane-1.0.0/src/gitpane/ui/look/application_style.py +317 -0
  200. gitpane-1.0.0/src/gitpane/ui/look/avatar_label.py +53 -0
  201. gitpane-1.0.0/src/gitpane/ui/look/color_contrast.py +43 -0
  202. gitpane-1.0.0/src/gitpane/ui/look/desktop_appearance_follower.py +118 -0
  203. gitpane-1.0.0/src/gitpane/ui/look/fixed_font.py +21 -0
  204. gitpane-1.0.0/src/gitpane/ui/look/gtk_settings.py +116 -0
  205. gitpane-1.0.0/src/gitpane/ui/look/icon_density.py +16 -0
  206. gitpane-1.0.0/src/gitpane/ui/look/reference_font.py +19 -0
  207. gitpane-1.0.0/src/gitpane/ui/look/theme_color.py +63 -0
  208. gitpane-1.0.0/src/gitpane/ui/look/theme_look.py +95 -0
  209. gitpane-1.0.0/src/gitpane/ui/look/theme_palette.py +173 -0
  210. gitpane-1.0.0/src/gitpane/ui/look/warning_icon.py +86 -0
  211. gitpane-1.0.0/src/gitpane/ui/look/windows_control_look.py +250 -0
  212. gitpane-1.0.0/src/gitpane/ui/reader/__init__.py +0 -0
  213. gitpane-1.0.0/src/gitpane/ui/reader/commit_message.py +129 -0
  214. gitpane-1.0.0/src/gitpane/ui/reader/commit_panel.py +378 -0
  215. gitpane-1.0.0/src/gitpane/ui/reader/diff_panel.py +626 -0
  216. gitpane-1.0.0/src/gitpane/ui/reader/file_action.py +138 -0
  217. gitpane-1.0.0/src/gitpane/ui/reader/file_tree_panel.py +235 -0
  218. gitpane-1.0.0/src/gitpane/ui/reader/reader_toolbar.py +56 -0
  219. gitpane-1.0.0/src/gitpane/ui/reader/revision_tree.py +80 -0
  220. gitpane-1.0.0/src/gitpane/ui/reader/search_result.py +165 -0
  221. gitpane-1.0.0/src/gitpane/ui/reader/source_text.py +134 -0
  222. gitpane-1.0.0/src/gitpane/ui/reader/source_view.py +151 -0
  223. gitpane-1.0.0/src/gitpane/ui/reader/syntax_span.py +67 -0
  224. gitpane-1.0.0/src/gitpane/ui/reference/__init__.py +0 -0
  225. gitpane-1.0.0/src/gitpane/ui/reference/branch_selector.py +106 -0
  226. gitpane-1.0.0/src/gitpane/ui/reference/checkout_dialog.py +419 -0
  227. gitpane-1.0.0/src/gitpane/ui/reference/checkout_revision_dialog.py +182 -0
  228. gitpane-1.0.0/src/gitpane/ui/reference/commit_summary.py +339 -0
  229. gitpane-1.0.0/src/gitpane/ui/reference/create_branch_dialog.py +346 -0
  230. gitpane-1.0.0/src/gitpane/ui/reference/create_tag_dialog.py +283 -0
  231. gitpane-1.0.0/src/gitpane/ui/reference/delete_local_branch_dialog.py +323 -0
  232. gitpane-1.0.0/src/gitpane/ui/reference/delete_tag_dialog.py +394 -0
  233. gitpane-1.0.0/src/gitpane/ui/reference/form_opening.py +53 -0
  234. gitpane-1.0.0/src/gitpane/ui/reference/reference_dialog.py +417 -0
  235. gitpane-1.0.0/src/gitpane/ui/reference/reference_feedback.py +62 -0
  236. gitpane-1.0.0/src/gitpane/ui/reference/reference_form.py +139 -0
  237. gitpane-1.0.0/src/gitpane/ui/reference/rename_branch_dialog.py +179 -0
  238. gitpane-1.0.0/src/gitpane/ui/reference/reset_branch_dialog.py +430 -0
  239. gitpane-1.0.0/src/gitpane/ui/reference/reset_dialog.py +263 -0
  240. gitpane-1.0.0/src/gitpane/ui/reference/revision_dialog.py +121 -0
  241. gitpane-1.0.0/src/gitpane/ui/reference/revision_picker.py +227 -0
  242. gitpane-1.0.0/src/gitpane/ui/reference/select_branches_dialog.py +199 -0
  243. gitpane-1.0.0/src/gitpane/ui/reference/stash_dialog.py +171 -0
  244. gitpane-1.0.0/src/gitpane/ui/repository/__init__.py +0 -0
  245. gitpane-1.0.0/src/gitpane/ui/repository/graph_delegate.py +298 -0
  246. gitpane-1.0.0/src/gitpane/ui/repository/history_avatar.py +130 -0
  247. gitpane-1.0.0/src/gitpane/ui/repository/history_model.py +179 -0
  248. gitpane-1.0.0/src/gitpane/ui/repository/repository_list_popup.py +319 -0
  249. gitpane-1.0.0/src/gitpane/ui/repository/repository_window.py +2580 -0
  250. gitpane-1.0.0/src/gitpane/ui/resource/ArrowDown.png +0 -0
  251. gitpane-1.0.0/src/gitpane/ui/resource/ArrowUp.png +0 -0
  252. gitpane-1.0.0/src/gitpane/ui/resource/BranchCheckout.png +0 -0
  253. gitpane-1.0.0/src/gitpane/ui/resource/BranchCreate.png +0 -0
  254. gitpane-1.0.0/src/gitpane/ui/resource/BranchDelete.png +0 -0
  255. gitpane-1.0.0/src/gitpane/ui/resource/CopyToClipboard.png +0 -0
  256. gitpane-1.0.0/src/gitpane/ui/resource/GitPane-16.png +0 -0
  257. gitpane-1.0.0/src/gitpane/ui/resource/GitPane-24.png +0 -0
  258. gitpane-1.0.0/src/gitpane/ui/resource/GitPane-256.png +0 -0
  259. gitpane-1.0.0/src/gitpane/ui/resource/GitPane-32.png +0 -0
  260. gitpane-1.0.0/src/gitpane/ui/resource/GitPane-48.png +0 -0
  261. gitpane-1.0.0/src/gitpane/ui/resource/GitPane-64.png +0 -0
  262. gitpane-1.0.0/src/gitpane/ui/resource/GitPane.ico +0 -0
  263. gitpane-1.0.0/src/gitpane/ui/resource/NotoColorEmoji-OFL.txt +92 -0
  264. gitpane-1.0.0/src/gitpane/ui/resource/NotoColorEmoji_WindowsCompatible.ttf +0 -0
  265. gitpane-1.0.0/src/gitpane/ui/resource/Renamed.png +0 -0
  266. gitpane-1.0.0/src/gitpane/ui/resource/ResetAnotherBranchToHere.png +0 -0
  267. gitpane-1.0.0/src/gitpane/ui/resource/ResetCurrentBranchToHere.png +0 -0
  268. gitpane-1.0.0/src/gitpane/ui/resource/Stash.png +0 -0
  269. gitpane-1.0.0/src/gitpane/ui/resource/Tag.png +0 -0
  270. gitpane-1.0.0/src/gitpane/ui/resource/TagCreate.png +0 -0
  271. gitpane-1.0.0/src/gitpane/ui/resource/TagDelete.png +0 -0
  272. gitpane-1.0.0/src/gitpane/ui/resource/Unmerged.png +0 -0
  273. gitpane-1.0.0/src/gitpane/ui/resource/checkout.png +0 -0
  274. gitpane-1.0.0/src/gitpane/ui/sequencer/__init__.py +0 -0
  275. gitpane-1.0.0/src/gitpane/ui/sequencer/conflict_dialog.py +532 -0
  276. gitpane-1.0.0/src/gitpane/ui/sequencer/merge_recovery_dialog.py +67 -0
  277. gitpane-1.0.0/src/gitpane/ui/sequencer/rebase_dialog.py +461 -0
  278. gitpane-1.0.0/src/gitpane/ui/sequencer/rebase_editor_window.py +220 -0
  279. gitpane-1.0.0/src/gitpane/ui/sequencer/replay_conflict_prompt.py +105 -0
  280. gitpane-1.0.0/src/gitpane/ui/sequencer/replay_dialog.py +501 -0
  281. gitpane-1.0.0/src/gitpane/ui/setting/__init__.py +0 -0
  282. gitpane-1.0.0/src/gitpane/ui/setting/account_page.py +724 -0
  283. gitpane-1.0.0/src/gitpane/ui/setting/add_account_dialog.py +1005 -0
  284. gitpane-1.0.0/src/gitpane/ui/setting/credential_manager_dialog.py +151 -0
  285. gitpane-1.0.0/src/gitpane/ui/setting/git_setting_widget.py +388 -0
  286. gitpane-1.0.0/src/gitpane/ui/setting/setting_block.py +19 -0
  287. gitpane-1.0.0/src/gitpane/ui/setting/setting_dialog.py +750 -0
  288. gitpane-1.0.0/src/gitpane/ui/setting/ssh_widget.py +232 -0
  289. gitpane-1.0.0/src/gitpane/ui/setting/utility_page.py +240 -0
  290. gitpane-1.0.0/src/gitpane/ui/staging/__init__.py +0 -0
  291. gitpane-1.0.0/src/gitpane/ui/staging/staging_action.py +356 -0
  292. gitpane-1.0.0/src/gitpane/ui/staging/staging_window.py +745 -0
  293. gitpane-1.0.0/src/gitpane/ui/transport/__init__.py +0 -0
  294. gitpane-1.0.0/src/gitpane/ui/transport/clone_dialog.py +879 -0
  295. gitpane-1.0.0/src/gitpane/ui/transport/push_dialog.py +580 -0
  296. gitpane-1.0.0/src/gitpane/ui/transport/push_rejection_prompt.py +100 -0
  297. gitpane-1.0.0/src/gitpane/ui/transport/push_tracking_question.py +88 -0
  298. gitpane-1.0.0/src/gitpane/ui/transport/remote_dialog.py +943 -0
  299. gitpane-1.0.0/src/gitpane/ui/welcome/__init__.py +0 -0
  300. gitpane-1.0.0/src/gitpane/ui/welcome/invalid_repository_prompt.py +114 -0
  301. gitpane-1.0.0/src/gitpane/ui/welcome/welcome_window.py +1137 -0
  302. gitpane-1.0.0/src/gitpane/ui/widget/__init__.py +0 -0
  303. gitpane-1.0.0/src/gitpane/ui/widget/busy_indicator.py +106 -0
  304. gitpane-1.0.0/src/gitpane/ui/widget/commit_date_text.py +55 -0
  305. gitpane-1.0.0/src/gitpane/ui/widget/content_growth.py +262 -0
  306. gitpane-1.0.0/src/gitpane/ui/widget/content_measure.py +99 -0
  307. gitpane-1.0.0/src/gitpane/ui/widget/dialog_layout.py +668 -0
  308. gitpane-1.0.0/src/gitpane/ui/widget/drop_down_wheel_filter.py +32 -0
  309. gitpane-1.0.0/src/gitpane/ui/widget/flow_layout.py +110 -0
  310. gitpane-1.0.0/src/gitpane/ui/widget/long_text.py +542 -0
  311. gitpane-1.0.0/src/gitpane/ui/widget/mnemonic.py +13 -0
  312. gitpane-1.0.0/src/gitpane/ui/widget/numbered_text_edit.py +127 -0
  313. gitpane-1.0.0/src/gitpane/ui/widget/plain_label.py +15 -0
  314. gitpane-1.0.0/src/gitpane/ui/widget/plain_tooltip.py +19 -0
  315. gitpane-1.0.0/src/gitpane/ui/widget/refresh_advice.py +25 -0
  316. gitpane-1.0.0/src/gitpane/ui/widget/result_label.py +227 -0
  317. gitpane-1.0.0/src/gitpane/ui/widget/result_status_bar.py +53 -0
  318. gitpane-1.0.0/src/gitpane/ui/widget/scrolled_text.py +69 -0
  319. gitpane-1.0.0/src/gitpane/ui/widget/shortcut_text.py +31 -0
  320. gitpane-1.0.0/src/gitpane/ui/widget/standard_icon_label.py +55 -0
  321. gitpane-1.0.0/src/gitpane/ui/widget/system_shortcut.py +75 -0
  322. gitpane-1.0.0/src/gitpane/ui/widget/unavailable_reason.py +29 -0
  323. gitpane-1.0.0/src/gitpane/ui/widget/wheel_safe_drop_down.py +24 -0
  324. gitpane-1.0.0/src/gitpane/ui/window_control/__init__.py +0 -0
  325. gitpane-1.0.0/src/gitpane/ui/window_control/button_focus.py +42 -0
  326. gitpane-1.0.0/src/gitpane/ui/window_control/compositor_answer.py +152 -0
  327. gitpane-1.0.0/src/gitpane/ui/window_control/compositor_growth_cap.py +73 -0
  328. gitpane-1.0.0/src/gitpane/ui/window_control/desktop_activation.py +203 -0
  329. gitpane-1.0.0/src/gitpane/ui/window_control/dialog_modality.py +122 -0
  330. gitpane-1.0.0/src/gitpane/ui/window_control/item_activation.py +42 -0
  331. gitpane-1.0.0/src/gitpane/ui/window_control/modal_focus_relay.py +124 -0
  332. gitpane-1.0.0/src/gitpane/ui/window_control/wayland_activation.py +695 -0
  333. gitpane-1.0.0/src/gitpane/ui/window_control/window_placement.py +305 -0
  334. gitpane-1.0.0/src/gitpane/vendor/DISTLIB-LICENSE.txt +284 -0
  335. gitpane-1.0.0/src/gitpane/vendor/w32.exe +0 -0
  336. gitpane-1.0.0/src/gitpane/vendor/w64-arm.exe +0 -0
  337. gitpane-1.0.0/src/gitpane/vendor/w64.exe +0 -0
  338. gitpane-1.0.0/src/gitpane/worktree/__init__.py +0 -0
  339. gitpane-1.0.0/src/gitpane/worktree/command_sequence.py +110 -0
  340. gitpane-1.0.0/src/gitpane/worktree/file_action_target.py +61 -0
  341. gitpane-1.0.0/src/gitpane/worktree/file_menu_action.py +52 -0
  342. gitpane-1.0.0/src/gitpane/worktree/historical_restore.py +361 -0
  343. gitpane-1.0.0/src/gitpane/worktree/ignore_rule.py +266 -0
  344. gitpane-1.0.0/src/gitpane/worktree/mutation.py +1539 -0
  345. gitpane-1.0.0/src/gitpane/worktree/partial_patch.py +435 -0
  346. gitpane-1.0.0/src/gitpane/worktree/staged_reset.py +447 -0
  347. gitpane-1.0.0/src/gitpane/worktree/staging.py +1418 -0
  348. gitpane-1.0.0/src/gitpane/worktree/trash.py +302 -0
  349. gitpane-1.0.0/src/gitpane/worktree/worktree_file.py +406 -0
  350. gitpane-1.0.0/src/gitpane/worktree/worktree_service.py +584 -0
  351. gitpane-1.0.0/src/gitpane/worktree/worktree_snapshot.py +630 -0
  352. gitpane-1.0.0/src/gitpane.egg-info/PKG-INFO +141 -0
  353. gitpane-1.0.0/src/gitpane.egg-info/SOURCES.txt +355 -0
  354. gitpane-1.0.0/src/gitpane.egg-info/dependency_links.txt +1 -0
  355. gitpane-1.0.0/src/gitpane.egg-info/entry_points.txt +2 -0
  356. gitpane-1.0.0/src/gitpane.egg-info/requires.txt +23 -0
  357. gitpane-1.0.0/src/gitpane.egg-info/top_level.txt +1 -0
gitpane-1.0.0/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Thongvan Alexis
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,2 @@
1
+ prune tests
2
+ exclude README.md
gitpane-1.0.0/PKG-INFO ADDED
@@ -0,0 +1,141 @@
1
+ Metadata-Version: 2.4
2
+ Name: gitpane
3
+ Version: 1.0.0
4
+ Summary: Lightweight desktop Git client for Windows, Linux and macOS, in the spirit of Git Extensions
5
+ Author: Thongvan Alexis
6
+ License-Expression: MIT AND OFL-1.1 AND PSF-2.0
7
+ Classifier: Development Status :: 5 - Production/Stable
8
+ Classifier: Environment :: X11 Applications :: Qt
9
+ Classifier: Environment :: MacOS X
10
+ Classifier: Environment :: Win32 (MS Windows)
11
+ Classifier: Intended Audience :: Developers
12
+ Classifier: Natural Language :: English
13
+ Classifier: Operating System :: Microsoft :: Windows :: Windows 10
14
+ Classifier: Operating System :: POSIX :: Linux
15
+ Classifier: Operating System :: MacOS
16
+ Classifier: Programming Language :: Python :: 3 :: Only
17
+ Classifier: Programming Language :: Python :: 3.13
18
+ Classifier: Programming Language :: Python :: 3.14
19
+ Classifier: Topic :: Software Development :: Version Control :: Git
20
+ Requires-Python: <3.15,>=3.13
21
+ Description-Content-Type: text/markdown
22
+ License-File: LICENSE
23
+ License-File: THIRD_PARTY_NOTICES.md
24
+ License-File: src/gitpane/ui/resource/NotoColorEmoji-OFL.txt
25
+ License-File: src/gitpane/vendor/DISTLIB-LICENSE.txt
26
+ Requires-Dist: PySide6-Essentials<6.12,>=6.11.2
27
+ Requires-Dist: Pygments<3,>=2.21
28
+ Provides-Extra: dev
29
+ Requires-Dist: PySide6-Essentials==6.11.2; extra == "dev"
30
+ Requires-Dist: shiboken6==6.11.2; extra == "dev"
31
+ Requires-Dist: Pygments==2.21.0; extra == "dev"
32
+ Requires-Dist: pip==26.2.1; extra == "dev"
33
+ Requires-Dist: setuptools==84.0.0; extra == "dev"
34
+ Requires-Dist: pytest==9.1.1; extra == "dev"
35
+ Requires-Dist: pytest-qt==4.5.0; extra == "dev"
36
+ Requires-Dist: pytest-xdist==3.8.0; extra == "dev"
37
+ Requires-Dist: execnet==2.1.2; extra == "dev"
38
+ Requires-Dist: ruff==0.16.6; extra == "dev"
39
+ Requires-Dist: colorama==0.4.6; sys_platform == "win32" and extra == "dev"
40
+ Requires-Dist: iniconfig==2.3.0; extra == "dev"
41
+ Requires-Dist: packaging==26.3; extra == "dev"
42
+ Requires-Dist: pluggy==1.6.0; extra == "dev"
43
+ Requires-Dist: typing_extensions==4.16.0; extra == "dev"
44
+ Requires-Dist: build==1.6.1; extra == "dev"
45
+ Requires-Dist: pyproject_hooks==1.3.3; extra == "dev"
46
+ Dynamic: license-file
47
+
48
+ # GitPane
49
+
50
+ GitPane is a Git Extensions clone that runs on Windows, macOS and most Linux distributions. I only reimplemented the features I have used every day for the past 16 years.
51
+
52
+ GitPane needs Git and Python 3.13 or 3.14 (Python 3.15 is not supported yet).
53
+
54
+ ## Install
55
+
56
+ Install GitPane with pipx: it creates a private environment for GitPane and puts the `gitpane` command on your PATH. On Linux and macOS, the system Python does not accept new packages, so pipx is the simple way (regular pip into a venv of your own also works).
57
+
58
+ ---
59
+ ### macOS
60
+
61
+ ```bash
62
+ brew install python@3.13 pipx
63
+ pipx ensurepath
64
+ ```
65
+
66
+ In a **new** terminal:
67
+
68
+ ```bash
69
+ pipx install --python python3.13 gitpane
70
+ ```
71
+
72
+ Run `gitpane` in any terminal, then click **Settings › Utilities › Create desktop shortcut** to get a launcher on your desktop.
73
+
74
+ ---
75
+ ### Linux
76
+
77
+ Fedora:
78
+
79
+ ```bash
80
+ sudo dnf install pipx
81
+ pipx ensurepath
82
+ ```
83
+
84
+ Ubuntu and Debian:
85
+
86
+ ```bash
87
+ sudo apt update
88
+ sudo apt install pipx libxcb-cursor0 # required for X11 versions of linux
89
+ pipx ensurepath
90
+ ```
91
+
92
+ In a **new** terminal:
93
+
94
+ ```bash
95
+ pipx install gitpane
96
+ ```
97
+
98
+ Run `gitpane` in any terminal, then click **Settings › Utilities › Create desktop shortcut** to get a launcher on your desktop.
99
+
100
+ ---
101
+ ### Windows
102
+
103
+ Install Python 3.14 from [python.org](https://www.python.org/downloads/windows/), then in PowerShell or Command Prompt:
104
+
105
+ ```powershell
106
+ python -m pip install --user pipx
107
+ python -m pipx ensurepath
108
+ ```
109
+
110
+ pip may warn that `pipx.exe` is not on PATH: `ensurepath` has just fixed that.
111
+
112
+ In a **new** terminal:
113
+
114
+ ```powershell
115
+ pipx install gitpane
116
+ ```
117
+ Run `gitpane` in any terminal, then click **Settings › Utilities › Create desktop shortcut** to get a launcher on your desktop.
118
+
119
+ ## Update
120
+
121
+ Close GitPane, then:
122
+
123
+ ```bash
124
+ pipx upgrade gitpane
125
+ ```
126
+
127
+ ---
128
+ ## Command line
129
+
130
+ - `gitpane` starts GitPane and gives the terminal back. Closing the terminal does not close GitPane.
131
+ - `gitpane --attach` keeps GitPane attached to the terminal: its output and errors are shown there, and Ctrl+C stops it.
132
+ - `gitpane --log` writes a diagnostic log and shows its path.
133
+ - `gitpane --version` prints the version (Linux and macOS).
134
+
135
+ ## When gitpane is not found
136
+
137
+ Run `pipx ensurepath` again (`python -m pipx ensurepath` on Windows), then open a **new** terminal: the PATH change only reaches terminals opened after it.
138
+
139
+ ## License
140
+
141
+ GitPane is under the MIT license. It ships the Noto Color Emoji font under the SIL Open Font License 1.1 (OFL-1.1) and the Windows launchers of distlib under the Python Software Foundation License 2.0 (PSF-2.0).
@@ -0,0 +1,109 @@
1
+ # Third-party notices
2
+
3
+ ## GitPane action drawings
4
+
5
+ The maintainer supplied thirteen redrawn PNGs on 2026-09-13 in commit `63b30122579ee3ba7fbedded70b4fc164b8a6ebd`, replacing the previously imported images. Those files are preserved byte for byte. The provenance below records that maintainer declaration; it does not assign an additional image-specific license or make a legal assurance.
6
+
7
+ Stash and Resolve are original geometric drawings created for GitPane with the existing Qt drawing language. Their maintained source is [tools/draw_conflict_icon.py](tools/draw_conflict_icon.py), using the existing gold palette and green action color. They were neither copied nor traced from upstream artwork. Regenerate only those two files with `.venv/Scripts/python.exe tools/draw_conflict_icon.py`. Runtime resources are the local PNG files under `src/gitpane/ui/resource/`.
8
+
9
+ The "Choose another revision" button icon of the Cherry pick commit form (a list sheet with one highlighted row and a mouse pointer) is an original geometric drawing created for GitPane with the same Qt drawing language. It is painted at runtime by `_paint_revision_choice` in [src/gitpane/ui/look/action_icon.py](src/gitpane/ui/look/action_icon.py) and has no image file. It was neither copied nor traced from Git Extensions or any other upstream artwork.
10
+
11
+ The "Rebase current branch here interactively" entry of the history graph menu (a grey target branch with three commits, two blue commits beside it and a curved blue arrow bringing them down onto the target) is an original geometric drawing created for GitPane from the maintainer's own hand sketch, with the same Qt drawing language. It is painted at runtime by `_paint_rebase` in [src/gitpane/ui/look/action_icon.py](src/gitpane/ui/look/action_icon.py) and has no image file. It was neither copied nor traced from Git Extensions or any other upstream artwork.
12
+
13
+ The "Stash pop" toolbar icon (the Stash tray with its sheet raised out of it and a green arrow pointing up on the sheet) is an original geometric drawing created for GitPane, chosen by the maintainer on 2026-09-19 among four GitPane sketches. It reuses the tray geometry of GitPane's own Stash drawing and the existing gold and green palette. It is painted at runtime by `_paint_stash_pop` in [src/gitpane/ui/look/action_icon.py](src/gitpane/ui/look/action_icon.py) and has no image file. It was neither copied nor traced from Git Extensions or any other upstream artwork.
14
+
15
+ ### ArrowDown.png
16
+
17
+ - **Source:** Redrawn PNG supplied by the maintainer; source commit: `63b30122579ee3ba7fbedded70b4fc164b8a6ebd`.
18
+ - **SHA-256:** `dec43df395521333c878595143d987187bb86351fb4debd4dbd67bda23fec423`.
19
+
20
+ ### ArrowUp.png
21
+
22
+ - **Source:** Redrawn PNG supplied by the maintainer; source commit: `63b30122579ee3ba7fbedded70b4fc164b8a6ebd`.
23
+ - **SHA-256:** `58934c6cef434c249c08553d4c6cff36ffcbdb3c5fb553fd8e29e805fe0e29c2`.
24
+
25
+ ### BranchCheckout.png
26
+
27
+ - **Source:** Redrawn PNG supplied by the maintainer; source commit: `63b30122579ee3ba7fbedded70b4fc164b8a6ebd`.
28
+ - **SHA-256:** `6331408167f5ef106d0a743c10c67ea98d3aa9abe1732e6a782c24d6dc3db9fb`.
29
+
30
+ ### BranchCreate.png
31
+
32
+ - **Source:** Redrawn PNG supplied by the maintainer; source commit: `63b30122579ee3ba7fbedded70b4fc164b8a6ebd`.
33
+ - **SHA-256:** `e782a8bc0fcd78358ba4f75ae498f4b284b814315c82ea22cf8f881d043254d2`.
34
+
35
+ ### BranchDelete.png
36
+
37
+ - **Source:** Redrawn PNG supplied by the maintainer; source commit: `63b30122579ee3ba7fbedded70b4fc164b8a6ebd`.
38
+ - **SHA-256:** `017fb620a4b964660e33eb410663304f9e193f0b3211a2cc010145524e67fbe9`.
39
+
40
+ ### checkout.png
41
+
42
+ - **Source:** Redrawn PNG supplied by the maintainer; source commit: `63b30122579ee3ba7fbedded70b4fc164b8a6ebd`.
43
+ - **SHA-256:** `13838b8d23962c88d3013b257acbf7826bf37dc3c12615dfbb7e1aecd52e5e49`.
44
+
45
+ ### CopyToClipboard.png
46
+
47
+ - **Source:** Redrawn PNG supplied by the maintainer; source commit: `63b30122579ee3ba7fbedded70b4fc164b8a6ebd`.
48
+ - **SHA-256:** `bdfe68b3e706135122914f4c4d46f0dcdaaf8688ea955f01b0d217bf01a23280`.
49
+
50
+ ### Renamed.png
51
+
52
+ - **Source:** Redrawn PNG supplied by the maintainer; source commit: `63b30122579ee3ba7fbedded70b4fc164b8a6ebd`.
53
+ - **SHA-256:** `9236c87cacd29b3c67f7be979a54acd7e76f0530c34e85417a15b79461b79bec`.
54
+
55
+ ### ResetAnotherBranchToHere.png
56
+
57
+ - **Source:** Redrawn PNG supplied by the maintainer; source commit: `63b30122579ee3ba7fbedded70b4fc164b8a6ebd`.
58
+ - **SHA-256:** `f1ec601281ebee395d576ec659f3e98ce01f5c36a9deb15c607ddc9ddc76c222`.
59
+
60
+ ### ResetCurrentBranchToHere.png
61
+
62
+ - **Source:** Redrawn PNG supplied by the maintainer; source commit: `63b30122579ee3ba7fbedded70b4fc164b8a6ebd`.
63
+ - **SHA-256:** `7a39350f2ac63f4e91202f0064883ec1e85668b9faea8d9afc62318c03ae482e`.
64
+
65
+ ### Stash.png
66
+
67
+ - **Source:** Original GitPane drawing; source: `tools/draw_conflict_icon.py`.
68
+ - **SHA-256:** `5af52be7748964ba97d24c072dae43e20f7b759a37fafac332effdc17decc83f`.
69
+
70
+ ### Tag.png
71
+
72
+ - **Source:** Redrawn PNG supplied by the maintainer; source commit: `63b30122579ee3ba7fbedded70b4fc164b8a6ebd`.
73
+ - **SHA-256:** `3bdcc3b37825a0625f18e0981a5739bb3cacbb080822972a16bca31ab67a2a91`.
74
+
75
+ ### TagCreate.png
76
+
77
+ - **Source:** Redrawn PNG supplied by the maintainer; source commit: `63b30122579ee3ba7fbedded70b4fc164b8a6ebd`.
78
+ - **SHA-256:** `f5e8722cfcf1142c22c6e0681ab8dc3548c041ec6bb228628a5cbc1a1d859e59`.
79
+
80
+ ### TagDelete.png
81
+
82
+ - **Source:** Redrawn PNG supplied by the maintainer; source commit: `63b30122579ee3ba7fbedded70b4fc164b8a6ebd`.
83
+ - **SHA-256:** `2d3edb0b95432ac2c10d404973f35e7681db354fde99720e941544874068d7fc`.
84
+
85
+ ### Unmerged.png
86
+
87
+ - **Source:** Original GitPane drawing; source: `tools/draw_conflict_icon.py`.
88
+ - **SHA-256:** `6d30f86d97d1e9b8188b4a5976cad90b8c0574d10b862356e2cff6fcea79c905`.
89
+
90
+ ## distlib Windows launchers
91
+
92
+ GitPane bundles the unchanged windowless x86, x64 and ARM64 launchers from **distlib 0.4.2**, as distributed inside the project's pinned **pip 26.2.1**. These resource bytes let OpenSSH run a native askpass executable without a console or a runtime dependency on pip. GitPane appends its own isolated-Python entry script in a private temporary directory for each operation; the original resources remain unchanged.
93
+
94
+ Source: [pypa/distlib](https://github.com/pypa/distlib), `PC/launcher.c`; upstream tutorial: [script launchers](https://distlib.readthedocs.io/en/latest/tutorial.html#using-the-scripts-api). Copyright Vinay Sajip and contributors; distributed under the Python Software Foundation license. The complete upstream license is bundled at `src/gitpane/vendor/DISTLIB-LICENSE.txt` and included in wheel package data.
95
+
96
+ | Resource | SHA-256 |
97
+ |---|---|
98
+ | `vendor/w32.exe` | `47872cc77f8e18cf642f868f23340a468e537e64521d9a3a416c8b84384d064b` |
99
+ | `vendor/w64.exe` | `7a319ffaba23a017d7b1e18ba726ba6c54c53d6446db55f92af53c279894f8ad` |
100
+ | `vendor/w64-arm.exe` | `c5dc9884a8f458371550e09bd396e5418bf375820a31b9899f6499bf391c7b2e` |
101
+
102
+ ## Noto Color Emoji
103
+
104
+ Noto Color Emoji 2.057 by Google, Windows-compatible build, is the colour font of the emoji keyboard grid and of the Commit message field. It is shipped complete, without any modification and under its upstream file name `NotoColorEmoji_WindowsCompatible.ttf`, in `src/gitpane/ui/resource/`. Symbols Noto does not have, such as the bold italic small i, the black rightwards arrowhead and the combining marks, are drawn by the system fonts; no other font is bundled.
105
+
106
+ - **Source:** https://raw.githubusercontent.com/googlefonts/noto-emoji/v2026-09-24-unicode18_0/2D/fonts/NotoColorEmoji_WindowsCompatible.ttf (10739048 bytes).
107
+ - **SHA-256:** `2c7ede2f5438f9c1da098778bd681535933a345334008bb03fc51119f6b1cd72`.
108
+ - **License:** SIL Open Font License 1.1. The shipped copy `src/gitpane/ui/resource/NotoColorEmoji-OFL.txt` is a byte for byte copy of https://raw.githubusercontent.com/googlefonts/noto-emoji/v2026-09-24-unicode18_0/2D/fonts/LICENSE, SHA-256 `6a73f9541c2de74158c0e7cf6b0a58ef774f5a780bf191f2d7ec9cc53efe2bf2`. The notice "Copyright 2022 Google Inc." stays inside the unmodified font.
109
+ - **Tool:** [tools/fetch_emoji_font.py](tools/fetch_emoji_font.py) downloads both files at the pinned tag and refuses any file whose SHA-256 differs. Run `.venv/Scripts/python.exe tools/fetch_emoji_font.py`; it downloads nothing when both files are already in place with the right hash.
@@ -0,0 +1,94 @@
1
+ # GitPane
2
+
3
+ GitPane is a Git Extensions clone that runs on Windows, macOS and most Linux distributions. I only reimplemented the features I have used every day for the past 16 years.
4
+
5
+ GitPane needs Git and Python 3.13 or 3.14 (Python 3.15 is not supported yet).
6
+
7
+ ## Install
8
+
9
+ Install GitPane with pipx: it creates a private environment for GitPane and puts the `gitpane` command on your PATH. On Linux and macOS, the system Python does not accept new packages, so pipx is the simple way (regular pip into a venv of your own also works).
10
+
11
+ ---
12
+ ### macOS
13
+
14
+ ```bash
15
+ brew install python@3.13 pipx
16
+ pipx ensurepath
17
+ ```
18
+
19
+ In a **new** terminal:
20
+
21
+ ```bash
22
+ pipx install --python python3.13 gitpane
23
+ ```
24
+
25
+ Run `gitpane` in any terminal, then click **Settings › Utilities › Create desktop shortcut** to get a launcher on your desktop.
26
+
27
+ ---
28
+ ### Linux
29
+
30
+ Fedora:
31
+
32
+ ```bash
33
+ sudo dnf install pipx
34
+ pipx ensurepath
35
+ ```
36
+
37
+ Ubuntu and Debian:
38
+
39
+ ```bash
40
+ sudo apt update
41
+ sudo apt install pipx libxcb-cursor0 # required for X11 versions of linux
42
+ pipx ensurepath
43
+ ```
44
+
45
+ In a **new** terminal:
46
+
47
+ ```bash
48
+ pipx install gitpane
49
+ ```
50
+
51
+ Run `gitpane` in any terminal, then click **Settings › Utilities › Create desktop shortcut** to get a launcher on your desktop.
52
+
53
+ ---
54
+ ### Windows
55
+
56
+ Install Python 3.14 from [python.org](https://www.python.org/downloads/windows/), then in PowerShell or Command Prompt:
57
+
58
+ ```powershell
59
+ python -m pip install --user pipx
60
+ python -m pipx ensurepath
61
+ ```
62
+
63
+ pip may warn that `pipx.exe` is not on PATH: `ensurepath` has just fixed that.
64
+
65
+ In a **new** terminal:
66
+
67
+ ```powershell
68
+ pipx install gitpane
69
+ ```
70
+ Run `gitpane` in any terminal, then click **Settings › Utilities › Create desktop shortcut** to get a launcher on your desktop.
71
+
72
+ ## Update
73
+
74
+ Close GitPane, then:
75
+
76
+ ```bash
77
+ pipx upgrade gitpane
78
+ ```
79
+
80
+ ---
81
+ ## Command line
82
+
83
+ - `gitpane` starts GitPane and gives the terminal back. Closing the terminal does not close GitPane.
84
+ - `gitpane --attach` keeps GitPane attached to the terminal: its output and errors are shown there, and Ctrl+C stops it.
85
+ - `gitpane --log` writes a diagnostic log and shows its path.
86
+ - `gitpane --version` prints the version (Linux and macOS).
87
+
88
+ ## When gitpane is not found
89
+
90
+ Run `pipx ensurepath` again (`python -m pipx ensurepath` on Windows), then open a **new** terminal: the PATH change only reaches terminals opened after it.
91
+
92
+ ## License
93
+
94
+ GitPane is under the MIT license. It ships the Noto Color Emoji font under the SIL Open Font License 1.1 (OFL-1.1) and the Windows launchers of distlib under the Python Software Foundation License 2.0 (PSF-2.0).
@@ -0,0 +1,93 @@
1
+ [build-system]
2
+ requires = ["setuptools==84.0.0"]
3
+ build-backend = "setuptools.build_meta"
4
+
5
+ [project]
6
+ name = "gitpane"
7
+ dynamic = ["version"]
8
+ description = "Lightweight desktop Git client for Windows, Linux and macOS, in the spirit of Git Extensions"
9
+ readme = "docs/PYPI_README.md"
10
+ authors = [{name = "Thongvan Alexis"}]
11
+ license = "MIT AND OFL-1.1 AND PSF-2.0"
12
+ license-files = [
13
+ "LICENSE",
14
+ "THIRD_PARTY_NOTICES.md",
15
+ "src/gitpane/ui/resource/NotoColorEmoji-OFL.txt",
16
+ "src/gitpane/vendor/DISTLIB-LICENSE.txt",
17
+ ]
18
+ classifiers = [
19
+ "Development Status :: 5 - Production/Stable",
20
+ "Environment :: X11 Applications :: Qt",
21
+ "Environment :: MacOS X",
22
+ "Environment :: Win32 (MS Windows)",
23
+ "Intended Audience :: Developers",
24
+ "Natural Language :: English",
25
+ "Operating System :: Microsoft :: Windows :: Windows 10",
26
+ "Operating System :: POSIX :: Linux",
27
+ "Operating System :: MacOS",
28
+ "Programming Language :: Python :: 3 :: Only",
29
+ "Programming Language :: Python :: 3.13",
30
+ "Programming Language :: Python :: 3.14",
31
+ "Topic :: Software Development :: Version Control :: Git",
32
+ ]
33
+ # The upper bound follows the one PySide6-Essentials declares; a test keeps both equal.
34
+ requires-python = ">=3.13,<3.15"
35
+ # Narrow ranges rather than exact pins, so pip and pipx can install GitPane next to other packages;
36
+ # the dev extra below pins the exact versions the tests run with. shiboken6 comes with PySide6-Essentials.
37
+ dependencies = ["PySide6-Essentials>=6.11.2,<6.12", "Pygments>=2.21,<3"]
38
+
39
+ [project.optional-dependencies]
40
+ dev = [
41
+ "PySide6-Essentials==6.11.2",
42
+ "shiboken6==6.11.2",
43
+ "Pygments==2.21.0",
44
+ "pip==26.2.1",
45
+ "setuptools==84.0.0",
46
+ "pytest==9.1.1",
47
+ "pytest-qt==4.5.0",
48
+ "pytest-xdist==3.8.0",
49
+ "execnet==2.1.2",
50
+ "ruff==0.16.6",
51
+ "colorama==0.4.6; sys_platform == 'win32'",
52
+ "iniconfig==2.3.0",
53
+ "packaging==26.3",
54
+ "pluggy==1.6.0",
55
+ "typing_extensions==4.16.0",
56
+ "build==1.6.1",
57
+ "pyproject_hooks==1.3.3",
58
+ ]
59
+
60
+ [project.gui-scripts]
61
+ gitpane = "gitpane.application:main"
62
+
63
+ [tool.setuptools.dynamic]
64
+ # setuptools reads this literal from the text of config.py without running the module.
65
+ version = {attr = "gitpane.config.APPLICATION_VERSION"}
66
+
67
+ [tool.setuptools.packages.find]
68
+ where = ["src"]
69
+ include = ["gitpane*"]
70
+ namespaces = true
71
+
72
+ [tool.setuptools.package-data]
73
+ gitpane = ["vendor/*.exe", "vendor/*.txt"]
74
+ "gitpane.ui" = ["resource/*.png", "resource/*.ico", "resource/*.ttf", "resource/*.txt"]
75
+
76
+ [tool.pytest.ini_options]
77
+ qt_api = "pyside6"
78
+ testpaths = ["tests"]
79
+ strict_markers = true
80
+ # A full headless batch leaves about 430 000 files in the system temporary folder, a tmpfs limited in inodes on Ubuntu.
81
+ # Keeping only the folders of failed tests leaves room for the next batch and still keeps what explains a failure.
82
+ tmp_path_retention_policy = "failed"
83
+ # Warnings the offscreen plugin prints for window system requests it has no window system to pass on to; they say
84
+ # nothing about the application, so they never fail a test that fails on Qt warnings.
85
+ qt_log_ignore = [
86
+ '^This plugin does not support propagateSizeHints\(\)$',
87
+ '^This plugin does not support raise\(\)$',
88
+ '^This plugin does not support grabbing the keyboard$',
89
+ ]
90
+
91
+ [tool.ruff]
92
+ line-length = 250
93
+ target-version = "py313"
@@ -0,0 +1,4 @@
1
+ [egg_info]
2
+ tag_build =
3
+ tag_date = 0
4
+
File without changes
File without changes