Revive vim_fname (-> os_file_exists); fix misuse of mch_getperm.

* Move vim_fname from misc1 to os/fs:os_file_exists.
* Add unit tests for os_file_exists.
* Replace misuse of mch_getperm with os_file_exists.
This commit is contained in:
Thomas Wienecke
2014-03-14 22:55:14 +01:00
committed by Thiago de Arruda
parent c83e8b4dc7
commit 1949acc806
14 changed files with 51 additions and 37 deletions

View File

@@ -2310,7 +2310,7 @@ check_overwrite (
|| (buf->b_flags & BF_READERR))
&& !p_wa
&& !bt_nofile(buf)
&& vim_fexists(ffname)) {
&& os_file_exists(ffname)) {
if (!eap->forceit && !eap->append) {
#ifdef UNIX
/* with UNIX it is possible to open a directory */
@@ -2336,7 +2336,6 @@ check_overwrite (
if (other && !emsg_silent) {
char_u *dir;
char_u *p;
int r;
char_u *swapname;
/* We only try the first entry in 'directory', without checking if
@@ -2358,8 +2357,7 @@ check_overwrite (
}
swapname = makeswapname(fname, ffname, curbuf, dir);
vim_free(dir);
r = vim_fexists(swapname);
if (r) {
if (os_file_exists(swapname)) {
if (p_confirm || cmdmod.confirm) {
char_u buff[DIALOG_MSG_SIZE];

View File

@@ -7424,7 +7424,7 @@ open_exfile (
return NULL;
}
#endif
if (!forceit && *mode != 'a' && vim_fexists(fname)) {
if (!forceit && *mode != 'a' && os_file_exists(fname)) {
EMSG2(_("E189: \"%s\" exists (add ! to override)"), fname);
return NULL;
}

View File

@@ -837,7 +837,7 @@ char_u *vim_findfile(void *search_ctx_arg)
for (;; ) {
/* if file exists and we didn't already find it */
if ((path_with_url(file_path)
|| (mch_getperm(file_path) >= 0
|| (os_file_exists(file_path)
&& (search_ctx->ffsc_find_what
== FINDFILE_BOTH
|| ((search_ctx->ffsc_find_what
@@ -1513,7 +1513,7 @@ find_file_in_path_option (
buf = suffixes;
for (;; ) {
if (
(mch_getperm(NameBuff) >= 0
(os_file_exists(NameBuff)
&& (find_what == FINDFILE_BOTH
|| ((find_what == FINDFILE_DIR)
== mch_isdir(NameBuff))))) {

View File

@@ -3324,12 +3324,12 @@ nobackup:
* delete an existing one, try to use another name.
* Change one character, just before the extension.
*/
if (!p_bk && mch_getperm(backup) >= 0) {
if (!p_bk && os_file_exists(backup)) {
p = backup + STRLEN(backup) - 1 - STRLEN(backup_ext);
if (p < backup) /* empty file name ??? */
p = backup;
*p = 'z';
while (*p > 'a' && mch_getperm(backup) >= 0)
while (*p > 'a' && os_file_exists(backup))
--*p;
/* They all exist??? Must be something wrong! */
if (*p == 'a') {
@@ -5497,7 +5497,7 @@ buf_check_timestamp (
}
} else if ((buf->b_flags & BF_NEW) && !(buf->b_flags & BF_NEW_W)
&& vim_fexists(buf->b_ffname)) {
&& os_file_exists(buf->b_ffname)) {
retval = 1;
mesg = _("W13: Warning: File \"%s\" has been created after editing started");
buf->b_flags |= BF_NEW_W;

View File

@@ -3636,7 +3636,7 @@ findswapname (
* check below for a 8.3 file name is used.
*/
if (!(buf->b_p_sn || buf->b_shortname) && buf_fname != NULL
&& mch_getperm(buf_fname) < 0)
&& !os_file_exists(buf_fname))
dummyfd = mch_fopen((char *)buf_fname, "w");
#endif
@@ -3753,7 +3753,7 @@ findswapname (
/*
* check if the swapfile already exists
*/
if (mch_getperm(fname) < 0) { /* it does not exist */
if (!os_file_exists(fname)) { /* it does not exist */
#ifdef HAVE_LSTAT
struct stat sb;
@@ -3961,7 +3961,7 @@ findswapname (
}
/* If the file was deleted this fname can be used. */
if (mch_getperm(fname) < 0)
if (!os_file_exists(fname))
break;
} else
#endif

View File

@@ -3827,18 +3827,6 @@ void preserve_exit(void) {
getout(1);
}
/*
* return TRUE if "fname" exists.
*/
int vim_fexists(char_u *fname)
{
struct stat st;
if (mch_stat((char *)fname, &st))
return FALSE;
return TRUE;
}
/*
* Check for CTRL-C pressed, but only once in a while.
* Should be used instead of ui_breakcheck() for functions that check for
@@ -4196,7 +4184,7 @@ unix_expandpath (
/* remove backslashes for the remaining components only */
if (*path_end != NUL)
backslash_halve(buf + len + 1);
if (mch_getperm(buf) >= 0) { /* add existing file */
if (os_file_exists(buf)) { /* add existing file */
#ifdef MACOS_CONVERT
size_t precomp_len = STRLEN(buf)+1;
char_u *precomp_buf =
@@ -4782,7 +4770,7 @@ gen_expand_wildcards (
* "vim c:/" work. */
if (flags & EW_NOTFOUND)
addfile(&ga, t, flags | EW_DIR | EW_FILE);
else if (mch_getperm(t) >= 0)
else if (os_file_exists(t))
addfile(&ga, t, flags);
vim_free(t);
}
@@ -4884,7 +4872,7 @@ addfile (
int isdir;
/* if the file/dir doesn't exist, may not add it */
if (!(flags & EW_NOTFOUND) && mch_getperm(f) < 0)
if (!(flags & EW_NOTFOUND) && !os_file_exists(f))
return;
#ifdef FNAME_ILLEGAL

View File

@@ -81,7 +81,6 @@ void add_pathsep(char_u *p);
char_u *FullName_save(char_u *fname, int force);
void prepare_to_exit(void);
void preserve_exit(void);
int vim_fexists(char_u *fname);
void line_breakcheck(void);
void fast_breakcheck(void);
int expand_wildcards_eval(char_u **pat, int *num_file, char_u ***file,

View File

@@ -315,3 +315,20 @@ int mch_setperm(const char_u *name, int perm)
return OK;
}
}
/*
* return TRUE if "name" exists.
*/
int os_file_exists(char_u *name)
{
uv_fs_t request;
int result = uv_fs_stat(uv_default_loop(), &request, (const char*) name, NULL);
uv_fs_req_cleanup(&request);
if (result != 0) {
return FALSE;
} else {
return TRUE;
}
}

View File

@@ -19,5 +19,6 @@ int mch_get_uname(uid_t uid, char *s, size_t len);
char *mch_get_user_directory(const char *name);
long mch_getperm(const char_u *name);
int mch_setperm(const char_u *name, int perm);
int os_file_exists(char_u *name);
#endif

View File

@@ -3063,7 +3063,7 @@ int flags; /* EW_* flags */
*/
for (j = 0, i = 0; i < *num_file; ++i) {
/* Require the files to exist. Helps when using /bin/sh */
if (!(flags & EW_NOTFOUND) && mch_getperm((*file)[i]) < 0)
if (!(flags & EW_NOTFOUND) && !os_file_exists((*file)[i]))
continue;
/* check if this entry should be included */

View File

@@ -615,7 +615,7 @@ restofline:
*regmatch.endp[i] = c;
if (vim_strchr((char_u *)"OPQ", idx) != NULL
&& mch_getperm(namebuf) == -1)
&& !os_file_exists(namebuf))
continue;
}
if ((i = (int)fmt_ptr->addr[1]) > 0) { /* %n */
@@ -750,7 +750,7 @@ restofline:
} else if (vim_strchr((char_u *)"OPQ", idx) != NULL) {
/* global file names */
valid = FALSE;
if (*namebuf == NUL || mch_getperm(namebuf) >= 0) {
if (*namebuf == NUL || os_file_exists(namebuf)) {
if (*namebuf && idx == 'P')
currfile = qf_push_dir(namebuf, &file_stack);
else if (idx == 'Q')
@@ -1131,7 +1131,7 @@ static int qf_get_fnum(char_u *directory, char_u *fname)
* "leaving directory"-messages we might have missed a
* directory change.
*/
if (mch_getperm(ptr) < 0) {
if (!os_file_exists(ptr)) {
vim_free(ptr);
directory = qf_guess_filepath(fname);
if (directory)
@@ -1289,7 +1289,7 @@ static char_u *qf_guess_filepath(char_u *filename)
/* If concat_fnames failed, just go on. The worst thing that can happen
* is that we delete the entire stack.
*/
if ((fullname != NULL) && (mch_getperm(fullname) >= 0))
if (fullname != NULL && os_file_exists(fullname))
break;
ds_ptr = ds_ptr->next;
@@ -2609,7 +2609,7 @@ static char_u *get_mef_name(void) {
STRCPY(name, p_mef);
sprintf((char *)name + (p - p_mef), "%d%d", start, off);
STRCAT(name, p + 2);
if (mch_getperm(name) < 0
if (!os_file_exists(name)
#ifdef HAVE_LSTAT
/* Don't accept a symbolic link, its a security risk. */
&& mch_lstat((char *)name, &sb) < 0

View File

@@ -2450,7 +2450,7 @@ jumpto_tag (
* file. Also accept a file name for which there is a matching BufReadCmd
* autocommand event (e.g., http://sys/file).
*/
if (mch_getperm(fname) < 0
if (!os_file_exists(fname)
&& !has_autocmd(EVENT_BUFREADCMD, fname, NULL)
) {
retval = NOTAGFILE;

View File

@@ -1173,7 +1173,7 @@ void u_write_undo(char_u *name, int forceit, buf_T *buf, char_u *hash)
/* If the undo file already exists, verify that it actually is an undo
* file, and delete it. */
if (mch_getperm(file_name) >= 0) {
if (os_file_exists(file_name)) {
if (name == NULL || !forceit) {
/* Check we can read it and it's an undo file. */
fd = mch_open((char *)file_name, O_RDONLY|O_EXTRA, 0);

View File

@@ -18,6 +18,7 @@ int is_executable(char_u *name);
int mch_can_exe(char_u *name);
long mch_getperm(char_u *name);
int mch_setperm(char_u *name, long perm);
int os_file_exists(const char_u *name);
]]
-- import constants parsed by ffi
@@ -320,3 +321,13 @@ describe 'fs function', ->
it 'fails if given file does not exist', ->
perm = ffi.C.kS_IXUSR
eq FAIL, (mch_setperm 'non-existing-file', perm)
describe 'os_file_exists', ->
os_file_exists = (filename) ->
fs.os_file_exists (to_cstr filename)
it 'returns FALSE when given a non-existing file', ->
eq FALSE, (os_file_exists 'non-existing-file')
it 'returns TRUE when given an existing file', ->
eq TRUE, (os_file_exists 'unit-test-directory/test.file')