svn commit: r311296 - user/uqs/git_conv

Ulrich Spoerlein uqs at FreeBSD.org
Wed Jan 4 17:58:18 UTC 2017


Author: uqs
Date: Wed Jan  4 17:58:17 2017
New Revision: 311296
URL: https://svnweb.freebsd.org/changeset/base/311296

Log:
  Snapshot what is currently in production.
  
  Finish the implicit "src" removal and use base/doc/ports more consistenly. Add
  more documentation and caveats to people that want to repeat this setup.

Modified:
  user/uqs/git_conv/git_conv

Modified: user/uqs/git_conv/git_conv
==============================================================================
--- user/uqs/git_conv/git_conv	Wed Jan  4 17:55:31 2017	(r311295)
+++ user/uqs/git_conv/git_conv	Wed Jan  4 17:58:17 2017	(r311296)
@@ -1,38 +1,75 @@
 #!/bin/sh
 #
-# Repository creation and setup
+# 1. Repository creation and setup
 #
-# Simple for svn2git repos, need to run against local paths, using rules files in ~git/*.rules
-# - First svn2git run will create target git repo, then
+# svnsync mirror with cloned UUID
+# - svnadmin create freebsd-base.svn
+# - svnadmin create freebsd-doc.svn
+# - svnadmin create freebsd-ports.svn
+# - echo '#!/bin/sh' > freebsd-base.svn/hooks/pre-revprop-change
+# - echo '#!/bin/sh' > freebsd-doc.svn/hooks/pre-revprop-change
+# - echo '#!/bin/sh' > freebsd-ports.svn/hooks/pre-revprop-change
+# - chmod +x freebsd-base.svn/hooks/pre-revprop-change freebsd-doc.svn/hooks/pre-revprop-change freebsd-ports.svn/hooks/pre-revprop-change
+#   - svnadmin setuuid freebsd-base.svn ccf9f872-aa2e-dd11-9fc8-001c23d0bc1f
+#   - svnadmin setuuid freebsd-doc.svn c2e8774f-c49f-e111-b436-862b2bbc8956
+#   - svnadmin setuuid freebsd-ports.svn 35697150-7ecd-e111-bb59-0022644237b5
+# - svnsync init file://$PWD/freebsd-base.svn svn://svn.freebsd.org/base
+# - svnsync init file://$PWD/freebsd-doc.svn svn://svn.freebsd.org/doc
+# - svnsync init file://$PWD/freebsd-ports.svn svn://svn.freebsd.org/ports
+# !!! ACHTUNG !!!
+# svnsync doesn't work atomically and can mess up metadata for commits. This
+# has happened already with the mirror as used by the official svn2git
+# conversion as exported in github. This is even worse than you can imagine.
+#
+# DO NOT USE THIS NAIVE SVN SYNC FROM THE LIVE REPO, see dosync.sh instead.
+# - svnsync sync file://$PWD/freebsd-base.svn
+# - svnsync sync file://$PWD/freebsd-doc.svn
+# - svnsync sync file://$PWD/freebsd-ports.svn
+# this will take several days, possibly weeks.
+# !!! ACHTUNG !!!
+#
+# 2. svn2git conversion: need to run against local paths, using rules files in ~git/*.rules
+# - First svn2git run will create the target git repo, then
 # - git config --global push.default matching
-# - git remote add github github.com:freebsd/freebsd.git
+# - git remote add github base.github.com:freebsd/freebsd.git
 # - git config --add remote.github.push '+refs/heads/master:refs/heads/master'
 # - git config --add remote.github.push '+refs/heads/stable/*:refs/heads/stable/*'
 # - git config --add remote.github.push '+refs/heads/projects/*:refs/heads/projects/*'
 # - git config --add remote.github.push '+refs/notes/*:refs/notes/*'
 # - etc.
 # - touch freebsd-base.git/git-daemon-export-ok
