def process_files_in_dir(bundle, dir_name, parent_dir): """ Go through all the subdirectories and files (in that order) in this directory. """ dir_contents = [os.path.join(dir_name, f) for f in os.listdir(dir_name)] dirs = filter(os.path.isdir, dir_contents) files = filter(os.path.isfile, dir_contents) for file_path in sorted(dirs) + sorted(files): filename = os.path.basename(file_path) full_path = file_path[len(bundle.get_temp_path()) + 1:] bundle_file = BundleFile(bundle=bundle, name=filename, parent=parent_dir, full_path=full_path, version=bundle.latest_version) if file_path in files: is_desc = False bundle_file.is_dir = False bundle_file.file_size = os.path.getsize(file_path) # Only highlight the file contents if it's plain text mime_type = magic.from_file(file_path, mime=True) if mime_type.startswith('text/') or mime_type in text_mimetypes: with open(file_path, 'rt') as file: # Store the contents of the file in the code field bundle_file.save_file_contents(file) # DESCRIPTION file should be at most 1 level deep single_parent = (parent_dir is not None or '/' not in parent_dir) is_desc = single_parent and filename == 'DESCRIPTION' # Check if this is the description file (if no description exists) if bundle.octave_format and bundle.description == '' and is_desc: bundle.description_file = bundle_file bundle.save() bundle_file.save() else: # It's a directory - call this function on it recursively bundle_file.is_dir = True bundle_file.save() process_files_in_dir(bundle, file_path, bundle_file)