@@ -125,7 +125,7 @@ fn create_source_globs(cid: &str, c: &v2::Component) -> Option<Vec<String>> {
125
125
build
126
126
. watch
127
127
. iter ( )
128
- . filter_map ( |w| Path :: new ( workdir) . join ( w ) . to_str ( ) . map ( String :: from ) )
128
+ . map ( |w| concatenate_glob_friendly ( workdir, w ) )
129
129
. collect ( )
130
130
} )
131
131
. unwrap_or_else ( || build. watch . clone ( ) ) ;
@@ -137,6 +137,20 @@ fn create_source_globs(cid: &str, c: &v2::Component) -> Option<Vec<String>> {
137
137
}
138
138
}
139
139
140
+ /// Using Path::join on Windows correctly joins with a backslash. But the watchexec glob
141
+ /// engines hates backslashes. So we must always use forward slashes in glob expressions,
142
+ /// and in workdirs, and for concatenating the two. (We could use Path::join on Unix but
143
+ /// the signature ends up a bit different because to_str returns an Option, so...)
144
+ fn concatenate_glob_friendly ( workdir : & str , watch_glob : & str ) -> String {
145
+ if PathBuf :: from ( watch_glob) . is_absolute ( ) {
146
+ watch_glob. to_string ( )
147
+ } else if workdir. ends_with ( '/' ) {
148
+ format ! ( "{workdir}{watch_glob}" )
149
+ } else {
150
+ format ! ( "{workdir}/{watch_glob}" )
151
+ }
152
+ }
153
+
140
154
#[ async_trait]
141
155
impl FilterFactory for ManifestFilterFactory {
142
156
async fn build_filter (
@@ -207,3 +221,31 @@ impl watchexec::filter::Filterer for CompositeFilterer {
207
221
Ok ( false )
208
222
}
209
223
}
224
+
225
+ #[ cfg( test) ]
226
+ mod tests {
227
+ use super :: * ;
228
+
229
+ #[ test]
230
+ fn joining_workdir_always_uses_forward_slash ( ) {
231
+ assert_eq ! (
232
+ "work/src/**/*.rs" ,
233
+ concatenate_glob_friendly( "work" , "src/**/*.rs" )
234
+ ) ;
235
+ assert_eq ! (
236
+ "work/src/**/*.rs" ,
237
+ concatenate_glob_friendly( "work/" , "src/**/*.rs" )
238
+ ) ;
239
+
240
+ #[ cfg( not( target_os = "windows" ) ) ]
241
+ assert_eq ! (
242
+ "/global/src/**/*.rs" ,
243
+ concatenate_glob_friendly( "work" , "/global/src/**/*.rs" )
244
+ ) ;
245
+ #[ cfg( target_os = "windows" ) ]
246
+ assert_eq ! (
247
+ "D:/global/src/**/*.rs" ,
248
+ concatenate_glob_friendly( "work" , "D:/global/src/**/*.rs" )
249
+ ) ;
250
+ }
251
+ }
0 commit comments