summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--build.proj215
-rw-r--r--lib/DotNetOpenAuth.BuildTasks.dllbin64000 -> 65536 bytes
-rw-r--r--lib/DotNetOpenAuth.BuildTasks.pdbbin159232 -> 165376 bytes
-rw-r--r--lib/DotNetOpenAuth.BuildTasks.targets1
-rw-r--r--projecttemplates/MvcRelyingParty.vstemplate2
-rw-r--r--src/DotNetOpenAuth.BuildTasks/DiscoverProjectTemplates.cs1
-rw-r--r--src/DotNetOpenAuth.BuildTasks/DotNetOpenAuth.BuildTasks.csproj2
-rw-r--r--src/DotNetOpenAuth.BuildTasks/HardLinkCopy.cs61
-rw-r--r--src/DotNetOpenAuth.BuildTasks/NativeMethods.cs18
-rw-r--r--vsi/DotNetOpenAuth Starter Kits.vscontent (renamed from projecttemplates/DotNetOpenAuth Starter Kits.vscontent)6
-rw-r--r--vsix/VSIXProject_large.pngbin0 -> 25212 bytes
-rw-r--r--vsix/VSIXProject_small.pngbin0 -> 309326 bytes
-rw-r--r--vsix/extension.vsixmanifest4
13 files changed, 237 insertions, 73 deletions
diff --git a/build.proj b/build.proj
index efaec57..fc1257f 100644
--- a/build.proj
+++ b/build.proj
@@ -6,9 +6,13 @@
<ILMergeOutputAssemblyDirectory>$(OutputPath)unified\</ILMergeOutputAssemblyDirectory>
<ILMergeOutputAssembly>$(ILMergeOutputAssemblyDirectory)$(ProductName).dll</ILMergeOutputAssembly>
<ProjectTemplatesLayoutPath>$(IntermediatePath)projecttemplates\</ProjectTemplatesLayoutPath>
- <ProjectTemplatesVsi>$(ProjectTemplatesLayoutPath)DotNetOpenAuth Starter Kits.vsi</ProjectTemplatesVsi>
- <ExtensionVsixLayoutPath>$(IntermediatePath)Vsix\</ExtensionVsixLayoutPath>
- <ExtensionVsix>$(ExtensionVsixLayoutPath)DotNetOpenAuth Starter Kits.vsix</ExtensionVsix>
+
+ <VS2008ProjectTemplatesDirectory>$(IntermediatePath)VS2008projecttemplates\</VS2008ProjectTemplatesDirectory>
+ <ProjectTemplatesVsiDirectory>$(IntermediatePath)vsi\</ProjectTemplatesVsiDirectory>
+
+ <VS2010ProjectTemplatesDirectory>$(IntermediatePath)VS2010projecttemplates\</VS2010ProjectTemplatesDirectory>
+ <ExtensionVsixLayoutDirectory>$(IntermediatePath)Vsix\</ExtensionVsixLayoutDirectory>
+ <ZipLevel>6</ZipLevel>
</PropertyGroup>
<Import Project="$(ProjectRoot)tools\$(ProductName).Versioning.targets"/>
@@ -139,7 +143,8 @@
<Zip ZipFileName="$(ToolsZip)"
Files="@(AllToolTargets)"
- WorkingDirectory="$(ToolsDirectory)" />
+ WorkingDirectory="$(ToolsDirectory)"
+ ZipLevel="$(ZipLevel)" />
</Target>
<Target Name="BuildProjectTemplates">
@@ -183,21 +188,11 @@
<SkipUnchangedFiles Condition="'%(Extension)' != '.csproj'">true</SkipUnchangedFiles>
<SkipUnchangedFiles Condition="'%(Extension)' == '.csproj'">false</SkipUnchangedFiles>
</_ProjectTemplatesTransformSource>
- <_ProjectTemplatesTransformSource Include="@(ProjectTemplatesSource)" Condition="
- '%(Extension)' == '.vscontent'
- ">
- <BeforeTokens>$version$</BeforeTokens>
- <AfterTokens>$(BuildVersion)</AfterTokens>
- <SkipUnchangedFiles>false</SkipUnchangedFiles>
- </_ProjectTemplatesTransformSource>
<ProjectTemplatesSource Remove="@(_ProjectTemplatesTransformSource)" />
<ProjectTemplatesLayout Include="@(ProjectTemplatesSource->'$(ProjectTemplatesLayoutPath)%(RecursiveDir)%(FileName)%(Extension)')"/>
<ProjectTemplatesTransformLayout Include="@(_ProjectTemplatesTransformSource->'$(ProjectTemplatesLayoutPath)%(RecursiveDir)%(FileName)%(Extension)')"/>
- <VSProjectTemplates Include="@(ProjectTemplatesLayout)" Condition="'%(Extension)' == '.vstemplate'" />
- <TopLevelVSProjectTemplates Include="@(VSProjectTemplates)" Condition="'%(RootDir)%(Directory)' == '$(ProjectTemplatesLayoutPath)'" />
-
<!-- Include the template icon -->
<ProjectTemplatesSource Include="$(ProjectRoot)doc\logo\favicon.ico" />
<ProjectTemplatesLayout Include="$(ProjectTemplatesLayoutPath)__TemplateIcon.ico" />
@@ -218,13 +213,13 @@
<FixupReferenceAssemblies Include="@(ProjectTemplateLibrariesTargets)" Condition="'%(Extension)' == '.dll'" />
<InjectedLibraryItems Include="@(ProjectTemplateLibrariesTargets->'lib\%(FileName)%(Extension)')" />
- <VSProjectTemplateZipFiles Include="@(TopLevelVSProjectTemplates->'%(RootDir)%(Directory)%(FileName).zip')" />
+ <VSProjectTemplates Include="@(ProjectTemplatesLayout)" Condition="'%(Extension)' == '.vstemplate'" />
</ItemGroup>
<Trim Inputs="@(_ProjectTemplatesTransformSource)" MetadataName="BeforeTokens" AllAfter="\">
<Output TaskParameter="Outputs" ItemName="ProjectTemplatesTransformSource" />
</Trim>
- <MSBuild Projects="@(ProjectTemplates)" />
+ <!--<MSBuild Projects="@(ProjectTemplates)" />-->
<Copy SourceFiles="@(ProjectTemplatesSource)" DestinationFiles="@(ProjectTemplatesLayout)" SkipUnchangedFiles="true" />
<CopyWithTokenSubstitution SourceFiles="@(ProjectTemplatesTransformSource)" DestinationFiles="@(ProjectTemplatesTransformLayout)">
<Output TaskParameter="CopiedFiles" ItemName="CopiedProjectTemplateFiles" />
@@ -233,8 +228,6 @@
IntendedFiles="
@(ProjectTemplatesLayout);
@(ProjectTemplatesTransformLayout);
- @(VSProjectTemplateZipFiles);
- $(ProjectTemplatesVsi);
" />
<ChangeProjectReferenceToAssemblyReference
Projects="@(CopiedProjectTemplateFiles)"
@@ -251,10 +244,6 @@
Condition="'%(CopiedProjectTemplateFiles.FileName)%(CopiedProjectTemplateFiles.Extension)' == 'RelyingPartyLogic.csproj'"
Items="@(InjectedLibraryItems)"
/>
- <DowngradeProjects
- Projects="@(CopiedProjectTemplateFiles)"
- Condition="'%(Extension)' == '.csproj'"
- />
<MergeProjectWithVSTemplate
ProjectItemTypes="@(VsTemplateProjectItemTypes)"
ReplaceParametersExtensions="@(VsTemplateParameterReplaceExtensions)"
@@ -262,88 +251,180 @@
/>
</Target>
- <Target Name="ProjectTemplates" DependsOnTargets="ProjectTemplatesLayout">
- <DiscoverProjectTemplates TopLevelTemplates="@(TopLevelVSProjectTemplates)">
- <Output TaskParameter="ProjectTemplates" ItemName="SubVSTemplates" />
- <Output TaskParameter="ProjectTemplateContents" ItemName="TemplateItemContents" />
+ <Target Name="ProjectTemplates2008" DependsOnTargets="ProjectTemplatesLayout">
+ <ItemGroup>
+ <ProjectTemplates2008Source Include="$(ProjectTemplatesLayoutPath)**" />
+ <ProjectTemplates2008Layout Include="@(ProjectTemplates2008Source->'$(VS2008ProjectTemplatesDirectory)%(RecursiveDir)%(FileName)%(Extension)')" />
+ <ProjectTemplates2008Layout>
+ <HardLink Condition=" '%(Extension)' != '.csproj' ">true</HardLink>
+ </ProjectTemplates2008Layout>
+
+ <VS2008ProjectTemplates Include="@(ProjectTemplates2008Layout)" Condition="'%(Extension)' == '.vstemplate'" />
+ <TopLevelVS2008ProjectTemplates Include="@(VS2008ProjectTemplates)" Condition="'%(RootDir)%(Directory)' == '$(VS2008ProjectTemplatesDirectory)'" />
+ <VS2008ProjectTemplateZipFiles Include="@(TopLevelVS2008ProjectTemplates->'%(RootDir)%(Directory)%(FileName).zip')" />
+ </ItemGroup>
+
+ <HardLinkCopy SourceFiles="@(ProjectTemplates2008Source)" DestinationFiles="@(ProjectTemplates2008Layout)" />
+
+ <DowngradeProjects
+ Projects="@(ProjectTemplates2008Layout)"
+ Condition="'%(Extension)' == '.csproj'"
+ />
+
+ <DiscoverProjectTemplates TopLevelTemplates="@(TopLevelVS2008ProjectTemplates)">
+ <Output TaskParameter="ProjectTemplates" ItemName="SubVS2008Templates" />
+ <Output TaskParameter="ProjectTemplateContents" ItemName="VS2008TemplateItemContents" />
</DiscoverProjectTemplates>
<ItemGroup>
<!-- Include in each template .zip file the top-level .vstemplate file itself. -->
- <VSProjectTemplateContents Include="@(TopLevelVSProjectTemplates)">
- <ZipFile>$(ProjectTemplatesLayoutPath)%(FileName).zip</ZipFile>
- <WorkingDirectory>$(ProjectTemplatesLayoutPath)</WorkingDirectory>
- </VSProjectTemplateContents>
+ <VS2008ProjectTemplateContents Include="@(TopLevelVS2008ProjectTemplates)">
+ <ZipFile>$(ProjectTemplatesVsiDirectory)%(FileName).zip</ZipFile>
+ <WorkingDirectory>$(VS2008ProjectTemplatesDirectory)</WorkingDirectory>
+ </VS2008ProjectTemplateContents>
<!-- Now throw in all the files in each of the project-level template's directories and their children. -->
- <VSProjectTemplateContents Include="@(TemplateItemContents)">
- <ZipFile>$(ProjectTemplatesLayoutPath)%(TemplateItemContents.TopLevelTemplateFileName).zip</ZipFile>
- <WorkingDirectory>$(ProjectTemplatesLayoutPath)</WorkingDirectory>
- </VSProjectTemplateContents>
+ <VS2008ProjectTemplateContents Include="@(VS2008TemplateItemContents)">
+ <ZipFile>$(ProjectTemplatesVsiDirectory)%(VS2008TemplateItemContents.TopLevelTemplateFileName).zip</ZipFile>
+ <WorkingDirectory>$(VS2008ProjectTemplatesDirectory)</WorkingDirectory>
+ </VS2008ProjectTemplateContents>
<!-- Include the template icon for each .zip file. -->
- <VSProjectTemplateContents Include="@(TopLevelVSProjectTemplates->'$(ProjectTemplatesLayoutPath)__TemplateIcon.ico')">
- <ZipFile>$(ProjectTemplatesLayoutPath)%(TopLevelVSProjectTemplates.FileName).zip</ZipFile>
- <WorkingDirectory>$(ProjectTemplatesLayoutPath)</WorkingDirectory>
- </VSProjectTemplateContents>
+ <VS2008ProjectTemplateContents Include="@(TopLevelVS2008ProjectTemplates->'$(VS2008ProjectTemplatesDirectory)__TemplateIcon.ico')">
+ <ZipFile>$(ProjectTemplatesVsiDirectory)%(TopLevelVS2008ProjectTemplates.FileName).zip</ZipFile>
+ <WorkingDirectory>$(VS2008ProjectTemplatesDirectory)</WorkingDirectory>
+ </VS2008ProjectTemplateContents>
</ItemGroup>
<Zip
- Files="@(VSProjectTemplateContents)"
- ZipFileName="%(VSProjectTemplateContents.ZipFile)"
- WorkingDirectory="%(VSProjectTemplateContents.WorkingDirectory)"
+ Files="@(VS2008ProjectTemplateContents)"
+ ZipFileName="%(VS2008ProjectTemplateContents.ZipFile)"
+ WorkingDirectory="%(VS2008ProjectTemplateContents.WorkingDirectory)"
+ ZipLevel="$(ZipLevel)"
/>
+
+ <Purge Directories="$(VS2008ProjectTemplatesDirectory)" IntendedFiles="@(ProjectTemplates2008Layout)" />
</Target>
- <Target Name="vsi" DependsOnTargets="ProjectTemplates">
+ <Target Name="ProjectTemplates2010" DependsOnTargets="ProjectTemplatesLayout">
+ <ItemGroup>
+ <ProjectTemplates2010Source Include="$(ProjectTemplatesLayoutPath)**" />
+ <ProjectTemplates2010Layout Include="@(ProjectTemplates2010Source->'$(VS2010ProjectTemplatesDirectory)%(RecursiveDir)%(FileName)%(Extension)')" />
+ <ProjectTemplates2010Layout>
+ <HardLink Condition=" '%(Extension)' != '.csproj' ">true</HardLink>
+ </ProjectTemplates2010Layout>
+
+ <VS2010ProjectTemplates Include="@(ProjectTemplates2010Layout)" Condition="'%(Extension)' == '.vstemplate'" />
+ <TopLevelVS2010ProjectTemplates Include="@(VS2010ProjectTemplates)" Condition="'%(RootDir)%(Directory)' == '$(VS2010ProjectTemplatesDirectory)'" />
+ <VS2010ProjectTemplateZipFiles Include="@(TopLevelVS2010ProjectTemplates->'%(RootDir)%(Directory)%(FileName).zip')" />
+ </ItemGroup>
+
+ <HardLinkCopy SourceFiles="@(ProjectTemplates2010Source)" DestinationFiles="@(ProjectTemplates2010Layout)" />
+
+ <DiscoverProjectTemplates TopLevelTemplates="@(TopLevelVS2010ProjectTemplates)">
+ <Output TaskParameter="ProjectTemplates" ItemName="SubVS2010Templates" />
+ <Output TaskParameter="ProjectTemplateContents" ItemName="VS2010TemplateItemContents" />
+ </DiscoverProjectTemplates>
+
<ItemGroup>
+ <!-- Include in each template .zip file the top-level .vstemplate file itself. -->
+ <VS2010ProjectTemplateContents Include="@(TopLevelVS2010ProjectTemplates)">
+ <ZipFile>$(ExtensionVsixLayoutDirectory)%(FileName)\%(FileName).zip</ZipFile>
+ <WorkingDirectory>$(VS2010ProjectTemplatesDirectory)</WorkingDirectory>
+ </VS2010ProjectTemplateContents>
+
+ <!-- Now throw in all the files in each of the project-level template's directories and their children. -->
+ <VS2010ProjectTemplateContents Include="@(VS2010TemplateItemContents)">
+ <ZipFile>$(ExtensionVsixLayoutDirectory)%(VS2010TemplateItemContents.TopLevelTemplateFileName)\%(VS2010TemplateItemContents.TopLevelTemplateFileName).zip</ZipFile>
+ <WorkingDirectory>$(VS2010ProjectTemplatesDirectory)</WorkingDirectory>
+ </VS2010ProjectTemplateContents>
+
+ <!-- Include the template icon for each .zip file. -->
+ <VS2010ProjectTemplateContents Include="@(TopLevelVS2010ProjectTemplates->'$(VS2010ProjectTemplatesDirectory)__TemplateIcon.ico')">
+ <ZipFile>$(ExtensionVsixLayoutDirectory)%(TopLevelVS2010ProjectTemplates.FileName)\%(TopLevelVS2010ProjectTemplates.FileName).zip</ZipFile>
+ <WorkingDirectory>$(VS2010ProjectTemplatesDirectory)</WorkingDirectory>
+ </VS2010ProjectTemplateContents>
+
+ <ExtensionVsixContents Include="%(VS2010ProjectTemplateContents.ZipFile)" />
+ </ItemGroup>
+
+ <Zip
+ Files="@(VS2010ProjectTemplateContents)"
+ ZipFileName="%(VS2010ProjectTemplateContents.ZipFile)"
+ WorkingDirectory="%(VS2010ProjectTemplateContents.WorkingDirectory)"
+ ZipLevel="$(ZipLevel)"
+ />
+ </Target>
+
+ <Target Name="vsi" DependsOnTargets="ProjectTemplates2008">
+ <PropertyGroup>
+ <ProjectTemplatesVsi>$(DropDirectoryNoSlash).vsi</ProjectTemplatesVsi>
+ </PropertyGroup>
+ <ItemGroup>
+ <VsiTransformSource Include="$(ProjectRoot)vsi\*.vscontent">
+ <BeforeTokens>$version$</BeforeTokens>
+ <AfterTokens>$(BuildVersion)</AfterTokens>
+ <SkipUnchangedFiles>false</SkipUnchangedFiles>
+ </VsiTransformSource>
+ <VsiTransformLayout Include="@(VsiTransformSource->'$(ProjectTemplatesVsiDirectory)%(RecursiveDir)%(FileName)%(Extension)')" />
+
<ProjectTemplateVsiContents Include="
- $(ProjectTemplatesLayoutPath)*.vscontent;
- $(ProjectTemplatesLayoutPath)*.zip
+ $(ProjectTemplatesVsiDirectory)*.zip;
+ @(VsiTransformLayout);
" />
</ItemGroup>
+ <CopyWithTokenSubstitution SourceFiles="@(VsiTransformSource)" DestinationFiles="@(VsiTransformLayout)" />
+
<Zip
Files="@(ProjectTemplateVsiContents)"
ZipFileName="$(ProjectTemplatesVsi)"
- WorkingDirectory="$(ProjectTemplatesLayoutPath)"
+ WorkingDirectory="$(ProjectTemplatesVsiDirectory)"
+ ZipLevel="$(ZipLevel)"
/>
</Target>
- <Target Name="VsixLayout" DependsOnTargets="GetBuildVersion">
+ <Target Name="VsixLayout" DependsOnTargets="ProjectTemplates2010">
<ItemGroup>
+ <ProjectTemplates2010TransformSource Include="
+ $(ProjectRoot)vsix\extension.vsixmanifest;
+ $(ProjectRoot)LICENSE.txt;
+ ">
+ <BeforeTokens>$version$</BeforeTokens>
+ <AfterTokens>$(BuildVersion)</AfterTokens>
+ <SkipUnchangedFiles>false</SkipUnchangedFiles>
+ </ProjectTemplates2010TransformSource>
+ <ProjectTemplates2010TransformLayout Include="@(ProjectTemplates2010TransformSource->'$(ExtensionVsixLayoutDirectory)%(RecursiveDir)%(FileName)%(Extension)')" />
+
<ExtensionVsixSources Include="
- $(ProjectRoot)vsix\[Content_Types].xml;
- $(ProjectRoot)LICENSE.txt;
- $(ProjectRoot)doc\logo\dnoa-logo.png;
- $(ProjectRoot)doc\logo\dnoa-logo_64x64.png;
- ">
- <SkipUnchangedFiles>true</SkipUnchangedFiles>
- </ExtensionVsixSources>
- <ExtensionVsixSources Include="
+ $(ProjectRoot)vsix\*;
+ " Exclude="
$(ProjectRoot)vsix\extension.vsixmanifest;
">
<SkipUnchangedFiles>true</SkipUnchangedFiles>
- <BeforeTokens>$version$</BeforeTokens>
- <AfterTokens>$(BuildVersion)</AfterTokens>
</ExtensionVsixSources>
- <ExtensionVsixContents Include="@(ExtensionVsixSources->'$(ExtensionVsixLayoutPath)%(FileName)%(Extension)')" />
+
+ <ExtensionVsixTargets Include="@(ExtensionVsixSources->'$(ExtensionVsixLayoutDirectory)%(FileName)%(Extension)')" />
+
+ <ExtensionVsixContents Include="
+ @(ExtensionVsixTargets);
+ @(ProjectTemplates2010TransformLayout);
+ "/>
</ItemGroup>
- <CopyWithTokenSubstitution SourceFiles="@(ExtensionVsixSources)"
- DestinationFiles="@(ExtensionVsixContents)" />
- <Purge Directories="$(ExtensionVsixLayoutPath)"
- IntendedFiles="
- @(ExtensionVsixContents);
- $(ExtensionVsix);
- " />
+ <Copy SourceFiles="@(ExtensionVsixSources)" DestinationFiles="@(ExtensionVsixTargets)" SkipUnchangedFiles="true" />
+ <CopyWithTokenSubstitution SourceFiles="@(ProjectTemplates2010TransformSource)" DestinationFiles="@(ProjectTemplates2010TransformLayout)" />
</Target>
- <Target Name="vsix" DependsOnTargets="VsixLayout">
+ <Target Name="vsix" DependsOnTargets="VsixLayout;_SetDropProperties">
+ <PropertyGroup>
+ <ExtensionVsix>$(DropDirectoryNoSlash).vsix</ExtensionVsix>
+ </PropertyGroup>
<Zip
Files="@(ExtensionVsixContents)"
ZipFileName="$(ExtensionVsix)"
- WorkingDirectory="$(ExtensionVsixLayoutPath)"
+ WorkingDirectory="$(ExtensionVsixLayoutDirectory)"
+ ZipLevel="$(ZipLevel)"
/>
</Target>
@@ -489,7 +570,7 @@
<PropertyGroup>
<DropZip>$(DropDirectoryNoSlash).zip</DropZip>
</PropertyGroup>
- <Zip Files="@(AllDropTargets)" ZipFileName="$(DropZip)" WorkingDirectory="$(DropsRoot)" />
+ <Zip Files="@(AllDropTargets)" ZipFileName="$(DropZip)" WorkingDirectory="$(DropsRoot)" ZipLevel="$(ZipLevel)" />
</Target>
<!-- Although Nightly includes publishing samples and docs, those targets are conditioned for
diff --git a/lib/DotNetOpenAuth.BuildTasks.dll b/lib/DotNetOpenAuth.BuildTasks.dll
index 80a95bf..2897bea 100644
--- a/lib/DotNetOpenAuth.BuildTasks.dll
+++ b/lib/DotNetOpenAuth.BuildTasks.dll
Binary files differ
diff --git a/lib/DotNetOpenAuth.BuildTasks.pdb b/lib/DotNetOpenAuth.BuildTasks.pdb
index 9636457..8a7acea 100644
--- a/lib/DotNetOpenAuth.BuildTasks.pdb
+++ b/lib/DotNetOpenAuth.BuildTasks.pdb
Binary files differ
diff --git a/lib/DotNetOpenAuth.BuildTasks.targets b/lib/DotNetOpenAuth.BuildTasks.targets
index be91208..56cff0d 100644
--- a/lib/DotNetOpenAuth.BuildTasks.targets
+++ b/lib/DotNetOpenAuth.BuildTasks.targets
@@ -29,5 +29,6 @@
<UsingTask AssemblyFile="$(ProjectRoot)\lib\DotNetOpenAuth.BuildTasks.dll" TaskName="FixupShippingToolSamples" />
<UsingTask AssemblyFile="$(ProjectRoot)\lib\DotNetOpenAuth.BuildTasks.dll" TaskName="Publicize" />
<UsingTask AssemblyFile="$(ProjectRoot)\lib\DotNetOpenAuth.BuildTasks.dll" TaskName="DowngradeProjects" />
+ <UsingTask AssemblyFile="$(ProjectRoot)\lib\DotNetOpenAuth.BuildTasks.dll" TaskName="HardLinkCopy" />
</Project>
diff --git a/projecttemplates/MvcRelyingParty.vstemplate b/projecttemplates/MvcRelyingParty.vstemplate
index d554cae..c9ebd35 100644
--- a/projecttemplates/MvcRelyingParty.vstemplate
+++ b/projecttemplates/MvcRelyingParty.vstemplate
@@ -2,7 +2,7 @@
<TemplateData>
<Name>ASP.NET MVC OpenID-InfoCard RP</Name>
<RequiredFrameworkVersion>3.5</RequiredFrameworkVersion>
- <Description>An ASP.NET MVC web site that accepts OpenID and InfoCard logins</Description>
+ <Description>An ASP.NET MVC web site that accepts OpenID logins</Description>
<ProjectType>CSharp</ProjectType>
<ProjectSubType>Web</ProjectSubType>
<NumberOfParentCategoriesToRollUp>2</NumberOfParentCategoriesToRollUp>
diff --git a/src/DotNetOpenAuth.BuildTasks/DiscoverProjectTemplates.cs b/src/DotNetOpenAuth.BuildTasks/DiscoverProjectTemplates.cs
index 0162c16..f49c9b1 100644
--- a/src/DotNetOpenAuth.BuildTasks/DiscoverProjectTemplates.cs
+++ b/src/DotNetOpenAuth.BuildTasks/DiscoverProjectTemplates.cs
@@ -15,6 +15,7 @@ namespace DotNetOpenAuth.BuildTasks {
using Microsoft.Build.Utilities;
public class DiscoverProjectTemplates : Task {
+ [Required]
public ITaskItem[] TopLevelTemplates { get; set; }
[Output]
diff --git a/src/DotNetOpenAuth.BuildTasks/DotNetOpenAuth.BuildTasks.csproj b/src/DotNetOpenAuth.BuildTasks/DotNetOpenAuth.BuildTasks.csproj
index 7dcc5d0..daf6327 100644
--- a/src/DotNetOpenAuth.BuildTasks/DotNetOpenAuth.BuildTasks.csproj
+++ b/src/DotNetOpenAuth.BuildTasks/DotNetOpenAuth.BuildTasks.csproj
@@ -109,10 +109,12 @@
<Compile Include="FilterItems.cs" />
<Compile Include="FixupReferenceHintPaths.cs" />
<Compile Include="FixupShippingToolSamples.cs" />
+ <Compile Include="HardLinkCopy.cs" />
<Compile Include="MergeProjectWithVSTemplate.cs" />
<Compile Include="GetBuildVersion.cs" />
<Compile Include="CheckAdminRights.cs" />
<Compile Include="JsPack.cs" />
+ <Compile Include="NativeMethods.cs" />
<Compile Include="ParseMaster.cs" />
<Compile Include="Publicize.cs" />
<Compile Include="Purge.cs" />
diff --git a/src/DotNetOpenAuth.BuildTasks/HardLinkCopy.cs b/src/DotNetOpenAuth.BuildTasks/HardLinkCopy.cs
new file mode 100644
index 0000000..af2d1d0
--- /dev/null
+++ b/src/DotNetOpenAuth.BuildTasks/HardLinkCopy.cs
@@ -0,0 +1,61 @@
+//-----------------------------------------------------------------------
+// <copyright file="HardLinkCopy.cs" company="Andrew Arnott">
+// Copyright (c) Andrew Arnott. All rights reserved.
+// </copyright>
+//-----------------------------------------------------------------------
+
+namespace DotNetOpenAuth.BuildTasks {
+ using System;
+ using System.Collections.Generic;
+ using System.Linq;
+ using System.Text;
+ using Microsoft.Build.Framework;
+ using Microsoft.Build.Utilities;
+ using System.IO;
+
+ public class HardLinkCopy : Task {
+ [Required]
+ public ITaskItem[] SourceFiles { get; set; }
+
+ [Required]
+ public ITaskItem[] DestinationFiles { get; set; }
+
+ /// <summary>
+ /// Executes this instance.
+ /// </summary>
+ public override bool Execute() {
+ if (this.SourceFiles.Length != this.DestinationFiles.Length) {
+ this.Log.LogError("SourceFiles has {0} elements and DestinationFiles has {1} elements.", this.SourceFiles.Length, this.DestinationFiles.Length);
+ return false;
+ }
+
+ for (int i = 0; i < this.SourceFiles.Length; i++) {
+ bool hardLink;
+ bool.TryParse(this.DestinationFiles[i].GetMetadata("HardLink"), out hardLink);
+ string sourceFile = this.SourceFiles[i].ItemSpec;
+ string destinationFile = this.DestinationFiles[i].ItemSpec;
+ this.Log.LogMessage(
+ MessageImportance.Low,
+ "Copying {0} -> {1}{2}.",
+ sourceFile,
+ destinationFile,
+ hardLink ? " as hard link" : string.Empty);
+
+ if (!Directory.Exists(Path.GetDirectoryName(destinationFile))) {
+ Directory.CreateDirectory(Path.GetDirectoryName(destinationFile));
+ }
+
+ if (hardLink) {
+ if (File.Exists(destinationFile)) {
+ File.Delete(destinationFile);
+ }
+ NativeMethods.CreateHardLink(sourceFile, destinationFile);
+ } else {
+ File.Copy(sourceFile, destinationFile, true);
+ }
+ }
+
+ return !this.Log.HasLoggedErrors;
+ }
+ }
+}
diff --git a/src/DotNetOpenAuth.BuildTasks/NativeMethods.cs b/src/DotNetOpenAuth.BuildTasks/NativeMethods.cs
new file mode 100644
index 0000000..26de3a4
--- /dev/null
+++ b/src/DotNetOpenAuth.BuildTasks/NativeMethods.cs
@@ -0,0 +1,18 @@
+namespace DotNetOpenAuth.BuildTasks {
+ using System;
+ using System.Collections.Generic;
+ using System.Linq;
+ using System.Text;
+ using System.Runtime.InteropServices;
+
+ internal static class NativeMethods {
+ [DllImport("kernel32", SetLastError = true)]
+ private static extern bool CreateHardLink(string newFileName, string existingFileName, IntPtr securityAttributes);
+
+ internal static void CreateHardLink(string existingFileName, string newFileName) {
+ if (!CreateHardLink(newFileName, existingFileName, IntPtr.Zero)) {
+ Marshal.ThrowExceptionForHR(Marshal.GetHRForLastWin32Error());
+ }
+ }
+ }
+}
diff --git a/projecttemplates/DotNetOpenAuth Starter Kits.vscontent b/vsi/DotNetOpenAuth Starter Kits.vscontent
index d084bb1..320e491 100644
--- a/projecttemplates/DotNetOpenAuth Starter Kits.vscontent
+++ b/vsi/DotNetOpenAuth Starter Kits.vscontent
@@ -4,7 +4,7 @@
<DisplayName>ASP.NET OpenID-InfoCard RP</DisplayName>
<Description>An ASP.NET web forms web site that accepts OpenID and InfoCard logins</Description>
<FileContentType>VSTemplate</FileContentType>
- <ContentVersion>$version$</ContentVersion>
+ <ContentVersion>2.0</ContentVersion>
<Attributes>
<Attribute name="ProjectType" value="Visual C#"/>
<Attribute name="ProjectSubType" value="Web"/>
@@ -14,9 +14,9 @@
<Content>
<FileName>MvcRelyingParty.zip</FileName>
<DisplayName>ASP.NET MVC OpenID-InfoCard RP</DisplayName>
- <Description>An ASP.NET MVC web site that accepts OpenID and InfoCard logins</Description>
+ <Description>An ASP.NET MVC web site that accepts OpenID logins</Description>
<FileContentType>VSTemplate</FileContentType>
- <ContentVersion>$version$</ContentVersion>
+ <ContentVersion>2.0</ContentVersion>
<Attributes>
<Attribute name="ProjectType" value="Visual C#"/>
<Attribute name="ProjectSubType" value="Web"/>
diff --git a/vsix/VSIXProject_large.png b/vsix/VSIXProject_large.png
new file mode 100644
index 0000000..442b986
--- /dev/null
+++ b/vsix/VSIXProject_large.png
Binary files differ
diff --git a/vsix/VSIXProject_small.png b/vsix/VSIXProject_small.png
new file mode 100644
index 0000000..5789dfa
--- /dev/null
+++ b/vsix/VSIXProject_small.png
Binary files differ
diff --git a/vsix/extension.vsixmanifest b/vsix/extension.vsixmanifest
index 0fbd2aa..a19bd8a 100644
--- a/vsix/extension.vsixmanifest
+++ b/vsix/extension.vsixmanifest
@@ -1,10 +1,10 @@
<?xml version="1.0"?>
<Vsix xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" Version="1.0" xmlns="http://schemas.microsoft.com/developer/vsx-schema/2010">
<Identifier Id="DotNetOpenAuth.d2122791-8de4-4d3b-a414-7563c9a8cd6e">
- <Name>DotNetOpenAuth Project Templates</Name>
+ <Name>DotNetOpenAuth SDK</Name>
<Author>Andrew Arnott</Author>
<Version>$version$</Version>
- <Description>An ASP.NET web forms web site that accepts OpenID and InfoCard logins</Description>
+ <Description>Resources for developing applications that use OpenID, OAuth, and InfoCard.</Description>
<Locale>1033</Locale>
<License>LICENSE.txt</License>
<GettingStartedGuide>http://www.dotnetopenauth.net/ProjectTemplateGettingStarted</GettingStartedGuide>