gitpane 1.0.0__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.
Files changed (353) hide show
  1. gitpane/__init__.py +0 -0
  2. gitpane/account/__init__.py +0 -0
  3. gitpane/account/account_choice.py +297 -0
  4. gitpane/account/address_owner.py +67 -0
  5. gitpane/account/authentication.py +1811 -0
  6. gitpane/account/authentication_worker.py +836 -0
  7. gitpane/account/credential_manager.py +480 -0
  8. gitpane/account/credential_manager_install.py +171 -0
  9. gitpane/account/keyring_reader.py +135 -0
  10. gitpane/account/keyring_state.py +158 -0
  11. gitpane/account/ssh.py +312 -0
  12. gitpane/account/ssh_askpass.py +216 -0
  13. gitpane/account/ssh_prompt.py +222 -0
  14. gitpane/application.py +684 -0
  15. gitpane/commit/__init__.py +0 -0
  16. gitpane/commit/commit_metadata.py +88 -0
  17. gitpane/commit/commit_push.py +276 -0
  18. gitpane/commit/commit_write.py +830 -0
  19. gitpane/config.py +1066 -0
  20. gitpane/controller/__init__.py +0 -0
  21. gitpane/controller/account_controller.py +677 -0
  22. gitpane/controller/clone_controller.py +776 -0
  23. gitpane/controller/close_readiness.py +212 -0
  24. gitpane/controller/commit_timing_controller.py +566 -0
  25. gitpane/controller/conflict_controller.py +885 -0
  26. gitpane/controller/console_registry.py +38 -0
  27. gitpane/controller/emoji_window_controller.py +95 -0
  28. gitpane/controller/file_action_controller.py +479 -0
  29. gitpane/controller/history_read_controller.py +671 -0
  30. gitpane/controller/history_rewrite_controller.py +739 -0
  31. gitpane/controller/navigation_controller.py +658 -0
  32. gitpane/controller/opening_controller.py +375 -0
  33. gitpane/controller/operation_policy.py +76 -0
  34. gitpane/controller/rebase_controller.py +797 -0
  35. gitpane/controller/rebase_editor_controller.py +309 -0
  36. gitpane/controller/reference_form_controller.py +1677 -0
  37. gitpane/controller/reference_read_controller.py +242 -0
  38. gitpane/controller/refresh_controller.py +477 -0
  39. gitpane/controller/replay_controller.py +805 -0
  40. gitpane/controller/session_registry.py +337 -0
  41. gitpane/controller/setting_controller.py +592 -0
  42. gitpane/controller/shutdown_controller.py +345 -0
  43. gitpane/controller/staging_controller.py +199 -0
  44. gitpane/controller/staging_session_registry.py +47 -0
  45. gitpane/controller/stash_controller.py +367 -0
  46. gitpane/controller/transport_controller.py +813 -0
  47. gitpane/controller/welcome_controller.py +102 -0
  48. gitpane/controller/window_activation.py +116 -0
  49. gitpane/controller/worktree_state_controller.py +169 -0
  50. gitpane/emoji/__init__.py +0 -0
  51. gitpane/emoji/emoji_catalogue.py +156 -0
  52. gitpane/git_config/__init__.py +0 -0
  53. gitpane/git_config/git_setting.py +441 -0
  54. gitpane/history/__init__.py +0 -0
  55. gitpane/history/avatar.py +241 -0
  56. gitpane/history/file_history.py +359 -0
  57. gitpane/history/graph.py +145 -0
  58. gitpane/history/history_filter.py +31 -0
  59. gitpane/history/history_parse.py +605 -0
  60. gitpane/history/repository.py +1600 -0
  61. gitpane/history/repository_value.py +341 -0
  62. gitpane/history/revision.py +180 -0
  63. gitpane/history/revision_file.py +182 -0
  64. gitpane/history_rewrite/__init__.py +0 -0
  65. gitpane/history_rewrite/graph.py +210 -0
  66. gitpane/history_rewrite/guard.py +288 -0
  67. gitpane/history_rewrite/index.py +125 -0
  68. gitpane/history_rewrite/prepare.py +378 -0
  69. gitpane/history_rewrite/protocol.py +320 -0
  70. gitpane/history_rewrite/publish.py +444 -0
  71. gitpane/history_rewrite/recovery.py +481 -0
  72. gitpane/history_rewrite/value.py +229 -0
  73. gitpane/operation/__init__.py +0 -0
  74. gitpane/operation/console_line.py +313 -0
  75. gitpane/operation/console_tone.py +76 -0
  76. gitpane/operation/diagnostic.py +954 -0
  77. gitpane/operation/launch_signature.py +254 -0
  78. gitpane/operation/operation_status.py +87 -0
  79. gitpane/operation/operation_trace.py +766 -0
  80. gitpane/operation/repository_operation.py +781 -0
  81. gitpane/preference/__init__.py +0 -0
  82. gitpane/preference/preference_location.py +40 -0
  83. gitpane/preference/preference_store.py +590 -0
  84. gitpane/process/__init__.py +0 -0
  85. gitpane/process/exact_arguments.py +77 -0
  86. gitpane/process/git_output_text.py +20 -0
  87. gitpane/process/process_group.py +851 -0
  88. gitpane/process/process_log.py +114 -0
  89. gitpane/process/process_runner.py +1033 -0
  90. gitpane/process/released_child_watch.py +138 -0
  91. gitpane/recent/__init__.py +0 -0
  92. gitpane/recent/mount_table.py +422 -0
  93. gitpane/recent/recent_availability.py +414 -0
  94. gitpane/recent/recent_name.py +11 -0
  95. gitpane/recent/recent_search.py +114 -0
  96. gitpane/reference/__init__.py +0 -0
  97. gitpane/reference/reference_edit.py +2030 -0
  98. gitpane/reference/reference_snapshot.py +196 -0
  99. gitpane/reference/stash.py +730 -0
  100. gitpane/reference/stash_list.py +164 -0
  101. gitpane/sequencer/__init__.py +0 -0
  102. gitpane/sequencer/commit_message_rule.py +154 -0
  103. gitpane/sequencer/conflict.py +506 -0
  104. gitpane/sequencer/merge_recovery.py +163 -0
  105. gitpane/sequencer/merge_state.py +166 -0
  106. gitpane/sequencer/mergetool.py +856 -0
  107. gitpane/sequencer/rebase.py +750 -0
  108. gitpane/sequencer/rebase_edit_file.py +224 -0
  109. gitpane/sequencer/rebase_state.py +523 -0
  110. gitpane/sequencer/replay.py +1435 -0
  111. gitpane/sequencer/replay_legacy.py +253 -0
  112. gitpane/sequencer/replay_state.py +747 -0
  113. gitpane/submodule/__init__.py +0 -0
  114. gitpane/submodule/checkout_refusal.py +102 -0
  115. gitpane/submodule/checkout_refusal_notice.py +111 -0
  116. gitpane/submodule/cloned_without_checkout.py +65 -0
  117. gitpane/submodule/submodule_discovery.py +1180 -0
  118. gitpane/submodule/submodule_loss.py +218 -0
  119. gitpane/system/__init__.py +0 -0
  120. gitpane/system/appearance_portal.py +125 -0
  121. gitpane/system/application_identity.py +48 -0
  122. gitpane/system/command_line.py +36 -0
  123. gitpane/system/desktop_icon_fact.py +128 -0
  124. gitpane/system/desktop_icon_support.py +270 -0
  125. gitpane/system/desktop_shortcut.py +536 -0
  126. gitpane/system/icns_image.py +35 -0
  127. gitpane/system/installed_launcher.py +136 -0
  128. gitpane/system/linux_distribution.py +151 -0
  129. gitpane/system/network_folder.py +46 -0
  130. gitpane/system/path_identity.py +95 -0
  131. gitpane/system/private_tree_removal.py +47 -0
  132. gitpane/system/process_program.py +63 -0
  133. gitpane/system/qt_folder.py +38 -0
  134. gitpane/system/ready_channel_watch.py +67 -0
  135. gitpane/system/startup_activation.py +65 -0
  136. gitpane/system/terminal_detach.py +384 -0
  137. gitpane/system/xdg_session.py +85 -0
  138. gitpane/text/__init__.py +0 -0
  139. gitpane/text/text_query.py +97 -0
  140. gitpane/text/typed_path.py +75 -0
  141. gitpane/text/typed_text.py +17 -0
  142. gitpane/thread/__init__.py +0 -0
  143. gitpane/thread/weak_signal.py +93 -0
  144. gitpane/tool/__init__.py +0 -0
  145. gitpane/tool/app_bundle.py +164 -0
  146. gitpane/tool/desktop_text_editor.py +156 -0
  147. gitpane/tool/difftool.py +429 -0
  148. gitpane/tool/editor.py +445 -0
  149. gitpane/tool/editor_bridge.py +193 -0
  150. gitpane/tool/editor_recipe.py +481 -0
  151. gitpane/tool/file_reveal.py +94 -0
  152. gitpane/tool/git_executable.py +264 -0
  153. gitpane/tool/git_version.py +62 -0
  154. gitpane/tool/kdiff3.py +41 -0
  155. gitpane/tool/kdiff3_install.py +162 -0
  156. gitpane/tool/launch_services_text_editor.py +104 -0
  157. gitpane/tool/mergetool_recipe.py +84 -0
  158. gitpane/tool/system_editor_default.py +80 -0
  159. gitpane/tool/system_text_editor.py +44 -0
  160. gitpane/tool/system_tool.py +816 -0
  161. gitpane/tool/terminal_recipe.py +390 -0
  162. gitpane/transport/__init__.py +0 -0
  163. gitpane/transport/branch_exchange.py +1690 -0
  164. gitpane/transport/clone.py +1273 -0
  165. gitpane/transport/credential_read_retry.py +35 -0
  166. gitpane/transport/git_refusal.py +207 -0
  167. gitpane/transport/push_tracking.py +121 -0
  168. gitpane/transport/refusal_notice.py +225 -0
  169. gitpane/transport/remote.py +747 -0
  170. gitpane/transport/remote_config.py +544 -0
  171. gitpane/ui/__init__.py +0 -0
  172. gitpane/ui/console/__init__.py +0 -0
  173. gitpane/ui/console/error_dialog.py +332 -0
  174. gitpane/ui/console/operation_dialog.py +408 -0
  175. gitpane/ui/console/operation_output.py +91 -0
  176. gitpane/ui/console/operation_output_view.py +373 -0
  177. gitpane/ui/emoji/__init__.py +0 -0
  178. gitpane/ui/emoji/emoji_font.py +257 -0
  179. gitpane/ui/emoji/emoji_grid.py +125 -0
  180. gitpane/ui/emoji/emoji_window.py +154 -0
  181. gitpane/ui/emoji/file_action_icon.py +131 -0
  182. gitpane/ui/emoji/opentype_family_name.py +182 -0
  183. gitpane/ui/history_rewrite/__init__.py +0 -0
  184. gitpane/ui/history_rewrite/details.py +78 -0
  185. gitpane/ui/history_rewrite/preview.py +565 -0
  186. gitpane/ui/history_rewrite/preview_model.py +291 -0
  187. gitpane/ui/history_rewrite/question.py +87 -0
  188. gitpane/ui/history_rewrite/recovery_dialog.py +262 -0
  189. gitpane/ui/look/__init__.py +0 -0
  190. gitpane/ui/look/action_icon.py +504 -0
  191. gitpane/ui/look/application_icon.py +78 -0
  192. gitpane/ui/look/application_style.py +317 -0
  193. gitpane/ui/look/avatar_label.py +53 -0
  194. gitpane/ui/look/color_contrast.py +43 -0
  195. gitpane/ui/look/desktop_appearance_follower.py +118 -0
  196. gitpane/ui/look/fixed_font.py +21 -0
  197. gitpane/ui/look/gtk_settings.py +116 -0
  198. gitpane/ui/look/icon_density.py +16 -0
  199. gitpane/ui/look/reference_font.py +19 -0
  200. gitpane/ui/look/theme_color.py +63 -0
  201. gitpane/ui/look/theme_look.py +95 -0
  202. gitpane/ui/look/theme_palette.py +173 -0
  203. gitpane/ui/look/warning_icon.py +86 -0
  204. gitpane/ui/look/windows_control_look.py +250 -0
  205. gitpane/ui/reader/__init__.py +0 -0
  206. gitpane/ui/reader/commit_message.py +129 -0
  207. gitpane/ui/reader/commit_panel.py +378 -0
  208. gitpane/ui/reader/diff_panel.py +626 -0
  209. gitpane/ui/reader/file_action.py +138 -0
  210. gitpane/ui/reader/file_tree_panel.py +235 -0
  211. gitpane/ui/reader/reader_toolbar.py +56 -0
  212. gitpane/ui/reader/revision_tree.py +80 -0
  213. gitpane/ui/reader/search_result.py +165 -0
  214. gitpane/ui/reader/source_text.py +134 -0
  215. gitpane/ui/reader/source_view.py +151 -0
  216. gitpane/ui/reader/syntax_span.py +67 -0
  217. gitpane/ui/reference/__init__.py +0 -0
  218. gitpane/ui/reference/branch_selector.py +106 -0
  219. gitpane/ui/reference/checkout_dialog.py +419 -0
  220. gitpane/ui/reference/checkout_revision_dialog.py +182 -0
  221. gitpane/ui/reference/commit_summary.py +339 -0
  222. gitpane/ui/reference/create_branch_dialog.py +346 -0
  223. gitpane/ui/reference/create_tag_dialog.py +283 -0
  224. gitpane/ui/reference/delete_local_branch_dialog.py +323 -0
  225. gitpane/ui/reference/delete_tag_dialog.py +394 -0
  226. gitpane/ui/reference/form_opening.py +53 -0
  227. gitpane/ui/reference/reference_dialog.py +417 -0
  228. gitpane/ui/reference/reference_feedback.py +62 -0
  229. gitpane/ui/reference/reference_form.py +139 -0
  230. gitpane/ui/reference/rename_branch_dialog.py +179 -0
  231. gitpane/ui/reference/reset_branch_dialog.py +430 -0
  232. gitpane/ui/reference/reset_dialog.py +263 -0
  233. gitpane/ui/reference/revision_dialog.py +121 -0
  234. gitpane/ui/reference/revision_picker.py +227 -0
  235. gitpane/ui/reference/select_branches_dialog.py +199 -0
  236. gitpane/ui/reference/stash_dialog.py +171 -0
  237. gitpane/ui/repository/__init__.py +0 -0
  238. gitpane/ui/repository/graph_delegate.py +298 -0
  239. gitpane/ui/repository/history_avatar.py +130 -0
  240. gitpane/ui/repository/history_model.py +179 -0
  241. gitpane/ui/repository/repository_list_popup.py +319 -0
  242. gitpane/ui/repository/repository_window.py +2580 -0
  243. gitpane/ui/resource/ArrowDown.png +0 -0
  244. gitpane/ui/resource/ArrowUp.png +0 -0
  245. gitpane/ui/resource/BranchCheckout.png +0 -0
  246. gitpane/ui/resource/BranchCreate.png +0 -0
  247. gitpane/ui/resource/BranchDelete.png +0 -0
  248. gitpane/ui/resource/CopyToClipboard.png +0 -0
  249. gitpane/ui/resource/GitPane-16.png +0 -0
  250. gitpane/ui/resource/GitPane-24.png +0 -0
  251. gitpane/ui/resource/GitPane-256.png +0 -0
  252. gitpane/ui/resource/GitPane-32.png +0 -0
  253. gitpane/ui/resource/GitPane-48.png +0 -0
  254. gitpane/ui/resource/GitPane-64.png +0 -0
  255. gitpane/ui/resource/GitPane.ico +0 -0
  256. gitpane/ui/resource/NotoColorEmoji-OFL.txt +92 -0
  257. gitpane/ui/resource/NotoColorEmoji_WindowsCompatible.ttf +0 -0
  258. gitpane/ui/resource/Renamed.png +0 -0
  259. gitpane/ui/resource/ResetAnotherBranchToHere.png +0 -0
  260. gitpane/ui/resource/ResetCurrentBranchToHere.png +0 -0
  261. gitpane/ui/resource/Stash.png +0 -0
  262. gitpane/ui/resource/Tag.png +0 -0
  263. gitpane/ui/resource/TagCreate.png +0 -0
  264. gitpane/ui/resource/TagDelete.png +0 -0
  265. gitpane/ui/resource/Unmerged.png +0 -0
  266. gitpane/ui/resource/checkout.png +0 -0
  267. gitpane/ui/sequencer/__init__.py +0 -0
  268. gitpane/ui/sequencer/conflict_dialog.py +532 -0
  269. gitpane/ui/sequencer/merge_recovery_dialog.py +67 -0
  270. gitpane/ui/sequencer/rebase_dialog.py +461 -0
  271. gitpane/ui/sequencer/rebase_editor_window.py +220 -0
  272. gitpane/ui/sequencer/replay_conflict_prompt.py +105 -0
  273. gitpane/ui/sequencer/replay_dialog.py +501 -0
  274. gitpane/ui/setting/__init__.py +0 -0
  275. gitpane/ui/setting/account_page.py +724 -0
  276. gitpane/ui/setting/add_account_dialog.py +1005 -0
  277. gitpane/ui/setting/credential_manager_dialog.py +151 -0
  278. gitpane/ui/setting/git_setting_widget.py +388 -0
  279. gitpane/ui/setting/setting_block.py +19 -0
  280. gitpane/ui/setting/setting_dialog.py +750 -0
  281. gitpane/ui/setting/ssh_widget.py +232 -0
  282. gitpane/ui/setting/utility_page.py +240 -0
  283. gitpane/ui/staging/__init__.py +0 -0
  284. gitpane/ui/staging/staging_action.py +356 -0
  285. gitpane/ui/staging/staging_window.py +745 -0
  286. gitpane/ui/transport/__init__.py +0 -0
  287. gitpane/ui/transport/clone_dialog.py +879 -0
  288. gitpane/ui/transport/push_dialog.py +580 -0
  289. gitpane/ui/transport/push_rejection_prompt.py +100 -0
  290. gitpane/ui/transport/push_tracking_question.py +88 -0
  291. gitpane/ui/transport/remote_dialog.py +943 -0
  292. gitpane/ui/welcome/__init__.py +0 -0
  293. gitpane/ui/welcome/invalid_repository_prompt.py +114 -0
  294. gitpane/ui/welcome/welcome_window.py +1137 -0
  295. gitpane/ui/widget/__init__.py +0 -0
  296. gitpane/ui/widget/busy_indicator.py +106 -0
  297. gitpane/ui/widget/commit_date_text.py +55 -0
  298. gitpane/ui/widget/content_growth.py +262 -0
  299. gitpane/ui/widget/content_measure.py +99 -0
  300. gitpane/ui/widget/dialog_layout.py +668 -0
  301. gitpane/ui/widget/drop_down_wheel_filter.py +32 -0
  302. gitpane/ui/widget/flow_layout.py +110 -0
  303. gitpane/ui/widget/long_text.py +542 -0
  304. gitpane/ui/widget/mnemonic.py +13 -0
  305. gitpane/ui/widget/numbered_text_edit.py +127 -0
  306. gitpane/ui/widget/plain_label.py +15 -0
  307. gitpane/ui/widget/plain_tooltip.py +19 -0
  308. gitpane/ui/widget/refresh_advice.py +25 -0
  309. gitpane/ui/widget/result_label.py +227 -0
  310. gitpane/ui/widget/result_status_bar.py +53 -0
  311. gitpane/ui/widget/scrolled_text.py +69 -0
  312. gitpane/ui/widget/shortcut_text.py +31 -0
  313. gitpane/ui/widget/standard_icon_label.py +55 -0
  314. gitpane/ui/widget/system_shortcut.py +75 -0
  315. gitpane/ui/widget/unavailable_reason.py +29 -0
  316. gitpane/ui/widget/wheel_safe_drop_down.py +24 -0
  317. gitpane/ui/window_control/__init__.py +0 -0
  318. gitpane/ui/window_control/button_focus.py +42 -0
  319. gitpane/ui/window_control/compositor_answer.py +152 -0
  320. gitpane/ui/window_control/compositor_growth_cap.py +73 -0
  321. gitpane/ui/window_control/desktop_activation.py +203 -0
  322. gitpane/ui/window_control/dialog_modality.py +122 -0
  323. gitpane/ui/window_control/item_activation.py +42 -0
  324. gitpane/ui/window_control/modal_focus_relay.py +124 -0
  325. gitpane/ui/window_control/wayland_activation.py +695 -0
  326. gitpane/ui/window_control/window_placement.py +305 -0
  327. gitpane/vendor/DISTLIB-LICENSE.txt +284 -0
  328. gitpane/vendor/w32.exe +0 -0
  329. gitpane/vendor/w64-arm.exe +0 -0
  330. gitpane/vendor/w64.exe +0 -0
  331. gitpane/worktree/__init__.py +0 -0
  332. gitpane/worktree/command_sequence.py +110 -0
  333. gitpane/worktree/file_action_target.py +61 -0
  334. gitpane/worktree/file_menu_action.py +52 -0
  335. gitpane/worktree/historical_restore.py +361 -0
  336. gitpane/worktree/ignore_rule.py +266 -0
  337. gitpane/worktree/mutation.py +1539 -0
  338. gitpane/worktree/partial_patch.py +435 -0
  339. gitpane/worktree/staged_reset.py +447 -0
  340. gitpane/worktree/staging.py +1418 -0
  341. gitpane/worktree/trash.py +302 -0
  342. gitpane/worktree/worktree_file.py +406 -0
  343. gitpane/worktree/worktree_service.py +584 -0
  344. gitpane/worktree/worktree_snapshot.py +630 -0
  345. gitpane-1.0.0.dist-info/METADATA +141 -0
  346. gitpane-1.0.0.dist-info/RECORD +353 -0
  347. gitpane-1.0.0.dist-info/WHEEL +5 -0
  348. gitpane-1.0.0.dist-info/entry_points.txt +2 -0
  349. gitpane-1.0.0.dist-info/licenses/LICENSE +21 -0
  350. gitpane-1.0.0.dist-info/licenses/THIRD_PARTY_NOTICES.md +109 -0
  351. gitpane-1.0.0.dist-info/licenses/src/gitpane/ui/resource/NotoColorEmoji-OFL.txt +92 -0
  352. gitpane-1.0.0.dist-info/licenses/src/gitpane/vendor/DISTLIB-LICENSE.txt +284 -0
  353. gitpane-1.0.0.dist-info/top_level.txt +1 -0
