Skip to content

Commit 3b155a5

Browse files
Fix update functionality
1 parent 4ece6dc commit 3b155a5

File tree

3 files changed

+74
-5
lines changed

3 files changed

+74
-5
lines changed

src/LibYear.Core/FileTypes/XmlProjectFile.cs

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,18 @@ namespace LibYear.Core.FileTypes;
44

55
public abstract class XmlProjectFile : IProjectFile
66
{
7+
private enum Whitespace
8+
{
9+
Tabs,
10+
FourSpaces,
11+
TwoSpaces
12+
}
13+
714
public string FileName { get; }
815
public IDictionary<string, PackageVersion?> Packages { get; }
916

1017
private readonly XDocument _xmlContents;
18+
private readonly Whitespace _whitespace;
1119
private readonly string _elementName;
1220
private readonly string[] _packageAttributeNames;
1321
private readonly string _versionAttributeName;
@@ -21,13 +29,20 @@ protected XmlProjectFile(string filename, string contents, string elementName, s
2129
_versionAttributeName = versionAttributeName;
2230

2331
_xmlContents = XDocument.Parse(contents);
32+
_whitespace = DetermineWhitespace(contents);
33+
2434
Packages = _xmlContents.Descendants(elementName)
2535
.ToDictionary(
2636
d => packageAttributeNames.Select(p => d.Attribute(p)?.Value ?? d.Element(p)?.Value).FirstOrDefault(v => v != null)!,
2737
d => ParseCurrentVersion(d, versionAttributeName)
2838
);
2939
}
3040

41+
private static Whitespace DetermineWhitespace(string contents)
42+
=> contents.Contains("\n\t") ? Whitespace.Tabs
43+
: contents.Contains("\n <") ? Whitespace.TwoSpaces
44+
: Whitespace.FourSpaces;
45+
3146
public string Update(IReadOnlyCollection<Result> results)
3247
{
3348
foreach (var result in results.Where(r => r.Latest != null))
@@ -36,7 +51,13 @@ public string Update(IReadOnlyCollection<Result> results)
3651
UpdateElement(element, result.Latest!.Version.ToString());
3752
}
3853

39-
return _xmlContents.ToString();
54+
var xml = _xmlContents.ToString();
55+
return _whitespace switch
56+
{
57+
Whitespace.Tabs => xml.Replace(" ", "\t"),
58+
Whitespace.FourSpaces => xml.Replace(" ", " "),
59+
_ => xml
60+
};
4061
}
4162

4263
private PackageVersion? ParseCurrentVersion(XElement element, string versionAttributeName)
@@ -71,7 +92,7 @@ private void UpdateElement(XElement element, string latestVersion)
7192
private XElement[] GetMatchingElements(Result result)
7293
=> _xmlContents.Descendants(_elementName)
7394
.Where(d => _packageAttributeNames.Any(attributeName => (d.Attribute(attributeName)?.Value ?? d.Element(attributeName)?.Value) == result.Name
74-
&& (d.Attribute(_versionAttributeName)?.Value ?? d.Element(_versionAttributeName)?.Value) == result.Installed?.Version.ToString()
95+
&& (d.Attribute(_versionAttributeName)?.Value ?? d.Element(_versionAttributeName)?.Value) == result.Installed?.Version.ToString()
7596
)
7697
)
7798
.ToArray();

src/LibYear.Core/ProjectFileManager.cs

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -81,9 +81,7 @@ public async Task<IReadOnlyCollection<string>> Update(SolutionResult result)
8181
{
8282
var update = project.ProjectFile.Update(project.Details);
8383

84-
var stream = _fileSystem.FileStream.New(project.ProjectFile.FileName, FileMode.OpenOrCreate, FileAccess.Write, FileShare.None);
85-
await new StreamWriter(stream).WriteAsync(update);
86-
stream.Close();
84+
await _fileSystem.File.WriteAllTextAsync(project.ProjectFile.FileName, update);
8785
updated.Add(project.ProjectFile.FileName);
8886
}
8987

test/LibYear.Core.Tests/FileTypes/CsProjFileTests.cs

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,56 @@ public async Task CanUpdateCsProjFile()
5656
Assert.Equal(WildcardType.Major, newFile.Packages["test7"]!.WildcardType);
5757
}
5858

59+
[Fact]
60+
public async Task UpdateMaintainsIndent()
61+
{
62+
//arrange
63+
var filename = Path.Combine("FileTypes", "project.csproj");
64+
var original = await File.ReadAllTextAsync(filename);
65+
var file = new CsProjFile(filename, original);
66+
var results = Array.Empty<Result>();
67+
68+
//act
69+
var updated = file.Update(results);
70+
71+
//assert
72+
Assert.Equal(updated, original);
73+
}
74+
75+
[Fact]
76+
public async Task UpdateMaintainsFourSpaces()
77+
{
78+
//arrange
79+
var filename = Path.Combine("FileTypes", "project.csproj");
80+
var original = await File.ReadAllTextAsync(filename);
81+
original = original.Replace(" ", " ");
82+
var file = new CsProjFile(filename, original);
83+
var results = Array.Empty<Result>();
84+
85+
//act
86+
var updated = file.Update(results);
87+
88+
//assert
89+
Assert.Equal(updated, original);
90+
}
91+
92+
[Fact]
93+
public async Task UpdateMaintainsTabs()
94+
{
95+
//arrange
96+
var filename = Path.Combine("FileTypes", "project.csproj");
97+
var original = await File.ReadAllTextAsync(filename);
98+
original = original.Replace(" ", "\t");
99+
var file = new CsProjFile(filename, original);
100+
var results = Array.Empty<Result>();
101+
102+
//act
103+
var updated = file.Update(results);
104+
105+
//assert
106+
Assert.Equal(updated, original);
107+
}
108+
59109
[Fact]
60110
public async Task InvalidVersionShowsExceptionDetails()
61111
{

0 commit comments

Comments
 (0)