Skip to content

Commit 85dae3d

Browse files
committed
(chocolatey#2503) Export via serialization of class
Instead of exporting via building an xml document manually, this creates a PackagesConfigFilePackageSetting and serializes that to create the xml document that is saved. This allows for usage of the same class as is used to read in packages.config files to export those files. The reason the "bool *Specified" members are added to the PackagesConfigFilePackageSetting class is so if an element is not set during export, it will not show up at all in the resulting serialized packages.config file.
1 parent 0e6bca6 commit 85dae3d

File tree

2 files changed

+207
-14
lines changed

2 files changed

+207
-14
lines changed

src/chocolatey/infrastructure.app/commands/ChocolateyExportCommand.cs

Lines changed: 19 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ namespace chocolatey.infrastructure.app.commands
2222
using System.IO;
2323
using System.Text;
2424
using System.Xml;
25+
using System.Xml.Serialization;
2526
using attributes;
2627
using commandline;
2728
using configuration;
@@ -138,34 +139,39 @@ public void noop(ChocolateyConfiguration configuration)
138139

139140
public void run(ChocolateyConfiguration configuration)
140141
{
141-
var packageResults = _nugetService.get_all_installed_packages(configuration);
142-
var settings = new XmlWriterSettings { Indent = true, Encoding = new UTF8Encoding(false) };
142+
var installedPackages = _nugetService.get_all_installed_packages(configuration);
143+
var xmlWriterSettings = new XmlWriterSettings { Indent = true, Encoding = new UTF8Encoding(false) };
143144

144145
FaultTolerance.try_catch_with_logging_exception(
145146
() =>
146147
{
148+
var packagesConfig = new PackagesConfigFileSettings();
149+
packagesConfig.Packages = new HashSet<PackagesConfigFilePackageSetting>();
150+
147151
using (var stringWriter = new StringWriter())
148152
{
149-
using (var xw = XmlWriter.Create(stringWriter, settings))
153+
using (var xw = XmlWriter.Create(stringWriter, xmlWriterSettings))
150154
{
151-
xw.WriteProcessingInstruction("xml", "version=\"1.0\" encoding=\"utf-8\"");
152-
xw.WriteStartElement("packages");
153-
154-
foreach (var packageResult in packageResults)
155+
foreach (var packageResult in installedPackages)
155156
{
156-
xw.WriteStartElement("package");
157-
xw.WriteAttributeString("id", packageResult.PackageMetadata.Id);
157+
var packageElement = new PackagesConfigFilePackageSetting
158+
{
159+
Id = packageResult.PackageMetadata.Id
160+
};
158161

159162
if (configuration.ExportCommand.IncludeVersionNumbers)
160163
{
161-
xw.WriteAttributeString("version", packageResult.PackageMetadata.Version.ToString());
164+
packageElement.Version = packageResult.PackageMetadata.Version.ToString();
162165
}
163166

164-
xw.WriteEndElement();
167+
packagesConfig.Packages.Add(packageElement);
165168
}
166169

167-
xw.WriteEndElement();
168-
xw.Flush();
170+
XmlSerializerNamespaces ns = new XmlSerializerNamespaces();
171+
ns.Add("", "");
172+
173+
var packagesConfigSerializer = new XmlSerializer(typeof(PackagesConfigFileSettings));
174+
packagesConfigSerializer.Serialize(xw, packagesConfig, ns);
169175
}
170176

171177
var fullOutputFilePath = _fileSystem.get_full_path(configuration.ExportCommand.OutputFilePath);

src/chocolatey/infrastructure.app/configuration/PackagesConfigFilePackageSetting.cs

Lines changed: 188 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
namespace chocolatey.infrastructure.app.configuration
1818
{
1919
using System;
20+
using System.ComponentModel;
2021
using System.Xml.Serialization;
2122

2223
/// <summary>
@@ -44,49 +45,139 @@ public sealed class PackagesConfigFilePackageSetting
4445
[XmlAttribute(AttributeName = "applyPackageParametersToDependencies")]
4546
public bool ApplyPackageParametersToDependencies { get; set; }
4647

48+
[XmlIgnore, EditorBrowsable(EditorBrowsableState.Never)]
49+
public bool ApplyPackageParametersToDependenciesSpecified
50+
{
51+
get { return ApplyPackageParametersToDependencies; }
52+
}
53+
4754
[XmlAttribute(AttributeName = "applyInstallArgumentsToDependencies")]
4855
public bool ApplyInstallArgumentsToDependencies { get; set; }
4956

57+
[XmlIgnore, EditorBrowsable(EditorBrowsableState.Never)]
58+
public bool ApplyInstallArgumentsToDependenciesSpecified
59+
{
60+
get { return ApplyInstallArgumentsToDependencies; }
61+
}
62+
5063
[XmlAttribute(AttributeName = "forceX86")]
5164
public bool ForceX86 { get; set; }
5265

66+
[XmlIgnore, EditorBrowsable(EditorBrowsableState.Never)]
67+
public bool ForceX86Specified
68+
{
69+
get { return ForceX86; }
70+
}
71+
5372
[XmlAttribute(AttributeName = "allowMultipleVersions")]
5473
public bool AllowMultipleVersions { get; set; }
5574

75+
[XmlIgnore, EditorBrowsable(EditorBrowsableState.Never)]
76+
public bool AllowMultipleVersionsSpecified
77+
{
78+
get { return AllowMultipleVersions; }
79+
}
80+
5681
[XmlAttribute(AttributeName = "ignoreDependencies")]
5782
public bool IgnoreDependencies { get; set; }
5883

84+
[XmlIgnore, EditorBrowsable(EditorBrowsableState.Never)]
85+
public bool IgnoreDependenciesSpecified
86+
{
87+
get { return IgnoreDependencies; }
88+
}
89+
5990
[XmlAttribute(AttributeName = "disabled")]
6091
public bool Disabled { get; set; }
6192

93+
[XmlIgnore, EditorBrowsable(EditorBrowsableState.Never)]
94+
public bool DisabledSpecified
95+
{
96+
get { return Disabled; }
97+
}
98+
6299
[XmlAttribute(AttributeName = "pinPackage")]
63100
public bool PinPackage { get; set; }
64-
101+
102+
[XmlIgnore, EditorBrowsable(EditorBrowsableState.Never)]
103+
public bool PinPackageSpecified
104+
{
105+
get { return PinPackage; }
106+
}
107+
65108
[System.ComponentModel.DefaultValue(-1)]
66109
[XmlAttribute(AttributeName = "executionTimeout")]
67110
public int ExecutionTimeout { get; set; }
68111

112+
[XmlIgnore, EditorBrowsable(EditorBrowsableState.Never)]
113+
public bool ExecutionTimeoutSpecified
114+
{
115+
get { return ExecutionTimeout != 0; }
116+
}
117+
69118
[XmlAttribute(AttributeName = "force")]
70119
public bool Force { get; set; }
71120

121+
[XmlIgnore, EditorBrowsable(EditorBrowsableState.Never)]
122+
public bool ForceSpecified
123+
{
124+
get { return Force; }
125+
}
126+
72127
[XmlAttribute(AttributeName = "prerelease")]
73128
public bool Prerelease { get; set; }
74129

130+
[XmlIgnore, EditorBrowsable(EditorBrowsableState.Never)]
131+
public bool PrereleaseSpecified
132+
{
133+
get { return Prerelease; }
134+
}
135+
75136
[XmlAttribute(AttributeName = "overrideArguments")]
76137
public bool OverrideArguments { get; set; }
77138

139+
[XmlIgnore, EditorBrowsable(EditorBrowsableState.Never)]
140+
public bool OverrideArgumentsSpecified
141+
{
142+
get { return OverrideArguments; }
143+
}
144+
78145
[XmlAttribute(AttributeName = "notSilent")]
79146
public bool NotSilent { get; set; }
80147

148+
[XmlIgnore, EditorBrowsable(EditorBrowsableState.Never)]
149+
public bool NotSilentSpecified
150+
{
151+
get { return NotSilent; }
152+
}
153+
81154
[XmlAttribute(AttributeName = "allowDowngrade")]
82155
public bool AllowDowngrade { get; set; }
83156

157+
[XmlIgnore, EditorBrowsable(EditorBrowsableState.Never)]
158+
public bool AllowDowngradeSpecified
159+
{
160+
get { return AllowDowngrade; }
161+
}
162+
84163
[XmlAttribute(AttributeName = "forceDependencies")]
85164
public bool ForceDependencies { get; set; }
86165

166+
[XmlIgnore, EditorBrowsable(EditorBrowsableState.Never)]
167+
public bool ForceDependenciesSpecified
168+
{
169+
get { return ForceDependencies; }
170+
}
171+
87172
[XmlAttribute(AttributeName = "skipAutomationScripts")]
88173
public bool SkipAutomationScripts { get; set; }
89174

175+
[XmlIgnore, EditorBrowsable(EditorBrowsableState.Never)]
176+
public bool SkipAutomationScriptsSpecified
177+
{
178+
get { return SkipAutomationScripts; }
179+
}
180+
90181
[XmlAttribute(AttributeName = "user")]
91182
public string User { get; set; }
92183

@@ -102,15 +193,39 @@ public sealed class PackagesConfigFilePackageSetting
102193
[XmlAttribute(AttributeName = "ignoreChecksums")]
103194
public bool IgnoreChecksums { get; set; }
104195

196+
[XmlIgnore, EditorBrowsable(EditorBrowsableState.Never)]
197+
public bool IgnoreChecksumsSpecified
198+
{
199+
get { return IgnoreChecksums; }
200+
}
201+
105202
[XmlAttribute(AttributeName = "allowEmptyChecksums")]
106203
public bool AllowEmptyChecksums { get; set; }
107204

205+
[XmlIgnore, EditorBrowsable(EditorBrowsableState.Never)]
206+
public bool AllowEmptyChecksumsSpecified
207+
{
208+
get { return AllowEmptyChecksums; }
209+
}
210+
108211
[XmlAttribute(AttributeName = "allowEmptyChecksumsSecure")]
109212
public bool AllowEmptyChecksumsSecure { get; set; }
110213

214+
[XmlIgnore, EditorBrowsable(EditorBrowsableState.Never)]
215+
public bool AllowEmptyChecksumsSecureSpecified
216+
{
217+
get { return AllowEmptyChecksumsSecure; }
218+
}
219+
111220
[XmlAttribute(AttributeName = "requireChecksums")]
112221
public bool RequireChecksums { get; set; }
113222

223+
[XmlIgnore, EditorBrowsable(EditorBrowsableState.Never)]
224+
public bool RequireChecksumsSpecified
225+
{
226+
get { return RequireChecksums; }
227+
}
228+
114229
[XmlAttribute(AttributeName = "downloadChecksum")]
115230
public string DownloadChecksum { get; set; }
116231

@@ -126,40 +241,112 @@ public sealed class PackagesConfigFilePackageSetting
126241
[XmlAttribute(AttributeName = "ignorePackageExitCodes")]
127242
public bool IgnorePackageExitCodes { get; set; }
128243

244+
[XmlIgnore, EditorBrowsable(EditorBrowsableState.Never)]
245+
public bool IgnorePackageExitCodesSpecified
246+
{
247+
get { return IgnorePackageExitCodes; }
248+
}
249+
129250
[XmlAttribute(AttributeName = "usePackageExitCodes")]
130251
public bool UsePackageExitCodes { get; set; }
131252

253+
[XmlIgnore, EditorBrowsable(EditorBrowsableState.Never)]
254+
public bool UsePackageExitCodesSpecified
255+
{
256+
get { return UsePackageExitCodes; }
257+
}
258+
132259
[XmlAttribute(AttributeName = "stopOnFirstFailure")]
133260
public bool StopOnFirstFailure { get; set; }
134261

262+
[XmlIgnore, EditorBrowsable(EditorBrowsableState.Never)]
263+
public bool StopOnFirstFailureSpecified
264+
{
265+
get { return StopOnFirstFailure; }
266+
}
267+
135268
[XmlAttribute(AttributeName = "exitWhenRebootDetected")]
136269
public bool ExitWhenRebootDetected { get; set; }
137270

271+
[XmlIgnore, EditorBrowsable(EditorBrowsableState.Never)]
272+
public bool ExitWhenRebootDetectedSpecified
273+
{
274+
get { return ExitWhenRebootDetected; }
275+
}
276+
138277
[XmlAttribute(AttributeName = "ignoreDetectedReboot")]
139278
public bool IgnoreDetectedReboot { get; set; }
140279

280+
[XmlIgnore, EditorBrowsable(EditorBrowsableState.Never)]
281+
public bool IgnoreDetectedRebootSpecified
282+
{
283+
get { return IgnoreDetectedReboot; }
284+
}
285+
141286
[XmlAttribute(AttributeName = "disableRepositoryOptimizations")]
142287
public bool DisableRepositoryOptimizations { get; set; }
143288

289+
[XmlIgnore, EditorBrowsable(EditorBrowsableState.Never)]
290+
public bool DisableRepositoryOptimizationsSpecified
291+
{
292+
get { return DisableRepositoryOptimizations; }
293+
}
294+
144295
[XmlAttribute(AttributeName = "acceptLicense")]
145296
public bool AcceptLicense { get; set; }
146297

298+
[XmlIgnore, EditorBrowsable(EditorBrowsableState.Never)]
299+
public bool AcceptLicenseSpecified
300+
{
301+
get { return AcceptLicense; }
302+
}
303+
147304
[XmlAttribute(AttributeName = "confirm")]
148305
public bool Confirm { get; set; }
149306

307+
[XmlIgnore, EditorBrowsable(EditorBrowsableState.Never)]
308+
public bool ConfirmSpecified
309+
{
310+
get { return Confirm; }
311+
}
312+
150313
[XmlAttribute(AttributeName = "limitOutput")]
151314
public bool LimitOutput { get; set; }
152315

316+
[XmlIgnore, EditorBrowsable(EditorBrowsableState.Never)]
317+
public bool LimitOutputSpecified
318+
{
319+
get { return LimitOutput; }
320+
}
321+
153322
[XmlAttribute(AttributeName = "cacheLocation")]
154323
public string CacheLocation { get; set; }
155324

156325
[XmlAttribute(AttributeName = "failOnStderr")]
157326
public bool FailOnStderr { get; set; }
158327

328+
[XmlIgnore, EditorBrowsable(EditorBrowsableState.Never)]
329+
public bool FailOnStderrSpecified
330+
{
331+
get { return FailOnStderr; }
332+
}
333+
159334
[XmlAttribute(AttributeName = "useSystemPowershell")]
160335
public bool UseSystemPowershell { get; set; }
161336

337+
[XmlIgnore, EditorBrowsable(EditorBrowsableState.Never)]
338+
public bool UseSystemPowershellSpecified
339+
{
340+
get { return UseSystemPowershell; }
341+
}
342+
162343
[XmlAttribute(AttributeName = "noProgress")]
163344
public bool NoProgress { get; set; }
345+
346+
[XmlIgnore, EditorBrowsable(EditorBrowsableState.Never)]
347+
public bool NoProgressSpecified
348+
{
349+
get { return NoProgress; }
350+
}
164351
}
165352
}

0 commit comments

Comments
 (0)