dropped the copying of customizations
[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 HOME );
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 #print "full alias is $full_alias\n";
47   $aliasname =~ s/^.*\/([^\/]*)/\1/;
48 #print "alias became $aliasname\n";
49   print she "define_yeti_alias $aliasname=\"bash $full_alias.sh\"\n";
50 }
51
52 # makes an alias for a perl script given the alias name.
53 sub make_perl_alias {
54   local($aliasname) = shift(@_);
55   local($full_alias) = $aliasname;
56   $aliasname =~ s/^.*\/([^\/]*)/\1/;
57 #print "alias became $aliasname\n";
58   print she "define_yeti_alias $aliasname=\"perl $full_alias.pl\"\n";
59 }
60
61 ##############
62
63 # The "common.alias" file is used in the generated aliases file as a base
64 # set of generally useful aliases.  We also add aliases for any script files
65 # (perl, bash, python, etc) that we find in the feisty meow script hierarchy.
66 # Any *.alias files found in the $FEISTY_MEOW_LOADING_DOCK/custom folder are
67 # loaded also.
68 sub rebuild_script_aliases {
69
70   if (length($DEBUG_FEISTY_MEOW)) {
71     print "rebuilding generated aliases file...\n";
72   }
73
74   # create our generated shells directory if it's not already.
75   if ( ! -d $FEISTY_MEOW_LOADING_DOCK ) {
76     mkdir $FEISTY_MEOW_LOADING_DOCK;
77     if (length($DEBUG_FEISTY_MEOW)) {
78       print "made FEISTY_MEOW_LOADING_DOCK at '$FEISTY_MEOW_LOADING_DOCK'\n";
79     }
80   }
81
82   # test if we can use color in ls...
83 #  $test_color=` ls --help 2>&1 | grep -i color `;
84
85   # this is an array of files from which to draw alias definitions.
86   @ALIAS_DEFINITION_FILES = ("$FEISTY_MEOW_SCRIPTS/core/common.alias");
87
88   # if custom aliases files exist, add them to the list.
89 #hmmm: would be nice to have this name in a symbol somewhere instead of having "custom" or "customize" everywhere.
90   foreach $i (&glob_list("$FEISTY_MEOW_LOADING_DOCK/custom/*.alias")) {
91     if (-f $i) { push(@ALIAS_DEFINITION_FILES, $i); }
92   }
93   if (length($DEBUG_FEISTY_MEOW)) {
94     print "using these alias files:\n";
95     foreach $i (@ALIAS_DEFINITION_FILES) {
96       local $base_of_dir = &basename(&dirname($i));
97       local $basename = &basename($i);
98       print "  $base_of_dir/$basename\n";
99     }
100   }
101
102   # write the aliases for sh and bash scripts.
103   local $GENERATED_ALIAS_FILE = "$FEISTY_MEOW_LOADING_DOCK/fmc_core_and_custom_aliases.sh";
104   if (length($DEBUG_FEISTY_MEOW)) {
105     print "writing generated aliases in $GENERATED_ALIAS_FILE...\n";
106   }
107
108 #hmmm: perhaps a good place for a function to create the header,
109 #      given the appropriate comment code.
110
111   open GENOUT, ">$GENERATED_ALIAS_FILE" or die "cannot open $GENERATED_ALIAS_FILE";
112
113   print GENOUT "##\n";
114   print GENOUT "## generated file: $GENERATED_ALIAS_FILE\n";
115   print GENOUT "## please do not edit.\n";
116   print GENOUT "##\n";
117
118 #  if (length($test_color)) {
119 #    print GENOUT "export color_add='--color=auto'\n";
120 #  } else {
121 #    print GENOUT "export color_add=\n";
122 #  }
123
124   # plow in the full set of aliases into the file.
125   foreach $i (@ALIAS_DEFINITION_FILES) {
126     open CURR_ALIASER, "<$i" or die "cannot open current alias file $i";
127     foreach $line (<CURR_ALIASER>) {
128       print GENOUT "$line";
129     }
130   }
131
132   close GENOUT;
133
134   if (length($DEBUG_FEISTY_MEOW)) {
135     print("done rebuilding generated aliases file.\n");
136   }
137 }
138
139 ##############
140
141 # make sure we know where to store the files we're creating.
142 if ( ! length("$FEISTY_MEOW_LOADING_DOCK") ) {
143   print "\
144 The FEISTY_MEOW_LOADING_DOCK variable is not defined.  This must point to\
145 the location where the generated scripts are stored.  You may still need to\
146 configure the feisty meow script system with something like:\
147   bash /opt/feistymeow.org/feisty_meow/scripts/core/reconfigure_feisty_meow.sh\
148 Please see http://feistymeow.org for more details.\n";
149   exit 1;
150 #really need to use better exit codes.
151 }
152
153 ##############
154
155 $FEISTY_MEOW_LOADING_DOCK =~ s/\\/\//g;
156 $FEISTY_MEOW_SCRIPTS =~ s/\\/\//g;
157 $FEISTY_MEOW_APEX =~ s/\\/\//g;
158
159 ##############
160
161 # create our generated shells directory if it's not already there.
162 if (! -d $FEISTY_MEOW_LOADING_DOCK) {
163   mkdir $FEISTY_MEOW_LOADING_DOCK;
164 }
165
166 ##############
167
168 # set the executable bit for binaries for just this current user.
169 if (-d $FEISTY_MEOW_BINARIES) {
170   system("find \"$FEISTY_MEOW_BINARIES\" -type f -exec chmod u+x \"{}\" ';'");
171 }
172
173 ##############
174
175 # generate the first set of alias files that are defined in the core
176 # and custom scripts directories.
177 &rebuild_script_aliases;
178
179 ##############
180
181 # trash the old versions.
182 unlink("$FEISTY_MEOW_LOADING_DOCK/fmc_aliases_for_scripts.sh");
183
184 if (length($DEBUG_FEISTY_MEOW)) {
185   printf "writing $FEISTY_MEOW_LOADING_DOCK/fmc_aliases_for_scripts.sh...\n";
186 }
187
188 ##############
189
190 # open the alias files to be created.
191 open(she, ">> $FEISTY_MEOW_LOADING_DOCK/fmc_aliases_for_scripts.sh");
192
193 # find the list of files in the scripts directory.
194 @shell_files = (find_files(recursive_find_directories("$FEISTY_MEOW_SCRIPTS")),
195     find_files("$FEISTY_MEOW_LOADING_DOCK/custom/scripts"),
196     find_files(recursive_find_directories("$FEISTY_MEOW_LOADING_DOCK/custom/scripts")));
197
198 # strip out the customization files, since they are added in on demand only.
199 #print "before filtering list: @shell_files\n";
200 @shell_files = grep ! /\/customize\//, @shell_files;
201 #print "after filtering list: @shell_files\n";
202
203 #printf "found all these files in main script dirs:\n";
204 #printf "  @shell_files\n";
205
206 # construct aliases for items in the scripts directory.
207 foreach $file (@shell_files) {
208   # test to see what type of item we got.
209   if ($file =~ '^\.$'
210       || $file =~ '^\.\.$'
211       || $file =~ '^.svn$'
212       || $file =~ '^.git$'
213       || $file =~ /\/\.$/
214       || $file =~ /\/\.\.$/
215       || $file =~ /\/\.svn$/
216       || $file =~ /\/\.git$/
217       ) {
218     # just skip this item; it's a special directory or a file we don't want to include.
219     print "skipping name: $file\n";
220   } else {
221      &make_alias($file, "");
222   }
223 }
224
225 close(she);
226
227 ##############
228
229 # prepare a finalizer chunk that is the last thing to load.
230
231 open(she, ">> $FEISTY_MEOW_LOADING_DOCK/fmc_ending_sentinel.sh");
232
233 # write in our sentinel alias that says alias loading was handled.
234 print she "define_yeti_alias CORE_ALIASES_LOADED=true\n";
235
236 close(she);
237
238 ##############
239
240 1;
241