Patchwork [build] Support mercurial in contrib/gcc_update

login
register
mail settings
Submitter Rainer Orth
Date Sept. 13, 2010, 11:39 a.m.
Message ID <ydd62y9swin.fsf@manam.CeBiTec.Uni-Bielefeld.DE>
Download mbox | patch
Permalink /patch/64583/
State New
Headers show

Comments

Rainer Orth - Sept. 13, 2010, 11:39 a.m.
For quite some time, I've been using Mercurial for GCC development, both
for its offline capability (doing most of the work at home without net
access) and its support for Mercurial Queues (mq, sort of an integrated
quilt).  For a while, I could use the (now defunct) hg mirror on
gcc.gnu.org, now I'm working off a self-built (with hg convert) local hg
mirror.

This patch adds hg support to contrib/gcc_updates.  While
straightforward in principal, it includes a couple of guards:

* The tree should be unmodified.

* There should be no mq patches pushed to avoid constantly having to
  re-merge the patches.

Besides hg support proper, the patch includes a slight restructuring of
the VCS support to accomodate additional systems in the future.

For ease of review, I'm including two forms of the patch:

* The first one was created with diff -wup, thus ignoring all whitespace
  differences, and keeps the ordering (first svn, then git) as is.

* The second one was generated without special options, sorts the VCS
  support alphabetically, and is what I'd like to commit.

Tested by running gcc_update on both SVN and hg trees (dirty and with
patches, clean and without patches).

Ok for mainline?

	Rainer


2010-09-11  Rainer Orth  <ro@CeBiTec.Uni-Bielefeld.DE>

	* gcc_update: Handle hg, too.
Paolo Bonzini - Sept. 13, 2010, 12:13 p.m.
On 09/13/2010 01:39 PM, Rainer Orth wrote:
> * The second one was generated without special options, sorts the VCS
>    support alphabetically, and is what I'd like to commit.

Ok.

Paolo

Patch

--- solaris.2f230d1fdf41/contrib/gcc_update	2010-09-13 13:13:03.516038925 +0200
+++ solaris.c62ca57e6c3d/contrib/gcc_update	2010-09-13 13:13:03.770104519 +0200
@@ -1,10 +1,11 @@ 
 #! /bin/sh
 #
-# Update a local Subversion tree from the GCC repository, with an emphasis
-# on treating generated files correctly, so that autoconf, gperf et
-# al are not required for the ``end'' user.
+# Update a local Subversion, Git or Mercurial tree from the GCC
+# repository, with an emphasis on treating generated files correctly, so
+# that autoconf, gperf et al are not required for the ``end'' user.
 #
-# (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation
+# (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2009, 2010
+# Free Software Foundation
 # Originally by Gerald Pfeifer <pfeifer@dbai.tuwien.ac.at>, August 1998.
 #
 # This script is Free Software, and it can be copied, distributed and
@@ -12,8 +13,8 @@ 
 # its license can be downloaded from http://www.gnu.org/copyleft/gpl.html
 #
 #
-# By default all command-line options are passed to `svn update` in
-# addition to $UPDATE_OPTIONS (defined below). If the first parameter
+# By default all command-line options are passed to `svn update` or `hg/git
+# pull` in addition to $UPDATE_OPTIONS (defined below). If the first parameter
 # reads --nostdflags, $UPDATE_OPTIONS as well as this parameter itself
 # are omitted.
 #
@@ -38,9 +39,7 @@ 
 # contrib/gcc_update --list
 
 
-# SVN command
-GCC_SVN=${GCC_SVN-${SVN-svn}}
-# Default options used when updating via SVN (none).
+# Default options used when updating (none).
 UPDATE_OPTIONS=""
 
 # Set the locale to C to make this script work for users with foreign
@@ -245,14 +244,18 @@  p
 
 esac
 
-is_git=0
-# Check whether this indeed looks like a local SVN tree.
+# Check for known version control systems.
 if [ -d .git ]; then
     GCC_GIT=${GCC_GIT-${GIT-git}}
