This commit is contained in:
Saturneic 2019-03-13 13:03:30 +08:00
parent f57f3a2783
commit e988091cbe
8 changed files with 433 additions and 137 deletions

BIN
.DS_Store vendored

Binary file not shown.

231
.idea/workspace.xml generated
View File

@ -2,14 +2,13 @@
<project version="4">
<component name="ChangeListManager">
<list default="true" id="d703f139-38f3-455d-a086-a2da561870b5" name="Default Changelist" comment="">
<change afterPath="$PROJECT_DIR$/change.py" afterDir="false" />
<change afterPath="$PROJECT_DIR$/info.py" afterDir="false" />
<change afterPath="$PROJECT_DIR$/main.py" afterDir="false" />
<change afterPath="$PROJECT_DIR$/sshtool.py" afterDir="false" />
<change afterPath="$PROJECT_DIR$/branchmanager.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" />
<change beforePath="$PROJECT_DIR$/change.py" beforeDir="false" afterPath="$PROJECT_DIR$/change.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/git.py" beforeDir="false" afterPath="$PROJECT_DIR$/git.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/keygen.py" beforeDir="false" afterPath="$PROJECT_DIR$/keygen.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/window.py" beforeDir="false" afterPath="$PROJECT_DIR$/window.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/info.py" beforeDir="false" afterPath="$PROJECT_DIR$/info.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/main.py" beforeDir="false" afterPath="$PROJECT_DIR$/main.py" afterDir="false" />
<change beforePath="$PROJECT_DIR$/sshtool.py" beforeDir="false" afterPath="$PROJECT_DIR$/sshtool.py" afterDir="false" />
</list>
<option name="EXCLUDED_CONVERTED_TO_IGNORED" value="true" />
<option name="SHOW_DIALOG" value="false" />
@ -18,10 +17,11 @@
<option name="LAST_RESOLUTION" value="IGNORE" />
</component>
<component name="CoverageDataManager">
<SUITE FILE_PATH="coverage/giteasy$main.coverage" NAME="main Coverage Results" MODIFIED="1552383036027" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="true" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$" />
<SUITE FILE_PATH="coverage/giteasy$main.coverage" NAME="main Coverage Results" MODIFIED="1552453031291" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="true" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$" />
<SUITE FILE_PATH="coverage/giteasy$Debug.coverage" NAME="Debug Coverage Results" MODIFIED="1552305147101" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="true" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$" />
<SUITE FILE_PATH="coverage/giteasy$ssh.coverage" NAME="ssh Coverage Results" MODIFIED="1552191792390" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="true" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$" />
<SUITE FILE_PATH="coverage/giteasy$window.coverage" NAME="window Coverage Results" MODIFIED="1552378199288" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="true" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$" />
<SUITE FILE_PATH="coverage/giteasy$branchmanager.coverage" NAME="branchmanager Coverage Results" MODIFIED="1552413252082" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="true" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$" />
<SUITE FILE_PATH="coverage/giteasy$keygen.coverage" NAME="keygen Coverage Results" MODIFIED="1552305621065" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="true" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$" />
</component>
<component name="DatabaseView">
@ -42,44 +42,44 @@
<session id="46200952">
<usages-collector id="statistics.lifecycle.project">
<counts>
<entry key="project.closed" value="1" />
<entry key="project.open.time.0" value="1" />
<entry key="project.opened" value="1" />
<entry key="project.open.time.16" value="1" />
<entry key="project.opened" value="2" />
</counts>
</usages-collector>
<usages-collector id="statistics.file.extensions.edit">
<counts>
<entry key="py" value="8499" />
<entry key="py" value="11673" />
</counts>
</usages-collector>
<usages-collector id="statistics.file.types.edit">
<counts>
<entry key="Python" value="8499" />
<entry key="Python" value="11673" />
</counts>
</usages-collector>
<usages-collector id="statistics.file.extensions.open">
<counts>
<entry key="py" value="6" />
<entry key="py" value="7" />
</counts>
</usages-collector>
<usages-collector id="statistics.file.types.open">
<counts>
<entry key="Python" value="6" />
<entry key="Python" value="7" />
</counts>
</usages-collector>
</session>
</component>
<component name="FileEditorManager">
<leaf SIDE_TABS_SIZE_LIMIT_KEY="300">
<file pinned="false" current-in-tab="false">
<file pinned="false" current-in-tab="true">
<entry file="file://$PROJECT_DIR$/git.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="170">
<caret line="157" column="47" lean-forward="true" selection-start-line="157" selection-start-column="47" selection-end-line="157" selection-end-column="47" />
<state relative-caret-position="285">
<caret line="305" column="38" selection-start-line="305" selection-start-column="38" selection-end-line="305" selection-end-column="38" />
<folding>
<element signature="e#0#9#0" expanded="true" />
<marker date="1552379614982" expanded="true" signature="3753:3944" ph="..." />
<marker date="1552379614982" expanded="true" signature="9429:10463" ph="..." />
<marker date="1552379614982" expanded="true" signature="12571:12747" ph="..." />
<marker date="1552453029448" expanded="true" signature="13269:13995" ph="..." />
</folding>
</state>
</provider>
@ -88,7 +88,7 @@
<file pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/ssh.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="199">
<state relative-caret-position="60">
<caret line="25" selection-start-line="25" selection-end-line="25" />
</state>
</provider>
@ -98,7 +98,7 @@
<entry file="file://$PROJECT_DIR$/keygen.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="120">
<caret line="27" column="27" lean-forward="true" selection-start-line="27" selection-start-column="27" selection-end-line="27" selection-end-column="27" />
<caret line="27" column="27" selection-start-line="27" selection-start-column="27" selection-end-line="27" selection-end-column="27" />
<folding>
<element signature="e#0#10#0" expanded="true" />
</folding>
@ -109,7 +109,7 @@
<file pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/window.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="54">
<state relative-caret-position="45">
<caret line="7" column="15" selection-start-line="7" selection-start-column="8" selection-end-line="7" selection-end-column="15" />
<folding>
<element signature="e#0#21#0" expanded="true" />
@ -118,14 +118,14 @@
</provider>
</entry>
</file>
<file pinned="false" current-in-tab="true">
<file pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/main.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="302">
<caret line="66" column="25" selection-start-line="66" selection-start-column="25" selection-end-line="66" selection-end-column="25" />
<state relative-caret-position="194">
<caret line="274" column="33" selection-start-line="274" selection-start-column="33" selection-end-line="274" selection-end-column="33" />
<folding>
<element signature="e#0#21#0" expanded="true" />
<marker date="1552383034754" expanded="true" signature="14292:14619" ph="..." />
<marker date="1552452986156" expanded="true" signature="15540:15546" ph="..." />
</folding>
</state>
</provider>
@ -134,8 +134,8 @@
<file pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/info.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="105">
<caret line="7" column="32" lean-forward="true" selection-start-line="7" selection-start-column="32" selection-end-line="7" selection-end-column="32" />
<state relative-caret-position="120">
<caret line="8" column="27" lean-forward="true" selection-start-line="8" selection-start-column="27" selection-end-line="8" selection-end-column="27" />
<folding>
<element signature="e#0#21#0" expanded="true" />
</folding>
@ -146,8 +146,8 @@
<file pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/change.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="161">
<caret line="56" column="13" lean-forward="true" selection-start-line="56" selection-start-column="13" selection-end-line="56" selection-end-column="13" />
<state relative-caret-position="26">
<caret line="14" column="37" selection-start-line="14" selection-start-column="37" selection-end-line="14" selection-end-column="37" />
<folding>
<element signature="e#0#21#0" expanded="true" />
</folding>
@ -158,12 +158,30 @@
<file pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/sshtool.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="301">
<caret line="46" column="40" lean-forward="true" selection-start-line="46" selection-start-column="40" selection-end-line="46" selection-end-column="40" />
<state relative-caret-position="-331">
<caret line="6" lean-forward="true" selection-start-line="6" selection-end-line="6" />
<folding>
<element signature="e#0#21#0" expanded="true" />
<marker date="1552382171651" expanded="true" signature="163:2035" ph="..." />
<marker date="1552382171651" expanded="true" signature="1108:1599" ph="..." />
<marker date="1552409960112" expanded="true" signature="1144:1635" ph="..." />
</folding>
</state>
</provider>
</entry>
</file>
<file pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/branchmanager.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="30">
<caret line="66" column="24" lean-forward="true" selection-start-line="66" selection-start-column="24" selection-end-line="66" selection-end-column="24" />
<folding>
<element signature="e#0#21#0" expanded="true" />
<marker date="1552415132051" expanded="true" signature="178:183" ph="..." />
<marker date="1552415132051" expanded="true" signature="2638:3140" ph="..." />
<marker date="1552415132051" expanded="true" signature="3158:3361" ph="..." />
<marker date="1552415132051" expanded="true" signature="3378:3493" ph="..." />
<marker date="1552415132051" expanded="true" signature="3519:3983" ph="..." />
<marker date="1552415132051" expanded="true" signature="4005:4694" ph="..." />
<marker date="1552415132051" expanded="true" signature="5012:5663" ph="..." />
</folding>
</state>
</provider>
@ -182,6 +200,8 @@
<findStrings>
<find>self.remotes</find>
<find>save</find>
<find>do_save</find>
<find>print</find>
</findStrings>
</component>
<component name="Git.Settings">
@ -194,13 +214,14 @@
<option value="$PROJECT_DIR$/venv/ssh.py" />
<option value="$PROJECT_DIR$/ssh.py" />
<option value="$PROJECT_DIR$/server.py" />
<option value="$PROJECT_DIR$/info.py" />
<option value="$PROJECT_DIR$/git.py" />
<option value="$PROJECT_DIR$/window.py" />
<option value="$PROJECT_DIR$/keygen.py" />
<option value="$PROJECT_DIR$/sshtool.py" />
<option value="$PROJECT_DIR$/change.py" />
<option value="$PROJECT_DIR$/sshtool.py" />
<option value="$PROJECT_DIR$/info.py" />
<option value="$PROJECT_DIR$/branchmanager.py" />
<option value="$PROJECT_DIR$/main.py" />
<option value="$PROJECT_DIR$/git.py" />
</list>
</option>
</component>
@ -220,7 +241,6 @@
<foldersAlwaysOnTop value="true" />
</navigator>
<panes>
<pane id="Scope" />
<pane id="ProjectPane">
<subPane>
<expand>
@ -228,11 +248,6 @@
<item name="giteasy" type="b2602c69:ProjectViewProjectNode" />
<item name="giteasy" type="462c0819:PsiDirectoryNode" />
</path>
<path>
<item name="giteasy" type="b2602c69:ProjectViewProjectNode" />
<item name="giteasy" type="462c0819:PsiDirectoryNode" />
<item name="bin" type="462c0819:PsiDirectoryNode" />
</path>
<path>
<item name="giteasy" type="b2602c69:ProjectViewProjectNode" />
<item name="External Libraries" type="cb654da1:ExternalLibrariesNode" />
@ -241,6 +256,7 @@
<select />
</subPane>
</pane>
<pane id="Scope" />
</panes>
</component>
<component name="PropertiesComponent">
@ -314,6 +330,28 @@
<option name="INPUT_FILE" value="" />
<method v="2" />
</configuration>
<configuration name="branchmanager" type="PythonConfigurationType" factoryName="Python" temporary="true">
<module name="giteasy" />
<option name="INTERPRETER_OPTIONS" value="" />
<option name="PARENT_ENVS" value="true" />
<envs>
<env name="PYTHONUNBUFFERED" value="1" />
</envs>
<option name="SDK_HOME" value="$PROJECT_DIR$/bin/python" />
<option name="WORKING_DIRECTORY" value="$PROJECT_DIR$" />
<option name="IS_MODULE_SDK" value="true" />
<option name="ADD_CONTENT_ROOTS" value="true" />
<option name="ADD_SOURCE_ROOTS" value="true" />
<EXTENSION ID="PythonCoverageRunConfigurationExtension" runner="coverage.py" />
<option name="SCRIPT_NAME" value="$PROJECT_DIR$/branchmanager.py" />
<option name="PARAMETERS" value="" />
<option name="SHOW_COMMAND_LINE" value="false" />
<option name="EMULATE_TERMINAL" value="false" />
<option name="MODULE_MODE" value="false" />
<option name="REDIRECT_INPUT" value="false" />
<option name="INPUT_FILE" value="" />
<method v="2" />
</configuration>
<configuration name="keygen" type="PythonConfigurationType" factoryName="Python">
<module name="giteasy" />
<option name="INTERPRETER_OPTIONS" value="" />
@ -385,10 +423,12 @@
<item itemvalue="Python.keygen" />
<item itemvalue="Python.window" />
<item itemvalue="Python.main" />
<item itemvalue="Python.branchmanager" />
</list>
<recent_temporary>
<list>
<item itemvalue="Python.main" />
<item itemvalue="Python.branchmanager" />
<item itemvalue="Python.window" />
</list>
</recent_temporary>
@ -419,28 +459,35 @@
<option name="project" value="LOCAL" />
<updated>1552328916410</updated>
</task>
<option name="localTasksCounter" value="3" />
<task id="LOCAL-00003" summary="Fixed and Added.">
<created>1552383089132</created>
<option name="number" value="00003" />
<option name="presentableId" value="LOCAL-00003" />
<option name="project" value="LOCAL" />
<updated>1552383089132</updated>
</task>
<option name="localTasksCounter" value="4" />
<servers />
</component>
<component name="TimeTrackingManager">
<option name="totallyTimeSpent" value="21133000" />
</component>
<component name="ToolWindowManager">
<frame x="0" y="23" width="1440" height="811" extended-state="6" />
<frame x="0" y="23" width="1440" height="811" extended-state="0" />
<editor active="true" />
<layout>
<window_info id="Favorites" order="0" side_tool="true" />
<window_info content_ui="combo" id="Project" order="1" visible="true" weight="0.14449213" />
<window_info content_ui="combo" id="Project" order="1" visible="true" weight="0.14663805" />
<window_info id="Structure" order="2" side_tool="true" weight="0.25" />
<window_info anchor="bottom" id="Database Changes" order="0" show_stripe_button="false" />
<window_info anchor="bottom" id="Terminal" order="1" sideWeight="0.4985694" weight="0.32962447" />
<window_info anchor="bottom" id="Event Log" order="2" sideWeight="0.50429183" side_tool="true" visible="true" weight="0.2628651" />
<window_info anchor="bottom" id="Event Log" order="2" sideWeight="0.50500715" side_tool="true" visible="true" weight="0.2628651" />
<window_info anchor="bottom" id="Version Control" order="3" sideWeight="0.4985694" weight="0.32962447" />
<window_info anchor="bottom" id="Python Console" order="4" weight="0.3286517" />
<window_info anchor="bottom" id="Docker" order="5" show_stripe_button="false" />
<window_info anchor="bottom" id="Message" order="6" />
<window_info anchor="bottom" id="Find" order="7" weight="0.329718" />
<window_info active="true" anchor="bottom" id="Run" order="8" sideWeight="0.49570817" visible="true" weight="0.2628651" />
<window_info active="true" anchor="bottom" id="Run" order="8" sideWeight="0.49499285" visible="true" weight="0.2628651" />
<window_info anchor="bottom" id="Debug" order="9" sideWeight="0.49928468" weight="0.30737135" />
<window_info anchor="bottom" id="Cvs" order="10" weight="0.25" />
<window_info anchor="bottom" id="Inspection" order="11" weight="0.4" />
@ -488,9 +535,36 @@
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/keygen.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="120">
<caret line="27" column="27" selection-start-line="27" selection-start-column="27" selection-end-line="27" selection-end-column="27" />
<folding>
<element signature="e#0#10#0" expanded="true" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/branchmanager.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="30">
<caret line="66" column="24" lean-forward="true" selection-start-line="66" selection-start-column="24" selection-end-line="66" selection-end-column="24" />
<folding>
<element signature="e#0#21#0" expanded="true" />
<marker date="1552415132051" expanded="true" signature="178:183" ph="..." />
<marker date="1552415132051" expanded="true" signature="2638:3140" ph="..." />
<marker date="1552415132051" expanded="true" signature="3158:3361" ph="..." />
<marker date="1552415132051" expanded="true" signature="3378:3493" ph="..." />
<marker date="1552415132051" expanded="true" signature="3519:3983" ph="..." />
<marker date="1552415132051" expanded="true" signature="4005:4694" ph="..." />
<marker date="1552415132051" expanded="true" signature="5012:5663" ph="..." />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/window.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="54">
<state relative-caret-position="45">
<caret line="7" column="15" selection-start-line="7" selection-start-column="8" selection-end-line="7" selection-end-column="15" />
<folding>
<element signature="e#0#21#0" expanded="true" />
@ -500,25 +574,25 @@
</entry>
<entry file="file://$PROJECT_DIR$/ssh.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="199">
<state relative-caret-position="60">
<caret line="25" selection-start-line="25" selection-end-line="25" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/change.py">
<entry file="file://$PROJECT_DIR$/info.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="161">
<caret line="56" column="13" lean-forward="true" selection-start-line="56" selection-start-column="13" selection-end-line="56" selection-end-column="13" />
<state relative-caret-position="120">
<caret line="8" column="27" lean-forward="true" selection-start-line="8" selection-start-column="27" selection-end-line="8" selection-end-column="27" />
<folding>
<element signature="e#0#21#0" expanded="true" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/info.py">
<entry file="file://$PROJECT_DIR$/change.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="105">
<caret line="7" column="32" lean-forward="true" selection-start-line="7" selection-start-column="32" selection-end-line="7" selection-end-column="32" />
<state relative-caret-position="26">
<caret line="14" column="37" selection-start-line="14" selection-start-column="37" selection-end-line="14" selection-end-column="37" />
<folding>
<element signature="e#0#21#0" expanded="true" />
</folding>
@ -527,46 +601,33 @@
</entry>
<entry file="file://$PROJECT_DIR$/sshtool.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="301">
<caret line="46" column="40" lean-forward="true" selection-start-line="46" selection-start-column="40" selection-end-line="46" selection-end-column="40" />
<state relative-caret-position="-331">
<caret line="6" lean-forward="true" selection-start-line="6" selection-end-line="6" />
<folding>
<element signature="e#0#21#0" expanded="true" />
<marker date="1552382171651" expanded="true" signature="163:2035" ph="..." />
<marker date="1552382171651" expanded="true" signature="1108:1599" ph="..." />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/git.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="170">
<caret line="157" column="47" lean-forward="true" selection-start-line="157" selection-start-column="47" selection-end-line="157" selection-end-column="47" />
<folding>
<element signature="e#0#9#0" expanded="true" />
<marker date="1552379614982" expanded="true" signature="3753:3944" ph="..." />
<marker date="1552379614982" expanded="true" signature="9429:10463" ph="..." />
<marker date="1552379614982" expanded="true" signature="12571:12747" ph="..." />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/keygen.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="120">
<caret line="27" column="27" lean-forward="true" selection-start-line="27" selection-start-column="27" selection-end-line="27" selection-end-column="27" />
<folding>
<element signature="e#0#10#0" expanded="true" />
<marker date="1552409960112" expanded="true" signature="1144:1635" ph="..." />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/main.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="302">
<caret line="66" column="25" selection-start-line="66" selection-start-column="25" selection-end-line="66" selection-end-column="25" />
<state relative-caret-position="194">
<caret line="274" column="33" selection-start-line="274" selection-start-column="33" selection-end-line="274" selection-end-column="33" />
<folding>
<element signature="e#0#21#0" expanded="true" />
<marker date="1552383034754" expanded="true" signature="14292:14619" ph="..." />
<marker date="1552452986156" expanded="true" signature="15540:15546" ph="..." />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/git.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="285">
<caret line="305" column="38" selection-start-line="305" selection-start-column="38" selection-end-line="305" selection-end-column="38" />
<folding>
<element signature="e#0#9#0" expanded="true" />
<marker date="1552453029448" expanded="true" signature="13269:13995" ph="..." />
</folding>
</state>
</provider>

