Filename | /cygdrive/c/lo/libo-master/instsetoo_native/util/C:/lo/libo-master/solenv/bin/modules/installer/worker.pm |
Statements | Executed 10599374 statements in 78.8s |
Calls | P | F | Exclusive Time |
Inclusive Time |
Subroutine |
---|---|---|---|---|---|
3362894 | 4 | 1 | 32.9s | 32.9s | CORE:regcomp (opcode) | installer::worker::
29866 | 2 | 1 | 32.6s | 71.6s | replace_variables_in_string | installer::worker::
8 | 1 | 1 | 6.05s | 6.05s | CORE:backtick (opcode) | installer::worker::
29867 | 2 | 1 | 3.80s | 3.80s | CORE:sort (opcode) | installer::worker::
3315193 | 6 | 1 | 2.26s | 2.26s | CORE:subst (opcode) | installer::worker::
2 | 2 | 2 | 372ms | 6.45s | generate_cygwin_paths | installer::worker::
3 | 3 | 2 | 289ms | 327ms | collect_all_items_with_special_flag | installer::worker::
1 | 1 | 1 | 158ms | 176ms | remove_all_items_with_special_flag | installer::worker::
93648 | 6 | 1 | 129ms | 129ms | CORE:match (opcode) | installer::worker::
1 | 1 | 1 | 102ms | 401ms | resolving_hidden_flag | installer::worker::
1 | 1 | 1 | 23.2ms | 2.67s | collect_all_files_from_includepaths | installer::worker::
66 | 1 | 1 | 8.22ms | 8.22ms | key_in_a_is_also_key_in_b | installer::worker::
1 | 1 | 1 | 6.78ms | 17.0ms | BEGIN@32 | installer::worker::
1 | 1 | 1 | 5.13ms | 42.1ms | BEGIN@35 | installer::worker::
16 | 2 | 1 | 4.69ms | 4.69ms | CORE:ftfile (opcode) | installer::worker::
24 | 5 | 1 | 4.18ms | 4.18ms | CORE:ftdir (opcode) | installer::worker::
8 | 1 | 1 | 3.74ms | 3.74ms | CORE:unlink (opcode) | installer::worker::
1 | 1 | 1 | 2.53ms | 4.64ms | set_spellcheckerlanguages | installer::worker::
1 | 1 | 1 | 1.96ms | 2.41ms | BEGIN@42 | installer::worker::
8 | 1 | 1 | 1.74ms | 1.74ms | find_file_by_id | installer::worker::
1 | 1 | 1 | 1.08ms | 1.44ms | BEGIN@45 | installer::worker::
1 | 1 | 1 | 539µs | 1.61ms | add_variables_from_inc_to_hashref | installer::worker::
1 | 1 | 1 | 349µs | 459µs | BEGIN@30 | installer::worker::
1 | 1 | 1 | 137µs | 2.56s | analyze_and_save_logfile | installer::worker::
1 | 1 | 1 | 115µs | 7.38s | clean_output_tree | installer::worker::
1 | 1 | 1 | 64µs | 548ms | create_installation_directory | installer::worker::
1 | 1 | 1 | 56µs | 1.92ms | remove_old_installation_sets | installer::worker::
1 | 1 | 1 | 30µs | 340µs | put_scpactions_into_installset | installer::worker::
1 | 1 | 1 | 23µs | 152µs | BEGIN@33 | installer::worker::
1 | 1 | 1 | 21µs | 23µs | BEGIN@36 | installer::worker::
1 | 1 | 1 | 19µs | 68µs | BEGIN@31 | installer::worker::
1 | 1 | 1 | 17µs | 20µs | BEGIN@37 | installer::worker::
1 | 1 | 1 | 17µs | 74µs | BEGIN@40 | installer::worker::
1 | 1 | 1 | 17µs | 20µs | BEGIN@39 | installer::worker::
1 | 1 | 1 | 17µs | 65µs | BEGIN@34 | installer::worker::
1 | 1 | 1 | 17µs | 18µs | BEGIN@43 | installer::worker::
1 | 1 | 1 | 16µs | 16µs | collect_scpactions | installer::worker::
1 | 1 | 1 | 16µs | 19µs | BEGIN@38 | installer::worker::
1 | 1 | 1 | 15µs | 17µs | BEGIN@44 | installer::worker::
1 | 1 | 1 | 15µs | 18µs | BEGIN@41 | installer::worker::
0 | 0 | 0 | 0s | 0s | add_license_into_systemintegrationpackages | installer::worker::
0 | 0 | 0 | 0s | 0s | analyze_patch_files | installer::worker::
0 | 0 | 0 | 0s | 0s | call_sum | installer::worker::
0 | 0 | 0 | 0s | 0s | call_wc | installer::worker::
0 | 0 | 0 | 0s | 0s | change_onefile_in_pkgmap | installer::worker::
0 | 0 | 0 | 0s | 0s | collect_all_files_without_patch_flag | installer::worker::
0 | 0 | 0 | 0s | 0s | collect_all_items_without_special_flag | installer::worker::
0 | 0 | 0 | 0s | 0s | collectpackagemaps | installer::worker::
0 | 0 | 0 | 0s | 0s | create_nopatchlist | installer::worker::
0 | 0 | 0 | 0s | 0s | get_first_from_list | installer::worker::
0 | 0 | 0 | 0s | 0s | get_language_specific_include_paths | installer::worker::
0 | 0 | 0 | 0s | 0s | install_simple | installer::worker::
0 | 0 | 0 | 0s | 0s | make_systemcall | installer::worker::
0 | 0 | 0 | 0s | 0s | prepare_windows_patchfiles | installer::worker::
0 | 0 | 0 | 0s | 0s | put_license_into_setup | installer::worker::
0 | 0 | 0 | 0s | 0s | reorg_patchfile | installer::worker::
0 | 0 | 0 | 0s | 0s | save_patchlist_file | installer::worker::
0 | 0 | 0 | 0s | 0s | select_helppack_items | installer::worker::
0 | 0 | 0 | 0s | 0s | select_langpack_items | installer::worker::
0 | 0 | 0 | 0s | 0s | select_patch_items | installer::worker::
0 | 0 | 0 | 0s | 0s | select_patch_items_without_name | installer::worker::
0 | 0 | 0 | 0s | 0s | set_english_license | installer::worker::
0 | 0 | 0 | 0s | 0s | set_time_stamp | installer::worker::
0 | 0 | 0 | 0s | 0s | set_time_stamp_for_file | installer::worker::
0 | 0 | 0 | 0s | 0s | shift_file_to_end | installer::worker::
0 | 0 | 0 | 0s | 0s | shift_section_to_end | installer::worker::
0 | 0 | 0 | 0s | 0s | shuffle_array | installer::worker::
0 | 0 | 0 | 0s | 0s | tar_package | installer::worker::
0 | 0 | 0 | 0s | 0s | write_nopatchlist_header | installer::worker::
Line | State ments |
Time on line |
Calls | Time in subs |
Code |
---|---|---|---|---|---|
1 | #************************************************************************* | ||||
2 | # | ||||
3 | # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. | ||||
4 | # | ||||
5 | # Copyright 2000, 2010 Oracle and/or its affiliates. | ||||
6 | # | ||||
7 | # OpenOffice.org - a multi-platform office productivity suite | ||||
8 | # | ||||
9 | # This file is part of OpenOffice.org. | ||||
10 | # | ||||
11 | # OpenOffice.org is free software: you can redistribute it and/or modify | ||||
12 | # it under the terms of the GNU Lesser General Public License version 3 | ||||
13 | # only, as published by the Free Software Foundation. | ||||
14 | # | ||||
15 | # OpenOffice.org is distributed in the hope that it will be useful, | ||||
16 | # but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
17 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||||
18 | # GNU Lesser General Public License version 3 for more details | ||||
19 | # (a copy is included in the LICENSE file that accompanied this code). | ||||
20 | # | ||||
21 | # You should have received a copy of the GNU Lesser General Public License | ||||
22 | # version 3 along with OpenOffice.org. If not, see | ||||
23 | # <http://www.openoffice.org/license.html> | ||||
24 | # for a copy of the LGPLv3 License. | ||||
25 | # | ||||
26 | #************************************************************************* | ||||
27 | |||||
28 | package installer::worker; | ||||
29 | |||||
30 | 2 | 69µs | 2 | 570µs | # spent 459µs (349+111) within installer::worker::BEGIN@30 which was called:
# once (349µs+111µs) by installer::exiter::BEGIN@37 at line 30 # spent 459µs making 1 call to installer::worker::BEGIN@30
# spent 110µs making 1 call to Exporter::import |
31 | 2 | 60µs | 2 | 116µs | # spent 68µs (19+49) within installer::worker::BEGIN@31 which was called:
# once (19µs+49µs) by installer::exiter::BEGIN@37 at line 31 # spent 68µs making 1 call to installer::worker::BEGIN@31
# spent 48µs making 1 call to Exporter::import |
32 | 2 | 3.29ms | 2 | 17.1ms | # spent 17.0ms (6.78+10.3) within installer::worker::BEGIN@32 which was called:
# once (6.78ms+10.3ms) by installer::exiter::BEGIN@37 at line 32 # spent 17.0ms making 1 call to installer::worker::BEGIN@32
# spent 7µs making 1 call to File::stat::import |
33 | 2 | 63µs | 2 | 281µs | # spent 152µs (23+129) within installer::worker::BEGIN@33 which was called:
# once (23µs+129µs) by installer::exiter::BEGIN@37 at line 33 # spent 152µs making 1 call to installer::worker::BEGIN@33
# spent 129µs making 1 call to Exporter::import |
34 | 2 | 54µs | 2 | 114µs | # spent 65µs (17+49) within installer::worker::BEGIN@34 which was called:
# once (17µs+49µs) by installer::exiter::BEGIN@37 at line 34 # spent 65µs making 1 call to installer::worker::BEGIN@34
# spent 48µs making 1 call to Exporter::import |
35 | 2 | 1.09ms | 2 | 42.1ms | # spent 42.1ms (5.13+37.0) within installer::worker::BEGIN@35 which was called:
# once (5.13ms+37.0ms) by installer::exiter::BEGIN@37 at line 35 # spent 42.1ms making 1 call to installer::worker::BEGIN@35
# spent 7µs making 1 call to UNIVERSAL::import |
36 | 2 | 57µs | 2 | 25µs | # spent 23µs (21+2) within installer::worker::BEGIN@36 which was called:
# once (21µs+2µs) by installer::exiter::BEGIN@37 at line 36 # spent 23µs making 1 call to installer::worker::BEGIN@36
# spent 2µs making 1 call to UNIVERSAL::import |
37 | 2 | 57µs | 2 | 22µs | # spent 20µs (17+3) within installer::worker::BEGIN@37 which was called:
# once (17µs+3µs) by installer::exiter::BEGIN@37 at line 37 # spent 20µs making 1 call to installer::worker::BEGIN@37
# spent 2µs making 1 call to UNIVERSAL::import |
38 | 2 | 56µs | 2 | 22µs | # spent 19µs (16+3) within installer::worker::BEGIN@38 which was called:
# once (16µs+3µs) by installer::exiter::BEGIN@37 at line 38 # spent 19µs making 1 call to installer::worker::BEGIN@38
# spent 2µs making 1 call to UNIVERSAL::import |
39 | 2 | 54µs | 2 | 22µs | # spent 20µs (17+3) within installer::worker::BEGIN@39 which was called:
# once (17µs+3µs) by installer::exiter::BEGIN@37 at line 39 # spent 20µs making 1 call to installer::worker::BEGIN@39
# spent 3µs making 1 call to UNIVERSAL::import |
40 | 2 | 55µs | 2 | 131µs | # spent 74µs (17+57) within installer::worker::BEGIN@40 which was called:
# once (17µs+57µs) by installer::exiter::BEGIN@37 at line 40 # spent 74µs making 1 call to installer::worker::BEGIN@40
# spent 57µs making 1 call to Exporter::import |
41 | 2 | 54µs | 2 | 20µs | # spent 18µs (15+3) within installer::worker::BEGIN@41 which was called:
# once (15µs+3µs) by installer::exiter::BEGIN@37 at line 41 # spent 18µs making 1 call to installer::worker::BEGIN@41
# spent 3µs making 1 call to UNIVERSAL::import |
42 | 2 | 1.13ms | 2 | 2.41ms | # spent 2.41ms (1.96+454µs) within installer::worker::BEGIN@42 which was called:
# once (1.96ms+454µs) by installer::exiter::BEGIN@37 at line 42 # spent 2.41ms making 1 call to installer::worker::BEGIN@42
# spent 3µs making 1 call to UNIVERSAL::import |
43 | 2 | 54µs | 2 | 20µs | # spent 18µs (17+2) within installer::worker::BEGIN@43 which was called:
# once (17µs+2µs) by installer::exiter::BEGIN@37 at line 43 # spent 18µs making 1 call to installer::worker::BEGIN@43
# spent 2µs making 1 call to UNIVERSAL::import |
44 | 2 | 50µs | 2 | 19µs | # spent 17µs (15+2) within installer::worker::BEGIN@44 which was called:
# once (15µs+2µs) by installer::exiter::BEGIN@37 at line 44 # spent 17µs making 1 call to installer::worker::BEGIN@44
# spent 2µs making 1 call to UNIVERSAL::import |
45 | 2 | 16.5ms | 2 | 1.44ms | # spent 1.44ms (1.08+354µs) within installer::worker::BEGIN@45 which was called:
# once (1.08ms+354µs) by installer::exiter::BEGIN@37 at line 45 # spent 1.44ms making 1 call to installer::worker::BEGIN@45
# spent 3µs making 1 call to UNIVERSAL::import |
46 | |||||
47 | ################################################# | ||||
48 | # Writing some global information into | ||||
49 | # the list of files without flag PATCH | ||||
50 | ################################################# | ||||
51 | |||||
52 | sub write_nopatchlist_header | ||||
53 | { | ||||
54 | my ( $content ) = @_; | ||||
55 | |||||
56 | my @header = (); | ||||
57 | my $infoline = "This is a list of files, that are defined in scp-projects without\n"; | ||||
58 | push(@header, $infoline); | ||||
59 | $infoline = "flag \"PATCH\". Important: This does not mean in any case, that \n"; | ||||
60 | push(@header, $infoline); | ||||
61 | $infoline = "this files are included into or excluded from a patch. \n\n"; | ||||
62 | push(@header, $infoline); | ||||
63 | $infoline = "Exception Linux: A patch rpm is a complete rpm. This means that all \n"; | ||||
64 | push(@header, $infoline); | ||||
65 | $infoline = "files are included into a patch rpm, if only one file of the rpm has the \n"; | ||||
66 | push(@header, $infoline); | ||||
67 | $infoline = "style \"PATCH\". \n\n"; | ||||
68 | push(@header, $infoline); | ||||
69 | |||||
70 | for ( my $i = 0; $i <= $#header; $i++ ) { push(@{$content},$header[$i]); } | ||||
71 | } | ||||
72 | |||||
73 | ################################################# | ||||
74 | # Creating the content of the list of files | ||||
75 | # without flag PATCH. | ||||
76 | # All files are saved in | ||||
77 | # @{$installer::globals::nopatchfilecollector} | ||||
78 | ################################################# | ||||
79 | |||||
80 | sub create_nopatchlist | ||||
81 | { | ||||
82 | my @content =(); | ||||
83 | |||||
84 | write_nopatchlist_header(\@content); | ||||
85 | |||||
86 | for ( my $i = 0; $i <= $#{$installer::globals::nopatchfilecollector}; $i++ ) | ||||
87 | { | ||||
88 | my $onefile = ${$installer::globals::nopatchfilecollector}[$i]; | ||||
89 | my $oneline = $onefile->{'destination'}; | ||||
90 | if ( $onefile->{'zipfilename'} ) { $oneline = $oneline . " (" . $onefile->{'zipfilename'} . ")"; } | ||||
91 | $oneline = $oneline . "\n"; | ||||
92 | push(@content, $oneline); | ||||
93 | } | ||||
94 | |||||
95 | return \@content; | ||||
96 | } | ||||
97 | |||||
98 | ######################################### | ||||
99 | # Saving the patchlist file | ||||
100 | ######################################### | ||||
101 | |||||
102 | sub save_patchlist_file | ||||
103 | { | ||||
104 | my ($installlogdir, $patchlistfilename) = @_; | ||||
105 | |||||
106 | my $installpatchlistdir = installer::systemactions::create_directory_next_to_directory($installlogdir, "patchlist"); | ||||
107 | $patchlistfilename =~ s/log\_/patchfiles\_/; | ||||
108 | $patchlistfilename =~ s/\.log/\.txt/; | ||||
109 | installer::files::save_file($installpatchlistdir . $installer::globals::separator . $patchlistfilename, \@installer::globals::patchfilecollector); | ||||
110 | installer::logger::print_message( "... creating patchlist file $patchlistfilename \n" ); | ||||
111 | |||||
112 | if (( $installer::globals::patch ) && ( ! $installer::globals::creating_windows_installer_patch )) # only for non-Windows patches | ||||
113 | { | ||||
114 | $patchlistfilename =~ s/patchfiles\_/nopatchfiles\_/; | ||||
115 | my $nopatchlist = create_nopatchlist(); | ||||
116 | installer::files::save_file($installpatchlistdir . $installer::globals::separator . $patchlistfilename, $nopatchlist); | ||||
117 | installer::logger::print_message( "... creating patch exclusion file $patchlistfilename \n" ); | ||||
118 | } | ||||
119 | |||||
120 | } | ||||
121 | |||||
122 | ############################################################### | ||||
123 | # Removing all directories of a special language | ||||
124 | # in the directory $basedir | ||||
125 | ############################################################### | ||||
126 | |||||
127 | sub remove_old_installation_sets | ||||
128 | # spent 1.92ms (56µs+1.87) within installer::worker::remove_old_installation_sets which was called:
# once (56µs+1.87ms) by installer::worker::create_installation_directory at line 166 | ||||
129 | 10 | 473µs | my ($basedir) = @_; | ||
130 | |||||
131 | 1 | 8µs | installer::logger::print_message( "... removing old installation directories ...\n" ); # spent 8µs making 1 call to installer::logger::print_message | ||
132 | |||||
133 | my $removedir = $basedir; | ||||
134 | |||||
135 | 2 | 862µs | if ( -d $removedir ) { installer::systemactions::remove_complete_directory($removedir, 1); } # spent 773µs making 1 call to installer::systemactions::remove_complete_directory
# spent 89µs making 1 call to installer::worker::CORE:ftdir | ||
136 | |||||
137 | # looking for non successful old installation sets | ||||
138 | |||||
139 | $removedir = $basedir . "_witherror"; | ||||
140 | 1 | 168µs | if ( -d $removedir ) { installer::systemactions::remove_complete_directory($removedir, 1); } # spent 168µs making 1 call to installer::worker::CORE:ftdir | ||
141 | |||||
142 | $removedir = $basedir . "_inprogress"; | ||||
143 | 1 | 166µs | if ( -d $removedir ) { installer::systemactions::remove_complete_directory($removedir, 1); } # spent 166µs making 1 call to installer::worker::CORE:ftdir | ||
144 | |||||
145 | # finally the $basedir can be created empty | ||||
146 | |||||
147 | if ( $installer::globals::localinstalldirset ) { installer::systemactions::create_directory_structure($basedir); } | ||||
148 | |||||
149 | 1 | 664µs | installer::systemactions::create_directory($basedir); # spent 664µs making 1 call to installer::systemactions::create_directory | ||
150 | } | ||||
151 | |||||
152 | ############################################################### | ||||
153 | # Creating the installation directory structure | ||||
154 | ############################################################### | ||||
155 | |||||
156 | sub create_installation_directory | ||||
157 | # spent 548ms (64µs+548) within installer::worker::create_installation_directory which was called:
# once (64µs+548ms) by installer::run at line 1444 of /cygdrive/c/lo/libo-master/instsetoo_native/util/C:/lo/libo-master/solenv/bin/modules/installer.pm | ||||
158 | 11 | 51µs | my ($shipinstalldir, $languagestringref, $current_install_number_ref) = @_; | ||
159 | |||||
160 | my $installdir = ""; | ||||
161 | |||||
162 | my $languageref = $languagestringref; | ||||
163 | |||||
164 | 1 | 410ms | $installdir = installer::systemactions::create_directories("install", $languageref); # spent 410ms making 1 call to installer::systemactions::create_directories | ||
165 | 1 | 18µs | installer::logger::print_message( "... creating installation set in $installdir ...\n" ); # spent 18µs making 1 call to installer::logger::print_message | ||
166 | 1 | 1.92ms | remove_old_installation_sets($installdir); # spent 1.92ms making 1 call to installer::worker::remove_old_installation_sets | ||
167 | my $inprogressinstalldir = $installdir . "_inprogress"; | ||||
168 | 1 | 136ms | installer::systemactions::rename_directory($installdir, $inprogressinstalldir); # spent 136ms making 1 call to installer::systemactions::rename_directory | ||
169 | $installdir = $inprogressinstalldir; | ||||
170 | |||||
171 | $installer::globals::saveinstalldir = $installdir; # saving directory globally, in case of exiting | ||||
172 | |||||
173 | return $installdir; | ||||
174 | } | ||||
175 | |||||
176 | ############################################################### | ||||
177 | # Analyzing and creating the log file | ||||
178 | ############################################################### | ||||
179 | |||||
180 | sub analyze_and_save_logfile | ||||
181 | # spent 2.56s (137µs+2.56) within installer::worker::analyze_and_save_logfile which was called:
# once (137µs+2.56s) by installer::run at line 1777 of /cygdrive/c/lo/libo-master/instsetoo_native/util/C:/lo/libo-master/solenv/bin/modules/installer.pm | ||||
182 | 14 | 84µs | my ($loggingdir, $installdir, $installlogdir, $allsettingsarrayref, $languagestringref, $current_install_number) = @_; | ||
183 | |||||
184 | my $is_success = 1; | ||||
185 | my $finalinstalldir = ""; | ||||
186 | |||||
187 | 1 | 22µs | installer::logger::print_message( "... checking log file " . $loggingdir . $installer::globals::logfilename . "\n" ); # spent 22µs making 1 call to installer::logger::print_message | ||
188 | |||||
189 | 1 | 2.40s | my $contains_error = installer::control::check_logfile(\@installer::globals::logfileinfo); # spent 2.40s making 1 call to installer::control::check_logfile | ||
190 | |||||
191 | # Dependent from the success, the installation directory can be renamed. | ||||
192 | |||||
193 | 3 | 12µs | if ( $contains_error ) | ||
194 | { | ||||
195 | my $errordir = installer::systemactions::rename_string_in_directory($installdir, "_inprogress", "_witherror"); | ||||
196 | # Error output to STDERR | ||||
197 | for ( my $j = 0; $j <= $#installer::globals::errorlogfileinfo; $j++ ) | ||||
198 | { | ||||
199 | my $line = $installer::globals::errorlogfileinfo[$j]; | ||||
200 | $line =~ s/\s*$//g; | ||||
201 | installer::logger::print_error( $line ); | ||||
202 | } | ||||
203 | $is_success = 0; | ||||
204 | |||||
205 | $finalinstalldir = $errordir; | ||||
206 | } | ||||
207 | else | ||||
208 | { | ||||
209 | my $destdir = ""; | ||||
210 | |||||
211 | 1 | 90.5ms | $destdir = installer::systemactions::rename_string_in_directory($installdir, "_inprogress", ""); # spent 90.5ms making 1 call to installer::systemactions::rename_string_in_directory | ||
212 | |||||
213 | $finalinstalldir = $destdir; | ||||
214 | } | ||||
215 | |||||
216 | # Saving the logfile in the log file directory and additionally in a log directory in the install directory | ||||
217 | |||||
218 | my $numberedlogfilename = $installer::globals::logfilename; | ||||
219 | 1 | 25µs | installer::logger::print_message( "... creating log file $numberedlogfilename \n" ); # spent 25µs making 1 call to installer::logger::print_message | ||
220 | 1 | 36.1ms | installer::files::save_file($loggingdir . $numberedlogfilename, \@installer::globals::logfileinfo); # spent 36.1ms making 1 call to installer::files::save_file | ||
221 | 1 | 38.3ms | installer::files::save_file($installlogdir . $installer::globals::separator . $numberedlogfilename, \@installer::globals::logfileinfo); # spent 38.3ms making 1 call to installer::files::save_file | ||
222 | |||||
223 | # Saving the list of patchfiles in a patchlist directory in the install directory | ||||
224 | if (( $installer::globals::patch ) || ( $installer::globals::creating_windows_installer_patch )) { installer::worker::save_patchlist_file($installlogdir, $numberedlogfilename); } | ||||
225 | |||||
226 | if ( $installer::globals::creating_windows_installer_patch ) { $installer::globals::creating_windows_installer_patch = 0; } | ||||
227 | |||||
228 | # Exiting the packaging process, if an error occurred. | ||||
229 | # This is important, to get an error code "-1", if an error was found in the log file, | ||||
230 | # that did not break the packaging process | ||||
231 | |||||
232 | if ( ! $is_success) { installer::exiter::exit_program("ERROR: Found an error in the logfile. Packaging failed.", "analyze_and_save_logfile"); } | ||||
233 | |||||
234 | return ($is_success, $finalinstalldir); | ||||
235 | } | ||||
236 | |||||
237 | ############################################################### | ||||
238 | # Removing all directories that are saved in the | ||||
239 | # global directory @installer::globals::removedirs | ||||
240 | ############################################################### | ||||
241 | |||||
242 | sub clean_output_tree | ||||
243 | # spent 7.38s (115µs+7.38) within installer::worker::clean_output_tree which was called:
# once (115µs+7.38s) by installer::run at line 1776 of /cygdrive/c/lo/libo-master/instsetoo_native/util/C:/lo/libo-master/solenv/bin/modules/installer.pm | ||||
244 | 3 | 40µs | 1 | 26µs | installer::logger::print_message( "... cleaning the output tree ...\n" ); # spent 26µs making 1 call to installer::logger::print_message |
245 | |||||
246 | 7 | 1.54ms | for ( my $i = 0; $i <= $#installer::globals::removedirs; $i++ ) | ||
247 | { | ||||
248 | 2 | 16µs | 7 | 1.49ms | if ( -d $installer::globals::removedirs[$i] ) # spent 1.49ms making 7 calls to installer::worker::CORE:ftdir, avg 213µs/call |
249 | { | ||||
250 | 1 | 10µs | installer::logger::print_message( "... removing directory $installer::globals::removedirs[$i] ...\n" ); # spent 10µs making 1 call to installer::logger::print_message | ||
251 | 1 | 7.38s | installer::systemactions::remove_complete_directory($installer::globals::removedirs[$i], 1); # spent 7.38s making 1 call to installer::systemactions::remove_complete_directory | ||
252 | } | ||||
253 | } | ||||
254 | |||||
255 | # Last try to remove the ship test directory | ||||
256 | |||||
257 | if ( $installer::globals::shiptestdirectory ) | ||||
258 | { | ||||
259 | if ( -d $installer::globals::shiptestdirectory ) | ||||
260 | { | ||||
261 | my $infoline = "Last try to remove $installer::globals::shiptestdirectory . \n"; | ||||
262 | push(@installer::globals::logfileinfo, $infoline); | ||||
263 | my $systemcall = "rmdir $installer::globals::shiptestdirectory"; | ||||
264 | my $returnvalue = system($systemcall); | ||||
265 | } | ||||
266 | } | ||||
267 | } | ||||
268 | |||||
269 | ########################################################### | ||||
270 | # Setting one language in the language independent | ||||
271 | # array of include paths with $(LANG) | ||||
272 | ########################################################### | ||||
273 | |||||
274 | sub get_language_specific_include_paths | ||||
275 | { | ||||
276 | my ( $patharrayref, $onelanguage ) = @_; | ||||
277 | |||||
278 | my @patharray = (); | ||||
279 | |||||
280 | for ( my $i = 0; $i <= $#{$patharrayref}; $i++ ) | ||||
281 | { | ||||
282 | my $line = ${$patharrayref}[$i]; | ||||
283 | $line =~ s/\$\(LANG\)/$onelanguage/g; | ||||
284 | push(@patharray ,$line); | ||||
285 | } | ||||
286 | |||||
287 | return \@patharray; | ||||
288 | } | ||||
289 | |||||
290 | ############################################################## | ||||
291 | # Collecting all items with a defined flag | ||||
292 | ############################################################## | ||||
293 | |||||
294 | sub collect_all_items_with_special_flag | ||||
295 | # spent 327ms (289+37.9) within installer::worker::collect_all_items_with_special_flag which was called 3 times, avg 109ms/call:
# once (146ms+19.7ms) by installer::windows::assembly::create_msiassembly_table at line 158 of /cygdrive/c/lo/libo-master/instsetoo_native/util/C:/lo/libo-master/solenv/bin/modules/installer/windows/assembly.pm
# once (143ms+18.1ms) by installer::run at line 1473 of /cygdrive/c/lo/libo-master/instsetoo_native/util/C:/lo/libo-master/solenv/bin/modules/installer.pm
# once (693µs+145µs) by installer::run at line 1480 of /cygdrive/c/lo/libo-master/instsetoo_native/util/C:/lo/libo-master/solenv/bin/modules/installer.pm | ||||
296 | 12 | 35.7ms | my ($itemsref, $flag) = @_; | ||
297 | |||||
298 | my @allitems = (); | ||||
299 | |||||
300 | 127452 | 291ms | for ( my $i = 0; $i <= $#{$itemsref}; $i++ ) | ||
301 | { | ||||
302 | my $oneitem = ${$itemsref}[$i]; | ||||
303 | my $styles = ""; | ||||
304 | if ( $oneitem->{'Styles'} ) { $styles = $oneitem->{'Styles'} }; | ||||
305 | |||||
306 | 63726 | 37.9ms | if ( $styles =~ /\b$flag\b/ ) # spent 22.5ms making 31863 calls to installer::worker::CORE:regcomp, avg 707ns/call
# spent 15.4ms making 31863 calls to installer::worker::CORE:match, avg 483ns/call | ||
307 | { | ||||
308 | push( @allitems, $oneitem ); | ||||
309 | } | ||||
310 | } | ||||
311 | |||||
312 | return \@allitems; | ||||
313 | } | ||||
314 | |||||
315 | ############################################################## | ||||
316 | # Collecting all files without patch flag in | ||||
317 | # $installer::globals::nopatchfilecollector | ||||
318 | ############################################################## | ||||
319 | |||||
320 | sub collect_all_files_without_patch_flag | ||||
321 | { | ||||
322 | my ($filesref) = @_; | ||||
323 | |||||
324 | my $newfiles = collect_all_items_without_special_flag($filesref, "PATCH"); | ||||
325 | |||||
326 | for ( my $i = 0; $i <= $#{$newfiles}; $i++ ) { push(@{$installer::globals::nopatchfilecollector}, ${$newfiles}[$i]); } | ||||
327 | } | ||||
328 | |||||
329 | ############################################################## | ||||
330 | # Collecting all items without a defined flag | ||||
331 | ############################################################## | ||||
332 | |||||
333 | sub collect_all_items_without_special_flag | ||||
334 | { | ||||
335 | my ($itemsref, $flag) = @_; | ||||
336 | |||||
337 | my @allitems = (); | ||||
338 | |||||
339 | for ( my $i = 0; $i <= $#{$itemsref}; $i++ ) | ||||
340 | { | ||||
341 | my $oneitem = ${$itemsref}[$i]; | ||||
342 | my $styles = ""; | ||||
343 | if ( $oneitem->{'Styles'} ) { $styles = $oneitem->{'Styles'} }; | ||||
344 | |||||
345 | if ( !( $styles =~ /\b$flag\b/ )) | ||||
346 | { | ||||
347 | push( @allitems, $oneitem ); | ||||
348 | } | ||||
349 | } | ||||
350 | |||||
351 | return \@allitems; | ||||
352 | } | ||||
353 | |||||
354 | ############################################################## | ||||
355 | # Removing all items with a defined flag from collector | ||||
356 | ############################################################## | ||||
357 | |||||
358 | sub remove_all_items_with_special_flag | ||||
359 | # spent 176ms (158+18.0) within installer::worker::remove_all_items_with_special_flag which was called:
# once (158ms+18.0ms) by installer::run at line 1477 of /cygdrive/c/lo/libo-master/instsetoo_native/util/C:/lo/libo-master/solenv/bin/modules/installer.pm | ||||
360 | 4 | 25.6ms | my ($itemsref, $flag) = @_; | ||
361 | |||||
362 | my @allitems = (); | ||||
363 | |||||
364 | 79476 | 150ms | for ( my $i = 0; $i <= $#{$itemsref}; $i++ ) | ||
365 | { | ||||
366 | my $oneitem = ${$itemsref}[$i]; | ||||
367 | my $styles = ""; | ||||
368 | if ( $oneitem->{'Styles'} ) { $styles = $oneitem->{'Styles'} }; | ||||
369 | 36 | 43µs | 31794 | 18.0ms | if ( $styles =~ /\b$flag\b/ ) # spent 11.1ms making 15897 calls to installer::worker::CORE:regcomp, avg 696ns/call
# spent 6.97ms making 15897 calls to installer::worker::CORE:match, avg 438ns/call |
370 | { | ||||
371 | my $infoline = "Attention: Removing from collector: $oneitem->{'Name'} !\n"; | ||||
372 | push( @installer::globals::logfileinfo, $infoline); | ||||
373 | if ( $flag eq "BINARYTABLE_ONLY" ) { push(@installer::globals::binarytableonlyfiles, $oneitem); } | ||||
374 | next; | ||||
375 | } | ||||
376 | push( @allitems, $oneitem ); | ||||
377 | } | ||||
378 | |||||
379 | return \@allitems; | ||||
380 | } | ||||
381 | |||||
382 | ########################################################### | ||||
383 | # Mechanism for simple installation without packing | ||||
384 | ########################################################### | ||||
385 | |||||
386 | sub install_simple ($$$$$$) | ||||
387 | { | ||||
388 | my ($packagename, $languagestring, $directoriesarray, $filesarray, $linksarray, $unixlinksarray) = @_; | ||||
389 | |||||
390 | installer::logger::print_message( "... installing module $packagename ...\n" ); | ||||
391 | |||||
392 | my $destdir = $installer::globals::destdir; | ||||
393 | my @lines = (); | ||||
394 | |||||
395 | installer::logger::print_message( "DestDir: $destdir \n" ); | ||||
396 | installer::logger::print_message( "Rootpath: $installer::globals::rootpath \n" ); | ||||
397 | |||||
398 | `mkdir -p $destdir` if $destdir ne ""; | ||||
399 | `mkdir -p $destdir$installer::globals::rootpath`; | ||||
400 | |||||
401 | # Create Directories | ||||
402 | for ( my $i = 0; $i <= $#{$directoriesarray}; $i++ ) | ||||
403 | { | ||||
404 | my $onedir = ${$directoriesarray}[$i]; | ||||
405 | my $dir = ""; | ||||
406 | |||||
407 | if ( $onedir->{'Dir'} ) { $dir = $onedir->{'Dir'}; } | ||||
408 | |||||
409 | if ((!($dir =~ /\bPREDEFINED_/ )) || ( $dir =~ /\bPREDEFINED_PROGDIR\b/ )) | ||||
410 | { | ||||
411 | my $hostname = $onedir->{'HostName'}; | ||||
412 | |||||
413 | # ignore '.' subdirectories | ||||
414 | next if ( $hostname =~ m/\.$/ ); | ||||
415 | # remove './' from the path | ||||
416 | $hostname =~ s/\.\///g; | ||||
417 | |||||
418 | # printf "mkdir $destdir$hostname\n"; | ||||
419 | mkdir $destdir . $hostname; | ||||
420 | push @lines, "%dir " . $hostname . "\n"; | ||||
421 | } | ||||
422 | } | ||||
423 | |||||
424 | for ( my $i = 0; $i <= $#{$filesarray}; $i++ ) | ||||
425 | { | ||||
426 | my $onefile = ${$filesarray}[$i]; | ||||
427 | my $unixrights = $onefile->{'UnixRights'}; | ||||
428 | my $destination = $onefile->{'destination'}; | ||||
429 | my $sourcepath = $onefile->{'sourcepath'}; | ||||
430 | |||||
431 | # This is necessary to install SDK that includes files with $ in its name | ||||
432 | # Otherwise, the following shell commands does not work and the file list | ||||
433 | # is not correct | ||||
434 | $destination =~ s/\$\$/\$/; | ||||
435 | $sourcepath =~ s/\$\$/\$/; | ||||
436 | |||||
437 | # remove './' from the path | ||||
438 | $sourcepath =~ s/\.\///g; | ||||
439 | $destination =~ s/\.\///g; | ||||
440 | |||||
441 | push @lines, "$destination\n"; | ||||
442 | if(-d "$destdir$destination"){ | ||||
443 | rmtree("$destdir$destination"); | ||||
444 | } | ||||
445 | if(-e "$destdir$destination") { | ||||
446 | unlink "$destdir$destination"; | ||||
447 | } | ||||
448 | |||||
449 | copy ("$sourcepath", "$destdir$destination") || die "Can't copy file: $sourcepath -> $destdir$destination $!"; | ||||
450 | my $sourcestat = stat($sourcepath); | ||||
451 | utime ($sourcestat->atime, $sourcestat->mtime, "$destdir$destination"); | ||||
452 | chmod (oct($unixrights), "$destdir$destination") || die "Can't change permissions: $!"; | ||||
453 | push @lines, "$destination\n"; | ||||
454 | } | ||||
455 | |||||
456 | for ( my $i = 0; $i <= $#{$linksarray}; $i++ ) | ||||
457 | { | ||||
458 | my $onelink = ${$linksarray}[$i]; | ||||
459 | my $destination = $onelink->{'destination'}; | ||||
460 | my $destinationfile = $onelink->{'destinationfile'}; | ||||
461 | |||||
462 | if(-e "$destdir$destination") { | ||||
463 | unlink "$destdir$destination"; | ||||
464 | } | ||||
465 | symlink ("$destinationfile", "$destdir$destination") || die "Can't create symlink: $!"; | ||||
466 | push @lines, "$destination\n"; | ||||
467 | } | ||||
468 | |||||
469 | for ( my $i = 0; $i <= $#{$unixlinksarray}; $i++ ) | ||||
470 | { | ||||
471 | my $onelink = ${$unixlinksarray}[$i]; | ||||
472 | my $target = $onelink->{'Target'}; | ||||
473 | my $destination = $onelink->{'destination'}; | ||||
474 | my $cmd = "ln -sf '$target' '$destdir$destination'"; | ||||
475 | |||||
476 | system($cmd) && die "Failed \"$cmd\""; | ||||
477 | push @lines, "$destination\n"; | ||||
478 | } | ||||
479 | |||||
480 | if ( $destdir ne "" ) | ||||
481 | { | ||||
482 | my $filelist; | ||||
483 | my $fname = $installer::globals::destdir . "/$packagename"; | ||||
484 | open ($filelist, ">$fname") || die "Can't open $fname: $!"; | ||||
485 | print $filelist @lines; | ||||
486 | close ($filelist); | ||||
487 | } | ||||
488 | |||||
489 | } | ||||
490 | |||||
491 | ########################################################### | ||||
492 | # Selecting patch items | ||||
493 | ########################################################### | ||||
494 | |||||
495 | sub select_patch_items | ||||
496 | { | ||||
497 | my ( $itemsref, $itemname ) = @_; | ||||
498 | |||||
499 | installer::logger::include_header_into_logfile("Selecting items for patches. Item: $itemname"); | ||||
500 | |||||
501 | my @itemsarray = (); | ||||
502 | |||||
503 | for ( my $i = 0; $i <= $#{$itemsref}; $i++ ) | ||||
504 | { | ||||
505 | my $oneitem = ${$itemsref}[$i]; | ||||
506 | |||||
507 | my $name = $oneitem->{'Name'}; | ||||
508 | if (( $name =~ /\bLICENSE/ ) || ( $name =~ /\bREADME/ )) | ||||
509 | { | ||||
510 | push(@itemsarray, $oneitem); | ||||
511 | next; | ||||
512 | } | ||||
513 | |||||
514 | # Items with style "PATCH" have to be included into the patch | ||||
515 | my $styles = ""; | ||||
516 | if ( $oneitem->{'Styles'} ) { $styles = $oneitem->{'Styles'}; } | ||||
517 | if ( $styles =~ /\bPATCH\b/ ) { push(@itemsarray, $oneitem); } | ||||
518 | } | ||||
519 | |||||
520 | return \@itemsarray; | ||||
521 | } | ||||
522 | |||||
523 | ########################################################### | ||||
524 | # Selecting patch items | ||||
525 | ########################################################### | ||||
526 | |||||
527 | sub select_patch_items_without_name | ||||
528 | { | ||||
529 | my ( $itemsref, $itemname ) = @_; | ||||
530 | |||||
531 | installer::logger::include_header_into_logfile("Selecting RegistryItems for patches"); | ||||
532 | |||||
533 | my @itemsarray = (); | ||||
534 | |||||
535 | for ( my $i = 0; $i <= $#{$itemsref}; $i++ ) | ||||
536 | { | ||||
537 | my $oneitem = ${$itemsref}[$i]; | ||||
538 | |||||
539 | # Items with style "PATCH" have to be included into the patch | ||||
540 | my $styles = ""; | ||||
541 | if ( $oneitem->{'Styles'} ) { $styles = $oneitem->{'Styles'}; } | ||||
542 | if ( $styles =~ /\bPATCH\b/ ) { push(@itemsarray, $oneitem); } | ||||
543 | } | ||||
544 | |||||
545 | return \@itemsarray; | ||||
546 | } | ||||
547 | |||||
548 | ########################################################### | ||||
549 | # Selecting langpack items | ||||
550 | ########################################################### | ||||
551 | |||||
552 | sub select_langpack_items | ||||
553 | { | ||||
554 | my ( $itemsref, $itemname ) = @_; | ||||
555 | |||||
556 | installer::logger::include_header_into_logfile("Selecting RegistryItems for Language Packs"); | ||||
557 | |||||
558 | my @itemsarray = (); | ||||
559 | |||||
560 | for ( my $i = 0; $i <= $#{$itemsref}; $i++ ) | ||||
561 | { | ||||
562 | my $oneitem = ${$itemsref}[$i]; | ||||
563 | |||||
564 | # Items with style "LANGUAGEPACK" have to be included into the patch | ||||
565 | my $styles = ""; | ||||
566 | if ( $oneitem->{'Styles'} ) { $styles = $oneitem->{'Styles'}; } | ||||
567 | if (( $styles =~ /\bLANGUAGEPACK\b/ ) || ( $styles =~ /\bFORCELANGUAGEPACK\b/ )) { push(@itemsarray, $oneitem); } | ||||
568 | } | ||||
569 | |||||
570 | return \@itemsarray; | ||||
571 | } | ||||
572 | |||||
573 | ########################################################### | ||||
574 | # Selecting helppack items | ||||
575 | ########################################################### | ||||
576 | |||||
577 | sub select_helppack_items | ||||
578 | { | ||||
579 | my ( $itemsref, $itemname ) = @_; | ||||
580 | |||||
581 | installer::logger::include_header_into_logfile("Selecting RegistryItems for Help Packs"); | ||||
582 | |||||
583 | my @itemsarray = (); | ||||
584 | |||||
585 | for ( my $i = 0; $i <= $#{$itemsref}; $i++ ) | ||||
586 | { | ||||
587 | my $oneitem = ${$itemsref}[$i]; | ||||
588 | |||||
589 | # Items with style "HELPPACK" have to be included into the patch | ||||
590 | my $styles = ""; | ||||
591 | if ( $oneitem->{'Styles'} ) { $styles = $oneitem->{'Styles'}; } | ||||
592 | if (( $styles =~ /\bHELPPACK\b/ ) || ( $styles =~ /\bFORCEHELPPACK\b/ )) { push(@itemsarray, $oneitem); } | ||||
593 | } | ||||
594 | |||||
595 | return \@itemsarray; | ||||
596 | } | ||||
597 | |||||
598 | ########################################################### | ||||
599 | # Searching if LICENSE and README, which are not removed | ||||
600 | # in select_patch_items are really needed for the patch. | ||||
601 | # If not, they are removed now. | ||||
602 | ########################################################### | ||||
603 | |||||
604 | sub analyze_patch_files | ||||
605 | { | ||||
606 | my ( $filesref ) = @_; | ||||
607 | |||||
608 | installer::logger::include_header_into_logfile("Analyzing patch files"); | ||||
609 | |||||
610 | my @filesarray = (); | ||||
611 | |||||
612 | for ( my $i = 0; $i <= $#{$filesref}; $i++ ) | ||||
613 | { | ||||
614 | my $onefile = ${$filesref}[$i]; | ||||
615 | my $styles = ""; | ||||
616 | if ( $onefile->{'Styles'} ) { $styles = $onefile->{'Styles'}; } | ||||
617 | if ( !( $styles =~ /\bPATCH\b/) ) { next; } # removing all files without flag PATCH (LICENSE, README, ...) | ||||
618 | |||||
619 | if ( $installer::globals::iswindowsbuild ) | ||||
620 | { | ||||
621 | # all files of the Windows patch belong to the root module | ||||
622 | $onefile->{'modules'} = $installer::globals::rootmodulegid; | ||||
623 | } | ||||
624 | |||||
625 | push(@filesarray, $onefile); | ||||
626 | } | ||||
627 | |||||
628 | return \@filesarray; | ||||
629 | } | ||||
630 | |||||
631 | ########################################################### | ||||
632 | # reorganizing the patchfile content, | ||||
633 | # sorting for directory to decrease the file size | ||||
634 | ########################################################### | ||||
635 | |||||
636 | sub reorg_patchfile | ||||
637 | { | ||||
638 | my ($patchfiles, $patchfiledirectories) = @_; | ||||
639 | |||||
640 | my @patchfilesarray = (); | ||||
641 | my $line = ""; | ||||
642 | my $directory = ""; | ||||
643 | |||||
644 | # iterating over all directories, writing content into new patchfiles list | ||||
645 | |||||
646 | for ( my $i = 0; $i <= $#{$patchfiledirectories}; $i++ ) | ||||
647 | { | ||||
648 | $directory = ${$patchfiledirectories}[$i]; | ||||
649 | $line = "[" . $directory . "]" . "\n"; | ||||
650 | push(@patchfilesarray, $line); | ||||
651 | |||||
652 | for ( my $j = 0; $j <= $#{$patchfiles}; $j++ ) | ||||
653 | { | ||||
654 | if ( ${$patchfiles}[$j] =~ /^\s*(.*?)\s*\tXXXXX\t\Q$directory\E\s*$/ ) | ||||
655 | { | ||||
656 | $line = $1 . "\n"; | ||||
657 | push(@patchfilesarray, $line); | ||||
658 | } | ||||
659 | } | ||||
660 | } | ||||
661 | |||||
662 | return \@patchfilesarray; | ||||
663 | } | ||||
664 | |||||
665 | ########################################################### | ||||
666 | # One special file has to be the last in patchfile.txt. | ||||
667 | # Controlling this file, guarantees, that all files were | ||||
668 | # patch correctly. Using version.ini makes it easy to | ||||
669 | # control this by looking into the about box | ||||
670 | # -> shifting one section to the end | ||||
671 | ########################################################### | ||||
672 | |||||
673 | sub shift_section_to_end | ||||
674 | { | ||||
675 | my ($patchfilelist) = @_; | ||||
676 | |||||
677 | my @patchfile = (); | ||||
678 | my @lastsection = (); | ||||
679 | my $lastsection = "program"; | ||||
680 | my $notlastsection = "Basis\\program"; | ||||
681 | my $record = 0; | ||||
682 | |||||
683 | for ( my $i = 0; $i <= $#{$patchfilelist}; $i++ ) | ||||
684 | { | ||||
685 | my $line = ${$patchfilelist}[$i]; | ||||
686 | |||||
687 | if (( $record ) && ( $line =~ /^\s*\[/ )) { $record = 0; } | ||||
688 | |||||
689 | if (( $line =~ /^\s*\[\Q$lastsection\E\\\]\s*$/ ) && ( ! ( $line =~ /\Q$notlastsection\E\\\]\s*$/ ))) { $record = 1; } | ||||
690 | |||||
691 | if ( $record ) { push(@lastsection, $line); } | ||||
692 | else { push(@patchfile, $line); } | ||||
693 | } | ||||
694 | |||||
695 | if ( $#lastsection > -1 ) | ||||
696 | { | ||||
697 | for ( my $i = 0; $i <= $#lastsection; $i++ ) | ||||
698 | { | ||||
699 | push(@patchfile, $lastsection[$i]); | ||||
700 | } | ||||
701 | } | ||||
702 | |||||
703 | return \@patchfile; | ||||
704 | } | ||||
705 | |||||
706 | ########################################################### | ||||
707 | # One special file has to be the last in patchfile.txt. | ||||
708 | # Controlling this file, guarantees, that all files were | ||||
709 | # patch correctly. Using version.ini makes it easy to | ||||
710 | # control this by looking into the about box | ||||
711 | # -> shifting one file of the last section to the end | ||||
712 | ########################################################### | ||||
713 | |||||
714 | sub shift_file_to_end | ||||
715 | { | ||||
716 | my ($patchfilelist) = @_; | ||||
717 | |||||
718 | my @patchfile = (); | ||||
719 | my $lastfilename = "version.ini"; | ||||
720 | my $lastfileline = ""; | ||||
721 | my $foundfile = 0; | ||||
722 | |||||
723 | # Only searching this file in the last section | ||||
724 | my $lastsectionname = ""; | ||||
725 | |||||
726 | for ( my $i = 0; $i <= $#{$patchfilelist}; $i++ ) | ||||
727 | { | ||||
728 | my $line = ${$patchfilelist}[$i]; | ||||
729 | if ( $line =~ /^\s*\[(.*?)\]\s*$/ ) { $lastsectionname = $1; } | ||||
730 | } | ||||
731 | |||||
732 | my $record = 0; | ||||
733 | for ( my $i = 0; $i <= $#{$patchfilelist}; $i++ ) | ||||
734 | { | ||||
735 | my $line = ${$patchfilelist}[$i]; | ||||
736 | |||||
737 | if ( $line =~ /^\s*\[\Q$lastsectionname\E\]\s*$/ ) { $record = 1; } | ||||
738 | |||||
739 | if (( $line =~ /^\s*\"\Q$lastfilename\E\"\=/ ) && ( $record )) | ||||
740 | { | ||||
741 | $lastfileline = $line; | ||||
742 | $foundfile = 1; | ||||
743 | $record = 0; | ||||
744 | next; | ||||
745 | } | ||||
746 | |||||
747 | push(@patchfile, $line); | ||||
748 | } | ||||
749 | |||||
750 | if ( $foundfile ) { push(@patchfile, $lastfileline); } | ||||
751 | |||||
752 | return \@patchfile; | ||||
753 | } | ||||
754 | |||||
755 | ########################################################### | ||||
756 | # Renaming Windows files in Patch and creating file | ||||
757 | # patchfiles.txt | ||||
758 | ########################################################### | ||||
759 | |||||
760 | sub prepare_windows_patchfiles | ||||
761 | { | ||||
762 | my ( $filesref, $languagestringref, $allvariableshashref ) = @_; | ||||
763 | |||||
764 | my @patchfiles = (); | ||||
765 | my %patchfiledirectories = (); | ||||
766 | my $patchfilename = "patchlist.txt"; | ||||
767 | my $patchfilename2 = "patchmsi.dll"; | ||||
768 | |||||
769 | if ( ! $allvariableshashref->{'WINDOWSPATCHLEVEL'} ) { installer::exiter::exit_program("ERROR: No Windows patch level defined in list file (WINDOWSPATCHLEVEL) !", "prepare_windows_patchfiles"); } | ||||
770 | my $windowspatchlevel = $installer::globals::buildid; | ||||
771 | |||||
772 | for ( my $i = 0; $i <= $#{$filesref}; $i++ ) | ||||
773 | { | ||||
774 | my $onefile = ${$filesref}[$i]; | ||||
775 | |||||
776 | my $filename = $onefile->{'Name'}; | ||||
777 | if (( $filename eq $patchfilename ) || ( $filename eq $patchfilename2 )) { next; } | ||||
778 | |||||
779 | my $styles = ""; | ||||
780 | if ( $onefile->{'Styles'} ) { $styles = $onefile->{'Styles'}; } | ||||
781 | if ( $styles =~ /\bDONTRENAMEINPATCH\b/ ) { next; } | ||||
782 | |||||
783 | # special handling for files with flag DONTSHOW. This files get the extension ".dontshow" to be filtered by dialogs. | ||||
784 | my $localwindowspatchlevel = $windowspatchlevel; | ||||
785 | if ( $styles =~ /\bDONTSHOW\b/ ) { $localwindowspatchlevel = $localwindowspatchlevel . "\.dontshow"; } | ||||
786 | |||||
787 | my $olddestination = $onefile->{'destination'}; | ||||
788 | my $newdestination = $olddestination . "." . $localwindowspatchlevel; | ||||
789 | my $localfilename = $olddestination; | ||||
790 | installer::pathanalyzer::make_absolute_filename_to_relative_filename(\$localfilename); # file name part | ||||
791 | my $line = "\"" . $localfilename . "\"" . "=" . "\"" . "\." . $localwindowspatchlevel . "\""; | ||||
792 | $onefile->{'destination'} = $newdestination; | ||||
793 | |||||
794 | my $newfilename = $onefile->{'Name'} . "." . $localwindowspatchlevel; | ||||
795 | $onefile->{'Name'} = $newfilename; | ||||
796 | |||||
797 | # adding section information (section is the directory) | ||||
798 | my $origolddestination = $olddestination; | ||||
799 | installer::pathanalyzer::get_path_from_fullqualifiedname(\$olddestination); # directory part | ||||
800 | if ( ! $olddestination ) { $olddestination = "_root"; } | ||||
801 | if ( ! exists($patchfiledirectories{$olddestination}) ) { $patchfiledirectories{$olddestination} = 1; } | ||||
802 | $line = $line . "\tXXXXX\t" . $olddestination . "\n"; | ||||
803 | |||||
804 | push(@patchfiles, $line); | ||||
805 | |||||
806 | # also collecting all files from patch in @installer::globals::patchfilecollector | ||||
807 | my $patchfileline = $origolddestination . "\n"; | ||||
808 | push(@installer::globals::patchfilecollector, $patchfileline); | ||||
809 | } | ||||
810 | |||||
811 | my $winpatchdirname = "winpatch"; | ||||
812 | my $winpatchdir = installer::systemactions::create_directories($winpatchdirname, $languagestringref); | ||||
813 | |||||
814 | my ($patchlistfile) = grep {$_->{Name} eq $patchfilename} @{$filesref}; | ||||
815 | if (! defined $patchlistfile) { | ||||
816 | installer::exiter::exit_program("ERROR: Could not find file $patchfilename in list of files!", "prepare_windows_patchfiles"); | ||||
817 | } | ||||
818 | |||||
819 | # reorganizing the patchfile content, sorting for directory to decrease the file size | ||||
820 | my $sorteddirectorylist = [ sort keys %patchfiledirectories ]; | ||||
821 | my $patchfilelist = reorg_patchfile(\@patchfiles, $sorteddirectorylist); | ||||
822 | |||||
823 | # shifting version.ini to the end of the list, to guarantee, that all files are patched | ||||
824 | # if the correct version is shown in the about box | ||||
825 | $patchfilelist = shift_section_to_end($patchfilelist); | ||||
826 | $patchfilelist = shift_file_to_end($patchfilelist); | ||||
827 | |||||
828 | # saving the file | ||||
829 | $patchfilename = $winpatchdir . $installer::globals::separator . $patchfilename; | ||||
830 | installer::files::save_file($patchfilename, $patchfilelist); | ||||
831 | |||||
832 | my $infoline = "\nCreated list of patch files: $patchfilename\n"; | ||||
833 | push( @installer::globals::logfileinfo, $infoline); | ||||
834 | |||||
835 | # and assigning the new source | ||||
836 | $patchlistfile->{'sourcepath'} = $patchfilename; | ||||
837 | |||||
838 | # and finally checking the file size | ||||
839 | if ( -f $patchfilename ) # test of existence | ||||
840 | { | ||||
841 | my $filesize = ( -s $patchfilename ); | ||||
842 | $infoline = "Size of patch file list: $filesize\n\n"; | ||||
843 | push( @installer::globals::logfileinfo, $infoline); | ||||
844 | installer::logger::print_message( "... size of patch list file: $filesize Byte ... \n" ); | ||||
845 | } | ||||
846 | |||||
847 | } | ||||
848 | |||||
849 | ########################################################### | ||||
850 | # Replacing %-variables with the content | ||||
851 | # of $allvariableshashref | ||||
852 | ########################################################### | ||||
853 | |||||
854 | sub replace_variables_in_string | ||||
855 | # spent 71.6s (32.6+39.0) within installer::worker::replace_variables_in_string which was called 29866 times, avg 2.40ms/call:
# 20274 times (22.2s+26.4s) by installer::windows::registry::get_registry_value at line 283 of /cygdrive/c/lo/libo-master/instsetoo_native/util/C:/lo/libo-master/solenv/bin/modules/installer/windows/registry.pm, avg 2.40ms/call
# 9592 times (10.5s+12.6s) by installer::windows::registry::get_registry_key at line 244 of /cygdrive/c/lo/libo-master/instsetoo_native/util/C:/lo/libo-master/solenv/bin/modules/installer/windows/registry.pm, avg 2.40ms/call | ||||
856 | 89598 | 1.41s | my ( $string, $variableshashref ) = @_; | ||
857 | |||||
858 | 59732 | 4.61s | 29866 | 98.0ms | if ( $string =~ /^.*\%\w+.*$/ ) # spent 98.0ms making 29866 calls to installer::worker::CORE:match, avg 3µs/call |
859 | { | ||||
860 | my $key; | ||||
861 | |||||
862 | # we want to substitute FOO_BR before FOO to avoid floating _BR suffixes | ||||
863 | 29866 | 3.80s | foreach $key (sort { length ($b) <=> length ($a) } keys %{$variableshashref}) # spent 3.80s making 29866 calls to installer::worker::CORE:sort, avg 127µs/call | ||
864 | { | ||||
865 | 9945378 | 65.7s | my $value = $variableshashref->{$key}; | ||
866 | $key = "\%" . $key; | ||||
867 | 6630252 | 35.1s | $string =~ s/\Q$key\E/$value/g; # spent 32.9s making 3315126 calls to installer::worker::CORE:regcomp, avg 10µs/call
# spent 2.26s making 3315126 calls to installer::worker::CORE:subst, avg 681ns/call | ||
868 | } | ||||
869 | } | ||||
870 | |||||
871 | return $string; | ||||
872 | } | ||||
873 | |||||
874 | ###################################################### | ||||
875 | # Making systemcall | ||||
876 | ###################################################### | ||||
877 | |||||
878 | sub make_systemcall | ||||
879 | { | ||||
880 | my ($systemcall) = @_; | ||||
881 | |||||
882 | my $returnvalue = system($systemcall); | ||||
883 | |||||
884 | my $infoline = "Systemcall: $systemcall\n"; | ||||
885 | push( @installer::globals::logfileinfo, $infoline); | ||||
886 | |||||
887 | if ($returnvalue) | ||||
888 | { | ||||
889 | $infoline = "ERROR: Could not execute \"$systemcall\"!\n"; | ||||
890 | push( @installer::globals::logfileinfo, $infoline); | ||||
891 | } | ||||
892 | else | ||||
893 | { | ||||
894 | $infoline = "Success: Executed \"$systemcall\" successfully!\n"; | ||||
895 | push( @installer::globals::logfileinfo, $infoline); | ||||
896 | } | ||||
897 | } | ||||
898 | |||||
899 | ################################################################# | ||||
900 | # Copying the files defined as ScpActions into the | ||||
901 | # installation set. | ||||
902 | ################################################################# | ||||
903 | |||||
904 | sub put_scpactions_into_installset | ||||
905 | # spent 340µs (30+310) within installer::worker::put_scpactions_into_installset which was called:
# once (30µs+310µs) by installer::run at line 1720 of /cygdrive/c/lo/libo-master/instsetoo_native/util/C:/lo/libo-master/solenv/bin/modules/installer.pm | ||||
906 | 4 | 24µs | my ($installdir) = @_; | ||
907 | |||||
908 | 1 | 202µs | installer::logger::include_header_into_logfile("Start: Copying scp action files into installation set"); # spent 202µs making 1 call to installer::logger::include_header_into_logfile | ||
909 | |||||
910 | for ( my $i = 0; $i <= $#installer::globals::allscpactions; $i++ ) | ||||
911 | { | ||||
912 | my $onescpaction = $installer::globals::allscpactions[$i]; | ||||
913 | |||||
914 | my $subdir = ""; | ||||
915 | if ( $onescpaction->{'Subdir'} ) { $subdir = $onescpaction->{'Subdir'}; } | ||||
916 | |||||
917 | if ( $onescpaction->{'Name'} eq "loader.exe" ) { next; } # do not copy this ScpAction loader | ||||
918 | |||||
919 | my $destdir = $installdir; | ||||
920 | $destdir =~ s/\Q$installer::globals::separator\E\s*$//; | ||||
921 | if ( $subdir ) { $destdir = $destdir . $installer::globals::separator . $subdir; } | ||||
922 | |||||
923 | my $sourcefile = $onescpaction->{'sourcepath'}; | ||||
924 | my $destfile = $destdir . $installer::globals::separator . $onescpaction->{'DestinationName'}; | ||||
925 | |||||
926 | my $styles = ""; | ||||
927 | if ( $onescpaction->{'Styles'} ) { $styles = $onescpaction->{'Styles'}; } | ||||
928 | if (( $styles =~ /\bFILE_CAN_MISS\b/ ) && ( $sourcefile eq "" )) { next; } | ||||
929 | |||||
930 | if (( $subdir =~ /\// ) || ( $subdir =~ /\\/ )) | ||||
931 | { | ||||
932 | installer::systemactions::create_directory_structure($destdir); | ||||
933 | } | ||||
934 | else | ||||
935 | { | ||||
936 | installer::systemactions::create_directory($destdir); | ||||
937 | } | ||||
938 | |||||
939 | installer::systemactions::copy_one_file($sourcefile, $destfile); | ||||
940 | |||||
941 | if ( $onescpaction->{'UnixRights'} ) | ||||
942 | { | ||||
943 | chmod oct($onescpaction->{'UnixRights'}), $destfile; | ||||
944 | } | ||||
945 | |||||
946 | } | ||||
947 | |||||
948 | 1 | 108µs | installer::logger::include_header_into_logfile("End: Copying scp action files into installation set"); # spent 108µs making 1 call to installer::logger::include_header_into_logfile | ||
949 | |||||
950 | } | ||||
951 | |||||
952 | ################################################################# | ||||
953 | # Collecting scp actions for all languages | ||||
954 | ################################################################# | ||||
955 | |||||
956 | sub collect_scpactions | ||||
957 | # spent 16µs within installer::worker::collect_scpactions which was called:
# once (16µs+0s) by installer::run at line 972 of /cygdrive/c/lo/libo-master/instsetoo_native/util/C:/lo/libo-master/solenv/bin/modules/installer.pm | ||||
958 | 2 | 14µs | my ($allscpactions) = @_; | ||
959 | |||||
960 | for ( my $i = 0; $i <= $#{$allscpactions}; $i++ ) | ||||
961 | { | ||||
962 | push(@installer::globals::allscpactions, ${$allscpactions}[$i]); | ||||
963 | } | ||||
964 | } | ||||
965 | |||||
966 | ########################################################### | ||||
967 | # Adding additional variables into the variableshashref, | ||||
968 | # that are defined in include files in the solver. The | ||||
969 | # names of the include files are stored in | ||||
970 | # ADD_INCLUDE_FILES (comma separated list). | ||||
971 | ########################################################### | ||||
972 | |||||
973 | sub add_variables_from_inc_to_hashref | ||||
974 | # spent 1.61ms (539µs+1.07) within installer::worker::add_variables_from_inc_to_hashref which was called:
# once (539µs+1.07ms) by installer::run at line 309 of /cygdrive/c/lo/libo-master/instsetoo_native/util/C:/lo/libo-master/solenv/bin/modules/installer.pm | ||||
975 | 4 | 20µs | my ($allvariables, $includepatharrayref) = @_; | ||
976 | |||||
977 | my $infoline = ""; | ||||
978 | my $includefilelist = $allvariables->{'ADD_INCLUDE_FILES'} || ""; | ||||
979 | |||||
980 | for my $includefilename (split /,\s*/, $includefilelist) | ||||
981 | { | ||||
982 | 16 | 159µs | 2 | 5µs | $includefilename =~ s/^\s*//; # spent 5µs making 2 calls to installer::worker::CORE:subst, avg 3µs/call |
983 | 2 | 11µs | $includefilename =~ s/\s*$//; # spent 11µs making 2 calls to installer::worker::CORE:subst, avg 5µs/call | ||
984 | 2 | 60µs | $includefilenameref = installer::scriptitems::get_sourcepath_from_filename_and_includepath(\$includefilename, $includepatharrayref, 1); # spent 60µs making 2 calls to installer::scriptitems::get_sourcepath_from_filename_and_includepath, avg 30µs/call | ||
985 | if ( $$includefilenameref eq "" ) { installer::exiter::exit_program("Include file $includefilename not found!\nADD_INCLUDE_FILES = $allvariables->{'ADD_INCLUDE_FILES'}", "add_variables_from_inc_to_hashref"); } | ||||
986 | |||||
987 | $infoline = "Including inc file: $$includefilenameref \n"; | ||||
988 | push( @installer::globals::globallogfileinfo, $infoline); | ||||
989 | |||||
990 | 2 | 855µs | my $includefile = installer::files::read_file($$includefilenameref); # spent 855µs making 2 calls to installer::files::read_file, avg 428µs/call | ||
991 | |||||
992 | 122 | 376µs | for ( my $j = 0; $j <= $#{$includefile}; $j++ ) | ||
993 | { | ||||
994 | # Analyzing all "key=value" lines | ||||
995 | my $oneline = ${$includefile}[$j]; | ||||
996 | |||||
997 | 100 | 125µs | 61 | 136µs | if ( $oneline =~ /^\s*(\S+)\s*\=\s*(.*?)\s*$/ ) # no white space allowed in key # spent 136µs making 61 calls to installer::worker::CORE:match, avg 2µs/call |
998 | { | ||||
999 | my $key = $1; | ||||
1000 | my $value = $2; | ||||
1001 | $allvariables->{$key} = $value; | ||||
1002 | $infoline = "Setting of variable: $key = $value\n"; | ||||
1003 | push( @installer::globals::globallogfileinfo, $infoline); | ||||
1004 | } | ||||
1005 | } | ||||
1006 | } | ||||
1007 | } | ||||
1008 | |||||
1009 | ############################################## | ||||
1010 | # Collecting all files from include paths | ||||
1011 | ############################################## | ||||
1012 | |||||
1013 | sub collect_all_files_from_includepaths | ||||
1014 | # spent 2.67s (23.2ms+2.64) within installer::worker::collect_all_files_from_includepaths which was called:
# once (23.2ms+2.64s) by installer::run at line 290 of /cygdrive/c/lo/libo-master/instsetoo_native/util/C:/lo/libo-master/solenv/bin/modules/installer.pm | ||||
1015 | 9 | 57µs | my ($patharrayref) = @_; | ||
1016 | |||||
1017 | 1 | 95µs | installer::logger::globallog("Reading all directories: Start"); # spent 95µs making 1 call to installer::logger::globallog | ||
1018 | 1 | 24µs | installer::logger::print_message( "... reading include paths ...\n" ); # spent 24µs making 1 call to installer::logger::print_message | ||
1019 | # empty the global | ||||
1020 | |||||
1021 | @installer::globals::allincludepaths =(); | ||||
1022 | my $infoline; | ||||
1023 | |||||
1024 | 82 | 6.28ms | for ( my $i = 0; $i <= $#{$patharrayref}; $i++ ) | ||
1025 | { | ||||
1026 | $includepath = ${$patharrayref}[$i]; | ||||
1027 | 14 | 294µs | installer::remover::remove_leading_and_ending_whitespaces(\$includepath); # spent 294µs making 14 calls to installer::remover::remove_leading_and_ending_whitespaces, avg 21µs/call | ||
1028 | |||||
1029 | 12 | 19µs | 14 | 2.26ms | if ( ! -d $includepath ) # spent 2.26ms making 14 calls to installer::worker::CORE:ftdir, avg 162µs/call |
1030 | { | ||||
1031 | $infoline = "$includepath does not exist. (Can be removed from include path list?)\n"; | ||||
1032 | push( @installer::globals::globallogfileinfo, $infoline); | ||||
1033 | next; | ||||
1034 | } | ||||
1035 | |||||
1036 | my @sourcefiles = (); | ||||
1037 | my $pathstring = ""; | ||||
1038 | 10 | 2.64s | installer::systemactions::read_full_directory($includepath, $pathstring, \@sourcefiles); # spent 2.64s making 10 calls to installer::systemactions::read_full_directory, avg 264ms/call | ||
1039 | |||||
1040 | 70 | 19.1ms | if ( ! ( $#sourcefiles > -1 )) | ||
1041 | { | ||||
1042 | $infoline = "$includepath is empty. (Can be removed from include path list?)\n"; | ||||
1043 | push( @installer::globals::globallogfileinfo, $infoline); | ||||
1044 | } | ||||
1045 | else | ||||
1046 | { | ||||
1047 | my $number = $#sourcefiles + 1; | ||||
1048 | $infoline = "Directory $includepath contains $number files (including subdirs)\n"; | ||||
1049 | push( @installer::globals::globallogfileinfo, $infoline); | ||||
1050 | |||||
1051 | my %allfileshash = (); | ||||
1052 | $allfileshash{'includepath'} = $includepath; | ||||
1053 | |||||
1054 | for ( my $j = 0; $j <= $#sourcefiles; $j++ ) | ||||
1055 | { | ||||
1056 | $allfileshash{$sourcefiles[$j]} = 1; | ||||
1057 | } | ||||
1058 | |||||
1059 | push(@installer::globals::allincludepaths, \%allfileshash); | ||||
1060 | } | ||||
1061 | } | ||||
1062 | |||||
1063 | $installer::globals::include_paths_read = 1; | ||||
1064 | |||||
1065 | 1 | 77µs | installer::logger::globallog("Reading all directories: End"); # spent 77µs making 1 call to installer::logger::globallog | ||
1066 | push( @installer::globals::globallogfileinfo, "\n"); | ||||
1067 | } | ||||
1068 | |||||
1069 | ############################################## | ||||
1070 | # Searching for a file with the gid | ||||
1071 | ############################################## | ||||
1072 | |||||
1073 | sub find_file_by_id | ||||
1074 | # spent 1.74ms within installer::worker::find_file_by_id which was called 8 times, avg 218µs/call:
# 8 times (1.74ms+0s) by installer::setupscript::prepare_non_advertised_files at line 429 of /cygdrive/c/lo/libo-master/instsetoo_native/util/C:/lo/libo-master/solenv/bin/modules/installer/setupscript.pm, avg 218µs/call | ||||
1075 | 48 | 737µs | my ( $filesref, $gid ) = @_; | ||
1076 | |||||
1077 | my $foundfile = 0; | ||||
1078 | my $onefile; | ||||
1079 | |||||
1080 | 2034 | 1.01ms | for ( my $i = 0; $i <= $#{$filesref}; $i++ ) | ||
1081 | { | ||||
1082 | $onefile = ${$filesref}[$i]; | ||||
1083 | my $filegid = $onefile->{'gid'}; | ||||
1084 | |||||
1085 | 16 | 10µs | if ( $filegid eq $gid ) | ||
1086 | { | ||||
1087 | $foundfile = 1; | ||||
1088 | last; | ||||
1089 | } | ||||
1090 | } | ||||
1091 | |||||
1092 | if (! $foundfile ) { $onefile = ""; } | ||||
1093 | |||||
1094 | return $onefile; | ||||
1095 | } | ||||
1096 | |||||
1097 | ######################################################### | ||||
1098 | # Calling sum | ||||
1099 | ######################################################### | ||||
1100 | |||||
1101 | sub call_sum | ||||
1102 | { | ||||
1103 | my ($filename) = @_; | ||||
1104 | |||||
1105 | $sumfile = "/usr/bin/sum"; | ||||
1106 | |||||
1107 | if ( ! -f $sumfile ) { installer::exiter::exit_program("ERROR: No file /usr/bin/sum", "call_sum"); } | ||||
1108 | |||||
1109 | my $systemcall = "$sumfile $filename |"; | ||||
1110 | |||||
1111 | my $sumoutput = ""; | ||||
1112 | |||||
1113 | open (SUM, "$systemcall"); | ||||
1114 | $sumoutput = <SUM>; | ||||
1115 | close (SUM); | ||||
1116 | |||||
1117 | my $returnvalue = $?; # $? contains the return value of the systemcall | ||||
1118 | |||||
1119 | my $infoline = "Systemcall: $systemcall\n"; | ||||
1120 | push( @installer::globals::logfileinfo, $infoline); | ||||
1121 | |||||
1122 | if ($returnvalue) | ||||
1123 | { | ||||
1124 | $infoline = "ERROR: Could not execute \"$systemcall\"!\n"; | ||||
1125 | push( @installer::globals::logfileinfo, $infoline); | ||||
1126 | } | ||||
1127 | else | ||||
1128 | { | ||||
1129 | $infoline = "Success: Executed \"$systemcall\" successfully!\n"; | ||||
1130 | push( @installer::globals::logfileinfo, $infoline); | ||||
1131 | } | ||||
1132 | |||||
1133 | return $sumoutput; | ||||
1134 | } | ||||
1135 | |||||
1136 | ######################################################### | ||||
1137 | # Calling wc | ||||
1138 | # wc -c pkginfo | cut -f6 -d' ' | ||||
1139 | ######################################################### | ||||
1140 | |||||
1141 | sub call_wc | ||||
1142 | { | ||||
1143 | my ($filename) = @_; | ||||
1144 | |||||
1145 | $wcfile = "/usr/bin/wc"; | ||||
1146 | |||||
1147 | if ( ! -f $wcfile ) { installer::exiter::exit_program("ERROR: No file /usr/bin/wc", "call_wc"); } | ||||
1148 | |||||
1149 | my $systemcall = "$wcfile -c $filename |"; | ||||
1150 | |||||
1151 | my $wcoutput = ""; | ||||
1152 | |||||
1153 | open (WC, "$systemcall"); | ||||
1154 | $wcoutput = <WC>; | ||||
1155 | close (WC); | ||||
1156 | |||||
1157 | my $returnvalue = $?; # $? contains the return value of the systemcall | ||||
1158 | |||||
1159 | my $infoline = "Systemcall: $systemcall\n"; | ||||
1160 | push( @installer::globals::logfileinfo, $infoline); | ||||
1161 | |||||
1162 | if ($returnvalue) | ||||
1163 | { | ||||
1164 | $infoline = "ERROR: Could not execute \"$systemcall\"!\n"; | ||||
1165 | push( @installer::globals::logfileinfo, $infoline); | ||||
1166 | } | ||||
1167 | else | ||||
1168 | { | ||||
1169 | $infoline = "Success: Executed \"$systemcall\" successfully!\n"; | ||||
1170 | push( @installer::globals::logfileinfo, $infoline); | ||||
1171 | } | ||||
1172 | |||||
1173 | return $wcoutput; | ||||
1174 | } | ||||
1175 | |||||
1176 | ############################################## | ||||
1177 | # Setting time stamp of copied files to avoid | ||||
1178 | # errors from pkgchk. | ||||
1179 | ############################################## | ||||
1180 | |||||
1181 | sub set_time_stamp | ||||
1182 | { | ||||
1183 | my ($olddir, $newdir, $copyfiles) = @_; | ||||
1184 | |||||
1185 | for ( my $i = 0; $i <= $#{$copyfiles}; $i++ ) | ||||
1186 | { | ||||
1187 | my $sourcefile = $olddir . $installer::globals::separator . ${$copyfiles}[$i]; | ||||
1188 | my $destfile = $newdir . $installer::globals::separator . ${$copyfiles}[$i]; | ||||
1189 | |||||
1190 | my $systemcall = "touch -r $sourcefile $destfile"; | ||||
1191 | |||||
1192 | my $returnvalue = system($systemcall); | ||||
1193 | |||||
1194 | my $infoline = "Systemcall: $systemcall\n"; | ||||
1195 | push( @installer::globals::logfileinfo, $infoline); | ||||
1196 | |||||
1197 | if ($returnvalue) | ||||
1198 | { | ||||
1199 | $infoline = "ERROR: \"$systemcall\" failed!\n"; | ||||
1200 | push( @installer::globals::logfileinfo, $infoline); | ||||
1201 | } | ||||
1202 | else | ||||
1203 | { | ||||
1204 | $infoline = "Success: \"$systemcall\" !\n"; | ||||
1205 | push( @installer::globals::logfileinfo, $infoline); | ||||
1206 | } | ||||
1207 | } | ||||
1208 | } | ||||
1209 | |||||
1210 | ################################################# | ||||
1211 | # Generating paths for cygwin (second version) | ||||
1212 | # This function generates smaller files for | ||||
1213 | ################################################# | ||||
1214 | |||||
1215 | sub generate_cygwin_paths | ||||
1216 | # spent 6.45s (372ms+6.08) within installer::worker::generate_cygwin_paths which was called 2 times, avg 3.23s/call:
# once (185ms+3.15s) by installer::windows::msiglobal::generate_cab_file_list at line 174 of /cygdrive/c/lo/libo-master/instsetoo_native/util/C:/lo/libo-master/solenv/bin/modules/installer/windows/msiglobal.pm
# once (188ms+2.93s) by installer::windows::file::create_files_table at line 866 of /cygdrive/c/lo/libo-master/instsetoo_native/util/C:/lo/libo-master/solenv/bin/modules/installer/windows/file.pm | ||||
1217 | 22 | 73.9ms | my ($filesref) = @_; | ||
1218 | |||||
1219 | 2 | 213µs | installer::logger::include_timestamp_into_logfile("Starting generating cygwin paths"); # spent 213µs making 2 calls to installer::logger::include_timestamp_into_logfile, avg 107µs/call | ||
1220 | |||||
1221 | my $infoline = "Generating cygwin paths (generate_cygwin_paths)\n"; | ||||
1222 | push( @installer::globals::logfileinfo, $infoline); | ||||
1223 | |||||
1224 | my $max = 5000; # number of paths in one file | ||||
1225 | |||||
1226 | my @pathcollector = (); | ||||
1227 | my $startnumber = 0; | ||||
1228 | my $counter = 0; | ||||
1229 | |||||
1230 | 127236 | 110ms | for ( my $i = 0; $i <= $#{$filesref}; $i++ ) | ||
1231 | { | ||||
1232 | my $line = ${$filesref}[$i]->{'sourcepath'} . "\n"; | ||||
1233 | push(@pathcollector, $line); | ||||
1234 | $counter++; | ||||
1235 | |||||
1236 | 152 | 6.14s | if (( $i == $#{$filesref} ) || ((( $counter % $max ) == 0 ) && ( $i > 0 ))) | ||
1237 | { | ||||
1238 | my $tmpfilename = "cygwinhelper_" . $i . ".txt"; | ||||
1239 | my $temppath = $installer::globals::temppath; | ||||
1240 | 16 | 199µs | $temppath =~ s/\Q$installer::globals::separator\E\s*$//; # spent 122µs making 8 calls to installer::worker::CORE:subst, avg 15µs/call
# spent 77µs making 8 calls to installer::worker::CORE:regcomp, avg 10µs/call | ||
1241 | $tmpfilename = $temppath . $installer::globals::separator . $tmpfilename; | ||||
1242 | $infoline = "Creating temporary file for cygwin conversion: $tmpfilename (contains $counter paths)\n"; | ||||
1243 | push( @installer::globals::logfileinfo, $infoline); | ||||
1244 | 8 | 2.78ms | if ( -f $tmpfilename ) { unlink $tmpfilename; } # spent 2.78ms making 8 calls to installer::worker::CORE:ftfile, avg 348µs/call | ||
1245 | |||||
1246 | 8 | 22.7ms | installer::files::save_file($tmpfilename, \@pathcollector); # spent 22.7ms making 8 calls to installer::files::save_file, avg 2.84ms/call | ||
1247 | |||||
1248 | my $success = 0; | ||||
1249 | 8 | 6.05s | my @cyg_sourcepathlist = qx{cygpath -w -f "$tmpfilename"}; # spent 6.05s making 8 calls to installer::worker::CORE:backtick, avg 756ms/call | ||
1250 | chomp @cyg_sourcepathlist; | ||||
1251 | |||||
1252 | # Validating the array, it has to contain the correct number of values | ||||
1253 | my $new_paths = $#cyg_sourcepathlist + 1; | ||||
1254 | if ( $new_paths == $counter ) { $success = 1; } | ||||
1255 | |||||
1256 | 16 | 62µs | if ($success) | ||
1257 | { | ||||
1258 | $infoline = "Success: Successfully converted to cygwin paths!\n"; | ||||
1259 | push( @installer::globals::logfileinfo, $infoline); | ||||
1260 | } | ||||
1261 | else | ||||
1262 | { | ||||
1263 | $infoline = "ERROR: Failed to convert to cygwin paths!\n"; | ||||
1264 | push( @installer::globals::logfileinfo, $infoline); | ||||
1265 | installer::exiter::exit_program("ERROR: Failed to convert to cygwin paths!", "generate_cygwin_paths"); | ||||
1266 | } | ||||
1267 | |||||
1268 | 63618 | 64.8ms | for ( my $j = 0; $j <= $#cyg_sourcepathlist; $j++ ) | ||
1269 | { | ||||
1270 | my $number = $startnumber + $j; | ||||
1271 | ${$filesref}[$number]->{'cyg_sourcepath'} = $cyg_sourcepathlist[$j]; | ||||
1272 | } | ||||
1273 | |||||
1274 | 16 | 5.65ms | if ( -f $tmpfilename ) { unlink $tmpfilename; } # spent 3.74ms making 8 calls to installer::worker::CORE:unlink, avg 468µs/call
# spent 1.91ms making 8 calls to installer::worker::CORE:ftfile, avg 238µs/call | ||
1275 | |||||
1276 | @pathcollector = (); | ||||
1277 | $startnumber = $startnumber + $max; | ||||
1278 | $counter = 0; | ||||
1279 | } | ||||
1280 | } | ||||
1281 | |||||
1282 | # Checking existence fo cyg_sourcepath for every file | ||||
1283 | 31809 | 42.1ms | for ( my $i = 0; $i <= $#{$filesref}; $i++ ) | ||
1284 | { | ||||
1285 | if (( ! exists(${$filesref}[$i]->{'cyg_sourcepath'}) ) || ( ${$filesref}[$i]->{'cyg_sourcepath'} eq "" )) | ||||
1286 | { | ||||
1287 | $infoline = "ERROR: No cygwin sourcepath defined for file ${$filesref}[$i]->{'sourcepath'}\n"; | ||||
1288 | push( @installer::globals::logfileinfo, $infoline); | ||||
1289 | installer::exiter::exit_program("ERROR: No cygwin sourcepath defined for file ${$filesref}[$i]->{'sourcepath'}!", "generate_cygwin_paths"); | ||||
1290 | } | ||||
1291 | } | ||||
1292 | |||||
1293 | 2 | 455µs | installer::logger::include_timestamp_into_logfile("Ending generating cygwin paths"); # spent 455µs making 2 calls to installer::logger::include_timestamp_into_logfile, avg 227µs/call | ||
1294 | } | ||||
1295 | |||||
1296 | ################################################ | ||||
1297 | # Files with flag HIDDEN get a dot at the | ||||
1298 | # beginning of the file name. This cannot be | ||||
1299 | # defined in scp2 project, because tooling | ||||
1300 | # cannot handle files with beginning dot | ||||
1301 | # correctly. | ||||
1302 | ################################################ | ||||
1303 | |||||
1304 | sub resolving_hidden_flag | ||||
1305 | # spent 401ms (102+299) within installer::worker::resolving_hidden_flag which was called:
# once (102ms+299ms) by installer::run at line 731 of /cygdrive/c/lo/libo-master/instsetoo_native/util/C:/lo/libo-master/solenv/bin/modules/installer.pm | ||||
1306 | 8 | 17.7ms | my ($filesarrayref, $variableshashref, $item, $languagestringref) = @_; | ||
1307 | |||||
1308 | my $diritem = lc($item); | ||||
1309 | my $infoline = ""; | ||||
1310 | |||||
1311 | 1 | 291ms | my $hiddendirbase = installer::systemactions::create_directories("hidden_$diritem", $languagestringref); # spent 291ms making 1 call to installer::systemactions::create_directories | ||
1312 | |||||
1313 | 1 | 169µs | installer::logger::include_header_into_logfile("$item with flag HIDDEN:"); # spent 169µs making 1 call to installer::logger::include_header_into_logfile | ||
1314 | |||||
1315 | 63580 | 92.7ms | for ( my $i = 0; $i <= $#{$filesarrayref}; $i++ ) | ||
1316 | { | ||||
1317 | my $onefile = ${$filesarrayref}[$i]; | ||||
1318 | my $styles = ""; | ||||
1319 | |||||
1320 | if ( $onefile->{'Styles'} ) { $styles = $onefile->{'Styles'}; } | ||||
1321 | |||||
1322 | 15895 | 8.53ms | if ( $styles =~ /\bHIDDEN\b/ ) # spent 8.53ms making 15895 calls to installer::worker::CORE:match, avg 537ns/call | ||
1323 | { | ||||
1324 | # Language specific subdirectory | ||||
1325 | |||||
1326 | my $onelanguage = $onefile->{'specificlanguage'}; | ||||
1327 | |||||
1328 | if ($onelanguage eq "") | ||||
1329 | { | ||||
1330 | $onelanguage = "00"; # files without language into directory "00" | ||||
1331 | } | ||||
1332 | |||||
1333 | my $hiddendir = $hiddendirbase . $installer::globals::separator . $onelanguage . $installer::globals::separator; | ||||
1334 | installer::systemactions::create_directory($hiddendir); # creating language specific directories | ||||
1335 | |||||
1336 | # copy files and edit them with the variables defined in the zip.lst | ||||
1337 | |||||
1338 | my $onefilename = $onefile->{'Name'}; | ||||
1339 | my $newfilename = "\." . $onefilename; | ||||
1340 | my $sourcefile = $onefile->{'sourcepath'}; | ||||
1341 | my $destfile = $hiddendir . $newfilename; | ||||
1342 | |||||
1343 | my $copysuccess = installer::systemactions::copy_one_file($sourcefile, $destfile); | ||||
1344 | |||||
1345 | if ( $copysuccess ) | ||||
1346 | { | ||||
1347 | $onefile->{'sourcepath'} = $destfile; | ||||
1348 | $destination = $onefile->{'destination'}; | ||||
1349 | installer::pathanalyzer::get_path_from_fullqualifiedname(\$destination); | ||||
1350 | if ( $destination eq "" ) { $onefile->{'destination'} = $newfilename; } | ||||
1351 | else { $onefile->{'destination'} = $destination . $installer::globals::separator . $newfilename; } | ||||
1352 | |||||
1353 | $infoline = "Success: Using file with flag HIDDEN from \"$onefile->{'sourcepath'}\"!\n"; | ||||
1354 | push( @installer::globals::logfileinfo, $infoline); | ||||
1355 | } | ||||
1356 | else | ||||
1357 | { | ||||
1358 | $infoline = "Error: Failed to copy HIDDEN file from \"$sourcefile\" to \"$destfile\"!\n"; | ||||
1359 | push( @installer::globals::logfileinfo, $infoline); | ||||
1360 | } | ||||
1361 | } | ||||
1362 | } | ||||
1363 | |||||
1364 | $infoline = "\n"; | ||||
1365 | push( @installer::globals::logfileinfo, $infoline); | ||||
1366 | } | ||||
1367 | |||||
1368 | ################################################ | ||||
1369 | # Controlling that all keys in hash A are | ||||
1370 | # also key in hash B. | ||||
1371 | ################################################ | ||||
1372 | |||||
1373 | sub key_in_a_is_also_key_in_b | ||||
1374 | # spent 8.22ms within installer::worker::key_in_a_is_also_key_in_b which was called 66 times, avg 124µs/call:
# 66 times (8.22ms+0s) by installer::scriptitems::get_string_of_modulegids_for_itemgid at line 2149 of /cygdrive/c/lo/libo-master/instsetoo_native/util/C:/lo/libo-master/solenv/bin/modules/installer/scriptitems.pm, avg 124µs/call | ||||
1375 | 330 | 2.23ms | my ( $hashref_a, $hashref_b) = @_; | ||
1376 | |||||
1377 | my $returnvalue = 1; | ||||
1378 | |||||
1379 | my $key; | ||||
1380 | foreach $key ( keys %{$hashref_a} ) | ||||
1381 | { | ||||
1382 | 7260 | 6.14ms | if ( ! exists($hashref_b->{$key}) ) | ||
1383 | { | ||||
1384 | print "*****\n"; | ||||
1385 | foreach $keyb ( keys %{$hashref_b} ) { print "$keyb : $hashref_b->{$keyb}\n"; } | ||||
1386 | print "*****\n"; | ||||
1387 | $returnvalue = 0; | ||||
1388 | } | ||||
1389 | } | ||||
1390 | |||||
1391 | return $returnvalue; | ||||
1392 | } | ||||
1393 | |||||
1394 | ###################################################### | ||||
1395 | # Getting the first entry from a list of languages | ||||
1396 | ###################################################### | ||||
1397 | |||||
1398 | sub get_first_from_list | ||||
1399 | { | ||||
1400 | my ( $list ) = @_; | ||||
1401 | |||||
1402 | my $first = $list; | ||||
1403 | |||||
1404 | if ( $list =~ /^\s*(.+?),(.+)\s*$/) # "?" for minimal matching | ||||
1405 | { | ||||
1406 | $first = $1; | ||||
1407 | } | ||||
1408 | |||||
1409 | return $first; | ||||
1410 | } | ||||
1411 | |||||
1412 | ################################################ | ||||
1413 | # Setting all spellchecker languages | ||||
1414 | ################################################ | ||||
1415 | |||||
1416 | sub set_spellcheckerlanguages | ||||
1417 | # spent 4.64ms (2.53+2.11) within installer::worker::set_spellcheckerlanguages which was called:
# once (2.53ms+2.11ms) by installer::run at line 626 of /cygdrive/c/lo/libo-master/instsetoo_native/util/C:/lo/libo-master/solenv/bin/modules/installer.pm | ||||
1418 | 18 | 499µs | my ( $productlanguagesarrayref, $allvariables ) = @_; | ||
1419 | |||||
1420 | my %productlanguages = (); | ||||
1421 | for ( my $i = 0; $i <= $#{$productlanguagesarrayref}; $i++ ) { $productlanguages{${$productlanguagesarrayref}[$i]} = 1; } | ||||
1422 | |||||
1423 | my $spellcheckfilename = $allvariables->{'SPELLCHECKERFILE'}; | ||||
1424 | |||||
1425 | 1 | 40µs | my $spellcheckfileref = installer::scriptitems::get_sourcepath_from_filename_and_includepath(\$spellcheckfilename, "", 1); # spent 40µs making 1 call to installer::scriptitems::get_sourcepath_from_filename_and_includepath | ||
1426 | |||||
1427 | if ($$spellcheckfileref eq "") { installer::exiter::exit_program("ERROR: Could not find $spellcheckfilename!", "set_spellcheckerlanguages"); } | ||||
1428 | |||||
1429 | my $infoline = "Using spellchecker file: $$spellcheckfileref \n"; | ||||
1430 | push( @installer::globals::globallogfileinfo, $infoline); | ||||
1431 | |||||
1432 | 1 | 776µs | my $spellcheckfile = installer::files::read_file($$spellcheckfileref); # spent 776µs making 1 call to installer::files::read_file | ||
1433 | my %spellcheckhash = (); | ||||
1434 | |||||
1435 | 132 | 448µs | for ( my $j = 0; $j <= $#{$spellcheckfile}; $j++ ) | ||
1436 | { | ||||
1437 | # Analyzing all "key=value" lines | ||||
1438 | my $oneline = ${$spellcheckfile}[$j]; | ||||
1439 | |||||
1440 | 216 | 230µs | 66 | 165µs | if ( $oneline =~ /^\s*(\S+)\s*\=\s*\"(.*?)\"\s*$/ ) # no white space allowed in key # spent 165µs making 66 calls to installer::worker::CORE:match, avg 3µs/call |
1441 | { | ||||
1442 | my $onelang = $1; | ||||
1443 | my $languagelist = $2; | ||||
1444 | |||||
1445 | # Special handling for language packs. Only include the first language of the language list. | ||||
1446 | # If no spellchecker shall be included, the keyword "EMPTY" can be used. | ||||
1447 | |||||
1448 | 54 | 196µs | if ( $installer::globals::languagepack ) | ||
1449 | { | ||||
1450 | my $first = get_first_from_list($languagelist); | ||||
1451 | |||||
1452 | if ( $first eq "EMPTY" ) # no spellchecker into language pack | ||||
1453 | { | ||||
1454 | $languagelist = ""; | ||||
1455 | } | ||||
1456 | else | ||||
1457 | { | ||||
1458 | $languagelist = $first; | ||||
1459 | } | ||||
1460 | } | ||||
1461 | else # no language pack, so EMPTY is not required | ||||
1462 | { | ||||
1463 | 54 | 31µs | $languagelist =~ s/^\s*EMPTY\s*,//; # removing the entry EMPTY # spent 31µs making 54 calls to installer::worker::CORE:subst, avg 574ns/call | ||
1464 | } | ||||
1465 | |||||
1466 | $spellcheckhash{$onelang} = $languagelist; | ||||
1467 | } | ||||
1468 | } | ||||
1469 | |||||
1470 | # Collecting all required languages in %installer::globals::spellcheckerlanguagehash | ||||
1471 | |||||
1472 | foreach my $lang (keys %productlanguages) | ||||
1473 | { | ||||
1474 | 436 | 964µs | my $languagelist = ""; | ||
1475 | 56 | 23µs | if ( exists($spellcheckhash{$lang}) ) { $languagelist = $spellcheckhash{$lang}; } | ||
1476 | else { $languagelist = ""; } # no dictionary unless defined in SPELLCHECKERFILE | ||||
1477 | |||||
1478 | 109 | 1.06ms | my $langlisthash = installer::converter::convert_stringlist_into_hash(\$languagelist, ","); # spent 1.06ms making 109 calls to installer::converter::convert_stringlist_into_hash, avg 10µs/call | ||
1479 | 94 | 147µs | foreach my $onelang ( keys %{$langlisthash} ) { $installer::globals::spellcheckerlanguagehash{$onelang} = 1; } | ||
1480 | } | ||||
1481 | |||||
1482 | $installer::globals::analyze_spellcheckerlanguage = 1; | ||||
1483 | |||||
1484 | # Logging | ||||
1485 | |||||
1486 | my $langstring = ""; | ||||
1487 | 47 | 60µs | 1 | 32µs | foreach my $lang (sort keys %installer::globals::spellcheckerlanguagehash) { $langstring = $langstring . "," . $lang } # spent 32µs making 1 call to installer::worker::CORE:sort |
1488 | 1 | 8µs | $langstring =~ s/^\s*,//; # spent 8µs making 1 call to installer::worker::CORE:subst | ||
1489 | |||||
1490 | $infoline = "Collected spellchecker languages for spellchecker: $langstring \n"; | ||||
1491 | push( @installer::globals::globallogfileinfo, $infoline); | ||||
1492 | } | ||||
1493 | |||||
1494 | ################################################ | ||||
1495 | # Including a license text into setup script | ||||
1496 | ################################################ | ||||
1497 | |||||
1498 | sub put_license_into_setup | ||||
1499 | { | ||||
1500 | my ($installdir, $includepatharrayref) = @_; | ||||
1501 | |||||
1502 | # find and read english license file | ||||
1503 | my $licenselanguage = "en-US"; # always english ! | ||||
1504 | # my $licensefilename = "LICENSE"; # _" . $licenselanguage; | ||||
1505 | my $licensefilename = "license"; # . $licenselanguage . ".txt"; | ||||
1506 | my $licenseincludepatharrayref = get_language_specific_include_paths($includepatharrayref, $licenselanguage); | ||||
1507 | |||||
1508 | my $licenseref = installer::scriptitems::get_sourcepath_from_filename_and_includepath(\$licensefilename, $licenseincludepatharrayref, 0); | ||||
1509 | if ($$licenseref eq "") { installer::exiter::exit_program("ERROR: Could not find License file $licensefilename!", "put_license_into_setup"); } | ||||
1510 | my $licensefile = installer::files::read_file($$licenseref); | ||||
1511 | |||||
1512 | # Read setup | ||||
1513 | my $setupfilename = $installdir . $installer::globals::separator . "setup"; | ||||
1514 | my $setupfile = installer::files::read_file($setupfilename); | ||||
1515 | |||||
1516 | # Replacement | ||||
1517 | my $infoline = "Adding licensefile into setup script\n"; | ||||
1518 | push( @installer::globals::logfileinfo, $infoline); | ||||
1519 | |||||
1520 | my $includestring = ""; | ||||
1521 | for ( my $i = 0; $i <= $#{$licensefile}; $i++ ) { $includestring = $includestring . ${$licensefile}[$i]; } | ||||
1522 | for ( my $i = 0; $i <= $#{$setupfile}; $i++ ) { ${$setupfile}[$i] =~ s/LICENSEFILEPLACEHOLDER/$includestring/; } | ||||
1523 | |||||
1524 | # Write setup | ||||
1525 | installer::files::save_file($setupfilename, $setupfile); | ||||
1526 | } | ||||
1527 | |||||
1528 | ######################################################### | ||||
1529 | # Create a tar file from the binary package | ||||
1530 | ######################################################### | ||||
1531 | |||||
1532 | sub tar_package | ||||
1533 | { | ||||
1534 | my ( $installdir, $packagename, $tarfilename, $getuidlibrary) = @_; | ||||
1535 | |||||
1536 | my $ldpreloadstring = ""; | ||||
1537 | if ( $getuidlibrary ne "" ) { $ldpreloadstring = "LD_PRELOAD=" . $getuidlibrary; } | ||||
1538 | |||||
1539 | my $systemcall = "cd $installdir; $ldpreloadstring tar -cf - $packagename > $tarfilename"; | ||||
1540 | |||||
1541 | my $returnvalue = system($systemcall); | ||||
1542 | |||||
1543 | my $infoline = "Systemcall: $systemcall\n"; | ||||
1544 | push( @installer::globals::logfileinfo, $infoline); | ||||
1545 | |||||
1546 | if ($returnvalue) | ||||
1547 | { | ||||
1548 | $infoline = "ERROR: Could not execute \"$systemcall\"!\n"; | ||||
1549 | push( @installer::globals::logfileinfo, $infoline); | ||||
1550 | } | ||||
1551 | else | ||||
1552 | { | ||||
1553 | $infoline = "Success: Executed \"$systemcall\" successfully!\n"; | ||||
1554 | push( @installer::globals::logfileinfo, $infoline); | ||||
1555 | } | ||||
1556 | |||||
1557 | chmod 0775, $tarfilename; | ||||
1558 | |||||
1559 | my $fulltarfile = $installdir . $installer::globals::separator . $tarfilename; | ||||
1560 | my $filesize = ( -s $fulltarfile ); | ||||
1561 | |||||
1562 | return $filesize; | ||||
1563 | } | ||||
1564 | |||||
1565 | ######################################################### | ||||
1566 | # Shuffle an array (Fisher Yates shuffle) | ||||
1567 | ######################################################### | ||||
1568 | |||||
1569 | sub shuffle_array | ||||
1570 | { | ||||
1571 | my ( $arrayref ) = @_; | ||||
1572 | |||||
1573 | my $i = @$arrayref; | ||||
1574 | while (--$i) | ||||
1575 | { | ||||
1576 | my $j = int rand ($i+1); | ||||
1577 | @$arrayref[$i,$j] = @$arrayref[$j,$i]; | ||||
1578 | } | ||||
1579 | } | ||||
1580 | |||||
1581 | ################################################ | ||||
1582 | # Defining the English license text to add | ||||
1583 | # it into Solaris packages. | ||||
1584 | ################################################ | ||||
1585 | |||||
1586 | sub set_english_license | ||||
1587 | { | ||||
1588 | my $additional_license_name = $installer::globals::englishsolarislicensename; # always the English file | ||||
1589 | my $licensefileref = installer::scriptitems::get_sourcepath_from_filename_and_includepath(\$additional_license_name, "" , 0); | ||||
1590 | if ( $$licensefileref eq "" ) { installer::exiter::exit_program("ERROR: Could not find license file $additional_license_name!", "set_english_license"); } | ||||
1591 | $installer::globals::englishlicenseset = 1; | ||||
1592 | $installer::globals::englishlicense = installer::files::read_file($$licensefileref); | ||||
1593 | installer::scpzipfiles::replace_all_ziplistvariables_in_file($installer::globals::englishlicense, $variableshashref); | ||||
1594 | } | ||||
1595 | |||||
1596 | ############################################## | ||||
1597 | # Setting time stamp of copied files to avoid | ||||
1598 | # errors from pkgchk. | ||||
1599 | ############################################## | ||||
1600 | |||||
1601 | sub set_time_stamp_for_file | ||||
1602 | { | ||||
1603 | my ($sourcefile, $destfile) = @_; | ||||
1604 | |||||
1605 | my $systemcall = "touch -r $sourcefile $destfile"; | ||||
1606 | |||||
1607 | my $returnvalue = system($systemcall); | ||||
1608 | |||||
1609 | my $infoline = "Systemcall: $systemcall\n"; | ||||
1610 | push( @installer::globals::logfileinfo, $infoline); | ||||
1611 | |||||
1612 | if ($returnvalue) | ||||
1613 | { | ||||
1614 | $infoline = "ERROR: \"$systemcall\" failed!\n"; | ||||
1615 | push( @installer::globals::logfileinfo, $infoline); | ||||
1616 | } | ||||
1617 | else | ||||
1618 | { | ||||
1619 | $infoline = "Success: \"$systemcall\" !\n"; | ||||
1620 | push( @installer::globals::logfileinfo, $infoline); | ||||
1621 | } | ||||
1622 | } | ||||
1623 | |||||
1624 | ############################################## | ||||
1625 | # Setting checksum and wordcount for changed | ||||
1626 | # pkginfo file into pkgmap. | ||||
1627 | ############################################## | ||||
1628 | |||||
1629 | sub change_onefile_in_pkgmap | ||||
1630 | { | ||||
1631 | my ($pkgmapfile, $fullfilename, $shortfilename) = @_; | ||||
1632 | |||||
1633 | # 1 i pkginfo 442 34577 1166716297 | ||||
1634 | # -> | ||||
1635 | # 1 i pkginfo 443 34737 1166716297 | ||||
1636 | # | ||||
1637 | # wc -c pkginfo | cut -f6 -d' ' -> 442 (variable) | ||||
1638 | # sum pkginfo | cut -f1 -d' ' -> 34577 (variable) | ||||
1639 | # grep 'pkginfo' pkgmap | cut -f6 -d' ' -> 1166716297 (fix) | ||||
1640 | |||||
1641 | my $checksum = call_sum($fullfilename); | ||||
1642 | if ( $checksum =~ /^\s*(\d+)\s+.*$/ ) { $checksum = $1; } | ||||
1643 | |||||
1644 | my $wordcount = call_wc($fullfilename); | ||||
1645 | if ( $wordcount =~ /^\s*(\d+)\s+.*$/ ) { $wordcount = $1; } | ||||
1646 | |||||
1647 | for ( my $i = 0; $i <= $#{$pkgmapfile}; $i++ ) | ||||
1648 | { | ||||
1649 | if ( ${$pkgmapfile}[$i] =~ /(^.*\b\Q$shortfilename\E\b\s+)(\d+)(\s+)(\d+)(\s+)(\d+)(\s*$)/ ) | ||||
1650 | { | ||||
1651 | my $newline = $1 . $wordcount . $3 . $checksum . $5 . $6 . $7; | ||||
1652 | ${$pkgmapfile}[$i] = $newline; | ||||
1653 | last; | ||||
1654 | } | ||||
1655 | } | ||||
1656 | } | ||||
1657 | |||||
1658 | ################################################ | ||||
1659 | # Adding the content of the English license | ||||
1660 | # file into the system integration packages. | ||||
1661 | ################################################ | ||||
1662 | |||||
1663 | sub add_license_into_systemintegrationpackages | ||||
1664 | { | ||||
1665 | my ($destdir, $packages) = @_; | ||||
1666 | |||||
1667 | for ( my $i = 0; $i <= $#{$packages}; $i++ ) | ||||
1668 | { | ||||
1669 | my $copyrightfilename = ${$packages}[$i] . $installer::globals::separator . "install" . $installer::globals::separator . "copyright"; | ||||
1670 | if ( ! -f $copyrightfilename ) { installer::exiter::exit_program("ERROR: Could not find license file in system integration package: $copyrightfilename!", "add_license_into_systemintegrationpackages"); } | ||||
1671 | my $copyrightfile = installer::files::read_file($copyrightfilename); | ||||
1672 | |||||
1673 | # Saving time stamp of old copyrightfile | ||||
1674 | my $savcopyrightfilename = $copyrightfilename . ".sav"; | ||||
1675 | installer::systemactions::copy_one_file($copyrightfilename, $savcopyrightfilename); | ||||
1676 | set_time_stamp_for_file($copyrightfilename, $savcopyrightfilename); # now $savcopyrightfile has the time stamp of $copyrightfile | ||||
1677 | |||||
1678 | # Adding license content to copyright file | ||||
1679 | push(@{$copyrightfile}, "\n"); | ||||
1680 | for ( my $i = 0; $i <= $#{$installer::globals::englishlicense}; $i++ ) { push(@{$copyrightfile}, ${$installer::globals::englishlicense}[$i]); } | ||||
1681 | installer::files::save_file($copyrightfilename, $copyrightfile); | ||||
1682 | |||||
1683 | # Setting the old time stamp saved with $savcopyrightfilename | ||||
1684 | set_time_stamp_for_file($savcopyrightfilename, $copyrightfilename); # now $copyrightfile has the time stamp of $savcopyrightfile | ||||
1685 | unlink($savcopyrightfilename); | ||||
1686 | |||||
1687 | # Changing content of copyright file in pkgmap | ||||
1688 | my $pkgmapfilename = ${$packages}[$i] . $installer::globals::separator . "pkgmap"; | ||||
1689 | if ( ! -f $pkgmapfilename ) { installer::exiter::exit_program("ERROR: Could not find pkgmap in system integration package: $pkgmapfilename!", "add_license_into_systemintegrationpackages"); } | ||||
1690 | my $pkgmap = installer::files::read_file($pkgmapfilename); | ||||
1691 | change_onefile_in_pkgmap($pkgmap, $copyrightfilename, "copyright"); | ||||
1692 | installer::files::save_file($pkgmapfilename, $pkgmap); | ||||
1693 | } | ||||
1694 | } | ||||
1695 | |||||
1696 | ######################################################### | ||||
1697 | # Collecting all pkgmap files from an installation set | ||||
1698 | ######################################################### | ||||
1699 | |||||
1700 | sub collectpackagemaps | ||||
1701 | { | ||||
1702 | my ( $installdir, $languagestringref, $allvariables ) = @_; | ||||
1703 | |||||
1704 | installer::logger::include_header_into_logfile("Collecing all packagemaps (pkgmap):"); | ||||
1705 | |||||
1706 | my $pkgmapdir = installer::systemactions::create_directories("pkgmap", $languagestringref); | ||||
1707 | my $subdirname = $allvariables->{'UNIXPRODUCTNAME'} . "_pkgmaps"; | ||||
1708 | my $pkgmapsubdir = $pkgmapdir . $installer::globals::separator . $subdirname; | ||||
1709 | if ( -d $pkgmapsubdir ) { installer::systemactions::remove_complete_directory($pkgmapsubdir); } | ||||
1710 | if ( ! -d $pkgmapsubdir ) { installer::systemactions::create_directory($pkgmapsubdir); } | ||||
1711 | |||||
1712 | $installdir =~ s/\/\s*$//; | ||||
1713 | # Collecting all packages in $installdir and its sub package ("packages") | ||||
1714 | my $searchdir = $installdir . $installer::globals::separator . $installer::globals::epmoutpath; | ||||
1715 | |||||
1716 | my $allpackages = installer::systemactions::get_all_directories_without_path($searchdir); | ||||
1717 | |||||
1718 | for ( my $i = 0; $i <= $#{$allpackages}; $i++ ) | ||||
1719 | { | ||||
1720 | my $pkgmapfile = $searchdir . $installer::globals::separator . ${$allpackages}[$i] . $installer::globals::separator . "pkgmap"; | ||||
1721 | my $destfilename = $pkgmapsubdir . $installer::globals::separator . ${$allpackages}[$i] . "_pkgmap"; | ||||
1722 | installer::systemactions::copy_one_file($pkgmapfile, $destfilename); | ||||
1723 | } | ||||
1724 | |||||
1725 | # Create a tar gz file with all package maps | ||||
1726 | my $tarfilename = $subdirname . ".tar"; | ||||
1727 | my $targzname = $tarfilename . ".gz"; | ||||
1728 | $systemcall = "cd $pkgmapdir; tar -cf - $subdirname | gzip > $targzname"; | ||||
1729 | make_systemcall($systemcall); | ||||
1730 | installer::systemactions::remove_complete_directory($pkgmapsubdir, 1); | ||||
1731 | } | ||||
1732 | |||||
1733 | 1 | 10µs | 1; | ||
# spent 6.05s within installer::worker::CORE:backtick which was called 8 times, avg 756ms/call:
# 8 times (6.05s+0s) by installer::worker::generate_cygwin_paths at line 1249, avg 756ms/call | |||||
# spent 4.18ms within installer::worker::CORE:ftdir which was called 24 times, avg 174µs/call:
# 14 times (2.26ms+0s) by installer::worker::collect_all_files_from_includepaths at line 1029, avg 162µs/call
# 7 times (1.49ms+0s) by installer::worker::clean_output_tree at line 248, avg 213µs/call
# once (168µs+0s) by installer::worker::remove_old_installation_sets at line 140
# once (166µs+0s) by installer::worker::remove_old_installation_sets at line 143
# once (89µs+0s) by installer::worker::remove_old_installation_sets at line 135 | |||||
sub installer::worker::CORE:ftfile; # opcode | |||||
# spent 129ms within installer::worker::CORE:match which was called 93648 times, avg 1µs/call:
# 31863 times (15.4ms+0s) by installer::worker::collect_all_items_with_special_flag at line 306, avg 483ns/call
# 29866 times (98.0ms+0s) by installer::worker::replace_variables_in_string at line 858, avg 3µs/call
# 15897 times (6.97ms+0s) by installer::worker::remove_all_items_with_special_flag at line 369, avg 438ns/call
# 15895 times (8.53ms+0s) by installer::worker::resolving_hidden_flag at line 1322, avg 537ns/call
# 66 times (165µs+0s) by installer::worker::set_spellcheckerlanguages at line 1440, avg 3µs/call
# 61 times (136µs+0s) by installer::worker::add_variables_from_inc_to_hashref at line 997, avg 2µs/call | |||||
# spent 32.9s within installer::worker::CORE:regcomp which was called 3362894 times, avg 10µs/call:
# 3315126 times (32.9s+0s) by installer::worker::replace_variables_in_string at line 867, avg 10µs/call
# 31863 times (22.5ms+0s) by installer::worker::collect_all_items_with_special_flag at line 306, avg 707ns/call
# 15897 times (11.1ms+0s) by installer::worker::remove_all_items_with_special_flag at line 369, avg 696ns/call
# 8 times (77µs+0s) by installer::worker::generate_cygwin_paths at line 1240, avg 10µs/call | |||||
sub installer::worker::CORE:sort; # opcode | |||||
# spent 2.26s within installer::worker::CORE:subst which was called 3315193 times, avg 681ns/call:
# 3315126 times (2.26s+0s) by installer::worker::replace_variables_in_string at line 867, avg 681ns/call
# 54 times (31µs+0s) by installer::worker::set_spellcheckerlanguages at line 1463, avg 574ns/call
# 8 times (122µs+0s) by installer::worker::generate_cygwin_paths at line 1240, avg 15µs/call
# 2 times (11µs+0s) by installer::worker::add_variables_from_inc_to_hashref at line 983, avg 5µs/call
# 2 times (5µs+0s) by installer::worker::add_variables_from_inc_to_hashref at line 982, avg 3µs/call
# once (8µs+0s) by installer::worker::set_spellcheckerlanguages at line 1488 | |||||
# spent 3.74ms within installer::worker::CORE:unlink which was called 8 times, avg 468µs/call:
# 8 times (3.74ms+0s) by installer::worker::generate_cygwin_paths at line 1274, avg 468µs/call |