-
Notifications
You must be signed in to change notification settings - Fork 0
/
build.cake
85 lines (68 loc) · 2.66 KB
/
build.cake
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
// ---------------- Usings ----------------
using System.Xml.Linq;
// ---------------- Addins ----------------
#addin nuget:?package=Cake.ArgumentBinder&version=0.6.0
// ---------------- Constants -----------------
const string splitTarget = "split";
string target = Argument( "target", splitTarget );
// ---------------- Classes -----------------
public class SplitConfig
{
[FilePathArgument(
"voice_macro_config",
Description = "Path to the Voice Macro config path.",
HasSecretValue = false,
Required = true,
MustExist = true,
ArgumentSource = ArgumentSource.CommandLineThenEnvironmentVariable
)]
public FilePath ConfigPath { get; set; }
[DirectoryPathArgument(
"voice_macro_profile_backup_dir",
Description = "Where to output the split-out Voice Macro configs.",
HasSecretValue = false,
Required = true,
MustExist = false,
ArgumentSource = ArgumentSource.CommandLineThenEnvironmentVariable
)]
public DirectoryPath OutputDir { get; set; }
}
// ---------------- Tasks -----------------
Task( splitTarget )
.Does(
() =>
{
SplitConfig config = CreateFromArguments<SplitConfig>();
EnsureDirectoryExists( config.OutputDir );
XDocument doc = XDocument.Load( config.ConfigPath.ToString() );
const string expectedRootName = "ArrayOfVoiceMacroProfile";
if( expectedRootName.Equals( doc.Root.Name.LocalName ) == false )
{
throw new InvalidOperationException(
$"Root XML node should be named '{expectedRootName}'. Got: '{doc.Root.Name.LocalName}'"
);
}
foreach( XElement profileNode in doc.Root.Elements() )
{
if( "VoiceMacroProfile".Equals( profileNode.Name.LocalName ) )
{
string name = "Untitled";
foreach( XElement profileSetting in profileNode.Elements() )
{
if( "ProfileName".Equals( profileSetting.Name.LocalName ) )
{
name = profileSetting.Value;
}
}
FilePath outputFile = config.OutputDir.CombineWithFilePath( File( name + ".xml" ) );
XDocument outputDoc = new XDocument(
new XDeclaration( "1.0", "utf-8", "yes" ),
profileNode
);
outputDoc.Save( outputFile.ToString() );
}
}
}
).DescriptionFromArguments<SplitConfig>( "Splits up the given VoiceMacro config into separate profiles that can be imported." );
// ---------------- Run -----------------
RunTarget( target );