mirror of
https://github.com/git/git.git
synced 2024-11-17 22:44:49 +01:00
Merge branch 'js/remoteconfig' into next
* js/remoteconfig: fetch, pull: ask config for remote information builtin-push: also ask config for remote information
This commit is contained in:
commit
a93829ab35
2 changed files with 90 additions and 4 deletions
|
@ -115,6 +115,41 @@ static int get_remotes_uri(const char *repo, const char *uri[MAX_URI])
|
|||
return n;
|
||||
}
|
||||
|
||||
static const char **config_uri;
|
||||
static const char *config_repo;
|
||||
static int config_repo_len;
|
||||
static int config_current_uri;
|
||||
static int config_get_refspecs;
|
||||
|
||||
static int get_remote_config(const char* key, const char* value)
|
||||
{
|
||||
if (!strncmp(key, "remote.", 7) &&
|
||||
!strncmp(key + 7, config_repo, config_repo_len)) {
|
||||
if (!strcmp(key + 7 + config_repo_len, ".url")) {
|
||||
if (config_current_uri < MAX_URI)
|
||||
config_uri[config_current_uri++] = strdup(value);
|
||||
else
|
||||
error("more than %d URL's specified, ignoring the rest", MAX_URI);
|
||||
}
|
||||
else if (config_get_refspecs &&
|
||||
!strcmp(key + 7 + config_repo_len, ".push"))
|
||||
add_refspec(strdup(value));
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int get_config_remotes_uri(const char *repo, const char *uri[MAX_URI])
|
||||
{
|
||||
config_repo_len = strlen(repo);
|
||||
config_repo = repo;
|
||||
config_current_uri = 0;
|
||||
config_uri = uri;
|
||||
config_get_refspecs = !refspec_nr;
|
||||
|
||||
git_config(get_remote_config);
|
||||
return config_current_uri;
|
||||
}
|
||||
|
||||
static int get_branches_uri(const char *repo, const char *uri[MAX_URI])
|
||||
{
|
||||
const char *slash = strchr(repo, '/');
|
||||
|
@ -162,6 +197,10 @@ static int read_config(const char *repo, const char *uri[MAX_URI])
|
|||
if (n > 0)
|
||||
return n;
|
||||
|
||||
n = get_config_remotes_uri(repo, uri);
|
||||
if (n > 0)
|
||||
return n;
|
||||
|
||||
n = get_branches_uri(repo, uri);
|
||||
if (n > 0)
|
||||
return n;
|
||||
|
|
|
@ -4,13 +4,43 @@
|
|||
# this would fail in that case and would issue an error message.
|
||||
GIT_DIR=$(git-rev-parse --git-dir 2>/dev/null) || :;
|
||||
|
||||
if [ -d "$GIT_DIR"/remotes -a "$GIT_REWRITE_REMOTES" = true ]; then
|
||||
echo "Rewriting $GIT_DIR/remotes" >&2
|
||||
error=0
|
||||
# rewrite into config
|
||||
{
|
||||
cd "$GIT_DIR"/remotes
|
||||
ls | while read f; do
|
||||
name=$(echo -n "$f" | tr -c "A-Za-z0-9" ".")
|
||||
sed -n \
|
||||
-e "s/^URL: /remote.$name.url . /p" \
|
||||
-e "s/^Pull: /remote.$name.pull ^$ /p" \
|
||||
-e "s/^Push: /remote.$name.push ^$ /p" \
|
||||
< "$f"
|
||||
done
|
||||
echo done
|
||||
} | while read key regex value; do
|
||||
case $key in
|
||||
done)
|
||||
if [ $error = 0 ]; then
|
||||
mv "$GIT_DIR"/remotes "$GIT_DIR"/remotes.old
|
||||
fi ;;
|
||||
*)
|
||||
git-repo-config $key "$value" $regex || error=1 ;;
|
||||
esac
|
||||
done
|
||||
fi
|
||||
|
||||
get_data_source () {
|
||||
case "$1" in
|
||||
*/*)
|
||||
# Not so fast. This could be the partial URL shorthand...
|
||||
token=$(expr "z$1" : 'z\([^/]*\)/')
|
||||
remainder=$(expr "z$1" : 'z[^/]*/\(.*\)')
|
||||
if test -f "$GIT_DIR/branches/$token"
|
||||
if test "$(git-repo-config --get "remote.$token.url")"
|
||||
then
|
||||
echo config-partial
|
||||
elif test -f "$GIT_DIR/branches/$token"
|
||||
then
|
||||
echo branches-partial
|
||||
else
|
||||
|
@ -18,7 +48,10 @@ get_data_source () {
|
|||
fi
|
||||
;;
|
||||
*)
|
||||
if test -f "$GIT_DIR/remotes/$1"
|
||||
if test "$(git-repo-config --get "remote.$1.url")"
|
||||
then
|
||||
echo config
|
||||
elif test -f "$GIT_DIR/remotes/$1"
|
||||
then
|
||||
echo remotes
|
||||
elif test -f "$GIT_DIR/branches/$1"
|
||||
|
@ -35,6 +68,15 @@ get_remote_url () {
|
|||
case "$data_source" in
|
||||
'')
|
||||
echo "$1" ;;
|
||||
config-partial)
|
||||
token=$(expr "z$1" : '\([^/]*\)/')
|
||||
remainder=$(expr "z$1" : '[^/]*/\(.*\)')
|
||||
url=$(git-repo-config --get "remote.$token.url")
|
||||
echo "$url/$remainder"
|
||||
;;
|
||||
config)
|
||||
git-repo-config --get "remote.$1.url"
|
||||
;;
|
||||
remotes)
|
||||
sed -ne '/^URL: */{
|
||||
s///p
|
||||
|
@ -56,8 +98,10 @@ get_remote_url () {
|
|||
get_remote_default_refs_for_push () {
|
||||
data_source=$(get_data_source "$1")
|
||||
case "$data_source" in
|
||||
'' | branches | branches-partial)
|
||||
'' | config-partial | branches | branches-partial)
|
||||
;; # no default push mapping, just send matching refs.
|
||||
config)
|
||||
git-repo-config --get-all "remote.$1.push" ;;
|
||||
remotes)
|
||||
sed -ne '/^Push: */{
|
||||
s///p
|
||||
|
@ -111,8 +155,11 @@ canon_refs_list_for_fetch () {
|
|||
get_remote_default_refs_for_fetch () {
|
||||
data_source=$(get_data_source "$1")
|
||||
case "$data_source" in
|
||||
'' | branches-partial)
|
||||
'' | config-partial | branches-partial)
|
||||
echo "HEAD:" ;;
|
||||
config)
|
||||
canon_refs_list_for_fetch \
|
||||
$(git-repo-config --get-all "remote.$1.pull") ;;
|
||||
branches)
|
||||
remote_branch=$(sed -ne '/#/s/.*#//p' "$GIT_DIR/branches/$1")
|
||||
case "$remote_branch" in '') remote_branch=master ;; esac
|
||||
|
|
Loading…
Reference in a new issue