Skip to content

Commit

Permalink
Merge pull request #18 from intersystems-ru/master
Browse files Browse the repository at this point in the history
Added init, release and compile methods to support project releases
  • Loading branch information
doublefint authored Jan 23, 2018
2 parents b0db90f + 097fe96 commit d566289
Show file tree
Hide file tree
Showing 2 changed files with 87 additions and 108 deletions.
28 changes: 28 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,8 @@ import the [release](https://github.com/intersystems-ru/cache-udl/releases) to t

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

# Usage

## Setup working directory ( optional )
```
NS> w ##class(sc.code).workdir("/path/to/your/working/directory/")
Expand All @@ -23,3 +25,29 @@ NS> d ##class(sc.code).export()
```
NS> d ##class(sc.code).import()
```

## Compile and Release:

Introduce cos.json file in the source root directory with settings for the code mask and for the name of the project. e.g.
```
cos.json
"compileList": "Classes*.INC,classes*.CLS,*.DFI",
"projectName": "myproject"
```
Run init method to initialize project settings:
```
NS> d ##class(sc.code).init()
```
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.
```
NS> d ##class(sc.code).release()
```
Or compile it whenever you want to compile all the proejct related resources.
```
NS> d ##class(sc.code).compile()
```





167 changes: 59 additions & 108 deletions sc.code.cls
Original file line number Diff line number Diff line change
Expand Up @@ -4,47 +4,56 @@
Class sc.code [ Abstract ]
{

/// do ##class(sc.code).export()
/// export all available code
ClassMethod export(generated = 0, system = 0, percent = 0, mapped = 0, mask = "")
ClassMethod export(generated = 0, system = 0, percent = 0, mapped = 0, dfi = 0)
{


#define export(%code, %file) s sc = $system.OBJ.ExportUDL(%code, %file,"/diffexport") ##continue
w:sc "Ok" d:'sc $system.OBJ.DisplayError(sc)
#define export(%code, %file) ##continue
s sc = $system.OBJ.ExportUDL(%code, %file,"/diffexport") ##continue
w +sc ##continue
if 'sc d $system.OBJ.DisplayError(sc)

#define isGenerated(%code) ##class(%RoutineMgr).IsGenerated( %code )
#define isPercented(%code) ("%" = $e(%code))
#define isMapped(%code) ##class(%RoutineMgr).IsMapped( %code )
#define log w !, code, " -> ", $piece(filename,..workdir(),2), " "
#define log w !, code, " -> ", filename, " "

#define mkdir(%filename) ##continue
s path = ##class(%File).GetDirectory( %filename ) ##continue
if '##class(%File).DirectoryExists( path ) { ##continue
s sc = ##class(%File).CreateDirectoryChain( path ) ##continue
w !, "mkdir ", path, " ", sc ##continue
}

w "#; Exporting to ", ..workdir(),!



#; classes
s rs = ##class(%ResultSet).%New("%Dictionary.ClassDefinition:Summary")
if rs.Execute() {

while rs.%Next(){

s code = rs.Name _ ".cls", isSystem = rs.System
if ( 'system && isSystem ) continue
if ( 'generated && $$$isGenerated( code ) ) continue
if ( 'percent && $$$isPercented( code ) ) continue
if ( 'mapped && $$$isMapped( code ) ) continue
if ( '$find( code, mask ) ) continue

s filename = ..filename( code )
$$$mkdir( filename )
$$$log
$$$export( code, filename )
if dfi{
$$$log
$$$export( code, filename )
}
else{
do $system.OBJ.Export(code,filename_".xml")
}



} s rs=""
}

#; routines
s rs = ##class(%ResultSet).%New("%Routine:RoutineList")
if rs.Execute() {
Expand All @@ -55,48 +64,51 @@ ClassMethod export(generated = 0, system = 0, percent = 0, mapped = 0, mask = ""
if ( 'generated && $$$isGenerated( code ) ) continue
if ( 'percent && $$$isPercented( code ) ) continue
if ( 'mapped && $$$isMapped( code ) ) continue
if ( '$find( code, mask ) ) continue


s filename = ..filename( code )
$$$mkdir( filename )
$$$log
$$$export( code, filename )
if dfi{
$$$log
$$$export( code, filename )
}
else{
do $system.OBJ.Export(code,filename_".xml")
}

} s rs=""
}


#; dfi
#define export(%code,%file) s sc = ##class(%DeepSee.UserLibrary.Utils).%Export( %code, %file, 0 )

#define export(%code,%file) w ##class(%DeepSee.UserLibrary.Utils).%Export( %code, %file, 0 )
s sql = "Select fullName as Name From %DeepSee_UserLibrary.FolderItem"
s rs = ##class(%SQL.Statement).%ExecDirect( .stm, sql )
while rs.%Next() {
s code = rs.Name, filename = ..filename( code_".dfi" )
if ( '$find( code, mask ) ) continue
if ($L(code,"$TRASH")>1) continue
$$$mkdir( filename )
$$$log
$$$export(code,filename)
if dfi{
$$$log
$$$export( code, filename )
}
else{
do $system.OBJ.Export(code,filename_".xml")
}

} s rs=""

w !,!, "#; Exported to ", ..workdir()


Q 1
}

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

s sc = 1, dirs = "", dir = ..workdir() $$$push(dir)
if verbose w "#; Importing from ", dir,!
d ..setIgnore(.fm)

for { $$$next(i,dir) Q:i="" Q:dir=""

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

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

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

if verbose $$$log

}
// compile all the loaded classes to obey dependencies
s sc=$system.OBJ.CompileList( .loaded, "cukbr-d/multicompile",.err )

}

if verbose {

if $D(err) {
s i=$Order(err(""))
while i'="" {
w !,err(i)
s i=$O(err(i))
}
}

w !,!,"#; Imported from ", ..workdir()
}
Q sc
}

ClassMethod inFilter(ByRef filtermask,filename) as %Boolean
{
s result=0
for
{
if '$d(filtermask($I(i))) quit
set filter=$piece(filtermask(i),"*")
if $length(filename,filter)>1 set result=1
}

quit result
}

/// get the filtermask for the repository.
/// looks for .gitignore file and applies all the lines to filters
ClassMethod setIgnore(ByRef filtermask)
{

// working with .gitignore file
// gitignore consists of masks of filtering files
s filename=..workdir()_"/.gitignore"
if '##class(%File).Exists(filename) quit
s file=##class(%File).%New(filename)
s sc=file.Open("R")
if 'sc
{
if verbose d $System.OBJ.DisplayError(sc) return
}
}

While 'file.AtEnd
{
s filtermask($I(filtermask))=file.ReadLine()
}
quit
Q sc
}


/// get or set working directory for export/import source
ClassMethod workdir(workdir)
{
Expand Down Expand Up @@ -222,15 +179,14 @@ ClassMethod filename(code)
}

s filename = ##class(%File).NormalizeFilename( code, wd )
#; lowercase file extension
s $p(filename,".",*)=ext
//B:code="DPRep.Rest.JSON.cls" "L"
#; for *.cls Package.Subpackage.ClassName.cls -> Folder/Subfolder/ClassName.cls
if ext ="cls" {
s dirs = $piece( code, ".",1, *-2 ), dirs = $translate( dirs, ".", "/" )
s relpath = dirs _ "/" _ $piece( code, ".", *-1, * ) ;
s filename = ##class(%File).NormalizeFilename( relpath, wd )
}
set filename = $extract(filename,1,*-4)
Q filename
}

Expand All @@ -240,11 +196,8 @@ ClassMethod importUpdated(filemask = "*.*", qspec = "cku-d", ByRef err = "", rec
#define push(%dir) s dirs( $i( dirs ) ) = %dir
#define next(%i,%dir) s %i=$o( dirs( "" ), 1, %dir ) k:%i'="" dirs(%i)
#define isDirectory(%type) ( %type = "D" )
#define log w !, $piece(filename,..workdir(),2)," " w:sc "Ok" d:'sc $system.OBJ.DisplayError( sc )

#define log w !, filename, " ->1 ", codename, " ", +sc
s sc = 1, dirs = "", dir = ..workdir() $$$push(dir)
if verbose w "#; Importing updated from ", dir,!
d ..setIgnore(.fm)
for { $$$next(i,dir) Q:i="" Q:dir=""

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

// check file filter
if ..inFilter(.fm,filename) continue

s filets = rs.DateModified
s codename = ..codename( filename, .ext )
s codets = ..codets( codename, ext )

#; w !, filename, $c(9), "(", filets, ")"
#; w !, codename, $c(9), "(", codets, ")"

if ( filets '] codets ) continue

//w codename,! B "L"

/*
w !, " ************* import ************** "
w !, "file: ", filets
w !, "code: ", codets
*/

if ext = "dfi" {

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

} else {

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

}

if verbose $$$log
}
}
w:verbose !,"#; Imported updated from ", ..workdir()
Q sc
}

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

Expand All @@ -321,4 +273,3 @@ ClassMethod codets(codename, ext)
}

}

0 comments on commit d566289

Please sign in to comment.