diff --git a/sc.code.cls b/sc.code.cls index 4987c5d..b42b0df 100644 --- a/sc.code.cls +++ b/sc.code.cls @@ -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() { @@ -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 ) @@ -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) { @@ -195,40 +152,6 @@ ClassMethod gln() [ CodeMode = expression, Private ] "^"_$classname() } - - -ClassMethod init() -{ - #define confile "/cos.json" - set stream=##class(%Stream.FileCharacter).%New() - set sc=stream.LinkToFile(..workdir()_$$$confile) - s conf={}.%FromJSON(stream.Read($$$MaxCacheInt)) - s gln=..gln() - s @gln@("compileList")=conf.compileList - s @gln@("projectName")=conf.projectName - w "compileList="_conf.compileList,! - w "projectName="_conf.projectName -} - -/// export release file for list and project settings -ClassMethod release() { - s gln=..gln() - s list=$G(@gln@("compileList")) - if list="" w "Nothing to release. Run init method first" quit - - s release=$G(@gln@("projectName"),"release") - s release=release_$p($zdt($h,8)," ")_$tr($p($p($zdt($h)," ",2),":",1,2),":")_".xml" - D $System.OBJ.Export(list,release) - w "All objects with mask "_list_" has been exported to "_release -} - -ClassMethod compile() { - s gln=..gln() - s list=$G(@gln@("compileList")) - if list="" w "Nothing to compile. Run init method first" quit - d $System.OBJ.compile(list) -} - /// test.dfi -> /dfi/test.dfi /// test.cls -> /cls/test.cls /// testpkg.test.cls -> /cls/testpkg/test.cls @@ -256,8 +179,6 @@ 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" { @@ -265,6 +186,7 @@ ClassMethod filename(code) s relpath = dirs _ "/" _ $piece( code, ".", *-1, * ) ; s filename = ##class(%File).NormalizeFilename( relpath, wd ) } + set filename = $extract(filename,1,*-4) Q filename } @@ -274,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 ) @@ -291,18 +210,18 @@ 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 ) @@ -310,15 +229,14 @@ ClassMethod importUpdated(filemask = "*.*", qspec = "cku-d", ByRef err = "", rec } 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 } @@ -332,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 } @@ -354,6 +272,4 @@ ClassMethod codets(codename, ext) Q $p( ts, "." ) ;remove ms } - } -