Skip to content

Commit

Permalink
Merge branch 'fix'
Browse files Browse the repository at this point in the history
* fix:
  commit-tree.c: check_valid() microoptimization.
  Fix filename verification when in a subdirectory
  rebase: typofix.
  socksetup: don't return on set_reuse_addr() error
  • Loading branch information
Junio C Hamano committed Apr 27, 2006
2 parents 3496277 + 5981e09 commit 69bcc43
Show file tree
Hide file tree
Showing 6 changed files with 35 additions and 25 deletions.
1 change: 1 addition & 0 deletions cache.h
Original file line number Diff line number Diff line change
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
11 changes: 5 additions & 6 deletions commit-tree.c
Original file line number Diff line number Diff line change
Expand Up @@ -45,14 +45,13 @@ static void add_buffer(char **bufp, unsigned int *sizep, const char *fmt, ...)

static void check_valid(unsigned char *sha1, const char *expect)
{
void *buf;
char type[20];
unsigned long size;

buf = read_sha1_file(sha1, type, &size);
if (!buf || strcmp(type, expect))
die("%s is not a valid '%s' object", sha1_to_hex(sha1), expect);
free(buf);
if (sha1_object_info(sha1, type, NULL))
die("%s is not a valid object", sha1_to_hex(sha1));
if (expect && strcmp(type, expect))
die("%s is not a valid '%s' object", sha1_to_hex(sha1),
expect);
}

/*
Expand Down
2 changes: 1 addition & 1 deletion git-rebase.sh
Original file line number Diff line number Diff line change
Expand Up @@ -107,7 +107,7 @@ onto=$(git-rev-parse --verify "${onto_name}^0") || exit

# Check if we are already based on $onto, but this should be
# done only when upstream and onto are the same.
if test "$upstream" = "onto"
if test "$upstream" = "$onto"
then
mb=$(git-merge-base "$onto" "$branch")
if test "$mb" = "$onto"
Expand Down
15 changes: 2 additions & 13 deletions rev-parse.c
Original file line number Diff line number Diff line change
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
Original file line number Diff line number Diff line change
Expand Up @@ -752,17 +752,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
Original file line number Diff line number Diff line change
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 69bcc43

Please sign in to comment.