src/cm/media/js/lib/flexible-js-formatting/.git/hooks/pre-rebase
author raph
Mon, 23 Nov 2009 15:14:29 +0100
changeset 0 40c8f766c9b8
permissions -rw-r--r--
import from internal svn r 4007
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
     1
#!/bin/sh
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
     2
#
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
     3
# Copyright (c) 2006 Junio C Hamano
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
     4
#
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
     5
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
     6
publish=next
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
     7
basebranch="$1"
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
     8
if test "$#" = 2
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
     9
then
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    10
	topic="refs/heads/$2"
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    11
else
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    12
	topic=`git symbolic-ref HEAD`
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    13
fi
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    14
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    15
case "$basebranch,$topic" in
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    16
master,refs/heads/??/*)
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    17
	;;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    18
*)
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    19
	exit 0 ;# we do not interrupt others.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    20
	;;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    21
esac
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    22
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    23
# Now we are dealing with a topic branch being rebased
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    24
# on top of master.  Is it OK to rebase it?
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    25
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    26
# Is topic fully merged to master?
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    27
not_in_master=`git-rev-list --pretty=oneline ^master "$topic"`
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    28
if test -z "$not_in_master"
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    29
then
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    30
	echo >&2 "$topic is fully merged to master; better remove it."
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    31
	exit 1 ;# we could allow it, but there is no point.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    32
fi
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    33
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    34
# Is topic ever merged to next?  If so you should not be rebasing it.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    35
only_next_1=`git-rev-list ^master "^$topic" ${publish} | sort`
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    36
only_next_2=`git-rev-list ^master           ${publish} | sort`
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    37
if test "$only_next_1" = "$only_next_2"
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    38
then
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    39
	not_in_topic=`git-rev-list "^$topic" master`
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    40
	if test -z "$not_in_topic"
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    41
	then
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    42
		echo >&2 "$topic is already up-to-date with master"
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    43
		exit 1 ;# we could allow it, but there is no point.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    44
	else
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    45
		exit 0
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    46
	fi
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    47
else
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    48
	not_in_next=`git-rev-list --pretty=oneline ^${publish} "$topic"`
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    49
	perl -e '
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    50
		my $topic = $ARGV[0];
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    51
		my $msg = "* $topic has commits already merged to public branch:\n";
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    52
		my (%not_in_next) = map {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    53
			/^([0-9a-f]+) /;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    54
			($1 => 1);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    55
		} split(/\n/, $ARGV[1]);
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    56
		for my $elem (map {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    57
				/^([0-9a-f]+) (.*)$/;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    58
				[$1 => $2];
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    59
			} split(/\n/, $ARGV[2])) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    60
			if (!exists $not_in_next{$elem->[0]}) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    61
				if ($msg) {
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    62
					print STDERR $msg;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    63
					undef $msg;
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    64
				}
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    65
				print STDERR " $elem->[1]\n";
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    66
			}
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    67
		}
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    68
	' "$topic" "$not_in_next" "$not_in_master"
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    69
	exit 1
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    70
fi
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    71
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    72
exit 0
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    73
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    74
################################################################
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    75
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    76
This sample hook safeguards topic branches that have been
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    77
published from being rewound.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    78
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    79
The workflow assumed here is:
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    80
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    81
 * Once a topic branch forks from "master", "master" is never
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    82
   merged into it again (either directly or indirectly).
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    83
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    84
 * Once a topic branch is fully cooked and merged into "master",
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    85
   it is deleted.  If you need to build on top of it to correct
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    86
   earlier mistakes, a new topic branch is created by forking at
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    87
   the tip of the "master".  This is not strictly necessary, but
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    88
   it makes it easier to keep your history simple.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    89
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    90
 * Whenever you need to test or publish your changes to topic
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    91
   branches, merge them into "next" branch.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    92
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    93
The script, being an example, hardcodes the publish branch name
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    94
to be "next", but it is trivial to make it configurable via
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    95
$GIT_DIR/config mechanism.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    96
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    97
With this workflow, you would want to know:
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    98
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
    99
(1) ... if a topic branch has ever been merged to "next".  Young
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   100
    topic branches can have stupid mistakes you would rather
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   101
    clean up before publishing, and things that have not been
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   102
    merged into other branches can be easily rebased without
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   103
    affecting other people.  But once it is published, you would
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   104
    not want to rewind it.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   105
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   106
(2) ... if a topic branch has been fully merged to "master".
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   107
    Then you can delete it.  More importantly, you should not
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   108
    build on top of it -- other people may already want to
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   109
    change things related to the topic as patches against your
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   110
    "master", so if you need further changes, it is better to
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   111
    fork the topic (perhaps with the same name) afresh from the
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   112
    tip of "master".
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   113
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   114
Let's look at this example:
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   115
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   116
		   o---o---o---o---o---o---o---o---o---o "next"
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   117
		  /       /           /           /
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   118
		 /   a---a---b A     /           /
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   119
		/   /               /           /
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   120
	       /   /   c---c---c---c B         /
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   121
	      /   /   /             \         /
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   122
	     /   /   /   b---b C     \       /
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   123
	    /   /   /   /             \     /
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   124
    ---o---o---o---o---o---o---o---o---o---o---o "master"
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   125
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   126
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   127
A, B and C are topic branches.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   128
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   129
 * A has one fix since it was merged up to "next".
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   130
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   131
 * B has finished.  It has been fully merged up to "master" and "next",
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   132
   and is ready to be deleted.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   133
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   134
 * C has not merged to "next" at all.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   135
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   136
We would want to allow C to be rebased, refuse A, and encourage
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   137
B to be deleted.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   138
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   139
To compute (1):
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   140
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   141
	git-rev-list ^master ^topic next
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   142
	git-rev-list ^master        next
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   143
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   144
	if these match, topic has not merged in next at all.
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   145
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   146
To compute (2):
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   147
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   148
	git-rev-list master..topic
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   149
40c8f766c9b8 import from internal svn r 4007
raph
parents:
diff changeset
   150
	if this is empty, it is fully merged to "master".