xref: /aosp_15_r20/external/curl/tests/pathhelp.pm (revision 6236dae45794135f37c4eb022389c904c8b0090d)
1*6236dae4SAndroid Build Coastguard Worker###########################################################################
2*6236dae4SAndroid Build Coastguard Worker#                                  _   _ ____  _
3*6236dae4SAndroid Build Coastguard Worker#  Project                     ___| | | |  _ \| |
4*6236dae4SAndroid Build Coastguard Worker#                             / __| | | | |_) | |
5*6236dae4SAndroid Build Coastguard Worker#                            | (__| |_| |  _ <| |___
6*6236dae4SAndroid Build Coastguard Worker#                             \___|\___/|_| \_\_____|
7*6236dae4SAndroid Build Coastguard Worker#
8*6236dae4SAndroid Build Coastguard Worker# Copyright (C) Evgeny Grin (Karlson2k), <[email protected]>.
9*6236dae4SAndroid Build Coastguard Worker#
10*6236dae4SAndroid Build Coastguard Worker# This software is licensed as described in the file COPYING, which
11*6236dae4SAndroid Build Coastguard Worker# you should have received as part of this distribution. The terms
12*6236dae4SAndroid Build Coastguard Worker# are also available at https://curl.se/docs/copyright.html.
13*6236dae4SAndroid Build Coastguard Worker#
14*6236dae4SAndroid Build Coastguard Worker# You may opt to use, copy, modify, merge, publish, distribute and/or sell
15*6236dae4SAndroid Build Coastguard Worker# copies of the Software, and permit persons to whom the Software is
16*6236dae4SAndroid Build Coastguard Worker# furnished to do so, under the terms of the COPYING file.
17*6236dae4SAndroid Build Coastguard Worker#
18*6236dae4SAndroid Build Coastguard Worker# This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
19*6236dae4SAndroid Build Coastguard Worker# KIND, either express or implied.
20*6236dae4SAndroid Build Coastguard Worker#
21*6236dae4SAndroid Build Coastguard Worker# SPDX-License-Identifier: curl
22*6236dae4SAndroid Build Coastguard Worker#
23*6236dae4SAndroid Build Coastguard Worker###########################################################################
24*6236dae4SAndroid Build Coastguard Worker
25*6236dae4SAndroid Build Coastguard Worker# This Perl package helps with path transforming when running curl tests on
26*6236dae4SAndroid Build Coastguard Worker# native Windows and MSYS/Cygwin.
27*6236dae4SAndroid Build Coastguard Worker# Following input formats are supported (via built-in Perl functions):
28*6236dae4SAndroid Build Coastguard Worker#  (1) /some/path   - absolute path in POSIX-style
29*6236dae4SAndroid Build Coastguard Worker#  (2) D:/some/path - absolute path in Windows-style
30*6236dae4SAndroid Build Coastguard Worker#  (3) some/path    - relative path
31*6236dae4SAndroid Build Coastguard Worker#  (4) D:some/path  - path relative to current directory on Windows drive
32*6236dae4SAndroid Build Coastguard Worker#                     (paths like 'D:' are treated as 'D:./') (*)
33*6236dae4SAndroid Build Coastguard Worker#  (5) \some/path   - path from root directory on current Windows drive (*)
34*6236dae4SAndroid Build Coastguard Worker# All forward '/' and back '\' slashes are treated identically except leading
35*6236dae4SAndroid Build Coastguard Worker# slash in forms (1) and (5).
36*6236dae4SAndroid Build Coastguard Worker# Forward slashes are simpler processed in Perl, do not require extra escaping
37*6236dae4SAndroid Build Coastguard Worker# for shell (unlike back slashes) and accepted by Windows native programs, so
38*6236dae4SAndroid Build Coastguard Worker# all functions return paths with only forward slashes.
39*6236dae4SAndroid Build Coastguard Worker# All returned paths don't contain any duplicated slashes, only single slashes
40*6236dae4SAndroid Build Coastguard Worker# are used as directory separators on output.
41*6236dae4SAndroid Build Coastguard Worker# On non-Windows platforms functions acts as transparent wrappers for similar
42*6236dae4SAndroid Build Coastguard Worker# Perl's functions or return unmodified string (depending on functionality),
43*6236dae4SAndroid Build Coastguard Worker# so all functions can be unconditionally used on all platforms.
44*6236dae4SAndroid Build Coastguard Worker#
45*6236dae4SAndroid Build Coastguard Worker# (*) CAUTION! Forms (4) and (5) are not recommended to use as they can be
46*6236dae4SAndroid Build Coastguard Worker#     interpreted incorrectly in Perl and MSYS/Cygwin environment have low
47*6236dae4SAndroid Build Coastguard Worker#     control on Windows current drive and Windows current path on specific
48*6236dae4SAndroid Build Coastguard Worker#     drive.
49*6236dae4SAndroid Build Coastguard Worker
50*6236dae4SAndroid Build Coastguard Workerpackage pathhelp;
51*6236dae4SAndroid Build Coastguard Worker
52*6236dae4SAndroid Build Coastguard Workeruse strict;
53*6236dae4SAndroid Build Coastguard Workeruse warnings;
54*6236dae4SAndroid Build Coastguard Workeruse Cwd 'abs_path';
55*6236dae4SAndroid Build Coastguard Worker
56*6236dae4SAndroid Build Coastguard WorkerBEGIN {
57*6236dae4SAndroid Build Coastguard Worker    use base qw(Exporter);
58*6236dae4SAndroid Build Coastguard Worker
59*6236dae4SAndroid Build Coastguard Worker    our @EXPORT_OK = qw(
60*6236dae4SAndroid Build Coastguard Worker        os_is_win
61*6236dae4SAndroid Build Coastguard Worker        exe_ext
62*6236dae4SAndroid Build Coastguard Worker        sys_native_abs_path
63*6236dae4SAndroid Build Coastguard Worker        sys_native_current_path
64*6236dae4SAndroid Build Coastguard Worker        build_sys_abs_path
65*6236dae4SAndroid Build Coastguard Worker    );
66*6236dae4SAndroid Build Coastguard Worker}
67*6236dae4SAndroid Build Coastguard Worker
68*6236dae4SAndroid Build Coastguard Worker
69*6236dae4SAndroid Build Coastguard Worker#######################################################################
70*6236dae4SAndroid Build Coastguard Worker# Block for cached static variables
71*6236dae4SAndroid Build Coastguard Worker#
72*6236dae4SAndroid Build Coastguard Worker{
73*6236dae4SAndroid Build Coastguard Worker    # Cached static variable, Perl 5.0-compatible.
74*6236dae4SAndroid Build Coastguard Worker    my $is_win = $^O eq 'MSWin32'
75*6236dae4SAndroid Build Coastguard Worker              || $^O eq 'cygwin'
76*6236dae4SAndroid Build Coastguard Worker              || $^O eq 'msys';
77*6236dae4SAndroid Build Coastguard Worker
78*6236dae4SAndroid Build Coastguard Worker    # Returns boolean true if OS is any form of Windows.
79*6236dae4SAndroid Build Coastguard Worker    sub os_is_win {
80*6236dae4SAndroid Build Coastguard Worker        return $is_win;
81*6236dae4SAndroid Build Coastguard Worker    }
82*6236dae4SAndroid Build Coastguard Worker
83*6236dae4SAndroid Build Coastguard Worker    # Cached static variable, Perl 5.0-compatible.
84*6236dae4SAndroid Build Coastguard Worker    my $cygdrive_present;
85*6236dae4SAndroid Build Coastguard Worker
86*6236dae4SAndroid Build Coastguard Worker    # Returns boolean true if Windows drives mounted with '/cygdrive/' prefix.
87*6236dae4SAndroid Build Coastguard Worker    sub drives_mounted_on_cygdrive {
88*6236dae4SAndroid Build Coastguard Worker        return $cygdrive_present if defined $cygdrive_present;
89*6236dae4SAndroid Build Coastguard Worker        $cygdrive_present = ((-e '/cygdrive/') && (-d '/cygdrive/')) ? 1 : 0;
90*6236dae4SAndroid Build Coastguard Worker        return $cygdrive_present;
91*6236dae4SAndroid Build Coastguard Worker    }
92*6236dae4SAndroid Build Coastguard Worker}
93*6236dae4SAndroid Build Coastguard Worker
94*6236dae4SAndroid Build Coastguard Worker#######################################################################
95*6236dae4SAndroid Build Coastguard Worker# Returns current working directory in Windows format on Windows.
96*6236dae4SAndroid Build Coastguard Worker#
97*6236dae4SAndroid Build Coastguard Workersub sys_native_current_path {
98*6236dae4SAndroid Build Coastguard Worker    return Cwd::getcwd() if !os_is_win();
99*6236dae4SAndroid Build Coastguard Worker
100*6236dae4SAndroid Build Coastguard Worker    my $cur_dir;
101*6236dae4SAndroid Build Coastguard Worker    if($^O eq 'MSWin32') {
102*6236dae4SAndroid Build Coastguard Worker        $cur_dir = Cwd::getcwd();
103*6236dae4SAndroid Build Coastguard Worker    }
104*6236dae4SAndroid Build Coastguard Worker    else {
105*6236dae4SAndroid Build Coastguard Worker        $cur_dir = Cygwin::posix_to_win_path(Cwd::getcwd());
106*6236dae4SAndroid Build Coastguard Worker    }
107*6236dae4SAndroid Build Coastguard Worker    $cur_dir =~ s{[/\\]+}{/}g;
108*6236dae4SAndroid Build Coastguard Worker    return $cur_dir;
109*6236dae4SAndroid Build Coastguard Worker}
110*6236dae4SAndroid Build Coastguard Worker
111*6236dae4SAndroid Build Coastguard Worker#######################################################################
112*6236dae4SAndroid Build Coastguard Worker# Converts given path to system native absolute path, i.e. to Windows
113*6236dae4SAndroid Build Coastguard Worker# absolute format on Windows platform. Both relative and absolute
114*6236dae4SAndroid Build Coastguard Worker# formats are supported for input.
115*6236dae4SAndroid Build Coastguard Worker#
116*6236dae4SAndroid Build Coastguard Workersub sys_native_abs_path {
117*6236dae4SAndroid Build Coastguard Worker    my ($path) = @_;
118*6236dae4SAndroid Build Coastguard Worker
119*6236dae4SAndroid Build Coastguard Worker    # Return untouched on non-Windows platforms.
120*6236dae4SAndroid Build Coastguard Worker    return Cwd::abs_path($path) if !os_is_win();
121*6236dae4SAndroid Build Coastguard Worker
122*6236dae4SAndroid Build Coastguard Worker    # Do not process empty path.
123*6236dae4SAndroid Build Coastguard Worker    return $path if ($path eq '');
124*6236dae4SAndroid Build Coastguard Worker
125*6236dae4SAndroid Build Coastguard Worker    my $res;
126*6236dae4SAndroid Build Coastguard Worker    if($^O eq 'msys' || $^O eq 'cygwin') {
127*6236dae4SAndroid Build Coastguard Worker        $res = Cygwin::posix_to_win_path(Cwd::abs_path($path));
128*6236dae4SAndroid Build Coastguard Worker    }
129*6236dae4SAndroid Build Coastguard Worker    elsif($path =~ m{^/(cygdrive/)?([a-z])/(.*)}) {
130*6236dae4SAndroid Build Coastguard Worker        $res = uc($2) . ":/" . $3;
131*6236dae4SAndroid Build Coastguard Worker    }
132*6236dae4SAndroid Build Coastguard Worker    else {
133*6236dae4SAndroid Build Coastguard Worker        $res = Cwd::abs_path($path);
134*6236dae4SAndroid Build Coastguard Worker    }
135*6236dae4SAndroid Build Coastguard Worker
136*6236dae4SAndroid Build Coastguard Worker    $res =~ s{[/\\]+}{/}g;
137*6236dae4SAndroid Build Coastguard Worker    return $res;
138*6236dae4SAndroid Build Coastguard Worker}
139*6236dae4SAndroid Build Coastguard Worker
140*6236dae4SAndroid Build Coastguard Worker#######################################################################
141*6236dae4SAndroid Build Coastguard Worker# Converts given path to build system format absolute path, i.e. to
142*6236dae4SAndroid Build Coastguard Worker# MSYS/Cygwin POSIX-style absolute format on Windows platform. Both
143*6236dae4SAndroid Build Coastguard Worker# relative and absolute formats are supported for input.
144*6236dae4SAndroid Build Coastguard Worker#
145*6236dae4SAndroid Build Coastguard Workersub build_sys_abs_path {
146*6236dae4SAndroid Build Coastguard Worker    my ($path) = @_;
147*6236dae4SAndroid Build Coastguard Worker
148*6236dae4SAndroid Build Coastguard Worker    # Return untouched on non-Windows platforms.
149*6236dae4SAndroid Build Coastguard Worker    return Cwd::abs_path($path) if !os_is_win();
150*6236dae4SAndroid Build Coastguard Worker
151*6236dae4SAndroid Build Coastguard Worker    my $res;
152*6236dae4SAndroid Build Coastguard Worker    if($^O eq 'msys' || $^O eq 'cygwin') {
153*6236dae4SAndroid Build Coastguard Worker        $res = Cygwin::win_to_posix_path($path, 1);
154*6236dae4SAndroid Build Coastguard Worker    }
155*6236dae4SAndroid Build Coastguard Worker    else {
156*6236dae4SAndroid Build Coastguard Worker        $res = Cwd::abs_path($path);
157*6236dae4SAndroid Build Coastguard Worker
158*6236dae4SAndroid Build Coastguard Worker        if($res =~ m{^([A-Za-z]):(.*)}) {
159*6236dae4SAndroid Build Coastguard Worker            $res = "/" . lc($1) . $2;
160*6236dae4SAndroid Build Coastguard Worker            $res = '/cygdrive' . $res if(drives_mounted_on_cygdrive());
161*6236dae4SAndroid Build Coastguard Worker        }
162*6236dae4SAndroid Build Coastguard Worker    }
163*6236dae4SAndroid Build Coastguard Worker
164*6236dae4SAndroid Build Coastguard Worker    return $res;
165*6236dae4SAndroid Build Coastguard Worker}
166*6236dae4SAndroid Build Coastguard Worker
167*6236dae4SAndroid Build Coastguard Worker#***************************************************************************
168*6236dae4SAndroid Build Coastguard Worker# Return file extension for executable files on this operating system
169*6236dae4SAndroid Build Coastguard Worker#
170*6236dae4SAndroid Build Coastguard Workersub exe_ext {
171*6236dae4SAndroid Build Coastguard Worker    my ($component, @arr) = @_;
172*6236dae4SAndroid Build Coastguard Worker    if ($ENV{'CURL_TEST_EXE_EXT'}) {
173*6236dae4SAndroid Build Coastguard Worker        return $ENV{'CURL_TEST_EXE_EXT'};
174*6236dae4SAndroid Build Coastguard Worker    }
175*6236dae4SAndroid Build Coastguard Worker    if ($ENV{'CURL_TEST_EXE_EXT_'.$component}) {
176*6236dae4SAndroid Build Coastguard Worker        return $ENV{'CURL_TEST_EXE_EXT_'.$component};
177*6236dae4SAndroid Build Coastguard Worker    }
178*6236dae4SAndroid Build Coastguard Worker    if ($^O eq 'MSWin32' || $^O eq 'cygwin' || $^O eq 'msys' ||
179*6236dae4SAndroid Build Coastguard Worker        $^O eq 'dos' || $^O eq 'os2') {
180*6236dae4SAndroid Build Coastguard Worker        return '.exe';
181*6236dae4SAndroid Build Coastguard Worker    }
182*6236dae4SAndroid Build Coastguard Worker    return '';
183*6236dae4SAndroid Build Coastguard Worker}
184*6236dae4SAndroid Build Coastguard Worker
185*6236dae4SAndroid Build Coastguard Worker1;    # End of module
186