5 # Name : generate_aliases
6 # Author : Chris Koeritz
7 # Rights : Copyright (C) 1996-$now by Author
11 # This script generates feisty meow script alias files. Alias files
12 # contain a list of definitions for command aliases that are written in the
13 # specified shell dialect (such as bash or perl) and which are additionally
14 # tailored for the operating system to be used.
17 # This program is free software; you can redistribute it and/or modify it
18 # under the terms of the GNU General Public License as published by the Free
19 # Software Foundation; either version 2 of the License or (at your option)
20 # any later version. See: "http://www.gruntose.com/Info/GNU/GPL.html" for a
21 # version of the License. Please send any updates to "fred@gruntose.com".
24 require "filename_helper.pl";
26 use Env qw(BINDIR BUILD_TOP FEISTY_MEOW_DIR FEISTY_MEOW_GENERATED FEISTY_MEOW_SCRIPTS SHELL_DEBUG );
28 # given a possible aliasable filename, this will decide whether to create a perl
29 # or bash alias for it. it needs the filename of the possible alias and the
30 # directory where that file resides.
32 local($file, $dir) = @_;
33 if ($file =~ /\.[pP][lL]$/) {
34 local($aliasname) = $file; $aliasname =~ s/\.[Pp][lL]$//;
35 &make_perl_alias($aliasname, "$dir");
36 } elsif ($file =~ /\.[sS][hH]$/) {
37 local($aliasname) = $file; $aliasname =~ s/\.[Ss][Hh]$//;
38 &make_bash_alias($aliasname, "$dir");
42 # makes an alias for a bash script given the alias name.
44 local($aliasname) = shift(@_);
45 local($full_alias) = $aliasname;
46 $aliasname =~ s/^.*\/([^\/]*)/\1/;
47 #print "alias became $aliasname\n";
48 local($source_dir) = shift(@_);
49 #print "bash alias is $aliasname, dir is $source_dir\n";
50 print she "alias $aliasname=\"bash $source_dir/$full_alias.sh\"\n";
53 # makes an alias for a perl script given the alias name.
55 local($aliasname) = shift(@_);
56 local($full_alias) = $aliasname;
57 $aliasname =~ s/^.*\/([^\/]*)/\1/;
58 #print "alias became $aliasname\n";
59 local($source_dir) = shift(@_);
60 #print "perl alias is $aliasname, dir is $source_dir\n";
61 print she "alias $aliasname=\"perl $source_dir/$full_alias.pl\"\n";
64 # given a directory, this returns an array of all the filenames found therein.
66 local($path) = shift(@_);
67 opendir(that_dir, $path);
68 local(@those_files) = sort(readdir(that_dir));
74 # The "common.alias" file is used in the generated aliases file as a base
75 # set of generally useful aliases. We also add aliases for any script files
76 # (perl, bash, python, etc) that we find in the feisty meow script hierarchy.
77 # Any *.alias files found in the $FEISTY_MEOW_GENERATED/custom folder are
79 sub rebuild_script_aliases {
81 if (length($SHELL_DEBUG)) {
82 print "rebuilding generated aliases file...\n";
85 # create our generated shells directory if it's not already.
86 if ( ! -d $FEISTY_MEOW_GENERATED ) {
87 mkdir $FEISTY_MEOW_GENERATED;
88 if (length($SHELL_DEBUG)) {
89 print "made FEISTY_MEOW_GENERATED at '$FEISTY_MEOW_GENERATED'\n";
93 # test if we can use color in ls...
94 $test_color=` ls --help 2>&1 | grep -i color `;
96 # this is an array of files from which to draw alias definitions.
97 @ALIAS_DEFINITION_FILES = ("$FEISTY_MEOW_SCRIPTS/core/common.alias");
99 # if custom aliases files exist, add them to the list.
100 foreach $i (&glob_list("$FEISTY_MEOW_GENERATED/custom/*.alias")) {
101 if (-f $i) { push(@ALIAS_DEFINITION_FILES, $i); }
103 if (length($SHELL_DEBUG)) {
104 print "using these alias files:\n";
105 foreach $i (@ALIAS_DEFINITION_FILES) {
106 local $base_of_dir = &basename(&dirname($i));
107 local $basename = &basename($i);
108 print " $base_of_dir/$basename\n";
112 # write the aliases for sh and bash scripts.
114 local $GENERATED_ALIAS_FILE = "$FEISTY_MEOW_GENERATED/fmc_core_and_custom_aliases.sh";
115 if (length($SHELL_DEBUG)) {
116 print "writing generated aliases in $GENERATED_ALIAS_FILE...\n";
119 #hmmm: perhaps a good place for a function to create the header,
120 # given the appropriate comment code.
122 open GENOUT, ">$GENERATED_ALIAS_FILE" or die "cannot open $GENERATED_ALIAS_FILE";
125 print GENOUT "## generated file: $GENERATED_ALIAS_FILE\n";
126 print GENOUT "## please do not edit.\n";
129 if (length($test_color)) {
130 print GENOUT "export color_add=--color=auto\n";
132 print GENOUT "export color_add=\n";
135 # plow in the full set of aliases into the file.
136 foreach $i (@ALIAS_DEFINITION_FILES) {
137 open CURR_ALIASER, "<$i" or die "cannot open current alias file $i";
138 foreach $line (<CURR_ALIASER>) {
139 print GENOUT "$line";
145 if (length($SHELL_DEBUG)) {
146 print("done rebuilding generated aliases file.\n");
152 # make sure we know where to store the files we're creating.
153 if ( ! length("$FEISTY_MEOW_GENERATED") ) {
155 The FEISTY_MEOW_GENERATED variable is not defined. This must point to the location where\n\
156 the generated scripts are stored. Perhaps you still need to run\n\
157 bootstrap_shells.sh and set up some environment variables. Please see\n\
158 http://feistymeow.org for more details.\n";
160 #really need to use better exit codes.
163 $FEISTY_MEOW_GENERATED =~ s/\\/\//g;
164 $FEISTY_MEOW_SCRIPTS =~ s/\\/\//g;
165 $FEISTY_MEOW_DIR =~ s/\\/\//g;
167 # create our generated shells directory if it's not already there.
168 if (! -d $FEISTY_MEOW_GENERATED) {
169 mkdir $FEISTY_MEOW_GENERATED;
174 # set the executable bit for binaries for just this current user.
176 system("chmod -R u+x \"$BINDIR\"/*");
179 # generate the first set of alias files that are defined in the core
180 # and custom scripts directories.
181 &rebuild_script_aliases;
183 # trash the old versions.
184 unlink("$FEISTY_MEOW_GENERATED/fmc_aliases_for_scripts.sh");
186 if (length($SHELL_DEBUG)) {
187 printf "writing $FEISTY_MEOW_GENERATED/fmc_aliases_for_scripts.sh...\n";
190 # open the alias files to be created.
191 open(she, ">> $FEISTY_MEOW_GENERATED/fmc_aliases_for_scripts.sh");
193 # find the list of files in the scripts directory.
194 #opendir(scripts, "$FEISTY_MEOW_SCRIPTS");
195 #@shell_files = sort(readdir(scripts));
196 #print "scripts: @shell_files\n";
198 @shell_files = (&load_file_names("$FEISTY_MEOW_SCRIPTS"),
199 &load_file_names("$FEISTY_MEOW_GENERATED/custom/scripts"));
201 # construct aliases for items in the scripts directory.
202 foreach $file (@shell_files) {
203 # test to see what type of item we got.
209 || $file =~ /\/\.\.$/
210 || $file =~ /\/\.svn$/
211 || $file =~ /\/\.git$/
213 # just skip this item; it's a special directory.
214 } elsif (-d "$FEISTY_MEOW_SCRIPTS/$file") {
215 # if we see a subdirectory in the scripts folder, we add all the
216 # scripts in it as aliases. we recurse only one level.
217 opendir(subdir, "$FEISTY_MEOW_SCRIPTS/$file");
218 @subdir_files = sort(readdir(subdir));
219 foreach $subfile (@subdir_files) {
220 push(@shell_files, "$file/$subfile");
222 } elsif (-f "$FEISTY_MEOW_GENERATED/custom/scripts/$file") {
223 # if we see a file in the auto-generated area that comes from the
224 # customized scripts folder, we add it as an alias.
225 make_alias($file, "$FEISTY_MEOW_GENERATED/custom/scripts/");
226 #print "added custom script file: $FEISTY_MEOW_GENERATED/custom/scripts/$file\n";
228 # if it's a regular file, we'll try to make an alias for it. the function
229 # will only fire if the ending is appropriate for the script languages we use.
230 &make_alias($file, "$FEISTY_MEOW_SCRIPTS");
234 # open the source repository's script directory to find scripts in there.
235 local($build_shell_path) = "$BUILD_TOP/scripts/generator";
236 @build_shells = &load_file_names("$build_shell_path");
237 #opendir(build_shells_dir, $build_shell_path);
238 #@build_shell_files = sort(readdir(build_shells_dir));
239 #if (scalar(@build_shell_files) > 0) {
240 # print "build shell folders: @build_shell_files\n";
242 foreach $file (@build_shells) {
243 &make_alias($file, "$build_shell_path");