check_filename(): make verify_filename() callable without dying
Make it possible to invole the logic of verify_filename() to make sure the pathname arguments are unambiguous without actually dying. The caller may want to do something different.
This commit is contained in:
1
cache.h
1
cache.h
@ -396,6 +396,7 @@ extern const char *setup_git_directory_gently(int *);
|
|||||||
extern const char *setup_git_directory(void);
|
extern const char *setup_git_directory(void);
|
||||||
extern const char *prefix_path(const char *prefix, int len, const char *path);
|
extern const char *prefix_path(const char *prefix, int len, const char *path);
|
||||||
extern const char *prefix_filename(const char *prefix, int len, const char *path);
|
extern const char *prefix_filename(const char *prefix, int len, const char *path);
|
||||||
|
extern int check_filename(const char *prefix, const char *name);
|
||||||
extern void verify_filename(const char *prefix, const char *name);
|
extern void verify_filename(const char *prefix, const char *name);
|
||||||
extern void verify_non_filename(const char *prefix, const char *name);
|
extern void verify_non_filename(const char *prefix, const char *name);
|
||||||
|
|
||||||
|
38
setup.c
38
setup.c
@ -61,6 +61,19 @@ const char *prefix_filename(const char *pfx, int pfx_len, const char *arg)
|
|||||||
return path;
|
return path;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int check_filename(const char *prefix, const char *arg)
|
||||||
|
{
|
||||||
|
const char *name;
|
||||||
|
struct stat st;
|
||||||
|
|
||||||
|
name = prefix ? prefix_filename(prefix, strlen(prefix), arg) : arg;
|
||||||
|
if (!lstat(name, &st))
|
||||||
|
return 1; /* file exists */
|
||||||
|
if (errno == ENOENT || errno == ENOTDIR)
|
||||||
|
return 0; /* file does not exist */
|
||||||
|
die_errno("failed to stat '%s'", arg);
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Verify a filename that we got as an argument for a pathspec
|
* Verify a filename that we got as an argument for a pathspec
|
||||||
* entry. Note that a filename that begins with "-" never verifies
|
* entry. Note that a filename that begins with "-" never verifies
|
||||||
@ -70,18 +83,12 @@ const char *prefix_filename(const char *pfx, int pfx_len, const char *arg)
|
|||||||
*/
|
*/
|
||||||
void verify_filename(const char *prefix, const char *arg)
|
void verify_filename(const char *prefix, const char *arg)
|
||||||
{
|
{
|
||||||
const char *name;
|
|
||||||
struct stat st;
|
|
||||||
|
|
||||||
if (*arg == '-')
|
if (*arg == '-')
|
||||||
die("bad flag '%s' used after filename", arg);
|
die("bad flag '%s' used after filename", arg);
|
||||||
name = prefix ? prefix_filename(prefix, strlen(prefix), arg) : arg;
|
if (check_filename(prefix, arg))
|
||||||
if (!lstat(name, &st))
|
|
||||||
return;
|
return;
|
||||||
if (errno == ENOENT)
|
die("ambiguous argument '%s': unknown revision or path not in the working tree.\n"
|
||||||
die("ambiguous argument '%s': unknown revision or path not in the working tree.\n"
|
"Use '--' to separate paths from revisions", arg);
|
||||||
"Use '--' to separate paths from revisions", arg);
|
|
||||||
die_errno("failed to stat '%s'", arg);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -91,19 +98,14 @@ void verify_filename(const char *prefix, const char *arg)
|
|||||||
*/
|
*/
|
||||||
void verify_non_filename(const char *prefix, const char *arg)
|
void verify_non_filename(const char *prefix, const char *arg)
|
||||||
{
|
{
|
||||||
const char *name;
|
|
||||||
struct stat st;
|
|
||||||
|
|
||||||
if (!is_inside_work_tree() || is_inside_git_dir())
|
if (!is_inside_work_tree() || is_inside_git_dir())
|
||||||
return;
|
return;
|
||||||
if (*arg == '-')
|
if (*arg == '-')
|
||||||
return; /* flag */
|
return; /* flag */
|
||||||
name = prefix ? prefix_filename(prefix, strlen(prefix), arg) : arg;
|
if (!check_filename(prefix, arg))
|
||||||
if (!lstat(name, &st))
|
return;
|
||||||
die("ambiguous argument '%s': both revision and filename\n"
|
die("ambiguous argument '%s': both revision and filename\n"
|
||||||
"Use '--' to separate filenames from revisions", arg);
|
"Use '--' to separate filenames from revisions", arg);
|
||||||
if (errno != ENOENT && errno != ENOTDIR)
|
|
||||||
die_errno("failed to stat '%s'", arg);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
const char **get_pathspec(const char *prefix, const char **pathspec)
|
const char **get_pathspec(const char *prefix, const char **pathspec)
|
||||||
|
Reference in New Issue
Block a user