From cfe6171c460234d4f963e27c17f29feeee51d5db Mon Sep 17 00:00:00 2001 From: "Samir L. Boulema" <sboulema@gmail.com> Date: Fri, 22 Jun 2018 15:08:40 +0200 Subject: [PATCH] Feature request. git svn support #45 --- TGit/Commands/GitSVNMenuCommands.cs | 49 ++++++++++++++++++++++++++ TGit/GitConfig.cs | 8 ++++- TGit/Helpers/CommandHelper.cs | 3 ++ TGit/Helpers/EnvHelper.cs | 13 ++++++- TGit/Helpers/GitHelper.cs | 2 +- TGit/IconMappings.csv | 3 +- TGit/Images.imagemanifest | 4 +++ TGit/PkgCmdID.cs | 5 +++ TGit/Resources/Images/Rebase.xaml | 13 +++++++ TGit/Resources/License.txt | 2 +- TGit/Resources/octicons.png | Bin 2657 -> 2781 bytes TGit/Resources/octicons.pxd | Bin 5372 -> 5650 bytes TGit/TGIT.csproj | 5 +++ TGit/TGIT.vsct | 51 ++++++++++++++++++++++++++++ TGit/TGITPackage.cs | 8 +++-- TGit/source.extension.vsixmanifest | 2 +- appveyor.yml | 2 +- 17 files changed, 161 insertions(+), 9 deletions(-) create mode 100644 TGit/Commands/GitSVNMenuCommands.cs create mode 100644 TGit/Resources/Images/Rebase.xaml diff --git a/TGit/Commands/GitSVNMenuCommands.cs b/TGit/Commands/GitSVNMenuCommands.cs new file mode 100644 index 0000000..e030508 --- /dev/null +++ b/TGit/Commands/GitSVNMenuCommands.cs @@ -0,0 +1,49 @@ +using SamirBoulema.TGit.Helpers; +using System; +using Microsoft.VisualStudio.Shell; +using EnvDTE; + +namespace SamirBoulema.TGit.Commands +{ + public class GitSVNMenuCommands + { + private readonly OptionPageGrid _options; + private readonly OleMenuCommandService _mcs; + private readonly DTE _dte; + private readonly EnvHelper _envHelper; + + public GitSVNMenuCommands(OleMenuCommandService mcs, DTE dte, + OptionPageGrid options, EnvHelper envHelper) + { + _mcs = mcs; + _options = options; + _dte = dte; + _envHelper = envHelper; + } + + public void AddCommands() + { + CommandHelper.AddCommand(_mcs, SvnDCommitCommand, PkgCmdIDList.SvnDCommit); + CommandHelper.AddCommand(_mcs, SvnFetchCommand, PkgCmdIDList.SvnFetch); + CommandHelper.AddCommand(_mcs, SvnRebaseCommand, PkgCmdIDList.SvnRebase); + } + + private void SvnDCommitCommand(object sender, EventArgs e) + { + FileHelper.SaveAllFiles(_dte); + ProcessHelper.StartTortoiseGitProc(_envHelper, $"/command:svndcommit /path:\"{_envHelper.GetSolutionDir()}\" /closeonend:{_options.CloseOnEnd}"); + } + + private void SvnFetchCommand(object sender, EventArgs e) + { + FileHelper.SaveAllFiles(_dte); + ProcessHelper.StartTortoiseGitProc(_envHelper, $"/command:svnrebase /path:\"{_envHelper.GetSolutionDir()}\" /closeonend:{_options.CloseOnEnd}"); + } + + private void SvnRebaseCommand(object sender, EventArgs e) + { + FileHelper.SaveAllFiles(_dte); + ProcessHelper.StartTortoiseGitProc(_envHelper, $"/command:svnfetch /path:\"{_envHelper.GetSolutionDir()}\" /closeonend:{_options.CloseOnEnd}"); + } + } +} diff --git a/TGit/GitConfig.cs b/TGit/GitConfig.cs index 3ddb850..9a1364e 100644 --- a/TGit/GitConfig.cs +++ b/TGit/GitConfig.cs @@ -11,6 +11,7 @@ public class GitConfig public string HotfixPrefix; public string TagPrefix; public string BugTraqMessage; + public string SvnUrl; public GitConfig() { @@ -25,6 +26,7 @@ public GitConfig(string input) ReleasePrefix = string.Empty; HotfixPrefix = string.Empty; TagPrefix = string.Empty; + SvnUrl = string.Empty; foreach (var line in input.Split(';')) { @@ -55,7 +57,11 @@ public GitConfig(string input) else if (line.StartsWith("bugtraq.message")) { BugTraqMessage = line.Split(' ').Last(); - } + } + else if (line.StartsWith("svn-remote.svn.url")) + { + SvnUrl = line.Split('=').Last(); + } } } } diff --git a/TGit/Helpers/CommandHelper.cs b/TGit/Helpers/CommandHelper.cs index 30df4a1..dc5c40e 100644 --- a/TGit/Helpers/CommandHelper.cs +++ b/TGit/Helpers/CommandHelper.cs @@ -86,5 +86,8 @@ public static void GitHubFlow_BeforeQueryStatus(object sender, EventArgs e) { ((OleMenuCommand) sender).Visible = EnvHelper.HasSolutionDir() && !EnvHelper.IsGitFlow(); } + + public static void GitSvn_BeforeQueryStatus(object sender, EventArgs e) + => ((OleMenuCommand)sender).Visible = EnvHelper.HasSolutionDir() && EnvHelper.IsGitSvn(); } } diff --git a/TGit/Helpers/EnvHelper.cs b/TGit/Helpers/EnvHelper.cs index fe05559..8743b41 100644 --- a/TGit/Helpers/EnvHelper.cs +++ b/TGit/Helpers/EnvHelper.cs @@ -21,7 +21,7 @@ public EnvHelper(DTE dte) /// <summary> /// Check if GitFlow is initialized /// </summary> - /// <remarks>Getting the actual flow config is cached for 1m</remarks> + /// <remarks>Getting the actual git config is cached for 1m</remarks> /// <returns></returns> public bool IsGitFlow() { @@ -29,6 +29,17 @@ public bool IsGitFlow() return !string.IsNullOrEmpty(gitConfig.MasterBranch); } + /// <summary> + /// Check if Git SVN is used for this repo + /// </summary> + /// <remarks>Getting the actual git config is cached for 1m</remarks> + /// <returns></returns> + public bool IsGitSvn() + { + var gitConfig = GetGitConfig(); + return !string.IsNullOrEmpty(gitConfig.SvnUrl); + } + /// <summary> /// Get the Git config /// </summary> diff --git a/TGit/Helpers/GitHelper.cs b/TGit/Helpers/GitHelper.cs index 975dc0c..f9724c1 100644 --- a/TGit/Helpers/GitHelper.cs +++ b/TGit/Helpers/GitHelper.cs @@ -60,7 +60,7 @@ public static string GetSshSetup(EnvHelper envHelper) public static GitConfig GetGitConfig(EnvHelper envHelper) { - return new GitConfig(ProcessHelper.StartProcessGitResult(envHelper, "config --get-regexp gitflow")); + return new GitConfig(ProcessHelper.StartProcessGitResult(envHelper, "config --get-regexp \"gitflow|bugtraq|svn-remote\"")); } public static bool RemoteBranchExists(EnvHelper envHelper, string branch) diff --git a/TGit/IconMappings.csv b/TGit/IconMappings.csv index d519c53..a281321 100644 --- a/TGit/IconMappings.csv +++ b/TGit/IconMappings.csv @@ -18,4 +18,5 @@ fec49b6d-c04a-42bd-b021-b8b2e5cfb291,17,d53d7256-d44d-4245-bdd2-bfd22943659c,17 fec49b6d-c04a-42bd-b021-b8b2e5cfb291,18,d53d7256-d44d-4245-bdd2-bfd22943659c,18 fec49b6d-c04a-42bd-b021-b8b2e5cfb291,19,d53d7256-d44d-4245-bdd2-bfd22943659c,19 fec49b6d-c04a-42bd-b021-b8b2e5cfb291,20,d53d7256-d44d-4245-bdd2-bfd22943659c,20 -fec49b6d-c04a-42bd-b021-b8b2e5cfb291,21,d53d7256-d44d-4245-bdd2-bfd22943659c,21 \ No newline at end of file +fec49b6d-c04a-42bd-b021-b8b2e5cfb291,21,d53d7256-d44d-4245-bdd2-bfd22943659c,21 +fec49b6d-c04a-42bd-b021-b8b2e5cfb291,22,d53d7256-d44d-4245-bdd2-bfd22943659c,22 \ No newline at end of file diff --git a/TGit/Images.imagemanifest b/TGit/Images.imagemanifest index adb7297..e222613 100644 --- a/TGit/Images.imagemanifest +++ b/TGit/Images.imagemanifest @@ -29,6 +29,7 @@ <ID Name="BrowseRef" Value="19" /> <ID Name="Tag" Value="20" /> <ID Name="AbortMerge" Value="21" /> + <ID Name="Rebase" Value="22" /> </Symbols> <Images> <Image Guid="$(CustomMoniker)" ID="$(ShowChanges)"> @@ -94,6 +95,9 @@ <Image Guid="$(CustomMoniker)" ID="$(AbortMerge)"> <Source Uri="$(Resources)/AbortMerge.xaml" /> </Image> + <Image Guid="$(CustomMoniker)" ID="$(Rebase)"> + <Source Uri="$(Resources)/Rebase.xaml" /> + </Image> </Images> <ImageLists /> </ImageManifest> \ No newline at end of file diff --git a/TGit/PkgCmdID.cs b/TGit/PkgCmdID.cs index f08124e..b6b6e3a 100644 --- a/TGit/PkgCmdID.cs +++ b/TGit/PkgCmdID.cs @@ -51,6 +51,7 @@ static class PkgCmdIDList public const uint TGitContextMenu = 0x1027; public const uint TGitGitFlowMenu = 0x2000; public const uint TGitGitHubFlowMenu = 0x3000; + public const uint TGitSvnMenu = 0x4000; public const uint Resolve = 0x137; public const uint Sync = 0x138; @@ -59,5 +60,9 @@ static class PkgCmdIDList public const uint Tag = 0x141; public const uint AbortMerge = 0x142; + + public const uint SvnDCommit = 0x143; + public const uint SvnFetch = 0x144; + public const uint SvnRebase = 0x145; } } \ No newline at end of file diff --git a/TGit/Resources/Images/Rebase.xaml b/TGit/Resources/Images/Rebase.xaml new file mode 100644 index 0000000..c791dd2 --- /dev/null +++ b/TGit/Resources/Images/Rebase.xaml @@ -0,0 +1,13 @@ +<Viewbox xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"> + <Rectangle Width="16" Height="16"> + <Rectangle.Fill> + <DrawingBrush Stretch="None"> + <DrawingBrush.Drawing> + <DrawingGroup> + <GeometryDrawing Brush="#FF000000" Geometry="F0 M12,16z M0,0z M11,11.28L11,5C10.97,4.22 10.66,3.53 10.06,2.94 9.46,2.35 8.78,2.03 8,2L7,2 7,0 4,3 7,6 7,4 8,4C8.27,4.02 8.48,4.11 8.69,4.31 8.9,4.51 8.99,4.73 9,5L9,11.28A1.993,1.993,0,0,0,10,15A1.993,1.993,0,0,0,11,11.28z M10,14.2C9.34,14.2 8.8,13.65 8.8,13 8.8,12.35 9.35,11.8 10,11.8 10.65,11.8 11.2,12.35 11.2,13 11.2,13.65 10.65,14.2 10,14.2z M4,3C4,1.89,3.11,1,2,1A1.993,1.993,0,0,0,1,4.72L1,11.28A1.993,1.993,0,0,0,2,15A1.993,1.993,0,0,0,3,11.28L3,4.72C3.59,4.38,4,3.74,4,3z M3.2,13C3.2,13.66 2.65,14.2 2,14.2 1.35,14.2 0.8,13.65 0.8,13 0.8,12.35 1.35,11.8 2,11.8 2.65,11.8 3.2,12.35 3.2,13z M2,4.2C1.34,4.2 0.8,3.65 0.8,3 0.8,2.35 1.35,1.8 2,1.8 2.65,1.8 3.2,2.35 3.2,3 3.2,3.65 2.65,4.2 2,4.2z" /> + </DrawingGroup> + </DrawingBrush.Drawing> + </DrawingBrush> + </Rectangle.Fill> + </Rectangle> +</Viewbox> \ No newline at end of file diff --git a/TGit/Resources/License.txt b/TGit/Resources/License.txt index 2e3f3c4..1c1fc85 100644 --- a/TGit/Resources/License.txt +++ b/TGit/Resources/License.txt @@ -1,6 +1,6 @@ The MIT License (MIT) -Copyright (c) 2016 Samir Boulema +Copyright (c) 2018 Samir Boulema Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/TGit/Resources/octicons.png b/TGit/Resources/octicons.png index 5242e6672824797f12e2bf89a010632140d3d95e..525d378e6a7e0a7da31045ea2912ef5e91c34963 100644 GIT binary patch literal 2781 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 literal 2657 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 P00000NkvXXu0mjf+LQ-P diff --git a/TGit/Resources/octicons.pxd b/TGit/Resources/octicons.pxd index 3e77c3fce6b429d4ccce060eb806d7bce5628c19..80658deb7d708ce4e209cdd7ed028804d2c4d4a7 100644 GIT binary patch literal 5650 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 Q!250H+6l$1lWpt&01>UFF#rGn literal 5372 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 O-;*Y3fT)C7x&H^2_wkMZ diff --git a/TGit/TGIT.csproj b/TGit/TGIT.csproj index 245c3a9..d85c174 100644 --- a/TGit/TGIT.csproj +++ b/TGit/TGIT.csproj @@ -190,6 +190,7 @@ <Reference Include="WindowsBase" /> </ItemGroup> <ItemGroup> + <Compile Include="Commands\GitSVNMenuCommands.cs" /> <Compile Include="Commands\GitFlowMenuCommands.cs" /> <Compile Include="Commands\MainMenuCommands.cs" /> <Compile Include="Commands\ContextMenuCommands.cs" /> @@ -321,6 +322,10 @@ <Generator>MSBuild:Compile</Generator> <SubType>Designer</SubType> </Page> + <Page Include="Resources\Images\Rebase.xaml"> + <Generator>MSBuild:Compile</Generator> + <SubType>Designer</SubType> + </Page> <Page Include="Resources\Images\Tag.xaml"> <Generator>MSBuild:Compile</Generator> <SubType>Designer</SubType> diff --git a/TGit/TGIT.vsct b/TGit/TGIT.vsct index b1de8cc..9367dfe 100644 --- a/TGit/TGIT.vsct +++ b/TGit/TGIT.vsct @@ -48,6 +48,17 @@ </Strings> </Menu> + <!--Git SVN Menu--> + <Menu guid="guidTGitCmdSet" id="TGitSVNMenu" priority="0x0300" type="Menu"> + <Parent guid="guidTGitCmdSet" id="firstMenuGroup"/> + <CommandFlag>DynamicVisibility</CommandFlag> + <CommandFlag>DefaultInvisible</CommandFlag> + <Strings> + <ButtonText>SVN</ButtonText> + <CommandName>SVN</CommandName> + </Strings> + </Menu> + <!--Toolbar Menu--> <Menu guid="guidTGitCmdSet" id="Toolbar" type="Toolbar"> <Strings> @@ -58,6 +69,11 @@ </Menus> <Groups> + <!--SVN--> + <Group guid="guidTGitCmdSet" id="TGitSVNMenuGroup" priority="0x0000"> + <Parent guid="guidTGitCmdSet" id="TGitSVNMenu"/> + </Group> + <!--Flow Group--> <Group guid="guidTGitCmdSet" id="TGitGitFlowMenuGroup" priority="0x0000"> <Parent guid="guidTGitCmdSet" id="TGitGitFlowMenu"/> @@ -138,6 +154,32 @@ </Groups> <Buttons> + <!--SVN Buttons--> + <Button guid="guidTGitCmdSet" id="svnDCommit" priority="0x0100" type="Button"> + <Parent guid="guidTGitCmdSet" id="TGitSVNMenuGroup" /> + <Icon guid="guidImages" id="commit" /> + <CommandFlag>DynamicVisibility</CommandFlag> + <Strings> + <ButtonText>Commit...</ButtonText> + </Strings> + </Button> + <Button guid="guidTGitCmdSet" id="svnFetch" priority="0x0100" type="Button"> + <Parent guid="guidTGitCmdSet" id="TGitSVNMenuGroup" /> + <Icon guid="guidImages" id="fetch" /> + <CommandFlag>DynamicVisibility</CommandFlag> + <Strings> + <ButtonText>Fetch...</ButtonText> + </Strings> + </Button> + <Button guid="guidTGitCmdSet" id="svnRebase" priority="0x0100" type="Button"> + <Parent guid="guidTGitCmdSet" id="TGitSVNMenuGroup" /> + <Icon guid="guidImages" id="rebase" /> + <CommandFlag>DynamicVisibility</CommandFlag> + <Strings> + <ButtonText>Rebase...</ButtonText> + </Strings> + </Button> + <!--GitFlow Buttons--> <Button guid="guidTGitCmdSet" id="startFeature" priority="0x0100" type="Button"> <Parent guid="guidTGitCmdSet" id="TGitGitFlowMenuGroup" /> @@ -490,6 +532,7 @@ <IDSymbol name="browseRef" value="19" /> <IDSymbol name="tag" value="20" /> <IDSymbol name="abortMerge" value="21" /> + <IDSymbol name="rebase" value="22" /> </GuidSymbol> <!--Special Context Menus--> @@ -514,6 +557,14 @@ <IDSymbol name="fifthMenuGroup" value="0x1025" /> <IDSymbol name="sixthMenuGroup" value="0x1026" /> + <!--SVN Menu--> + <IDSymbol name="TGitSVNMenu" value="0x4000"/> + <IDSymbol name="TGitSVNMenuGroup" value="0x4001"/> + + <IDSymbol name="svnDCommit" value="0x0143"/> + <IDSymbol name="svnRebase" value="0x0144"/> + <IDSymbol name="svnFetch" value="0x0145"/> + <!--GitFlow Menu--> <IDSymbol name="TGitGitFlowMenu" value="0x2000"/> <IDSymbol name="TGitGitFlowMenuGroup" value="0x2001"/> diff --git a/TGit/TGITPackage.cs b/TGit/TGITPackage.cs index 0fd7a19..242ffe3 100644 --- a/TGit/TGITPackage.cs +++ b/TGit/TGITPackage.cs @@ -90,11 +90,11 @@ private void MainThreadInitialization() { if (null == _mcs) return; + // Add all commands new MainMenuCommands(_mcs, _dte, _options, _envHelper).AddCommands(); - new ContextMenuCommands(_mcs, _dte, _options, _envHelper).AddCommands(); - new GitFlowMenuCommands(_mcs, _dte, _options, _envHelper).AddCommands(); + new GitSVNMenuCommands(_mcs, _dte, _options, _envHelper).AddCommands(); // Add all menus var tgitMenu = CommandHelper.CreateCommand(PkgCmdIDList.TGitMenu); @@ -121,6 +121,10 @@ private void MainThreadInitialization() var tgitGitHubFlowMenu = CommandHelper.CreateCommand(PkgCmdIDList.TGitGitHubFlowMenu); tgitGitHubFlowMenu.BeforeQueryStatus += CommandHelper.GitHubFlow_BeforeQueryStatus; _mcs.AddCommand(tgitGitHubFlowMenu); + + var tgitGitSvnMenu = CommandHelper.CreateCommand(PkgCmdIDList.TGitSvnMenu); + tgitGitSvnMenu.BeforeQueryStatus += CommandHelper.GitSvn_BeforeQueryStatus; + _mcs.AddCommand(tgitGitSvnMenu); } } } diff --git a/TGit/source.extension.vsixmanifest b/TGit/source.extension.vsixmanifest index f3ced0b..653e937 100644 --- a/TGit/source.extension.vsixmanifest +++ b/TGit/source.extension.vsixmanifest @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="utf-8"?> <PackageManifest Version="2.0.0" xmlns="http://schemas.microsoft.com/developer/vsx-schema/2011" xmlns:d="http://schemas.microsoft.com/developer/vsx-schema-design/2011"> <Metadata> - <Identity Id="2eb0e74d-a27d-4c41-bca4-7e9e9befaa18" Version="4.8" Language="en-US" Publisher="Samir L. Boulema" /> + <Identity Id="2eb0e74d-a27d-4c41-bca4-7e9e9befaa18" Version="4.9" Language="en-US" Publisher="Samir L. Boulema" /> <DisplayName>TGit</DisplayName> <Description xml:space="preserve">Control TortoiseGit from within Visual Studio</Description> <MoreInfo>https://github.com/sboulema/TGit</MoreInfo> diff --git a/appveyor.yml b/appveyor.yml index 5525dbf..e96e4e2 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -1,4 +1,4 @@ -version: 4.8.{build} +version: 4.9.{build} skip_tags: true image: Visual Studio 2017