1#!/bin/sh 2 3# Copyright 2009 The Go Authors. All rights reserved. 4# Use of this source code is governed by a BSD-style 5# license that can be found in the LICENSE file. 6 7# This script merges changes from the master copy of the Go library 8# into the libgo library. This does the easy stuff; the hard stuff is 9# left to the user. 10 11# The file MERGE should hold the Git revision number of the last 12# revision which was merged into these sources. Given that, and given 13# the current sources, we can run the usual diff3 algorithm to merge 14# all changes into our sources. 15 16set -e 17 18TMPDIR=${TMPDIR:-/tmp} 19 20OLDDIR=${TMPDIR}/libgo-merge-old 21NEWDIR=${TMPDIR}/libgo-merge-new 22 23if ! test -f MERGE; then 24 echo 1>&2 "merge.sh: must be run in libgo source directory" 25 exit 1 26fi 27 28rev=weekly 29case $# in 301) ;; 312) rev=$2 ;; 32*) 33 echo 1>&2 "merge.sh: Usage: merge.sh git-repository [revision]" 34 exit 1 35 ;; 36esac 37 38repository=$1 39 40old_rev=`sed 1q MERGE` 41 42rm -rf ${OLDDIR} 43git clone ${repository} ${OLDDIR} 44(cd ${OLDDIR} && git checkout ${old_rev}) 45 46rm -rf ${NEWDIR} 47git clone ${repository} ${NEWDIR} 48(cd ${NEWDIR} && git checkout ${rev}) 49 50new_rev=`cd ${NEWDIR} && git log | sed 1q | sed -e 's/commit //'` 51 52merge() { 53 name=$1 54 old=$2 55 new=$3 56 libgo=$4 57 if ! test -f ${new}; then 58 # The file does not exist in the new version. 59 if ! test -f ${old}; then 60 echo 1>&2 "merge.sh internal error no files $old $new" 61 exit 1 62 fi 63 if ! test -f ${libgo}; then 64 # File removed in new version and libgo. 65 :; 66 else 67 echo "merge.sh: ${name}: REMOVED" 68 rm -f ${libgo} 69 git rm ${libgo} 70 fi 71 elif test -f ${old}; then 72 # The file exists in the old version. 73 if ! test -f ${libgo}; then 74 if ! cmp -s ${old} ${new}; then 75 echo "merge.sh: $name: skipping: exists in old and new git, but not in libgo" 76 fi 77 return 78 fi 79 if cmp -s ${old} ${libgo}; then 80 # The libgo file is unchanged from the old version. 81 if cmp -s ${new} ${libgo}; then 82 # File is unchanged from old to new version. 83 return 84 fi 85 # Update file in libgo. 86 echo "merge.sh: $name: updating" 87 cp ${new} ${libgo} 88 else 89 # The libgo file has local changes. 90 set +e 91 diff3 -m -E ${libgo} ${old} ${new} > ${libgo}.tmp 92 status=$? 93 set -e 94 case $status in 95 0) 96 echo "merge.sh: $name: updating" 97 mv ${libgo}.tmp ${libgo} 98 ;; 99 1) 100 echo "merge.sh: $name: CONFLICTS" 101 mv ${libgo}.tmp ${libgo} 102 ;; 103 *) 104 echo 1>&2 "merge.sh: $name: DIFF3 FAILURE" 105 ;; 106 esac 107 fi 108 else 109 # The file does not exist in the old version. 110 if test -f ${libgo}; then 111 if ! cmp -s ${new} ${libgo}; then 112 echo 1>&2 "merge.sh: $name: IN NEW AND LIBGO BUT NOT OLD" 113 fi 114 else 115 echo "merge.sh: $name: NEW" 116 dir=`dirname ${libgo}` 117 if ! test -d ${dir}; then 118 mkdir -p ${dir} 119 fi 120 cp ${new} ${libgo} 121 git add ${libgo} 122 fi 123 fi 124} 125 126echo ${rev} > VERSION 127 128(cd ${NEWDIR}/src && find . -name '*.go' -print) | while read f; do 129 skip=false 130 case "$f" in 131 ./cmd/buildid/* | ./cmd/cgo/* | ./cmd/go/* | ./cmd/gofmt/* | ./cmd/testjson/* | ./cmd/vet/* | ./cmd/internal/browser/* | ./cmd/internal/buildid/* | ./cmd/internal/edit/* | ./cmd/internal/objabi/* | ./cmd/internal/testj2on/* | ./cmd/internal/sys/* | ./cmd/vendor/golang.org/x/tools/* | ./cmd/vendor/golang.org/x/mod/* | ./cmd/vendor/golang.org/x/xerrors/* | ./cmd/vendor/golang.org/x/crypto/ed25519) 132 ;; 133 ./cmd/*) 134 skip=true 135 ;; 136 ./runtime/race/*) 137 skip=true 138 ;; 139 esac 140 if test "$skip" = "true"; then 141 continue 142 fi 143 144 oldfile=${OLDDIR}/src/$f 145 newfile=${NEWDIR}/src/$f 146 libgofile=go/`echo $f | sed -e 's|cmd/vendor/|/|' | sed -e 's|/vendor/|/|'` 147 merge $f ${oldfile} ${newfile} ${libgofile} 148done 149 150(cd ${NEWDIR}/src && find . -name testdata -print) | while read d; do 151 skip=false 152 case "$d" in 153 ./cmd/buildid/* | ./cmd/cgo/* | ./cmd/go/* | ./cmd/gofmt/* | ./cmd/testjson/* | ./cmd/vet/* | ./cmd/internal/browser/* | ./cmd/internal/buildid/* | ./cmd/internal/diff/* | ./cmd/internal/edit/* | ./cmd/internal/objabi/* | ./cmd/internal/testj2on/* | ./cmd/internal/sys/* | ./cmd/vendor/golang.org/x/tools/*) 154 ;; 155 ./cmd/*) 156 skip=true 157 ;; 158 ./runtime/race/* | ./runtime/cgo/*) 159 skip=true 160 ;; 161 esac 162 if test "$skip" = "true"; then 163 continue 164 fi 165 166 oldtd=${OLDDIR}/src/$d 167 newtd=${NEWDIR}/src/$d 168 libgotd=go/`echo $d | sed -e 's|cmd/vendor/|/|' | sed -e 's|/vendor/|/|'` 169 if ! test -d ${oldtd}; then 170 echo "merge.sh: $d: NEWDIR" 171 continue 172 fi 173 (cd ${oldtd} && git ls-files .) | while read f; do 174 if test "`basename $f`" = ".gitignore"; then 175 continue 176 fi 177 name=$d/$f 178 oldfile=${oldtd}/$f 179 newfile=${newtd}/$f 180 libgofile=${libgotd}/$f 181 merge ${name} ${oldfile} ${newfile} ${libgofile} 182 done 183done 184 185(cd ${NEWDIR}/misc/cgo && find . -type f -print) | while read f; do 186 oldfile=${OLDDIR}/misc/cgo/$f 187 newfile=${NEWDIR}/misc/cgo/$f 188 libgofile=misc/cgo/$f 189 merge $f ${oldfile} ${newfile} ${libgofile} 190done 191 192(cd ${OLDDIR}/src && find . -name '*.go' -print) | while read f; do 193 oldfile=${OLDDIR}/src/$f 194 newfile=${NEWDIR}/src/$f 195 libgofile=go/$f 196 if test -f ${newfile}; then 197 continue 198 fi 199 if ! test -f ${libgofile}; then 200 continue 201 fi 202 echo "merge.sh: ${libgofile}: REMOVED" 203 rm -f ${libgofile} 204 git rm ${libgofile} 205done 206 207(cd ${OLDDIR}/misc/cgo && find . -type f -print) | while read f; do 208 oldfile=${OLDDIR}/misc/cgo/$f 209 newfile=${NEWDIR}/misc/cgo/$f 210 libgofile=misc/cgo/$f 211 if test -f ${newfile}; then 212 continue 213 fi 214 if ! test -f ${libgofile}; then 215 continue 216 fi 217 echo "merge.sh: ${libgofile}: REMOVED" 218 rm -f ${libgofile} 219 git rm ${libgofile} 220done 221 222(echo ${new_rev}; sed -ne '2,$p' MERGE) > MERGE.tmp 223mv MERGE.tmp MERGE 224