Whamcloud - gitweb
Branch HEAD
[fs/lustre-release.git] / build / merge1.sh
1 #!/bin/bash -e 
2
3 CONFLICTS=cvs-merge-conflicts
4 CVS="cvs -z3"
5
6 if [ -f .mergeinfo ] ; then
7     echo ".mergeinfo exists - clean up first"
8     exit 
9 fi
10
11 if [ -f $CONFLICTS ] ; then
12     echo "$CONFLICTS exists - clean up first"
13     exit 
14 fi
15
16 if [ $# -lt 2 -o $# -gt 3 ]; then
17     echo "This is phase 1 of merging branches. Usage: $0 parent child dir"
18     exit
19 fi
20
21 parent=$1
22 PARENT=`echo $parent | sed -e "s/^b_//" | tr "[a-z]" "[A-Z]"`
23 child=$2
24 CHILD=`echo $child | sed -e "s/^b_//" | tr "[a-z]" "[A-Z]"`
25 date=`date +%Y%m%d_%H%M`
26
27 dir=${3:-.}
28 module=$(basename $(<$dir/CVS/Repository))
29
30 if [ "$module" = "lustre" ] ; then
31     echo >&2 "${progname}: You probably want to merge lustre or portals, not the whole tree."
32     echo >&2 "${progname}: Try using ${0} $parent $child lustre"
33     exit 1
34 fi
35
36
37 case $parent in
38   HEAD) : ;;
39   b_*|b[1-4]*) : ;;
40   *) parent="b_$parent" ;;
41 esac
42 case $child in
43   HEAD) : ;;
44   b_*|b[1-4]*) : ;;
45   *) child="b_$child"
46 esac
47
48 if [ "$child" != "HEAD" -a "`cat $dir/CVS/Tag 2> /dev/null`" != "T$child" ]; then
49         echo "This script must be run within the $child branch"
50         exit 1
51 fi
52
53 TEST_FILE=${TEST_FILE:-ChangeLog} # does this need to be smarter?
54 [ $dir = "build" ] && TEST_FILE=lbuild
55 check_tag() {
56         [ -z "$1" ] && echo "check_tag() missing arg" && exit3
57         [ "$1" = "HEAD" ] && return
58         $CVS log $dir/$TEST_FILE 2> /dev/null | grep -q "       $1: " && return
59         echo "$0: tag $1 not found in $dir/$TEST_FILE"
60         exit 2
61 }
62
63 check_tag $parent
64 check_tag ${CHILD}_BASE
65
66 cat << EOF > .mergeinfo
67 parent=$parent
68 PARENT=$PARENT
69 child=$child
70 CHILD=$CHILD
71 date=$date
72 dir=$dir
73 module=$module
74 CONFLICTS=$CONFLICTS
75 OPERATION=Merge
76 OPERWHERE=from
77 EOF
78
79 echo PARENT: $PARENT parent: $parent CHILD: $CHILD child: $child date: $date
80
81 echo -n "tagging $parent as '${PARENT}_${CHILD}_UPDATE_PARENT_$date' ...."
82 $CVS rtag -r $parent ${PARENT}_${CHILD}_UPDATE_PARENT_$date $module
83 echo "done"
84 echo -n "tagging $child as '${PARENT}_${CHILD}_UPDATE_CHILD_$date' ...."
85 $CVS rtag -r $child ${PARENT}_${CHILD}_UPDATE_CHILD_$date $module
86 echo "done"
87
88 # Apply all of the changes to your local tree:
89 echo "Updating: -j ${CHILD}_BASE -j ${PARENT}_${CHILD}_UPDATE_PARENT_$date ...."
90 $CVS update -j ${CHILD}_BASE -j ${PARENT}_${CHILD}_UPDATE_PARENT_$date -dP $dir
91 echo "done"
92
93 echo -n "Recording conflicts in $CONFLICTS ..."
94 $CVS update | awk '/^C/ { print $2 }' > $CONFLICTS
95 if [ -s $CONFLICTS ] ; then
96     echo "Conflicts found, fix before committing."
97     cat $CONFLICTS
98 else 
99     echo "No conflicts found"
100     rm -f $CONFLICTS
101 fi
102 echo "done"
103
104 echo "Build, test, commit and then run merge2.sh (no arguments)"