From patchwork Mon Sep 13 11:39:12 2010 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Rainer Orth X-Patchwork-Id: 64583 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from sourceware.org (server1.sourceware.org [209.132.180.131]) by ozlabs.org (Postfix) with SMTP id D38D5B6F01 for ; Mon, 13 Sep 2010 21:39:45 +1000 (EST) Received: (qmail 2910 invoked by alias); 13 Sep 2010 11:39:43 -0000 Received: (qmail 2902 invoked by uid 22791); 13 Sep 2010 11:39:42 -0000 X-SWARE-Spam-Status: No, hits=-1.2 required=5.0 tests=AWL, BAYES_05, TW_QA, T_RP_MATCHES_RCVD X-Spam-Check-By: sourceware.org Received: from snape.CeBiTec.Uni-Bielefeld.DE (HELO smtp-relay.CeBiTec.Uni-Bielefeld.DE) (129.70.160.84) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Mon, 13 Sep 2010 11:39:35 +0000 Received: from localhost (localhost.CeBiTec.Uni-Bielefeld.DE [127.0.0.1]) by smtp-relay.CeBiTec.Uni-Bielefeld.DE (Postfix) with ESMTP id DE7A5700; Mon, 13 Sep 2010 13:39:32 +0200 (CEST) Received: from smtp-relay.CeBiTec.Uni-Bielefeld.DE ([127.0.0.1]) by localhost (malfoy.CeBiTec.Uni-Bielefeld.DE [127.0.0.1]) (amavisd-new, port 10024) with LMTP id 6vd2I392sSmX; Mon, 13 Sep 2010 13:39:25 +0200 (CEST) Received: from manam.CeBiTec.Uni-Bielefeld.DE (manam.CeBiTec.Uni-Bielefeld.DE [129.70.161.120]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by smtp-relay.CeBiTec.Uni-Bielefeld.DE (Postfix) with ESMTPS id 74E4A6FF; Mon, 13 Sep 2010 13:39:25 +0200 (CEST) Received: (from ro@localhost) by manam.CeBiTec.Uni-Bielefeld.DE (8.14.4+Sun/8.14.4/Submit) id o8DBdCjG009122; Mon, 13 Sep 2010 13:39:12 +0200 (MEST) From: Rainer Orth To: gcc-patches@gcc.gnu.org Cc: Paolo Bonzini Subject: [build] Support mercurial in contrib/gcc_update Date: Mon, 13 Sep 2010 13:39:12 +0200 Message-ID: User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/23.2 (usg-unix-v) MIME-Version: 1.0 X-IsSubscribed: yes Mailing-List: contact gcc-patches-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org Delivered-To: mailing list gcc-patches@gcc.gnu.org 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 * gcc_update: Handle hg, too. --- 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 , 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 , 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