From: "Richard Earnshaw (lists)" <Richard.Earnshaw@arm.com>
To: "gcc-patches@gcc.gnu.org" <gcc-patches@gcc.gnu.org>
Subject: [v2] contrib: New remotes structure for vendor and personal refs
Date: Fri, 17 Jan 2020 12:08:00 -0000 [thread overview]
Message-ID: <86a1f7a7-04ff-3c65-9229-ce2c7995264f@arm.com> (raw)
In-Reply-To: <5b1cede7-76d5-1b1f-533e-75af5bed84b5@arm.com>
[-- Attachment #1: Type: text/plain, Size: 2767 bytes --]
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: New personal and vendor layout.
Convert any existing fetch/push rules to new layout.
* git-fetch-vendor.sh: New vendor layout. Add --enable-push
option.
[-- Attachment #2: custom3.patch --]
[-- Type: text/x-patch, Size: 6408 bytes --]
diff --git a/contrib/gcc-git-customization.sh b/contrib/gcc-git-customization.sh
index 26f4389bcc8..c16db747503 100755
--- a/contrib/gcc-git-customization.sh
+++ b/contrib/gcc-git-customization.sh
@@ -81,6 +81,13 @@ then
upstream="origin"
fi
ask "Local name for upstream repository" "origin" upstream
+
+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
git config "gcc-config.upstream" "$upstream"
remote_id=$(git config --get "gcc-config.user")
@@ -100,6 +107,7 @@ then
fi
fi
fi
+
ask "Account name on gcc.gnu.org (for your personal branches area)" $remote_id remote_id
git config "gcc-config.user" "$remote_id"
@@ -108,27 +116,44 @@ if [ "x$old_pfx" = "x" ]
then
old_pfx="me"
fi
+echo
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"
-echo "Setting up tracking for personal namespace $remote_id in remotes/$upstream/${new_pfx}"
-git config --replace-all "remote.${upstream}.fetch" "+refs/users/${remote_id}/heads/*:refs/remotes/${upstream}/${new_pfx}/*" ":refs/remotes/${upstream}/${old_pfx}/"
-git config --replace-all "remote.${upstream}.fetch" "+refs/users/${remote_id}/tags/*:refs/tags/${new_pfx}/*" ":refs/tags/${old_pfx}/"
+# 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
+ echo "Migrating vendor $v to new remote vendors/$v"
+ 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
-push_rule=$(git config --get "remote.${upstream}.push")
-if [ "x$push_rule" != "x" ]
+echo "Setting up tracking for personal namespace $remote_id in remotes/${new_pfx}"
+git config "remote.${new_pfx}.url" "${url}"
+if [ "x$pushurl" != "x" ]
then
- echo "***********************************************"
- echo " Warning"
- echo "***********************************************"
- echo
- echo "Old versions of this script used to add custom push"
- echo "rules to simplify pushing to personal branches."
- echo "Your configuration contains such rules, but we no-longer"
- echo "recommend doing this."
- echo
- echo "To delete these rules run:"
- echo " git config --unset-all \"remote.${upstream}.push\""
+ git config "remote.${new_pfx}.pushurl" "${pushurl}"
fi
+git config --replace-all "remote.${new_pfx}.fetch" "+refs/users/${remote_id}/heads/*:refs/remotes/${new_pfx}/*" ":refs/remotes/${old_pfx}/"
+git config --replace-all "remote.${new_pfx}.fetch" "+refs/users/${remote_id}/tags/*:refs/tags/${new_pfx}/*" ":refs/tags/${old_pfx}/"
+git config --replace-all "remote.${new_pfx}.push" "refs/heads/${new_pfx}/*:refs/users/${remote_id}/heads/*" ":refs/users/${remote_id}"
+
+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}/"
diff --git a/contrib/git-fetch-vendor.sh b/contrib/git-fetch-vendor.sh
index d2d3ed56ad7..15303629b5c 100755
--- a/contrib/git-fetch-vendor.sh
+++ b/contrib/git-fetch-vendor.sh
@@ -1,12 +1,16 @@
#!/bin/sh
-if [ $# != 1 ]
-then
- echo "Usage: $0 <vendor>"
+usage ()
+{
+ echo "Usage: $0 [--enable-push] <vendor>"
+ echo "The following vendors are already known:"
+ git ls-remote ${upstream} "*/vendors/*" | sed -r "s:.*/vendors/([^/]+)/.*:\1:"|sort|uniq
exit 1
-fi
+}
+
+# Should we insert a "push" refspec to enable pushing to the vendor branch?
+enable_push=no
-vendor=$1
upstream=`git config --get "gcc-config.upstream"`
if [ x"$upstream" = x ]
then
@@ -14,7 +18,49 @@ then
exit 1
fi
-echo "setting up git to fetch vendor ${vendor} to remotes/${upstream}/${vendor}"
-git config --replace-all "remote.${upstream}.fetch" "+refs/vendors/${vendor}/heads/*:refs/remotes/${upstream}/${vendor}/*" ":refs/remotes/${upstream}/${vendor}/"
-git config --replace-all "remote.${upstream}.fetch" "+refs/vendors/${vendor}/tags/*:refs/tags/${vendor}/*" ":refs/tags/${vendor}/"
-git fetch
+case $# in
+ 1)
+ # vendor names never start with -, so catch this in case user wrote something like --help.
+ case "$1" in
+ -*)
+ usage
+ ;;
+ *)
+ vendor=$1
+ ;;
+ esac
+ ;;
+ 2)
+ vendor=$2
+ if [ "$1" = "--enable-push" ]
+ then
+ enable_push=yes
+ else
+ usage
+ fi
+ ;;
+ *)
+ usage
+ ;;
+esac
+
+
+echo "setting up git to fetch vendor ${vendor} to remotes/vendors/${vendor}"
+url=$(git config --get "remote.${upstream}.url")
+pushurl=$(git config --get "remote.${upstream}.pushurl")
+git config "remote.vendors/${vendor}.url" "${url}"
+if [ "x$pushurl" != "x" ]
+then
+ git config "remote.vendors/${vendor}.pushurl" "${pushurl}"
+fi
+git config --replace-all "remote.vendors/${vendor}.fetch" "+refs/vendors/${vendor}/heads/*:refs/remotes/vendors/${vendor}/*" "refs/vendors/${vendor}/heads"
+git config --replace-all "remote.vendors/${vendor}.fetch" "+refs/vendors/${vendor}/tags/*:refs/tags/vendors/${vendor}/*" "refs/vendors/${vendor}/tags"
+if [ "$enable_push" = "yes" ]
+then
+ echo "Warning: take care when pushing that you only push the changes you intend."
+ echo "E.g. use \"git push vendors/${vendor} HEAD\" to push the current branch"
+ git config --replace-all "remote.vendors/${vendor}.push" "refs/heads/${vendor}/*:refs/vendors/${vendor}/heads/*"
+else
+ git config --unset-all "remote.vendors/${vendor}.push"
+fi
+git fetch vendors/${vendor}
next prev parent reply other threads:[~2020-01-17 11:21 UTC|newest]
Thread overview: 12+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-01-16 17:35 Richard Earnshaw (lists)
2020-01-17 12:08 ` Richard Earnshaw (lists) [this message]
2020-01-20 10:43 ` [v2] " Richard Earnshaw (lists)
2020-01-21 2:07 ` Hans-Peter Nilsson
2020-01-21 2:19 ` Hans-Peter Nilsson
2020-01-21 10:54 ` Richard Earnshaw (lists)
2020-01-21 11:20 ` Richard Earnshaw (lists)
2020-01-21 14:09 ` [patch] contrib: script to create a new vendor branch Richard Earnshaw (lists)
2020-01-21 14:14 ` Richard Earnshaw (lists)
2020-01-22 0:51 ` Hans-Peter Nilsson
2020-01-22 10:18 ` Richard Earnshaw (lists)
2020-01-22 10:23 ` Richard Earnshaw (lists)
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=86a1f7a7-04ff-3c65-9229-ce2c7995264f@arm.com \
--to=richard.earnshaw@arm.com \
--cc=gcc-patches@gcc.gnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).