Skip to content

Commit 4097212

Browse files
committed
symlinks resolve support
1 parent 46afb2b commit 4097212

File tree

1 file changed

+49
-1
lines changed

1 file changed

+49
-1
lines changed

ext/ruby_debug/ruby_debug.c

Lines changed: 49 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ static VALUE tracing = Qfalse;
3636
static VALUE locker = Qnil;
3737
static VALUE post_mortem = Qfalse;
3838
static VALUE keep_frame_binding = Qfalse;
39+
static VALUE resolve_symlinks = Qtrue;
3940
static VALUE debug = Qfalse;
4041
static VALUE track_frame_args = Qfalse;
4142

@@ -509,6 +510,17 @@ save_call_frame(rb_event_flag_t _event, debug_context_t *debug_context, VALUE se
509510
copy_scalar_args(debug_frame);
510511
}
511512

513+
char*
514+
resolve_symlink(char *file) {
515+
char *result;
516+
#ifdef PATH_MAX
517+
result = (char*)malloc(PATH_MAX);
518+
#else
519+
result = NULL;
520+
#endif
521+
return realpath(file, result);
522+
}
523+
512524

513525
#if defined DOSISH
514526
#define isdirsep(x) ((x) == '/' || (x) == '\\')
@@ -517,7 +529,14 @@ save_call_frame(rb_event_flag_t _event, debug_context_t *debug_context, VALUE se
517529
#endif
518530

519531
int
520-
filename_cmp(VALUE source, char *file)
532+
filename_cmp(VALUE source, char *file) {
533+
char* path;
534+
path = RTEST(resolve_symlinks) ? resolve_symlink(file) : file;
535+
return filename_cmp_impl(source, path);
536+
}
537+
538+
int
539+
filename_cmp_impl(VALUE source, char *file)
521540
{
522541
char *source_ptr, *file_ptr;
523542
long s_len, f_len, min_len;
@@ -1460,6 +1479,31 @@ debug_set_keep_frame_binding(VALUE self, VALUE value)
14601479
return value;
14611480
}
14621481

1482+
/*
1483+
* call-seq:
1484+
* Debugger.resolve_symlinks? -> bool
1485+
*
1486+
* Returns +true+ if the debugger will resolve symlinks when checking breakpoint.
1487+
*/
1488+
static VALUE
1489+
debug_resolve_symlinks(VALUE self)
1490+
{
1491+
return resolve_symlinks;
1492+
}
1493+
1494+
/*
1495+
* call-seq:
1496+
* Debugger.resolve_symlinks = bool
1497+
*
1498+
* Setting to +true+ will make the debugger resolve symlinks when checking breakpoint.
1499+
*/
1500+
static VALUE
1501+
debug_set_resolve_symlinks(VALUE self, VALUE value)
1502+
{
1503+
resolve_symlinks = RTEST(value) ? Qtrue : Qfalse;
1504+
return value;
1505+
}
1506+
14631507
/* :nodoc: */
14641508
static VALUE
14651509
debug_debug(VALUE self)
@@ -2604,6 +2648,10 @@ Init_ruby_debug()
26042648
debug_keep_frame_binding, 0);
26052649
rb_define_module_function(mDebugger, "keep_frame_binding=",
26062650
debug_set_keep_frame_binding, 1);
2651+
rb_define_module_function(mDebugger, "resolve_symlinks?",
2652+
debug_resolve_symlinks, 0);
2653+
rb_define_module_function(mDebugger, "resolve_symlinks=",
2654+
debug_set_resolve_symlinks, 1);
26072655
rb_define_module_function(mDebugger, "track_frame_args?",
26082656
debug_track_frame_args, 0);
26092657
rb_define_module_function(mDebugger, "track_frame_args=",

0 commit comments

Comments
 (0)