Skip to content

Commit 91c6660

Browse files
Merge pull request #759 from jimmylewis/defaultDestTemplate
Add variable expansion in defaultDestination
2 parents 7aa92b4 + d252a09 commit 91c6660

File tree

2 files changed

+141
-3
lines changed

2 files changed

+141
-3
lines changed

src/LibraryManager/Json/LibraryStateToFileConverter.cs

Lines changed: 32 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
// Licensed to the .NET Foundation under one or more agreements.
22
// The .NET Foundation licenses this file to you under the MIT license.
33

4+
using System.Diagnostics.CodeAnalysis;
5+
using System.Text;
46
using Microsoft.Web.LibraryManager.Contracts;
57
using Microsoft.Web.LibraryManager.LibraryNaming;
68

@@ -25,22 +27,49 @@ public ILibraryInstallationState ConvertToLibraryInstallationState(LibraryInstal
2527
}
2628

2729
string provider = string.IsNullOrEmpty(stateOnDisk.ProviderId) ? _defaultProvider : stateOnDisk.ProviderId;
28-
string destination = string.IsNullOrEmpty(stateOnDisk.DestinationPath) ? _defaultDestination : stateOnDisk.DestinationPath;
30+
31+
(string name, string version) = LibraryIdToNameAndVersionConverter.Instance.GetLibraryNameAndVersion(stateOnDisk.LibraryId, provider);
32+
string destination = string.IsNullOrEmpty(stateOnDisk.DestinationPath) ? ExpandDestination(_defaultDestination, name, version) : stateOnDisk.DestinationPath;
2933

3034
var state = new LibraryInstallationState()
3135
{
36+
Name = name,
37+
Version = version,
3238
IsUsingDefaultDestination = string.IsNullOrEmpty(stateOnDisk.DestinationPath),
3339
IsUsingDefaultProvider = string.IsNullOrEmpty(stateOnDisk.ProviderId),
3440
ProviderId = provider,
3541
DestinationPath = destination,
3642
Files = stateOnDisk.Files
3743
};
3844

39-
(state.Name, state.Version) = LibraryIdToNameAndVersionConverter.Instance.GetLibraryNameAndVersion(stateOnDisk.LibraryId, provider);
40-
4145
return state;
4246
}
4347