-    GCC_SVN="true -"
-    is_git=1
-elif [ ! -d .svn ]; then
-    echo "This does not seem to be a GCC SVN tree!"
+    vcs_type="git"
+elif [ -d .hg ]; then
+    GCC_HG=${GCC_HG-${HG-hg}}
+    vcs_type="hg"
+elif [ -d .svn ]; then
+    GCC_SVN=${GCC_SVN-${SVN-svn}}
+    vcs_type="svn"
+else
+    echo "This does not seem to be a GCC GIT/HG/SVN tree!"
     exit
 fi
 
@@ -263,7 +266,8 @@  else
     set -- $UPDATE_OPTIONS ${1+"$@"}
 fi
 
-if [ $is_git -eq 0 ]; then
+case $vcs_type in
+    svn)
 chat "Updating SVN tree"
 
 $GCC_SVN ${silent+-q}  --non-interactive update ${1+"$@"}
@@ -273,8 +277,6 @@  if [ $? -ne 0 ]; then
     exit 1
 fi
 
-rm -f LAST_UPDATED gcc/REVISION
-
 revision=`svn info | awk '/Revision:/ { print $2 }'`
 branch=`svn info | sed -ne "/URL:/ {
 s,.*/trunk,trunk,
@@ -282,34 +284,78 @@  s,.*/branches/,,
 s,.*/tags/,,
 p
 }"`
-{
-  date
-  echo "`TZ=UTC date` (revision $revision)"
-} > LAST_UPDATED
-
-echo "[$branch revision $revision]" > gcc/REVISION
+	;;
 
-else
+    git)
     chat "Updating GIT tree"
+
     $GCC_GIT diff --quiet --exit-code HEAD
     if [ $? -ne 0 ]; then
         echo "Attempting to update a dirty git tree!" >&2
         echo "Commit or stash your changes first and retry." >&2
         exit 1
     fi
+
     $GCC_GIT pull ${silent+-q} --rebase ${1+"$@"}
     if [ $? -ne 0 ]; then
         (touch_files_reexec)
         echo "git pull of full tree failed." >&2
         exit 1
     fi
-    rm -f LAST_UPDATED gcc/REVISION
+
     revision=`$GCC_GIT log -n1 --pretty=%p:%t:%H`
     branch=`$GCC_GIT name-rev --name-only HEAD || :`
+	;;    
+
+    hg)
+	chat "Updating HG tree"
+
+	# Add -q so untracked files aren't listed.
+	if [ `$GCC_HG status -q | wc -l` -gt 0 ]; then
+            echo "Attempting to update a dirty hg tree!" >&2
+            echo "Commit or revert your changes first and retry." >&2
+            exit 1
+	fi
+
+	# Check for mq extension.  mq patches must be popped so tip has
+	# been converted from the SVN tree.
+	if [ -d .hg/patches ] && [ `$GCC_HG qapplied | wc -l` -gt 0 ]; then
+	    # FIXME: Perhaps pop queue instead?  We could do that since we
+	    # know the tree is clean.
+	    echo "Attempting to update hg tree with mq patches applied!" >&2
+	    echo "Pop your patches first and retry." >&2
+	    exit 1
+	fi
+
+	# Update tree, but make sure to only pull the default branch.
+	# Otherwise all branches in the upstream repo are added, even if
+	# only a single one has been cloned.
+	$GCC_HG pull -u ${silent+-q} -r`$GCC_HG branch` ${1+"$@"}
+	if [ $? -ne 0 ]; then
+            (touch_files_reexec)
+            echo "hg pull of full tree failed." >&2
+            exit 1
+	fi
+
+	# Extract SVN revision corresponding to tip, as stored by hg convert.
+	# Before hg 1.4.3, there's no template keyword corresponding to the
+	# extra: tag, so need to use hg log --debug to extract the info.
+	revision=`$GCC_HG log --debug -l1 | \
+	    sed -ne "/^extra:.*convert_revision=svn:/ {
+	        s%^.*@%%
+		p
+	    }"`
+	branch=`$GCC_HG branch`
+	# trunk in SVN parlance shows up as default branch in hg.
+	[ x$branch = x"default" ] && branch="trunk"
+	;;
+esac
+
+rm -f LAST_UPDATED gcc/REVISION
     {
       date
       echo "`TZ=UTC date` (revision $revision)"
     } > LAST_UPDATED
     echo "[$branch revision $revision]" > gcc/REVISION
