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.
Junio C Hamano committed
Oct 18, 2009 at 00:27 UTC
c6e8c8005a2b1fc4cff72d279f29178767bd1a47
2 files changed
+21
-18
cache.h
+1
@@ -396,6 +396,7 @@ extern const char *setup_git_directory_gently(int *);
396
extern const char *setup_git_directory(void);
397
extern const char *prefix_path(const char *prefix, int len, const char *path);
398
extern const char *prefix_filename(const char *prefix, int len, const char *path);
399
+extern int check_filename(const char *prefix, const char *name);
400
extern void verify_filename(const char *prefix, const char *name);
401
extern void verify_non_filename(const char *prefix, const char *name);
402
setup.c
+20
-18
@@ -61,6 +61,19 @@ const char *prefix_filename(const char *pfx, int pfx_len, const char *arg)
61
return path;
62
}
63
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
+
77
/*
78
* Verify a filename that we got as an argument for a pathspec
79
* 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)
83
*/
84
void verify_filename(const char *prefix, const char *arg)
85
{
73
- const char *name;
74
- struct stat st;
75
-
86
if (*arg == '-')
87
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))
89
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);
92
}
93
94
/*
@@ -91,19 +98,14 @@ void verify_filename(const char *prefix, const char *arg)
98
*/
99
void verify_non_filename(const char *prefix, const char *arg)
100
{
94
- const char *name;
95
- struct stat st;
96
-
101
if (!is_inside_work_tree() || is_inside_git_dir())
102
return;
103
if (*arg == '-')
104
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);
109
}
110
111
const char **get_pathspec(const char *prefix, const char **pathspec)