]> code.delx.au - gnu-emacs-elpa/blobdiff - packages/notes-mode/mkall
Add notes-mode.
[gnu-emacs-elpa] / packages / notes-mode / mkall
diff --git a/packages/notes-mode/mkall b/packages/notes-mode/mkall
new file mode 100755 (executable)
index 0000000..d22a56c
--- /dev/null
@@ -0,0 +1,216 @@
+#!/usr/bin/perl -w
+# If the above path is incorrect for your system,
+# FOLLOW THE INSTALLATION INSTRUCTIONS in README.
+
+#
+# mkall
+# $Id: mkall,v 1.18 2007/02/23 05:14:59 johnh Exp $
+#
+# Copyright (C) 1996 by John Heidemann.
+# Comments to <johnh@isi.edu>.
+#
+# This file is under the Gnu Public License, version 2.
+# For details see the COPYING which accompanies this distribution.
+#
+
+sub usage {
+    print STDOUT <<END;
+usage: $0
+
+Does all reindexing needed for notes-mode.
+END
+    exit 1;
+}
+
+
+require 5.000;
+BEGIN { unshift(@INC, "/home/johnh/NOTES/BIN"); };
+use NotesVars;
+use strict;
+use Config;
+
+&usage if (($#ARGV >= 0 && $ARGV[0] eq '-?'));
+
+my($perl) = &find_perl_binary;
+
+# xxx: currently rawindex generates @subjects that index uses.
+# Should remove this dependency.
+my(@subjects) = ();
+
+&make_rawindex;
+&make_index;
+&make_index_cache;
+&make_prevnext;
+&make_mknew_cache;
+&fix_perms;
+
+exit 0;
+
+
+sub find_perl_binary {
+    my($perl) = $^X;
+    return $perl if (-x $perl);
+    $perl = $Config{'installbin'} . "/perl";
+    return $perl if (-x $perl);
+    # If we can't find perl, then we assume the user's set the #! lines correctly.
+    return '';
+}
+
+
+sub run_over_all_notes {
+    my($cmd, $user_cmd_name) = @_;
+    open(CMD, "| $cmd") || die ("$0: cannot run $user_cmd_name.\n");
+    foreach (glob "$::notes{'int_glob'}/$::notes{'file_glob'}") {
+       print CMD "$_\n";
+    };    
+    close CMD;
+    if ($? >> 8) {
+        die "$0: $user_cmd_name failed.";
+    };
+}
+
+
+#
+# rawindex 
+#
+#
+# The main thing that happens here is we find and sort the notes entries.
+# We do the sorting in perl because the system sort is less portable
+# (wrt stability, for example).
+#
+sub make_rawindex {
+    chdir ($::notes{'dir'}) || die "$0: cannot cd to $::notes{'dir'}.\n";
+    # if (-f "rawindex") {
+    #     rename('rawindex', 'rawindex~') || die "$0: cannot rename rawindex.\n";
+    # };
+    # my($sed_arg) = '"s@' . $::notes{home} . '@/~@"';
+    # system(<<END);
+    #     $::notes{'bin_dir'}/mkrawindex $::notes{'dir'}/$::notes{'int_glob'}/$::notes{'file_glob'} |
+    #     sort -f -t# +1 +0 |
+    #     sed $sed_arg > rawindex
+    # END
+    # if ($? >> 8) {
+    #     rename('rawindex', 'rawindex.bad');
+    #     rename('rawindex~', 'rawindex');
+    #     die "$0: rawindex pipeline failed.";
+    # };
+    #
+    # xxx: eventually this will overflow the buffer and we'll need to
+    # do something like xargs.  However, in 10 years of use this hasn't happened
+    # for me yet.
+    run_over_all_notes("$perl $::notes{'bin_dir'}/mkrawindex -X >prerawindex", "mkrawindex");
+#    open (IF, "$perl $::notes{'bin_dir'}/mkrawindex $::notes{'dir'}/$::notes{'int_glob'}/$::notes{'file_glob'} |") || die "$0: cannot run mkrawindex\n";
+#    binmode IF;
+    open(IF, "<prerawindex") || die  "$0: cannot open prerawindex.\n";
+    binmode IF;
+    open (OF, ">rawindex+") || die "$0: cannot write to rawindex+\n";
+    binmode OF;
+    my($internal_marker) = chr(1);
+    foreach (<IF>) {
+        chomp;
+       s@$::notes{'home'}@/~@;
+       my($left, $right) = /^([^#]+)\#(.*)$/;
+       push(@subjects, "${right}${internal_marker}${left}");
+    };
+    close IF;
+    @subjects = sort { uc($a) cmp uc($b) } @subjects;
+    foreach (0..$#subjects) {
+        my($left, $right) = ($subjects[$_] =~ /^(.+)${internal_marker}(.*)$/);
+       $subjects[$_] = "$right#$left";
+       print OF "$subjects[$_]\n";
+    };
+    close OF;
+    if (-f 'rawindex') {
+        rename('rawindex', 'rawindex~') || die "$0: rename rawindex{,~} failed.\n";
+    };
+    rename('rawindex+', 'rawindex') || die "$0: rename rawindex{+,} failed.\n";
+}
+
+#
+# index
+#
+sub make_index {
+    if (-f 'index') {
+        rename('index', 'index~') || die "$0: rename index{,~} failed.\n";
+    };
+    open (OF, "| $perl $::notes{'bin_dir'}/mkindex > index") || die "$0: cannot run mkindex.\n";
+    binmode OF;
+    my($last);
+    foreach (@subjects) {
+        if (!defined($last) || $last ne uc($_)) {
+           print OF "$_\n";
+           $last = uc($_);
+         };
+    };
+    close OF;
+    if ($? >> 8) {
+        rename('index', 'index.bad') || warn "$0: recovery rename index{,.bad} failed.\n";
+       rename('index~', 'index') || warn "$0: recovery rename index{~,} failed.\n";
+       die "$0: index pipeline failed.";
+    };
+}
+
+#
+# index_cache.el
+#
+# Yes, the code should probably be compiled,
+# but compilation time doesn't seem to be the problem.
+#
+sub make_index_cache {
+    if (-f 'index_cache.el') {
+        rename('index_cache.el', 'index_cache.el~') || die "$0: rename index_cache.el{,~} failed.\n";
+    };
+    system(<<END);
+    $perl $::notes{'bin_dir'}/mkindexcache < index > index_cache.el
+END
+    #    emacs -batch --eval '(byte-compile-file "index_cache.el")' 2>&1 | grep -v 'free variable'
+    if ($? >> 8) {
+        rename('index_cache.el', 'index_cache.el.bad') || warn "$0: reanme index_cache.el{,.bad} failed.\n";
+       rename('index_cache.el~', 'index_cache.el') || warn "$0: rename index_cache.el{~,} failed.\n";
+       unlink('index_cache.elc') if (-f 'index_cache.elc');
+       die "$0: index pipeline failed.";
+    };
+    #
+    # Bug found by Klaus Zeitler <kzeitler@lucent.com>:
+    # if we generate index_cache.el in less than a second,
+    # it won't be considered up-to-date.
+    #
+    if (-M 'index' == -M 'index_cache.el') {
+       # We're too fast---stall and update the file
+       sleep(1);   # stall
+       system('touch index_cache.el');   # "update"
+    };
+}
+
+
+#
+# prevnext
+#
+sub make_prevnext {
+    run_over_all_notes("$perl $::notes{'bin_dir'}/mkprevnext -X ./rawindex", "mkprevnext");
+}
+
+#
+# mknew cache
+#
+sub make_mknew_cache {
+    my($todays_file) = &epoch_to_pathname(time);
+    system(<<END);
+    $perl $::notes{'bin_dir'}/mknew -c $todays_file >./mknew.cache
+END
+}
+
+#
+# fix permissions
+#
+sub fix_perms {
+    my($perm);
+    foreach (glob("*"), glob("*/*")) {
+       my($mode) = (stat($_))[2];
+       if ($mode & 0077) {
+           chmod (($mode & 0700), $_) || warn "$0: could not chmod $_.\n";
+        };
+    };
+}
+
+