#!/bin/sh # --- SDE-COPYRIGHT-NOTE-BEGIN --- # This copyright note is auto-generated by ./scripts/Create-CopyPatch. # # Filename: bin/sde-update-tree # Copyright (C) 2007 - 2020 The OpenSDE Project # # More information can be found in the files COPYING and README. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; version 2 of the License. A copy of the # GNU General Public License can be found in the file COPYING. # --- SDE-COPYRIGHT-NOTE-END --- #Description: Updates the entire working tree [ -n "$SDEROOT" ] || export SDEROOT="$(cd "${0%/*}/.."; pwd -P)" . $SDEROOT/lib/libsde.in update_usage() { local progname="$(echo "${0##*/}" | sed -e 's,-, ,g')" cat <<-EOT Usage: $progname EOT } shortopts= longopts='help' options="$(getopt -o "$shortopts" -l "$longopts" -- "$@")" if [ $? -ne 0 ]; then update_usage exit -1 fi # load new arguments list eval set -- "$options" while [ $# -gt 0 ]; do case "$1" in --help) update_usage exit 0 ;; --) shift; break ;; *) echo_abort 1 "Unknown argument '$1', aborting." esac shift done # jump to the working tree's root # cd "$SDEROOT" tree="${SDEROOT##*/}" update_git() { local prefix="$1" local branch="$(git symbolic-ref -q HEAD | sed -e 's|^refs/heads/||')" local remote="$(git config branch.$branch.remote)" local remote_list="$(git remote)" local remote_branch= remote_branch_list= local changes=false if [ -z "$remote_list" ]; then echo_warning "$prefix: no remotes set" return 0 elif [ -n "$remote" -a -z "$( echo "$remote_list" | grep "^$remote\$" )" ]; then echo_abort 1 "$prefix: what?! '$remote' is gone!" elif [ -z "$remote" ]; then # uhm, get a good remote if [ "$( echo "$remote_list" | grep "^origin$" )" ]; then remote=origin else remote="$(echo "$remote_list" | head -n 1)" fi # and it's list of branches remote_branch_list="$(git branch -r | sed -n -e "s|^ $remote/||p" | grep -v '^HEAD$')" if [ -z "$remote_branch_list" ]; then echo_abort 1 "$prefix: no remote set, and couldn't guess one". elif [ "$( echo "$remote_branch_list" | grep "^$branch$" )" ]; then remote_branch="$branch" elif [ "$( echo "$remote_branch_list" | grep "^master$" )" ]; then remote_branch=master else remote_branch="$(echo "$remote_branch_list" | head -n 1)" fi echo_warning "$prefix: no remote set, assuming $remote/$remote_branch." git config branch.$branch.remote "$remote" git config branch.$branch.merge "refs/heads/$remote_branch" else echo_info "$prefix:" fi if git reset -q; then git remote prune "$remote" if [ -n "$(git ls-files -md)" ]; then changes=true git stash > /dev/null fi git pull --rebase if $changes; then git stash pop > /dev/null git status --porcelain fi fi if [ -x "./update.sh" ]; then ./update.sh "$prefix" fi } update_svn_nested() { trap ':' INT # find svn:externals, and filter out sub-externals svn st | grep '^X' | cut -c8- | tee /tmp/$$.nested | while read f; do sed -i -e "s|^$f/.*||;" -e '/^$/d;' /tmp/$$.nested done cat /tmp/$$.nested rm -f /tmp/$$.nested trap '-' INT } update_svn() { local prefix="$1" x= echo_info "$prefix:" svn up --ignore-externals if [ -x "./update.sh" ]; then ./update.sh "$prefix" fi # nested svn for x in $( update_svn_nested ); do ( cd "$x"; update_svn "$prefix/$x" ) done } # hunt for the roots of the sub-working trees # baseurl="$( git config remote.origin.url | sed -e 's|/[^/]*$||' )" [ -n "$baseurl" ] || baseurl="https://git.opensde.net/opensde" set -- . \ package:git+$baseurl/package-nopast.git \ $( ls -1d package/* target/* 2> /dev/null ) for x; do if [ "$x" != "${x%%:*}" ]; then url="${x#*:}" x="${x%%:*}" else url= fi if [ -e "$x" -a ! -d "$x/" ]; then continue elif [ "$x" = "." ]; then prefix="$tree" else prefix="$tree/$x" fi if [ ! -d "$x" ]; then case "$url" in "") echo_warning "$prefix: missing" ;; git+*) echo_info "$prefix" git clone "${url#git+}" "$x" ;; *) echo_warning "$prefix: invalid url ($url)" ;; esac elif [ -d "$x/.git" ]; then ( cd "$x" && update_git "$prefix" ) elif [ -d "$x/.svn" ]; then ( cd "$x" && update_svn "$prefix" ) fi done