-fi
+
 touch_files_reexec


diff --git a/contrib/gcc_update b/contrib/gcc_update
--- a/contrib/gcc_update
+++ b/contrib/gcc_update
@@ -1,10 +1,11 @@ 
 #! /bin/sh
 #
-# Update a local Subversion tree from the GCC repository, with an emphasis
-# on treating generated files correctly, so that autoconf, gperf et
-# al are not required for the ``end'' user.
+# Update a local Subversion, Git or Mercurial tree from the GCC
+# repository, with an emphasis on treating generated files correctly, so
+# that autoconf, gperf et al are not required for the ``end'' user.
 #
-# (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation
+# (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2009, 2010
+# Free Software Foundation
 # Originally by Gerald Pfeifer <pfeifer@dbai.tuwien.ac.at>, August 1998.
 #
 # This script is Free Software, and it can be copied, distributed and
@@ -12,8 +13,8 @@ 
 # its license can be downloaded from http://www.gnu.org/copyleft/gpl.html
 #
 #
-# By default all command-line options are passed to `svn update` in
-# addition to $UPDATE_OPTIONS (defined below). If the first parameter
+# By default all command-line options are passed to `svn update` or `hg/git
+# pull` in addition to $UPDATE_OPTIONS (defined below). If the first parameter
 # reads --nostdflags, $UPDATE_OPTIONS as well as this parameter itself
 # are omitted.
 #
@@ -38,9 +39,7 @@ 
 # contrib/gcc_update --list
 
 
-# SVN command
-GCC_SVN=${GCC_SVN-${SVN-svn}}
-# Default options used when updating via SVN (none).
+# Default options used when updating (none).
 UPDATE_OPTIONS=""
 
 # Set the locale to C to make this script work for users with foreign
@@ -245,14 +244,18 @@ 
 
 esac
 
-is_git=0
-# Check whether this indeed looks like a local SVN tree.
+# Check for known version control systems.
 if [ -d .git ]; then
     GCC_GIT=${GCC_GIT-${GIT-git}}
-    GCC_SVN="true -"
-    is_git=1
-elif [ ! -d .svn ]; then
-    echo "This does not seem to be a GCC SVN tree!"
+    vcs_type="git"
+elif [ -d .hg ]; then
+    GCC_HG=${GCC_HG-${HG-hg}}
+    vcs_type="hg"
+elif [ -d .svn ]; then
+    GCC_SVN=${GCC_SVN-${SVN-svn}}
+    vcs_type="svn"
+else
+    echo "This does not seem to be a GCC GIT/HG/SVN tree!"
     exit
 fi
 
@@ -263,53 +266,96 @@ 
     set -- $UPDATE_OPTIONS ${1+"$@"}
 fi
 
-if [ $is_git -eq 0 ]; then
-chat "Updating SVN tree"
+case $vcs_type in
+    git)
+	chat "Updating GIT tree"
 