48+
/// <summary>
49+
/// Expands [Name] and [Version] tokens in the DefaultDestination
50+
/// </summary>
51+
/// <param name="destination">The default destination string</param>
52+
/// <param name="name">Package name</param>
53+
/// <param name="version">Package version</param>
54+
/// <returns></returns>
55+
[SuppressMessage("Globalization", "CA1307:Specify StringComparison for clarity", Justification = "Not available on net481, not needed here (caseless)")]
56+
private string ExpandDestination(string destination, string name, string version)
57+
{
58+
if (!destination.Contains("["))
59+
{
60+
return destination;
61+
}
62+
63+
// if the name contains a slash (either filesystem or scoped packages),
64+
// trim that and only take the last segment.
65+
int cutIndex = name.LastIndexOfAny(['/', '\\']);
66+
67+
StringBuilder stringBuilder = new StringBuilder(destination);
68+
stringBuilder.Replace("[Name]", cutIndex == -1 ? name : name.Substring(cutIndex + 1));
69+
stringBuilder.Replace("[Version]", version);
70+
return stringBuilder.ToString();
71+
}
72+
4473
public LibraryInstallationStateOnDisk ConvertToLibraryInstallationStateOnDisk(ILibraryInstallationState state)
4574
{
4675
if (state == null)
Lines changed: 109 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,109 @@
1+
// Copyright (c) .NET Foundation. All rights reserved.
2+
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
3+
4+
using System;
5+
using System.IO;
6+
using Microsoft.VisualStudio.TestTools.UnitTesting;
7+
using Microsoft.Web.LibraryManager.Contracts;
8+
using Microsoft.Web.LibraryManager.Json;
9+
using Microsoft.Web.LibraryManager.LibraryNaming;
10+
using Microsoft.Web.LibraryManager.Mocks;
11+
using Microsoft.Web.LibraryManager.Providers.Cdnjs;
12+
13+
namespace Microsoft.Web.LibraryManager.Test.Json
14+
{
15+
[TestClass]
16+
public class LibraryStateToFileConverterTests
17+
{
18+
[TestInitialize]
19+
public void Setup()
20+
{
21+
string cacheFolder = Environment.ExpandEnvironmentVariables(@"%localappdata%\Microsoft\Library\");
22+
string projectFolder = Path.Combine(Path.GetTempPath(), "LibraryManager");
23+
var hostInteraction = new HostInteraction(projectFolder, cacheFolder);
24+
var dependencies = new Dependencies(hostInteraction, new CdnjsProviderFactory());
25+
IProvider provider = dependencies.GetProvider("cdnjs");
26+
LibraryIdToNameAndVersionConverter.Instance.Reinitialize(dependencies);
27+
}
28+
29+
[TestMethod]
30+
public void ConvertToLibraryInstallationState_NullStateOnDisk()
31+
{
32+
LibraryStateToFileConverter converter = new LibraryStateToFileConverter("provider", "destination");
33+
34+
ILibraryInstallationState result = converter.ConvertToLibraryInstallationState(null);
35+
36+
Assert.IsNull(result);
37+
}
38+
39+
[TestMethod]
40+
public void ConvertToLibraryInstallationState_UseDefaultProviderAndDestination()
41+
{
42+
LibraryStateToFileConverter converter = new LibraryStateToFileConverter("defaultProvider", "defaultDestination");
43+
44+
var stateOnDisk = new LibraryInstallationStateOnDisk
45+
{
46+
LibraryId = "libraryId",
47+
};
48+
49+
ILibraryInstallationState result = converter.ConvertToLibraryInstallationState(stateOnDisk);
50+
51+
Assert.AreEqual("defaultProvider", result.ProviderId);
52+
Assert.AreEqual("defaultDestination", result.DestinationPath);
53+
}
54+
55+
[TestMethod]
56+
public void ConvertToLibraryInstallationState_OverrideProviderAndDestination()
57+
{
58+
LibraryStateToFileConverter converter = new LibraryStateToFileConverter("defaultProvider", "defaultDestination");
59+
60+
var stateOnDisk = new LibraryInstallationStateOnDisk
61+
{
62+
LibraryId = "libraryId",
63+
ProviderId = "provider",
64+
DestinationPath = "destination",
65+
};
66+
67+
ILibraryInstallationState result = converter.ConvertToLibraryInstallationState(stateOnDisk);
68+
69+
Assert.AreEqual("provider", result.ProviderId);
70+
Assert.AreEqual("destination", result.DestinationPath);
71+
}
72+
73+
[TestMethod]
74+
public void ConvertToLibraryInstallationState_ExpandTokensInDefaultDestination()
75+
{
76+
LibraryStateToFileConverter converter = new LibraryStateToFileConverter("defaultProvider", "lib/[Name]/[Version]");
77+
78+
var stateOnDisk = new LibraryInstallationStateOnDisk
79+
{
80+
LibraryId = "testLibraryId@1.0",
81+
// it needs to be a provider that uses the versioned naming scheme
82+
ProviderId = "cdnjs",
83+
};
84+
85+
ILibraryInstallationState result = converter.ConvertToLibraryInstallationState(stateOnDisk);
86+
87+
Assert.AreEqual("lib/testLibraryId/1.0", result.DestinationPath);
88+
}
89+
90+
[TestMethod]
91+
[DataRow("filesystem", "c:\\path\\to\\library")]
92+
[DataRow("filesystem", "/path/to/library")]
93+
[DataRow("cdnjs", "@scope/library@1.0.0")]
94+
public void ConvertToLibraryInstallationState_ExpandTokensInDefaultDestination_NamesWithSlashes(string provider, string libraryId)
95+
{
96+
LibraryStateToFileConverter converter = new LibraryStateToFileConverter("defaultProvider", "lib/[Name]");
97+
98+
var stateOnDisk = new LibraryInstallationStateOnDisk
99+
{
100+
LibraryId = libraryId,
101+
ProviderId = provider,
102+
};
103+
104+
ILibraryInstallationState result = converter.ConvertToLibraryInstallationState(stateOnDisk);
105+
106+
Assert.AreEqual("lib/library", result.DestinationPath);
107+
}
108+
}
109+
}

0 commit comments

Comments
 (0)