static void load_view_pair(const char left_path[], const char right_path[]) { char path[PATH_MAX + 1]; make_abs_path(path, sizeof(path), left_path, "", cwd); to_canonic_path(path, "", lwin.curr_dir, sizeof(lwin.curr_dir)); populate_dir_list(&lwin, 0); make_abs_path(path, sizeof(path), right_path, "", cwd); to_canonic_path(path, "", rwin.curr_dir, sizeof(rwin.curr_dir)); populate_dir_list(&rwin, 0); }
TEST(symlinks_in_paths_are_not_resolved, IF(not_windows)) { char canonic_path[PATH_MAX + 1]; char buf[PATH_MAX + 1]; assert_success(os_mkdir(SANDBOX_PATH "/dir1", 0700)); assert_success(os_mkdir(SANDBOX_PATH "/dir1/dir2", 0700)); /* symlink() is not available on Windows, but the rest of the code is fine. */ #ifndef _WIN32 { char src[PATH_MAX + 1], dst[PATH_MAX + 1]; make_abs_path(src, sizeof(src), SANDBOX_PATH, "dir1/dir2", saved_cwd); make_abs_path(dst, sizeof(dst), SANDBOX_PATH, "dir-link", saved_cwd); assert_success(symlink(src, dst)); } #endif assert_success(chdir(SANDBOX_PATH "/dir-link")); make_abs_path(buf, sizeof(buf), SANDBOX_PATH, "dir-link", saved_cwd); to_canonic_path(buf, "/fake-root", lwin.curr_dir, sizeof(lwin.curr_dir)); to_canonic_path(sandbox, "/fake-root", canonic_path, sizeof(canonic_path)); /* :mkdir */ (void)exec_commands("mkdir ../dir", &lwin, CIT_COMMAND); restore_cwd(saved_cwd); saved_cwd = save_cwd(); assert_success(rmdir(SANDBOX_PATH "/dir")); /* :clone file name. */ create_file(SANDBOX_PATH "/dir-link/file"); populate_dir_list(&lwin, 1); (void)exec_commands("clone ../file-clone", &lwin, CIT_COMMAND); restore_cwd(saved_cwd); saved_cwd = save_cwd(); assert_success(remove(SANDBOX_PATH "/file-clone")); assert_success(remove(SANDBOX_PATH "/dir-link/file")); /* :colorscheme */ make_abs_path(cfg.colors_dir, sizeof(cfg.colors_dir), TEST_DATA_PATH, "scripts/", saved_cwd); snprintf(buf, sizeof(buf), "colorscheme set-env %s/../dir-link/..", sandbox); assert_success(exec_commands(buf, &lwin, CIT_COMMAND)); cs_load_defaults(); /* :cd */ assert_success(exec_commands("cd ../dir-link/..", &lwin, CIT_COMMAND)); assert_string_equal(canonic_path, lwin.curr_dir); restore_cwd(saved_cwd); saved_cwd = save_cwd(); assert_success(remove(SANDBOX_PATH "/dir-link")); assert_success(rmdir(SANDBOX_PATH "/dir1/dir2")); assert_success(rmdir(SANDBOX_PATH "/dir1")); }
SETUP() { view_setup(&lwin); assert_success(chdir(TEST_DATA_PATH "/read")); assert_non_null(get_cwd(lwin.curr_dir, sizeof(lwin.curr_dir))); lwin.sort[0] = SK_BY_NAME; memset(&lwin.sort[1], SK_NONE, sizeof(lwin.sort) - 1); populate_dir_list(&lwin, 0); }
/* Clones one view into another. Path specifies location of active pane and can * be NULL. The destination view is assumed to not own any resources. */ static void clone_view(view_t *dst, view_t *src, const char path[]) { strcpy(dst->curr_dir, path == NULL ? flist_get_dir(src) : path); dst->timestamps_mutex = src->timestamps_mutex; dst->win = src->win; dst->title = src->title; flist_init_view(dst); dst->dir_entry[0].origin = src->curr_dir; clone_local_options(src, dst, 1); matcher_free(dst->manual_filter); dst->manual_filter = matcher_clone(src->manual_filter); filter_assign(&dst->auto_filter, &src->auto_filter); dst->prev_invert = src->prev_invert; dst->invert = src->invert; /* Clone current entry even though we populate file list later to give * reloading reference point for cursor. */ replace_dir_entries(dst, &dst->dir_entry, &dst->list_rows, get_current_entry(src), 1); dst->list_pos = 0; /* Clone viewport configuration. */ dst->curr_line = src->curr_line; dst->top_line = src->top_line; dst->window_rows = src->window_rows; dst->window_cols = src->window_cols; dst->window_cells = src->window_cells; flist_hist_resize(dst, cfg.history_len); flist_hist_clone(dst, src); if(path != NULL && !flist_custom_active(src)) { /* Record location we're leaving. */ flist_hist_save(dst, src->curr_dir, get_current_file_name(src), src->list_pos - src->top_line); } (void)populate_dir_list(dst, path == NULL); /* XXX: do we need to update origins or is this a leftover from before list * population was introduced? */ flist_update_origins(dst, &dst->curr_dir[0], &src->curr_dir[0]); /* Record new location. */ flist_hist_save(dst, NULL, NULL, -1); }
TEST(rename_to_broken_symlink_name, IF(not_windows)) { /* symlink() is not available on Windows, but the rest of the code is fine. */ #ifndef _WIN32 assert_success(symlink("no-such-file", SANDBOX_PATH "/broken-link")); #endif create_empty_file(SANDBOX_PATH "/a-file"); populate_dir_list(&lwin, 0); lwin.list_pos = 0; fops_init(&broken_link_name, NULL); fops_rename_current(&lwin, 0); assert_success(unlink(SANDBOX_PATH "/a-file")); assert_success(unlink(SANDBOX_PATH "/broken-link")); }
/* Loads full list of files into unfiltered list of the view. Returns position * of file under cursor in the unfiltered list. */ static int load_unfiltered_list(view_t *view) { int current_file_pos = view->list_pos; view->local_filter.in_progress = 1; view->local_filter.saved = strdup(view->local_filter.filter.raw); if(list_is_incomplete(view)) { char full_path[PATH_MAX + 1]; dir_entry_t *entry; get_current_full_path(view, sizeof(full_path), full_path); filter_clear(&view->local_filter.filter); (void)populate_dir_list(view, 1); /* Resolve current file position in updated list. */ entry = entry_from_path(view, view->dir_entry, view->list_rows, full_path); if(entry != NULL) { current_file_pos = entry_to_pos(view, entry); } if(current_file_pos >= view->list_rows) { current_file_pos = view->list_rows - 1; } } else { /* Save unfiltered (by local filter) list for further use. */ replace_dir_entries(view, &view->local_filter.entries, &view->local_filter.entry_count, view->dir_entry, view->list_rows); } view->local_filter.unfiltered = view->dir_entry; view->local_filter.unfiltered_count = view->list_rows; view->local_filter.prefiltered_count = view->filtered; view->dir_entry = NULL; return current_file_pos; }
int ensure_file_is_selected(FileView *view, const char name[]) { int file_pos; char nm[NAME_MAX]; /* Don't reset filters to find "file with empty name". */ if(name[0] == '\0') { return 0; } /* This is for compatibility with paths loaded from vifminfo that have * trailing slash. */ copy_str(nm, sizeof(nm), name); chosp(nm); file_pos = find_file_pos_in_list(view, nm); if(file_pos < 0 && file_can_be_displayed(view->curr_dir, nm)) { if(nm[0] == '.') { set_dot_files_visible(view, 1); file_pos = find_file_pos_in_list(view, nm); } if(file_pos < 0) { remove_filename_filter(view); /* remove_filename_filter() postpones list of files reloading. */ populate_dir_list(view, 1); file_pos = find_file_pos_in_list(view, nm); } } flist_set_pos(view, (file_pos < 0) ? 0 : file_pos); return file_pos >= 0; }
SETUP() { char cwd[PATH_MAX]; assert_success(chdir(SANDBOX_PATH)); assert_true(get_cwd(cwd, sizeof(cwd)) == cwd); copy_str(view->curr_dir, sizeof(view->curr_dir), cwd); assert_success(os_mkdir("0", 0000)); assert_success(os_mkdir("1", 0000)); assert_success(os_mkdir("2", 0000)); assert_success(os_mkdir("3", 0000)); filter_init(&view->local_filter.filter, 1); filter_init(&view->manual_filter, 1); filter_init(&view->auto_filter, 1); view->sort[0] = SK_BY_NAME; memset(&view->sort[1], SK_NONE, sizeof(view->sort) - 1); view->dir_entry = NULL; view->list_rows = 0; populate_dir_list(view, 0); }
/* Clones one view into another. The destination view is assumed to not own any * resources. */ static void clone_view(view_t *dst, view_t *src) { strcpy(dst->curr_dir, flist_get_dir(src)); dst->timestamps_mutex = src->timestamps_mutex; dst->win = src->win; dst->title = src->title; flist_init_view(dst); dst->dir_entry[0].origin = src->curr_dir; clone_local_options(src, dst, 1); matcher_free(dst->manual_filter); dst->manual_filter = matcher_clone(src->manual_filter); filter_assign(&dst->auto_filter, &src->auto_filter); dst->prev_invert = src->prev_invert; dst->invert = src->invert; /* Clone current entry even though we populate file list later to give * reloading reference point for cursor. */ replace_dir_entries(dst, &dst->dir_entry, &dst->list_rows, get_current_entry(src), 1); dst->list_pos = 0; /* Clone viewport configuration. */ dst->curr_line = src->curr_line; dst->top_line = src->top_line; dst->window_rows = src->window_rows; dst->window_cols = src->window_cols; dst->window_cells = src->window_cells; flist_hist_resize(dst, cfg.history_len); flist_hist_clone(dst, src); (void)populate_dir_list(dst, 1); flist_update_origins(dst, &dst->curr_dir[0], &src->curr_dir[0]); }