]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - tools/tools/git/git-svn-init
MFV r337208: 9591 ms_shift can be incorrectly changed in MOS config for
[FreeBSD/FreeBSD.git] / tools / tools / git / git-svn-init
1 #!/bin/sh
2
3 # $FreeBSD$
4
5 # SPDX-License-Identifier: BSD-2-Clause-FreeBSD
6 #
7 #  Copyright(c) 2018 Intel Corporation.
8 #
9 #  Redistribution and use in source and binary forms, with or without
10 #  modification, are permitted provided that the following conditions
11 #  are met:
12 #  1. Redistributions of source code must retain the above copyright
13 #     notice, this list of conditions and the following disclaimer.
14 #  2. Redistributions in binary form must reproduce the above copyright
15 #     notice, this list of conditions and the following disclaimer in the
16 #     documentation and/or other materials provided with the distribution.
17 #
18 #  THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
19 #  ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
20 #  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
21 #  ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
22 #  FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
23 #  DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
24 #  OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
25 #  HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
26 #  LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
27 #  OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
28 #  SUCH DAMAGE.
29
30 # This is the codified version of what was/is on the wiki page for using git in
31 # your workflow. It sets up proper repositories, with the correct remotes.
32
33 # Environment variables which can be overridden if desired. Not worth
34 # parameterizing them.
35 GIT_IN_PATH=$(which git)
36 GIT=${GIT-${GIT_IN_PATH}}
37
38 GIT_PORTS_REPO=${GIT_PORTS_REPO-git://github.com/freebsd/freebsd-ports.git}
39 GIT_SVN_PORTS_ROOT_URI=${GIT_SVN_PORTS_ROOT_URI-svn.freebsd.org/ports}
40 GIT_SVN_PORTS_URI=${GIT_SVN_PORTS_URI-repo.freebsd.org/ports}
41
42 GIT_SRC_REPO=${GIT_SRC_REPO-git://github.com/freebsd/freebsd.git}
43 GIT_SVN_SRC_ROOT_URI=${GIT_SVN_SRC_ROOT_URI-svn.freebsd.org/base}
44 GIT_SVN_SRC_URI=${GIT_SVN_SRC_URI-repo.freebsd.org/base}
45
46 GIT_SVN_PORTS_PUSH_URI=$GIT_SVN_PORTS_URI
47 GIT_SVN_SRC_PUSH_URI=$GIT_SVN_SRC_URI
48
49 usage()
50 {
51         cat <<EOF
52 Usage: git-svn-init: [-b base_path] [-n] [-p] [-s]
53
54 git-svn-init will instantiate git repositories for src, and ports and connect
55 them to the upstream SVN repository. By default it will attempt to do this for
56 both ports and src under freebsd in the current working directory.
57 -b      Base path for the clone operation (default: freebsd)
58 -n      Dry run
59 -p      Exclude ports
60 -s      Exclude src
61
62 EOF
63 }
64
65 clone()
66 {
67         echo "Cloning ${3}"
68         ${GIT} clone "$repo" -o upstream "$base"/${3}
69 }
70
71 svn_init()
72 {
73         # init git-svn to point to the subversion repo:
74         ${GIT} svn init -Thead --rewrite-root=svn+ssh://$1 svn+ssh://$2 .
75
76         # Replace to use upstream instead of the default origin
77         # TODO: Do this from git svn init
78         ${GIT} config svn-remote.svn.fetch head:refs/remotes/upstream/trunk
79
80         # Committers need to use proper URL for dcommit
81         ${GIT} config svn-remote.svn.pushurl svn+ssh://$3
82
83 }
84
85 svn_check()
86 {
87         cat <<EOF
88 [svn-remote "svn"]
89         url = svn+ssh://repo.freebsd.org/base
90         rewriteRoot = svn+ssh://svn.freebsd.org/base
91         pushurl = svn+ssh://repo.freebsd.org/base
92         fetch = head:refs/remotes/upstream/trunk
93 EOF
94         [ -z ${DRY_RUN} ] && grep -A4 'svn-remote "svn"' .git/config
95 }
96
97 svn_connect()
98 {
99         # Now make a git branch 'trunk' for git-svn to follow. What we want to
100         # do it set it to point to the final commit in upstream/svn_head.
101         local svn_head_sha=$(git show-ref upstream/svn_head|cut -d" " -f1)
102         ${GIT} update-ref refs/remotes/upstream/trunk $svn_head_sha # git-svn really needs this branch
103 }
104
105 svn_fetch()
106 {
107         ${GIT} svn fetch
108 }
109
110 git_pulls()
111 {
112         # Get pull requests from the repos:
113         ${GIT} config --add remote.upstream.fetch '+refs/pull/*:refs/remotes/upstream/pull/*'
114         ${GIT} fetch
115 }
116
117 git_checkout()
118 {
119         # Arrange to have 'master' reference 'trunk'
120         ${GIT} checkout trunk
121
122         # Delete master
123         ${GIT} branch -D master
124
125         # Make master really be trunk
126         ${GIT} checkout -b master trunk
127 }
128
129 rebase()
130 {
131         ${GIT} svn rebase
132 }
133
134 doit()
135 {
136         local repo=${1}
137         local base=${2}
138
139         if [ "$3" = "src" ] ; then
140                 local svn_root_uri=$GIT_SVN_SRC_ROOT_URI
141                 local svn_uri=$GIT_SVN_SRC_URI
142                 local svn_push_uri=$GIT_SVN_SRC_PUSH_URI
143         else
144                 local svn_root_uri=$GIT_SVN_PORTS_ROOT_URI
145                 local svn_uri=$GIT_SVN_PORTS_URI
146                 local svn_push_uri=$GIT_SVN_PORTS_PUSH_URI
147         fi
148
149         clone ${repo} ${base} ${3}
150
151         cd "$base"/${3}
152         svn_init $svn_root_uri $svn_uri $svn_push_uri
153         svn_check $(basename $svn_uri) # get base or ports, not src/ports.
154         svn_connect
155         svn_fetch
156         git_pulls
157         git_checkout
158         rebase
159
160         cd -
161 }
162
163 ports=1
164 source=1
165 while getopts "hb:nr:sp" opt; do
166         case "$opt" in
167                 b)
168                         base_path="$OPTARG"
169                         ;;
170                 n)
171                         DRY_RUN=1
172                         ;;
173                 p)
174                         ports=0
175                         ;;
176                 s)
177                         source=0
178                         ;;
179                 h|*)
180                         usage
181                         exit 0
182         esac
183 done
184
185 if [ ! -z "${DRY_RUN}" ] ; then
186         GIT='echo git'
187 fi
188
189 if [ "$source" -eq 1 ]; then
190         doit ${GIT_SRC_REPO} ${base_path:-freebsd} "src"
191 fi
192
193 if [ "$ports" -eq 1 ]; then
194         doit ${GIT_PORTS_REPO} ${base_path:-freebsd} "ports"
195 fi