Revision: 78165
http://sourceforge.net/p/brlcad/code/78165
Author: starseeker
Date: 2021-02-02 14:50:04 +0000 (Tue, 02 Feb 2021)
Log Message:
-----------
report full path for validation failures to provide more context
Modified Paths:
--------------
brlcad/trunk/src/libged/npush/npush.cpp
Modified: brlcad/trunk/src/libged/npush/npush.cpp
===================================================================
--- brlcad/trunk/src/libged/npush/npush.cpp 2021-02-02 14:30:16 UTC (rev
78164)
+++ brlcad/trunk/src/libged/npush/npush.cpp 2021-02-02 14:50:04 UTC (rev
78165)
@@ -158,6 +158,7 @@
std::set<std::string> target_objs;
std::set<std::string> initial_missing;
bool final_check = false;
+ std::string msgs;
/* User-supplied flags controlling tree walking behavior */
int max_depth = 0;
@@ -234,11 +235,12 @@
* do a more comprehensive review if that proves worthwhile. */
static void
validate_walk(struct db_i *dbip,
- struct directory *dp,
+ struct db_full_path *dfp,
void *client_data);
static void
validate_walk_subtree(struct db_i *dbip,
+ struct db_full_path *dfp,
union tree *tp,
void *client_data)
{
@@ -269,18 +271,29 @@
return;
}
+ db_add_node_to_full_path(dfp, dp);
+
if (!s->final_check) {
if (s->target_objs.find(std::string(dp->d_namep)) !=
s->target_objs.end()) {
s->valid_push = false;
+ char *ps = db_path_to_string(dfp);
+ std::string msg = std::string(ps) + std::string(": top
level push object ") + std::string(dp->d_namep) + std::string(" is below top
level object ") + std::string(dfp->fp_names[0]->d_namep) + std::string("\n");
+ s->msgs = msg;
s->problem_obj = std::string(dp->d_namep);
+ bu_free(ps, "path string");
+ DB_FULL_PATH_POP(dfp);
return;
}
}
if (!(dp->d_flags & RT_DIR_COMB)) {
+ DB_FULL_PATH_POP(dfp);
return;
}
- validate_walk(dbip, dp, client_data);
+
+ validate_walk(dbip, dfp, client_data);
+
+ DB_FULL_PATH_POP(dfp);
break;
case OP_UNION:
@@ -287,8 +300,8 @@
case OP_INTERSECT:
case OP_SUBTRACT:
case OP_XOR:
- validate_walk_subtree(dbip, tp->tr_b.tb_left, client_data);
- validate_walk_subtree(dbip, tp->tr_b.tb_right, client_data);
+ validate_walk_subtree(dbip, dfp, tp->tr_b.tb_left, client_data);
+ validate_walk_subtree(dbip, dfp, tp->tr_b.tb_right, client_data);
break;
default:
bu_log("validate_walk_subtree: unrecognized operator %d\n",
tp->tr_op);
@@ -298,25 +311,25 @@
static void
validate_walk(struct db_i *dbip,
- struct directory *dp,
+ struct db_full_path *dfp,
void *client_data)
{
struct push_state *s = (struct push_state *)client_data;
RT_CK_DBI(dbip);
- if (!dp || !s->valid_push)
+ if (!dfp || !s->valid_push)
return; /* nothing to do */
- if (dp->d_flags & RT_DIR_COMB) {
+ if (DB_FULL_PATH_CUR_DIR(dfp)->d_flags & RT_DIR_COMB) {
struct rt_db_internal in;
struct rt_comb_internal *comb;
- if (rt_db_get_internal5(&in, dp, dbip, NULL, &rt_uniresource) < 0)
+ if (rt_db_get_internal5(&in, DB_FULL_PATH_CUR_DIR(dfp), dbip, NULL,
&rt_uniresource) < 0)
return;
comb = (struct rt_comb_internal *)in.idb_ptr;
- validate_walk_subtree(dbip, comb->tree, client_data);
+ validate_walk_subtree(dbip, dfp, comb->tree, client_data);
rt_db_free_internal(&in);
}
@@ -904,15 +917,25 @@
std::set<std::string>::iterator s_it;
for (s_it = s.target_objs.begin(); s_it != s.target_objs.end(); s_it++) {
struct directory *dp = db_lookup(dbip, s_it->c_str(), LOOKUP_NOISY);
- validate_walk(dbip, dp, &s);
+ if (dp == RT_DIR_NULL) {
+ return GED_ERROR;
+ }
+ struct db_full_path *dfp;
+ BU_GET(dfp, struct db_full_path);
+ db_full_path_init(dfp);
+ db_add_node_to_full_path(dfp, dp);
+ validate_walk(dbip, dfp, &s);
if (!s.valid_push) {
+ bu_vls_printf(gedp->ged_result_str, "%s", s.msgs.c_str());
if (BU_STR_EQUAL(dp->d_namep, s.problem_obj.c_str())) {
- bu_vls_printf(gedp->ged_result_str, "cyclic path found: %s is
below %s", dp->d_namep, s.problem_obj.c_str());
- } else {
- bu_vls_printf(gedp->ged_result_str, "%s has another specified
target object (%s), below it.", dp->d_namep, s.problem_obj.c_str());
+ bu_vls_printf(gedp->ged_result_str, "NOTE: cyclic path found:
%s is below itself", dp->d_namep);
}
+ db_free_full_path(dfp);
+ BU_PUT(dfp, struct db_full_path);
return GED_ERROR;
}
+ db_free_full_path(dfp);
+ BU_PUT(dfp, struct db_full_path);
}
// Build an initial list of tops objects in the .g file. Push operations
@@ -1216,7 +1239,13 @@
s.final_check = true;
for (s_it = s.target_objs.begin(); s_it != s.target_objs.end(); s_it++) {
struct directory *dp = db_lookup(dbip, s_it->c_str(), LOOKUP_NOISY);
- validate_walk(dbip, dp, &s);
+ struct db_full_path *dfp;
+ BU_GET(dfp, struct db_full_path);
+ db_full_path_init(dfp);
+ db_add_node_to_full_path(dfp, dp);
+ validate_walk(dbip, dfp, &s);
+ db_free_full_path(dfp);
+ BU_PUT(dfp, struct db_full_path);
}
if (!s.valid_push) {
bu_vls_printf(gedp->ged_result_str, "failed to generate one or more
objects listed in pushed trees.");
This was sent by the SourceForge.net collaborative development platform, the
world's largest Open Source development site.
_______________________________________________
BRL-CAD Source Commits mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/brlcad-commits