Fix to stop reporting config.fish execution as coming from "standard

input" within backtraces
This commit is contained in:
ridiculousfish
2014-02-20 10:57:13 -08:00
parent 3ab954644f
commit adf5b036d6
3 changed files with 29 additions and 10 deletions

View File

@@ -227,7 +227,9 @@ static void source_config_in_directory(const wcstring &dir)
const wcstring escaped_dir = escape_string(dir, ESCAPE_ALL); const wcstring escaped_dir = escape_string(dir, ESCAPE_ALL);
const wcstring cmd = L"builtin source " + escaped_dir + L"/config.fish 2>/dev/null"; const wcstring cmd = L"builtin source " + escaped_dir + L"/config.fish 2>/dev/null";
parser_t &parser = parser_t::principal_parser(); parser_t &parser = parser_t::principal_parser();
parser.set_is_within_fish_initialization(true);
parser.eval(cmd, io_chain_t(), TOP); parser.eval(cmd, io_chain_t(), TOP);
parser.set_is_within_fish_initialization(false);
} }
/** /**

View File

@@ -299,6 +299,7 @@ parser_t::parser_t(enum parser_type_t type, bool errors) :
error_code(0), error_code(0),
err_pos(0), err_pos(0),
cancellation_requested(false), cancellation_requested(false),
is_within_fish_initialization(false),
current_tokenizer(NULL), current_tokenizer(NULL),
current_tokenizer_pos(0), current_tokenizer_pos(0),
job_start_pos(0), job_start_pos(0),
@@ -322,6 +323,11 @@ parser_t &parser_t::principal_parser(void)
return parser; return parser;
} }
void parser_t::set_is_within_fish_initialization(bool flag)
{
is_within_fish_initialization = flag;
}
void parser_t::skip_all_blocks(void) void parser_t::skip_all_blocks(void)
{ {
/* Tell all blocks to skip */ /* Tell all blocks to skip */
@@ -858,10 +864,13 @@ void parser_t::stack_trace(size_t block_idx, wcstring &buff) const
b->src_lineno, b->src_lineno,
user_presentable_path(file).c_str()); user_presentable_path(file).c_str());
} }
else if (is_within_fish_initialization)
{
append_format(buff, _(L"\tcalled during startup\n"));
}
else else
{ {
append_format(buff, append_format(buff, _(L"\tcalled on standard input\n"));
_(L"\tcalled on standard input\n"));
} }
if (b->type() == FUNCTION_CALL) if (b->type() == FUNCTION_CALL)
@@ -1064,15 +1073,17 @@ const wchar_t *parser_t::current_line()
{ {
int prev_width = my_wcswidth(lineinfo.c_str()); int prev_width = my_wcswidth(lineinfo.c_str());
if (file) if (file)
append_format(lineinfo, {
_(L"%ls (line %d): "), append_format(lineinfo, _(L"%ls (line %d): "), file, lineno);
file, }
lineno); else if (is_within_fish_initialization)
{
append_format(lineinfo, L"%ls: ", _(L"Startup"), lineno);
}
else else
append_format(lineinfo, {
L"%ls: ", append_format(lineinfo, L"%ls: ", _(L"Standard input"), lineno);
_(L"Standard input"), }
lineno);
offset = my_wcswidth(lineinfo.c_str()) - prev_width; offset = my_wcswidth(lineinfo.c_str()) - prev_width;
} }
else else

View File

@@ -283,6 +283,9 @@ class parser_t
/** Indication that we should skip all blocks */ /** Indication that we should skip all blocks */
bool cancellation_requested; bool cancellation_requested;
/** Indicates that we are within the process of initializing fish */
bool is_within_fish_initialization;
/** Stack of execution contexts. We own these pointers and must delete them */ /** Stack of execution contexts. We own these pointers and must delete them */
std::vector<parse_execution_context_t *> execution_contexts; std::vector<parse_execution_context_t *> execution_contexts;
@@ -447,6 +450,9 @@ class parser_t
{ {
return my_job_list; return my_job_list;
} }
/* Hackish. In order to correctly report the origin of code with no associated file, we need to know whether it's run during initialization or not. */
void set_is_within_fish_initialization(bool flag);
/** Pushes the block. pop_block will call delete on it. */ /** Pushes the block. pop_block will call delete on it. */
void push_block(block_t *newv); void push_block(block_t *newv);