-
-
Notifications
You must be signed in to change notification settings - Fork 372
/
update-submodules.pl
executable file
·90 lines (77 loc) · 2.49 KB
/
update-submodules.pl
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
#!/usr/bin/env perl
# Copyright (C) 2009-2019 The Perl Foundation
use 5.10.1;
use strict;
use warnings;
use Getopt::Long;
use Cwd;
use File::Spec;
my $repo = shift @ARGV;
chdir $repo;
exit 0 if !-d '.git';
my $git_cache_dir;
Getopt::Long::Configure("pass_through");
Getopt::Long::GetOptions('git-cache-dir=s' => \$git_cache_dir);
print 'Updating submodules .................................... ';
exec_and_check('git', 'submodule', 'sync', '--quiet', 'Submodule sync failed for an unknown reason.');
exec_and_check('git', 'submodule', '--quiet', 'init', 'Submodule init failed for an unknown reason.');
if ($git_cache_dir) {
my $out = exec_with_output('git', 'submodule', 'status');
if ($? >> 8 != 0) {
print "\n===SORRY=== ERROR: Submodule status failed for an unknown reason.\n";
print "The error message was: $out\n";
exit 1;
}
for my $smodline (split(/^/m, $out)) {
chomp $smodline;
if ($smodline !~ /^.[0-9a-f]+ ([^ ]+)(?:$| )/) {
print "\n===SORRY=== ERROR: "
. "Submodule status output looks unexpected: '$smodline'";
exit 1;
}
my $smodpath = $1;
my $smodname = (File::Spec->splitdir($smodpath))[-1];
my $modrefdir = File::Spec->catdir($git_cache_dir, $smodname);
my $url = exec_with_output('git', 'config', "submodule.$smodpath.url");
chomp $url;
if (!$url) {
print "Couldn't retrieve submodule URL for submodule $smodname\n";
exit 1;
}
if (!-e $modrefdir) {
exec_and_check('git', 'clone', '--quiet', '--bare', $url, $modrefdir, "Git clone of $url failed.");
}
else {
my $back = Cwd::cwd();
chdir $modrefdir;
exec_and_check('git', 'fetch', '--quiet', '--all', "Git fetch in $modrefdir failed.");
chdir $back;
}
exec_and_check('git', 'submodule', '--quiet', 'update', '--reference', $modrefdir, $smodpath);
}
}
else {
exec_and_check('git', 'submodule', '--quiet', 'update');
}
print "OK\n";
# Helper subs.
sub exec_with_output {
my @command = @_;
open(my $handle, '-|', @command);
my $out;
while(<$handle>) {
$out .= $_;
}
close $handle;
return $out;
}
sub exec_and_check {
my $msg = pop;
my @command = @_;
my $out = exec_with_output(@command);
if ($? >> 8 != 0) {
print "\n===SORRY=== ERROR: $msg\n";
print "The programs output was: $out\n";
exit 1;
}
}