diff --git a/sc.code.cls b/sc.code.cls index 3e9d2d3..bb26a90 100644 --- a/sc.code.cls +++ b/sc.code.cls @@ -14,7 +14,7 @@ ClassMethod export(generated = 0, system = 0, percent = 0, mapped = 0, mask = "" #define isGenerated(%code) ##class(%RoutineMgr).IsGenerated( %code ) #define isPercented(%code) ("%" = $e(%code)) #define isMapped(%code) ##class(%RoutineMgr).IsMapped( %code ) - #define log w !, code, " -> ", ##class(%File).GetFilename(filename), " " + #define log w !, code, " -> ", $piece(filename,..workdir(),2), " " #define mkdir(%filename) ##continue s path = ##class(%File).GetDirectory( %filename ) ##continue @@ -91,10 +91,11 @@ ClassMethod import(filemask = "*.*", qspec = "cku-d", ByRef err = "", recurse = #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 !, ##class(%File).GetFilename(filename), " " w:sc "Ok" d:'sc $system.OBJ.DisplayError(sc) + #define log w !, $piece(filename,..workdir(),2), " " w:sc "Ok" d:'sc $system.OBJ.DisplayError(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 ) @@ -106,6 +107,8 @@ ClassMethod import(filemask = "*.*", qspec = "cku-d", ByRef err = "", recurse = if recurse $$$push(filename) continue } + // check file filter + if ..inFilter(.fm,filename) continue s ext = $p( filename, ".", * ) @@ -123,6 +126,43 @@ ClassMethod import(filemask = "*.*", qspec = "cku-d", ByRef err = "", recurse = 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 +} + + /// get or set working directory for export/import source ClassMethod workdir(workdir) { @@ -181,10 +221,11 @@ 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 !, ##class(%File).GetFilename(filename)," " w:sc "Ok" d:'sc $system.OBJ.DisplayError( sc ) + #define log w !, $piece(filename,..workdir(),2)," " w:sc "Ok" d:'sc $system.OBJ.DisplayError( 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 ) @@ -197,6 +238,9 @@ 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 )