#!/bin/bash ## Take an existing, tar-based CiviCRM directory and convert it to a git working directory #### Helpers #### ## usage: do_gitify [git-checkout-options] function do_gitify() { REPO="$1" TGT="$2" TMP="${TGT}.tmp" shift 2 if [ -d "$TGT/.git" ]; then echo "[[Already checked out git repo ($TGT) -- skip $REPO]]" return fi [ -d $TGT ] || mkdir -p "$TGT" [ -d $TMP ] && rm -rf "$TMP" echo "[[Checkout $REPO ($TMP)]]" echo "[git clone "$@" "$REPO" "$TMP"]" git clone "$@" "$REPO" "$TMP" echo "[[Swap metadata]]" mv "$TMP/.git" "$TGT/.git" echo "[[Remove local modifications]]" pushd "$TGT" > /dev/null git checkout -- . popd > /dev/null rm -rf "$TMP" } ## add hook shims to a repo ## usage: do_hookify function do_hookify() { GIT_CANONICAL_REPO_NAME="$1" TGT="$2" HOOK_DIR="$3" if [ -n "$CIVICRM_GIT_HOOKS" ]; then echo "[[Install recommended hooks ($TGT)]]" for HOOK in commit-msg post-checkout post-merge pre-commit prepare-commit-msg post-commit pre-rebase post-rewrite ;do cat << TMPL > "$TGT/.git/hooks/$HOOK" #!/bin/bash if [ -f "\$GIT_DIR/${HOOK_DIR}/${HOOK}" ]; then ## Note: GIT_CANONICAL_REPO_NAME was not provided by early hook-stubs export GIT_CANONICAL_REPO_NAME="$GIT_CANONICAL_REPO_NAME" source "\$GIT_DIR/${HOOK_DIR}/${HOOK}" fi TMPL chmod +x "$TGT/.git/hooks/$HOOK" done else echo "[[Skip hook installation ($TGT) -- use \"--hooks\" to enable]]" fi } ## usage: do_svnify function do_svnify() { REPO="$1" TGT="$2" shift 2 if [ -d "$TGT/.svn" ]; then echo "[[Already checked out SVN repo ($TGT) -- skip $REPO]]" return fi [ -d $TGT ] || mkdir -p "$TGT" [ -d $TMP ] && rm -rf "$TMP" echo "[[Checkout $REPO ($TMP)]]" echo "[svn co \"$REPO\" \"$TGT\"]" svn co "$REPO" "$TGT" } function check_dep() { if [ -z "`which git`" ]; then echo "command not found: git" exit 3 fi if [ -z `which php` ]; then echo "command not found: php" fi } #### Main #### set -e CIVICRM_CMS="" GIT_BASE_URL="" CIVICRM_ROOT="" CIVICRM_L10N="" CIVICRM_GIT_HOOKS="" CIVICRM_BRANCH="master" while [ -n "$1" ]; do if [ "$1" == "--l10n" ]; then CIVICRM_L10N="$1" elif [ "$1" == "--hooks" ]; then CIVICRM_GIT_HOOKS="$1" elif [ -z "$CIVICRM_CMS" ]; then ## First arg CIVICRM_CMS="$1" elif [ -z "$GIT_BASE_URL" ]; then ## Second arg GIT_BASE_URL="$1" elif [ -z "$CIVICRM_ROOT" ]; then ## Third arg CIVICRM_ROOT="$1" else echo "unrecognized argument: $1" exit 2 fi shift done if [ -z "$CIVICRM_ROOT" -o ! -d "$CIVICRM_ROOT" -o -z "$GIT_BASE_URL" -o -z "$CIVICRM_CMS" ]; then echo "Convert a directory into a set of CiviCRM git clones" echo "usage: $0 [--l10n] [--hooks]" echo " : one of: Drupal|Drupal6|Joomla|WordPress|all" echo " : a base URL shared by the desiried git repos (e.g. git://github.com/civicrm)" echo " : the main directory containing CiviCRM" echo " --l10n: optionally fetch localization data; currently requires svn" echo " --hooks: optionally install recommended git hooks; the hooks are mostly" echo " tested with git CLI under Linux and OSX; they haven't been" echo " tested with git GUIs or Windows" echo "" echo "Note: If pointing to a pre-existing directory, your local changes may be replaced by" echo "the pristine code from git/svn. If you've made changes, then make sure there's a backup!" echo "" echo "example: $0 Drupal git://github.com/civicrm /var/www/drupal7/sites/all/modules/civicrm" echo " (checkout core code plus Drupal 7.x integration code using Git's read-only protocol)" echo "" echo "example: $0 Drupal6 https://github.com/civicrm /var/www/drupal6/sites/all/modules/civicrm" echo " (checkout core code plus Drupal 6.x integration code using read-only HTTP protocol)" echo "" echo "example: $0 all git@github.com:civicrm ~/src/civicrm l10n" echo " (checkout core code plus Drupal 7.x, Joomla, and WordPress integration code and l10n using SSH)" exit 1 fi check_dep do_gitify "${GIT_BASE_URL}/civicrm-core.git" "$CIVICRM_ROOT" -b "${CIVICRM_BRANCH}" do_hookify civicrm-core "$CIVICRM_ROOT" "../tools/scripts/git" do_gitify "${GIT_BASE_URL}/civicrm-packages.git" "$CIVICRM_ROOT/packages" -b "${CIVICRM_BRANCH}" do_hookify civicrm-packages "$CIVICRM_ROOT/packages" "../../tools/scripts/git" case "$CIVICRM_CMS" in Drupal) do_gitify "${GIT_BASE_URL}/civicrm-drupal.git" "$CIVICRM_ROOT/drupal" -b "7.x-${CIVICRM_BRANCH}" do_hookify civicrm-drupal "$CIVICRM_ROOT/drupal" "../../tools/scripts/git" ;; Drupal6) do_gitify "${GIT_BASE_URL}/civicrm-drupal.git" "$CIVICRM_ROOT/drupal" -b "6.x-${CIVICRM_BRANCH}" do_hookify civicrm-drupal "$CIVICRM_ROOT/drupal" "../../tools/scripts/git" ;; Joomla) do_gitify "${GIT_BASE_URL}/civicrm-joomla.git" "$CIVICRM_ROOT/joomla" -b "${CIVICRM_BRANCH}" do_hookify civicrm-joomla "$CIVICRM_ROOT/joomla" "../../tools/scripts/git" ;; WordPress) do_gitify "${GIT_BASE_URL}/civicrm-wordpress.git" "$CIVICRM_ROOT/WordPress" -b "${CIVICRM_BRANCH}" do_hookify civicrm-wordpress "$CIVICRM_ROOT/WordPress" "../../tools/scripts/git" ;; all) do_gitify "${GIT_BASE_URL}/civicrm-drupal.git" "$CIVICRM_ROOT/drupal" -b "7.x-${CIVICRM_BRANCH}" do_hookify civicrm-drupal "$CIVICRM_ROOT/drupal" "../../tools/scripts/git" do_gitify "${GIT_BASE_URL}/civicrm-joomla.git" "$CIVICRM_ROOT/joomla" -b "${CIVICRM_BRANCH}" do_hookify civicrm-joomla "$CIVICRM_ROOT/joomla" "../../tools/scripts/git" do_gitify "${GIT_BASE_URL}/civicrm-wordpress.git" "$CIVICRM_ROOT/WordPress" -b "${CIVICRM_BRANCH}" do_hookify civicrm-wordpress "$CIVICRM_ROOT/WordPress" "../../tools/scripts/git" ;; *) echo "Unrecognized CMS: $CIVICRM_CMS" esac if [ "$CIVICRM_L10N" == "--l10n" ]; then do_svnify "http://svn.civicrm.org/l10n/trunk" "$CIVICRM_ROOT/l10n" fi pushd "$CIVICRM_ROOT/xml" > /dev/null if [ -f "GenCode.php" ]; then echo "[[Generate files]]" php GenCode.php else echo "[[Skip \"Generate files\"]]" fi popd > /dev/null