chiark / gitweb /
Merge commit 'refs/top-bases/fixes/ensure-worktree' into fixes/ensure-worktree
[topgit.git] / tg-push.sh
1 #!/bin/sh
2 # TopGit - A different patch queue manager
3 # GPLv2
4
5 ## Parse options
6
7 recurse_deps=true
8 tgish_deps_only=false
9 dry_run=
10
11 while [ -n "$1" ]; do
12         arg="$1"; shift
13         case "$arg" in
14         --no-deps)
15                 recurse_deps=false;;
16         --dry-run)
17                 dry_run=--dry-run;;
18         --tgish-only)
19                 tgish_deps_only=true;;
20         -h|--help)
21                 echo "Usage: tg push [--dry-run] [--no-deps] [--tgish-only] [-r remote] branch*"
22                 exit 0;;
23         -r)
24                 remote="$1"
25                 shift
26                 ;;
27         *)
28                 branches="$branches $arg";;
29         esac
30 done
31
32 if [ -z "$remote" ]; then
33         remote="$base_remote"
34 fi
35
36 if [ -z "$remote" ]; then
37         die "no remote location given. Either use -r remote argument or set topgit.remote"
38 fi
39
40 if [ -z "$branches" ]; then
41         branches="$(git symbolic-ref HEAD | sed 's#^refs/heads/##')"
42 fi
43
44 for name in $branches; do
45         ref_exists "$name" || die "detached HEAD? Can't push $name"
46 done
47
48 _listfile="$(mktemp -t tg-push-listfile.XXXXXX)"
49 trap "rm -f \"$_listfile\"" 0
50
51 push_branch()
52 {
53         # if so desired omit non tgish deps
54         $tgish_deps_only && [ -z "$_dep_is_tgish" ] && return 0
55
56         # filter out plain SHA1s.  These don't need to be pushed explicitly as
57         # the patches that depend on the sha1 have it already in their ancestry.
58         is_sha1 "$_dep" && return 0
59
60         echo "$_dep" >> "$_listfile"
61         [ -z "$_dep_is_tgish" ] ||
62                 echo "top-bases/$_dep" >> "$_listfile"
63 }
64
65 for name in $branches; do
66         # current branch
67         # re-use push_branch, which expects some pre-defined variables
68         _dep="$name"
69         _dep_is_tgish=1
70         ref_exists "top-bases/$_dep" ||
71                 _dep_is_tgish=
72         push_branch "$name"
73
74         # deps but only if branch is tgish
75         $recurse_deps && [ -n "$_dep_is_tgish" ] &&
76                 no_remotes=1 recurse_deps push_branch "$name"
77
78         # remove multiple occurrences of the same branch
79         sort -u "$_listfile" | xargs git push $dry_run "$remote"
80 done