177
branchmanager.py Normal file
View File

@ -0,0 +1,177 @@
from tkinter import *
from tkinter.ttk import *
from tkinter.messagebox import *
import os
from keygen import *
import window
from info import Info
class Branch(window.Window):
def __init__(self, master):
super().__init__(master)
master.title("Branch Manager")
super().set_height(350)
super().set_width(480)
super().set_position(350, 200)
super().apply()
self.master = master
self.text = Text(self)
self.list_btn = Button(self, width=12)
self.add_btn = Button(self, width=12)
self.checkout_btn = Button(self, width=12)
self.merge_btn = Button(self, width=12)
self.merge_list_btn = Button(self, width=12)
self.delete_btn = Button(self, width=12)
self.draw_widgets()
self.branches = []
self.current_branches = None
self.info = None
self.get_branches()
def draw_widgets(self):
self.text.grid(row=0,column=1,rowspan=8)
self.list_btn["text"] = "List"
self.checkout_btn["text"] = "Checkout"
self.merge_btn["text"] = "Merge"
self.merge_list_btn["text"] = "Merge List"
self.delete_btn["text"] = "Delete"
self.add_btn["text"] = "Add"
self.list_btn["command"] = self.do_list
self.add_btn["command"] = self.do_add
self.checkout_btn["command"] = self.do_checkout
self.merge_btn["command"] = self.do_merge
self.merge_list_btn["command"] = self.do_merge_list
self.delete_btn["command"] = self.do_delete
self.list_btn.grid(row=0,column=0)
self.add_btn.grid(row=1, column=0)
self.checkout_btn.grid(row=2,column=0)
self.merge_btn.grid(row=3, column=0)
self.merge_list_btn.grid(row=4, column=0)
self.delete_btn.grid(row=5, column=0)
self.text.insert(INSERT, "Branch Manager Interface\n")
self.text.insert(INSERT,"-----------------------------------\n")
def get_branches(self):
stdout = os.popen("git branch -v").read()
self.current_branches = None
self.branches = []
lines = []
str = ""
for char in stdout:
if char is '\n':
lines.append(str)
str = ""
else:
str += char
for line in lines:
branch_info = re.split(r"[ ]+",line)
print(branch_info)
if len(branch_info) > 3:
if branch_info[0] is '*':
self.current_branches = branch_info[1]
self.branches.append(branch_info[1])
def do_merge_list(self):
stdout = os.popen("git branch --merged").read()
self.text.insert(INSERT, "-----------------------------------\n")
self.text.insert(INSERT, "Merged Branches\n")
self.text.insert(INSERT, stdout + "\n")
self.text.insert(INSERT, "-----------------------------------\n")
self.text.insert(INSERT, "Unmerged Branches\n")
stdout = os.popen("git branch --no-merged").read()
self.text.insert(INSERT, stdout + "\n")
self.text.see(END)
def do_list(self):
stdout = os.popen("git branch -v").read()
self.text.insert(INSERT, "-----------------------------------\n")
self.text.insert(INSERT, stdout+"\n")
self.text.see(END)
def do_add(self):
self.get_branches()
self.info = Info(Tk())
self.info.set_click(self.do_add_callback)
def do_add_callback(self):
stdout = os.popen("git branch {0}".format(self.info.information.get())).read()
self.text.insert(INSERT, "-----------------------------------\n")
self.text.insert(INSERT, "New Branch {0}\n".format(self.info.information.get()))
self.text.insert(INSERT, stdout + "\n")
self.text.see(END)
self.info.master.protocol("WM_DELETE_WINDOW", self.destroy_info)
self.info.master.destroy()
self.info = None
def do_checkout(self):
self.get_branches()
self.info = Info(Tk(), "Combobox")
self.info.information["value"] = self.branches
self.info.set_click(self.do_checkout_callback)
def do_checkout_callback(self):
stdout = os.popen("git checkout {0}".format(self.info.information.get())).read()
self.text.insert(INSERT, "-----------------------------------\n")
self.text.insert(INSERT, "Checkout Branch {0}\n".format(self.info.information.get()))
self.text.insert(INSERT, stdout + "\n")
self.text.see(END)
self.info.master.protocol("WM_DELETE_WINDOW", self.destroy_info)
self.info.master.destroy()
self.info = None
def do_merge(self):
self.get_branches()
self.info = Info(Tk(), "Combobox")
branches_tmp = self.branches
branches_tmp.remove(self.current_branches)
self.info.information["value"] = branches_tmp
self.info.set_click(self.do_merge_callback)
def do_merge_callback(self):
stdout = os.popen("git merge {0}".format(self.info.information.get())).read()
self.text.insert(INSERT, "-----------------------------------\n")
self.text.insert(INSERT, "Merge Branch From {0} To {1}\n"
.format(self.current_branches,self.info.information.get()))
if len(stdout) > 4:
self.text.insert(INSERT, stdout + "\n")
else:
self.text.insert(INSERT, "Merge Failed. Please check conflict.\n")
self.text.see(END)
self.info.master.protocol("WM_DELETE_WINDOW", self.destroy_info)
self.info.master.destroy()
self.info = None
def do_delete(self):
self.get_branches()
self.info = Info(Tk(), "Combobox")
self.info.information["value"] = self.branches
self.info.set_click(self.do_delete_callback)
def do_delete_callback(self):
stdout = os.popen("git branch -d {0}".format(self.info.information.get())).read()
self.text.insert(INSERT, "-----------------------------------\n")
self.text.insert(INSERT, "Delete Branch {0}\n".format(self.info.information.get()))
if self.info.information.get() == self.current_branches:
self.text.insert(INSERT, "error: Cannot delete branch '{0}' checked out\n".format(self.current_branches))
else:
self.text.insert(INSERT, stdout + "\n")
self.text.see(END)
self.info.master.protocol("WM_DELETE_WINDOW", self.destroy_info)
self.info.master.destroy()
self.info = None
def destroy_info(self):
self.info.master.eval('::ttk::CancelRepeat')
self.info.master.destroy()
self.info = None
if __name__ == "__main__":
bmgr = Branch(Tk())
bmgr.mainloop()

