@@ -14,7 +14,7 @@ ClassMethod export(generated = 0, system = 0, percent = 0, mapped = 0, mask = ""
1414 #define isGenerated (%code ) ##class (%RoutineMgr ).IsGenerated ( %code )
1515 #define isPercented (%code ) (" %" = $e (%code ))
1616 #define isMapped (%code ) ##class (%RoutineMgr ).IsMapped ( %code )
17- #define log w !, code , " -> " , ##class ( %File ). GetFilename ( filename ), " "
17+ #define log w !, code , " -> " , $piece ( filename ,.. workdir (), 2 ), " "
1818
1919 #define mkdir (%filename ) ##continue
2020 s path = ##class (%File ).GetDirectory ( %filename ) ##continue
@@ -91,10 +91,11 @@ ClassMethod import(filemask = "*.*", qspec = "cku-d", ByRef err = "", recurse =
9191 #define push (%dir ) s dirs ( $i ( dirs ) ) = %dir
9292 #define next (%i,%dir ) s %i =$o ( dirs ( " " ), 1 , %dir ) k :%i '=" " dirs (%i )
9393 #define isDirectory (%type ) ( %type = " D" )
94- #define log w !, ##class ( %File ). GetFilename ( filename ), " " w :sc " Ok" d :'sc $system .OBJ .DisplayError (sc )
94+ #define log w !, $piece ( filename ,.. workdir (), 2 ), " " w :sc " Ok" d :'sc $system .OBJ .DisplayError (sc )
9595
9696 s sc = 1 , dirs = " " , dir = ..workdir () $$$push(dir )
9797 if verbose w " #; Importing from " , dir ,!
98+ d ..setIgnore (.fm )
9899 for { $$$next(i ,dir ) Q :i =" " Q :dir =" "
99100
100101 s rs = ##class (%File ).FileSetFunc ( dir , filemask , , 1 )
@@ -106,6 +107,8 @@ ClassMethod import(filemask = "*.*", qspec = "cku-d", ByRef err = "", recurse =
106107 if recurse $$$push(filename )
107108 continue
108109 }
110+ // check file filter
111+ if ..inFilter (.fm ,filename ) continue
109112
110113 s ext = $p ( filename , " ." , * )
111114
@@ -123,6 +126,43 @@ ClassMethod import(filemask = "*.*", qspec = "cku-d", ByRef err = "", recurse =
123126 Q sc
124127}
125128
129+ ClassMethod inFilter (ByRef filtermask ,filename ) as %Boolean
130+ {
131+ s result =0
132+ for
133+ {
134+ if '$d (filtermask ($I (i ))) quit
135+ set filter =$piece (filtermask (i )," *" )
136+ if $length (filename ,filter )>1 set result =1
137+ }
138+
139+ quit result
140+ }
141+
142+ /// get the filtermask for the repository.
143+ /// looks for .gitignore file and applies all the lines to filters
144+ ClassMethod setIgnore (ByRef filtermask )
145+ {
146+
147+ // working with .gitignore file
148+ // gitignore consists of masks of filtering files
149+ s filename =..workdir ()_" /.gitignore"
150+ if '##class (%File ).Exists (filename ) quit
151+ s file =##class (%File ).%New (filename )
152+ s sc =file .Open (" R" )
153+ if 'sc
154+ {
155+ if verbose d $System .OBJ .DisplayError (sc ) return
156+ }
157+
158+ While 'file .AtEnd
159+ {
160+ s filtermask ($I (filtermask ))=file .ReadLine ()
161+ }
162+ quit
163+ }
164+
165+
126166/// get or set working directory for export/import source
127167ClassMethod workdir (workdir )
128168{
@@ -181,10 +221,11 @@ ClassMethod importUpdated(filemask = "*.*", qspec = "cku-d", ByRef err = "", rec
181221 #define push (%dir ) s dirs ( $i ( dirs ) ) = %dir
182222 #define next (%i,%dir ) s %i =$o ( dirs ( " " ), 1 , %dir ) k :%i '=" " dirs (%i )
183223 #define isDirectory (%type ) ( %type = " D" )
184- #define log w !, ##class ( %File ). GetFilename ( filename )," " w :sc " Ok" d :'sc $system .OBJ .DisplayError ( sc )
224+ #define log w !, $piece ( filename ,.. workdir (), 2 )," " w :sc " Ok" d :'sc $system .OBJ .DisplayError ( sc )
185225
186226 s sc = 1 , dirs = " " , dir = ..workdir () $$$push(dir )
187227 if verbose w " #; Importing updated from " , dir ,!
228+ d ..setIgnore (.fm )
188229 for { $$$next(i ,dir ) Q :i =" " Q :dir =" "
189230
190231 s rs = ##class (%File ).FileSetFunc ( dir , filemask , , 1 )
@@ -197,6 +238,9 @@ ClassMethod importUpdated(filemask = "*.*", qspec = "cku-d", ByRef err = "", rec
197238 continue
198239 }
199240
241+ // check file filter
242+ if ..inFilter (.fm ,filename ) continue
243+
200244 s filets = rs .DateModified
201245 s codename = ..codename ( filename , .ext )
202246 s codets = ..codets ( codename , ext )
0 commit comments