#undef LOG
#define LOG(to_print) CLASS_EMERGENCY_LOG(program_wide_logger::get(), to_print)
-//printf("%s::%s: %s\n", static_class_name(), func, astring(to_print).s())
//////////////
dir_tree_iterator(const filename_tree *initial,
tree::traversal_directions dir)
- : filename_tree::iterator(initial, dir), _current(NIL) {}
+ : filename_tree::iterator(initial, dir), _current(NULL_POINTER) {}
};
//////////////
: _scanned_okay(false),
_path(new astring(path)),
_pattern(new astring(pattern)),
- _real_tree(NIL),
+ _real_tree(NULL_POINTER),
_ignore_files(ignore_files),
_creator(new fname_tree_creator)
{
// and recursively traverse that sub-node also.
const string_array &dirs = curr.directories();
for (int i = 0; i < dirs.length(); i++) {
- filename_tree *new_branch = NIL;
+ filename_tree *new_branch = NULL_POINTER;
astring new_path = path + filename::default_separator() + dirs[i];
#ifdef DEBUG_DIRECTORY_TREE
LOG(astring("seeking path: ") + new_path);
bool directory_tree::reset(const astring &path, const char *pattern)
{
+ FUNCDEF("reset");
_scanned_okay = false;
WHACK(_real_tree);
+// filename temp_path(path);
+// temp_path.canonicalize();
*_path = path;
+//temp_path.raw();
*_pattern = pattern;
_real_tree = new filename_tree;
+#ifdef DEBUG_DIRECTORY_TREE
+ LOG(astring("dirtree::reset to path: ") + path);
+#endif
+
// check that the top-level is healthy.
directory curr(path, "*");
if (!curr.good()) return false;
{
FUNCDEF("jump_to");
string_array pieces;
- filename(sub_path).separate(pieces);
+ bool rooted;
+ filename(sub_path).separate(rooted, pieces);
for (int i = 0; i < pieces.length(); i++) {
filename_tree *curr = dynamic_cast<filename_tree *>(scanning.current());
#ifdef DEBUG_DIRECTORY_TREE
#endif
string_array sub_pieces = pieces.subarray(i, i);
filename curr_path;
- curr_path.join(sub_pieces);
+ curr_path.join(rooted, sub_pieces);
curr_path = filename(curr->_dirname.raw() + filename::default_separator()
+ curr_path.raw());
#ifdef DEBUG_DIRECTORY_TREE
scanning._current = (filename_tree *)scanning.next();
}
// now check that we're healthy.
- if (!scanning._current) return NIL; // all done.
+ if (!scanning._current) return NULL_POINTER; // all done.
// cast the tree to the right type.
return dynamic_cast<filename_tree *>(scanning._current);
filename_list *directory_tree::access(dir_tree_iterator &scanning)
{
filename_tree *tof = goto_current(scanning);
- if (!tof) return NIL;
+ if (!tof) return NULL_POINTER;
return &tof->_files;
}
bool found = false;
// start looking at all the items in the list, even though we might have
// to abandon the iteration if we find a match.
- filename_tree *check = NIL;
+ filename_tree *check = NULL_POINTER;
for (posn = 0; posn < examining.length(); posn++) {
check = examining[posn];
filename current(check->_dirname);
if (!current.is_normal()) {
//#ifdef DEBUG_DIRECTORY_TREE
- LOG(astring("skipping abnormal dir: \"") + current + "\"");
+ LOG(astring("seek: skipping abnormal dir: \"") + current + "\"");
//#endif
continue;
}
break;
}
}
- if (!found) return NIL; // we found nothing comparable.
+ if (!found) return NULL_POINTER; // we found nothing comparable.
// we found a partial match. that means we should start looking at this
// node's children for the exact match.
if (!check) {
// this is a serious logical error!
LOG("serious logical error: tree was not located.");
- return NIL;
+ return NULL_POINTER;
}
examining.reset(); // clear the existing nodes.
for (int i = 0; i < check->branches(); i++)
examining += (filename_tree *)check->branch(i);
}
- return NIL; // we found nothing that looked like that node.
+ return NULL_POINTER; // we found nothing that looked like that node.
}
bool directory_tree::calculate(bool just_size)
bool directory_tree::calculate(filename_tree *start, bool just_size)
{
FUNCDEF("calculate");
+#ifdef DEBUG_DIRECTORY_TREE
+ LOG(astring("calculate: got tree to start with at ") + start->_dirname.raw());
+#endif
dir_tree_iterator *ted = start_at(start, directory_tree::postfix);
// create our iterator to do a postfix traversal. why postfix? well,
// prefix has been used elsewhere and since it doesn't really matter what
while (directory_tree::current_dir(*ted, curr)) {
if (!curr.is_normal()) {
//#ifdef DEBUG_DIRECTORY_TREE
- LOG(astring("skipping abnormal dir: \"") + curr + "\"");
+ LOG(astring("calculate: skipping abnormal dir: \"") + curr + "\"");
//#endif
directory_tree::next(*ted);
continue; // scary non-simple file type.
int source_pieces = 0;
{
string_array temp;
- filename(real_source_start).separate(temp);
+ bool rooted_source;
+ filename(real_source_start).separate(rooted_source, temp);
source_pieces = temp.length();
}
#endif
string_array pieces;
- curr.separate(pieces); // get the components of the current location.
+ bool curr_rooted;
+ curr.separate(curr_rooted, pieces); // get the components of the current location.
#ifdef DEBUG_DIRECTORY_TREE
LOG(astring("name in pieces:") + pieces.text_form());
#endif
// snap the root components out of there.
filename corresponding_name;
- corresponding_name.join(pieces);
+//hmmm: is that right decision?
+ corresponding_name.join(false, pieces);
#ifdef DEBUG_DIRECTORY_TREE
LOG(astring("computed target name as: ") + corresponding_name);
#endif
if (target_start.raw().t()) {
corresponding_name = filename(target_start.raw()
+ filename::default_separator() + corresponding_name.raw());
+/*doesn't help, not right yet. } else {
+ // if they didn't give us a place to start, we start at the top.
+ corresponding_name = filename(target.path()
+ + filename::default_separator() + corresponding_name.raw());
+*/
}
#ifdef DEBUG_DIRECTORY_TREE
LOG(astring("target with start is: ") + corresponding_name);
if (!target_now) {
// that entire sub-tree is missing. add all of the files here into
// the list.
-#ifdef DEBUG_DIRECTORY_TREE
+//#ifdef DEBUG_DIRECTORY_TREE
LOG(astring("could not find dir in target for ") + curr.raw()
+ " which we computed corresp as " + corresponding_name.raw());
-#endif
+//#endif
}
// now scan across all the files that are in our source list.
// break up the path into pieces.
pieces.reset();
- adding.separate(pieces);
+ bool rooted;
+ adding.separate(rooted, pieces);
// break up our root into pieces; we must take off components that are
// already in the root.
string_array root_pieces;
+ bool root_rooted;
filename temp_file(path());
- temp_file.separate(root_pieces);
+ temp_file.separate(root_rooted, root_pieces);
// locate the last place where the path we were given touches our tree.
// it could be totally new, partially new, or already contained.
// find the common root, break up the path into pieces, and tell us where
// we matched.
string_array pieces;
- filename_tree *last_match = NIL;
+ filename_tree *last_match = NULL_POINTER;
int comp_index;
astring reassembled; // this will hold the common root.
outcome ret = find_common_root(new_item, true, last_match, reassembled,
pieces, comp_index);
if (!last_match) {
LOG(astring("serious error finding common root for ") + new_item
- + ", got NIL tree.");
+ + ", got null tree.");
return common::FAILURE; // something serious isn't right.
}
#endif
// handle the case for files now that we have our proper node.
string_array partial_pieces;
- filename(reassembled).separate(partial_pieces);
+ bool partial_rooted;
+ filename(reassembled).separate(partial_rooted, partial_pieces);
int levels_missing = pieces.length() - partial_pieces.length();
// we loop over all the pieces that were missing in between the last
FUNCDEF("remove_path");
// find the common root, if one exists. if not, we're not going to do this.
string_array pieces;
- filename_tree *last_match = NIL;
+ filename_tree *last_match = NULL_POINTER;
int comp_index;
astring reassembled;
outcome ret = find_common_root(zap_item, false, last_match, reassembled,
return common::OKAY;
}
-} //namespace.
+basis::outcome directory_tree::make_directories(const basis::astring new_root)
+{
+ FUNCDEF("make_directories");
+ // iterate down the tree, making all the directories requested.
+ dir_tree_iterator *ted = start(directory_tree::prefix);
+
+ int depth; // current depth in tree.
+ filename curr; // the current path the iterator is at.
+ string_array files; // the filenames held at the iterator.
+
+#ifdef DEBUG_DIRECTORY_TREE
+ LOG(astring("new root is ") + new_root);
+#endif
+ filename old_root = path();
+#ifdef DEBUG_DIRECTORY_TREE
+ LOG(astring("old root was ") + old_root.raw());
+#endif
+
+ while (current(*ted, curr, files)) {
+ // we have a good directory to show.
+ directory_tree::depth(*ted, depth);
+ int found = curr.find(old_root);
+ if (found < common::OKAY) {
+ LOG(astring("failed to find prefix of path '") + old_root
+ + "' in the current directory '" + curr + "'");
+ return found;
+ }
+ curr = curr.substring(found + old_root.length(), curr.end());
+//LOG(astring("curr now is: ") + curr);
+ filename dir_to_make(new_root + "/" + curr);
+#ifdef DEBUG_DIRECTORY_TREE
+ LOG(astring("creating dir: ") + dir_to_make.raw());
+#endif
+ directory::recursive_create(dir_to_make.raw());
+ next(*ted);
+ }
+ throw_out(ted);
+ return common::OKAY;
+}
+
+} //namespace.