View File

@ -12,6 +12,7 @@ class Changes(window.Window):
super().set_position(50,50)
super().set_width(870)
super().apply()
master.title("Changes Manager")
self.list = Listbox(self, width=35, height=30)
self.text = Text(self, width=75, height=35)
self.sb = Scrollbar(self)

58
git.py
View File

@ -33,6 +33,8 @@ class Git(ssh.SSH):
self.ssh_hostname = hostname
self.passwd = passwd
self.path = path
self.branches_server = []
self.current_branch_server = ""
def global_init(self, git_user, git_email):
self.git_user = git_user
@ -141,7 +143,7 @@ class Git(ssh.SSH):
self.projects[project_name] = {"path": "{0}/{1}".format(self.base_path[1], project_name),
"branch": []}
self.if_get_project = True
if self.if_fix_project:
if self.if_fix_project and self.if_fix_local:
self.get_branch()
else:
raise ValueError("Base Path Abnormal")
@ -197,13 +199,11 @@ class Git(ssh.SSH):
for remote in os.popen("git remote -v").readlines():
results = ret_code.split(remote)
results = list(results)
print(results)
if len(results) >= 1:
self.remotes = {}
for item in results:
if results[0] not in self.remotes.keys():
self.remotes[results[0]] = {"name": results[0], "url": results[1]}
print(self.remotes[results[0]])
self.if_get_remote = True
else:
raise AttributeError("Set Local & Fix Project & Base Init First.")
@ -211,7 +211,11 @@ class Git(ssh.SSH):
def push_remote(self, name, branch):
if self.if_fix_project and self.if_base_init and self.if_set_local \
and self.if_get_remote:
self.get_branch_server()
if name in self.remotes.keys():
if branch not in self.branches_server:
return os.popen("git push -u {0} {1}".format(name, branch)).read()
else:
return os.popen("git push {0} {1}".format(name, branch)).read()
else:
raise ValueError("Name Abnormal")
@ -221,8 +225,11 @@ class Git(ssh.SSH):
def pull_remote(self, name, branch):
if self.if_fix_project and self.if_base_init and self.if_set_local \
and self.if_get_remote:
self.get_branch_server()
if name in self.remotes.keys():
if branch in self.branches_server:
return os.popen("git pull {0} {1}".format(name, branch)).read()
else: return "Current Branch '{0}' Not Exist In Server.".format(branch)
else:
raise ValueError("Remote Error")
else:
@ -241,14 +248,10 @@ class Git(ssh.SSH):
new_tmp_ret = new_ret_code.search(line)
if modified_tmp_ret is not None:
modified_file = modified_tmp_ret.group()
print(modified_file)
changed_files.append(modified_file)
elif new_tmp_ret is not None:
new_file = new_tmp_ret.group()
print(new_file)
changed_files.append(new_file)
return changed_files
else:
@ -288,17 +291,46 @@ class Git(ssh.SSH):
if self.if_get_project and self.if_base_init and self.if_fix_local:
stdout = os.popen("git branch").read()
self.projects[self.fix_name+".git"]["branch"] = []
reform = re.compile("\w+")
for branch in stdout:
branch_name = reform.search("*master").group().strip('\n')
self.projects[self.fix_name+".git"]["branch"].append(branch_name)
reform = re.compile("[ ]+")
self.projects[self.fix_name + ".git"]["active_branch"] = ""
lines = []
str = ""
for char in stdout:
if char is '\n':
lines.append(str)
str = ""
else:
str += char
if '*' in str(branch):
self.projects[self.fix_name+".git"]["active_branch"] = branch_name
for branch in lines:
print("Branch:",branch)
branch_name = reform.split(branch)
if branch_name[0] == '*':
self.projects[self.fix_name+".git"]["active_branch"] = branch_name[1]
self.projects[self.fix_name + ".git"]["branch"].append(branch_name[1])
else:
self.projects[self.fix_name + ".git"]["branch"].append(branch_name[1])
self.if_get_branches = True
else:
raise AttributeError("Get Project & Base Init & Fix Local First.")
def get_branch_server(self):
if self.if_connected and self.if_get_project and self.if_fix_project:
self.branches_server = []
self.current_branch_server = ""
stdout, stderr = self.run(self.fix_cmd+"git branch -v")
ret_code = re.compile(r"[ ]+")
for branch in stdout:
branches_info = ret_code.split(branch)
if branches_info[0] == '*':
self.current_branch_server = branches_info[1]
self.branches_server.append(branches_info[1])
else:
self.branches_server.append(branches_info[1])
else:
raise AttributeError("Get Project & Base Init & Fix Project First.")
def status(self):
if self.fix_name and self.if_fix_local and self.if_base_init:
stdout = os.popen("git status").read()

