#!/usr/bin/perl ############################################################################# ## ## Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). ## All rights reserved. ## Contact: Nokia Corporation (qt-info@nokia.com) ## ## This file is part of the utilities of the Qt Toolkit. ## ## $QT_BEGIN_LICENSE:LGPL$ ## No Commercial Usage ## This file contains pre-release code and may not be distributed. ## You may use this file in accordance with the terms and conditions ## contained in the Technology Preview License Agreement accompanying ## this package. ## ## GNU Lesser General Public License Usage ## Alternatively, this file may be used under the terms of the GNU Lesser ## General Public License version 2.1 as published by the Free Software ## Foundation and appearing in the file LICENSE.LGPL included in the ## packaging of this file. Please review the following information to ## ensure the GNU Lesser General Public License version 2.1 requirements ## will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. ## ## In addition, as a special exception, Nokia gives you certain additional ## rights. These rights are described in the Nokia Qt LGPL Exception ## version 1.1, included in the file LGPL_EXCEPTION.txt in this package. ## ## If you have questions regarding the use of this file, please contact ## Nokia at qt-info@nokia.com. ## ## ## ## ## ## ## ## ## $QT_END_LICENSE$ ## ############################################################################# use strict; use warnings; my $force = 0; my $quiet = 0; my $nokia_developer = 0; my $no_webkit = 0; my $no_update = 0; my $ignore_submodules = 0; my $alternates = ""; my $mirror_url = ""; my $mirror_webkit_url = ""; my $protocol = ""; my %protocols = ( 'internal' => 'git://scm.dev.nokia.troll.no', 'ssh' => 'git@scm.dev.nokia.troll.no', 'http' => 'http://git.gitorious.org' ); sub system_v { if (!$quiet) { print "+ "; print @_; print "\n"; } return system(@_); } sub printUsage { print("$0 \n"); print(" -f Force initialization.\n"); print(" -q Quiet operation. Will exit cleanly if repository is already\n"); print(" initialized.\n\n"); print("Module options\n"); print(" -no-webkit Skip webkit and webkit examples submodules.\n"); print(" -no-update Skip the 'git submodule update' command.\n"); print(" -ignore-submodules\n"); print(" Ignores submodules when doing operations on qt5 repo, such\n"); print(" as 'pull', 'fetch', 'diff' etc. Use\n"); print(" --ignore-submodules=none to override, when needed\n\n"); print("Repository options:\n"); print(" -nokia-developer Switch to internal Nokia URLs.\n"); print(" -brisbane Switch to internal Nokia URLs, and setup the brisbane\n"); print(" mirrors. (Uses the -mirror and -mirror-webkit options.)\n"); print(" -ssh Use SSH protocol, for restrictive firewalls. Note that this\n"); print(" requires a user account with an uploaded SSH key on all\n"); print(" servers used. (Implies -nokia-developer!)\n"); print(" -http Use HTTP protocol, for restrictive firewalls. Note that this\n"); print(" only works with the external Gitorious server.\n"); print(" -alternates=\n"); print(" Adds alternates for each submodule to another full qt5\n"); print(" checkout. This makes this qt5 checkout very small, as it\n"); print(" will use the object store of the alternates before unique\n"); print(" objects are stored in its own object store.\n"); print(" PS: This option does not work with -no-update!\n"); print(" PSS:This will make this repo dependent on the alternate!\n"); print(" The dependency can be broken by running 'git repack -a'\n"); print(" in each submodule, where required.\n"); print(" -mirror= Uses as the base URL for cloning submodules.\n"); print(" -mirror=user\@machine/foo/bar\n"); print(" while for example clone qtbase from\n"); print(" user\@machine/foo/bar/qtbase.git\n"); print(" -mirror-webkit=\n"); print(" Uses as the URL for cloning webkit.\n"); } while (@ARGV) { my $arg = $ARGV[0]; if ($arg eq "-f") { $force = 1; } elsif ($arg eq "-q") { $quiet = 1; } elsif ($arg eq "-brisbane" || $arg eq "-brisbane-nokia-developer") { $nokia_developer = 1; $mirror_url = "git://bq-git.apac.nokia.com/qtsoftware/qt/"; $mirror_webkit_url = "git://bq-git.apac.nokia.com/qtsoftware/research/gitorious-org-webkit-qtwebkit-mirror.git"; } elsif ($arg eq "-nokia-developer") { $nokia_developer = 1; $protocol = "internal"; } elsif ($arg eq "-ssh" || $arg eq "-ssh-protocol") { $protocol = "ssh"; } elsif ($arg eq "-http") { if ($nokia_developer) { print("*** Ignoring use of HTTP protocol, as it's only usable with external server\n"); } else { $protocol = "http"; } } elsif ($arg eq "/?" || $arg eq "-?" || $arg eq "/h" || $arg eq "-h" || $arg eq "--help") { printUsage(); exit 0; } elsif ($arg eq "-no-webkit") { $no_webkit = 1; } elsif ($arg eq "-no-update") { $no_update = 1; } elsif ($arg eq "-ignore-submodules") { $ignore_submodules = 1; } elsif ($arg =~ /-alternates=(.*)/) { $alternates = "$1"; } elsif ($arg =~ /-mirror=(.*)/) { $mirror_url = "$1/"; $mirror_url =~ s,\/\/+$,/,; } elsif ($arg =~ /-mirror-webkit=(.*)/) { $mirror_webkit_url = "$1" } else { print("*** Unknown option: $arg\n"); printUsage(); exit(1); } shift; } if (`git config --get submodule.qtbase.url`) { if ($force) { my @configresult = `git config -l`; foreach (@configresult) { if (/(submodule\.[^.=]+)\.url=.*/) { system_v("git config --remove-section $1"); } } } else { exit 0 if ($quiet); print("Will not reinitialize already initialized repository (use -f to force)!\n"); exit 1; } } my $init_args = ""; $init_args = "-q" if ($quiet); system_v("git submodule init $init_args"); if ($no_webkit){ system_v("git config --remove submodule.qtwebkit"); system_v("git config --remove submodule.qtwebkit-examples-and-demos"); } my @configresult = `git config -l`; my $proto = $protocols{$protocol}; foreach (@configresult) { if (/(submodule\.[^.=]+\.url)=(.*)/) { my $key = $1; my $value = $2; if ($protocol) { # WebKit is special, and has only external link. if ($key ne "submodule.qtwebkit.url") { # qt-labs projects are still hosted under qt internally. $value =~ s,^git://gitorious\.org/qt-labs/,$proto/qt/, if ($protocol ne "http") ; $value =~ s,^git://gitorious\.org/,$proto/,; } } system_v("git config \"$key\" \"$value\""); if ($ignore_submodules) { $key =~ s,\.url,.ignore,; system_v("git config \"$key\" \"all\""); } } } # manually clone each repo here, so we can easily use reference repos, mirrors and add all staging # repos if (!$no_update) { @configresult = `git config -l`; foreach (@configresult) { if(/submodule\.([^.=]+)\.url=(.*)/){ my $repo = $1; my $url = $2; my $ref = ""; if ($alternates) { if (-d "$alternates/$repo") { $ref = "--reference $alternates/$repo"; } else { print(" *** $alternates/$repo not found, ignoring alternate for this submodule\n"); } } if (($mirror_url && $repo ne "qtwebkit") || ($mirror_webkit_url && $repo eq "qtwebkit") { my $mirror = $mirror_url.$repo; $mirror .= ".git" unless (-d $mirror); # Support local disk mirror $mirror = $mirror_webkit_url if ($repo eq "qtwebkit"); system_v("git clone $ref $mirror $repo"); chdir($repo) or die "'cd $repo' failed..."; system_v("git config remote.origin.url $url"); system_v("git remote add mirror $mirror"); chdir("..") or die "'cd ..' failed.."; } else { system_v("git clone $ref $url $repo"); } } } } unless ($no_update){ system_v("git submodule update"); }