ad_find_all_files

one of the documented procedures in this installation of the ACS
Usage:
ad_find_all_files { -include_backup 0 -include_dirs 0 -max_depth 10 } path
What it does:
Returns a list of full paths to all files under $path in the directory tree (descending the tree to a depth of up to $max_depth). Includes backup files only if $include_backup is true; includes directories in the returned list only if $include_dirs is true. Ignores all files for which apm_ignore_file_p returns true. Clients should not depend on the order of files returned.
Defined in: /web/philip/packages/acs-core/apm-procs.tcl

Source code:

arg_parser_for_ad_find_all_files $args

    # Use the examined_files array to track files that we've examined.
    array set examined_files [list]

    # A list of files that we will return (in the order in which we
    # examined them).
    set files [list]

    # A list of files that we still need to examine.
    set files_to_examine [list $path]

    # Perform a breadth-first search of the file tree. For each level,
    # examine files in $files_to_examine; if we encounter any directories,
    # add contained files to $new_files_to_examine (which will become
    # $files_to_examine in the next iteration).
    while { [incr max_depth -1] > 0 && [llength $files_to_examine] != 0 } {
	set new_files_to_examine [list]
	foreach file $files_to_examine {
	    # Only examine the file if we haven't already. (This is just a safeguard
	    # in case, e.g., Tcl decides to play funny games with symbolic links so
	    # we end up encountering the same file twice.)
	    if { ![info exists examined_files($file)] } {
		# Remember that we've examined the file.
		set examined_files($file) 1

		# If (a) we shouldn't ignore the file, and (b) either it's not a
		# backup file or we specifically want to include backup files in
		# our list...
		if { ![apm_ignore_file_p $file] &&  ($include_backup == 1 || ![apm_backup_file_p $file]) } {
		    # If it's a file, add to our list. If it's a
		    # directory, add its contents to our list of files to
		    # examine next time.
		    if { [file isfile $file] } {
			lappend files $file
		    } elseif { [file isdirectory $file] } {
			if { $include_dirs == 1 } {
			    lappend files $file
			}
			set new_files_to_examine [concat $new_files_to_examine [glob -nocomplain "$file/*"]]
		    }
		}
	    }
	}
	set files_to_examine $new_files_to_examine
    }
    return $files


philg@mit.edu