View File

@ -4,8 +4,9 @@ from tkinter.messagebox import *
import window
class Info(window.Window):
def __init__(self, master=None, type="Entry"):
def __init__(self, master=None, type="Entry", title = "INFO"):
super().__init__(master)
master.title(title)
if type is "Combobox":
info_type = Combobox(self)
else:
@ -14,6 +15,7 @@ class Info(window.Window):
self.information = info_type
self.ok = Button(self)
self.draw_widgets()
self.master = master
def draw_widgets(self):
self.information_label["text"] = "Info: "

54
main.py
View File

@ -8,11 +8,14 @@ import window
from info import *
from change import *
from sshtool import *
from branchmanager import *
import paramiko
class Main(window.Window):
def __init__(self, master=None):
super().__init__(master)
master.title("GitEasy")
self.style.configure("M.MButton",)
self.connect = None
self.hostname_label = Label(self, width=8)
@ -28,7 +31,7 @@ class Main(window.Window):
self.broad = Text(self, width=85, height=30)
self.fix_project_label = Label(self, width=15)
self.local_path_label = Label(self, width=25)
self.get_branch = Button(self, width=12)
self.branches = Button(self, width=12)
self.set_local = Button(self, width=12)
self.add_remote = Button(self, width=12)
self.list_remote = Button(self, width=12)
@ -71,9 +74,13 @@ class Main(window.Window):
self.git = git.Git(hostname=self.hostname.get(),
user=self.user_name.get(), passwd=self.password.get(),
path="/home/git/")
finally:
except paramiko.ssh_exception.AuthenticationException:
self.connection_status["text"] = "Failed"
showinfo(message="Authentication failed.")
return
self.connection_status["text"] = "Succeed"
try:
self.git.base_init()
self.git.update_projects()
@ -85,11 +92,14 @@ class Main(window.Window):
self.git.set_local(self.save_info["local_path"])
self.broad.insert(INSERT, "Set Local Path...OK" + "\n")
self.local_path_label["text"] = "Local Path:"+self.save_info["local_path"]
self.do_list()
self.git.update_projects()
self.git.list_projects()
if self.save_info["fix_project"]+".git" in self.git.projects_list:
self.git.fix_project(self.save_info["fix_project"])
self.broad.insert(INSERT, "--------------------------\n")
self.broad.insert(INSERT, "Auto Fix Project {0}\n".format(self.save_info["fix_project"]+".git"))
self.broad.insert(INSERT, "Auto Fix Project ({0})\n".format(self.save_info["fix_project"] + ".git"))
self.git.fix_project(self.save_info["fix_project"])
self.fix_local_plus()
self.broad.see(END)
self.fix_project_label["text"] = "Fixed Project: {0}".format(self.save_info["fix_project"])
@ -161,8 +171,12 @@ class Main(window.Window):
showinfo(message=errinfo)
return
self.fix_project_label["text"] = "Fixed Project: {0}".format(self.info.information.get())
try:
self.fix_local_plus()
self.info.master.protocol("WM_DELETE_WINDOW", self.destroy_info)
self.info.master.destroy()
def fix_local_plus(self):
try:
if os.path.exists(os.path.join(self.git.local_path, self.git.fix_name)) and self.git.if_set_local:
self.broad.insert(INSERT, "Check Local Project...OK \n")
else:
@ -178,16 +192,12 @@ class Main(window.Window):
self.git.fetch_remote("origin")
self.broad.insert(INSERT, "Fetch Server Project...OK \n")
self.git.get_branch()
self.broad.insert(INSERT, "Get Local Project's Branches...OK \n")
self.broad.see(END)
except AttributeError as errinfo:
showinfo(message=errinfo)
return
self.info.master.protocol("WM_DELETE_WINDOW", self.destroy_info)
self.info.master.destroy()
def do_get_branch(self):
try:
@ -262,8 +272,10 @@ class Main(window.Window):
def do_pull(self):
try:
stdout = self.git.pull_remote("origin", "master")
self.git.get_branch()
stdout = self.git.pull_remote("origin", self.git.projects[self.git.fix_name+".git"]["active_branch"])
self.broad.insert(INSERT, "--------------------------\n")
self.broad.insert(INSERT, "Pull Action\n")
self.broad.insert(INSERT, "{0}\n".format(stdout))
self.broad.see(END)
except AttributeError as errinfo:
@ -272,8 +284,11 @@ class Main(window.Window):
def do_push(self):
try:
stdout = self.git.push_remote("origin", "master")
self.git.get_branch()
print("Active Branch:",self.git.projects[self.git.fix_name+".git"]["active_branch"])
stdout = self.git.push_remote("origin", self.git.projects[self.git.fix_name+".git"]["active_branch"])
self.broad.insert(INSERT, "--------------------------\n")
self.broad.insert(INSERT, "Push Action\n")
self.broad.insert(INSERT, "{0}\n".format(stdout))
self.broad.see(END)
except AttributeError as errinfo:
@ -313,6 +328,7 @@ class Main(window.Window):
self.broad.insert(INSERT, "--------------------------\n")
self.broad.insert(INSERT, "Data Information Saved\n")
self.broad.insert(INSERT, "Path: "+os.path.join(os.environ['HOME'],"save_data.json"))
self.broad.see(END)
else:
raise AttributeError("Please Connect And Set Local Path First.")
except AttributeError as errinfo:
@ -350,6 +366,12 @@ class Main(window.Window):
else:
showinfo(message="Connect First")
def start_branch_manager(self):
if self.git is not None and self.git.if_fix_local:
self.branch_interface = Branch(master=Tk())
else:
showinfo(message="Connect and Fix Local Project First")
def draw_widget(self):
self.hostname_label["text"] = "Hostname: "
self.hostname_label.grid(row=0, column=0, sticky=W)
@ -384,9 +406,9 @@ class Main(window.Window):
self.local_path_label["text"] = "Local Path: None"
self.local_path_label.grid(row=9, column=0, columnspan=2, sticky=W)
# self.get_branch["text"] = "Get Branch"
# self.get_branch["command"] = self.do_get_branch
# self.get_branch.grid(row=3,column=0)
self.branches["text"] = "Branches"
self.branches["command"] = self.start_branch_manager
self.branches.grid(row=2,column=1)
self.set_local["text"] = "Set Local Path"
self.set_local["command"] = self.do_set_local
@ -439,6 +461,6 @@ if __name__ == "__main__":
root = Tk()
main = Main(root)
main.set_width(930)
main.set_height(530)
main.set_height(560)
main.apply()
main.mainloop()

View File

@ -9,6 +9,7 @@ import window
class SSH_Tools(window.Window,Key):
def __init__(self, hostname, user, passwd, path, master=None, broad=None):
window.Window.__init__(self,master)
master.title("SSH Manager")
Key.__init__(self,hostname=hostname, user=user, password=passwd, path=path)
self.broad = broad
self.hostname = hostname