Merge branch 'master' into fixes/809-refactor-logins

Conflicts:
	src/GitHub.App/ViewModels/TwoFactorDialogViewModel.cs
	src/GitHub.Exports/Settings/Guids.cs
	src/GitHub.VisualStudio/UI/Views/Controls/LoginControl.xaml.cs
This commit is contained in:
Steven Kirk 2017-04-28 12:08:22 +02:00
Родитель a1cfce10d3 549e5f7d92
Коммит 21a627c8f8
231 изменённых файлов: 4538 добавлений и 1164 удалений

3
.gitmodules поставляемый
Просмотреть файл

@ -16,6 +16,3 @@
[submodule "script"]
path = script
url = git@github.com:github/VisualStudioBuildScripts
[submodule "submodules/GitHubVSAutomationIDs"]
path = submodules/GitHubVSAutomationIDs
url = https://github.com/editor-tools/GitHubVSAutomationIDs.git

Просмотреть файл

@ -0,0 +1,6 @@
<ProjectConfiguration>
<Settings>
<CopyReferencedAssembliesToWorkspace>True</CopyReferencedAssembliesToWorkspace>
<PreviouslyBuiltSuccessfully>True</PreviouslyBuiltSuccessfully>
</Settings>
</ProjectConfiguration>

Просмотреть файл

