Merge branch 'nh/fetch-http' into next
* nh/fetch-http: git-fetch: resolve remote symrefs for HTTP transport commit-tree.c: check_valid() microoptimization. Fix filename verification when in a subdirectory rebase: typofix. socksetup: don't return on set_reuse_addr() error
This commit is contained in:
commit
f996fbf8a0
1
cache.h
1
cache.h
@ -135,6 +135,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)
|
||||
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
/*
|
||||
|
16
git-fetch.sh
16
git-fetch.sh
@ -270,14 +270,22 @@ fetch_main () {
|
||||
if [ -n "$GIT_SSL_NO_VERIFY" ]; then
|
||||
curl_extra_args="-k"
|
||||
fi
|
||||
remote_name_quoted=$(perl -e '
|
||||
max_depth=5
|
||||
depth=0
|
||||
head="ref: $remote_name"
|
||||
while (expr "z$head" : "zref:" && expr $depth \< $max_depth) >/dev/null
|
||||
do
|
||||
remote_name_quoted=$(perl -e '
|
||||
my $u = $ARGV[0];
|
||||
$u =~ s/^ref:\s*//;
|
||||
$u =~ s{([^-a-zA-Z0-9/.])}{sprintf"%%%02x",ord($1)}eg;
|
||||
print "$u";
|
||||
' "$remote_name")
|
||||
head=$(curl -nsfL $curl_extra_args "$remote/$remote_name_quoted") &&
|
||||
' "$head")
|
||||
head=$(curl -nsfL $curl_extra_args "$remote/$remote_name_quoted")
|
||||
depth=$( expr \( $depth + 1 \) )
|
||||
done
|
||||
expr "z$head" : "z$_x40\$" >/dev/null ||
|
||||
die "Failed to fetch $remote_name from $remote"
|
||||
die "Failed to fetch $remote_name from $remote"
|
||||
echo >&2 Fetching "$remote_name from $remote" using http
|
||||
git-http-fetch -v -a "$head" "$remote/" || exit
|
||||
;;
|
||||
|
@ -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"
|
||||
|
15
rev-parse.c
15
rev-parse.c
@ -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;
|
||||
@ -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")) {
|
||||
@ -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)
|
||||
|
@ -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;
|
||||
}
|
||||
|
23
setup.c
23
setup.c
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user