forked from pharo-project/pharo
-
Notifications
You must be signed in to change notification settings - Fork 0
/
MetacelloLoadingMCSpecLoader.class.st
243 lines (212 loc) · 8.22 KB
/
MetacelloLoadingMCSpecLoader.class.st
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
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
Class {
#name : #MetacelloLoadingMCSpecLoader,
#superclass : #MetacelloCommonMCSpecLoader,
#category : #'Metacello-MC-Loaders'
}
{ #category : #accessing }
MetacelloLoadingMCSpecLoader >> actionLabel [
^'Loading '
]
{ #category : #'development support' }
MetacelloLoadingMCSpecLoader >> copySpec: pkgSpec from: repositorySpecs to: repository [
| gofer |
gofer := MetacelloGofer new.
(self repositoriesFrom: repositorySpecs) do: [:repo | gofer repository: repo ].
^self copySpec: pkgSpec with: gofer to: repository
]
{ #category : #'development support' }
MetacelloLoadingMCSpecLoader >> copySpec: pkgSpec with: gofer to: aRepository [
| repository resolvedReference |
[resolvedReference := pkgSpec goferLoaderReference resolveWith: gofer]
on: Error
do: [:ignored | ^nil ].
repository := MCRepositoryGroup default repositories
detect: [ :each | each = aRepository ]
ifNone: [ aRepository ].
repository storeVersion: resolvedReference version.
^resolvedReference repository
]
{ #category : #actions }
MetacelloLoadingMCSpecLoader >> doLoad [
"NOOP"
]
{ #category : #accessing }
MetacelloLoadingMCSpecLoader >> fetchingSpecLoader [
^(MetacelloFetchingMCSpecLoader on: self spec)
shouldDisablePackageCache: self shouldDisablePackageCache;
loaderPolicy: self loaderPolicy copy;
yourself
]
{ #category : #'development support' }
MetacelloLoadingMCSpecLoader >> goferCommitBranchPackage: branchName using: repositorySpecs commitMessage: commitMessage [
| gofer repoSpecs wc |
repoSpecs := self spec repositorySpecs notEmpty
ifTrue: [ self spec repositorySpecs ]
ifFalse: [ repositorySpecs ].
gofer := MetacelloGofer new.
gofer disablePackageCache.
wc := self spec workingCopy.
repositorySpecs
do: [ :repoSpec |
| repo |
repo := repoSpec createRepository.
(wc possiblyNewerVersionsIn: repo) notEmpty
ifTrue: [
self
notify:
'There are possibly newer versions of the package ' , self spec name printString , ' in the repository '
, repo description printString
, '. Cancel and manually merge if you want to pick up the changes from the later version.' ].
gofer repository: repo ].
gofer package: self spec name.
[ gofer interactiveCommit ]
on: MCVersionNameAndMessageRequest
do: [ :ex |
| ref |
ref := GoferVersionReference name: ex suggestedName.
ex
resume:
{(ref packageName , '.' , branchName , '-' , ref author , '.' , ref versionNumber printString).
commitMessage} ].
^ true
]
{ #category : #'development support' }
MetacelloLoadingMCSpecLoader >> goferCommitPackageUsing: repositorySpecs commitMessage: commitMessage [
| gofer repoSpecs wc |
repoSpecs := self spec repositorySpecs notEmpty
ifTrue: [ self spec repositorySpecs ]
ifFalse: [ repositorySpecs ].
gofer := MetacelloGofer new.
gofer disablePackageCache.
wc := self spec workingCopy.
repositorySpecs do: [:repoSpec | | repo |
repo := repoSpec createRepository.
(wc possiblyNewerVersionsIn: repo) notEmpty
ifTrue: [ self notify: 'There are possibly newer versions of the package ', self spec name printString, ' in the repository ', repo description printString, '. Cancel and manually merge if you want to pick up the changes from the later version.' ].
gofer repository: repo ].
gofer package: self spec name.
gofer commit: commitMessage.
^true
]
{ #category : #packages }
MetacelloLoadingMCSpecLoader >> latestPackage: aString fromRepository: repositorySpecs [
| gofer |
gofer := MetacelloGofer new.
gofer disablePackageCache.
(self repositoriesFrom: repositorySpecs) do: [:repo | gofer repository: repo ].
^([(GoferPackageReference name: aString) resolveWith: gofer]
on: Error
do: [:ignored | ^ nil ]) name
]
{ #category : #private }
MetacelloLoadingMCSpecLoader >> linearLoadPackageSpec: packageSpec gofer: gofer [
MetacelloPlatform current
do: [ | loadBlock goferLoad answers resolvedReference repo |
resolvedReference := self
resolvePackageSpec: packageSpec
gofer: gofer.
resolvedReference
ifNil: [ "Package version already loaded into image" ^ self ].
loadBlock := [ self preLoad: packageSpec.
goferLoad := MetacelloGoferLoad on: MetacelloGofer new.
goferLoad addResolved: resolvedReference.
goferLoad execute.
MetacelloPlatform current clearCurrentVersionCache.
self postLoad: packageSpec ].
(answers := packageSpec answers) notEmpty
ifTrue: [ loadBlock valueSupplyingMetacelloAnswers: answers ]
ifFalse: [ loadBlock value ].
repo := resolvedReference repository.
self hasRepositoryOverrides
ifTrue: [ repo := self loaderPolicy repositoryMap
at: resolvedReference name
ifAbsent: [ resolvedReference repository ].
resolvedReference workingCopy repositoryGroup addRepository: repo ]
ifFalse: [ resolvedReference workingCopy repositoryGroup
addRepository: resolvedReference repository ].
MetacelloNotification signal:
'Loaded -> ' , resolvedReference name , ' --- '
, repo repositoryDescription , ' --- '
, resolvedReference repository description ]
displaying: 'Loading ' , packageSpec file
]
{ #category : #'development support' }
MetacelloLoadingMCSpecLoader >> packagesNeedSavingUsing: repositorySpecs into: aCollection [
| wc repoSpecs repo |
(wc := self spec workingCopy) == nil ifTrue: [ ^self ].
(wc ancestry ancestors notEmpty and: [ wc modified not])
ifTrue: [ ^self ].
repoSpecs := self spec repositorySpecs notEmpty
ifTrue: [ self spec repositorySpecs ]
ifFalse: [ repositorySpecs ].
repo := (self spec getFile == nil or: [ wc ancestry ancestors isEmpty ])
ifTrue: [ (self repositoriesFrom: repoSpecs ignoreOverrides: true) first ]
ifFalse: [
([ self resolveSpec: self spec from: repoSpecs ]
on: Error
do: [:ignored | ^self ]) repository ].
aCollection add: self spec -> repo
]
{ #category : #doits }
MetacelloLoadingMCSpecLoader >> postLoad: packageOrVersionSpec [
| block |
(block := packageOrVersionSpec postLoadDoItBlock) ~~ nil
ifTrue: [ block valueWithPossibleArgs: { self. packageOrVersionSpec. } ]
]
{ #category : #doits }
MetacelloLoadingMCSpecLoader >> preLoad: packageOrVersionSpec [
| block |
(block := packageOrVersionSpec preLoadDoItBlock) ~~ nil
ifTrue: [ block valueWithPossibleArgs: { self. packageOrVersionSpec. } ]
]
{ #category : #'development support' }
MetacelloLoadingMCSpecLoader >> repositoryFor: pkgSpec from: repositorySpecs [
^([self resolveSpec: pkgSpec from: repositorySpecs]
on: Error
do: [:ignored | ^nil ]) repository
]
{ #category : #'development support' }
MetacelloLoadingMCSpecLoader >> repositoryFor: pkgSpec with: gofer [
^([self resolveSpec: pkgSpec with: gofer]
on: Error
do: [:ignored | ^nil ]) repository
]
{ #category : #'development support' }
MetacelloLoadingMCSpecLoader >> resolveSpec: pkgSpec from: repositorySpecs [
| gofer |
gofer := MetacelloGofer new.
gofer disablePackageCache.
(self repositoriesFrom: repositorySpecs ignoreOverrides: true)
do: [:repo | gofer repository: repo ].
^self resolveSpec: pkgSpec with: gofer
]
{ #category : #'development support' }
MetacelloLoadingMCSpecLoader >> resolveSpec: pkgSpec with: gofer [
^pkgSpec goferLoaderReference resolveWith: gofer
]
{ #category : #'development support' }
MetacelloLoadingMCSpecLoader >> savePackageUsing: repositorySpecs [
| wc repo repoSpecs newVersion |
(wc := self spec workingCopy) == nil ifTrue: [ ^false ].
(wc ancestry ancestors notEmpty and: [ wc modified not])
ifTrue: [ ^false ].
repoSpecs := self spec repositorySpecs notEmpty
ifTrue: [ self spec repositorySpecs ]
ifFalse: [ repositorySpecs ].
(self spec getFile == nil or: [ wc ancestry ancestors isEmpty ])
ifTrue: [ repo := (self repositoriesFrom: repoSpecs ignoreOverrides: true) first ]
ifFalse: [
[ | newer |
repo := (self resolveSpec: self spec from: repoSpecs) repository.
newer := wc possiblyNewerVersionsIn: repo.
newer isEmpty not
ifTrue: [
(MetacelloPlatform current confirm: 'CAUTION! These versions in the repository may be newer:',
String cr, newer printString, String cr,
'Do you really want to save this version?') ifFalse: [ ^false ]] ]
on: Error
do: [:ignored | ^false ] ].
(newVersion := MetacelloPlatform current newVersionForWorkingCopy: wc) == nil ifTrue: [ ^false ].
repo storeVersion: newVersion.
^true
]