-
Notifications
You must be signed in to change notification settings - Fork 1
/
releaseQLabs.m
140 lines (116 loc) · 4.73 KB
/
releaseQLabs.m
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
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
function newVersion = releaseQLabs(releaseType, matlabReleaseEnd)
% Release a new version of the toolbox. Version is automatically
% incremented. OPTION can be "major", "minor", or "patch" to update
% version number appropriately.
arguments
releaseType (1,1) string = "build"
matlabReleaseEnd (1,1) string = ""
end
packagingProjectFile = fullfile("Quanser Interactive Labs for MATLAB.prj");
newVersion = incrementMLTBXVersion(packagingProjectFile,releaseType);
matlab.addons.toolbox.packageToolbox(packagingProjectFile,'release/Quanser_Interactive_Labs_for_MATLAB')
function newVersion = incrementMLTBXVersion(packagingProjectFile, releaseType)
oldVersion = string(matlab.addons.toolbox.toolboxVersion(packagingProjectFile));
pat = digitsPattern;
versionParts = extract(oldVersion,pat);
if numel(versionParts) == 1
versionParts(2) = "0";
end
if numel(versionParts) == 2
versionParts(3) = "0";
end
if numel(versionParts) == 3
versionParts(4) = "0";
end
switch lower(releaseType)
case "major"
versionParts(1) = string(str2double(versionParts(1)) + 1);
versionParts(2) = "0";
versionParts(3) = "0";
case "minor"
versionParts(2) = string(str2double(versionParts(2)) + 1);
versionParts(3) = "0";
case "patch"
versionParts(3) = string(str2double(versionParts(3)) + 1);
end
versionParts(4) = string(str2double(versionParts(4)) + 1);
newVersion = join(versionParts,".");
doc = xmlread(packagingProjectFile);
if (updateMLTBXAdditionalSoftwareSource(doc, newVersion))
if (strlength(matlabReleaseEnd) > 0)
if ~updateMLTBXMATLABReleaseEnd(doc, matlabReleaseEnd);
disp('Cannot update last supported MATLAB release.')
ret = false;
end
end
% Write to the project file
raw_xml = xmlwrite(doc);
start_pos = strfind(raw_xml, '<deployment');
if isempty(start_pos)
disp('Cannot export to xml.')
ret = false;
return
end
prj_content = raw_xml(start_pos:end);
[fid, message] = fopen(packagingProjectFile, 'wt');
if fid ~= -1
fprintf(fid, '%s\n', prj_content);
fclose(fid);
else
error(message);
end
% Use the MATLAB built-in function to update the version number
matlab.addons.toolbox.toolboxVersion(packagingProjectFile, newVersion);
else
error('Cannot update Additional Software source.');
end
end
function ret = updateMLTBXAdditionalSoftwareSource(doc, version)
pat = digitsPattern;
versionParts = extract(version, pat);
version_path = versionParts(1) + '.' + versionParts(2);
% Set the Windows zip file
ret = setDownloadPath(doc, version_path, "win64");
if ~ret
return
end
% Set the Mac zip file
ret = setDownloadPath(doc, version_path, "mac64");
if ~ret
return
end
end
function ret = setDownloadPath(doc, version_path, target)
ret = true;
% target can come in as "win64" or "mac64", etc.
% However the MATLAB project file only use "win" or "mac"
target_char = char(target);
target_short = string(target_char(1:3));
url_tag_name = "param.additional.sw." + target_short + ".url";
url = doc.getElementsByTagName(url_tag_name);
if (url.getLength ~= 1)
disp('Cannot find URL element for target: ' + target);
ret = false;
return;
end
url_item = url.item(0).getElementsByTagName('item');
if (url_item.getLength ~= 1)
disp('Cannot find URL/item element for target: ' + target);
ret = false;
return;
end
content = "https://download.quanser.com/qlabs/" + version_path + "/QLabs_Installer_" + target + ".zip";
url_item.item(0).setTextContent(content);
end
function ret = updateMLTBXMATLABReleaseEnd(doc, matlab_release)
ret = true;
tag_name = "param.release.end";
release_end = doc.getElementsByTagName(tag_name);
if (release_end.getLength ~= 1)
disp('Cannot find release_end element.');
ret = false;
return;
end
release_end.item(0).setTextContent(matlab_release);
end
end