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
@ -115,6 +115,41 @@ static int get_remotes_uri(const char *repo, const char *uri[MAX_URI])
|
|||||||
return n;
|
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])
|
static int get_branches_uri(const char *repo, const char *uri[MAX_URI])
|
||||||
{
|
{
|
||||||
const char *slash = strchr(repo, '/');
|
const char *slash = strchr(repo, '/');
|
||||||
@ -162,6 +197,10 @@ static int read_config(const char *repo, const char *uri[MAX_URI])
|
|||||||
if (n > 0)
|
if (n > 0)
|
||||||
return n;
|
return n;
|
||||||
|
|
||||||
|
n = get_config_remotes_uri(repo, uri);
|
||||||
|
if (n > 0)
|
||||||
|
return n;
|
||||||
|
|
||||||
n = get_branches_uri(repo, uri);
|
n = get_branches_uri(repo, uri);
|
||||||
if (n > 0)
|
if (n > 0)
|
||||||
return n;
|
return n;
|
||||||
|
@ -4,13 +4,43 @@
|
|||||||
# this would fail in that case and would issue an error message.
|
# this would fail in that case and would issue an error message.
|
||||||
GIT_DIR=$(git-rev-parse --git-dir 2>/dev/null) || :;
|
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 () {
|
get_data_source () {
|
||||||
case "$1" in
|
case "$1" in
|
||||||
*/*)
|
*/*)
|
||||||
# Not so fast. This could be the partial URL shorthand...
|
# Not so fast. This could be the partial URL shorthand...
|
||||||
token=$(expr "z$1" : 'z\([^/]*\)/')
|
token=$(expr "z$1" : 'z\([^/]*\)/')
|
||||||
remainder=$(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
|
then
|
||||||
echo branches-partial
|
echo branches-partial
|
||||||
else
|
else
|
||||||
@ -18,7 +48,10 @@ get_data_source () {
|
|||||||
fi
|
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
|
then
|
||||||
echo remotes
|
echo remotes
|
||||||
elif test -f "$GIT_DIR/branches/$1"
|
elif test -f "$GIT_DIR/branches/$1"
|
||||||
@ -35,6 +68,15 @@ get_remote_url () {
|
|||||||
case "$data_source" in
|
case "$data_source" in
|
||||||
'')
|
'')
|
||||||
echo "$1" ;;
|
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)
|
remotes)
|
||||||
sed -ne '/^URL: */{
|
sed -ne '/^URL: */{
|
||||||
s///p
|
s///p
|
||||||
@ -56,8 +98,10 @@ get_remote_url () {
|
|||||||
get_remote_default_refs_for_push () {
|
get_remote_default_refs_for_push () {
|
||||||
data_source=$(get_data_source "$1")
|
data_source=$(get_data_source "$1")
|
||||||
case "$data_source" in
|
case "$data_source" in
|
||||||
'' | branches | branches-partial)
|
'' | config-partial | branches | branches-partial)
|
||||||
;; # no default push mapping, just send matching refs.
|
;; # no default push mapping, just send matching refs.
|
||||||
|
config)
|
||||||
|
git-repo-config --get-all "remote.$1.push" ;;
|
||||||
remotes)
|
remotes)
|
||||||
sed -ne '/^Push: */{
|
sed -ne '/^Push: */{
|
||||||
s///p
|
s///p
|
||||||
@ -111,8 +155,11 @@ canon_refs_list_for_fetch () {
|
|||||||
get_remote_default_refs_for_fetch () {
|
get_remote_default_refs_for_fetch () {
|
||||||
data_source=$(get_data_source "$1")
|
data_source=$(get_data_source "$1")
|
||||||
case "$data_source" in
|
case "$data_source" in
|
||||||
'' | branches-partial)
|
'' | config-partial | branches-partial)
|
||||||
echo "HEAD:" ;;
|
echo "HEAD:" ;;
|
||||||
|
config)
|
||||||
|
canon_refs_list_for_fetch \
|
||||||
|
$(git-repo-config --get-all "remote.$1.pull") ;;
|
||||||
branches)
|
branches)
|
||||||
remote_branch=$(sed -ne '/#/s/.*#//p' "$GIT_DIR/branches/$1")
|
remote_branch=$(sed -ne '/#/s/.*#//p' "$GIT_DIR/branches/$1")
|
||||||
case "$remote_branch" in '') remote_branch=master ;; esac
|
case "$remote_branch" in '') remote_branch=master ;; esac
|
||||||
|
Loading…
Reference in New Issue
Block a user