Useful scripts for developers: Difference between revisions
Jump to navigation
Jump to search
m (→External links) |
(+- Minor spelling and cleanup; template: Github source, Forum link; cat: Aircraft enhancement, Perl software) |
||
Line 1: | Line 1: | ||
== | == Aircraft scripts == | ||
=== Files loaded === | |||
=== | There are many files used for an aircraft and it could be difficult when developing or maintaining an aircraft to know how all these files are loaded, by which file and if they are used. | ||
There are many files used for an aircraft and it could be difficult when | |||
The script below searches in xml, nas and ac files other loaded files : nas, xml, wav, rgb and png. | The script below searches in xml, nas and ac files other loaded files : nas, xml, wav, rgb and png. | ||
Line 10: | Line 8: | ||
Feel free to improve it ! | Feel free to improve it ! | ||
==== script (linux) ==== | ==== Perl script (linux) ==== | ||
<syntaxhighlight lang="perl" enclose="div"> | <syntaxhighlight lang="perl" enclose="div"> | ||
#!/usr/bin/perl -W | #!/usr/bin/perl -W | ||
Line 192: | Line 189: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
==== | ==== Configuration and installation ==== | ||
# Copy-paste the text in a text file named "files-loaded.pl" | |||
# | |||
# '''You should modify some constants on the top of the file''' : $dirname_aircraft, $aircraft, $dirpath_fgdata, $dirpath_root | # '''You should modify some constants on the top of the file''' : $dirname_aircraft, $aircraft, $dirpath_fgdata, $dirpath_root | ||
# chmod the file : chmod ug+x files-loaded.pl | # chmod the file : chmod ug+x files-loaded.pl | ||
# | # Run the script : ./files-loaded.pl | ||
== Related content == | <!-- == Related content == | ||
--> | |||
== External links == | |||
* {{github source|user=mherweg|repo=d-laser-fgtools}} | |||
* {{forum link|title=script to find unused files|t=29950}} | |||
[[Category:Aircraft enhancement]] | |||
[[Category:Perl software]] | |||
Latest revision as of 12:12, 22 August 2019
Aircraft scripts
Files loaded
There are many files used for an aircraft and it could be difficult when developing or maintaining an aircraft to know how all these files are loaded, by which file and if they are used.
The script below searches in xml, nas and ac files other loaded files : nas, xml, wav, rgb and png.
Feel free to improve it !
Perl script (linux)
#!/usr/bin/perl -W
# author : hardball
# version : v20161017-01
# description :
# recursively search in xml, nas and ac files, other files loaded : nas, xml,
# wav, rgb and png
use Term::ANSIColor ;
#===============================================================================
# CONSTANTES
# dirname of the aircraft to scan
my $dirname_aircraft = 'bourrasque' ;
# dirpath of fgdata
my $dirpath_fgdata = '/home/nico/FG/fgdata/' ;
# name of aircraft (the one called when launching fgfs)
my $aircraft = 'bourrasque' ;
# starting path for recursive search
my $start_dirpath_root = '/home/nico/my_hangar/' ; # slash ending
# color for type of files found, see perl ANSIColor
my %color ;
$color{'xml'} = 'bright_blue' ;
$color{'ac'} = 'bright_yellow' ;
$color{'png'} = 'bright_magenta' ;
$color{'rgb'} = 'red' ;
$color{'nas'} = 'yellow' ;
$color{'eff'} = 'bright_red' ;
$color{'wav'} = 'white' ;
#===============================================================================
# VARIABLES INITIALISATION
my @a = () ;
my $dirpath_root = $start_dirpath_root . $dirname_aircraft .'/' ; # slash ending
#===============================================================================
# FUNCTIONS
#-------------------------------------------------------------------------------
# print_line
sub print_line_tree
{
# getting params
my ($line, $extension, @depth) = @_ ;
my $indent = '' ;
for(my $d = 0 ; $d < @depth ; $d++)
{
if($d == (@depth - 1)) { $indent .= $depth[$d] ? ' `-- ' : ' |-- ' ; }
else { $indent .= $depth[$d] ? ' ' : ' | ' ; }
}
print $indent ;
print color $color{$extension} ;
print $line ;
print color 'reset' ;
print "\n" ;
}
#-------------------------------------------------------------------------------
# search_tree
# display result on tree view
# params :
# $path_found_in_file : file to print and to parse
# $depth : depth of recursivity call
# $from_path : file's dirpath where the file has been found
# $from_file : filepath where the file has been found
# $list_is_last : contains data helping to display the tree
sub search_aircraft
{
# getting params
my ($path_found_in_file, $depth, $from_path, $from_file, $list_is_last) = @_ ;
# TODO contient chaque fichier parent de l'item en cours si c'est le dernier de la liste
my @lil = @{$list_is_last} ;
# try to sanitize path
my $escaped_dirname_aircraft = quotemeta($dirname_aircraft) ;
$path_found_in_file =~ s/^\/?Aircraft\/$escaped_dirname_aircraft\/// ;
# if relative path : ./foo.xml <=> foo.xml
$path_found_in_file =~ s/^.\/// ;
# if relative path detected, we add the previous path
if(($path_found_in_file !~ /\//) || ($path_found_in_file =~ /^\.\.\//))
{
$path_found_in_file = $from_path . $path_found_in_file ;
}
$fullpath_to_try = $dirpath_root . $path_found_in_file ;
# file does not exist, lets try in fgdata directory :
if(! -f $fullpath_to_try) { $fullpath_to_try = $dirpath_fgdata . $path_found_in_file ; }
# file not found, may be a bug ;)
if(! -f $fullpath_to_try) { print STDERR "[W] file not found : SKIPPING - $path_found_in_file\n" ; return ; }
#print " DEBUG $path_found_in_file --- $depth --- ".(join('.',@lil))."\n";
###
# FIRST, let's print the file found
#
my ($extension) = ($fullpath_to_try =~ /\.(\w+)$/) ;
print_line_tree($path_found_in_file, $extension, @lil) ;
###
# THEN, let's search in this file if it loads other files
#
# initialize new param which will be used by the recursive function
($from_path = $path_found_in_file) =~ s/[^\/]+$// ;
$depth++ ;
# according to file extension, we remove comments and extract filenames
my $nb_files_found = 0 ;
my %uniq_f = () ;
if(($extension eq 'xml') || ($extension eq 'eff'))
{
# if xml or eff, we will search xml, nas, ac, wav files :
open(my $CONTENT, $fullpath_to_try) ; my @CONTENT = <$CONTENT> ; close $CONTENT ;
# hack to avoid parsing comments
my $XML_CONTENT = join('~~~~~', @CONTENT) ;
$XML_CONTENT =~ s/<!--.*?-->//mgs ;
@CONTENT = split('~~~~~', $XML_CONTENT) ;
for(@CONTENT)
{
if((/>(.+\.(xml|nas|ac|wav))</) || (/=["'](.+\.(xml|nas|ac|wav))["']/)) { $uniq_f{$1} = 1 ; }
elsif(/inherits-from>(.+)(\.eff)?</) { $uniq_f{$1 .'.eff'} = 1 ; }
}
}
elsif($extension eq 'nas')
{
# if nas, we search xml, nas files :
open(my $CONTENT, $fullpath_to_try) ; my @CONTENT = <$CONTENT> ; close $CONTENT ;
for(@CONTENT)
{
next if(/^\s*#/) ; # we don't parse commented lines
s/\s+#.+$// ; # we don't parse commented end lines
if(/["']([^"']+$dirname_aircraft\/[^"']+\.(xml|nas))["']/) { $uniq_f{$1} = 1 ; }
}
}
elsif($extension eq 'ac')
{
# if ac, we search png, rgb files :
open(my $CONTENT, $fullpath_to_try) ; my @CONTENT = <$CONTENT> ; close $CONTENT ;
for(@CONTENT)
{
if(/texture\s+["'](.+\.(png|rgb))/) { $uniq_f{$1} = 1 ; }
}
}
else
{
pop(@lil) ;
}
# if files found, we continue recursive search
for $path(sort keys %uniq_f)
{
my $is_last_item = (++$nb_files_found == scalar(keys %uniq_f)) ? 1 : 0 ;
push(@lil, $is_last_item) ;
search_aircraft($path, $depth, $from_path, $path_found_in_file, \@lil) ;
pop(@lil) ;
}
}
#===============================================================================
# MAIN
search_aircraft($aircraft .'-set.xml', 0, '', '', \@a) ;
### EOF
Configuration and installation
- Copy-paste the text in a text file named "files-loaded.pl"
- You should modify some constants on the top of the file : $dirname_aircraft, $aircraft, $dirpath_fgdata, $dirpath_root
- chmod the file : chmod ug+x files-loaded.pl
- Run the script : ./files-loaded.pl