#!/bin/bash # # This script will update all the modules listed below so that # common points to master in the common module. # # If you have many of the GStreamer modules checked out in a particular # directory, it's best to run this script from that directory. For # example, I check everything out in ~/gst, so this file is # ~/gst/common/update-common. To do an update, I do # 'cd ~/gst ; ./common/update-common'. This will automatically use # the refs in your existing checkout when cloning the temporary # checkout. Alternatively, you can use the reference variable below. # # Options: # # --dry-run : pass --dry-run to git push, don't actually push the changes # --keep : keep temporary checkouts around instead of deleting them # Set this variable to point to any directory containing existing # git # checkouts, and git will pull objects from there, decreasing # network usage. BRANCH=master reference=~/gst PUSHURL=ssh://git.freedesktop.org/git/gstreamer DRY_RUN= KEEP=no COMMON_COMMIT= set -e set -x modules="gstreamer gst-plugins-base gst-plugins-good gst-plugins-bad \ gst-plugins-ugly gst-libav gst-omx \ gst-rtsp-server gst-editing-services" topdir=`pwd` dir=`mktemp -d $topdir/common-update-XXXXXX` # process command line arguments set +x for arg in $@ do case $arg in --dry-run) DRY_RUN="--dry-run"; ;; --keep) KEEP="yes"; ;; --commit=*) COMMON_COMMIT="${arg#*=}"; DRY_RUN="--dry-run"; KEEP="yes"; ;; --help) echo echo "update-common supported command line options:" echo echo " --dry-run Don't actually push changes to the repository, use git push --dry-run" echo echo " --keep Don't delete temporary git checkout used for update operation, keep it around" echo echo " --commit=REF Update common to commit reference REF (for local testing, implies --dry-run --keep)" echo exit 0; ;; *) echo "Unknown command line argument $arg" echo "Supported: --dry-run, --keep" exit 1; ;; esac done set -x # create temporary checkouts of the modules for module in $modules do cd $dir if test -e $reference/$module/.git ; then pushd $reference/$module PUSHURL=`git config remote.origin.url | sed 's@\(git/gstreamer\).*@\1@'` popd git clone --reference $reference/$module/.git --shared ssh://git.freedesktop.org/git/gstreamer/$module elif test -e $topdir/$module/.git ; then pushd $topdir/$module PUSHURL=`git config remote.origin.url | sed 's@\(git/gstreamer\).*@\1@'` popd git clone --reference $topdir/$module/.git --shared $PUSHURL/$module else git clone $PUSHURL/$module fi cd $dir/$module # ignore modules that don't have such a branch if ! git show-ref origin/$BRANCH >/dev/null; then continue; fi if test $BRANCH = 'master'; then git checkout $BRANCH else git checkout -b $BRANCH origin/$BRANCH fi git submodule init # avoid downloading common submodule by re-using existing common checkout if test -e $reference/common/.git ; then git submodule update --reference $reference/common -- common elif test -e $topdir/common/.git ; then git submodule update --reference $topdir/common -- common else git submodule update fi # avoid downloading libav submodule by re-using existing checkout if test "$module" = "gst-libav"; then if test -e $reference/gst-libav/gst-libs/ext/libav/.git ; then git submodule update --reference $reference/gst-libav/gst-libs/ext/libav -- gst-libs/ext/gst-libav elif test -e $topdir/gst-libav/gst-libs/ext/libav/.git ; then git submodule update --reference $topdir/gst-libav/gst-libs/ext/libav/ -- gst-libs/ext/libav else git submodule update fi fi # for good measure in case there are any other submodules anywhere git submodule update cd $dir/$module/common ref_from=`git log --pretty=format:%h -n 1 HEAD` if test $BRANCH = 'master'; then git checkout $BRANCH else git checkout -b $BRANCH origin/$BRANCH fi git pull origin if [ -n "$COMMON_COMMIT" ] ; then echo "Forcing common to commit $COMMON_COMMIT"; git reset --hard $COMMON_COMMIT || { echo "Failed to git reset to $COMMON_COMMIT"; exit 1; } fi ref_to=`git log --pretty=format:%h -n 1 HEAD` echo updating common from $ref_from to $ref_to if [ "$ref_from" != "$ref_to" ] ; then cd $dir/$module # update autogen.sh for selected modules case $module in gstreamer|gst-plugins-base|gst-plugins-good|gst-plugins-ugly|gst-plugins-bad|gst-libav|gst-editing-services|gst-rtsp-server|gst-omx ) ./common/update-autogen git add autogen.sh ;; *) ;; esac # update README and MAINTAINERS for selected modules case $module in gstreamer|gst-plugins-base|gst-plugins-good|gst-plugins-ugly|gst-plugins-bad ) ./common/update-readmes --run-git-add ;; *) ;; esac # and finally update the common submodule git add common git commit -m "Automatic update of common submodule From $ref_from to $ref_to" fi cd $dir done for module in $modules do cd $dir/$module if git show-ref origin/$BRANCH >/dev/null; then git push $DRY_RUN origin $BRANCH fi done # delete temporary checkouts again if test "x$KEEP" != "xyes"; then rm -rf $dir fi