Skip to content

Commit d566289

Browse files
authored
Merge pull request #18 from intersystems-ru/master
Added init, release and compile methods to support project releases
2 parents b0db90f + 097fe96 commit d566289

File tree

2 files changed

+87
-108
lines changed

2 files changed

+87
-108
lines changed

README.md

+28
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@ import the [release](https://github.com/intersystems-ru/cache-udl/releases) to t
1111

1212
Map sc package to %All namespace to make it visible in any namespace.
1313

14+
# Usage
15+
1416
## Setup working directory ( optional )
1517
```
1618
NS> w ##class(sc.code).workdir("/path/to/your/working/directory/")
@@ -23,3 +25,29 @@ NS> d ##class(sc.code).export()
2325
```
2426
NS> d ##class(sc.code).import()
2527
```
28+
29+
## Compile and Release:
30+
31+
Introduce cos.json file in the source root directory with settings for the code mask and for the name of the project. e.g.
32+
```
33+
cos.json
34+
"compileList": "Classes*.INC,classes*.CLS,*.DFI",
35+
"projectName": "myproject"
36+
```
37+
Run init method to initialize project settings:
38+
```
39+
NS> d ##class(sc.code).init()
40+
```
41+
Then run release to export all the classes in comileList into one "myproject.xml" release file. It will export it into the default for current Namespace directory.
42+
```
43+
NS> d ##class(sc.code).release()
44+
```
45+
Or compile it whenever you want to compile all the proejct related resources.
46+
```
47+
NS> d ##class(sc.code).compile()
48+
```
49+
50+
51+
52+
53+

sc.code.cls

+59-108
Original file line numberDiff line numberDiff line change
@@ -4,47 +4,56 @@
44
Class sc.code [ Abstract ]
55
{
66

7+
/// do ##class(sc.code).export()
78
/// export all available code
8-
ClassMethod export(generated = 0, system = 0, percent = 0, mapped = 0, mask = "")
9+
ClassMethod export(generated = 0, system = 0, percent = 0, mapped = 0, dfi = 0)
910
{
11+
1012

11-
#define export(%code, %file) s sc = $system.OBJ.ExportUDL(%code, %file,"/diffexport") ##continue
12-
w:sc "Ok" d:'sc $system.OBJ.DisplayError(sc)
13+
#define export(%code, %file) ##continue
14+
s sc = $system.OBJ.ExportUDL(%code, %file,"/diffexport") ##continue
15+
w +sc ##continue
16+
if 'sc d $system.OBJ.DisplayError(sc)
1317

1418
#define isGenerated(%code) ##class(%RoutineMgr).IsGenerated( %code )
1519
#define isPercented(%code) ("%" = $e(%code))
1620
#define isMapped(%code) ##class(%RoutineMgr).IsMapped( %code )
17-
#define log w !, code, " -> ", $piece(filename,..workdir(),2), " "
18-
21+
#define log w !, code, " -> ", filename, " "
22+
1923
#define mkdir(%filename) ##continue
2024
s path = ##class(%File).GetDirectory( %filename ) ##continue
2125
if '##class(%File).DirectoryExists( path ) { ##continue
2226
s sc = ##class(%File).CreateDirectoryChain( path ) ##continue
2327
w !, "mkdir ", path, " ", sc ##continue
2428
}
25-
26-
w "#; Exporting to ", ..workdir(),!
29+
30+
31+
2732
#; classes
2833
s rs = ##class(%ResultSet).%New("%Dictionary.ClassDefinition:Summary")
2934
if rs.Execute() {
3035

3136
while rs.%Next(){
32-
3337
s code = rs.Name _ ".cls", isSystem = rs.System
3438
if ( 'system && isSystem ) continue
3539
if ( 'generated && $$$isGenerated( code ) ) continue
3640
if ( 'percent && $$$isPercented( code ) ) continue
3741
if ( 'mapped && $$$isMapped( code ) ) continue
38-
if ( '$find( code, mask ) ) continue
39-
4042
s filename = ..filename( code )
4143
$$$mkdir( filename )
42-
$$$log
43-
$$$export( code, filename )
44+
if dfi{
45+
$$$log
46+
$$$export( code, filename )
47+
}
48+
else{
49+
do $system.OBJ.Export(code,filename_".xml")
50+
}
51+
52+
4453

4554
} s rs=""
4655
}
47-
56+
4857
#; routines
4958
s rs = ##class(%ResultSet).%New("%Routine:RoutineList")
5059
if rs.Execute() {
@@ -55,48 +64,51 @@ ClassMethod export(generated = 0, system = 0, percent = 0, mapped = 0, mask = ""
5564
if ( 'generated && $$$isGenerated( code ) ) continue
5665
if ( 'percent && $$$isPercented( code ) ) continue
5766
if ( 'mapped && $$$isMapped( code ) ) continue
58-
if ( '$find( code, mask ) ) continue
59-
67+
6068
s filename = ..filename( code )
6169
$$$mkdir( filename )
62-
$$$log
63-
$$$export( code, filename )
70+
if dfi{
71+
$$$log
72+
$$$export( code, filename )
73+
}
74+
else{
75+
do $system.OBJ.Export(code,filename_".xml")
76+
}
6477

6578
} s rs=""
6679
}
6780

6881

6982
#; dfi
70-
#define export(%code,%file) s sc = ##class(%DeepSee.UserLibrary.Utils).%Export( %code, %file, 0 )
71-
83+
#define export(%code,%file) w ##class(%DeepSee.UserLibrary.Utils).%Export( %code, %file, 0 )
7284
s sql = "Select fullName as Name From %DeepSee_UserLibrary.FolderItem"
7385
s rs = ##class(%SQL.Statement).%ExecDirect( .stm, sql )
7486
while rs.%Next() {
7587
s code = rs.Name, filename = ..filename( code_".dfi" )
76-
if ( '$find( code, mask ) ) continue
77-
if ($L(code,"$TRASH")>1) continue
7888
$$$mkdir( filename )
79-
$$$log
80-
$$$export(code,filename)
89+
if dfi{
90+
$$$log
91+
$$$export( code, filename )
92+
}
93+
else{
94+
do $system.OBJ.Export(code,filename_".xml")
95+
}
8196

8297
} s rs=""
83-
84-
w !,!, "#; Exported to ", ..workdir()
85-
98+
8699
Q 1
87100
}
88101

89102
/// import all from workdir
90-
ClassMethod import(filemask = "*.xml;*.cls;*.mac;*.int;*.inc;*.dfi", qspec = "cku-d", ByRef err = "", recurse = 1, ByRef loaded = "", verbose = 1) As %Status
103+
ClassMethod import(filemask = "*.*", qspec = "cku-d", ByRef err = "", recurse = 1, ByRef loaded = "", verbose = 1) As %Status
91104
{
92105
#define push(%dir) s dirs( $i( dirs ) ) = %dir
93106
#define next(%i,%dir) s %i=$o( dirs( "" ), 1, %dir ) k:%i'="" dirs(%i)
94107
#define isDirectory(%type) ( %type = "D" )
95-
#define log w !, $piece(filename,..workdir(),2), " " w:sc "Ok" d:'sc $system.OBJ.DisplayError(sc)
108+
#define log w !, filename, " ", +sc, $S(sc=1:"",1: " "_$system.Status.GetOneErrorText(sc))
96109

97110
s sc = 1, dirs = "", dir = ..workdir() $$$push(dir)
98-
if verbose w "#; Importing from ", dir,!
99-
d ..setIgnore(.fm)
111+
100112
for { $$$next(i,dir) Q:i="" Q:dir=""
101113

102114
s rs = ##class(%File).FileSetFunc( dir, filemask, , 1 )
@@ -108,78 +120,23 @@ ClassMethod import(filemask = "*.xml;*.cls;*.mac;*.int;*.inc;*.dfi", qspec = "ck
108120
if recurse $$$push(filename)
109121
continue
110122
}
111-
// check file filter
112-
if ..inFilter(.fm,filename) continue
113123

114124
s ext = $p( filename, ".", * )
115125

116126
if $zcvt( ext, "l" ) = "dfi" {
117-
s sc = ##class(%DeepSee.UserLibrary.Utils).%Import( filename, 1, 0, 0, "", .dsloaded )
127+
s sc = ##class(%DeepSee.UserLibrary.Utils).%Import( filename, 1, 0, 0, "", .loaded )
118128
} else {
119-
// load classes only
120-
s sc = $system.OBJ.Load( filename, "k-d", .err, .loaded)
129+
s sc = $system.OBJ.Load( filename, qspec, .err, .loaded)
121130
}
122131

123132
if verbose $$$log
124-
125-
}
126-
// compile all the loaded classes to obey dependencies
127-
s sc=$system.OBJ.CompileList( .loaded, "cukbr-d/multicompile",.err )
128-
129-
}
130-
131-
if verbose {
132-
133-
if $D(err) {
134-
s i=$Order(err(""))
135-
while i'="" {
136-
w !,err(i)
137-
s i=$O(err(i))
138-
}
139-
}
140-
141-
w !,!,"#; Imported from ", ..workdir()
142-
}
143-
Q sc
144-
}
145-
146-
ClassMethod inFilter(ByRef filtermask,filename) as %Boolean
147-
{
148-
s result=0
149-
for
150-
{
151-
if '$d(filtermask($I(i))) quit
152-
set filter=$piece(filtermask(i),"*")
153-
if $length(filename,filter)>1 set result=1
154-
}
155-
156-
quit result
157-
}
158133

159-
/// get the filtermask for the repository.
160-
/// looks for .gitignore file and applies all the lines to filters
161-
ClassMethod setIgnore(ByRef filtermask)
162-
{
163-
164-
// working with .gitignore file
165-
// gitignore consists of masks of filtering files
166-
s filename=..workdir()_"/.gitignore"
167-
if '##class(%File).Exists(filename) quit
168-
s file=##class(%File).%New(filename)
169-
s sc=file.Open("R")
170-
if 'sc
171-
{
172-
if verbose d $System.OBJ.DisplayError(sc) return
134+
}
173135
}
174136

175-
While 'file.AtEnd
176-
{
177-
s filtermask($I(filtermask))=file.ReadLine()
178-
}
179-
quit
137+
Q sc
180138
}
181139

182-
183140
/// get or set working directory for export/import source
184141
ClassMethod workdir(workdir)
185142
{
@@ -222,15 +179,14 @@ ClassMethod filename(code)
222179
}
223180

224181
s filename = ##class(%File).NormalizeFilename( code, wd )
225-
#; lowercase file extension
226-
s $p(filename,".",*)=ext
227182
//B:code="DPRep.Rest.JSON.cls" "L"
228183
#; for *.cls Package.Subpackage.ClassName.cls -> Folder/Subfolder/ClassName.cls
229184
if ext ="cls" {
230185
s dirs = $piece( code, ".",1, *-2 ), dirs = $translate( dirs, ".", "/" )
231186
s relpath = dirs _ "/" _ $piece( code, ".", *-1, * ) ;
232187
s filename = ##class(%File).NormalizeFilename( relpath, wd )
233188
}
189+
set filename = $extract(filename,1,*-4)
234190
Q filename
235191
}
236192

@@ -240,11 +196,8 @@ ClassMethod importUpdated(filemask = "*.*", qspec = "cku-d", ByRef err = "", rec
240196
#define push(%dir) s dirs( $i( dirs ) ) = %dir
241197
#define next(%i,%dir) s %i=$o( dirs( "" ), 1, %dir ) k:%i'="" dirs(%i)
242198
#define isDirectory(%type) ( %type = "D" )
243-
#define log w !, $piece(filename,..workdir(),2)," " w:sc "Ok" d:'sc $system.OBJ.DisplayError( sc )
244-
199+
#define log w !, filename, " ->1 ", codename, " ", +sc
245200
s sc = 1, dirs = "", dir = ..workdir() $$$push(dir)
246-
if verbose w "#; Importing updated from ", dir,!
247-
d ..setIgnore(.fm)
248201
for { $$$next(i,dir) Q:i="" Q:dir=""
249202

250203
s rs = ##class(%File).FileSetFunc( dir, filemask, , 1 )
@@ -257,34 +210,33 @@ ClassMethod importUpdated(filemask = "*.*", qspec = "cku-d", ByRef err = "", rec
257210
continue
258211
}
259212

260-
// check file filter
261-
if ..inFilter(.fm,filename) continue
262-
263213
s filets = rs.DateModified
264214
s codename = ..codename( filename, .ext )
265215
s codets = ..codets( codename, ext )
266-
267-
#; w !, filename, $c(9), "(", filets, ")"
268-
#; w !, codename, $c(9), "(", codets, ")"
269-
270216
if ( filets '] codets ) continue
271-
217+
//w codename,! B "L"
218+
219+
/*
220+
w !, " ************* import ************** "
221+
w !, "file: ", filets
222+
w !, "code: ", codets
223+
*/
224+
272225
if ext = "dfi" {
273226

274227
s sc = ##class(%DeepSee.UserLibrary.Utils).%Import( filename, 1, 0, 0, "", .loaded )
275228

276229
} else {
277230

278231
#; drop existing code before import ( purge DateModified )
279-
#; s:codets'="" sc = ##class(%RoutineMgr).Delete( codename )
280-
k err s sc = $system.OBJ.Load( filename, qspec, .err, .loaded)
232+
s:codets'="" sc = ##class(%RoutineMgr).Delete( codename )
233+
s sc = $system.OBJ.Load( filename, qspec, .err, .loaded)
281234

282235
}
283236

284237
if verbose $$$log
285238
}
286239
}
287-
w:verbose !,"#; Imported updated from ", ..workdir()
288240
Q sc
289241
}
290242

@@ -298,7 +250,7 @@ ClassMethod codename(filename, ByRef ext = "")
298250
s fullname = $tr( codename, "\", "/" ) ; return fullname for dfi in $$$IsWINDOWS
299251
Q $p( fullname, ".", 1, *-1 ) ;remove extension
300252
}
301-
if (ext ="cls")!(ext="int")!(ext="inc")!(ext="mac") s codename=$tr(codename,"\/","..")
253+
if (ext ="cls")!(ext="int")!(ext="inc")!(ext="mac") s codename=$tr(codename,"/",".")
302254
Q codename
303255
}
304256

@@ -321,4 +273,3 @@ ClassMethod codets(codename, ext)
321273
}
322274

323275
}
324-

0 commit comments

Comments
 (0)