Skip to content

Commit c6e8c80

Browse files
committed
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.
1 parent ad12b81 commit c6e8c80

File tree

2 files changed

+21
-18
lines changed

2 files changed

+21
-18
lines changed

cache.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -396,6 +396,7 @@ extern const char *setup_git_directory_gently(int *);
396396
extern const char *setup_git_directory(void);
397397
extern const char *prefix_path(const char *prefix, int len, const char *path);
398398
extern const char *prefix_filename(const char *prefix, int len, const char *path);
399+
extern int check_filename(const char *prefix, const char *name);
399400
extern void verify_filename(const char *prefix, const char *name);
400401
extern void verify_non_filename(const char *prefix, const char *name);
401402

setup.c

Lines changed: 20 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,19 @@ const char *prefix_filename(const char *pfx, int pfx_len, const char *arg)
6161
return path;
6262
}
6363

64+
int check_filename(const char *prefix, const char *arg)
65+
{
66+
const char *name;
67+
struct stat st;
68+
69+
name = prefix ? prefix_filename(prefix, strlen(prefix), arg) : arg;
70+
if (!lstat(name, &st))
71+
return 1; /* file exists */
72+
if (errno == ENOENT || errno == ENOTDIR)
73+
return 0; /* file does not exist */
74+
die_errno("failed to stat '%s'", arg);
75+
}
76+
6477
/*
6578
* Verify a filename that we got as an argument for a pathspec
6679
* 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)
7083
*/
7184
void verify_filename(const char *prefix, const char *arg)
7285
{
73-
const char *name;
74-
struct stat st;
75-
7686
if (*arg == '-')
7787
die("bad flag '%s' used after filename", arg);
78-
name = prefix ? prefix_filename(prefix, strlen(prefix), arg) : arg;
79-
if (!lstat(name, &st))
88+
if (check_filename(prefix, arg))
8089
return;
81-
if (errno == ENOENT)
82-
die("ambiguous argument '%s': unknown revision or path not in the working tree.\n"
83-
"Use '--' to separate paths from revisions", arg);
84-
die_errno("failed to stat '%s'", arg);
90+
die("ambiguous argument '%s': unknown revision or path not in the working tree.\n"
91+
"Use '--' to separate paths from revisions", arg);
8592
}
8693

8794
/*
@@ -91,19 +98,14 @@ void verify_filename(const char *prefix, const char *arg)
9198
*/
9299
void verify_non_filename(const char *prefix, const char *arg)
93100
{
94-
const char *name;
95-
struct stat st;
96-
97101
if (!is_inside_work_tree() || is_inside_git_dir())
98102
return;
99103
if (*arg == '-')
100104
return; /* flag */
101-
name = prefix ? prefix_filename(prefix, strlen(prefix), arg) : arg;
102-
if (!lstat(name, &st))
103-
die("ambiguous argument '%s': both revision and filename\n"
104-
"Use '--' to separate filenames from revisions", arg);
105-
if (errno != ENOENT && errno != ENOTDIR)
106-
die_errno("failed to stat '%s'", arg);
105+
if (!check_filename(prefix, arg))
106+
return;
107+
die("ambiguous argument '%s': both revision and filename\n"
108+
"Use '--' to separate filenames from revisions", arg);
107109
}
108110

109111
const char **get_pathspec(const char *prefix, const char **pathspec)

0 commit comments

Comments
 (0)