-$GCC_SVN ${silent+-q}  --non-interactive update ${1+"$@"}
-if [ $? -ne 0 ]; then
-    (touch_files_reexec)
-    echo "SVN update of full tree failed." >&2
-    exit 1
-fi
+	$GCC_GIT diff --quiet --exit-code HEAD
+	if [ $? -ne 0 ]; then
+            echo "Attempting to update a dirty git tree!" >&2
+            echo "Commit or stash your changes first and retry." >&2
+            exit 1
+	fi
+
+	$GCC_GIT pull ${silent+-q} --rebase ${1+"$@"}
+	if [ $? -ne 0 ]; then
+            (touch_files_reexec)
+            echo "git pull of full tree failed." >&2
+            exit 1
+	fi
+
+	revision=`$GCC_GIT log -n1 --pretty=%p:%t:%H`
+	branch=`$GCC_GIT name-rev --name-only HEAD || :`
+	;;    
+
+    hg)
+	chat "Updating HG tree"
+
+	# Add -q so untracked files aren't listed.
+	if [ `$GCC_HG status -q | wc -l` -gt 0 ]; then
+            echo "Attempting to update a dirty hg tree!" >&2
+            echo "Commit or revert your changes first and retry." >&2
+            exit 1
+	fi
+
+	# Check for mq extension.  mq patches must be popped so tip has
+	# been converted from the SVN tree.
+	if [ -d .hg/patches ] && [ `$GCC_HG qapplied | wc -l` -gt 0 ]; then
+	    # FIXME: Perhaps pop queue instead?  We could do that since we
+	    # know the tree is clean.
+	    echo "Attempting to update hg tree with mq patches applied!" >&2
+	    echo "Pop your patches first and retry." >&2
+	    exit 1
+	fi
+
+	# Update tree, but make sure to only pull the default branch.
+	# Otherwise all branches in the upstream repo are added, even if
+	# only a single one has been cloned.
+	$GCC_HG pull -u ${silent+-q} -r`$GCC_HG branch` ${1+"$@"}
+	if [ $? -ne 0 ]; then
+            (touch_files_reexec)
+            echo "hg pull of full tree failed." >&2
+            exit 1
+	fi
+
+	# Extract SVN revision corresponding to tip, as stored by hg convert.
+	# Before hg 1.4.3, there's no template keyword corresponding to the
+	# extra: tag, so need to use hg log --debug to extract the info.
+	revision=`$GCC_HG log --debug -l1 | \
+	    sed -ne "/^extra:.*convert_revision=svn:/ {
+	        s%^.*@%%
+		p
+	    }"`
+	branch=`$GCC_HG branch`
+	# trunk in SVN parlance shows up as default branch in hg.
+	[ x$branch = x"default" ] && branch="trunk"
+	;;
+
+    svn)
+	chat "Updating SVN tree"
+
+	$GCC_SVN ${silent+-q}  --non-interactive update ${1+"$@"}
+	if [ $? -ne 0 ]; then
+	    (touch_files_reexec)
+	    echo "SVN update of full tree failed." >&2
+	    exit 1
+	fi
+
+	revision=`svn info | awk '/Revision:/ { print $2 }'`
+	branch=`svn info | sed -ne "/URL:/ {
+	    s,.*/trunk,trunk,
+	    s,.*/branches/,,
+	    s,.*/tags/,,
+	    p
+	}"`
+	;;
+esac
 
 rm -f LAST_UPDATED gcc/REVISION
-
-revision=`svn info | awk '/Revision:/ { print $2 }'`
-branch=`svn info | sed -ne "/URL:/ {
-s,.*/trunk,trunk,
-s,.*/branches/,,
-s,.*/tags/,,
-p
-}"`
 {
-  date
-  echo "`TZ=UTC date` (revision $revision)"
+    date
+    echo "`TZ=UTC date` (revision $revision)"
 } > LAST_UPDATED
-
 echo "[$branch revision $revision]" > gcc/REVISION
 
-else
-    chat "Updating GIT tree"
-    $GCC_GIT diff --quiet --exit-code HEAD
-    if [ $? -ne 0 ]; then
-        echo "Attempting to update a dirty git tree!" >&2
-        echo "Commit or stash your changes first and retry." >&2
-        exit 1
-    fi
-    $GCC_GIT pull ${silent+-q} --rebase ${1+"$@"}
-    if [ $? -ne 0 ]; then
-        (touch_files_reexec)
-        echo "git pull of full tree failed." >&2
-        exit 1
-    fi
-    rm -f LAST_UPDATED gcc/REVISION
-    revision=`$GCC_GIT log -n1 --pretty=%p:%t:%H`
-    branch=`$GCC_GIT name-rev --name-only HEAD || :`
-    {
-      date
-      echo "`TZ=UTC date` (revision $revision)"
-    } > LAST_UPDATED
-    echo "[$branch revision $revision]" > gcc/REVISION
-fi
 touch_files_reexec