@ -104,9 +104,7 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GitHub.VisualStudio.UI", "s
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GitHub.StartPage", "src\GitHub.StartPage\GitHub.StartPage.csproj", "{50E277B8-8580-487A-8F8E-5C3B9FBF0F77}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "GitHubVSAutomationIDs", "GitHubVSAutomationIDs", "{4405C20E-A72A-4807-9480-14E9BB558347}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GithubVSTestAutomationIDs", "submodules\GitHubVSAutomationIDs\GithubVSAutomationIDs\GithubVSTestAutomationIDs.csproj", "{665078F4-5875-431D-A2CC-421849B43328}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GitHub.UI.UnitTests", "test\GitHub.UI.UnitTests\GitHub.UI.UnitTests.csproj", "{110B206F-8554-4B51-BF86-94DAA32F5E26}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
@ -116,8 +114,6 @@ Global
Publish|x86 = Publish|x86
Release|Any CPU = Release|Any CPU
Release|x86 = Release|x86
XamlDesign|Any CPU = XamlDesign|Any CPU
XamlDesign|x86 = XamlDesign|x86
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{11569514-5AE5-4B5B-92A2-F10B0967DE5F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
@ -131,10 +127,6 @@ Global
{11569514-5AE5-4B5B-92A2-F10B0967DE5F}.Release|Any CPU.Build.0 = Release|Any CPU
{11569514-5AE5-4B5B-92A2-F10B0967DE5F}.Release|x86.ActiveCfg = Release|Any CPU
{11569514-5AE5-4B5B-92A2-F10B0967DE5F}.Release|x86.Build.0 = Release|Any CPU
{11569514-5AE5-4B5B-92A2-F10B0967DE5F}.XamlDesign|Any CPU.ActiveCfg = XamlDesign|Any CPU
{11569514-5AE5-4B5B-92A2-F10B0967DE5F}.XamlDesign|Any CPU.Build.0 = XamlDesign|Any CPU
{11569514-5AE5-4B5B-92A2-F10B0967DE5F}.XamlDesign|x86.ActiveCfg = XamlDesign|Any CPU
{11569514-5AE5-4B5B-92A2-F10B0967DE5F}.XamlDesign|x86.Build.0 = XamlDesign|Any CPU
{596595A6-2A3C-469E-9386-9E3767D863A5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{596595A6-2A3C-469E-9386-9E3767D863A5}.Debug|Any CPU.Build.0 = Debug|Any CPU
{596595A6-2A3C-469E-9386-9E3767D863A5}.Debug|x86.ActiveCfg = Debug|Any CPU
@ -146,10 +138,6 @@ Global
{596595A6-2A3C-469E-9386-9E3767D863A5}.Release|Any CPU.Build.0 = Release|Any CPU
{596595A6-2A3C-469E-9386-9E3767D863A5}.Release|x86.ActiveCfg = Release|Any CPU
{596595A6-2A3C-469E-9386-9E3767D863A5}.Release|x86.Build.0 = Release|Any CPU
{596595A6-2A3C-469E-9386-9E3767D863A5}.XamlDesign|Any CPU.ActiveCfg = Debug|Any CPU
{596595A6-2A3C-469E-9386-9E3767D863A5}.XamlDesign|Any CPU.Build.0 = Debug|Any CPU
{596595A6-2A3C-469E-9386-9E3767D863A5}.XamlDesign|x86.ActiveCfg = Debug|Any CPU
{596595A6-2A3C-469E-9386-9E3767D863A5}.XamlDesign|x86.Build.0 = Debug|Any CPU
{346384DD-2445-4A28-AF22-B45F3957BD89}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{346384DD-2445-4A28-AF22-B45F3957BD89}.Debug|Any CPU.Build.0 = Debug|Any CPU
{346384DD-2445-4A28-AF22-B45F3957BD89}.Debug|x86.ActiveCfg = Debug|Any CPU
@ -161,10 +149,6 @@ Global
{346384DD-2445-4A28-AF22-B45F3957BD89}.Release|Any CPU.Build.0 = Release|Any CPU
{346384DD-2445-4A28-AF22-B45F3957BD89}.Release|x86.ActiveCfg = Release|Any CPU
{346384DD-2445-4A28-AF22-B45F3957BD89}.Release|x86.Build.0 = Release|Any CPU
{346384DD-2445-4A28-AF22-B45F3957BD89}.XamlDesign|Any CPU.ActiveCfg = Debug|Any CPU
{346384DD-2445-4A28-AF22-B45F3957BD89}.XamlDesign|Any CPU.Build.0 = Debug|Any CPU
{346384DD-2445-4A28-AF22-B45F3957BD89}.XamlDesign|x86.ActiveCfg = Debug|Any CPU
{346384DD-2445-4A28-AF22-B45F3957BD89}.XamlDesign|x86.Build.0 = Debug|Any CPU
{158B05E8-FDBC-4D71-B871-C96E28D5ADF5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{158B05E8-FDBC-4D71-B871-C96E28D5ADF5}.Debug|Any CPU.Build.0 = Debug|Any CPU
{158B05E8-FDBC-4D71-B871-C96E28D5ADF5}.Debug|x86.ActiveCfg = Debug|Any CPU
@ -176,10 +160,6 @@ Global
{158B05E8-FDBC-4D71-B871-C96E28D5ADF5}.Release|Any CPU.Build.0 = Release|Any CPU
{158B05E8-FDBC-4D71-B871-C96E28D5ADF5}.Release|x86.ActiveCfg = Release|Any CPU
{158B05E8-FDBC-4D71-B871-C96E28D5ADF5}.Release|x86.Build.0 = Release|Any CPU
{158B05E8-FDBC-4D71-B871-C96E28D5ADF5}.XamlDesign|Any CPU.ActiveCfg = Debug|Any CPU
{158B05E8-FDBC-4D71-B871-C96E28D5ADF5}.XamlDesign|Any CPU.Build.0 = Debug|Any CPU
{158B05E8-FDBC-4D71-B871-C96E28D5ADF5}.XamlDesign|x86.ActiveCfg = Debug|Any CPU
{158B05E8-FDBC-4D71-B871-C96E28D5ADF5}.XamlDesign|x86.Build.0 = Debug|Any CPU
{6AFE2E2D-6DB0-4430-A2EA-F5F5388D2F78}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{6AFE2E2D-6DB0-4430-A2EA-F5F5388D2F78}.Debug|Any CPU.Build.0 = Debug|Any CPU
{6AFE2E2D-6DB0-4430-A2EA-F5F5388D2F78}.Debug|x86.ActiveCfg = Debug|Any CPU
@ -191,10 +171,6 @@ Global
{6AFE2E2D-6DB0-4430-A2EA-F5F5388D2F78}.Release|Any CPU.Build.0 = Release|Any CPU
{6AFE2E2D-6DB0-4430-A2EA-F5F5388D2F78}.Release|x86.ActiveCfg = Release|Any CPU
{6AFE2E2D-6DB0-4430-A2EA-F5F5388D2F78}.Release|x86.Build.0 = Release|Any CPU
{6AFE2E2D-6DB0-4430-A2EA-F5F5388D2F78}.XamlDesign|Any CPU.ActiveCfg = Debug|Any CPU
{6AFE2E2D-6DB0-4430-A2EA-F5F5388D2F78}.XamlDesign|Any CPU.Build.0 = Debug|Any CPU
{6AFE2E2D-6DB0-4430-A2EA-F5F5388D2F78}.XamlDesign|x86.ActiveCfg = Debug|Any CPU
{6AFE2E2D-6DB0-4430-A2EA-F5F5388D2F78}.XamlDesign|x86.Build.0 = Debug|Any CPU
{6559E128-8B40-49A5-85A8-05565ED0C7E3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{6559E128-8B40-49A5-85A8-05565ED0C7E3}.Debug|Any CPU.Build.0 = Debug|Any CPU
{6559E128-8B40-49A5-85A8-05565ED0C7E3}.Debug|x86.ActiveCfg = Debug|Any CPU
@ -206,10 +182,6 @@ Global
{6559E128-8B40-49A5-85A8-05565ED0C7E3}.Release|Any CPU.Build.0 = Release|Any CPU
{6559E128-8B40-49A5-85A8-05565ED0C7E3}.Release|x86.ActiveCfg = Release|Any CPU
{6559E128-8B40-49A5-85A8-05565ED0C7E3}.Release|x86.Build.0 = Release|Any CPU
{6559E128-8B40-49A5-85A8-05565ED0C7E3}.XamlDesign|Any CPU.ActiveCfg = Debug|Any CPU
{6559E128-8B40-49A5-85A8-05565ED0C7E3}.XamlDesign|Any CPU.Build.0 = Debug|Any CPU
{6559E128-8B40-49A5-85A8-05565ED0C7E3}.XamlDesign|x86.ActiveCfg = Debug|Any CPU
{6559E128-8B40-49A5-85A8-05565ED0C7E3}.XamlDesign|x86.Build.0 = Debug|Any CPU
{1A1DA411-8D1F-4578-80A6-04576BEA2DC5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{1A1DA411-8D1F-4578-80A6-04576BEA2DC5}.Debug|Any CPU.Build.0 = Debug|Any CPU
{1A1DA411-8D1F-4578-80A6-04576BEA2DC5}.Debug|x86.ActiveCfg = Debug|Any CPU
@ -221,10 +193,6 @@ Global
{1A1DA411-8D1F-4578-80A6-04576BEA2DC5}.Release|Any CPU.Build.0 = Release|Any CPU
{1A1DA411-8D1F-4578-80A6-04576BEA2DC5}.Release|x86.ActiveCfg = Release|Any CPU
{1A1DA411-8D1F-4578-80A6-04576BEA2DC5}.Release|x86.Build.0 = Release|Any CPU
{1A1DA411-8D1F-4578-80A6-04576BEA2DC5}.XamlDesign|Any CPU.ActiveCfg = Debug|Any CPU
{1A1DA411-8D1F-4578-80A6-04576BEA2DC5}.XamlDesign|Any CPU.Build.0 = Debug|Any CPU
{1A1DA411-8D1F-4578-80A6-04576BEA2DC5}.XamlDesign|x86.ActiveCfg = Debug|Any CPU
{1A1DA411-8D1F-4578-80A6-04576BEA2DC5}.XamlDesign|x86.Build.0 = Debug|Any CPU
{4A84E568-CA86-4510-8CD0-90D3EF9B65F9}.Debug|Any CPU.ActiveCfg = Release|Any CPU
{4A84E568-CA86-4510-8CD0-90D3EF9B65F9}.Debug|Any CPU.Build.0 = Release|Any CPU
{4A84E568-CA86-4510-8CD0-90D3EF9B65F9}.Debug|x86.ActiveCfg = Release|Any CPU
@ -236,10 +204,6 @@ Global
{4A84E568-CA86-4510-8CD0-90D3EF9B65F9}.Release|Any CPU.Build.0 = Release|Any CPU
{4A84E568-CA86-4510-8CD0-90D3EF9B65F9}.Release|x86.ActiveCfg = Release|Any CPU
{4A84E568-CA86-4510-8CD0-90D3EF9B65F9}.Release|x86.Build.0 = Release|Any CPU
{4A84E568-CA86-4510-8CD0-90D3EF9B65F9}.XamlDesign|Any CPU.ActiveCfg = Release|Any CPU
{4A84E568-CA86-4510-8CD0-90D3EF9B65F9}.XamlDesign|Any CPU.Build.0 = Release|Any CPU
{4A84E568-CA86-4510-8CD0-90D3EF9B65F9}.XamlDesign|x86.ActiveCfg = Release|Any CPU
{4A84E568-CA86-4510-8CD0-90D3EF9B65F9}.XamlDesign|x86.Build.0 = Release|Any CPU
{9AEA02DB-02B5-409C-B0CA-115D05331A6B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{9AEA02DB-02B5-409C-B0CA-115D05331A6B}.Debug|Any CPU.Build.0 = Debug|Any CPU
{9AEA02DB-02B5-409C-B0CA-115D05331A6B}.Debug|x86.ActiveCfg = Debug|Any CPU
@ -251,10 +215,6 @@ Global
{9AEA02DB-02B5-409C-B0CA-115D05331A6B}.Release|Any CPU.Build.0 = Release|Any CPU
{9AEA02DB-02B5-409C-B0CA-115D05331A6B}.Release|x86.ActiveCfg = Release|Any CPU
{9AEA02DB-02B5-409C-B0CA-115D05331A6B}.Release|x86.Build.0 = Release|Any CPU
{9AEA02DB-02B5-409C-B0CA-115D05331A6B}.XamlDesign|Any CPU.ActiveCfg = Debug|Any CPU
{9AEA02DB-02B5-409C-B0CA-115D05331A6B}.XamlDesign|Any CPU.Build.0 = Debug|Any CPU
{9AEA02DB-02B5-409C-B0CA-115D05331A6B}.XamlDesign|x86.ActiveCfg = Debug|Any CPU
{9AEA02DB-02B5-409C-B0CA-115D05331A6B}.XamlDesign|x86.Build.0 = Debug|Any CPU
{B389ADAF-62CC-486E-85B4-2D8B078DF763}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{B389ADAF-62CC-486E-85B4-2D8B078DF763}.Debug|Any CPU.Build.0 = Debug|Any CPU
{B389ADAF-62CC-486E-85B4-2D8B078DF763}.Debug|x86.ActiveCfg = Debug|Any CPU
@ -266,10 +226,6 @@ Global
{B389ADAF-62CC-486E-85B4-2D8B078DF763}.Release|Any CPU.Build.0 = Release|Any CPU
{B389ADAF-62CC-486E-85B4-2D8B078DF763}.Release|x86.ActiveCfg = Release|Any CPU
{B389ADAF-62CC-486E-85B4-2D8B078DF763}.Release|x86.Build.0 = Release|Any CPU
{B389ADAF-62CC-486E-85B4-2D8B078DF763}.XamlDesign|Any CPU.ActiveCfg = Debug|Any CPU
{B389ADAF-62CC-486E-85B4-2D8B078DF763}.XamlDesign|Any CPU.Build.0 = Debug|Any CPU
{B389ADAF-62CC-486E-85B4-2D8B078DF763}.XamlDesign|x86.ActiveCfg = Debug|Any CPU
{B389ADAF-62CC-486E-85B4-2D8B078DF763}.XamlDesign|x86.Build.0 = Debug|Any CPU
{E4ED0537-D1D9-44B6-9212-3096D7C3F7A1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{E4ED0537-D1D9-44B6-9212-3096D7C3F7A1}.Debug|Any CPU.Build.0 = Debug|Any CPU
{E4ED0537-D1D9-44B6-9212-3096D7C3F7A1}.Debug|x86.ActiveCfg = Debug|Any CPU
@ -281,10 +237,6 @@ Global
{E4ED0537-D1D9-44B6-9212-3096D7C3F7A1}.Release|Any CPU.Build.0 = Release|Any CPU
{E4ED0537-D1D9-44B6-9212-3096D7C3F7A1}.Release|x86.ActiveCfg = Release|Any CPU
{E4ED0537-D1D9-44B6-9212-3096D7C3F7A1}.Release|x86.Build.0 = Release|Any CPU
{E4ED0537-D1D9-44B6-9212-3096D7C3F7A1}.XamlDesign|Any CPU.ActiveCfg = Debug|Any CPU
{E4ED0537-D1D9-44B6-9212-3096D7C3F7A1}.XamlDesign|Any CPU.Build.0 = Debug|Any CPU
{E4ED0537-D1D9-44B6-9212-3096D7C3F7A1}.XamlDesign|x86.ActiveCfg = Debug|Any CPU
{E4ED0537-D1D9-44B6-9212-3096D7C3F7A1}.XamlDesign|x86.Build.0 = Debug|Any CPU
{B1F5C227-456F-437D-BD5F-4C11B7A8D1A0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{B1F5C227-456F-437D-BD5F-4C11B7A8D1A0}.Debug|Any CPU.Build.0 = Debug|Any CPU
{B1F5C227-456F-437D-BD5F-4C11B7A8D1A0}.Debug|x86.ActiveCfg = Debug|Any CPU
@ -296,10 +248,6 @@ Global
{B1F5C227-456F-437D-BD5F-4C11B7A8D1A0}.Release|Any CPU.Build.0 = Release|Any CPU
{B1F5C227-456F-437D-BD5F-4C11B7A8D1A0}.Release|x86.ActiveCfg = Release|Any CPU
{B1F5C227-456F-437D-BD5F-4C11B7A8D1A0}.Release|x86.Build.0 = Release|Any CPU
{B1F5C227-456F-437D-BD5F-4C11B7A8D1A0}.XamlDesign|Any CPU.ActiveCfg = Debug|Any CPU
{B1F5C227-456F-437D-BD5F-4C11B7A8D1A0}.XamlDesign|Any CPU.Build.0 = Debug|Any CPU
{B1F5C227-456F-437D-BD5F-4C11B7A8D1A0}.XamlDesign|x86.ActiveCfg = Debug|Any CPU
{B1F5C227-456F-437D-BD5F-4C11B7A8D1A0}.XamlDesign|x86.Build.0 = Debug|Any CPU
{08DD4305-7787-4823-A53F-4D0F725A07F3}.Debug|Any CPU.ActiveCfg = Release|Any CPU
{08DD4305-7787-4823-A53F-4D0F725A07F3}.Debug|Any CPU.Build.0 = Release|Any CPU
{08DD4305-7787-4823-A53F-4D0F725A07F3}.Debug|x86.ActiveCfg = Release|Any CPU
@ -311,10 +259,6 @@ Global
{08DD4305-7787-4823-A53F-4D0F725A07F3}.Release|Any CPU.Build.0 = Release|Any CPU
{08DD4305-7787-4823-A53F-4D0F725A07F3}.Release|x86.ActiveCfg = Release|Any CPU
{08DD4305-7787-4823-A53F-4D0F725A07F3}.Release|x86.Build.0 = Release|Any CPU
{08DD4305-7787-4823-A53F-4D0F725A07F3}.XamlDesign|Any CPU.ActiveCfg = Release|Any CPU
{08DD4305-7787-4823-A53F-4D0F725A07F3}.XamlDesign|Any CPU.Build.0 = Release|Any CPU
{08DD4305-7787-4823-A53F-4D0F725A07F3}.XamlDesign|x86.ActiveCfg = Release|Any CPU
{08DD4305-7787-4823-A53F-4D0F725A07F3}.XamlDesign|x86.Build.0 = Release|Any CPU
{674B69B8-0780-4D54-AE2B-C15821FA51CB}.Debug|Any CPU.ActiveCfg = Release|Any CPU
{674B69B8-0780-4D54-AE2B-C15821FA51CB}.Debug|Any CPU.Build.0 = Release|Any CPU
{674B69B8-0780-4D54-AE2B-C15821FA51CB}.Debug|x86.ActiveCfg = Release|Any CPU
@ -326,10 +270,6 @@ Global
{674B69B8-0780-4D54-AE2B-C15821FA51CB}.Release|Any CPU.Build.0 = Release|Any CPU
{674B69B8-0780-4D54-AE2B-C15821FA51CB}.Release|x86.ActiveCfg = Release|Any CPU
{674B69B8-0780-4D54-AE2B-C15821FA51CB}.Release|x86.Build.0 = Release|Any CPU
{674B69B8-0780-4D54-AE2B-C15821FA51CB}.XamlDesign|Any CPU.ActiveCfg = Release|Any CPU
{674B69B8-0780-4D54-AE2B-C15821FA51CB}.XamlDesign|Any CPU.Build.0 = Release|Any CPU
{674B69B8-0780-4D54-AE2B-C15821FA51CB}.XamlDesign|x86.ActiveCfg = Release|Any CPU
{674B69B8-0780-4D54-AE2B-C15821FA51CB}.XamlDesign|x86.Build.0 = Release|Any CPU
{1CE2D235-8072-4649-BA5A-CFB1AF8776E0}.Debug|Any CPU.ActiveCfg = Release|Any CPU
{1CE2D235-8072-4649-BA5A-CFB1AF8776E0}.Debug|Any CPU.Build.0 = Release|Any CPU
{1CE2D235-8072-4649-BA5A-CFB1AF8776E0}.Debug|x86.ActiveCfg = Release|Any CPU
@ -341,10 +281,6 @@ Global
{1CE2D235-8072-4649-BA5A-CFB1AF8776E0}.Release|Any CPU.Build.0 = Release|Any CPU
{1CE2D235-8072-4649-BA5A-CFB1AF8776E0}.Release|x86.ActiveCfg = Release|Any CPU
{1CE2D235-8072-4649-BA5A-CFB1AF8776E0}.Release|x86.Build.0 = Release|Any CPU
{1CE2D235-8072-4649-BA5A-CFB1AF8776E0}.XamlDesign|Any CPU.ActiveCfg = Release|Any CPU
{1CE2D235-8072-4649-BA5A-CFB1AF8776E0}.XamlDesign|Any CPU.Build.0 = Release|Any CPU
{1CE2D235-8072-4649-BA5A-CFB1AF8776E0}.XamlDesign|x86.ActiveCfg = Release|Any CPU
{1CE2D235-8072-4649-BA5A-CFB1AF8776E0}.XamlDesign|x86.Build.0 = Release|Any CPU
{600998C4-54DD-4755-BFA8-6F44544D8E2E}.Debug|Any CPU.ActiveCfg = Release|Any CPU
{600998C4-54DD-4755-BFA8-6F44544D8E2E}.Debug|Any CPU.Build.0 = Release|Any CPU
{600998C4-54DD-4755-BFA8-6F44544D8E2E}.Debug|x86.ActiveCfg = Release|Any CPU
@ -356,10 +292,6 @@ Global
{600998C4-54DD-4755-BFA8-6F44544D8E2E}.Release|Any CPU.Build.0 = Release|Any CPU
{600998C4-54DD-4755-BFA8-6F44544D8E2E}.Release|x86.ActiveCfg = Release|Any CPU
{600998C4-54DD-4755-BFA8-6F44544D8E2E}.Release|x86.Build.0 = Release|Any CPU
{600998C4-54DD-4755-BFA8-6F44544D8E2E}.XamlDesign|Any CPU.ActiveCfg = Release|Any CPU
{600998C4-54DD-4755-BFA8-6F44544D8E2E}.XamlDesign|Any CPU.Build.0 = Release|Any CPU
{600998C4-54DD-4755-BFA8-6F44544D8E2E}.XamlDesign|x86.ActiveCfg = Release|Any CPU
{600998C4-54DD-4755-BFA8-6F44544D8E2E}.XamlDesign|x86.Build.0 = Release|Any CPU
{B4E665E5-6CAF-4414-A6E2-8DE1C3BCF203}.Debug|Any CPU.ActiveCfg = Release|Any CPU
{B4E665E5-6CAF-4414-A6E2-8DE1C3BCF203}.Debug|Any CPU.Build.0 = Release|Any CPU
{B4E665E5-6CAF-4414-A6E2-8DE1C3BCF203}.Debug|x86.ActiveCfg = Release|Any CPU
@ -371,10 +303,6 @@ Global
{B4E665E5-6CAF-4414-A6E2-8DE1C3BCF203}.Release|Any CPU.Build.0 = Release|Any CPU
{B4E665E5-6CAF-4414-A6E2-8DE1C3BCF203}.Release|x86.ActiveCfg = Release|Any CPU
{B4E665E5-6CAF-4414-A6E2-8DE1C3BCF203}.Release|x86.Build.0 = Release|Any CPU
{B4E665E5-6CAF-4414-A6E2-8DE1C3BCF203}.XamlDesign|Any CPU.ActiveCfg = Release|Any CPU
{B4E665E5-6CAF-4414-A6E2-8DE1C3BCF203}.XamlDesign|Any CPU.Build.0 = Release|Any CPU
{B4E665E5-6CAF-4414-A6E2-8DE1C3BCF203}.XamlDesign|x86.ActiveCfg = Release|Any CPU
{B4E665E5-6CAF-4414-A6E2-8DE1C3BCF203}.XamlDesign|x86.Build.0 = Release|Any CPU
{241C47DF-CA8E-4296-AA03-2C48BB646ABD}.Debug|Any CPU.ActiveCfg = Release|Any CPU
{241C47DF-CA8E-4296-AA03-2C48BB646ABD}.Debug|Any CPU.Build.0 = Release|Any CPU
{241C47DF-CA8E-4296-AA03-2C48BB646ABD}.Debug|x86.ActiveCfg = Release|Any CPU
@ -386,10 +314,6 @@ Global
{241C47DF-CA8E-4296-AA03-2C48BB646ABD}.Release|Any CPU.Build.0 = Release|Any CPU
{241C47DF-CA8E-4296-AA03-2C48BB646ABD}.Release|x86.ActiveCfg = Release|Any CPU
{241C47DF-CA8E-4296-AA03-2C48BB646ABD}.Release|x86.Build.0 = Release|Any CPU
{241C47DF-CA8E-4296-AA03-2C48BB646ABD}.XamlDesign|Any CPU.ActiveCfg = Release|Any CPU
{241C47DF-CA8E-4296-AA03-2C48BB646ABD}.XamlDesign|Any CPU.Build.0 = Release|Any CPU
{241C47DF-CA8E-4296-AA03-2C48BB646ABD}.XamlDesign|x86.ActiveCfg = Release|Any CPU
{241C47DF-CA8E-4296-AA03-2C48BB646ABD}.XamlDesign|x86.Build.0 = Release|Any CPU
{EB73ADDD-2FE9-44C0-A1AB-20709B979B64}.Debug|Any CPU.ActiveCfg = Release|Any CPU
{EB73ADDD-2FE9-44C0-A1AB-20709B979B64}.Debug|Any CPU.Build.0 = Release|Any CPU
{EB73ADDD-2FE9-44C0-A1AB-20709B979B64}.Debug|x86.ActiveCfg = Release|Any CPU
@ -402,10 +326,6 @@ Global
{EB73ADDD-2FE9-44C0-A1AB-20709B979B64}.Release|Any CPU.Build.0 = Release|Any CPU
{EB73ADDD-2FE9-44C0-A1AB-20709B979B64}.Release|x86.ActiveCfg = Release|Any CPU
{EB73ADDD-2FE9-44C0-A1AB-20709B979B64}.Release|x86.Build.0 = Release|Any CPU
{EB73ADDD-2FE9-44C0-A1AB-20709B979B64}.XamlDesign|Any CPU.ActiveCfg = Release|Any CPU
{EB73ADDD-2FE9-44C0-A1AB-20709B979B64}.XamlDesign|Any CPU.Build.0 = Release|Any CPU
{EB73ADDD-2FE9-44C0-A1AB-20709B979B64}.XamlDesign|x86.ActiveCfg = Release|Any CPU
{EB73ADDD-2FE9-44C0-A1AB-20709B979B64}.XamlDesign|x86.Build.0 = Release|Any CPU
{252CE1C2-027A-4445-A3C2-E4D6C80A935A}.Debug|Any CPU.ActiveCfg = Release|Any CPU
{252CE1C2-027A-4445-A3C2-E4D6C80A935A}.Debug|Any CPU.Build.0 = Release|Any CPU
{252CE1C2-027A-4445-A3C2-E4D6C80A935A}.Debug|x86.ActiveCfg = Release|Any CPU
@ -417,10 +337,6 @@ Global
{252CE1C2-027A-4445-A3C2-E4D6C80A935A}.Release|Any CPU.Build.0 = Release|Any CPU
{252CE1C2-027A-4445-A3C2-E4D6C80A935A}.Release|x86.ActiveCfg = Release|Any CPU
{252CE1C2-027A-4445-A3C2-E4D6C80A935A}.Release|x86.Build.0 = Release|Any CPU
{252CE1C2-027A-4445-A3C2-E4D6C80A935A}.XamlDesign|Any CPU.ActiveCfg = Release|Any CPU
{252CE1C2-027A-4445-A3C2-E4D6C80A935A}.XamlDesign|Any CPU.Build.0 = Release|Any CPU
{252CE1C2-027A-4445-A3C2-E4D6C80A935A}.XamlDesign|x86.ActiveCfg = Release|Any CPU
{252CE1C2-027A-4445-A3C2-E4D6C80A935A}.XamlDesign|x86.Build.0 = Release|Any CPU
{0EC8DBA1-D745-4EE5-993A-6026440EC3BF}.Debug|Any CPU.ActiveCfg = Release|Any CPU
{0EC8DBA1-D745-4EE5-993A-6026440EC3BF}.Debug|Any CPU.Build.0 = Release|Any CPU
{0EC8DBA1-D745-4EE5-993A-6026440EC3BF}.Debug|x86.ActiveCfg = Release|Any CPU
@ -432,10 +348,6 @@ Global
{0EC8DBA1-D745-4EE5-993A-6026440EC3BF}.Release|Any CPU.Build.0 = Release|Any CPU
{0EC8DBA1-D745-4EE5-993A-6026440EC3BF}.Release|x86.ActiveCfg = Release|Any CPU
{0EC8DBA1-D745-4EE5-993A-6026440EC3BF}.Release|x86.Build.0 = Release|Any CPU
{0EC8DBA1-D745-4EE5-993A-6026440EC3BF}.XamlDesign|Any CPU.ActiveCfg = Release|Any CPU
{0EC8DBA1-D745-4EE5-993A-6026440EC3BF}.XamlDesign|Any CPU.Build.0 = Release|Any CPU
{0EC8DBA1-D745-4EE5-993A-6026440EC3BF}.XamlDesign|x86.ActiveCfg = Release|Any CPU
{0EC8DBA1-D745-4EE5-993A-6026440EC3BF}.XamlDesign|x86.Build.0 = Release|Any CPU
{41A47C5B-C606-45B4-B83C-22B9239E4DA0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{41A47C5B-C606-45B4-B83C-22B9239E4DA0}.Debug|Any CPU.Build.0 = Debug|Any CPU
{41A47C5B-C606-45B4-B83C-22B9239E4DA0}.Debug|x86.ActiveCfg = Debug|Any CPU
@ -448,10 +360,6 @@ Global
{41A47C5B-C606-45B4-B83C-22B9239E4DA0}.Release|Any CPU.Build.0 = Release|Any CPU
{41A47C5B-C606-45B4-B83C-22B9239E4DA0}.Release|x86.ActiveCfg = Release|Any CPU
{41A47C5B-C606-45B4-B83C-22B9239E4DA0}.Release|x86.Build.0 = Release|Any CPU
{41A47C5B-C606-45B4-B83C-22B9239E4DA0}.XamlDesign|Any CPU.ActiveCfg = Debug|Any CPU
{41A47C5B-C606-45B4-B83C-22B9239E4DA0}.XamlDesign|Any CPU.Build.0 = Debug|Any CPU
{41A47C5B-C606-45B4-B83C-22B9239E4DA0}.XamlDesign|x86.ActiveCfg = Debug|Any CPU
{41A47C5B-C606-45B4-B83C-22B9239E4DA0}.XamlDesign|x86.Build.0 = Debug|Any CPU
{DD99FD0F-82F6-4C30-930E-4A1D0DF01D65}.Debug|Any CPU.ActiveCfg = Release|Any CPU
{DD99FD0F-82F6-4C30-930E-4A1D0DF01D65}.Debug|Any CPU.Build.0 = Release|Any CPU
{DD99FD0F-82F6-4C30-930E-4A1D0DF01D65}.Debug|x86.ActiveCfg = Release|Any CPU
@ -464,10 +372,6 @@ Global
{DD99FD0F-82F6-4C30-930E-4A1D0DF01D65}.Release|Any CPU.Build.0 = Release|Any CPU
{DD99FD0F-82F6-4C30-930E-4A1D0DF01D65}.Release|x86.ActiveCfg = Release|Any CPU
{DD99FD0F-82F6-4C30-930E-4A1D0DF01D65}.Release|x86.Build.0 = Release|Any CPU
{DD99FD0F-82F6-4C30-930E-4A1D0DF01D65}.XamlDesign|Any CPU.ActiveCfg = Release|Any CPU
{DD99FD0F-82F6-4C30-930E-4A1D0DF01D65}.XamlDesign|Any CPU.Build.0 = Release|Any CPU
{DD99FD0F-82F6-4C30-930E-4A1D0DF01D65}.XamlDesign|x86.ActiveCfg = Release|Any CPU
{DD99FD0F-82F6-4C30-930E-4A1D0DF01D65}.XamlDesign|x86.Build.0 = Release|Any CPU
{7B835A7D-CF94-45E8-B191-96F5A4FE26A8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{7B835A7D-CF94-45E8-B191-96F5A4FE26A8}.Debug|Any CPU.Build.0 = Debug|Any CPU
{7B835A7D-CF94-45E8-B191-96F5A4FE26A8}.Debug|x86.ActiveCfg = Debug|Any CPU
@ -480,8 +384,6 @@ Global
{7B835A7D-CF94-45E8-B191-96F5A4FE26A8}.Release|Any CPU.Build.0 = Release|Any CPU
{7B835A7D-CF94-45E8-B191-96F5A4FE26A8}.Release|x86.ActiveCfg = Release|Any CPU
{7B835A7D-CF94-45E8-B191-96F5A4FE26A8}.Release|x86.Build.0 = Release|Any CPU
{7B835A7D-CF94-45E8-B191-96F5A4FE26A8}.XamlDesign|Any CPU.ActiveCfg = Debug|Any CPU
{7B835A7D-CF94-45E8-B191-96F5A4FE26A8}.XamlDesign|x86.ActiveCfg = Debug|Any CPU
{161DBF01-1DBF-4B00-8551-C5C00F26720D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{161DBF01-1DBF-4B00-8551-C5C00F26720D}.Debug|Any CPU.Build.0 = Debug|Any CPU
{161DBF01-1DBF-4B00-8551-C5C00F26720D}.Debug|x86.ActiveCfg = Debug|Any CPU
@ -494,10 +396,6 @@ Global
{161DBF01-1DBF-4B00-8551-C5C00F26720D}.Release|Any CPU.Build.0 = Release|Any CPU
{161DBF01-1DBF-4B00-8551-C5C00F26720D}.Release|x86.ActiveCfg = Release|Any CPU
{161DBF01-1DBF-4B00-8551-C5C00F26720D}.Release|x86.Build.0 = Release|Any CPU
{161DBF01-1DBF-4B00-8551-C5C00F26720D}.XamlDesign|Any CPU.ActiveCfg = Debug|Any CPU
{161DBF01-1DBF-4B00-8551-C5C00F26720D}.XamlDesign|Any CPU.Build.0 = Debug|Any CPU
{161DBF01-1DBF-4B00-8551-C5C00F26720D}.XamlDesign|x86.ActiveCfg = Release|Any CPU
{161DBF01-1DBF-4B00-8551-C5C00F26720D}.XamlDesign|x86.Build.0 = Release|Any CPU
{161DBF01-1DBF-4B00-8551-C5C00F26720E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{161DBF01-1DBF-4B00-8551-C5C00F26720E}.Debug|Any CPU.Build.0 = Debug|Any CPU
{161DBF01-1DBF-4B00-8551-C5C00F26720E}.Debug|x86.ActiveCfg = Debug|Any CPU
@ -510,10 +408,6 @@ Global
{161DBF01-1DBF-4B00-8551-C5C00F26720E}.Release|Any CPU.Build.0 = Release|Any CPU
{161DBF01-1DBF-4B00-8551-C5C00F26720E}.Release|x86.ActiveCfg = Release|Any CPU
{161DBF01-1DBF-4B00-8551-C5C00F26720E}.Release|x86.Build.0 = Release|Any CPU
{161DBF01-1DBF-4B00-8551-C5C00F26720E}.XamlDesign|Any CPU.ActiveCfg = Debug|Any CPU
{161DBF01-1DBF-4B00-8551-C5C00F26720E}.XamlDesign|Any CPU.Build.0 = Debug|Any CPU
{161DBF01-1DBF-4B00-8551-C5C00F26720E}.XamlDesign|x86.ActiveCfg = Release|Any CPU
{161DBF01-1DBF-4B00-8551-C5C00F26720E}.XamlDesign|x86.Build.0 = Release|Any CPU
{D1DFBB0C-B570-4302-8F1E-2E3A19C41961}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{D1DFBB0C-B570-4302-8F1E-2E3A19C41961}.Debug|Any CPU.Build.0 = Debug|Any CPU
{D1DFBB0C-B570-4302-8F1E-2E3A19C41961}.Debug|x86.ActiveCfg = Debug|Any CPU
@ -526,10 +420,6 @@ Global
{D1DFBB0C-B570-4302-8F1E-2E3A19C41961}.Release|Any CPU.Build.0 = Release|Any CPU
{D1DFBB0C-B570-4302-8F1E-2E3A19C41961}.Release|x86.ActiveCfg = Release|Any CPU
{D1DFBB0C-B570-4302-8F1E-2E3A19C41961}.Release|x86.Build.0 = Release|Any CPU
{D1DFBB0C-B570-4302-8F1E-2E3A19C41961}.XamlDesign|Any CPU.ActiveCfg = Debug|Any CPU
{D1DFBB0C-B570-4302-8F1E-2E3A19C41961}.XamlDesign|Any CPU.Build.0 = Debug|Any CPU
{D1DFBB0C-B570-4302-8F1E-2E3A19C41961}.XamlDesign|x86.ActiveCfg = Release|Any CPU
{D1DFBB0C-B570-4302-8F1E-2E3A19C41961}.XamlDesign|x86.Build.0 = Release|Any CPU
{50E277B8-8580-487A-8F8E-5C3B9FBF0F77}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{50E277B8-8580-487A-8F8E-5C3B9FBF0F77}.Debug|Any CPU.Build.0 = Debug|Any CPU
{50E277B8-8580-487A-8F8E-5C3B9FBF0F77}.Debug|x86.ActiveCfg = Debug|Any CPU
@ -542,26 +432,18 @@ Global
{50E277B8-8580-487A-8F8E-5C3B9FBF0F77}.Release|Any CPU.Build.0 = Release|Any CPU
{50E277B8-8580-487A-8F8E-5C3B9FBF0F77}.Release|x86.ActiveCfg = Release|Any CPU
{50E277B8-8580-487A-8F8E-5C3B9FBF0F77}.Release|x86.Build.0 = Release|Any CPU
{50E277B8-8580-487A-8F8E-5C3B9FBF0F77}.XamlDesign|Any CPU.ActiveCfg = Release|Any CPU
{50E277B8-8580-487A-8F8E-5C3B9FBF0F77}.XamlDesign|Any CPU.Build.0 = Release|Any CPU
{50E277B8-8580-487A-8F8E-5C3B9FBF0F77}.XamlDesign|x86.ActiveCfg = Release|Any CPU
{50E277B8-8580-487A-8F8E-5C3B9FBF0F77}.XamlDesign|x86.Build.0 = Release|Any CPU
{665078F4-5875-431D-A2CC-421849B43328}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{665078F4-5875-431D-A2CC-421849B43328}.Debug|Any CPU.Build.0 = Debug|Any CPU
{665078F4-5875-431D-A2CC-421849B43328}.Debug|x86.ActiveCfg = Debug|Any CPU
{665078F4-5875-431D-A2CC-421849B43328}.Debug|x86.Build.0 = Debug|Any CPU
{665078F4-5875-431D-A2CC-421849B43328}.Publish|Any CPU.ActiveCfg = Release|Any CPU
{665078F4-5875-431D-A2CC-421849B43328}.Publish|Any CPU.Build.0 = Release|Any CPU
{665078F4-5875-431D-A2CC-421849B43328}.Publish|x86.ActiveCfg = Release|Any CPU
{665078F4-5875-431D-A2CC-421849B43328}.Publish|x86.Build.0 = Release|Any CPU
{665078F4-5875-431D-A2CC-421849B43328}.Release|Any CPU.ActiveCfg = Release|Any CPU
{665078F4-5875-431D-A2CC-421849B43328}.Release|Any CPU.Build.0 = Release|Any CPU
{665078F4-5875-431D-A2CC-421849B43328}.Release|x86.ActiveCfg = Release|Any CPU
{665078F4-5875-431D-A2CC-421849B43328}.Release|x86.Build.0 = Release|Any CPU
{665078F4-5875-431D-A2CC-421849B43328}.XamlDesign|Any CPU.ActiveCfg = Release|Any CPU
{665078F4-5875-431D-A2CC-421849B43328}.XamlDesign|Any CPU.Build.0 = Release|Any CPU
{665078F4-5875-431D-A2CC-421849B43328}.XamlDesign|x86.ActiveCfg = Release|Any CPU
{665078F4-5875-431D-A2CC-421849B43328}.XamlDesign|x86.Build.0 = Release|Any CPU
{110B206F-8554-4B51-BF86-94DAA32F5E26}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{110B206F-8554-4B51-BF86-94DAA32F5E26}.Debug|Any CPU.Build.0 = Debug|Any CPU
{110B206F-8554-4B51-BF86-94DAA32F5E26}.Debug|x86.ActiveCfg = Debug|Any CPU
{110B206F-8554-4B51-BF86-94DAA32F5E26}.Debug|x86.Build.0 = Debug|Any CPU
{110B206F-8554-4B51-BF86-94DAA32F5E26}.Publish|Any CPU.ActiveCfg = Release|Any CPU
{110B206F-8554-4B51-BF86-94DAA32F5E26}.Publish|Any CPU.Build.0 = Release|Any CPU
{110B206F-8554-4B51-BF86-94DAA32F5E26}.Publish|x86.ActiveCfg = Release|Any CPU
{110B206F-8554-4B51-BF86-94DAA32F5E26}.Publish|x86.Build.0 = Release|Any CPU
{110B206F-8554-4B51-BF86-94DAA32F5E26}.Release|Any CPU.ActiveCfg = Release|Any CPU
{110B206F-8554-4B51-BF86-94DAA32F5E26}.Release|Any CPU.Build.0 = Release|Any CPU
{110B206F-8554-4B51-BF86-94DAA32F5E26}.Release|x86.ActiveCfg = Release|Any CPU
{110B206F-8554-4B51-BF86-94DAA32F5E26}.Release|x86.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
@ -585,7 +467,6 @@ Global
{0EC8DBA1-D745-4EE5-993A-6026440EC3BF} = {1E7F7253-A6AF-43C4-A955-37BEDDA01AF9}
{DD99FD0F-82F6-4C30-930E-4A1D0DF01D65} = {1E7F7253-A6AF-43C4-A955-37BEDDA01AB9}
{7B835A7D-CF94-45E8-B191-96F5A4FE26A8} = {8A7DA2E7-262B-4581-807A-1C45CE79CDFD}
{4405C20E-A72A-4807-9480-14E9BB558347} = {1E7F7253-A6AF-43C4-A955-37BEDDA01AB8}
{665078F4-5875-431D-A2CC-421849B43328} = {4405C20E-A72A-4807-9480-14E9BB558347}
{110B206F-8554-4B51-BF86-94DAA32F5E26} = {8A7DA2E7-262B-4581-807A-1C45CE79CDFD}
EndGlobalSection
EndGlobal

Просмотреть файл

@ -9,6 +9,9 @@ Official builds of this extension are available at [the official website](https:
[![Join the chat at freenode:github-vs](https://img.shields.io/badge/irc-freenode:%20%23github--vs-blue.svg)](http://webchat.freenode.net/?channels=%23github-vs) [![Join the chat at https://gitter.im/github/VisualStudio](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/github/VisualStudio?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
## Documentation
Visit the [documentation](https://github.com/github/VisualStudio/tree/master/docs) for details on how to use the features in the GitHub Extension for Visual Studio.
## Installing beta versions
Older and pre-release/beta/untested versions are available at [the releases page](https://github.com/github/VisualStudio/releases), and also via a custom gallery feed for Visual Studio.
@ -83,7 +86,6 @@ build.cmd
Note, attempting to install `IsExperimental=false` builds of the VSIX is not recommended.
## More information
- Andreia Gaita's [presentation](https://www.youtube.com/watch?v=hz2hCO8e_8w) at Codemania 2016 about this extension.
## Contributing

Просмотреть файл

@ -0,0 +1,19 @@
# Cloning a repository to Visual Studio
After you provide your GitHub or GitHub Enterprise credentials to GitHub for Visual Studio, the extension automatically detects the personal and organization repositories you have access to on your account.
1. Open **Team Explorer** by clicking on its tab next to *Solution Explorer*, or via the *View* menu.
2. Click the **Manage Connections** toolbar button.
![Location of the manage connections toolbar button in Team Explorer](images/manage-connections.png)
3. Next to the account you want to clone from, click **Clone**.
![Clone button in the GitHub section of Team Explorer](images/clone-link.png)
4. In the list of repositories, click the repository you'd like to clone.
![List of GitHub repositories that can be cloned inside a dialog](images/clone-dialog.png)
5. If desired, change the local path where the repository will be cloned into, or leave the default as-is. Click **Clone**.
6. In Team Explorer, under the list of repositories, locate the repository and double-click to open the project in Visual Studio.

Просмотреть файл

@ -0,0 +1,10 @@
# Creating a pull request
1. Open a solution in a GitHub repository.
2. Open **Team Explorer** and click the **Pull Requests** button to open the **GitHub** pane.
![Location of the pull requests button in the Team Explorer pane](images/pull-requests-button2.png)
3. Click the **Create New** link above the list of pull requests for the repository.
4. Select the target branch by clicking the link. If the current repository is a fork, then there will be two sets of branches in the dropdown - to submit a pull request upstream then select a branch with the `owner:` prefix of the upstream repository.
![The pull request creation form in the GitHub pane](images/pr-create.png)
5. Enter a pull request title and an optional description.
6. Click the **Create Pull Request** button.

Просмотреть файл

@ -0,0 +1,27 @@
# Creating an empty repository from Visual Studio
1. [Sign in](authenticating-to-github) to GitHub.
2. Open **Team Explorer** by clicking on its tab next to *Solution Explorer*, or via the *View* menu.
3. Click the **Manage Connections** toolbar button.
![The manage connections toolbar button in Team Explorer](images/manage-connections.png)
4. Click the **Create** link next to the account you want to create the repository in.
![The create link in the Team Explorer pane](images/create-link.png)
5. In the **Create a GitHub Repository** dialog, enter a name, description and local path for the repository.
![The create a GitHub repository dialog](images/create-dialog.png)
6. Select a license for the repository.
7. Check the **Private Repository** box if you want to upload the repository as a private repository on GitHub. You must have a [Developer, Team or Business account](https://github.com/pricing) to create private repositories.
8. Click the **Create** button to create the repository
9. When the repository is created, click the **Create a new Project or Solution** link in Team Explorer to create a project or solution in the repository.
![Successful repository creation message at the top of the Team Explorer pane](images/successful-creation-message.png)

Просмотреть файл

@ -0,0 +1,23 @@
# Creating gists
GitHub for Visual Studio enables easy creation of gists directly from the Visual Studio Editor.
1. [Sign in](authenticating-to-github) to GitHub.
2. Open a file in the Visual Studio text editor.
3. Select the section of text that you want to create a gist from.
4. Right click and select **Create a GitHub Gist** from the **GitHub** submenu.
![Location of Create A GitHub Gist in the GitHub submenu](images/create-gist-menu.png)
5. In the **Create a GitHub Gist** dialog, check that the filename is correct and optionally add a description.
![GitHub Gist creation dialog window](images/create-gist-dialog.png)
6. If you want the gist to be private, check the **Private Gist** checkbox.
7. Click **Create**.
8. Once the gist is created it will be opened in your browser.

Двоичные данные
docs/contributing/images/add-to-source-control.png Normal file

Двоичный файл не отображается.

После

Ширина:  |  Высота:  |  Размер: 14 KiB

Двоичные данные
docs/contributing/images/clone-dialog.png Normal file

Двоичный файл не отображается.

После

Ширина:  |  Высота:  |  Размер: 26 KiB

Двоичные данные
docs/contributing/images/clone-link.png Normal file

Двоичный файл не отображается.

После

Ширина:  |  Высота:  |  Размер: 14 KiB

Двоичные данные
docs/contributing/images/create-dialog.png Normal file

Двоичный файл не отображается.

После

Ширина:  |  Высота:  |  Размер: 28 KiB

Двоичные данные
docs/contributing/images/create-gist-dialog.png Normal file

Двоичный файл не отображается.

После

Ширина:  |  Высота:  |  Размер: 20 KiB

Двоичные данные
docs/contributing/images/create-gist-menu.png Normal file

Двоичный файл не отображается.

После

Ширина:  |  Высота:  |  Размер: 45 KiB

Двоичные данные
docs/contributing/images/create-link.png Normal file

Двоичный файл не отображается.

После

Ширина:  |  Высота:  |  Размер: 14 KiB

Двоичные данные
docs/contributing/images/github-pane-toolbar.png Normal file

Двоичный файл не отображается.

После

Ширина:  |  Высота:  |  Размер: 4.1 KiB

Двоичные данные
docs/contributing/images/manage-connections.png Normal file

Двоичный файл не отображается.

После

Ширина:  |  Высота:  |  Размер: 16 KiB

Двоичные данные
docs/contributing/images/open-on-github.png Normal file

Двоичный файл не отображается.

После

Ширина:  |  Высота:  |  Размер: 12 KiB

Двоичные данные
docs/contributing/images/open-team-explorer.png Normal file

Двоичный файл не отображается.

После

Ширина:  |  Высота:  |  Размер: 20 KiB

Двоичные данные
docs/contributing/images/pr-create.png Normal file

Двоичный файл не отображается.

После

Ширина:  |  Высота:  |  Размер: 14 KiB

Двоичные данные
docs/contributing/images/pr-details-checkout-link.png Normal file

Двоичный файл не отображается.

После

Ширина:  |  Высота:  |  Размер: 20 KiB

Двоичные данные
docs/contributing/images/pr-details.png Normal file

Двоичный файл не отображается.

После

Ширина:  |  Высота:  |  Размер: 57 KiB

Двоичные данные
docs/contributing/images/pr-diff-files.png Normal file

Двоичный файл не отображается.

После

Ширина:  |  Высота:  |  Размер: 188 KiB

Двоичные данные
docs/contributing/images/pr-pull-changes.png Normal file

Двоичный файл не отображается.

После

Ширина:  |  Высота:  |  Размер: 14 KiB

Двоичные данные
docs/contributing/images/publish-to-github.png Normal file

Двоичный файл не отображается.

После

Ширина:  |  Высота:  |  Размер: 9.2 KiB

Двоичные данные
docs/contributing/images/pull-request-list.png Normal file

Двоичный файл не отображается.

После

Ширина:  |  Высота:  |  Размер: 29 KiB

Двоичные данные
docs/contributing/images/pull-requests-button.png Normal file

Двоичный файл не отображается.

После

Ширина:  |  Высота:  |  Размер: 40 KiB

Двоичные данные
docs/contributing/images/pull-requests-button2.png Normal file

Двоичный файл не отображается.

После

Ширина:  |  Высота:  |  Размер: 16 KiB

Двоичные данные
docs/contributing/images/successful-creation-message.png Normal file

Двоичный файл не отображается.

После

Ширина:  |  Высота:  |  Размер: 15 KiB

Двоичные данные
docs/contributing/images/team-explorer-sync.png Normal file

Двоичный файл не отображается.

После

Ширина:  |  Высота:  |  Размер: 17 KiB

Просмотреть файл

@ -0,0 +1,29 @@
# Contributing to Projects with GitHub for Visual Studio
Use GitHub for Visual Studio to manage your projects and work with pull requests.
### Table of Contents
- Adding and cloning repositories
- [Publishing an existing project to GitHub](publishing-an-existing-project-to-github.md)
- [Creating an empty repository from Visual Studio](creating-an-empty-repository-from-visual-studio.md)
- [Cloning a repository to Visual Studio](cloning-a-repository-to-visual-studio.md)
- Working with pull requests
- [Viewing pull requests for a repository](viewing-the-pull-requests-for-a-repository.md)
- [Creating a pull request](creating-a-pull-request.md)
- [Reviewing a pull request in Visual Studio](reviewing-a-pull-request-in-visual-studio.md)
- [Making changes to a pull request](making-changes-to-a-pull-request.md)
- [Creating gists](creating-gists.md)
- [Viewing existing code on GitHub](viewing-code-on-github.md)
- [Viewing the selected code on GitHub](viewing-code-on-github.md#viewing-the-selected-code-on-github)
- [Copying the URL of the selected code's location on GitHub](viewing-code-on-github.md#copying-the-url-of-the-selected-codes-location-on-github)
- [Viewing the selected code in blame view on GitHub](viewing-code-on-github.md#viewing-the-selected-code-in-blame-view-on-github)
- [Using the GitHub toolbar](using-the-github-toolbar.md)
- Operations provided by Visual Studio
- [Committing](https://www.visualstudio.com/en-us/docs/git/tutorial/commits)
- [Pushing commits to the remote repository](https://www.visualstudio.com/en-us/docs/git/tutorial/pushing)
- [Fetching and pulling](https://www.visualstudio.com/en-us/docs/git/tutorial/pulling)
- [Working with branches](https://www.visualstudio.com/en-us/docs/git/tutorial/branches)
- [Viewing history](https://www.visualstudio.com/en-us/docs/git/tutorial/history)
- [Ignoring files](https://www.visualstudio.com/en-us/docs/git/tutorial/ignore-files)
- [Contact a human](https://github.com/contact)

Просмотреть файл

@ -0,0 +1,17 @@
# Making changes to a pull request
When a topic branch is [checked out](review-a-pull-request-in-visual-studio.md), you can commit changes to it and push and pull like any other branch. If the pull request branch is located in a fork and was checked out from the Pull Request Details view in the GitHub pane, then a remote to that fork will be created automatically and the branch set to track the fork branch.
## Pulling changes to your local clone
If a Pull Request is checked out and the author adds new commits to the branch, then the option will be given to pull the changes locally. This works both for pull requests from the same repository and from a fork.
![Pulling changes by clicking the pull link button](images/pr-pull-changes.png)
## Pushing changes
If you make commits locally to a topic branch, then you can push the changes to the remote branch. You can also do this from Git itself or from the Visual Studio Team Explorer **Sync** view.
> Note: for this to work with Pull Requests that come from forks, then you must be a maintainer on the repository and the Pull Request submitter must have checked [Allow edits from maintainers](https://help.github.com/articles/allowing-changes-to-a-pull-request-branch-created-from-a-fork/) when submitting the Pull Request.
If there are commits on the branch on the remote repository that you don't have on your local clone, you must pull them to your local clone and [resolve any conflicts](https://help.github.com/articles/addressing-merge-conflicts/) before you can push your local commits back to the remote repository.

Просмотреть файл

@ -0,0 +1,14 @@
# Publishing an existing project to GitHub
1. Open a solution in Visual Studio.
2. If solution is not already initialized as a Git repository, select **Add to Source Control** from the **File** menu.
![Location of Add to Source Control option in the file menu](images/add-to-source-control.png)
3. Open **Team Explorer**.
![Location of Team Explorer option in the view menu](images/open-team-explorer.png)
4. In Team Explorer, click **Sync**.
![Location of the sync button in the Team Explorer pane](images/team-explorer-sync.png)
5. Click the **Publish to GitHub** button.
![Location of the Publish to GitHub button in the Team Explorer pane](images/publish-to-github.png)
6. Enter a name and description for the repository on GitHub.
7. Check the **Private Repository** box if you want to upload the repository as a private repository on GitHub. You must have a [Developer, Team or Business account](https://github.com/pricing) to create private repositories.
8. Click the **Publish** button.

Просмотреть файл

@ -0,0 +1,35 @@
# Reviewing a pull request in Visual Studio
GitHub for Visual Studio provides facilities for reviewing a pull request directly in Visual Studio.
1. Open a solution in a GitHub repository.
2. Open **Team Explorer** and click the **Pull Requests** button to open the **GitHub** pane.
![Pull Requests button in the Team Explorer pane](images/pull-requests-button.png)
3. Click the title of the pull request to be reviewed.
## Viewing a pull request
The Pull Request Details view shows the current state of the pull request, including information about who created the pull request, the source and target branch, and the files changed.
![The details of a single pull request in the GitHub pane](images/pr-details.png)
## Checking out a pull request
To check out the pull request branch, click the **Checkout [branch]** link where [branch] is the name of the branch that will be checked out.
![Location of the checkout link in the GitHub pull request details page](images/pr-details-checkout-link.png)
If the pull request is from a fork then a remote will be added to the forked repository and the branch checked out locally. This remote will automatically be cleaned up when the local branch is deleted.
> Note that you cannot check out a pull request branch when your working directory has uncommitted changes. First commit or stash your changes and then refresh the Pull Request view.
## Comparing files
To compare the contents of a file in the pull request with its content on the target branch, double click a file in the **Changed Files** tree. This will open the Visual Studio diff viewer. If the pull request has been checked out, the right hand pane will be editable.
![Diff of two files in the Visual Studio diff viewer](images/pr-diff-files.png)
If the pull request is checked out, right clicking on a file on the **Changed Files** tree and selecting **Open File** will open the file for editing in Visual Studio.

Просмотреть файл

@ -0,0 +1,29 @@
# Using the GitHub pane toolbar
The GitHub pane toolbar provides a way to navigate between views, refresh views, and open the current view on GitHub.
![The GitHub pane toolbar](images/github-pane-toolbar.png)
1. Open a solution in a GitHub repository.
2. Open **Team Explorer** and click the **Pull Requests** button to open the **GitHub** pane.
## Using the back navigation button
1. At the top of the **GitHub** pane, locate the button furthest to the left. This is the **Back** button.
2. Click **Back** to navigate to the previous view. If **Back** is grey, you have reached the initial point in the view navigation.
## Using the forward navigation button
1. At the top of the **GitHub** pane, locate the second button from the left, which is the **Forward** button.
2. Click **Forward** to navigate to the next view. If **Forward** is grey, you have reached the furthest point in the view navigation.
## Using the pull request toolbar icon
1. At the top of the **GitHub** pane, locate the third button from the left. This is the **Pull Requests** button.
2. Click **Pull Requests** to navigate to the list of pull requests in the repository.
## Using the GitHub toolbar button
1. At the top of the **GitHub** pane, locate the fourth button from the left. This is the **View On GitHub** button.
2. While viewing the list of pull requests, click **View On Github**. Your browser will open and navigate to the repository's pull requests on GitHub.
3. While viewing the details of a pull request, click **View On Github**. Your browser will open and navigate to the pull request on GitHub.
## Using the refresh toolbar button
1. At the top of the **GitHub** pane, locate the fifth button from the left. This is the **Refresh** button.
2. Click **Refresh** to refresh the current view in the **GitHub** pane.

Просмотреть файл

@ -0,0 +1,21 @@
# Viewing existing code on GitHub
GitHub for Visual Studio enables easy navigation to code that exists on GitHub directly from the Visual Studio code editor.
1. Open a solution in a GitHub repository.
2. Open *Solution Explorer* by clicking on its tab, or via the *View* menu.
3. In *Solution Explorer*, double click on a file to open it in Visual Studio code editor.
3. In the code editor, highlight the section of text that you want to view in the browser.
## Viewing the selected code on GitHub
1. Right click and select **Open on GitHub** from the **GitHub** submenu.
![Open on GitHub selection in the GitHub context submenu](images/open-on-github.png)
2. Your browser will open and navigate to the code on GitHub.
## Copying the URL of the selected code's location on GitHub
1. Right click and select **Copy link to clipboard** from the **GitHub** submenu. The URL will be copied to the clipboard.
2. Paste the URL into your browser to view it on GitHub.
## Viewing the selected code in blame view on GitHub
1. Right click and select **Blame** from the **GitHub** submenu.
2. Your browser will open and navigate to the code in blame view on GitHub.

Просмотреть файл

@ -0,0 +1,15 @@
# Viewing the pull requests for a repository
GitHub for Visual Studio exposes the pull requests for the current repository and lets you create new pull requests and review pull requests from other contributors.
1. [Sign in](authenticating-to-github) to GitHub.
2. Open a solution in a GitHub repository.
3. Open **Team Explorer** and click the **Pull Requests** button to open the **GitHub** pane.
![Pull Requests button in the Team Explorer pane](images/pull-requests-button2.png)
4. The open pull requests will be displayed.
![Pull requests in the GitHub pane](images/pull-request-list.png)
5. Change the Open/Closed filter by clicking the **Open** link and selecting the filter you want to use from the dropdown.
6. Filter pull requests by Assignee by clicking the **Assignee** link and selecting the assignee you want to view from the dropdown.
7. Filter pull requests by Author by clicking the **Author** link and selecting the author you want to view from the dropdown.
8. Click on a pull request title to [view the pull request details and review the pull request](review-a-pull-request-in-visual-studio.md)
9. Click on the **Create New** link to [create a pull request from the current branch](sending-a-pull-request.md)

Просмотреть файл

@ -0,0 +1,19 @@
# Authenticating to GitHub
Add your GitHub.com or GitHub Enterprise account information to GitHub Desktop so you can access your repositories.
Before you authenticate, you must already have a GitHub or GitHub Enterprise account.
- For more information on creating a GitHub account, see "[Signing up for a new GitHub account](https://help.github.com/articles/signing-up-for-a-new-github-account/)".
- For a GitHub Enterprise account, contact your GitHub Enterprise site administrator.
> **Note:** If your organization is on the [Business plan](https://help.github.com/articles/organization-billing-plans) and has enabled SAML single sign-on, you must create and authorize a personal access token to access protected content. For more information on creating personal access tokens, see "[Creating a personal access token for the command line](https://help.github.com/articles/creating-a-personal-access-token-for-the-command-line). For more information on authenticating with SAML single sign-on, see "[About authentication with SAML single sign-on](https://help.github.com/articles/about-authentication-with-saml-single-sign-on)."
1. In Visual Studio, select **Team Explorer** from the **View** menu.
![Team Explorer in the view menu](images/view_team_explorer.png)
2. In the Team Explorer pane, click the **Manage Connections** toolbar button.
![Manage connections toolbar button in the Team Explorer pane](images/manage_connections.png)
3. Click the **Connect** link in the GitHub section. If you are already connected to a GitHub instance and want to connect to another, this link will not be visible; instead click **Manage Connections** and then **Connect to GitHub**.
![Connect to GitHub in the manage connections dropdown in the Team Explorer pane](images/connect_to_github.png)
4. In the **Connect to GitHub dialog** choose **GitHub** or **GitHub Enterprise**, depending on which product you're using.
5. Type your credentials, then click **Sign In**.

Просмотреть файл

@ -0,0 +1,17 @@
# Configuring Git in Visual Studio
# Setting your name and email
The name and email that will be displayed with your commits can be set from Team Explorer's settings.
1. Open **Team Explorer** by clicking on its tab next to *Solution Explorer*, or via the *View* menu.
2. Click the **Settings** button in Team Explorer.
![The settings button in Team Explorer pane](images/settings-button.png)
3. Click **Global Settings** in the Team Explorer Settings page
![The global settings button in the Team Explorer settings page](images/global-settings-link.png)
4. Enter the name and email that you would like to appear in commits.

Двоичные данные
docs/getting-started/images/connect_to_github.png Normal file

Двоичный файл не отображается.

После

Ширина:  |  Высота:  |  Размер: 17 KiB

Двоичные данные
docs/getting-started/images/global-settings-link.png Normal file

Двоичный файл не отображается.

После

Ширина:  |  Высота:  |  Размер: 14 KiB

Двоичные данные
docs/getting-started/images/install-from-gallery.png Normal file

Двоичный файл не отображается.

После

Ширина:  |  Высота:  |  Размер: 181 KiB

Двоичные данные
docs/getting-started/images/manage_connections.png Normal file

Двоичный файл не отображается.

После

Ширина:  |  Высота:  |  Размер: 19 KiB

Двоичные данные
docs/getting-started/images/settings-button.png Normal file

Двоичный файл не отображается.

После

Ширина:  |  Высота:  |  Размер: 40 KiB

Двоичные данные
docs/getting-started/images/update-from-gallery.png Normal file

Двоичный файл не отображается.

После

Ширина:  |  Высота:  |  Размер: 120 KiB

Двоичные данные
docs/getting-started/images/view_team_explorer.png Normal file

Двоичный файл не отображается.

После

Ширина:  |  Высота:  |  Размер: 34 KiB

Двоичные данные
docs/getting-started/images/vs2015-installer.png Normal file

Двоичный файл не отображается.

После

Ширина:  |  Высота:  |  Размер: 110 KiB

Двоичные данные
docs/getting-started/images/vs2017-installer.png Normal file

Двоичный файл не отображается.

После

Ширина:  |  Высота:  |  Размер: 186 KiB

Просмотреть файл

@ -0,0 +1,13 @@
# Getting Started with GitHub for Visual Studio
## [Installing GitHub for Visual Studio](installing-github-for-visual-studio.md)
GitHub for Visual Studio is available for Visual Studio 2015 and later. The Community, Professional and Enterprise editions are supported.
## [Authenticating to GitHub](authenticating-to-github.md)
Add your GitHub.com or GitHub Enterprise account information to Visual Studio so you can access your repositories.
### [Configuring Git in Visual Studio](configuring-git-in-visual-studio.md)
Configure how Visual Studio interacts with GitHub

Просмотреть файл

@ -0,0 +1,71 @@
# Installing the GitHub Extension for Visual Studio
GitHub for Visual Studio is an extension for Microsoft Visual Studio 2015 and later. It is not supported on Visual Studio Code, Visual Studio Express or Visual Studio for Mac.
## Installing for all versions of Visual Studio 2015 and higher
If you already have Visual Studio 2015 or higher installed, you can install the extension into all your versions of Visual Studio with the following steps:
1. Visit the [GitHub for Visual Studio](https://visualstudio.github.com/) site.
2. Click the **Download GitHub Extension for Visual Studio** button.
3. In your computer's **Downloads** folder, double-click **GitHub.VisualStudio.vsix**.
4. In the pop-up window, click **Install**.
5. After the installation is completed, run Visual Studio.
## Installing from the Visual Studio gallery
If you're currently running Visual Studio 2015 or higher, you can install the extension from the Visual Studio gallery.
1. In Visual Studio, open the **Tools** menu and click **Extensions and Updates**
2. On the left side of the **Extensions and Updates** dialog, select **Online - Visual Studio gallery**
3. In the search box on the top right side, type **GitHub**
4. Select the **GitHub Extension for Visual Studio** entry and click **Download**
![Installing GitHub for Visual Studio in the settings extensions and updates gallery](images/install-from-gallery.png)
5. After installation is completed, restart Visual Studio.
## If you do not have Visual Studio installed yet
When you install Visual Studio, you can include the GitHub Extension for Visual Studio for installation, as it is available in the Visual Studio installer.
### Visual Studio 2015
**Note:** The Visual Studio 2015 installer is not guaranteed to install the latest version of the extension. Once the Visual Studio installation is complete, [update the extension](#updating-the-extension) from the Visual Studio gallery, or [run the installer](#installing-for-all-versions-of-visual-studio-2015-and-higher) from our website.
1. Start the Visual Studio 2015 installer.
2. Scroll down to **Common Tools** and check **GitHub Extension for Visual Studio**.
![GitHub Extension for Visual Studio in the common tools section of the Visual Studio 2015 installer](images/vs2015-installer.png)
3. Click the **Install** button.
4. Once installation is complete, run Visual Studio 2015 and [update the extension](#updating-the-extension)
### Visual Studio 2017
**Note:** The Visual Studio 2017 installer is not guaranteed to install the latest version of the extension. Once the Visual Studio installation is complete, [update the extension](#updating-the-extension) from the Visual Studio gallery, or [run the installer](#installing-for-all-versions-of-visual-studio-2015-and-higher) from our website.
1. Start the Visual Studio 2017 installer.
2. Select the **Individual components** tab at the top.
3. Scroll down to **Code tools** and check **GitHub Extension for Visual Studio**.
![GitHub Extension for Visual Studio in the code tools section of the Visual Studio 2017 installer](images/vs2017-installer.png)
4. Click the **Modify** button.
5. Once installation is complete, run Visual Studio 2017 and [update the extension](#updating-the-extension)
## Updating the extension
**Note:** If you're currently running Visual Studio 2015 or higher and the extension is already installed, Visual Studio will check for and install updates automatically every 24 hours. For this update process to run, Visual Studio must not be running.
Visual Studio 2017 will not run automatic updates until you update the extension at least once.
1. In Visual Studio, open the **Tools** menu and click **Extensions and Updates**
2. On the left side of the **Extensions and Updates** dialog, select **Updates - Visual Studio gallery**
3. If there are updates available, an entry titled **GitHub Extension for Visual Studio** will appear on the list. Select it and click **Update**
![Updating GitHub for Visual Studio in the settings extensions and updates gallery](images/update-from-gallery.png)
4. After installation is completed, restart Visual Studio.

9
docs/readme.md Normal file
Просмотреть файл

@ -0,0 +1,9 @@
# GitHub for Visual Studio Documentation
### [Getting Started with GitHub for Visual Studio](getting-started/index.md)
Get GitHub for Visual Studio set up to bring the GitHub flow to Visual Studio. Authenticate to GitHub.com or GitHub Enterprise, keep the extension up-to-date, and review your preferred settings.
### [Contributing to Projects with GitHub for Visual Studio](contributing/index.md)
Use GitHub for Visual Studio to manage your projects and work with pull requests.

Просмотреть файл

@ -35,15 +35,6 @@
<WarningLevel>4</WarningLevel>
<TreatWarningsAsErrors>true</TreatWarningsAsErrors>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'XamlDesign|AnyCPU'">
<PlatformTarget>AnyCPU</PlatformTarget>
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<DefineConstants>DEBUG;TRACE;XAML_DESIGNER</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<ItemGroup>
<Reference Include="Microsoft.VisualStudio.ComponentModelHost, Version=12.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>..\..\packages\VSSDK.ComponentModelHost.12.0.4\lib\net45\Microsoft.VisualStudio.ComponentModelHost.dll</HintPath>

Просмотреть файл

@ -50,7 +50,7 @@ namespace GitHub.Authentication
public async Task ChallengeFailed(Exception exception)
{
await ThreadingHelper.SwitchToMainThreadAsync();
await twoFactorDialog.CancelCommand.ExecuteAsync(null);
await twoFactorDialog.Cancel.ExecuteAsync(null);
}
}
}

Просмотреть файл

@ -130,10 +130,10 @@ namespace GitHub.Controllers
{
disposablesForCurrentView?.Clear();
var action = view as ICanLoad;
var action = view.ViewModel as ICanNavigate;
if (action != null)
{
disposablesForCurrentView.Add(action?.Load.Subscribe(d =>
disposablesForCurrentView.Add(action?.Navigate.Subscribe(d =>
{
LoadView(connection, d, onViewLoad);
}));

Просмотреть файл

@ -82,6 +82,7 @@ namespace GitHub.Controllers
*/
using App.Factories;
using ViewModels;
using StateMachineType = StateMachine<UIViewType, UIController.Trigger>;
public class UIController : IUIController
@ -524,13 +525,15 @@ namespace GitHub.Controllers
if (!firstTime)
return;
SetupView(viewType, view);
SetupView(viewType, view.ViewModel);
}
void SetupView(UIViewType viewType, IView view)
void SetupView(UIViewType viewType, IViewModel viewModel)
{
var list = GetObjectsForFlow(activeFlow);
var pair = list[viewType];
var hasDone = viewModel as IHasDone;
var hasCancel = viewModel as IHasCancel;
// 2FA is set up when login is set up, so nothing to do
if (viewType == UIViewType.TwoFactor)
@ -543,29 +546,35 @@ namespace GitHub.Controllers
if (viewType == UIViewType.Login)
{
var pair2fa = list[UIViewType.TwoFactor];
pair2fa.AddHandler(pair2fa.ViewModel.WhenAny(x => x.IsShowing, x => x.Value)
pair2fa.AddHandler(((IDialogViewModel)pair2fa.ViewModel).WhenAny(x => x.IsShowing, x => x.Value)
.Where(x => x)
.ObserveOn(RxApp.MainThreadScheduler)
.Subscribe(_ => Fire(Trigger.Next)));
pair2fa.AddHandler(pair2fa.View.Cancel
pair2fa.AddHandler(((IHasCancel)pair2fa.ViewModel).Cancel
.ObserveOn(RxApp.MainThreadScheduler)
.Subscribe(_ => Fire(uiStateMachine.CanFire(Trigger.Cancel) ? Trigger.Cancel : Trigger.Finish)));
pair.AddHandler(view.Done
.ObserveOn(RxApp.MainThreadScheduler)
.Subscribe(_ => Fire(Trigger.Finish)));
if (hasDone != null)
{
pair.AddHandler(hasDone.Done
.ObserveOn(RxApp.MainThreadScheduler)
.Subscribe(_ => Fire(Trigger.Finish)));
}
}
else
else if (hasDone != null)
{
pair.AddHandler(view.Done
pair.AddHandler(hasDone.Done
.ObserveOn(RxApp.MainThreadScheduler)
.Subscribe(_ => Fire(uiStateMachine.CanFire(Trigger.Next) ? Trigger.Next : Trigger.Finish)));
}
pair.AddHandler(view.Cancel
.ObserveOn(RxApp.MainThreadScheduler)
.Subscribe(_ => Fire(uiStateMachine.CanFire(Trigger.Cancel) ? Trigger.Cancel : Trigger.Finish)));
if (hasCancel != null)
{
pair.AddHandler(hasCancel.Cancel
.ObserveOn(RxApp.MainThreadScheduler)
.Subscribe(_ => Fire(uiStateMachine.CanFire(Trigger.Cancel) ? Trigger.Cancel : Trigger.Finish)));
}
}
/// <summary>

Просмотреть файл

@ -132,6 +132,7 @@
<Reference Include="WindowsBase" />
</ItemGroup>
<ItemGroup>
<Compile Include="ViewModels\ViewModelBase.cs" />
<None Include="..\..\script\Key.snk" Condition="$(Buildtype) == 'Internal'">
<Link>Key.snk</Link>
</None>
@ -213,7 +214,8 @@
<Compile Include="UserErrors\PublishRepositoryUserError.cs" />
<Compile Include="UserErrors\PrivateRepositoryOnFreeAccountUserError.cs" />
<Compile Include="UserErrors\PrivateRepositoryQuotaExceededUserError.cs" />
<Compile Include="ViewModels\BaseViewModel.cs" />
<Compile Include="ViewModels\PanePageViewModelBase.cs" />
<Compile Include="ViewModels\DialogViewModelBase.cs" />
<Compile Include="Models\ConnectionRepositoryHostMap.cs" />
<Compile Include="ViewModels\GistCreationViewModel.cs" />
<Compile Include="ViewModels\NotAGitRepositoryViewModel.cs" />

Просмотреть файл

@ -94,5 +94,10 @@ namespace GitHub.Info
: string.Format(CultureInfo.InvariantCulture,
GitHub + "/organizations/{0}/settings/billing", account.Login);
}
/// <summary>
/// The URL for the GitHub for Visual Studio documentation.
/// </summary>
public const string Documentation = "https://github.com/github/VisualStudio/tree/master/docs";
}
}

Просмотреть файл

@ -5,6 +5,7 @@ using GitHub.Models;
using GitHub.Primitives;
using GitHub.UI;
using NullGuard;
using GitHub.Exports;
namespace GitHub.App.SampleData
{
@ -22,7 +23,7 @@ namespace GitHub.App.SampleData
public event PropertyChangedEventHandler PropertyChanged;
#pragma warning restore CS0067
public Task<UriString> GenerateUrl(string path = null, int startLine = -1, int endLine = -1)
public Task<UriString> GenerateUrl(LinkType linkType, string path = null, int startLine = -1, int endLine = -1)
{
throw new NotImplementedException();
}

Просмотреть файл

@ -1,15 +1,13 @@
using System;
using System.Diagnostics.CodeAnalysis;
using System.Reactive;
using System.Reactive.Linq;
using System.Windows.Input;
using GitHub.Collections;
using GitHub.Models;
using GitHub.ViewModels;
namespace GitHub.SampleData
{
[ExcludeFromCodeCoverage]
public class LoggedOutViewModelDesigner : BaseViewModel, IViewModel
public class LoggedOutViewModelDesigner : PanePageViewModelBase, IViewModel
{
public LoggedOutViewModelDesigner()
{

Просмотреть файл

@ -4,11 +4,13 @@ using System.Collections.Generic;
using GitHub.Models;
using GitHub.Validation;
using ReactiveUI;
using System;
using System.Reactive;
namespace GitHub.SampleData
{
[ExcludeFromCodeCoverage]
public class PullRequestCreationViewModelDesigner : BaseViewModel, IPullRequestCreationViewModel
public class PullRequestCreationViewModelDesigner : DialogViewModelBase, IPullRequestCreationViewModel
{
public PullRequestCreationViewModelDesigner()
{
@ -46,5 +48,6 @@ namespace GitHub.SampleData
public ReactivePropertyValidator BranchValidator { get; }
public override IObservable<Unit> Done { get; }
}
}

Просмотреть файл

@ -1,4 +1,5 @@
using System;
using System.Collections.Generic;
using System.Diagnostics.CodeAnalysis;
using System.Reactive;
using System.Threading.Tasks;
@ -25,8 +26,10 @@ namespace GitHub.SampleData
}
[ExcludeFromCodeCoverage]
public class PullRequestDetailViewModelDesigner : BaseViewModel, IPullRequestDetailViewModel
public class PullRequestDetailViewModelDesigner : PanePageViewModelBase, IPullRequestDetailViewModel
{
private List<IPullRequestChangeNode> changedFilesTree;
public PullRequestDetailViewModelDesigner()
{
var repoPath = @"C:\Repo";
@ -63,17 +66,19 @@ This requires that errors be propagated from the viewmodel to the view and from
modelsDir.Files.Add(oldBranchModel);
gitHubDir.Directories.Add(modelsDir);
ChangedFilesTree = new ReactiveList<IPullRequestChangeNode>();
ChangedFilesTree.Add(gitHubDir);
changedFilesTree = new List<IPullRequestChangeNode>();
changedFilesTree.Add(gitHubDir);
}
public IPullRequestModel Model { get; }
public string SourceBranchDisplayName { get; set; }
public string TargetBranchDisplayName { get; set; }
public bool IsLoading { get; }
public bool IsBusy { get; }
public bool IsCheckedOut { get; }
public bool IsFromFork { get; }
public string Body { get; }
public IReactiveList<IPullRequestChangeNode> ChangedFilesTree { get; }
public IReadOnlyList<IPullRequestChangeNode> ChangedFilesTree => changedFilesTree;
public IPullRequestCheckoutState CheckoutState { get; set; }
public IPullRequestUpdateState UpdateState { get; set; }
public string OperationError { get; set; }

Просмотреть файл

@ -9,11 +9,12 @@ using System.Collections.Generic;
using ReactiveUI;
using System.Collections.ObjectModel;
using System.Linq;
using GitHub.UI;
namespace GitHub.SampleData
{
[ExcludeFromCodeCoverage]
public class PullRequestListViewModelDesigner : BaseViewModel, IPullRequestListViewModel
public class PullRequestListViewModelDesigner : PanePageViewModelBase, IPullRequestListViewModel
{
public PullRequestListViewModelDesigner()
{
@ -56,7 +57,6 @@ namespace GitHub.SampleData
public ITrackingCollection<IPullRequestModel> PullRequests { get; set; }
public IPullRequestModel SelectedPullRequest { get; set; }
public ICommand OpenPullRequest { get; set; }
public IReadOnlyList<PullRequestState> States { get; set; }
public PullRequestState SelectedState { get; set; }
@ -66,5 +66,10 @@ namespace GitHub.SampleData
public ObservableCollection<IAccount> Assignees { get; set; }
public IAccount SelectedAssignee { get; set; }
public IObservable<ViewWithData> Navigate { get; }
public bool IsBusy { get; }
public ReactiveCommand<object> OpenPullRequest { get; }
public ReactiveCommand<object> CreatePullRequest { get; }
}
}

Просмотреть файл

@ -23,7 +23,7 @@ using System.Threading.Tasks;
namespace GitHub.SampleData
{
[ExcludeFromCodeCoverage]
public class RepositoryCreationViewModelDesigner : BaseViewModel, IRepositoryCreationViewModel
public class RepositoryCreationViewModelDesigner : DialogViewModelBase, IRepositoryCreationViewModel
{
public RepositoryCreationViewModelDesigner()
{
@ -186,6 +186,8 @@ namespace GitHub.SampleData
get;
set;
}
public override IObservable<Unit> Done { get; }
}
[ExcludeFromCodeCoverage]
@ -230,12 +232,6 @@ namespace GitHub.SampleData
}
}
public bool IsPublishing
{
get;
private set;
}
public IReactiveCommand<ProgressState> PublishRepository
{
get;
@ -329,7 +325,7 @@ namespace GitHub.SampleData
}
}
public class RepositoryCloneViewModelDesigner : BaseViewModel, IRepositoryCloneViewModel
public class RepositoryCloneViewModelDesigner : DialogViewModelBase, IRepositoryCloneViewModel
{
public RepositoryCloneViewModelDesigner()
{
@ -378,11 +374,6 @@ namespace GitHub.SampleData
public new string Title { get { return "Clone a GitHub Repository"; } }
public bool IsLoading
{
get { return false; }
}
public IReactiveCommand<IReadOnlyList<IRemoteRepositoryModel>> LoadRepositoriesCommand
{
get;
@ -423,6 +414,8 @@ namespace GitHub.SampleData
get;
private set;
}
public override IObservable<Unit> Done { get; }
}
public class GitHubHomeSectionDesigner : IGitHubHomeSection

Просмотреть файл

@ -8,12 +8,13 @@ using ReactiveUI;
namespace GitHub.SampleData
{
public class StartPageCloneViewModelDesigner : BaseViewModel, IBaseCloneViewModel
public class StartPageCloneViewModelDesigner : DialogViewModelBase, IBaseCloneViewModel
{
public string BaseRepositoryPath { get; set; }
public ReactivePropertyValidator<string> BaseRepositoryPathValidator { get; }
public ICommand BrowseForDirectory { get; }
public IReactiveCommand<object> CloneCommand { get; }
public IRepositoryModel SelectedRepository { get; set; }
public override IObservable<Unit> Done { get; }
}
}

Просмотреть файл

@ -30,7 +30,7 @@ namespace GitHub.Services
{
var vm = x.View.ViewModel as IBaseCloneViewModel;
x.View.Done.Subscribe(_ =>
vm.Done.Subscribe(_ =>
{
basePath = vm?.BaseRepositoryPath;
repository = vm?.SelectedRepository;
@ -58,7 +58,7 @@ namespace GitHub.Services
vm.SelectedRepository = repository;
}
x.View.Done.Subscribe(_ =>
vm.Done.Subscribe(_ =>
{
basePath = vm?.BaseRepositoryPath;
});

Просмотреть файл

@ -1,40 +0,0 @@
using System.Windows.Input;
using ReactiveUI;
using NullGuard;
using GitHub.UI;
namespace GitHub.ViewModels
{
public class BaseViewModel : ReactiveObject, IReactiveViewModel, IHasBusy
{
protected ObservableAsPropertyHelper<bool> isShowing;
string title;
bool isBusy;
public BaseViewModel()
{
CancelCommand = ReactiveCommand.Create();
}
public IReactiveCommand<object> CancelCommand { get; protected set; }
public ICommand Cancel { get { return CancelCommand; } }
public string Title
{
[return: AllowNull]
get { return title; }
protected set { this.RaiseAndSetIfChanged(ref title, value); }
}
public bool IsShowing { get { return isShowing?.Value ?? true; } }
public bool IsBusy
{
get { return isBusy; }
set { this.RaiseAndSetIfChanged(ref isBusy, value); }
}
public virtual void Initialize([AllowNull] ViewWithData data)
{
}
}
}

Просмотреть файл

@ -0,0 +1,53 @@
using System;
using System.Reactive;
using GitHub.Extensions.Reactive;
using NullGuard;
using ReactiveUI;
namespace GitHub.ViewModels
{
/// <summary>
/// Base class for view models that can be dismissed, such as dialogs.
/// </summary>
public abstract class DialogViewModelBase : ViewModelBase, IDialogViewModel, IHasBusy
{
protected ObservableAsPropertyHelper<bool> isShowing;
string title;
bool isBusy;
/// <summary>
/// Initializes a new instance of the <see cref="DialogViewModelBase"/> class.
/// </summary>
protected DialogViewModelBase()
{
Cancel = ReactiveCommand.Create();
}
/// <inheritdoc/>
public abstract IObservable<Unit> Done { get; }
/// <inheritdoc/>
public ReactiveCommand<object> Cancel { get; }
/// <inheritdoc/>
public string Title
{
[return: AllowNull]
get { return title; }
protected set { this.RaiseAndSetIfChanged(ref title, value); }
}
/// <inheritdoc/>
public bool IsShowing { get { return isShowing?.Value ?? true; } }
/// <inheritdoc/>
public bool IsBusy
{
get { return isBusy; }
protected set { this.RaiseAndSetIfChanged(ref isBusy, value); }
}
/// <inheritdoc/>
IObservable<Unit> IHasCancel.Cancel => Cancel.SelectUnit();
}
}

Просмотреть файл

@ -1,11 +1,13 @@
using System;
using System.ComponentModel.Composition;
using System.Linq;
using System.Reactive;
using System.Reactive.Linq;
using GitHub.Api;
using GitHub.App;
using GitHub.Exports;
using GitHub.Extensions;
using GitHub.Extensions.Reactive;
using GitHub.Models;
using GitHub.Services;
using NLog;
@ -17,7 +19,7 @@ namespace GitHub.ViewModels
{
[ExportViewModel(ViewType=UIViewType.Gist)]
[PartCreationPolicy(CreationPolicy.NonShared)]
public class GistCreationViewModel : BaseViewModel, IGistCreationViewModel
public class GistCreationViewModel : DialogViewModelBase, IGistCreationViewModel
{
static readonly Logger log = LogManager.GetCurrentClassLogger();
@ -132,5 +134,7 @@ namespace GitHub.ViewModels
get { return fileName; }
set { this.RaiseAndSetIfChanged(ref fileName, value); }
}
public override IObservable<Unit> Done => CreateGist.Where(x => x != null).SelectUnit();
}
}

Просмотреть файл

@ -14,7 +14,7 @@ namespace GitHub.ViewModels
/// </summary>
[ExportViewModel(ViewType = UIViewType.LoggedOut)]
[PartCreationPolicy(CreationPolicy.NonShared)]
public class LoggedOutViewModel : BaseViewModel, ILoggedOutViewModel
public class LoggedOutViewModel : PanePageViewModelBase, ILoggedOutViewModel
{
readonly IUIProvider uiProvider;
readonly IVisualStudioBrowser browser;

Просмотреть файл

@ -1,9 +1,11 @@
using System;
using System.ComponentModel.Composition;
using System.Reactive;
using System.Reactive.Linq;
using GitHub.App;
using GitHub.Authentication;
using GitHub.Exports;
using GitHub.Extensions.Reactive;
using GitHub.Models;
using ReactiveUI;
@ -11,7 +13,7 @@ namespace GitHub.ViewModels
{
[ExportViewModel(ViewType = UIViewType.Login)]
[PartCreationPolicy(CreationPolicy.NonShared)]
public class LoginControlViewModel : BaseViewModel, ILoginControlViewModel
public class LoginControlViewModel : DialogViewModelBase, ILoginControlViewModel
{
[ImportingConstructor]
public LoginControlViewModel(
@ -78,6 +80,11 @@ namespace GitHub.ViewModels
public bool IsLoginInProgress { get { return isLoginInProgress.Value; } }
public IObservable<AuthenticationResult> AuthenticationResults { get; private set; }
public override IObservable<Unit> Done
{
get { return AuthenticationResults.Where(x => x == AuthenticationResult.Success).SelectUnit(); }
}
}
public enum LoginTarget

Просмотреть файл

@ -14,12 +14,14 @@ using NullGuard;
using ReactiveUI;
using System.Diagnostics;
using System.Globalization;
using System.Reactive;
using GitHub.Extensions.Reactive;
namespace GitHub.ViewModels
{
[ExportViewModel(ViewType = UIViewType.LogoutRequired)]
[PartCreationPolicy(CreationPolicy.NonShared)]
public class LogoutRequiredViewModel : BaseViewModel, ILogoutRequiredViewModel
public class LogoutRequiredViewModel : DialogViewModelBase, ILogoutRequiredViewModel
{
static readonly Logger log = LogManager.GetCurrentClassLogger();
readonly IRepositoryHosts repositoryHosts;
@ -53,6 +55,11 @@ namespace GitHub.ViewModels
public IReactiveCommand<ProgressState> Logout { get; }
public override IObservable<Unit> Done
{
get { return Logout.Where(x => x == ProgressState.Success).SelectUnit(); }
}
IObservable<ProgressState> OnLogout(object unused)
{
return DoLogout().ToObservable()

Просмотреть файл

@ -13,7 +13,7 @@ namespace GitHub.ViewModels
/// </summary>
[ExportViewModel(ViewType = UIViewType.NotAGitHubRepository)]
[PartCreationPolicy(CreationPolicy.NonShared)]
public class NotAGitHubRepositoryViewModel : BaseViewModel, INotAGitHubRepositoryViewModel
public class NotAGitHubRepositoryViewModel : PanePageViewModelBase, INotAGitHubRepositoryViewModel
{
ITeamExplorerServices teamExplorerServices;

Просмотреть файл

@ -1,10 +1,5 @@
using System;
using System.ComponentModel.Composition;
using GitHub.Exports;
using GitHub.Models;
using GitHub.Services;
using GitHub.UI;
using ReactiveUI;
namespace GitHub.ViewModels
{
@ -13,7 +8,7 @@ namespace GitHub.ViewModels
/// </summary>
[ExportViewModel(ViewType = UIViewType.NotAGitRepository)]
[PartCreationPolicy(CreationPolicy.NonShared)]
public class NotAGitRepositoryViewModel : BaseViewModel, INotAGitRepositoryViewModel
public class NotAGitRepositoryViewModel : PanePageViewModelBase, INotAGitRepositoryViewModel
{
}
}

Просмотреть файл

@ -0,0 +1,29 @@
using ReactiveUI;
using NullGuard;
using GitHub.UI;
namespace GitHub.ViewModels
{
/// <summary>
/// Base class for view models that appear as a page in a navigable pane, such as the GitHub pane.
/// </summary>
public class PanePageViewModelBase : ViewModelBase, IPanePageViewModel
{
string title;
/// <summary>
/// Initializes a new instance of the <see cref="PanePageViewModelBase"/> class.
/// </summary>
protected PanePageViewModelBase()
{
}
/// <inheritdoc/>
public string Title
{
[return: AllowNull]
get { return title; }
protected set { this.RaiseAndSetIfChanged(ref title, value); }
}
}
}

Просмотреть файл

@ -14,11 +14,10 @@ using GitHub.App;
using System.Diagnostics.CodeAnalysis;
using Octokit;
using NLog;
using LibGit2Sharp;
using System.Globalization;
using GitHub.Primitives;
using GitHub.Extensions;
using System.Reactive.Disposables;
using System.Reactive;
namespace GitHub.ViewModels
{
@ -26,7 +25,7 @@ namespace GitHub.ViewModels
[ExportViewModel(ViewType = UIViewType.PRCreation)]
[PartCreationPolicy(CreationPolicy.NonShared)]
[SuppressMessage("Microsoft.Design", "CA1001:TypesThatOwnDisposableFieldsShouldBeDisposable")]
public class PullRequestCreationViewModel : BaseViewModel, IPullRequestCreationViewModel, IDisposable
public class PullRequestCreationViewModel : DialogViewModelBase, IPullRequestCreationViewModel, IDisposable
{
static readonly Logger log = LogManager.GetCurrentClassLogger();
@ -97,7 +96,7 @@ namespace GitHub.ViewModels
.Where(x => !x.IsValid && x.DisplayValidationError)
.Subscribe(x => notifications.ShowError(BranchValidator.ValidationResult.Message));
createPullRequest = ReactiveCommand.CreateAsyncObservable(whenAnyValidationResultChanges,
CreatePullRequest = ReactiveCommand.CreateAsyncObservable(whenAnyValidationResultChanges,
_ => service
.CreatePullRequest(repositoryHost, activeRepo, TargetBranch.Repository, SourceBranch, TargetBranch, PRTitle, Description ?? String.Empty)
.Catch<IPullRequestModel, Exception>(ex =>
@ -219,8 +218,7 @@ namespace GitHub.ViewModels
set { this.RaiseAndSetIfChanged(ref branches, value); }
}
IReactiveCommand<IPullRequestModel> createPullRequest;
public IReactiveCommand<IPullRequestModel> CreatePullRequest => createPullRequest;
public IReactiveCommand<IPullRequestModel> CreatePullRequest { get; }
string title;
public string PRTitle
@ -249,5 +247,7 @@ namespace GitHub.ViewModels
get { return branchValidator; }
set { this.RaiseAndSetIfChanged(ref branchValidator, value); }
}
public override IObservable<Unit> Done => CreatePullRequest.SelectUnit();
}
}

Просмотреть файл

@ -12,7 +12,6 @@ using GitHub.Exports;
using GitHub.Extensions;
using GitHub.Models;
using GitHub.Services;
using GitHub.Settings;
using GitHub.UI;
using LibGit2Sharp;
using NullGuard;
@ -26,7 +25,7 @@ namespace GitHub.ViewModels
[ExportViewModel(ViewType = UIViewType.PRDetail)]
[PartCreationPolicy(CreationPolicy.NonShared)]
[NullGuard(ValidationFlags.None)]
public class PullRequestDetailViewModel : BaseViewModel, IPullRequestDetailViewModel
public class PullRequestDetailViewModel : PanePageViewModelBase, IPullRequestDetailViewModel
{
readonly ILocalRepositoryModel repository;
readonly IModelService modelService;
@ -36,9 +35,12 @@ namespace GitHub.ViewModels
string sourceBranchDisplayName;
string targetBranchDisplayName;
string body;
IReadOnlyList<IPullRequestChangeNode> changedFilesTree;
IPullRequestCheckoutState checkoutState;
IPullRequestUpdateState updateState;
string operationError;
bool isBusy;
bool isLoading;
bool isCheckedOut;
bool isFromFork;
bool isInCheckout;
@ -147,6 +149,14 @@ namespace GitHub.ViewModels
}
/// <summary>
/// Gets a value indicating whether the view model is updating.
/// </summary>
public bool IsBusy
{
get { return isBusy; }
private set { this.RaiseAndSetIfChanged(ref isBusy, value); }
}
/// Gets a value indicating whether the pull request branch is checked out.
/// </summary>
public bool IsCheckedOut
@ -155,6 +165,15 @@ namespace GitHub.ViewModels
private set { this.RaiseAndSetIfChanged(ref isCheckedOut, value); }
}
/// <summary>
/// Gets a value indicating whether the view model is loading.
/// </summary>
public bool IsLoading
{
get { return isLoading; }
private set { this.RaiseAndSetIfChanged(ref isLoading, value); }
}
/// <summary>
/// Gets a value indicating whether the pull request comes from a fork.
/// </summary>
@ -204,7 +223,11 @@ namespace GitHub.ViewModels
/// <summary>
/// Gets the changed files as a tree.
/// </summary>
public IReactiveList<IPullRequestChangeNode> ChangedFilesTree { get; } = new ReactiveList<IPullRequestChangeNode>();
public IReadOnlyList<IPullRequestChangeNode> ChangedFilesTree
{
get { return changedFilesTree; }
private set { this.RaiseAndSetIfChanged(ref changedFilesTree, value); }
}
/// <summary>
/// Gets a command that checks out the pull request locally.
@ -244,7 +267,10 @@ namespace GitHub.ViewModels
{
var prNumber = data?.Data != null ? (int)data.Data : Model.Number;
IsBusy = true;
if (Model == null)
IsLoading = true;
else
IsBusy = true;
OperationError = null;
modelService.GetPullRequest(repository, prNumber)
@ -268,15 +294,8 @@ namespace GitHub.ViewModels
TargetBranchDisplayName = GetBranchDisplayName(IsFromFork, pullRequest.Base.Label);
Body = !string.IsNullOrWhiteSpace(pullRequest.Body) ? pullRequest.Body : Resources.NoDescriptionProvidedMarkdown;
ChangedFilesTree.Clear();
var treeChanges = await pullRequestsService.GetTreeChanges(repository, pullRequest);
// WPF doesn't support AddRange here so iterate through the changes.
foreach (var change in CreateChangedFilesTree(pullRequest, treeChanges).Children)
{
ChangedFilesTree.Add(change);
}
var changes = await pullRequestsService.GetTreeChanges(repository, pullRequest);
ChangedFilesTree = CreateChangedFilesTree(pullRequest, changes).Children.ToList();
var localBranches = await pullRequestsService.GetLocalBranches(repository, pullRequest).ToList();
@ -342,7 +361,7 @@ namespace GitHub.ViewModels
UpdateState = null;
}
IsBusy = false;
IsLoading = IsBusy = false;
if (!isInCheckout)
{

Просмотреть файл

@ -4,7 +4,7 @@ using System.Collections.ObjectModel;
using System.ComponentModel.Composition;
using System.Linq;
using System.Reactive.Linq;
using System.Windows.Input;
using System.Reactive.Subjects;
using System.Windows.Media.Imaging;
using GitHub.App;
using GitHub.Collections;
@ -21,17 +21,17 @@ namespace GitHub.ViewModels
{
[ExportViewModel(ViewType = UIViewType.PRList)]
[PartCreationPolicy(CreationPolicy.NonShared)]
public class PullRequestListViewModel : BaseViewModel, IPullRequestListViewModel, IDisposable
public class PullRequestListViewModel : PanePageViewModelBase, IPullRequestListViewModel, IDisposable
{
static readonly Logger log = LogManager.GetCurrentClassLogger();
readonly ReactiveCommand<object> openPullRequestCommand;
readonly IRepositoryHost repositoryHost;
readonly ILocalRepositoryModel repository;
readonly TrackingCollection<IAccount> trackingAuthors;
readonly TrackingCollection<IAccount> trackingAssignees;
readonly IPackageSettings settings;
readonly PullRequestListUIState listSettings;
readonly bool constructing;
[ImportingConstructor]
PullRequestListViewModel(
@ -47,6 +47,7 @@ namespace GitHub.ViewModels
ILocalRepositoryModel repository,
IPackageSettings settings)
{
constructing = true;
this.repositoryHost = repositoryHost;
this.repository = repository;
this.settings = settings;
@ -57,8 +58,6 @@ namespace GitHub.ViewModels
.GetOrCreateRepositoryState(repository.CloneUrl)
.PullRequests;
openPullRequestCommand = ReactiveCommand.Create();
States = new List<PullRequestState> {
new PullRequestState { IsOpen = true, Name = "Open" },
new PullRequestState { IsOpen = false, Name = "Closed" },
@ -84,21 +83,27 @@ namespace GitHub.ViewModels
.Subscribe(s => UpdateFilter(s, SelectedAssignee, SelectedAuthor));
this.WhenAny(x => x.SelectedAssignee, x => x.Value)
.Where(x => PullRequests != null && x != EmptyUser && IsLoaded)
.Where(x => PullRequests != null && x != EmptyUser)
.Subscribe(a => UpdateFilter(SelectedState, a, SelectedAuthor));
this.WhenAny(x => x.SelectedAuthor, x => x.Value)
.Where(x => PullRequests != null && x != EmptyUser && IsLoaded)
.Where(x => PullRequests != null && x != EmptyUser)
.Subscribe(a => UpdateFilter(SelectedState, SelectedAssignee, a));
SelectedState = States.FirstOrDefault(x => x.Name == listSettings.SelectedState) ?? States[0];
OpenPullRequest = ReactiveCommand.Create();
OpenPullRequest.Subscribe(DoOpenPullRequest);
CreatePullRequest = ReactiveCommand.Create();
CreatePullRequest.Subscribe(_ => DoCreatePullRequest());
constructing = false;
}
public override void Initialize([AllowNull] ViewWithData data)
{
base.Initialize(data);
IsLoaded = false;
IsBusy = true;
PullRequests = repositoryHost.ModelService.GetPullRequests(repository, pullRequests);
pullRequests.Subscribe(pr =>
@ -132,7 +137,7 @@ namespace GitHub.ViewModels
SelectedAssignee = Assignees.FirstOrDefault(x => x.Login == listSettings.SelectedAssignee);
}
IsLoaded = true;
IsBusy = false;
UpdateFilter(SelectedState, SelectedAssignee, SelectedAuthor);
});
}
@ -145,13 +150,14 @@ namespace GitHub.ViewModels
(!state.IsOpen.HasValue || state.IsOpen == pr.IsOpen) &&
(ass == null || ass.Equals(pr.Assignee)) &&
(aut == null || aut.Equals(pr.Author));
SaveSettings();
}
bool isLoaded;
public bool IsLoaded
bool isBusy;
public bool IsBusy
{
get { return isLoaded; }
private set { this.RaiseAndSetIfChanged(ref isLoaded, value); }
get { return isBusy; }
private set { this.RaiseAndSetIfChanged(ref isBusy, value); }
}
ITrackingCollection<IPullRequestModel> pullRequests;
@ -171,11 +177,6 @@ namespace GitHub.ViewModels
set { this.RaiseAndSetIfChanged(ref selectedPullRequest, value); }
}
public ICommand OpenPullRequest
{
get { return openPullRequestCommand; }
}
IReadOnlyList<PullRequestState> states;
public IReadOnlyList<PullRequestState> States
{
@ -229,6 +230,12 @@ namespace GitHub.ViewModels
get { return emptyUser; }
}
readonly Subject<ViewWithData> navigate = new Subject<ViewWithData>();
public IObservable<ViewWithData> Navigate => navigate;
public ReactiveCommand<object> OpenPullRequest { get; }
public ReactiveCommand<object> CreatePullRequest { get; }
bool disposed;
protected void Dispose(bool disposing)
{
@ -238,7 +245,6 @@ namespace GitHub.ViewModels
pullRequests.Dispose();
trackingAuthors.Dispose();
trackingAssignees.Dispose();
SaveSettings();
disposed = true;
}
}
@ -251,10 +257,25 @@ namespace GitHub.ViewModels
void SaveSettings()
{
listSettings.SelectedState = SelectedState.Name;
listSettings.SelectedAssignee = SelectedAssignee?.Login;
listSettings.SelectedAuthor = SelectedAuthor?.Login;
settings.Save();
if (!constructing)
{
listSettings.SelectedState = SelectedState.Name;
listSettings.SelectedAssignee = SelectedAssignee?.Login;
listSettings.SelectedAuthor = SelectedAuthor?.Login;
settings.Save();
}
}
void DoOpenPullRequest(object pullRequest)
{
var d = new ViewWithData(UIControllerFlow.PullRequestDetail) { Data = pullRequest };
navigate.OnNext(d);
}
void DoCreatePullRequest()
{
var d = new ViewWithData(UIControllerFlow.PullRequestCreation);
navigate.OnNext(d);
}
}
}

Просмотреть файл

@ -28,14 +28,13 @@ namespace GitHub.ViewModels
{
[ExportViewModel(ViewType=UIViewType.Clone)]
[PartCreationPolicy(CreationPolicy.NonShared)]
public class RepositoryCloneViewModel : BaseViewModel, IRepositoryCloneViewModel
public class RepositoryCloneViewModel : DialogViewModelBase, IRepositoryCloneViewModel
{
static readonly Logger log = LogManager.GetCurrentClassLogger();
readonly IRepositoryHost repositoryHost;
readonly IOperatingSystem operatingSystem;
readonly ReactiveCommand<object> browseForDirectoryCommand = ReactiveCommand.Create();
bool isLoading;
bool noRepositoriesFound;
readonly ObservableAsPropertyHelper<bool> canClone;
string baseRepositoryPath;
@ -66,13 +65,13 @@ namespace GitHub.ViewModels
repositories.Filter = FilterRepository;
repositories.NewerComparer = OrderedComparer<IRemoteRepositoryModel>.OrderByDescending(x => x.UpdatedAt).Compare;
filterTextIsEnabled = this.WhenAny(x => x.IsLoading,
filterTextIsEnabled = this.WhenAny(x => x.IsBusy,
loading => loading.Value || repositories.UnfilteredCount > 0 && !LoadingFailed)
.ToProperty(this, x => x.FilterTextIsEnabled);
this.WhenAny(
x => x.repositories.UnfilteredCount,
x => x.IsLoading,
x => x.IsBusy,
x => x.LoadingFailed,
(unfilteredCount, loading, failed) =>
{
@ -124,17 +123,17 @@ namespace GitHub.ViewModels
{
base.Initialize(data);
IsLoading = true;
IsBusy = true;
repositoryHost.ModelService.GetRepositories(repositories);
repositories.OriginalCompleted.Subscribe(
_ => { }
, ex =>
{
LoadingFailed = true;
IsLoading = false;
IsBusy = false;
log.Error("Error while loading repositories", ex);
},
() => IsLoading = false
() => IsBusy = false
);
repositories.Subscribe();
}
@ -244,12 +243,6 @@ namespace GitHub.ViewModels
set { this.RaiseAndSetIfChanged(ref filterText, value); }
}
public bool IsLoading
{
get { return isLoading; }
private set { this.RaiseAndSetIfChanged(ref isLoading, value); }
}
public bool LoadingFailed
{
get { return loadingFailed; }
@ -277,5 +270,7 @@ namespace GitHub.ViewModels
get;
private set;
}
public override IObservable<Unit> Done => CloneCommand.SelectUnit();
}
}

Просмотреть файл

@ -197,6 +197,8 @@ namespace GitHub.ViewModels
/// </summary>
public IReactiveCommand<Unit> CreateRepository { get; private set; }
public override IObservable<Unit> Done => CreateRepository;
protected override NewRepository GatherRepositoryInfo()
{
var gitHubRepository = base.GatherRepositoryInfo();

Просмотреть файл

@ -12,7 +12,7 @@ namespace GitHub.ViewModels
/// <summary>
/// Base class for the Repository publish/create dialogs. It represents the details about the repository itself.
/// </summary>
public abstract class RepositoryFormViewModel : BaseViewModel
public abstract class RepositoryFormViewModel : DialogViewModelBase
{
readonly ObservableAsPropertyHelper<string> safeRepositoryName;

Просмотреть файл

@ -4,6 +4,7 @@ using System.Collections.ObjectModel;
using System.ComponentModel.Composition;
using System.Globalization;
using System.Linq;
using System.Reactive;
using System.Reactive.Linq;
using GitHub.App;
using GitHub.Exports;
@ -31,7 +32,6 @@ namespace GitHub.ViewModels
readonly ObservableAsPropertyHelper<IReadOnlyList<IAccount>> accounts;
readonly ObservableAsPropertyHelper<bool> isHostComboBoxVisible;
readonly ObservableAsPropertyHelper<bool> canKeepPrivate;
readonly ObservableAsPropertyHelper<bool> isPublishing;
readonly ObservableAsPropertyHelper<string> title;
readonly IUsageTracker usageTracker;
@ -89,8 +89,7 @@ namespace GitHub.ViewModels
(canKeep, publishing) => canKeep && !publishing)
.ToProperty(this, x => x.CanKeepPrivate);
isPublishing = PublishRepository.IsExecuting
.ToProperty(this, x => x.IsPublishing);
PublishRepository.IsExecuting.Subscribe(x => IsBusy = x);
var defaultRepositoryName = repositoryPublishService.LocalRepositoryName;
if (!string.IsNullOrEmpty(defaultRepositoryName))
@ -111,7 +110,6 @@ namespace GitHub.ViewModels
public new string Title { get { return title.Value; } }
public bool CanKeepPrivate { get { return canKeepPrivate.Value; } }
public bool IsPublishing { get { return isPublishing.Value; } }
public IReactiveCommand<ProgressState> PublishRepository { get; private set; }
public ObservableCollection<IConnection> Connections { get; private set; }
@ -141,6 +139,11 @@ namespace GitHub.ViewModels
get { return isHostComboBoxVisible.Value; }
}
public override IObservable<Unit> Done
{
get { return PublishRepository.Select(x => x == ProgressState.Success).SelectUnit(); }
}
ReactiveCommand<ProgressState> InitializePublishRepositoryCommand()
{
var canCreate = this.WhenAny(x => x.RepositoryNameValidator.ValidationResult.IsValid, x => x.Value);

Просмотреть файл

@ -8,6 +8,7 @@ using System.Reactive.Linq;
using System.Windows.Input;
using GitHub.App;
using GitHub.Exports;
using GitHub.Extensions.Reactive;
using GitHub.Models;
using GitHub.Services;
using GitHub.Validation;
@ -20,7 +21,7 @@ namespace GitHub.ViewModels
{
[ExportViewModel(ViewType=UIViewType.StartPageClone)]
[PartCreationPolicy(CreationPolicy.NonShared)]
public class StartPageCloneViewModel : BaseViewModel, IBaseCloneViewModel
public class StartPageCloneViewModel : DialogViewModelBase, IBaseCloneViewModel
{
static readonly Logger log = LogManager.GetCurrentClassLogger();
@ -156,5 +157,7 @@ namespace GitHub.ViewModels
get;
private set;
}
public override IObservable<Unit> Done => CloneCommand.SelectUnit();
}
}

Просмотреть файл

@ -2,6 +2,7 @@
using System.ComponentModel.Composition;
using System.Diagnostics;
using System.Globalization;
using System.Reactive;
using System.Reactive.Linq;
using GitHub.App;
using GitHub.Authentication;
@ -17,7 +18,7 @@ namespace GitHub.ViewModels
{
[ExportViewModel(ViewType = UIViewType.TwoFactor)]
[PartCreationPolicy(CreationPolicy.NonShared)]
public class TwoFactorDialogViewModel : BaseViewModel, ITwoFactorDialogViewModel
public class TwoFactorDialogViewModel : DialogViewModelBase, ITwoFactorDialogViewModel
{
bool isAuthenticationCodeSent;
bool invalidAuthenticationCode;
@ -41,7 +42,7 @@ namespace GitHub.ViewModels
(code, busy) => !string.IsNullOrEmpty(code.Value) && code.Value.Length == 6 && !busy.Value);
OkCommand = ReactiveCommand.Create(canVerify);
CancelCommand.Subscribe(_ => TwoFactorType = TwoFactorType.None);
Cancel.Subscribe(_ => TwoFactorType = TwoFactorType.None);
NavigateLearnMore = ReactiveCommand.Create();
NavigateLearnMore.Subscribe(x => browser.OpenUrl(GitHubUrls.TwoFactorLearnMore));
//TODO: ShowHelpCommand.Subscribe(x => browser.OpenUrl(twoFactorHelpUri));
@ -97,7 +98,7 @@ namespace GitHub.ViewModels
var resend = ResendCodeCommand.Select(_ => RecoveryOptionResult.RetryOperation)
.Select(_ => TwoFactorChallengeResult.RequestResendCode)
.Do(_ => IsAuthenticationCodeSent = true);
var cancel = CancelCommand.Select(_ => default(TwoFactorChallengeResult));
var cancel = Cancel.Select(_ => default(TwoFactorChallengeResult));
return Observable.Merge(ok, cancel, resend).Take(1);
}
@ -144,5 +145,7 @@ namespace GitHub.ViewModels
{
get { return showErrorMessage.Value; }
}
public override IObservable<Unit> Done => Observable.Never<Unit>();
}
}

Просмотреть файл

@ -0,0 +1,18 @@
using System;
using GitHub.UI;
using NullGuard;
using ReactiveUI;
namespace GitHub.ViewModels
{
/// <summary>
/// Base class for view models.
/// </summary>
public abstract class ViewModelBase : ReactiveObject, IViewModel
{
/// <inheritdoc/>
public virtual void Initialize([AllowNull] ViewWithData data)
{
}
}
}

Просмотреть файл

@ -99,6 +99,9 @@
<Compile Include="Services\IPullRequestService.cs" />
<Compile Include="ViewModels\IGistCreationViewModel.cs" />
<Compile Include="Services\NotificationDispatcher.cs" />
<Compile Include="ViewModels\IHasCancel.cs" />
<Compile Include="ViewModels\IHasDone.cs" />
<Compile Include="ViewModels\ILoginViewModel.cs" />
<Compile Include="ViewModels\INotAGitRepositoryViewModel.cs" />
<Compile Include="ViewModels\INotAGitHubRepositoryViewModel.cs" />
<Compile Include="ViewModels\ILoggedOutViewModel.cs" />
@ -119,7 +122,7 @@
<Compile Include="ViewModels\IPullRequestDirectoryNode.cs" />
<Compile Include="ViewModels\IPullRequestFileNode.cs" />
<Compile Include="ViewModels\IPullRequestListViewModel.cs" />
<Compile Include="ViewModels\IReactiveViewModel.cs" />
<Compile Include="ViewModels\IDialogViewModel.cs" />
<Compile Include="ViewModels\IBaseCloneViewModel.cs" />
<Compile Include="ViewModels\IRepositoryCreationTarget.cs" />
<Compile Include="ViewModels\IRepositoryForm.cs" />

Просмотреть файл

@ -54,18 +54,18 @@ namespace GitHub.Services
handler?.ShowMessage(message);
}
public void ShowMessage(string message, ICommand command)
public void ShowMessage(string message, ICommand command, bool showToolTips = true, Guid guid = default(Guid))
{
notifications.OnNext(new Notification(message, Notification.NotificationType.Message, command));
var handler = notificationHandlers.TryPeek();
handler?.ShowMessage(message, command);
handler?.ShowMessage(message, command, showToolTips, guid);
}
public void ShowWarning(string message)
{
notifications.OnNext(new Notification(message, Notification.NotificationType.Warning));
var handler = notificationHandlers.TryPeek();
handler.ShowWarning(message);
handler?.ShowWarning(message);
}
public void ShowError(string message)
@ -75,6 +75,18 @@ namespace GitHub.Services
handler?.ShowError(message);
}
public void HideNotification(Guid guid)
{
var handler = notificationHandlers.TryPeek();
handler?.HideNotification(guid);
}
public bool IsNotificationVisible(Guid guid)
{
var handler = notificationHandlers.TryPeek();
return handler?.IsNotificationVisible(guid) ?? false;
}
bool disposed; // To detect redundant calls
void Dispose(bool disposing)
{

Просмотреть файл

@ -9,7 +9,7 @@ namespace GitHub.ViewModels
/// <summary>
/// ViewModel for the the Clone Repository dialog
/// </summary>
public interface IBaseCloneViewModel : IViewModel, IRepositoryCreationTarget
public interface IBaseCloneViewModel : IDialogViewModel, IRepositoryCreationTarget
{
/// <summary>
/// Signals that the user clicked the clone button.

Просмотреть файл

@ -0,0 +1,32 @@
using System;
using System.Reactive;
using ReactiveUI;
namespace GitHub.ViewModels
{
/// <summary>
/// A <see cref="IDialogViewModel"/> which exposes its Cancel command as a reactive command.
/// </summary>
public interface IDialogViewModel : IViewModel, IHasDone, IHasCancel
{
/// <summary>
/// Gets a title to display in the dialog titlebar.
/// </summary>
string Title { get; }
/// <summary>
/// Gets a value indicating whether the view model is busy.
/// </summary>
bool IsBusy { get; }
/// <summary>
/// Gets a value indicating whether the view model represents the page currently being shown.
/// </summary>
bool IsShowing { get; }
/// <summary>
/// Gets a command that will dismiss the page.
/// </summary>
new ReactiveCommand<object> Cancel { get; }
}
}

Просмотреть файл

@ -4,7 +4,7 @@ using ReactiveUI;
namespace GitHub.ViewModels
{
public interface IGistCreationViewModel : IViewModel
public interface IGistCreationViewModel : IDialogViewModel
{
/// <summary>
/// Gets the command to create a new gist.

Просмотреть файл

@ -0,0 +1,16 @@
using System;
using System.Reactive;
namespace GitHub.ViewModels
{
/// <summary>
/// Represents a view model that has a "Cancel" signal.
/// </summary>
public interface IHasCancel
{
/// <summary>
/// Gets an observable which will emit a value when the view model is cancelled.
/// </summary>
IObservable<Unit> Cancel { get; }
}
}

Просмотреть файл

@ -0,0 +1,16 @@
using System;
using System.Reactive;
namespace GitHub.ViewModels
{
/// <summary>
/// Represents a view model that has a "Done" signal.
/// </summary>
public interface IHasDone
{
/// <summary>
/// Gets an observable which will emit a value when the view model is done.
/// </summary>
IObservable<Unit> Done { get; }
}
}

Просмотреть файл

@ -7,7 +7,7 @@ namespace GitHub.ViewModels
/// <summary>
/// Defines the view model for the "Sign in to GitHub" view in the GitHub pane.
/// </summary>
public interface ILoggedOutViewModel : IViewModel
public interface ILoggedOutViewModel : IPanePageViewModel
{
/// <summary>
/// Gets the command executed when the user clicks the "Sign in" link.

Просмотреть файл

@ -3,7 +3,7 @@ using GitHub.Authentication;
namespace GitHub.ViewModels
{
public interface ILoginViewModel : IViewModel
public interface ILoginViewModel : IDialogViewModel
{
/// <summary>
/// Gets an observable sequence which produces an authentication

Просмотреть файл

@ -7,7 +7,7 @@ namespace GitHub.ViewModels
/// <summary>
/// Represents a view model for the "Log out Required" dialog..
/// </summary>
public interface ILogoutRequiredViewModel : IReactiveViewModel
public interface ILogoutRequiredViewModel : IDialogViewModel
{
IReactiveCommand<ProgressState> Logout { get; }
string LogoutRequiredMessage { get; set; }

Просмотреть файл

@ -5,7 +5,7 @@ namespace GitHub.ViewModels
/// <summary>
/// Defines the view model for the "Sign in to GitHub" view in the GitHub pane.
/// </summary>
public interface INotAGitHubRepositoryViewModel : IViewModel
public interface INotAGitHubRepositoryViewModel : IPanePageViewModel
{
/// <summary>
/// Gets the command executed when the user clicks the "Publish to GitHub" link.

Просмотреть файл

@ -4,7 +4,7 @@
/// Defines the view model for the "Not a git repository" view in the GitHub pane.
/// </summary>
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1040:AvoidEmptyInterfaces")]
public interface INotAGitRepositoryViewModel : IViewModel
public interface INotAGitRepositoryViewModel : IPanePageViewModel
{
}
}

Просмотреть файл

@ -5,7 +5,7 @@ using ReactiveUI;
namespace GitHub.ViewModels
{
public interface IPullRequestCreationViewModel : IReactiveViewModel
public interface IPullRequestCreationViewModel : IDialogViewModel, IPanePageViewModel
{
IBranch SourceBranch { get; set; }
IBranch TargetBranch { get; set; }

Просмотреть файл

@ -1,4 +1,5 @@
using System;
using System.Collections.Generic;
using System.Reactive;
using System.Threading.Tasks;
using GitHub.Models;
@ -62,7 +63,7 @@ namespace GitHub.ViewModels
/// <summary>
/// Represents a view model for displaying details of a pull request.
/// </summary>
public interface IPullRequestDetailViewModel : IViewModel, IHasBusy
public interface IPullRequestDetailViewModel : IViewModel, IHasLoading, IHasBusy
{
/// <summary>
/// Gets the underlying pull request model.
@ -97,7 +98,7 @@ namespace GitHub.ViewModels
/// <summary>
/// Gets the changed files as a tree.
/// </summary>
IReactiveList<IPullRequestChangeNode> ChangedFilesTree { get; }
IReadOnlyList<IPullRequestChangeNode> ChangedFilesTree { get; }
/// <summary>
/// Gets the state associated with the <see cref="Checkout"/> command.

Просмотреть файл

@ -27,16 +27,17 @@ namespace GitHub.ViewModels
}
}
public interface IPullRequestListViewModel : IViewModel
public interface IPullRequestListViewModel : IViewModel, ICanNavigate, IHasBusy
{
ITrackingCollection<IPullRequestModel> PullRequests { get; }
IPullRequestModel SelectedPullRequest { get; }
ICommand OpenPullRequest { get; }
IReadOnlyList<PullRequestState> States { get; set; }
PullRequestState SelectedState { get; set; }
ObservableCollection<IAccount> Authors { get; }
IAccount SelectedAuthor { get; set; }
ObservableCollection<IAccount> Assignees { get; }
IAccount SelectedAssignee { get; set; }
ReactiveCommand<object> OpenPullRequest { get; }
ReactiveCommand<object> CreatePullRequest { get; }
}
}

Просмотреть файл

@ -1,9 +0,0 @@
using ReactiveUI;
namespace GitHub.ViewModels
{
public interface IReactiveViewModel : IViewModel
{
IReactiveCommand<object> CancelCommand { get; }
}
}

Некоторые файлы не были показаны из-за слишком большого количества измененных файлов Показать больше