-# - svn2git/svn-all-fast-export --rules ~git/freebsd-base.rules --add-metadata-notes --identity-domain FreeBSD.org /home/svn/base
+# - svn2git/svn-all-fast-export --rules freebsd-base.rules --add-metadata-notes --identity-domain FreeBSD.org /home/svn/freebsd-base.svn
 # - git push github
 # done. Analog steps needed for doc and ports.
 #
-# For git-svn it's a bit more involved. We use separate working dirs, but push to the same destination repo.
-# - git svn init -Thead -rewrite-root=svn+ssh://svn.freebsd.org/base file:///home/svn/base src-head.git
-# - cd src-head.git
+# 3. git-svn conversion: we use separate working dirs, but push to the same destination repo.
+# - git svn init -Thead --rewrite-root=svn+ssh://svn.freebsd.org/base file:///home/svn/freebsd-base.svn base-head.git
+# - git svn init -Thead --rewrite-root=svn+ssh://svn.freebsd.org/doc file:///home/svn/freebsd-doc.svn doc-head.git
+# - git svn init -Thead --rewrite-root=svn+ssh://svn.freebsd.org/ports file:///home/svn/freebsd-ports.svn ports-head.git
+# - cd base-head.git
 # - git svn fetch -r 0:1000
 # - git config --global push.default matching
-# - git remote add github github.com:freebsd/freebsd.git
+# - git remote add github base.github.com:freebsd/freebsd.git
 # - git config --add remote.github.push '+refs/remotes/trunk:refs/heads/svn_head'
 # - git svn rebase
 # - git push github
-
+#
+# 4. For using different SSH keys with github, you need to fuzz your .ssh/config like so:
+#
+# Host base.github.com
+#   User git
+#   Hostname github.com
+#   IdentityFile ~/.ssh/github_base
+#
+# And similar for ports and doc.
 : ${BASE=/home/git}
 : ${RULES_DIR=${BASE}}
 : ${SVN2GIT=/usr/local/bin/svn2git}
 
-: ${SRC_REPO=/home/svn/base}
-: ${DOC_REPO=/home/svn/doc}
-: ${PORTS_REPO=/home/svn/ports}
+# xxx_REPO are legacy names, TODO remove them ...
+: ${REPO_base=${SRC_REPO:-/home/svn/base}}
+: ${REPO_doc=${DOC_REPO:-/home/svn/doc}}
+: ${REPO_ports=${PORTS_REPO:-/home/svn/ports}}
 
 usage()
 {
@@ -98,20 +135,59 @@ svn2git()
 
     cd $BASE
     echo "Converting $source to $target using svn2git"
-    $SVN2GIT --add-metadata-notes --identity-domain FreeBSD.org \
-	--rules $rules $source
+    $SVN2GIT --add-metadata-notes --identity-domain FreeBSD.org --rules $rules $source
     if [ $? != 0 ]; then
 	echo "Error in svn2git conversion of $source" >&2
 	exit 1
     fi
     touch $target/git-daemon-export-ok
+    cd $target
+    if ! git config --local --get push.default >/dev/null; then
+	git config --local push.default matching
+    fi
+    if ! git config --local --get remote.github.url >/dev/null; then
+	# We use fake github hosts like ports.github.com, which we fix in our
+	# .ssh/config *and* apply a per-repo ssh key, which is the whole point
+	# of this hack.
+	case "$TYPE" in
+	    base)
+		git remote add github $TYPE.github.com:freebsd/freebsd.git
+		git config --add remote.github.push '+refs/heads/master:refs/heads/master'
+		git config --add remote.github.push '+refs/heads/projects/*:refs/heads/projects/*'
+		git config --add remote.github.push '+refs/heads/release/*:refs/heads/release/*'
+		git config --add remote.github.push '+refs/heads/releng/*:refs/heads/releng/*'
+		git config --add remote.github.push '+refs/heads/stable/*:refs/heads/stable/*'
+		git config --add remote.github.push '+refs/heads/user/*:refs/heads/user/*'
+		git config --add remote.github.push '+refs/notes/*:refs/notes/*'
+
+		git remote add bitbucket ssh://git@bitbucket.org/freebsd/freebsd-$TYPE.git
+		git config --add remote.bitbucket.push '+refs/heads/master:refs/heads/master'
+		git config --add remote.bitbucket.push '+refs/heads/stable/*:refs/heads/stable/*'
+		git config --add remote.bitbucket.push '+refs/notes/*:refs/notes/*'
+		;;
+	    doc)
+		git remote add github $TYPE.github.com:freebsd/freebsd-$TYPE.git
+		git config --add remote.github.push '+refs/heads/master:refs/heads/master'
+		git config --add remote.github.push '+refs/heads/projects/*:refs/heads/projects/*'
+		git config --add remote.github.push '+refs/heads/release/*:refs/heads/release/*'
+		git config --add remote.github.push '+refs/notes/*:refs/notes/*'
+		;;
+	    ports)
+		git remote add github $TYPE.github.com:freebsd/freebsd-$TYPE.git
+		git config --add remote.github.push '+refs/heads/branches/*:refs/heads/branches/*'
+		git config --add remote.github.push '+refs/heads/master:refs/heads/master'
+		git config --add remote.github.push '+refs/heads/projects/*:refs/heads/projects/*'
+		git config --add remote.github.push '+refs/notes/*:refs/notes/*'
+		;;
+	esac
+    fi
 
     if [ -z "$dest" -o -n "$run_local" ]; then
 	return
     fi
 
     echo "Pushing $target to $dest"
