-
Notifications
You must be signed in to change notification settings - Fork 5
/
Copy pathgenerateBootstrapGsFiles.solo
executable file
·122 lines (114 loc) · 5.03 KB
/
generateBootstrapGsFiles.solo
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
#!/usr/bin/env superdoit_solo
options
{
SuperDoitOptionalOptionWithNoArg long: 'generate'.
SuperDoitOptionalOptionWithNoArg long: 'versionMap'.
SuperDoitOptionalOptionWithRequiredArg long: 'superDoitRoot' default: '$GS_HOME/shared/repos/superDoit'
}
%
usage
-----
USAGE $basename [--help | -h] [--debug | -D] \
( --versionMap | --generate ) [--superDoitRoot=<superDoit-root>]
DESCRIPTION
Rowan-based script for generating .gs files for bootstrapping superDoit into a
GemStone image.
The GemStone version map .ston file maps the GemStone to the superdoit
bootstrap .gs file that should be installed for that version.
The version map is used to drive the generation of the bootstrap .gs files
(--generate). Each of the unize files in the map are generating using the
gemstone versions associated with the file as the platform conditions.
OPTIONS
--generate generate the superdoit bootstrap files. Default: $GS_HOME/shared/repos/superDoit.
--versionMap generate the GemStone version map .ston file.
--superDoitRoot=<superDoit-root>
specify the root directory of the target superDoit repository
(default is $GS_HOME/shared/repos/superDoit).
-h, --help display usage message.
-D, --debug bring up topaz debugger in the event of a script error.
EXAMPLES
$basename --help
$basename -h
$basename --debug
$basename -D
$basename --versionMap
$basename --versionMap --superDoitRoot=$GS_HOME/shared/gemstone/repos/superDoit
$basename --generate
$basename --generate --superDoitRoot=$GS_HOME/shared/gemstone/repos/superDoit
-----
%
method
supportedGemStoneVersionMap
self supportedGemStoneVersionMapReference
readStreamDo: [:fileStream |
| readStream |
readStream := ZnBufferedReadStream on: fileStream. "wrap with buffered stream to bypass https://github.com/GemTalk/FileSystemGs/issues/9"
^ STON fromStream: readStream ].
%
method
supportedGemStoneVersionMapReference
^ self superDoitRoot asFileReference / 'gemstone/gemstoneVersionMap.ston'
%
method
generateVersionMap
| dict orderedDict |
dict := Dictionary new.
"this list should be updated whenever support for a new gemstone version is added"
#('3.4.0' '3.4.1' '3.4.2' '3.4.3' '3.4.4' '3.4.5')
do: [:gsVersion | dict at: gsVersion put: 'bootstrapSuperDoit_34x' ].
#('3.5.0' '3.5.1' '3.5.2' '3.5.3' '3.5.4' '3.5.5' '3.5.6' '3.5.7')
do: [:gsVersion | dict at: gsVersion put: 'bootstrapSuperDoit_35x' ].
#('3.6.0')
do: [:gsVersion | dict at: gsVersion put: 'bootstrapSuperDoit_360' ].
#('3.6.1' '3.6.2')
do: [:gsVersion | dict at: gsVersion put: 'bootstrapSuperDoit_361x' ].
#('3.7.0')
do: [:gsVersion | dict at: gsVersion put: 'bootstrapSuperDoit_37x' ].
orderedDict := GsTonelOrderedDictionary new.
dict keys sort do: [:key | orderedDict at: key put: (dict at: key) ].
self supportedGemStoneVersionMapReference
writeStreamDo: [:writeStream |
STON put: orderedDict onStreamPretty: writeStream ].
self stdout nextPutAll: 'version map generated (', self supportedGemStoneVersionMapReference pathString, ')'.
^ self noResult
%
method
generateBootstrapFiles: supportedGemStoneVersionMap
"took inspiration from superdoit_devkit/utils/createFileSystemGsTopaz.solo"
| fileToVersionsMap gsDir rootDir |
fileToVersionsMap := Dictionary new.
supportedGemStoneVersionMap keysAndValuesDo: [ :version :filename |
(fileToVersionsMap at: filename ifAbsentPut: [ Array new ])
add: version ].
rootDir := self superDoitRoot asFileReference.
gsDir := rootDir / 'gemstone/bootstrap'.
gsDir asFileReference ensureCreateDirectory.
fileToVersionsMap keysAndValuesDo: [:filename :versions |
| attributes projectSetDefinition projectSetModification visitor headerStream importSpec importProject specUrl |
attributes := { 'stone' . 'common' . Rowan platform basePlatformConditionalAttribute }, (versions collect: [:version | version asRwGemStoneVersionNumber]).
projectSetDefinition := RwProjectSetDefinition new.
headerStream := WriteStream on: String new.
headerStream nextPutAll: '! superDoit fileout'; lf; lf.
specUrl := 'file://', rootDir pathString, '/rowan/specs/SuperDoit_stone.ston'.
importSpec := RwSpecification fromUrl: specUrl.
importSpec
projectsHome: rootDir parent;
gemstoneSetDefaultSymbolDictNameTo: SuperDoitCommandParser transientSymbolDictionaryName;
yourself.
importProject := importSpec resolve read: attributes.
projectSetDefinition addProject: importProject.
projectSetModification := projectSetDefinition
compareAgainstBase: RwProjectSetDefinition new.
visitor := GsModificationTopazWriterVisitor new
repositoryRootPath: gsDir;
topazFileHeader: headerStream contents;
topazFilename: filename;
yourself.
visitor visit: projectSetModification ].
^ self noResult
%
doit
self versionMap ifTrue: [ ^ self generateVersionMap ].
self generate ifFalse: [ self error: 'one of the options --versionMap or --generate must be specified' ].
^ self generateBootstrapFiles: self supportedGemStoneVersionMap
%