2020-01-13 14:37:23 +01:00
|
|
|
#!/bin/sh
|
|
|
|
|
|
|
|
# Script to add some local git customizations suitable for working
|
|
|
|
# with the GCC git repository
|
|
|
|
|
|
|
|
ask () {
|
|
|
|
question=$1
|
|
|
|
default=$2
|
|
|
|
var=$3
|
|
|
|
echo -n $question "["$default"]? "
|
|
|
|
read answer
|
|
|
|
if [ "x$answer" = "x" ]
|
|
|
|
then
|
2020-01-16 15:26:31 +01:00
|
|
|
eval $var=\$default
|
2020-01-13 14:37:23 +01:00
|
|
|
else
|
2020-01-16 15:26:31 +01:00
|
|
|
eval $var=\$answer
|
2020-01-13 14:37:23 +01:00
|
|
|
fi
|
|
|
|
}
|
|
|
|
|
|
|
|
# Add a git command to find the git commit equivalent to legacy SVN revision NNN
|
2020-04-03 12:30:39 +02:00
|
|
|
git config alias.svn-rev '!f() { rev=$1; shift; git log --all --grep="^From-SVN: r\\?$rev\\b" "${@}"; } ; f'
|
2020-01-13 14:37:23 +01:00
|
|
|
|
2020-01-13 15:15:17 +01:00
|
|
|
# Add git commands to convert git commit to monotonically increasing revision number
|
|
|
|
# and vice versa
|
2020-01-16 12:32:34 +01:00
|
|
|
git config alias.gcc-descr \!"f() { if test \${1:-no} = --full; then c=\${2:-master}; r=\$(git describe --all --abbrev=40 --match 'basepoints/gcc-[0-9]*' \$c | sed -n 's,^\\(tags/\\)\\?basepoints/gcc-,r,p'); expr match \${r:-no} '^r[0-9]\\+\$' >/dev/null && r=\${r}-0-g\$(git rev-parse \${2:-master}); else c=\${1:-master}; r=\$(git describe --all --match 'basepoints/gcc-[0-9]*' \$c | sed -n 's,^\\(tags/\\)\\?basepoints/gcc-\\([0-9]\\+\\)-\\([0-9]\\+\\)-g[0-9a-f]*\$,r\\2-\\3,p;s,^\\(tags/\\)\\?basepoints/gcc-\\([0-9]\\+\\)\$,r\\2-0,p'); fi; if test -n \$r; then o=\$(git config --get gcc-config.upstream); rr=\$(echo \$r | sed -n 's,^r\\([0-9]\\+\\)-[0-9]\\+\\(-g[0-9a-f]\\+\\)\\?\$,\\1,p'); if git rev-parse --verify --quiet \${o:-origin}/releases/gcc-\$rr >/dev/null; then m=releases/gcc-\$rr; else m=master; fi; git merge-base --is-ancestor \$c \${o:-origin}/\$m && \echo \${r}; fi; }; f"
|
2020-01-15 12:35:22 +01:00
|
|
|
git config alias.gcc-undescr \!"f() { o=\$(git config --get gcc-config.upstream); r=\$(echo \$1 | sed -n 's,^r\\([0-9]\\+\\)-[0-9]\\+\$,\\1,p'); n=\$(echo \$1 | sed -n 's,^r[0-9]\\+-\\([0-9]\\+\\)\$,\\1,p'); test -z \$r && echo Invalid id \$1 && exit 1; h=\$(git rev-parse --verify --quiet \${o:-origin}/releases/gcc-\$r); test -z \$h && h=\$(git rev-parse --verify --quiet \${o:-origin}/master); p=\$(git describe --all --match 'basepoints/gcc-'\$r \$h | sed -n 's,^\\(tags/\\)\\?basepoints/gcc-[0-9]\\+-\\([0-9]\\+\\)-g[0-9a-f]*\$,\\2,p;s,^\\(tags/\\)\\?basepoints/gcc-[0-9]\\+\$,0,p'); git rev-parse --verify \$h~\$(expr \$p - \$n); }; f"
|
2020-01-13 15:15:17 +01:00
|
|
|
|
2020-05-19 09:19:18 +02:00
|
|
|
git config alias.gcc-verify '!f() { "`git rev-parse --show-toplevel`/contrib/gcc-changelog/git_check_commit.py" $@; } ; f'
|
2020-05-26 15:32:32 +02:00
|
|
|
git config alias.gcc-backport '!f() { "`git rev-parse --show-toplevel`/contrib/git-backport.py" $@; } ; f'
|
2020-05-15 00:44:07 +02:00
|
|
|
git config alias.gcc-mklog '!f() { "`git rev-parse --show-toplevel`/contrib/mklog.py" $@; } ; f'
|
2020-05-27 10:16:21 +02:00
|
|
|
git config alias.gcc-commit-mklog '!f() { GCC_FORCE_MKLOG=1 git commit "$@"; }; f'
|
2020-05-23 00:40:35 +02:00
|
|
|
|
2020-01-15 14:29:53 +01:00
|
|
|
# Make diff on MD files use "(define" as a function marker.
|
2020-01-13 14:37:23 +01:00
|
|
|
# Use this in conjunction with a .gitattributes file containing
|
|
|
|
# *.md diff=md
|
|
|
|
git config diff.md.xfuncname '^\(define.*$'
|
|
|
|
|
2020-12-01 16:46:13 +01:00
|
|
|
# Tell git send-email where patches go.
|
|
|
|
# ??? Maybe also set sendemail.tocmd to guess from MAINTAINERS?
|
|
|
|
git config sendemail.to 'gcc-patches@gcc.gnu.org'
|
|
|
|
|
2020-01-16 14:48:37 +01:00
|
|
|
set_user=$(git config --get "user.name")
|
|
|
|
set_email=$(git config --get "user.email")
|
|
|
|
|
|
|
|
if [ "x$set_user" = "x" ]
|
|
|
|
then
|
|
|
|
# Try to guess the user's name by looking it up in the password file
|
|
|
|
new_user=$(getent passwd $(whoami) | awk -F: '{ print $5 }')
|
|
|
|
if [ "x$new_user" = "x" ]
|
|
|
|
then
|
|
|
|
new_user="(no default)"
|
|
|
|
fi
|
|
|
|
else
|
|
|
|
new_user=$set_user
|
|
|
|
fi
|
|
|
|
ask "Your name" "${new_user}" new_user
|
|
|
|
if [ "x$new_user" = "x(no default)" ]
|
|
|
|
then
|
|
|
|
echo "Cannot continue, git needs to record your name against commits"
|
|
|
|
exit 1
|
|
|
|
fi
|
|
|
|
|
|
|
|
if [ "x$set_email" = "x" ]
|
|
|
|
then
|
|
|
|
new_email="(no_default)"
|
|
|
|
else
|
|
|
|
new_email=$set_email
|
|
|
|
fi
|
|
|
|
|
|
|
|
ask "Your email address (for git commits)" "${new_email}" new_email
|
|
|
|
if [ "x$new_email" = "x(no default)" ]
|
|
|
|
then
|
|
|
|
echo "Cannot continue, git needs to record your email address against commits"
|
|
|
|
exit 1
|
|
|
|
fi
|
|
|
|
|
|
|
|
if [ "x$set_user" != "x$new_user" ]
|
|
|
|
then
|
|
|
|
git config "user.name" "$new_user"
|
|
|
|
fi
|
|
|
|
|
|
|
|
if [ "x$set_email" != "x$new_email" ]
|
|
|
|
then
|
|
|
|
git config "user.email" "$new_email"
|
|
|
|
fi
|
|
|
|
|
|
|
|
upstream=$(git config --get "gcc-config.upstream")
|
2020-01-13 14:37:23 +01:00
|
|
|
if [ "x$upstream" = "x" ]
|
|
|
|
then
|
|
|
|
upstream="origin"
|
|
|
|
fi
|
|
|
|
ask "Local name for upstream repository" "origin" upstream
|
contrib: New remotes structure for vendor and personal refs
The initial structure for vendor and personal branches makes use of
the default remote (normally origin) for the upstream
repository). Unfortunately, this causes some confusion, especially for
personal branches because a push will not push to the correct upstream
location. This can be 'fixed' by adding a push refspec for the remote,
but that has the unfortunate consequence of breaking the push.default
behaviour for git push, and it becomes too easy to accidentally commit
something unintended to the main parts of the repository.
To work around this, this patch changes the configuration to use
separate 'remotes' for these additional refs, with one remote for the
personal space and another remote for each vendor's space. The
personal space is called after the user's preferred branch-space
prefix (default 'me'), the vendor spaces are called
vendors/<vendor-name>.
As far as possible, I've made the script automatically restructure any
existing fetch or push lines that earlier versions of the scripts may
have created - the gcc-git-customization.sh script will convert all
vendor refs that it can find, so it is not necessary to re-add any
vendors you've already added.
You might, however, want to run
git remote prune <origin>
after running to clean up any stale upstream-refs that might still be
in your local repo, and then
git fetch vendors/<vendor>
or
git fetch <me>
to re-populate the remotes/ structures.
Also, for any branch you already have that tracks a personal or vendor
branch upstream, you might need to run
git config branch.<name>.remote <new-remote>
so that merges and pushes go to the right place (I haven't attempted
to automate this last part).
For vendors, the new structure means that
git checkout -b <vendor>/<branch> remotes/vendors/<vendor>/<branch>
will correctly set up a remote tracking branch.
Please be aware that if you have multiple personal branches set up, then
git push <me>
will still consider all of them for pushing. If you only want to push
one branch, then either write
git push <me> HEAD
or
git push <me> <me>/branch
as appropriate.
And don't forget '-n' (--dry-run) to see what would be done if this
were not a dry run.
Finally, now that the vendors spaces are isolated from each other and
from the other spaces, I've added an option "--enable-push" to
git-fetch-vendor.sh. If passed, then a "push" spec will be added for
that vendor to enable pushing to the upstream. If you re-run the
script for the same vendor without the option, the push spec will be
removed.
* gcc-git-customization.sh: Check that user-supplied remote
name exists before continuting. Use a separate remotes for the
personal commit area. Convert existing personal and vendor
fetch rules to new layout.
* git-fetch-vendor.sh: New vendor layout. Add --enable-push
option.
2020-01-20 11:37:29 +01:00
|
|
|
|
|
|
|
v=$(git config --get-all "remote.${upstream}.fetch")
|
|
|
|
if [ "x$v" = "x" ]
|
|
|
|
then
|
|
|
|
echo "Remote $upstream does not seem to exist as a remote"
|
|
|
|
exit 1
|
|
|
|
fi
|
2020-01-13 14:37:23 +01:00
|
|
|
git config "gcc-config.upstream" "$upstream"
|
|
|
|
|
2020-01-16 14:48:37 +01:00
|
|
|
remote_id=$(git config --get "gcc-config.user")
|
2020-01-13 14:37:23 +01:00
|
|
|
if [ "x$remote_id" = "x" ]
|
|
|
|
then
|
|
|
|
# See if the url specifies the remote user name.
|
2020-01-16 14:48:37 +01:00
|
|
|
url=$(git config --get "remote.$upstream.url")
|
2020-01-13 14:37:23 +01:00
|
|
|
if [ "x$url" = "x" ]
|
|
|
|
then
|
|
|
|
# This is a pure guess, but for many people it might be OK.
|
2020-01-16 14:48:37 +01:00
|
|
|
remote_id=$(whoami)
|
2020-01-13 14:37:23 +01:00
|
|
|
else
|
2020-01-16 14:48:37 +01:00
|
|
|
remote_id=$(echo $url | sed -r "s|^.*ssh://(.+)@gcc.gnu.org.*$|\1|")
|
2020-01-13 14:37:23 +01:00
|
|
|
if [ x$remote_id = x$url ]
|
|
|
|
then
|
2020-01-16 14:48:37 +01:00
|
|
|
remote_id=$(whoami)
|
2020-01-13 14:37:23 +01:00
|
|
|
fi
|
|
|
|
fi
|
|
|
|
fi
|
contrib: New remotes structure for vendor and personal refs
The initial structure for vendor and personal branches makes use of
the default remote (normally origin) for the upstream
repository). Unfortunately, this causes some confusion, especially for
personal branches because a push will not push to the correct upstream
location. This can be 'fixed' by adding a push refspec for the remote,
but that has the unfortunate consequence of breaking the push.default
behaviour for git push, and it becomes too easy to accidentally commit
something unintended to the main parts of the repository.
To work around this, this patch changes the configuration to use
separate 'remotes' for these additional refs, with one remote for the
personal space and another remote for each vendor's space. The
personal space is called after the user's preferred branch-space
prefix (default 'me'), the vendor spaces are called
vendors/<vendor-name>.
As far as possible, I've made the script automatically restructure any
existing fetch or push lines that earlier versions of the scripts may
have created - the gcc-git-customization.sh script will convert all
vendor refs that it can find, so it is not necessary to re-add any
vendors you've already added.
You might, however, want to run
git remote prune <origin>
after running to clean up any stale upstream-refs that might still be
in your local repo, and then
git fetch vendors/<vendor>
or
git fetch <me>
to re-populate the remotes/ structures.
Also, for any branch you already have that tracks a personal or vendor
branch upstream, you might need to run
git config branch.<name>.remote <new-remote>
so that merges and pushes go to the right place (I haven't attempted
to automate this last part).
For vendors, the new structure means that
git checkout -b <vendor>/<branch> remotes/vendors/<vendor>/<branch>
will correctly set up a remote tracking branch.
Please be aware that if you have multiple personal branches set up, then
git push <me>
will still consider all of them for pushing. If you only want to push
one branch, then either write
git push <me> HEAD
or
git push <me> <me>/branch
as appropriate.
And don't forget '-n' (--dry-run) to see what would be done if this
were not a dry run.
Finally, now that the vendors spaces are isolated from each other and
from the other spaces, I've added an option "--enable-push" to
git-fetch-vendor.sh. If passed, then a "push" spec will be added for
that vendor to enable pushing to the upstream. If you re-run the
script for the same vendor without the option, the push spec will be
removed.
* gcc-git-customization.sh: Check that user-supplied remote
name exists before continuting. Use a separate remotes for the
personal commit area. Convert existing personal and vendor
fetch rules to new layout.
* git-fetch-vendor.sh: New vendor layout. Add --enable-push
option.
2020-01-20 11:37:29 +01:00
|
|
|
|
2020-01-15 12:30:07 +01:00
|
|
|
ask "Account name on gcc.gnu.org (for your personal branches area)" $remote_id remote_id
|
2020-01-13 14:37:23 +01:00
|
|
|
git config "gcc-config.user" "$remote_id"
|
|
|
|
|
2020-01-16 14:48:37 +01:00
|
|
|
old_pfx=$(git config --get "gcc-config.userpfx")
|
2020-01-13 14:37:23 +01:00
|
|
|
if [ "x$old_pfx" = "x" ]
|
|
|
|
then
|
|
|
|
old_pfx="me"
|
|
|
|
fi
|
contrib: New remotes structure for vendor and personal refs
The initial structure for vendor and personal branches makes use of
the default remote (normally origin) for the upstream
repository). Unfortunately, this causes some confusion, especially for
personal branches because a push will not push to the correct upstream
location. This can be 'fixed' by adding a push refspec for the remote,
but that has the unfortunate consequence of breaking the push.default
behaviour for git push, and it becomes too easy to accidentally commit
something unintended to the main parts of the repository.
To work around this, this patch changes the configuration to use
separate 'remotes' for these additional refs, with one remote for the
personal space and another remote for each vendor's space. The
personal space is called after the user's preferred branch-space
prefix (default 'me'), the vendor spaces are called
vendors/<vendor-name>.
As far as possible, I've made the script automatically restructure any
existing fetch or push lines that earlier versions of the scripts may
have created - the gcc-git-customization.sh script will convert all
vendor refs that it can find, so it is not necessary to re-add any
vendors you've already added.
You might, however, want to run
git remote prune <origin>
after running to clean up any stale upstream-refs that might still be
in your local repo, and then
git fetch vendors/<vendor>
or
git fetch <me>
to re-populate the remotes/ structures.
Also, for any branch you already have that tracks a personal or vendor
branch upstream, you might need to run
git config branch.<name>.remote <new-remote>
so that merges and pushes go to the right place (I haven't attempted
to automate this last part).
For vendors, the new structure means that
git checkout -b <vendor>/<branch> remotes/vendors/<vendor>/<branch>
will correctly set up a remote tracking branch.
Please be aware that if you have multiple personal branches set up, then
git push <me>
will still consider all of them for pushing. If you only want to push
one branch, then either write
git push <me> HEAD
or
git push <me> <me>/branch
as appropriate.
And don't forget '-n' (--dry-run) to see what would be done if this
were not a dry run.
Finally, now that the vendors spaces are isolated from each other and
from the other spaces, I've added an option "--enable-push" to
git-fetch-vendor.sh. If passed, then a "push" spec will be added for
that vendor to enable pushing to the upstream. If you re-run the
script for the same vendor without the option, the push spec will be
removed.
* gcc-git-customization.sh: Check that user-supplied remote
name exists before continuting. Use a separate remotes for the
personal commit area. Convert existing personal and vendor
fetch rules to new layout.
* git-fetch-vendor.sh: New vendor layout. Add --enable-push
option.
2020-01-20 11:37:29 +01:00
|
|
|
echo
|
2020-01-13 14:37:23 +01:00
|
|
|
echo "Local branch prefix for personal branches you want to share"
|
|
|
|
echo "(local branches starting <prefix>/ can be pushed directly to your"
|
|
|
|
ask "personal area on the gcc server)" $old_pfx new_pfx
|
|
|
|
git config "gcc-config.userpfx" "$new_pfx"
|
|
|
|
|
2020-05-23 00:40:35 +02:00
|
|
|
echo
|
|
|
|
ask "Install prepare-commit-msg git hook for 'git commit-mklog' alias" yes dohook
|
|
|
|
if [ "x$dohook" = xyes ]; then
|
|
|
|
hookdir=`git rev-parse --git-path hooks`
|
|
|
|
if [ -f "$hookdir/prepare-commit-msg" ]; then
|
|
|
|
echo " Moving existing prepare-commit-msg hook to prepare-commit-msg.bak"
|
|
|
|
mv "$hookdir/prepare-commit-msg" "$hookdir/prepare-commit-msg.bak"
|
|
|
|
fi
|
|
|
|
install -c "`git rev-parse --show-toplevel`/contrib/prepare-commit-msg" "$hookdir"
|
|
|
|
fi
|
|
|
|
|
contrib: New remotes structure for vendor and personal refs
The initial structure for vendor and personal branches makes use of
the default remote (normally origin) for the upstream
repository). Unfortunately, this causes some confusion, especially for
personal branches because a push will not push to the correct upstream
location. This can be 'fixed' by adding a push refspec for the remote,
but that has the unfortunate consequence of breaking the push.default
behaviour for git push, and it becomes too easy to accidentally commit
something unintended to the main parts of the repository.
To work around this, this patch changes the configuration to use
separate 'remotes' for these additional refs, with one remote for the
personal space and another remote for each vendor's space. The
personal space is called after the user's preferred branch-space
prefix (default 'me'), the vendor spaces are called
vendors/<vendor-name>.
As far as possible, I've made the script automatically restructure any
existing fetch or push lines that earlier versions of the scripts may
have created - the gcc-git-customization.sh script will convert all
vendor refs that it can find, so it is not necessary to re-add any
vendors you've already added.
You might, however, want to run
git remote prune <origin>
after running to clean up any stale upstream-refs that might still be
in your local repo, and then
git fetch vendors/<vendor>
or
git fetch <me>
to re-populate the remotes/ structures.
Also, for any branch you already have that tracks a personal or vendor
branch upstream, you might need to run
git config branch.<name>.remote <new-remote>
so that merges and pushes go to the right place (I haven't attempted
to automate this last part).
For vendors, the new structure means that
git checkout -b <vendor>/<branch> remotes/vendors/<vendor>/<branch>
will correctly set up a remote tracking branch.
Please be aware that if you have multiple personal branches set up, then
git push <me>
will still consider all of them for pushing. If you only want to push
one branch, then either write
git push <me> HEAD
or
git push <me> <me>/branch
as appropriate.
And don't forget '-n' (--dry-run) to see what would be done if this
were not a dry run.
Finally, now that the vendors spaces are isolated from each other and
from the other spaces, I've added an option "--enable-push" to
git-fetch-vendor.sh. If passed, then a "push" spec will be added for
that vendor to enable pushing to the upstream. If you re-run the
script for the same vendor without the option, the push spec will be
removed.
* gcc-git-customization.sh: Check that user-supplied remote
name exists before continuting. Use a separate remotes for the
personal commit area. Convert existing personal and vendor
fetch rules to new layout.
* git-fetch-vendor.sh: New vendor layout. Add --enable-push
option.
2020-01-20 11:37:29 +01:00
|
|
|
# Scan the existing settings to see if there are any we need to rewrite.
|
|
|
|
vendors=$(git config --get-all "remote.${upstream}.fetch" "refs/vendors/" | sed -r "s:.*refs/vendors/([^/]+)/.*:\1:" | sort | uniq)
|
|
|
|
url=$(git config --get "remote.${upstream}.url")
|
|
|
|
pushurl=$(git config --get "remote.${upstream}.pushurl")
|
|
|
|
for v in $vendors
|
|
|
|
do
|
2020-01-24 15:38:16 +01:00
|
|
|
echo "Migrating vendor \"$v\" to new remote \"vendors/$v\""
|
contrib: New remotes structure for vendor and personal refs
The initial structure for vendor and personal branches makes use of
the default remote (normally origin) for the upstream
repository). Unfortunately, this causes some confusion, especially for
personal branches because a push will not push to the correct upstream
location. This can be 'fixed' by adding a push refspec for the remote,
but that has the unfortunate consequence of breaking the push.default
behaviour for git push, and it becomes too easy to accidentally commit
something unintended to the main parts of the repository.
To work around this, this patch changes the configuration to use
separate 'remotes' for these additional refs, with one remote for the
personal space and another remote for each vendor's space. The
personal space is called after the user's preferred branch-space
prefix (default 'me'), the vendor spaces are called
vendors/<vendor-name>.
As far as possible, I've made the script automatically restructure any
existing fetch or push lines that earlier versions of the scripts may
have created - the gcc-git-customization.sh script will convert all
vendor refs that it can find, so it is not necessary to re-add any
vendors you've already added.
You might, however, want to run
git remote prune <origin>
after running to clean up any stale upstream-refs that might still be
in your local repo, and then
git fetch vendors/<vendor>
or
git fetch <me>
to re-populate the remotes/ structures.
Also, for any branch you already have that tracks a personal or vendor
branch upstream, you might need to run
git config branch.<name>.remote <new-remote>
so that merges and pushes go to the right place (I haven't attempted
to automate this last part).
For vendors, the new structure means that
git checkout -b <vendor>/<branch> remotes/vendors/<vendor>/<branch>
will correctly set up a remote tracking branch.
Please be aware that if you have multiple personal branches set up, then
git push <me>
will still consider all of them for pushing. If you only want to push
one branch, then either write
git push <me> HEAD
or
git push <me> <me>/branch
as appropriate.
And don't forget '-n' (--dry-run) to see what would be done if this
were not a dry run.
Finally, now that the vendors spaces are isolated from each other and
from the other spaces, I've added an option "--enable-push" to
git-fetch-vendor.sh. If passed, then a "push" spec will be added for
that vendor to enable pushing to the upstream. If you re-run the
script for the same vendor without the option, the push spec will be
removed.
* gcc-git-customization.sh: Check that user-supplied remote
name exists before continuting. Use a separate remotes for the
personal commit area. Convert existing personal and vendor
fetch rules to new layout.
* git-fetch-vendor.sh: New vendor layout. Add --enable-push
option.
2020-01-20 11:37:29 +01:00
|
|
|
git config --unset-all "remote.${upstream}.fetch" "refs/vendors/$v/"
|
|
|
|
git config --unset-all "remote.${upstream}.push" "refs/vendors/$v/"
|
|
|
|
git config "remote.vendors/${v}.url" "${url}"
|
|
|
|
if [ "x$pushurl" != "x" ]
|
|
|
|
then
|
|
|
|
git config "remote.vendors/${v}.pushurl" "${pushurl}"
|
|
|
|
fi
|
|
|
|
git config --add "remote.vendors/${v}.fetch" "+refs/vendors/$v/heads/*:refs/remotes/vendors/${v}/*"
|
|
|
|
git config --add "remote.vendors/${v}.fetch" "+refs/vendors/$v/tags/*:refs/tags/vendors/${v}/*"
|
|
|
|
done
|
2020-01-15 12:30:07 +01:00
|
|
|
|
2020-01-24 15:38:16 +01:00
|
|
|
# Convert the remote 'pfx' to users/pfx to avoid problems with ambiguous refs
|
|
|
|
# on user branches
|
|
|
|
old_remote=$(git config --get "remote.${old_pfx}.url")
|
|
|
|
if [ -n "${old_remote}" ]
|
|
|
|
then
|
|
|
|
echo "Migrating remote \"${old_pfx}\" to new remote \"users/${new_pfx}\""
|
|
|
|
# Create a dummy fetch rule that will cause the subsequent prune to remove the old remote refs.
|
|
|
|
git config --replace-all "remote.${old_pfx}.fetch" "+refs/empty/*:refs/remotes/${old_pfx}/*"
|
|
|
|
# Remove any remotes
|
|
|
|
git remote prune ${old_pfx}
|
|
|
|
git config --remove-section "remote.${old_pfx}"
|
|
|
|
for br in $(git branch --list "${old_pfx}/*")
|
|
|
|
do
|
|
|
|
old_remote=$(git config --get "branch.${br}.remote")
|
|
|
|
if [ "${old_remote}" = "${old_pfx}" ]
|
|
|
|
then
|
|
|
|
git config "branch.${br}.remote" "users/${new_pfx}"
|
|
|
|
fi
|
|
|
|
done
|
|
|
|
fi
|
|
|
|
|
|
|
|
echo "Setting up tracking for personal namespace $remote_id in remotes/users/${new_pfx}"
|
|
|
|
git config "remote.users/${new_pfx}.url" "${url}"
|
contrib: New remotes structure for vendor and personal refs
The initial structure for vendor and personal branches makes use of
the default remote (normally origin) for the upstream
repository). Unfortunately, this causes some confusion, especially for
personal branches because a push will not push to the correct upstream
location. This can be 'fixed' by adding a push refspec for the remote,
but that has the unfortunate consequence of breaking the push.default
behaviour for git push, and it becomes too easy to accidentally commit
something unintended to the main parts of the repository.
To work around this, this patch changes the configuration to use
separate 'remotes' for these additional refs, with one remote for the
personal space and another remote for each vendor's space. The
personal space is called after the user's preferred branch-space
prefix (default 'me'), the vendor spaces are called
vendors/<vendor-name>.
As far as possible, I've made the script automatically restructure any
existing fetch or push lines that earlier versions of the scripts may
have created - the gcc-git-customization.sh script will convert all
vendor refs that it can find, so it is not necessary to re-add any
vendors you've already added.
You might, however, want to run
git remote prune <origin>
after running to clean up any stale upstream-refs that might still be
in your local repo, and then
git fetch vendors/<vendor>
or
git fetch <me>
to re-populate the remotes/ structures.
Also, for any branch you already have that tracks a personal or vendor
branch upstream, you might need to run
git config branch.<name>.remote <new-remote>
so that merges and pushes go to the right place (I haven't attempted
to automate this last part).
For vendors, the new structure means that
git checkout -b <vendor>/<branch> remotes/vendors/<vendor>/<branch>
will correctly set up a remote tracking branch.
Please be aware that if you have multiple personal branches set up, then
git push <me>
will still consider all of them for pushing. If you only want to push
one branch, then either write
git push <me> HEAD
or
git push <me> <me>/branch
as appropriate.
And don't forget '-n' (--dry-run) to see what would be done if this
were not a dry run.
Finally, now that the vendors spaces are isolated from each other and
from the other spaces, I've added an option "--enable-push" to
git-fetch-vendor.sh. If passed, then a "push" spec will be added for
that vendor to enable pushing to the upstream. If you re-run the
script for the same vendor without the option, the push spec will be
removed.
* gcc-git-customization.sh: Check that user-supplied remote
name exists before continuting. Use a separate remotes for the
personal commit area. Convert existing personal and vendor
fetch rules to new layout.
* git-fetch-vendor.sh: New vendor layout. Add --enable-push
option.
2020-01-20 11:37:29 +01:00
|
|
|
if [ "x$pushurl" != "x" ]
|
2020-01-15 12:30:07 +01:00
|
|
|
then
|
2020-01-24 15:38:16 +01:00
|
|
|
git config "remote.users/${new_pfx}.pushurl" "${pushurl}"
|
2020-01-15 12:30:07 +01:00
|
|
|
fi
|
2020-01-24 15:38:16 +01:00
|
|
|
git config --replace-all "remote.users/${new_pfx}.fetch" "+refs/users/${remote_id}/heads/*:refs/remotes/users/${new_pfx}/*" "refs/users/${remote_id}/heads/"
|
|
|
|
git config --replace-all "remote.users/${new_pfx}.fetch" "+refs/users/${remote_id}/tags/*:refs/tags/users/${new_pfx}/*" "refs/users/${remote_id}/tags/"
|
|
|
|
git config --replace-all "remote.users/${new_pfx}.push" "refs/heads/${new_pfx}/*:refs/users/${remote_id}/heads/*" "refs/users/${remote_id}"
|
contrib: New remotes structure for vendor and personal refs
The initial structure for vendor and personal branches makes use of
the default remote (normally origin) for the upstream
repository). Unfortunately, this causes some confusion, especially for
personal branches because a push will not push to the correct upstream
location. This can be 'fixed' by adding a push refspec for the remote,
but that has the unfortunate consequence of breaking the push.default
behaviour for git push, and it becomes too easy to accidentally commit
something unintended to the main parts of the repository.
To work around this, this patch changes the configuration to use
separate 'remotes' for these additional refs, with one remote for the
personal space and another remote for each vendor's space. The
personal space is called after the user's preferred branch-space
prefix (default 'me'), the vendor spaces are called
vendors/<vendor-name>.
As far as possible, I've made the script automatically restructure any
existing fetch or push lines that earlier versions of the scripts may
have created - the gcc-git-customization.sh script will convert all
vendor refs that it can find, so it is not necessary to re-add any
vendors you've already added.
You might, however, want to run
git remote prune <origin>
after running to clean up any stale upstream-refs that might still be
in your local repo, and then
git fetch vendors/<vendor>
or
git fetch <me>
to re-populate the remotes/ structures.
Also, for any branch you already have that tracks a personal or vendor
branch upstream, you might need to run
git config branch.<name>.remote <new-remote>
so that merges and pushes go to the right place (I haven't attempted
to automate this last part).
For vendors, the new structure means that
git checkout -b <vendor>/<branch> remotes/vendors/<vendor>/<branch>
will correctly set up a remote tracking branch.
Please be aware that if you have multiple personal branches set up, then
git push <me>
will still consider all of them for pushing. If you only want to push
one branch, then either write
git push <me> HEAD
or
git push <me> <me>/branch
as appropriate.
And don't forget '-n' (--dry-run) to see what would be done if this
were not a dry run.
Finally, now that the vendors spaces are isolated from each other and
from the other spaces, I've added an option "--enable-push" to
git-fetch-vendor.sh. If passed, then a "push" spec will be added for
that vendor to enable pushing to the upstream. If you re-run the
script for the same vendor without the option, the push spec will be
removed.
* gcc-git-customization.sh: Check that user-supplied remote
name exists before continuting. Use a separate remotes for the
personal commit area. Convert existing personal and vendor
fetch rules to new layout.
* git-fetch-vendor.sh: New vendor layout. Add --enable-push
option.
2020-01-20 11:37:29 +01:00
|
|
|
|
|
|
|
if [ "$old_pfx" != "$new_pfx" -a "$old_pfx" != "${upstream}" ]
|
|
|
|
then
|
|
|
|
git config --remove-section "remote.${old_pfx}"
|
|
|
|
fi
|
|
|
|
|
|
|
|
git config --unset-all "remote.${upstream}.fetch" "refs/users/${remote_id}/"
|
|
|
|
git config --unset-all "remote.${upstream}.push" "refs/users/${remote_id}/"
|
2020-01-24 15:38:16 +01:00
|
|
|
|
|
|
|
git fetch "users/${new_pfx}"
|