Add -copy-objects option
[mirror/qt/qt5.git] / init-repository
1 #!/usr/bin/perl
2 #############################################################################
3 ##
4 ## Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
5 ## All rights reserved.
6 ## Contact: Nokia Corporation (qt-info@nokia.com)
7 ##
8 ## This file is part of the utilities of the Qt Toolkit.
9 ##
10 ## $QT_BEGIN_LICENSE:LGPL$
11 ## No Commercial Usage
12 ## This file contains pre-release code and may not be distributed.
13 ## You may use this file in accordance with the terms and conditions
14 ## contained in the Technology Preview License Agreement accompanying
15 ## this package.
16 ##
17 ## GNU Lesser General Public License Usage
18 ## Alternatively, this file may be used under the terms of the GNU Lesser
19 ## General Public License version 2.1 as published by the Free Software
20 ## Foundation and appearing in the file LICENSE.LGPL included in the
21 ## packaging of this file.  Please review the following information to
22 ## ensure the GNU Lesser General Public License version 2.1 requirements
23 ## will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
24 ##
25 ## In addition, as a special exception, Nokia gives you certain additional
26 ## rights.  These rights are described in the Nokia Qt LGPL Exception
27 ## version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
28 ##
29 ## If you have questions regarding the use of this file, please contact
30 ## Nokia at qt-info@nokia.com.
31 ##
32 ##
33 ##
34 ##
35 ##
36 ##
37 ##
38 ##
39 ## $QT_END_LICENSE$
40 ##
41 #############################################################################
42
43 use strict;
44 use warnings;
45
46 my $force = 0;
47 my $quiet = 0;
48 my $nokia_developer = 0;
49 my $no_webkit = 0;
50 my $no_update = 0;
51 my $ignore_submodules = 0;
52 my $alternates = "";
53 my $detach_alternates = 0;
54 my $mirror_url = "";
55 my $mirror_webkit_url = "";
56
57 my $protocol = "";
58 my %protocols = (
59     'internal' => 'git://scm.dev.nokia.troll.no',
60     'ssh' => 'git@scm.dev.nokia.troll.no',
61     'http' => 'http://git.gitorious.org'
62 );
63
64 sub system_v
65 {
66     if (!$quiet) {
67         print "+ ";
68         print @_;
69         print "\n";
70     }
71     return system(@_);
72 }
73
74 sub printUsage
75 {
76     print("$0 <options>\n");
77     print("  -f               Force initialization.\n");
78     print("  -q               Quiet operation. Will exit cleanly if repository is already\n");
79     print("                   initialized.\n\n");
80
81     print("Module options\n");
82     print("  -no-webkit       Skip webkit and webkit examples submodules.\n");
83     print("  -no-update       Skip the 'git submodule update' command.\n");
84     print("  -ignore-submodules\n");
85     print("                   Ignores submodules when doing operations on qt5 repo, such\n");
86     print("                   as 'pull', 'fetch', 'diff' etc. Use\n");
87     print("                   --ignore-submodules=none to override, when needed\n\n");
88
89     print("Repository options:\n");
90     print("  -nokia-developer Switch to internal Nokia URLs.\n");
91     print("  -brisbane        Switch to internal Nokia URLs, and setup the brisbane\n");
92     print("                   mirrors. (Uses the -mirror and -mirror-webkit options.)\n");
93     print("  -ssh             Use SSH protocol, for restrictive firewalls. Note that this\n");
94     print("                   requires a user account with an uploaded SSH key on all\n");
95     print("                   servers used. (Implies -nokia-developer!)\n");
96     print("  -http            Use HTTP protocol, for restrictive firewalls. Note that this\n");
97     print("                   only works with the external Gitorious server.\n");
98     print("  -alternates=<path to other Qt5 repo>\n");
99     print("                   Adds alternates for each submodule to another full qt5\n");
100     print("                   checkout. This makes this qt5 checkout very small, as it\n");
101     print("                   will use the object store of the alternates before unique\n");
102     print("                   objects are stored in its own object store.\n");
103     print("                   PS: This option does not work with -no-update!\n");
104     print("                   PSS:This will make this repo dependent on the alternate!\n");
105     print("                       The dependency can be broken by running 'git repack -a'\n");
106     print("                       in each submodule, where required.\n");
107     print("  -copy-objects    Copies all objects from the alternates into the individual\n");
108     print("                   repos, to ensure that the repositories are independent from\n");
109     print("                   the source used as a reference for cloning.\n");
110     print("  -mirror=<url>    Uses <url> as the base URL for cloning submodules.\n");
111     print("                     -mirror=user\@machine/foo/bar\n");
112     print("                   while for example clone qtbase from\n");
113     print("                     user\@machine/foo/bar/qtbase.git\n");
114     print("  -mirror-webkit=<url>\n");
115     print("                   Uses <url> as the URL for cloning webkit.\n");
116 }
117
118 while (@ARGV) {
119     my $arg = $ARGV[0];
120     if ($arg eq "-f") {
121         $force = 1;
122     } elsif ($arg eq "-q") {
123         $quiet = 1;
124     } elsif ($arg eq "-brisbane" || $arg eq "-brisbane-nokia-developer") {
125         $nokia_developer = 1;
126         $mirror_url = "git://bq-git.apac.nokia.com/qtsoftware/qt/";
127         $mirror_webkit_url = "git://bq-git.apac.nokia.com/qtsoftware/research/gitorious-org-webkit-qtwebkit-mirror.git";
128     } elsif ($arg eq "-nokia-developer") {
129         $nokia_developer = 1;
130         $protocol = "internal";
131     } elsif ($arg eq "-ssh" || $arg eq "-ssh-protocol") {
132         $protocol = "ssh";
133     } elsif ($arg eq "-http") {
134         if ($nokia_developer) {
135             print("*** Ignoring use of HTTP protocol, as it's only usable with external server\n");
136         } else {
137             $protocol = "http";
138         }
139     } elsif ($arg eq "/?" || $arg eq "-?" || $arg eq "/h" || $arg eq "-h" || $arg eq "--help") {
140         printUsage();
141         exit 0;
142     } elsif ($arg eq "-no-webkit") {
143         $no_webkit = 1;
144     } elsif ($arg eq "-no-update") {
145         $no_update = 1;
146     } elsif ($arg eq "-ignore-submodules") {
147         $ignore_submodules = 1;
148     } elsif ($arg =~ /-alternates=(.*)/) {
149         $alternates = "$1";
150     } elsif ($arg eq "-copy-objects") {
151         $detach_alternates = 1;
152     } elsif ($arg =~ /-mirror=(.*)/) {
153         $mirror_url = "$1/";
154         $mirror_url =~ s,\/\/+$,/,;
155     } elsif ($arg =~ /-mirror-webkit=(.*)/) {
156         $mirror_webkit_url = "$1"
157     } else {
158         print("*** Unknown option: $arg\n");
159         printUsage();
160         exit(1);
161     }
162     shift;
163 }
164
165 if (`git config --get submodule.qtbase.url`) {
166     if ($force) {
167         my @configresult = `git config -l`;
168         foreach (@configresult) {
169             if (/(submodule\.[^.=]+)\.url=.*/) {
170                 system_v("git config --remove-section $1");
171             }
172         }
173     } else {
174         exit 0 if ($quiet);
175         print("Will not reinitialize already initialized repository (use -f to force)!\n");
176         exit 1;
177     }
178 }
179
180 my $init_args = "";
181 $init_args = "-q" if ($quiet);
182 system_v("git submodule init $init_args");
183 if ($no_webkit){
184     system_v("git config --remove submodule.qtwebkit");
185     system_v("git config --remove submodule.qtwebkit-examples-and-demos");
186 }
187
188 my @configresult = `git config -l`;
189 my $proto = $protocols{$protocol};
190 foreach (@configresult) {
191     if (/(submodule\.[^.=]+\.url)=(.*)/) {
192         my $key = $1;
193         my $value = $2;
194         if ($protocol) {
195             # WebKit is special, and has only external link.
196             if ($key ne "submodule.qtwebkit.url") {
197                 # qt-labs projects are still hosted under qt internally.
198                 $value =~ s,^git://gitorious\.org/qt-labs/,$proto/qt/, if ($protocol ne "http") ;
199                 $value =~ s,^git://gitorious\.org/,$proto/,;
200             }
201         }
202         system_v("git config \"$key\" \"$value\"");
203         if ($ignore_submodules) {
204             $key =~ s,\.url,.ignore,;
205             system_v("git config \"$key\" \"all\"");
206         }
207     }
208 }
209
210 # manually clone each repo here, so we can easily use reference repos, mirrors and add all staging
211 # repos
212 if (!$no_update) {
213     @configresult = `git config -l`;
214     foreach (@configresult) {
215         if(/submodule\.([^.=]+)\.url=(.*)/){
216             my $repo = $1;
217             my $url = $2;
218             my $ref = "";
219             if ($alternates) {
220                 if (-d "$alternates/$repo") {
221                     $ref = "--reference $alternates/$repo";
222                 } else {
223                     print(" *** $alternates/$repo not found, ignoring alternate for this submodule\n");
224                 }
225             }
226             if (($mirror_url && $repo ne "qtwebkit") || ($mirror_webkit_url && $repo eq "qtwebkit") {
227                 my $mirror = $mirror_url.$repo;
228                 $mirror .= ".git" unless (-d $mirror); # Support local disk mirror
229                 $mirror = $mirror_webkit_url if ($repo eq "qtwebkit");
230                 system_v("git clone $ref $mirror $repo");
231                 chdir($repo) or die "'cd $repo' failed...";
232                 system_v("git config remote.origin.url $url");
233                 system_v("git remote add mirror $mirror");
234                 chdir("..") or die "'cd ..' failed..";
235             } else {
236                 system_v("git clone $ref $url $repo");
237             }
238             if ($detach_alternates) {
239                 chdir($repo) or die "'cd $repo' failed...";
240                 system_v("git repack -a");
241                 unlink(".git/objects/info/alternates");
242                 chdir("..") or die "'cd ..' failed..";
243             }
244         }
245     }
246 }
247
248 unless ($no_update){
249     system_v("git submodule update");
250 }