@@ -0,0 +1,305 @@
1
+ """Open every new GitPane window centred on the GitPane window it belongs to.
2
+
3
+ One application-wide event filter places each new top-level window the first time it is shown, so no dialog carries its
4
+ own copy of the placement rule. The rule:
5
+
6
+ - the anchor is the repository window (or the welcome window) the new window belongs to: the top of its parent chain, an
7
+ anchor named by the code that opened a parentless window, or else the GitPane window the user used last;
8
+ - the new window's frame centre goes on the anchor's frame centre, then the frame is pulled back inside the usable area
9
+ of the anchor's screen;
10
+ - this happens once, on the first show. Just before, the window grows until its whole content fits with the system
11
+ font, never below the size its code gave it and never past the usable area of that screen. A window shown again
12
+ later (a reused settings or Commit window) keeps the size and place it had, including a place the user dragged it to;
13
+ - while the user has not moved or resized the window, a size change made by GitPane itself (a rebase window that gains
14
+ its conflict details, a form that finishes loading) keeps the window's own centre instead of growing from the top-left
15
+ corner: the frame goes back on the centre it had just before the change, then is pulled back inside the usable area of
16
+ the anchor's screen. The anchor's centre is not read again: under X11 Qt may not know the anchor's title bar yet at the
17
+ first show, so the centre read then can be half a title bar away from where the window really sits.
18
+ At each such size change, a window whose place or size is no longer the one GitPane last gave it was moved or resized
19
+ through the window system (the user dragging the title bar or a border, a screen change), and is handed over to the
20
+ user for good. Each move of the window system is not taken for the user by itself: on macOS, starting the native
21
+ session of an application-modal window (Settings, a console) centres it on the screen, then Qt moves it back where
22
+ GitPane put it, and that window is still GitPane's. A size change GitPane makes between those two moves keeps the
23
+ window's top-left corner until the window system moves it again: put back on GitPane's place, the window goes on the
24
+ centre it had before that change; left anywhere else, it is the user's.
25
+
26
+ Where the compositor places the windows itself (Wayland), Qt drops any position a program asks for: there only the size
27
+ is fitted to the content at the first show, and GitPane asks for no position, neither at the first show nor at a later
28
+ size change.
29
+ """
30
+
31
+ from __future__ import annotations
32
+
33
+ import weakref
34
+ from typing import TYPE_CHECKING
35
+
36
+ from PySide6.QtCore import QCoreApplication, QEvent, QObject, QPoint, QRect, QSize, Qt
37
+ from PySide6.QtGui import QShowEvent
38
+ from shiboken6 import isValid
39
+
40
+ from gitpane.config import center_window_at, uncounted_decoration_estimate, unknown_decoration_estimate, window_placement
41
+ from gitpane.ui.widget.long_text import fit_window_to_content
42
+
43
+ if TYPE_CHECKING:
44
+ from PySide6.QtGui import QMoveEvent, QResizeEvent
45
+ from PySide6.QtWidgets import QApplication, QWidget
46
+
47
+ PLACEMENT_ANCHOR_RANK_PROPERTY = "gitpane_placement_anchor_rank"
48
+ PLACED_PROPERTY = "gitpane_window_placed"
49
+ REPOSITORY_ANCHOR_RANK = 0
50
+ WELCOME_ANCHOR_RANK = 1
51
+ PLACED_WINDOW_TYPE_SET = frozenset((Qt.WindowType.Window, Qt.WindowType.Dialog))
52
+
53
+
54
+ def mark_placement_anchor(window: QWidget, rank: int) -> None:
55
+ """Declare a GitPane main window that new windows centre on; a lower rank wins when no other hint says which one to use."""
56
+ window.setProperty(PLACEMENT_ANCHOR_RANK_PROPERTY, rank)
57
+
58
+
59
+ def mark_window_placed(window: QWidget) -> None:
60
+ """Declare a window already placed, for example at a geometry restored from the preferences, so its first show keeps it there.
61
+
62
+ Without this the placement filter would centre the window on its GitPane window at its first show and discard the
63
+ position the user left it at.
64
+ """
65
+ window.setProperty(PLACED_PROPERTY, True)
66
+
67
+
68
+ def placement_anchor_rank(widget: QWidget) -> int | None:
69
+ """Return the anchor rank of a GitPane main window, or None for any other window."""
70
+ return widget.property(PLACEMENT_ANCHOR_RANK_PROPERTY)
71
+
72
+
73
+ def is_visible_window(widget: QWidget | None) -> bool:
74
+ """Tell whether a remembered window still exists and is on screen, so its frame can serve as a centre."""
75
+ return widget is not None and isValid(widget) and widget.isVisible()
76
+
77
+
78
+ def centre_on_placement_anchor(window: QWidget, anchor: QWidget | None, *, platform_name: str = "") -> bool:
79
+ """Centre a GitPane main window on the window it was opened from, on that window's screen, and tell whether it could.
80
+
81
+ The GitPane main windows are placement anchors themselves, so the placement of new windows skips them and each one
82
+ calls this at its first show. Without it the window system picks the place, which under some Linux desktops is the
83
+ top-left corner of another screen. Nothing happens when that window is gone or hidden, nor where the compositor
84
+ places windows itself, since it would ignore the position. ``platform_name`` is Qt's platform name, read from Qt
85
+ when not given.
86
+ """
87
+ if not window_placement(platform_name).requests_position or not is_visible_window(anchor):
88
+ return False
89
+ center_window_at(window, anchor.frameGeometry().center(), anchor.screen(), anchor, platform_name=platform_name)
90
+ return True
91
+
92
+
93
+ def exact_frame_centre(frame: QRect) -> QPoint:
94
+ """Return the point QRect.moveCenter takes to leave this frame exactly where it is.
95
+
96
+ QRect.center() rounds towards zero while moveCenter takes off half the size rounded down: on a screen left of or
97
+ above the main one, a frame put back on its own QRect.center() moves by one pixel, again at every size change.
98
+ """
99
+ return frame.topLeft() + QPoint((frame.width() - 1) // 2, (frame.height() - 1) // 2)
100
+
101
+
102
+ def frame_centre_before_resize(window: QWidget, old_size: QSize, decoration_reference: QWidget | None, client_top_left: QPoint | None = None) -> QPoint:
103
+ """Return the centre a window's frame had just before a resize, the point its resized frame goes back on.
104
+
105
+ A resize keeps the window's top-left corner, so that frame is the current one at the same corner, with the client
106
+ size before the resize plus the same title bar and borders. A title bar the window system has not added yet is
107
+ estimated the way center_window_at estimates it, so the centre read and the centre placed count the same frame.
108
+ ``client_top_left`` puts the client area's corner somewhere else than where it is now: the place GitPane gave a
109
+ window the system holds away from it during the resize.
110
+ """
111
+ frame = window.frameGeometry().marginsAdded(unknown_decoration_estimate(window, decoration_reference))
112
+ client = window.geometry()
113
+ frame_top_left = frame.topLeft() if client_top_left is None else client_top_left - (client.topLeft() - frame.topLeft())
114
+ old_frame_size = QSize(old_size.width() + frame.width() - client.width(), old_size.height() + frame.height() - client.height())
115
+ return exact_frame_centre(QRect(frame_top_left, old_frame_size))
116
+
117
+
118
+ class NewWindowPlacement(QObject):
119
+ """Centre each new top-level window on its GitPane window at its first show, or only fit its size where the compositor places windows."""
120
+
121
+ def __init__(self, application: QApplication, owner: QObject, *, platform_name: str = "") -> None:
122
+ """Watch every window of the application; the filter only acts on Show and window activation events.
123
+
124
+ The filter belongs to ``owner`` rather than to the application: it runs on every event of the application, so it
125
+ must end with the wiring that created it instead of outliving it on a shared application.
126
+
127
+ ``platform_name`` is Qt's platform name, read from Qt when not given; it decides once whether this filter asks for
128
+ positions, so a headless test can check the rule of any platform.
129
+
130
+ The GitPane window used last is only remembered through a weak reference. The filter runs while Qt switches the
131
+ active window; if it held the last reference to a window the rest of GitPane had already let go, replacing that
132
+ reference at that moment would destroy the window, and every window inside it, in the middle of Qt's switch,
133
+ and Qt would then send its deactivation events to freed memory.
134
+ """
135
+ super().__init__(owner)
136
+ self.application = application
137
+ self.platform_name = platform_name
138
+ self.placement = window_placement(platform_name)
139
+ self.last_active_anchor: weakref.ref[QWidget] | None = None
140
+ self.delivering_window_set: set[int] = set()
141
+ application.installEventFilter(self)
142
+
143
+ def eventFilter(self, watched: QObject, event: QEvent) -> bool:
144
+ """Remember the GitPane window used last and place a window on its first show."""
145
+ if not watched.isWidgetType():
146
+ return False
147
+ if event.type() == QEvent.Type.WindowActivate and watched.isWindow() and placement_anchor_rank(watched) is not None:
148
+ self.last_active_anchor = weakref.ref(watched)
149
+ return False
150
+ if event.type() == QEvent.Type.Resize and not event.spontaneous() and getattr(watched, "centring_screen", None) is not None:
151
+ self._follow_geometry_change(watched, event)
152
+ return False
153
+ if event.type() == QEvent.Type.Move and not event.spontaneous() and getattr(watched, "centring_screen", None) is not None:
154
+ self._follow_own_move(watched, event)
155
+ return False
156
+ if event.type() == QEvent.Type.Move and event.spontaneous() and getattr(watched, "centre_waiting_for_return", None) is not None:
157
+ self._follow_system_return(watched)
158
+ return False
159
+ if event.type() != QEvent.Type.Show or not self._needs_placement(watched):
160
+ return False
161
+ watched.setProperty(PLACED_PROPERTY, True)
162
+ anchor = self.anchor_for(watched)
163
+ # Workaround: an event filter runs before the window's own showEvent, and some windows still change there
164
+ # (QDialog centres itself with an estimated title bar, QMessageBox computes its final size). The Show event is
165
+ # therefore delivered now through the normal path, a copy of it with the same meaning, and the original is
166
+ # consumed; the window is fitted to its content and centred once its own handling is done, still before the
167
+ # system displays it.
168
+ window_key = id(watched)
169
+ self.delivering_window_set.add(window_key)
170
+ try:
171
+ QCoreApplication.sendEvent(watched, QShowEvent())
172
+ finally:
173
+ self.delivering_window_set.discard(window_key)
174
+ if not isValid(watched):
175
+ return True
176
+ if anchor is None or not isValid(anchor):
177
+ fit_window_to_content(watched)
178
+ return True
179
+ # The window opens on the anchor's screen, which is not its own screen yet; a title bar the window system has not
180
+ # added yet is left room for.
181
+ fit_window_to_content(watched, anchor.screen().availableGeometry().marginsRemoved(uncounted_decoration_estimate(watched, anchor, self.platform_name)))
182
+ # The compositor places the window itself: no centre is kept, so later size changes ask for no position either.
183
+ if not self.placement.requests_position:
184
+ return True
185
+ # The screen whose usable area holds the window while GitPane keeps its centre; None once the window is handed
186
+ # over to the user.
187
+ watched.centring_screen = anchor.screen()
188
+ # The centre a resize made while the window was away from its place goes back on, if the system puts it back.
189
+ watched.centre_waiting_for_return = None
190
+ watched.placement_decoration_reference = weakref.ref(anchor)
191
+ center_window_at(watched, anchor.frameGeometry().center(), watched.centring_screen, anchor, platform_name=self.platform_name)
192
+ watched.placement_geometry = QRect(watched.geometry())
193
+ return True
194
+
195
+ def _follow_geometry_change(self, window: QWidget, event: QResizeEvent) -> None:
196
+ """Keep a placed window's own centre when GitPane resizes it, and stop for good once the user has moved or resized it.
197
+
198
+ The centre kept is the one the frame had just before this size change, so the window stays where it is on screen
199
+ and only grows or shrinks around its middle; the resized frame is then pulled back inside the usable area of the
200
+ anchor's screen.
201
+
202
+ The window still has the place and size GitPane last gave it unless something else changed them in between: the
203
+ only things that can are the user and the system, through the window system, since a move GitPane makes itself
204
+ is recorded by _follow_own_move. A move of the system that put the window back leaves it where GitPane placed
205
+ it, so it does not count. A window resized while it is away from its place keeps its top-left corner for now,
206
+ and the next move of the window system decides whose it is (_follow_system_return).
207
+ """
208
+ placed_geometry = window.placement_geometry
209
+ screen = window.centring_screen
210
+ if event.oldSize() != placed_geometry.size() or not isValid(screen):
211
+ self._hand_over_to_user(window)
212
+ return
213
+ decoration_reference = self._decoration_reference(window)
214
+ if window.geometry().topLeft() != placed_geometry.topLeft():
215
+ # Workaround: on macOS, starting the native modal session of a window centres it on the screen, and Qt only
216
+ # puts it back on its own geometry with a later move; a resize GitPane makes in between (the opening fit of
217
+ # Checkout branch, a turn after the show) finds the window away from its place without the user having
218
+ # touched it. The centre GitPane gave it is kept, and only the next move of the window system says whether
219
+ # the window was the system's (put back on its place) or the user's (left elsewhere).
220
+ if window.centre_waiting_for_return is None:
221
+ window.centre_waiting_for_return = frame_centre_before_resize(window, event.oldSize(), decoration_reference, placed_geometry.topLeft())
222
+ window.placement_geometry = QRect(placed_geometry.topLeft(), window.size())
223
+ return
224
+ center_window_at(window, frame_centre_before_resize(window, event.oldSize(), decoration_reference), screen, decoration_reference, platform_name=self.platform_name)
225
+ window.placement_geometry = QRect(window.geometry())
226
+
227
+ def _follow_system_return(self, window: QWidget) -> None:
228
+ """Centre a window resized while away from its place once the window system puts it back there, or hand it to the user.
229
+
230
+ The move back keeps the window's top-left corner on the place GitPane gave it, at the size GitPane gave it
231
+ since: the frame then goes on the centre it had before that resize, and GitPane keeps its centre as before. A
232
+ move anywhere else is the user's (or a screen change), and the window is theirs for good.
233
+ """
234
+ centre = window.centre_waiting_for_return
235
+ window.centre_waiting_for_return = None
236
+ screen = window.centring_screen
237
+ if window.geometry() != window.placement_geometry or not isValid(screen):
238
+ self._hand_over_to_user(window)
239
+ return
240
+ decoration_reference = self._decoration_reference(window)
241
+ center_window_at(window, centre, screen, decoration_reference, platform_name=self.platform_name)
242
+ window.placement_geometry = QRect(window.geometry())
243
+
244
+ @staticmethod
245
+ def _hand_over_to_user(window: QWidget) -> None:
246
+ """Stop keeping a window's centre for good: the user or the system moved or resized it."""
247
+ window.centring_screen = None
248
+ window.centre_waiting_for_return = None
249
+
250
+ @staticmethod
251
+ def _decoration_reference(window: QWidget) -> QWidget | None:
252
+ """Return the window whose title bar stands for the placed window's own until the window system adds it, or None once it is gone."""
253
+ reference = getattr(window, "placement_decoration_reference", None)
254
+ return reference() if reference is not None else None
255
+
256
+ def _follow_own_move(self, window: QWidget, event: QMoveEvent) -> None:
257
+ """Record a move GitPane makes itself to a placed window, so its next growth still keeps its centre instead of handing it to the user.
258
+
259
+ Qt delivers a move asked by the code as a non-spontaneous event, and one made through the window system as a
260
+ spontaneous one. A move that starts from somewhere else than the place GitPane last gave the window comes after
261
+ a move of the user or the system, so it is not recorded and the next growth still sees that change.
262
+ """
263
+ placed_geometry = getattr(window, "placement_geometry", None)
264
+ # The first centring moves the window before GitPane records the place it gave it.
265
+ if placed_geometry is None:
266
+ return
267
+ # Only the shift the event carries is used: the frame keeps its margins during a move, so it is the same for the frame and the geometry.
268
+ previous_top_left = window.geometry().topLeft() - (event.pos() - event.oldPos())
269
+ if previous_top_left != placed_geometry.topLeft():
270
+ return
271
+ window.placement_geometry = QRect(window.geometry().topLeft(), placed_geometry.size())
272
+
273
+ def _needs_placement(self, widget: QWidget) -> bool:
274
+ """Only a new dialog or tool window needs placing: not menus or tooltips, not the GitPane main windows, not twice."""
275
+ return (widget.isWindow() and widget.windowType() in PLACED_WINDOW_TYPE_SET and placement_anchor_rank(widget) is None
276
+ and not widget.property(PLACED_PROPERTY) and id(widget) not in self.delivering_window_set)
277
+
278
+ def anchor_for(self, window: QWidget) -> QWidget | None:
279
+ """Find the visible GitPane window a new window belongs to.
280
+
281
+ The parent chain comes first: its top is the window the dialog was opened from. A parentless window uses the
282
+ anchor its opener named in ``placement_anchor``, then the GitPane window the user used last, then any visible one.
283
+ """
284
+ top = None
285
+ parent = window.parentWidget()
286
+ while parent is not None:
287
+ top = parent.window()
288
+ parent = top.parentWidget()
289
+ if is_visible_window(top):
290
+ return top
291
+ named_anchor = getattr(window, "placement_anchor", None)
292
+ if is_visible_window(named_anchor):
293
+ return named_anchor
294
+ last_active_anchor = self.last_active_anchor() if self.last_active_anchor is not None else None
295
+ if is_visible_window(last_active_anchor):
296
+ return last_active_anchor
297
+ best_anchor = None
298
+ best_rank = None
299
+ for widget in self.application.topLevelWidgets():
300
+ rank = placement_anchor_rank(widget)
301
+ if rank is None or not widget.isVisible():
302
+ continue
303
+ if best_rank is None or rank < best_rank:
304
+ best_anchor, best_rank = widget, rank
305
+ return best_anchor
@@ -0,0 +1,284 @@
1
+ A. HISTORY OF THE SOFTWARE
2
+ ==========================
3
+
4
+ Python was created in the early 1990s by Guido van Rossum at Stichting
5
+ Mathematisch Centrum (CWI, see http://www.cwi.nl) in the Netherlands
6
+ as a successor of a language called ABC. Guido remains Python's
7
+ principal author, although it includes many contributions from others.
8
+
9
+ In 1995, Guido continued his work on Python at the Corporation for
10
+ National Research Initiatives (CNRI, see http://www.cnri.reston.va.us)
11
+ in Reston, Virginia where he released several versions of the
12
+ software.
13
+
14
+ In May 2000, Guido and the Python core development team moved to
15
+ BeOpen.com to form the BeOpen PythonLabs team. In October of the same
16
+ year, the PythonLabs team moved to Digital Creations (now Zope
17
+ Corporation, see http://www.zope.com). In 2001, the Python Software
18
+ Foundation (PSF, see http://www.python.org/psf/) was formed, a
19
+ non-profit organization created specifically to own Python-related
20
+ Intellectual Property. Zope Corporation is a sponsoring member of
21
+ the PSF.
22
+
23
+ All Python releases are Open Source (see http://www.opensource.org for
24
+ the Open Source Definition). Historically, most, but not all, Python
25
+ releases have also been GPL-compatible; the table below summarizes
26
+ the various releases.
27
+
28
+ Release Derived Year Owner GPL-
29
+ from compatible? (1)
30
+
31
+ 0.9.0 thru 1.2 1991-1995 CWI yes
32
+ 1.3 thru 1.5.2 1.2 1995-1999 CNRI yes
33
+ 1.6 1.5.2 2000 CNRI no
34
+ 2.0 1.6 2000 BeOpen.com no
35
+ 1.6.1 1.6 2001 CNRI yes (2)
36
+ 2.1 2.0+1.6.1 2001 PSF no
37
+ 2.0.1 2.0+1.6.1 2001 PSF yes
38
+ 2.1.1 2.1+2.0.1 2001 PSF yes
39
+ 2.2 2.1.1 2001 PSF yes
40
+ 2.1.2 2.1.1 2002 PSF yes
41
+ 2.1.3 2.1.2 2002 PSF yes
42
+ 2.2.1 2.2 2002 PSF yes
43
+ 2.2.2 2.2.1 2002 PSF yes
44
+ 2.2.3 2.2.2 2003 PSF yes
45
+ 2.3 2.2.2 2002-2003 PSF yes
46
+ 2.3.1 2.3 2002-2003 PSF yes
47
+ 2.3.2 2.3.1 2002-2003 PSF yes
48
+ 2.3.3 2.3.2 2002-2003 PSF yes
49
+ 2.3.4 2.3.3 2004 PSF yes
50
+ 2.3.5 2.3.4 2005 PSF yes
51
+ 2.4 2.3 2004 PSF yes
52
+ 2.4.1 2.4 2005 PSF yes
53
+ 2.4.2 2.4.1 2005 PSF yes
54
+ 2.4.3 2.4.2 2006 PSF yes
55
+ 2.4.4 2.4.3 2006 PSF yes
56
+ 2.5 2.4 2006 PSF yes
57
+ 2.5.1 2.5 2007 PSF yes
58
+ 2.5.2 2.5.1 2008 PSF yes
59
+ 2.5.3 2.5.2 2008 PSF yes
60
+ 2.6 2.5 2008 PSF yes
61
+ 2.6.1 2.6 2008 PSF yes
62
+ 2.6.2 2.6.1 2009 PSF yes
63
+ 2.6.3 2.6.2 2009 PSF yes
64
+ 2.6.4 2.6.3 2009 PSF yes
65
+ 2.6.5 2.6.4 2010 PSF yes
66
+ 3.0 2.6 2008 PSF yes
67
+ 3.0.1 3.0 2009 PSF yes
68
+ 3.1 3.0.1 2009 PSF yes
69
+ 3.1.1 3.1 2009 PSF yes
70
+ 3.1.2 3.1 2010 PSF yes
71
+ 3.2 3.1 2010 PSF yes
72
+
73
+ Footnotes:
74
+
75
+ (1) GPL-compatible doesn't mean that we're distributing Python under
76
+ the GPL. All Python licenses, unlike the GPL, let you distribute
77
+ a modified version without making your changes open source. The
78
+ GPL-compatible licenses make it possible to combine Python with
79
+ other software that is released under the GPL; the others don't.
80
+
81
+ (2) According to Richard Stallman, 1.6.1 is not GPL-compatible,
82
+ because its license has a choice of law clause. According to
83
+ CNRI, however, Stallman's lawyer has told CNRI's lawyer that 1.6.1
84
+ is "not incompatible" with the GPL.
85
+
86
+ Thanks to the many outside volunteers who have worked under Guido's
87
+ direction to make these releases possible.
88
+
89
+
90
+ B. TERMS AND CONDITIONS FOR ACCESSING OR OTHERWISE USING PYTHON
91
+ ===============================================================
92
+
93
+ PYTHON SOFTWARE FOUNDATION LICENSE VERSION 2
94
+ --------------------------------------------
95
+
96
+ 1. This LICENSE AGREEMENT is between the Python Software Foundation
97
+ ("PSF"), and the Individual or Organization ("Licensee") accessing and
98
+ otherwise using this software ("Python") in source or binary form and
99
+ its associated documentation.
100
+
101
+ 2. Subject to the terms and conditions of this License Agreement, PSF hereby
102
+ grants Licensee a nonexclusive, royalty-free, world-wide license to reproduce,
103
+ analyze, test, perform and/or display publicly, prepare derivative works,
104
+ distribute, and otherwise use Python alone or in any derivative version,
105
+ provided, however, that PSF's License Agreement and PSF's notice of copyright,
106
+ i.e., "Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010
107
+ Python Software Foundation; All Rights Reserved" are retained in Python alone or
108
+ in any derivative version prepared by Licensee.
109
+
110
+ 3. In the event Licensee prepares a derivative work that is based on
111
+ or incorporates Python or any part thereof, and wants to make
112
+ the derivative work available to others as provided herein, then
113
+ Licensee hereby agrees to include in any such work a brief summary of
114
+ the changes made to Python.
115
+
116
+ 4. PSF is making Python available to Licensee on an "AS IS"
117
+ basis. PSF MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR
118
+ IMPLIED. BY WAY OF EXAMPLE, BUT NOT LIMITATION, PSF MAKES NO AND
119
+ DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS
120
+ FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF PYTHON WILL NOT
121
+ INFRINGE ANY THIRD PARTY RIGHTS.
122
+
123
+ 5. PSF SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF PYTHON
124
+ FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS AS
125
+ A RESULT OF MODIFYING, DISTRIBUTING, OR OTHERWISE USING PYTHON,
126
+ OR ANY DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF.
127
+
128
+ 6. This License Agreement will automatically terminate upon a material
129
+ breach of its terms and conditions.
130
+
131
+ 7. Nothing in this License Agreement shall be deemed to create any
132
+ relationship of agency, partnership, or joint venture between PSF and
133
+ Licensee. This License Agreement does not grant permission to use PSF
134
+ trademarks or trade name in a trademark sense to endorse or promote
135
+ products or services of Licensee, or any third party.
136
+
137
+ 8. By copying, installing or otherwise using Python, Licensee
138
+ agrees to be bound by the terms and conditions of this License
139
+ Agreement.
140
+
141
+
142
+ BEOPEN.COM LICENSE AGREEMENT FOR PYTHON 2.0
143
+ -------------------------------------------
144
+
145
+ BEOPEN PYTHON OPEN SOURCE LICENSE AGREEMENT VERSION 1
146
+
147
+ 1. This LICENSE AGREEMENT is between BeOpen.com ("BeOpen"), having an
148
+ office at 160 Saratoga Avenue, Santa Clara, CA 95051, and the
149
+ Individual or Organization ("Licensee") accessing and otherwise using
150
+ this software in source or binary form and its associated
151
+ documentation ("the Software").
152
+
153
+ 2. Subject to the terms and conditions of this BeOpen Python License
154
+ Agreement, BeOpen hereby grants Licensee a non-exclusive,
155
+ royalty-free, world-wide license to reproduce, analyze, test, perform
156
+ and/or display publicly, prepare derivative works, distribute, and
157
+ otherwise use the Software alone or in any derivative version,
158
+ provided, however, that the BeOpen Python License is retained in the
159
+ Software, alone or in any derivative version prepared by Licensee.
160
+
161
+ 3. BeOpen is making the Software available to Licensee on an "AS IS"
162
+ basis. BEOPEN MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR
163
+ IMPLIED. BY WAY OF EXAMPLE, BUT NOT LIMITATION, BEOPEN MAKES NO AND
164
+ DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS
165
+ FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF THE SOFTWARE WILL NOT
166
+ INFRINGE ANY THIRD PARTY RIGHTS.
167
+
168
+ 4. BEOPEN SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF THE
169
+ SOFTWARE FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS
170
+ AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THE SOFTWARE, OR ANY
171
+ DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF.
172
+
173
+ 5. This License Agreement will automatically terminate upon a material
174
+ breach of its terms and conditions.
175
+
176
+ 6. This License Agreement shall be governed by and interpreted in all
177
+ respects by the law of the State of California, excluding conflict of
178
+ law provisions. Nothing in this License Agreement shall be deemed to
179
+ create any relationship of agency, partnership, or joint venture
180
+ between BeOpen and Licensee. This License Agreement does not grant
181
+ permission to use BeOpen trademarks or trade names in a trademark
182
+ sense to endorse or promote products or services of Licensee, or any
183
+ third party. As an exception, the "BeOpen Python" logos available at
184
+ http://www.pythonlabs.com/logos.html may be used according to the
185
+ permissions granted on that web page.
186
+
187
+ 7. By copying, installing or otherwise using the software, Licensee
188
+ agrees to be bound by the terms and conditions of this License
189
+ Agreement.
190
+
191
+
192
+ CNRI LICENSE AGREEMENT FOR PYTHON 1.6.1
193
+ ---------------------------------------
194
+
195
+ 1. This LICENSE AGREEMENT is between the Corporation for National
196
+ Research Initiatives, having an office at 1895 Preston White Drive,
197
+ Reston, VA 20191 ("CNRI"), and the Individual or Organization
198
+ ("Licensee") accessing and otherwise using Python 1.6.1 software in
199
+ source or binary form and its associated documentation.
200
+
201
+ 2. Subject to the terms and conditions of this License Agreement, CNRI
202
+ hereby grants Licensee a nonexclusive, royalty-free, world-wide
203
+ license to reproduce, analyze, test, perform and/or display publicly,
204
+ prepare derivative works, distribute, and otherwise use Python 1.6.1
205
+ alone or in any derivative version, provided, however, that CNRI's
206
+ License Agreement and CNRI's notice of copyright, i.e., "Copyright (c)
207
+ 1995-2001 Corporation for National Research Initiatives; All Rights
208
+ Reserved" are retained in Python 1.6.1 alone or in any derivative
209
+ version prepared by Licensee. Alternately, in lieu of CNRI's License
210
+ Agreement, Licensee may substitute the following text (omitting the
211
+ quotes): "Python 1.6.1 is made available subject to the terms and
212
+ conditions in CNRI's License Agreement. This Agreement together with
213
+ Python 1.6.1 may be located on the Internet using the following
214
+ unique, persistent identifier (known as a handle): 1895.22/1013. This
215
+ Agreement may also be obtained from a proxy server on the Internet
216
+ using the following URL: http://hdl.handle.net/1895.22/1013".
217
+
218
+ 3. In the event Licensee prepares a derivative work that is based on
219
+ or incorporates Python 1.6.1 or any part thereof, and wants to make
220
+ the derivative work available to others as provided herein, then
221
+ Licensee hereby agrees to include in any such work a brief summary of
222
+ the changes made to Python 1.6.1.
223
+
224
+ 4. CNRI is making Python 1.6.1 available to Licensee on an "AS IS"
225
+ basis. CNRI MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR
226
+ IMPLIED. BY WAY OF EXAMPLE, BUT NOT LIMITATION, CNRI MAKES NO AND
227
+ DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS
228
+ FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF PYTHON 1.6.1 WILL NOT
229
+ INFRINGE ANY THIRD PARTY RIGHTS.
230
+
231
+ 5. CNRI SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF PYTHON
232
+ 1.6.1 FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS AS
233
+ A RESULT OF MODIFYING, DISTRIBUTING, OR OTHERWISE USING PYTHON 1.6.1,
234
+ OR ANY DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF.
235
+
236
+ 6. This License Agreement will automatically terminate upon a material
237
+ breach of its terms and conditions.
238
+
239
+ 7. This License Agreement shall be governed by the federal
240
+ intellectual property law of the United States, including without
241
+ limitation the federal copyright law, and, to the extent such
242
+ U.S. federal law does not apply, by the law of the Commonwealth of
243
+ Virginia, excluding Virginia's conflict of law provisions.
244
+ Notwithstanding the foregoing, with regard to derivative works based
245
+ on Python 1.6.1 that incorporate non-separable material that was
246
+ previously distributed under the GNU General Public License (GPL), the
247
+ law of the Commonwealth of Virginia shall govern this License
248
+ Agreement only as to issues arising under or with respect to
249
+ Paragraphs 4, 5, and 7 of this License Agreement. Nothing in this
250
+ License Agreement shall be deemed to create any relationship of
251
+ agency, partnership, or joint venture between CNRI and Licensee. This
252
+ License Agreement does not grant permission to use CNRI trademarks or
253
+ trade name in a trademark sense to endorse or promote products or
254
+ services of Licensee, or any third party.
255
+
256
+ 8. By clicking on the "ACCEPT" button where indicated, or by copying,
257
+ installing or otherwise using Python 1.6.1, Licensee agrees to be
258
+ bound by the terms and conditions of this License Agreement.
259
+
260
+ ACCEPT
261
+
262
+
263
+ CWI LICENSE AGREEMENT FOR PYTHON 0.9.0 THROUGH 1.2
264
+ --------------------------------------------------
265
+
266
+ Copyright (c) 1991 - 1995, Stichting Mathematisch Centrum Amsterdam,
267
+ The Netherlands. All rights reserved.
268
+
269
+ Permission to use, copy, modify, and distribute this software and its
270
+ documentation for any purpose and without fee is hereby granted,
271
+ provided that the above copyright notice appear in all copies and that
272
+ both that copyright notice and this permission notice appear in
273
+ supporting documentation, and that the name of Stichting Mathematisch
274
+ Centrum or CWI not be used in advertising or publicity pertaining to
275
+ distribution of the software without specific, written prior
276
+ permission.
277
+
278
+ STICHTING MATHEMATISCH CENTRUM DISCLAIMS ALL WARRANTIES WITH REGARD TO
279
+ THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
280
+ FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH CENTRUM BE LIABLE
281
+ FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
282
+ WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
283
+ ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
284
+ OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
gitpane/vendor/w32.exe ADDED
Binary file
Binary file
gitpane/vendor/w64.exe ADDED
Binary file
File without changes