2 # TopGit - A different patch queue manager
3 # (c) Petr Baudis <pasky@suse.cz> 2008
6 populate
= # Set to 1 if we shall seed local branches with this
18 echo "Usage: ${tgname:-tg} [...] remote [--populate] [<remote>]" >&2
28 git config
"remote.$name.url" >/dev
/null || die
"unknown remote '$name'"
31 ## Configure the remote
33 git config
--replace-all "remote.$name.fetch" "+refs/top-bases/*:refs/remotes/$name/top-bases/*" "\\+refs/top-bases/\\*:refs/remotes/$name/top-bases/\\*"
35 if git config
--get-all "remote.$name.push" "\\+refs/top-bases/\\*:refs/top-bases/\\*" >/dev
/null
&& test "xtrue" != "x$(git config --bool --get topgit.dontwarnonoldpushspecs)"; then
36 info
"Probably you want to remove the push specs introduced by an old version of topgit:"
37 info
' git config --unset-all "remote.'$name'.push" "\\+refs/top-bases/\\*:refs/top-bases/\\*"'
38 info
' git config --unset-all "remote.'$name'.push" "\\+refs/heads/\\*:refs/heads/\\*"'
39 info
'(or use git config --bool --add topgit.dontwarnonoldpushspecs true to get rid of this warning)'
42 info
"Remote $name can now follow TopGit topic branches."
43 if [ -z "$populate" ]; then
44 info
"Next, do: git fetch $name"
49 ## Populate local branches
51 info
"Populating local topic branches from remote '$name'..."
53 ## The order of refspecs is very important, because both heads and
54 ## top-bases are mapped under the same namespace refs/remotes/$name.
55 ## If we put the 2nd refspec before the 1st one, stale refs reverse
56 ## lookup would fail and "refs/remotes/$name/top-bases/XX" reverse
57 ## lookup as a non-exist "refs/heads/top-bases/XX", and would be
58 ## deleted by accident.
59 git fetch
--prune "$name" \
60 "+refs/top-bases/*:refs/remotes/$name/top-bases/*" \
61 "+refs/heads/*:refs/remotes/$name/*"
63 git for-each-ref
--format='%(objectname) %(refname)' "refs/remotes/$name/top-bases" |
64 while read rev ref
; do
65 branch
="${ref#refs/remotes/$name/top-bases/}"
66 if ! git rev-parse
--verify "refs/remotes/$name/$branch" -- >/dev
/null
2>&1; then
67 info
"Skipping remote $name/top-bases/$branch that's missing its branch"
70 if git rev-parse
--verify "$branch" -- >/dev
/null
2>&1; then
71 git rev-parse
--verify "refs/top-bases/$branch" -- >/dev
/null
2>&1 ||
{
72 if [ -n "$logrefupdates" ]; then
73 mkdir
-p "$git_dir/logs/refs/top-bases/$(dirname "$branch")" 2>/dev
/null ||
:
74 { >>"$git_dir/logs/refs/top-bases/$branch" ||
:; } 2>/dev
/null
76 git update-ref
"refs/top-bases/$branch" "$rev"
78 info
"Skipping branch $branch: Already exists"
81 info
"Adding branch $branch..."
82 if [ -n "$logrefupdates" ]; then
83 mkdir
-p "$git_dir/logs/refs/top-bases/$(dirname "$branch")" 2>/dev
/null ||
:
84 { >>"$git_dir/logs/refs/top-bases/$branch" ||
:; } 2>/dev
/null
86 git update-ref
"refs/top-bases/$branch" "$rev"
87 git update-ref
"refs/heads/$branch" "$(git rev-parse --verify "$name/$branch" --)"
90 git config
"topgit.remote" "$name"
91 info
"The remote '$name' is now the default source of topic branches."