From 4bf0ffdaa7d7f4ae21d50e72feb7372571971e10 Mon Sep 17 00:00:00 2001 From: Petr Baudis Date: Mon, 1 Sep 2008 02:33:47 +0200 Subject: [PATCH] tg remote: New command Register TopGit-aware remote, populate local branches from one. --- README | 16 +++++++++++++- tg-remote.sh | 61 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 76 insertions(+), 1 deletion(-) create mode 100644 tg-remote.sh diff --git a/README b/README index 8989904..0c0002c 100644 --- a/README +++ b/README @@ -250,6 +250,19 @@ tg patch TODO: tg patch -i to base at index instead of branch, -w for working tree +tg remote +~~~~~~~~~ + Register given remote as TopGit-controlled. This will create + the namespace for the remote branch bases and teach 'git fetch' + and 'git push' to operate on them. + + It takes a mandatory remote name argument, and optional + '--populate' switch - use that for your origin-style remote, + it will seed the local topic branch system based on the + remote topic branches. '--populate' will also make 'tg remote' + automatically fetch the remote and 'tg update' to look at + branches of this remote for updates by default. + tg summary ~~~~~~~~~~ Show overview of all TopGit-tracked topic branches and their @@ -434,7 +447,8 @@ self-contained topic system in the remote repository, and increased conceptual simplicity. Thus, we choose to instantiate all the topic branches of given remote locally; -tg update will also check if a branch can be updated from its corresponding +this is performed by 'tg remote --populate'. +'tg update' will also check if a branch can be updated from its corresponding remote branch. The logic is somewhat involved if we should DTRT. First, we update the base, handling the remote branch as if it was the first dependency; thus, conflict resolutions made in the remote branch will be diff --git a/tg-remote.sh b/tg-remote.sh new file mode 100644 index 0000000..dd3d666 --- /dev/null +++ b/tg-remote.sh @@ -0,0 +1,61 @@ +#!/bin/sh +# TopGit - A different patch queue manager +# (c) Petr Baudis 2008 +# GPLv2 + +populate= # Set to 1 if we shall seed local branches with this +name= + + +## Parse options + +while [ -n "$1" ]; do + arg="$1"; shift + case "$arg" in + --populate) + populate=1;; + -*) + echo "Usage: tg remote [--populate] REMOTE" >&2 + exit 1;; + *) + name="$arg";; + esac +done + +git config "remote.$name.url" >/dev/null || die "unknown remote '$name'" + + +## Configure the remote + +git config --add "remote.$name.fetch" "+refs/top-bases/*:refs/remotes/$name/top-bases/*" +git config --add "remote.$name.push" "+refs/top-bases/*:refs/top-bases/*" +git config --add "remote.$name.push" "+refs/heads/*:refs/heads/*" + +info "Remote $name can now follow TopGit topic branches." +if [ -z "$populate" ]; then + info "Next, do: git fetch $name" + exit +fi + + +## Populate local branches + +info "Populating local topic branches from remote '$name'..." + +git fetch "$name" +git for-each-ref "refs/remotes/$name/top-bases" | + while read rev type ref; do + branch="${ref#refs/remotes/$name/top-bases/}" + if git rev-parse "$branch" >/dev/null 2>&1; then + git rev-parse "refs/top-bases/$branch" >/dev/null 2>&1 || + git update-ref "refs/top-bases/$branch" "$rev" + info "Skipping branch $branch: Already exists" + continue + fi + info "Adding branch $branch..." + git update-ref "refs/top-bases/$branch" "$rev" + git update-ref "refs/heads/$branch" "$(git rev-parse "$name/$branch")" + done + +git config "topgit.remote" "$name" +info "The remote '$name' is now the default source of topic branches." -- 2.30.2