-    cd $target && for d in $dest; do
+    for d in $dest; do
 	git push $d || { echo "Error in pushing to $dest" >&2; exit 1; }
     done
 }
@@ -122,7 +198,18 @@ gitsvn()
     target=$1; shift
     dest="$@"
 
-    test -d "$BASE/$target/.git" || { echo "$BASE/$target is not a git repo, exiting ..." >&2; exit 1; }
+    cd $BASE
+    if ! test -d "$BASE/$target/.git"; then
+	echo "$BASE/$target is not a git repo, creating first revisions ..."
+	git svn init -Thead --rewrite-root=svn+ssh://svn.freebsd.org/$TYPE file://`eval echo \\\${REPO_${TYPE}}` $BASE/$target
+	cd $BASE/$target && git svn fetch -r 0:100
+	git config --local push.default matching
+	case "$TYPE" in
+	    base) git remote add github $TYPE.github.com:freebsd/freebsd.git ;;
+	    *) git remote add github $TYPE.github.com:freebsd/freebsd-$TYPE.git ;;
+	esac
+	git config --add remote.github.push '+refs/remotes/trunk:refs/heads/svn_head'
+    fi
     cd $BASE/$target
     echo "Converting $target using git-svn"
     git svn rebase
@@ -143,7 +230,7 @@ gitsvn()
 
 if [ -n "$do_gitsvn" ]; then
     case "$TYPE" in
-	base) gitsvn src-head.git github ;;
+	base) gitsvn base-head.git github ;;
 	doc) gitsvn doc-head.git github ;;
 	ports) gitsvn ports-head.git github ;;
     esac
@@ -151,8 +238,8 @@ fi
 
 if [ -n "$do_svn2git" ]; then
     case "$TYPE" in
-	base) svn2git $RULES_DIR/freebsd-base.rules ${SRC_REPO} github bitbucket ;;
-	doc) svn2git $RULES_DIR/freebsd-doc.rules ${DOC_REPO} github ;;
-	ports) svn2git $RULES_DIR/freebsd-ports.rules ${PORTS_REPO} github ;;
+	base) svn2git $RULES_DIR/freebsd-base.rules ${REPO_base} github bitbucket ;;
+	doc) svn2git $RULES_DIR/freebsd-doc.rules ${REPO_doc} github ;;
+	ports) svn2git $RULES_DIR/freebsd-ports.rules ${REPO_ports} github ;;
     esac
 fi


More information about the svn-src-user mailing list