@matheusbsbs / matheus-bagliano / commits / c6e8c8005a
Fork 0

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)