зеркало из https://github.com/mozilla/pjs.git
172 строки
4.0 KiB
Perl
Executable File
172 строки
4.0 KiB
Perl
Executable File
# -*- Mode: perl; indent-tabs-mode: nil -*-
|
|
#
|
|
# The contents of this file are subject to the Netscape Public License
|
|
# Version 1.0 (the "License"); you may not use this file except in
|
|
# compliance with the License. You may obtain a copy of the License at
|
|
# http://www.mozilla.org/NPL/
|
|
#
|
|
# Software distributed under the License is distributed on an "AS IS"
|
|
# basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
|
|
# License for the specific language governing rights and limitations
|
|
# under the License.
|
|
#
|
|
# The Original Code is the Bonsai CVS tool.
|
|
#
|
|
# The Initial Developer of the Original Code is Netscape Communications
|
|
# Corporation. Portions created by Netscape are Copyright (C) 1998
|
|
# Netscape Communications Corporation. All Rights Reserved.
|
|
|
|
require 'utils.pl';
|
|
|
|
$NOT_LOCAL = 1;
|
|
$IS_LOCAL = 2;
|
|
|
|
$modules = {};
|
|
|
|
if( $CVS_ROOT eq "" ){
|
|
$CVS_ROOT = pickDefaultRepository();
|
|
}
|
|
|
|
if( $ENV{"OS"} eq "Windows_NT" ){
|
|
$CVS_MODULES='modules';
|
|
}
|
|
else {
|
|
$CVS_MODULES="${CVS_ROOT}/CVSROOT/modules";
|
|
}
|
|
|
|
open( MOD, "<$CVS_MODULES") || die "can't open $CVS_MODULES";
|
|
&parse_modules;
|
|
close( MOD );
|
|
|
|
1;
|
|
|
|
sub in_module {
|
|
local($mod_map, $dirname, $filename ) = @_;
|
|
local( @path );
|
|
local( $i, $fp, $local );
|
|
|
|
#
|
|
#quick check if it is already in there.
|
|
#
|
|
if( $mod_map{$dirname} ){
|
|
return 1;
|
|
}
|
|
|
|
|
|
@path = split(/\//, $dirname);
|
|
|
|
$fp = '';
|
|
|
|
for( $i = 0; $i < @path; $i++){
|
|
|
|
$fp .= ($fp ne '' ? '/' : '') . $path[$i];
|
|
|
|
if( $local = $mod_map->{$fp} ){
|
|
if( $local == $IS_LOCAL ){
|
|
if( $i == (@path-1) ){
|
|
return 1;
|
|
}
|
|
}
|
|
else {
|
|
# Add directories to the map as we encounter them so we go
|
|
# faster
|
|
if( $mod_map{$dirname} == 0 ){
|
|
$mod_map{$dirname} = $IS_LOCAL;
|
|
}
|
|
return 1;
|
|
}
|
|
}
|
|
}
|
|
if( $mod_map->{ $fp . '/' . $filename} ) {
|
|
return 1;
|
|
}
|
|
else {
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
|
|
sub get_module_map {
|
|
local($name) = @_;
|
|
local($mod_map);
|
|
$mod_map = {};
|
|
&build_map( $name, $mod_map );
|
|
return $mod_map;
|
|
}
|
|
|
|
sub parse_modules {
|
|
local @finaloptions=();
|
|
while( $l = &get_line ){
|
|
@finaloptions=();
|
|
|
|
($mod_name, $flag, @params) = split(/[ \t]+/,$l);
|
|
while ( $flag =~ /^-.$/){
|
|
if( $flag eq '-a' ){
|
|
$flag="";
|
|
last;
|
|
}
|
|
if ( $flag eq '-l' ){ # then keep it
|
|
push @finaloptions, ($flag, shift @params);
|
|
$flag= shift @options;
|
|
next;
|
|
}
|
|
if( $flag =~ /^-.$/ ){
|
|
shift @params; # skip parameter's argument
|
|
$flag = shift @params;
|
|
next;
|
|
}
|
|
last; # No options found...
|
|
}
|
|
unshift @params, $flag if ( $flag ne "" );
|
|
$modules->{$mod_name} = [(@finaloptions,@params)];
|
|
}
|
|
}
|
|
|
|
sub build_map {
|
|
local($name,$mod_map) = @_;
|
|
local($bFound, $local);
|
|
|
|
$local = $NOT_LOCAL;
|
|
$bFound = 0;
|
|
|
|
# printf "looking for $name in %s<br>\n",join(",", @{$modules->{$name}});
|
|
for $i ( @{$modules->{$name}} ){
|
|
$bFound = 1;
|
|
if( $i eq '-l' ){
|
|
$local = $IS_LOCAL;
|
|
}
|
|
elsif( ($i eq $name) || !build_map($i, $mod_map )){
|
|
$mod_map->{$i} = $local;
|
|
}
|
|
}
|
|
return $bFound;
|
|
}
|
|
|
|
|
|
|
|
sub get_line {
|
|
local($l, $save);
|
|
|
|
$bContinue = 1;
|
|
|
|
while( $bContinue && ($l = <MOD>) ){
|
|
chop($l);
|
|
if( $l =~ /^[ \t]*\#/
|
|
|| $l =~ /^[ \t]*$/ ){
|
|
$l=''; # Starts with a "#", or is only whitespace.
|
|
}
|
|
if( $l =~ /\\[ \t]*$/ ){
|
|
# Ends with a slash, so append it to the last line.
|
|
chop ($l);
|
|
$save .= $l . ' ';
|
|
}
|
|
elsif( $l eq '' && $save eq ''){
|
|
# ignore blank lines
|
|
}
|
|
else {
|
|
$bContinue = 0;
|
|
}
|
|
}
|
|
return $save . $l;
|
|
}
|