#include <basis/functions.h>
#include <basis/contracts.h>
+#include <loggers/program_wide_logger.h>
#include <structures/object_packers.h>
#include <structures/string_array.h>
#include <textual/parser_bits.h>
#include <stdio.h>
using namespace basis;
-using namespace structures;
+using namespace loggers;
using namespace nodes;
+using namespace structures;
using namespace textual;
//#define DEBUG_DIRECTORY_TREE
// uncomment for noisier version.
#undef LOG
-#define LOG(to_print) printf("%s::%s: %s\n", static_class_name(), func, astring(to_print).s())
-//CLASS_EMERGENCY_LOG(program_wide_logger::get(), s)
+#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())
//////////////
void directory_tree::traverse(const astring &path, const char *pattern,
filename_tree &add_to)
{
-#ifdef DEBUG_DIRECTORY_TREE
FUNCDEF("traverse");
-#endif
// prepare the current node.
add_to._dirname = filename(path, astring::empty_string());
add_to._files.reset();
#ifdef DEBUG_DIRECTORY_TREE
- LOG(astring("working on node ") + add_to._dirname.raw());
+ LOG(astring("working on node ") + add_to._dirname);
#endif
// open the directory.
#ifdef DEBUG_DIRECTORY_TREE
LOG(astring("seeking path: ") + new_path);
#endif
+ if (!filename(new_path).is_normal()) {
+//#ifdef DEBUG_DIRECTORY_TREE
+ LOG(astring("bailing on weird dir: ") + new_path);
+//#endif
+ continue; // only regular directories please.
+ }
for (int q = 0; q < add_to.branches(); q++) {
filename_tree *curr_kid = (filename_tree *)add_to.branch(q);
#ifdef DEBUG_DIRECTORY_TREE
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;
+LOG(astring("dirtree::reset to path: ") + path);
+
// check that the top-level is healthy.
directory curr(path, "*");
if (!curr.good()) return false;
bool directory_tree::jump_to(dir_tree_iterator &scanning,
const astring &sub_path)
{
-#ifdef DEBUG_DIRECTORY_TREE
FUNCDEF("jump_to");
-#endif
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
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 + "\"");
+//#endif
+ continue;
+ }
#ifdef DEBUG_DIRECTORY_TREE
LOG(astring("looking at ") + current.raw());
#endif
filename_list *files; // the filenames held at the iterator.
while (directory_tree::current_dir(*ted, curr)) {
+ if (!curr.is_normal()) {
+//#ifdef DEBUG_DIRECTORY_TREE
+ LOG(astring("skipping abnormal dir: \"") + curr + "\"");
+//#endif
+ directory_tree::next(*ted);
+ continue; // scary non-simple file type.
+ }
// we have a good directory to show.
#ifdef DEBUG_DIRECTORY_TREE
LOG(astring("calcing node ") + curr.raw());
files = directory_tree::access(*ted);
directory_tree::depth(*ted, depth);
for (int i = 0; i < files->elements(); i++) {
+ filename curr_file = curr + "/" + *files->borrow(i);
+#ifdef DEBUG_DIRECTORY_TREE
+ LOG(astring("got a curr file: ") + curr_file);
+#endif
+ if (!curr_file.is_normal()) {
+//#ifdef DEBUG_DIRECTORY_TREE
+ LOG(astring("skipping abnormal file: \"") + curr + "\"");
+//#endif
+ continue;
+ }
if (!files->borrow(i)->calculate(curr.raw(), just_size)) {
LOG(astring("failure to calculate ") + files->get(i)->text_form());
}
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 // there was no node, so we're adding everything...
|| !target_now->_files.member_with_state(*files[i], how_compare) ) {
// ... or we need to add this file since it's missing.
-
#ifdef DEBUG_DIRECTORY_TREE
LOG(astring("adding record: ") + files[i]->text_form());
#endif
filename_tree * &found, astring &reassembled, string_array &pieces,
int &match_place)
{
-#ifdef DEBUG_DIRECTORY_TREE
FUNCDEF("find_common_root");
-#endif
// test the path to find what it is.
filename adding(finding);
if (exists && !adding.good())
// 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.
filename adding(new_item);
if (!adding.good()) {
LOG(astring("non-existent new item! ") + new_item);
+ return common::NOT_FOUND; // not an existing path.
+ }
+ if (!adding.is_normal()) {
+//#ifdef DEBUG_DIRECTORY_TREE
+ LOG(astring("abnormal new item: ") + new_item);
+//#endif
return common::BAD_INPUT; // not a good path.
}
int file_subtract = 0; // if it's a file, then we remove last component.
if (!adding.is_directory()) file_subtract = 1;
#ifdef DEBUG_DIRECTORY_TREE
- if (file_subtract) LOG(astring("adding a file ") + new_item)
- else LOG(astring("adding a directory ") + new_item);
+ if (file_subtract) { LOG(astring("adding a file ") + new_item); }
+ else { LOG(astring("adding a directory ") + new_item); }
#endif
// find the common root, break up the path into pieces, and tell us where
#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
outcome directory_tree::remove_path(const astring &zap_item)
{
-#ifdef DEBUG_DIRECTORY_TREE
FUNCDEF("remove_path");
-#endif
// find the common root, if one exists. if not, we're not going to do this.
string_array pieces;
filename_tree *last_match = NIL;