Skip to content

Commit

Permalink
Fix filename verification when in a subdirectory
Browse files Browse the repository at this point in the history
When we are in a subdirectory of a git archive, we need to take the prefix
of that subdirectory into accoung when we verify filename arguments.

Noted by Matthias Lederhofer

This also uses the improved error reporting for all the other git commands
that use the revision parsing interfaces, not just git-rev-parse. Also, it
makes the error reporting for mixed filenames and argument flags clearer
(you cannot put flags after the start of the pathname list).

[jc: with fix to a trivial typo noticed by Timo Hirvonen]

Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Signed-off-by: Junio C Hamano <junkio@cox.net>
  • Loading branch information
Linus Torvalds authored and Junio C Hamano committed Apr 26, 2006
1 parent b176e6b commit e23d0b4
Show file tree
Hide file tree
Showing 4 changed files with 29 additions and 18 deletions.
1 change: 1 addition & 0 deletions cache.h
Expand Up @@ -134,6 +134,7 @@ extern const char *setup_git_directory_gently(int *);
extern const char *setup_git_directory(void);
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 void verify_filename(const char *prefix, const char *name);

#define alloc_nr(x) (((x)+16)*3/2)

Expand Down
15 changes: 2 additions & 13 deletions rev-parse.c
Expand Up @@ -160,14 +160,6 @@ static int show_file(const char *arg)
return 0;
}

static void die_badfile(const char *arg)
{
if (errno != ENOENT)
die("'%s': %s", arg, strerror(errno));
die("'%s' is ambiguous - revision name or file/directory name?\n"
"Please put '--' before the list of filenames.", arg);
}

int main(int argc, char **argv)
{
int i, as_is = 0, verify = 0;
Expand All @@ -177,14 +169,12 @@ int main(int argc, char **argv)
git_config(git_default_config);

for (i = 1; i < argc; i++) {
struct stat st;
char *arg = argv[i];
char *dotdot;

if (as_is) {
if (show_file(arg) && as_is < 2)
if (lstat(arg, &st) < 0)
die_badfile(arg);
verify_filename(prefix, arg);
continue;
}
if (!strcmp(arg,"-n")) {
Expand Down Expand Up @@ -350,8 +340,7 @@ int main(int argc, char **argv)
continue;
if (verify)
die("Needed a single revision");
if (lstat(arg, &st) < 0)
die_badfile(arg);
verify_filename(prefix, arg);
}
show_default();
if (verify && revs_count != 1)
Expand Down
8 changes: 3 additions & 5 deletions revision.c
Expand Up @@ -675,17 +675,15 @@ int setup_revisions(int argc, const char **argv, struct rev_info *revs, const ch
arg++;
}
if (get_sha1(arg, sha1) < 0) {
struct stat st;
int j;

if (seen_dashdash || local_flags)
die("bad revision '%s'", arg);

/* If we didn't have a "--", all filenames must exist */
for (j = i; j < argc; j++) {
if (lstat(argv[j], &st) < 0)
die("'%s': %s", argv[j], strerror(errno));
}
for (j = i; j < argc; j++)
verify_filename(revs->prefix, argv[j]);

revs->prune_data = get_pathspec(revs->prefix, argv + i);
break;
}
Expand Down
23 changes: 23 additions & 0 deletions setup.c
Expand Up @@ -62,6 +62,29 @@ const char *prefix_filename(const char *pfx, int pfx_len, const char *arg)
return path;
}

/*
* Verify a filename that we got as an argument for a pathspec
* entry. Note that a filename that begins with "-" never verifies
* as true, because even if such a filename were to exist, we want
* it to be preceded by the "--" marker (or we want the user to
* use a format like "./-filename")
*/
void verify_filename(const char *prefix, const char *arg)
{
const char *name;
struct stat st;

if (*arg == '-')
die("bad flag '%s' used after filename", arg);
name = prefix ? prefix_filename(prefix, strlen(prefix), arg) : arg;
if (!lstat(name, &st))
return;
if (errno == ENOENT)
die("ambiguous argument '%s': unknown revision or filename\n"
"Use '--' to separate filenames from revisions", arg);
die("'%s': %s", arg, strerror(errno));
}

const char **get_pathspec(const char *prefix, const char **pathspec)
{
const char *entry = *pathspec;
Expand Down

0 comments on commit e23d0b4

Please sign in to comment.