Merge branch 'release-2.140.93'
[feisty_meow.git] / scripts / core / generate_aliases.pl
1 #!/usr/bin/perl
2
3 ##############
4 #
5 #  Name   : generate_aliases
6 #  Author : Chris Koeritz
7 #  Rights : Copyright (C) 1996-$now by Author
8 #
9 #  Purpose:
10 #
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.
15 #
16 ##############
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".
22 ##############
23
24 require "filename_helper.pl";
25
26 use Env qw(FEISTY_MEOW_BINARIES BUILD_TOP FEISTY_MEOW_APEX FEISTY_MEOW_LOADING_DOCK FEISTY_MEOW_SCRIPTS DEBUG_FEISTY_MEOW );
27
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.
31 sub make_alias {
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");
39   }
40 }
41
42 # makes an alias for a bash script given the alias name.
43 sub make_bash_alias {
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 "define_yeti_alias $aliasname=\"bash $source_dir/$full_alias.sh\"\n";
51 }
52
53 # makes an alias for a perl script given the alias name.
54 sub make_perl_alias {
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 "define_yeti_alias $aliasname=\"perl $source_dir/$full_alias.pl\"\n";
62 }
63
64 ##############
65
66 # The "common.alias" file is used in the generated aliases file as a base
67 # set of generally useful aliases.  We also add aliases for any script files
68 # (perl, bash, python, etc) that we find in the feisty meow script hierarchy.
69 # Any *.alias files found in the $FEISTY_MEOW_LOADING_DOCK/custom folder are
70 # loaded also.
71 sub rebuild_script_aliases {
72
73   if (length($DEBUG_FEISTY_MEOW)) {
74     print "rebuilding generated aliases file...\n";
75   }
76
77   # create our generated shells directory if it's not already.
78   if ( ! -d $FEISTY_MEOW_LOADING_DOCK ) {
79     mkdir $FEISTY_MEOW_LOADING_DOCK;
80     if (length($DEBUG_FEISTY_MEOW)) {
81       print "made FEISTY_MEOW_LOADING_DOCK at '$FEISTY_MEOW_LOADING_DOCK'\n";
82     }
83   }
84
85   # test if we can use color in ls...
86 #  $test_color=` ls --help 2>&1 | grep -i color `;
87
88   # this is an array of files from which to draw alias definitions.
89   @ALIAS_DEFINITION_FILES = ("$FEISTY_MEOW_SCRIPTS/core/common.alias");
90
91   # if custom aliases files exist, add them to the list.
92   foreach $i (&glob_list("$FEISTY_MEOW_LOADING_DOCK/custom/*.alias")) {
93     if (-f $i) { push(@ALIAS_DEFINITION_FILES, $i); }
94   }
95   if (length($DEBUG_FEISTY_MEOW)) {
96     print "using these alias files:\n";
97 print "HEY IS THIS PROBLEM CHILD?\n";
98     foreach $i (@ALIAS_DEFINITION_FILES) {
99       local $base_of_dir = &basename(&dirname($i));
100       local $basename = &basename($i);
101       print "  $base_of_dir/$basename\n";
102     }
103 print "WAS PROBLEM CHILD ABOVE HERE?\n";
104   }
105
106   # write the aliases for sh and bash scripts.
107
108   local $GENERATED_ALIAS_FILE = "$FEISTY_MEOW_LOADING_DOCK/fmc_core_and_custom_aliases.sh";
109   if (length($DEBUG_FEISTY_MEOW)) {
110     print "writing generated aliases in $GENERATED_ALIAS_FILE...\n";
111   }
112
113 #hmmm: perhaps a good place for a function to create the header,
114 #      given the appropriate comment code.
115
116   open GENOUT, ">$GENERATED_ALIAS_FILE" or die "cannot open $GENERATED_ALIAS_FILE";
117
118   print GENOUT "##\n";
119   print GENOUT "## generated file: $GENERATED_ALIAS_FILE\n";
120   print GENOUT "## please do not edit.\n";
121   print GENOUT "##\n";
122
123 #  if (length($test_color)) {
124 #    print GENOUT "export color_add='--color=auto'\n";
125 #  } else {
126 #    print GENOUT "export color_add=\n";
127 #  }
128
129   # plow in the full set of aliases into the file.
130   foreach $i (@ALIAS_DEFINITION_FILES) {
131     open CURR_ALIASER, "<$i" or die "cannot open current alias file $i";
132     foreach $line (<CURR_ALIASER>) {
133       print GENOUT "$line";
134     }
135   }
136
137   close GENOUT;
138
139   if (length($DEBUG_FEISTY_MEOW)) {
140     print("done rebuilding generated aliases file.\n");
141   }
142 }
143
144 ##############
145
146 # make sure we know where to store the files we're creating.
147 if ( ! length("$FEISTY_MEOW_LOADING_DOCK") ) {
148   print "\
149 The FEISTY_MEOW_LOADING_DOCK variable is not defined.  This must point to\
150 the location where the generated scripts are stored.  You may still need to\
151 configure the feisty meow script system with something like:\
152   bash /opt/feistymeow.org/feisty_meow/scripts/core/reconfigure_feisty_meow.sh\
153 Please see http://feistymeow.org for more details.\n";
154   exit 1;
155 #really need to use better exit codes.
156 }
157
158 $FEISTY_MEOW_LOADING_DOCK =~ s/\\/\//g;
159 $FEISTY_MEOW_SCRIPTS =~ s/\\/\//g;
160 $FEISTY_MEOW_APEX =~ s/\\/\//g;
161
162 # create our generated shells directory if it's not already there.
163 if (! -d $FEISTY_MEOW_LOADING_DOCK) {
164   mkdir $FEISTY_MEOW_LOADING_DOCK;
165 }
166
167 ##############
168
169 # set the executable bit for binaries for just this current user.
170 if (-d $FEISTY_MEOW_BINARIES) {
171   system("chmod -R u+x \"$FEISTY_MEOW_BINARIES\"/*");
172 }
173
174 # generate the first set of alias files that are defined in the core
175 # and custom scripts directories.
176 &rebuild_script_aliases;
177
178 # trash the old versions.
179 unlink("$FEISTY_MEOW_LOADING_DOCK/fmc_aliases_for_scripts.sh");
180
181 if (length($DEBUG_FEISTY_MEOW)) {
182   printf "writing $FEISTY_MEOW_LOADING_DOCK/fmc_aliases_for_scripts.sh...\n";
183 }
184
185 # open the alias files to be created.
186 open(she, ">> $FEISTY_MEOW_LOADING_DOCK/fmc_aliases_for_scripts.sh");
187
188 # find the list of files in the scripts directory.
189 @shell_files = (find_files(recursive_find_directories("$FEISTY_MEOW_SCRIPTS")),
190     find_files(recursive_find_directories("$FEISTY_MEOW_LOADING_DOCK/custom/scripts")));
191
192 #printf "found all these files in main script dirs:\n";
193 #printf "  @shell_files\n";
194
195 # construct aliases for items in the scripts directory.
196 foreach $file (@shell_files) {
197   # test to see what type of item we got.
198   if ($file =~ '^\.$'
199       || $file =~ '^\.\.$'
200       || $file =~ '^.svn$'
201       || $file =~ '^.git$'
202       || $file =~ /\/\.$/
203       || $file =~ /\/\.\.$/
204       || $file =~ /\/\.svn$/
205       || $file =~ /\/\.git$/
206       || $file =~ /\/customize\/[a-zA-Z0-9_]+\/[a-zA-Z0-9_.]+$/
207 #hmmm: would be nice to have this name in a symbol somewhere instead of having "customize" everywhere.
208       ) {
209     # just skip this item; it's a special directory or a file we don't want to include.
210 #    print "skipping name: $file\n";
211   } else {
212      &make_alias($file, "");
213   }
214 }
215
216 close(she);
217
218 1;