summaryrefslogtreecommitdiff
path: root/rvs/wrapper
diff options
context:
space:
mode:
authorLuke Shumaker <luke@HP-dv6246us-u910.(none)>2010-03-28 12:25:08 -0400
committerLuke Shumaker <lukeshu@sbcglobal.net>2015-06-26 00:30:19 -0600
commit98f2efbe20e2d9d03e5296293cc8f52c95af72f5 (patch)
treedf5ab79539c7a4b5bc5a056dc14a4f7a4c5be665 /rvs/wrapper
parentd4a42ee34928970141b8299c104d47c0f3faecd0 (diff)
Rework rvs a lot (no longer needs complex C dependency tracker!)
Rework ./configure, and how it uses `srcdir'. Probably broke all the other packages. Oh well, everything only half-works right now.
Diffstat (limited to 'rvs/wrapper')
-rw-r--r--rvs/wrapper/TODO18
-rw-r--r--rvs/wrapper/main.mk.in57
-rw-r--r--rvs/wrapper/plugin-depend.c146
-rw-r--r--rvs/wrapper/plugin-depend.h83
-rw-r--r--rvs/wrapper/plugin-find.c103
-rw-r--r--rvs/wrapper/plugin-find.h64
-rw-r--r--rvs/wrapper/plugin-load.c78
-rw-r--r--rvs/wrapper/plugin-load.h47
-rw-r--r--rvs/wrapper/plugin-parse.c132
-rw-r--r--rvs/wrapper/plugin-parse.h49
-rw-r--r--rvs/wrapper/plugin-run.c89
-rw-r--r--rvs/wrapper/plugin-run.h47
-rw-r--r--rvs/wrapper/plugins.c71
-rw-r--r--rvs/wrapper/plugins.h69
-rw-r--r--rvs/wrapper/runcom.c92
-rw-r--r--rvs/wrapper/rvs.c117
-rw-r--r--rvs/wrapper/rvs.h76
-rw-r--r--rvs/wrapper/rvs.sh138
18 files changed, 117 insertions, 1359 deletions
diff --git a/rvs/wrapper/TODO b/rvs/wrapper/TODO
deleted file mode 100644
index b1ab1d9..0000000
--- a/rvs/wrapper/TODO
+++ /dev/null
@@ -1,18 +0,0 @@
-#! /bin/less
-
-* plugin-run.h:
- the function _plugin_sh_mktemp() is an ugly hack, it exists
- because
- a) it is secure
- b) it is easier to write a hack using methods I understand,
- than learn those I don't
- c) point `b' especially when I just want to get it working.
- d) point `b' especially since I think I coded it in
- studyhall one day, which means I didn't have internet
- access (no glibc documenation).
-* everything:
- with plugin commands, have arg1 be a file to write output to
-
-~ Luke Shumaker
-Happy Hacking!
-
diff --git a/rvs/wrapper/main.mk.in b/rvs/wrapper/main.mk.in
index ecc6cc6..0f24d6b 100644
--- a/rvs/wrapper/main.mk.in
+++ b/rvs/wrapper/main.mk.in
@@ -17,59 +17,48 @@ ver = 0.9
# along with this program; see the file COPYING.
# If not, see <http://www.gnu.org/licenses>.
-rvs = @name@
-dirs += $(libexecdir)/$(rvs)
-
-CFLAGS = -g \
- -DNAME=\"$(name)\" \
- -DVER=\"$(ver)\" \
- -Dlibexecdir=\"$(libexecdir)/$(rvs)\" \
- -Dplugin_conf=\"plugin.conf\"
+sysconfdir ?= @sysconfdir@
+BINDIR ?= @BINDIR@
+TMPDIR ?= @TMPDIR@
+LIBDIR ?= @LIBDIR@
+ETCDIR ?= @ETCDIR@
+dirs += $(sysconfdir) $(BINDIR) $(TMPDIR) $(LIBDIR) $(ETCDIR)
# phony targets ####################################################
-all : Makefiles rvs runcom
-.PHONY : install uninstall clean distclean dist install-runcom
-.SUFFIXES : .c .o
-VPATH = $(srcdir)/wrapper
-filelist=$(patsubst $(srcdir)/wrapper/%,%,$(shell find $(srcdir)/wrapper/* -type f))
+.PHONY : all
+all : Makefiles rvs
+VPATH = $(srcdir)
+filelist=$(patsubst $(srcdir)/%,%,$(shell find $(srcdir)/* -type f))
# most everything ##################################################
-RUNCOM = $(DESTDIR)$(libexecdir)/$(rvs)/runcom
-install : $(RVS) $(RUNCOM)
-$(RVS) : rvs $(dir $(RVS))
- $(INSTALL_PROGRAM) $< $@
-
-OBJ = runcom.o rvs.o plugins.o \
- plugin-depend.o \
- plugin-find.o \
- plugin-load.o \
- plugin-parse.o \
- plugin-run.o \
-runcom: $(OBJ)
- $(CC) -o $@ $^
-
-$(RUNCOM): runcom $(dir $(RUNCOM))
+# the installed wrapper
+$(RVS) : rvs $(dir $(RVS))
$(INSTALL_PROGRAM) $< $@
+# build the wrapper
b := @
-# build shell scripts
rvs : rvs.sh
$(INSTALL_PROGRAM) $< $@
$(SED) -i \
-e 's/$bSHELL@/$(subst /,\/,$(SHELL))/g' \
- -e 's/$bname@/$(rvs)/g' \
- -e 's/$blibexecdir@/$(subst /,\/,$(libexecdir))/g' \
+ -e 's/$bname@/$(subst /,\/,$(rvs))/g' \
+ -e 's/$bBINDIR@/$(subst /,\/,$(BINDIR))/' \
+ -e 's/$bTMPDIR@/$(subst /,\/,$(TMPDIR))/' \
+ -e 's/$bLIBDIR@/$(subst /,\/,$(LIBDIR))/' \
+ -e 's/$bETCDIR@/$(subst /,\/,$(ETCDIR))/' \
$@
+# standard targes ####################################################
+.PHONY : install uninstall clean distclean
+install : $(RVS)
+
uninstall :
$(RM) $(RVS)
- $(RM) $(DESTDIR)$(libexecdir)/$(rvs)/runcom
clean :
- $(RM) *.o *.d
distclean : clean
$(RM) rvs
- $(RM) Makefile
+ $(RM) Makefile *.mk
diff --git a/rvs/wrapper/plugin-depend.c b/rvs/wrapper/plugin-depend.c
deleted file mode 100644
index de21a93..0000000
--- a/rvs/wrapper/plugin-depend.c
+++ /dev/null
@@ -1,146 +0,0 @@
-/* wrapper/plugin-depend.c -- load a command dependancy tree
- system depends: <string.h> <error.h>
- Copyright (C) 2009 Luke Shumaker
-
- This file is part of rvs.
-
- rvs is free software; you can redistribute it and/or modify it
- under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2, or (at your
- option) any later version.
-
- rvs is distributed in the hope that it will be useful, but
- WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
- See the GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with rvs; see the file COPYING.
- If not, write to the Free Software Foundation,
- 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-*/
-
-#include <string.h>
-#include <error.h>
-
-#include "rvs.h"
-#include "plugin-find.h"
-
-#include "plugin-depend.h"
-
-/* translates a string in format `plugin/command' into a pointer to the command
- DON'T plan on using the string again, it will be mutilated!
- (so we go ahead and free() it and set the pointer to NULL) */
-struct plugin_command *
-plugin_depend_parse (char **string,
- struct plugin *plugins,
- struct plugin_command *root)
-{
- struct plugin_command *command=NULL;
-
- if (*string==NULL)
- command=root;
- else {
- /* *string is in the format `plugin/command' */
- /* char *del=delimeter */
- char *del=strchr(*string,'/');
- del[0]='\0';
- /* *string = PLUGIN_NAME */
- /* &del[1] = COMMAND_NAME */
- struct plugin *plugin;
- plugin =plugin_find_plugin(plugins, *string );
- if (plugin==NULL)
- error(EXIT_FAILURE,0,"cannot find plugin `%s'",*string);
- command=plugin_find_plugin_command(plugin->commands, &del[1] );
- if (command==NULL)
- error(EXIT_FAILURE,0,
- "plugin `%s' does not contain command `%s'",
- *string,&del[1]);
- xfree(*string);
- *string=NULL;
- }
- return command;
-}
-
-/* used by plugin_depend_add */
-void
-_plugin_depend_add (struct plugin_command *prev,
- struct plugin_command *next)
-{
- if (prev->d_next==NULL) {
- prev->d_next=next;
- } else {
- _plugin_depend_add(prev->d_next,next);
- }
-}
-
-/* plugin_depend_add(depend,depender) */
-void
-plugin_depend_add (struct plugin_command *depend,
- struct plugin_command *depender)
-{
- if (depend->d_child==NULL) {
- depend->d_child=depender;
- } else {
- _plugin_depend_add(depend->d_child,depender);
- }
-}
-
-/* take care of depends for `command' */
-void
-plugin_depend_command (struct plugin_command *command,
- struct plugin *plugins,
- struct plugin_command *root, int ind)
-{
- if (command!=NULL) {
- if (command->depend == NULL) {
- /* the depend still needs to be parsed */
- command->depend=plugin_depend_parse(
- &(command->depends),plugins,root);
- }
- plugin_depend_add(command->depend,command);
- }
-}
-
-/* take care of commands for a `plugin', and those after it (linked list) */
-void
-plugin_depend_plugin_all (struct plugin *plugin,
- struct plugin *plugins,
- struct plugin_command *root)
-{
- plugin_depend_command(plugin->commands,plugins,root,0);
- if (plugin->next != NULL) {
- plugin_depend_plugin_all(plugin->next,plugins,root);
- }
-}
-
-/* take care of all depends */
-struct plugin_command *
-plugin_depend_all (struct plugin *plugins)
-{
- struct plugin_command *root=plugin_mk_command();
-
- plugin_depend_plugin_all(plugins,plugins,root);
- return root;
-}
-
-void
-_plugin_depend_list (struct plugin_command_list *commands,
- struct plugin *plugins,
- struct plugin_command *root,int ind)
-{
- if (commands!=NULL) {
- plugin_depend_command(commands->command,plugins,root,ind++);
- _plugin_depend_list(commands->next,plugins,root,ind++);
- }
-}
-
-struct plugin_command *
-plugin_depend_list (struct plugin_command_list *commands,
- struct plugin *plugins)
-{
- struct plugin_command *root=plugin_mk_command();
- _plugin_depend_list(commands,plugins,root,0);
- return root;
-}
-
diff --git a/rvs/wrapper/plugin-depend.h b/rvs/wrapper/plugin-depend.h
deleted file mode 100644
index 580c03f..0000000
--- a/rvs/wrapper/plugin-depend.h
+++ /dev/null
@@ -1,83 +0,0 @@
-/* wrapper/plugin-parse.h -- parse rvs plugin config files
- system depends: <stdio.h> <string.h> <error.h>
- Copyright (C) 2009 Luke Shumaker
-
- This file is part of rvs.
-
- rvs is free software; you can redistribute it and/or modify it
- under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2, or (at your
- option) any later version.
-
- rvs is distributed in the hope that it will be useful, but
- WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
- See the GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with rvs; see the file COPYING.
- If not, write to the Free Software Foundation,
- 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-*/
-#ifndef FILE_plugin_depend_h_SEEN
-#define FILE_plugin_depend_h_SEEN
-
-#include "plugins.h"
-#include "plugin-find.h"
-
-/* translates a string in format `plugin/command' into a pointer to the command
- DON'T plan on using the string again, it will be mutilated!
- (so we go ahead and free() it and set the pointer to NULL) */
-extern
-struct plugin_command *
-plugin_depend_parse (char **string,
- struct plugin *plugins,
- struct plugin_command *root);
-
-/* used by plugin_depend_add */
-extern
-void
-_plugin_depend_add (struct plugin_command *prev,
- struct plugin_command *next);
-
-/* plugin_depend_add(depend,depender) */
-extern
-void
-plugin_depend_add (struct plugin_command *depend,
- struct plugin_command *depender);
-
-/* take care of depends for `command' */
-extern
-void
-plugin_depend_command (struct plugin_command *command,
- struct plugin *plugins,
- struct plugin_command *root, int ind);
-
-/* take care of commands for a `plugin', and those after it (linked list) */
-extern
-void
-plugin_depend_plugin_all (struct plugin *plugin,
- struct plugin *plugins,
- struct plugin_command *root);
-
-/* take care of all depends */
-extern
-struct plugin_command *
-plugin_depend_all (struct plugin *plugins);
-
-extern
-void
-_plugin_depend_list (struct plugin_command_list *commands,
- struct plugin *plugins,
- struct plugin_command *root,int ind);
-
-extern
-struct plugin_command *
-plugin_depend_list (struct plugin_command_list *commands,
- struct plugin *plugins);
-
-
-
-
-#endif
-
diff --git a/rvs/wrapper/plugin-find.c b/rvs/wrapper/plugin-find.c
deleted file mode 100644
index 98e16af..0000000
--- a/rvs/wrapper/plugin-find.c
+++ /dev/null
@@ -1,103 +0,0 @@
-/* wrapper/plugin-find.h -- search functions for rvs plugins
- system depends: <string.h>
- Copyright (C) 2009 Luke Shumaker
-
- This file is part of rvs.
-
- rvs is free software; you can redistribute it and/or modify it
- under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2, or (at your
- option) any later version.
-
- rvs is distributed in the hope that it will be useful, but
- WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
- See the GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with rvs; see the file COPYING.
- If not, write to the Free Software Foundation,
- 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-*/
-
-#include <string.h> /* only uses `strcmp' */
-
-#include "rvs.h"
-#include "plugins.h"
-
-#include "plugin-find.h"
-
-/* returns first plugin with `name' (duplicates are... unwise) */
-struct plugin *
-plugin_find_plugin(struct plugin *node, char *name)
-{
-
- if (node==NULL)
- return node;
- else {
- if (strcmp(node->name,name) == 0)
- return node;
- else
- return plugin_find_plugin(node->next,name);
- }
-}
-
-/* returns plugin `name within plugin `node' */
-struct plugin_command *
-plugin_find_plugin_command(struct plugin_command *node, char *name)
-{
- if (node==NULL)
- return node;
- else {
- if (strcmp(node->name,name) == 0)
- return node;
- else
- return plugin_find_plugin_command(node->next,name);
- }
-}
-
-/* returns the first command with `name' it finds */
-struct plugin_command *
-plugin_find_command(struct plugin *plugin, char *name)
-{
- if (plugin==NULL)
- return NULL;
- else {
- struct plugin_command *ret;
- ret=plugin_find_plugin_command(plugin->commands,name);
- if (ret == NULL)
- ret=plugin_find_command(plugin->next,name);
- return ret;
- }
-}
-
-/* returns a linked list of all commands with `name' it finds */
-struct plugin_command_list *
-plugin_find_commands(struct plugin *plugin, char *name)
-{
- if (plugin==NULL)
- return NULL;
- else {
- struct plugin_command *command;
- command=plugin_find_command(plugin,name);
- struct plugin_command_list *node;
- if (command==NULL)
- node=plugin_find_commands(plugin->next,name);
- else {
- node=xmalloc( sizeof *node );
- node->command=command;
- node->next=plugin_find_commands(plugin->next,name);
- }
- return node;
- }
-}
-
-void
-plugin_free_list(struct plugin_command_list *node)
-{
- if (node!=NULL) {
- plugin_free_list(node->next);
- xfree(node);
- }
-}
-
diff --git a/rvs/wrapper/plugin-find.h b/rvs/wrapper/plugin-find.h
deleted file mode 100644
index 0185117..0000000
--- a/rvs/wrapper/plugin-find.h
+++ /dev/null
@@ -1,64 +0,0 @@
-/* wrapper/plugin-find.h -- search functions for rvs plugins
- system depends: <string.h>
- Copyright (C) 2009 Luke Shumaker
-
- This file is part of rvs.
-
- rvs is free software; you can redistribute it and/or modify it
- under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2, or (at your
- option) any later version.
-
- rvs is distributed in the hope that it will be useful, but
- WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
- See the GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with rvs; see the file COPYING.
- If not, write to the Free Software Foundation,
- 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-*/
-#ifndef FILE_plugin_find_h_SEEN
-#define FILE_plugin_find_h_SEEN
-
-#include <string.h> /* only uses `strcmp' */
-
-#include "rvs.h"
-#include "plugins.h"
-
-/*------------------------------struct------------------------------*/
-/* a linked list of commands, for use by `plugin_find_commands' */
-struct plugin_command_list
-{
- struct plugin_command *command;
- struct plugin_command_list *next;
-};
-
-/*-----------------------------function-----------------------------*/
-/* returns first plugin with `name' (duplicates are... unwise) */
-extern
-struct plugin *
-plugin_find_plugin(struct plugin *node, char *name);
-
-/* returns plugin `name within plugin `node' */
-extern
-struct plugin_command *
-plugin_find_plugin_command(struct plugin_command *node, char *name);
-
-/* returns the first command with `name' it finds */
-extern
-struct plugin_command *
-plugin_find_command(struct plugin *plugin, char *name);
-
-/* returns a linked list of all commands with `name' it finds */
-extern
-struct plugin_command_list *
-plugin_find_commands(struct plugin *plugin, char *name);
-
-extern
-void
-plugin_free_list(struct plugin_command_list *node);
-
-#endif
-
diff --git a/rvs/wrapper/plugin-load.c b/rvs/wrapper/plugin-load.c
deleted file mode 100644
index 142fcd5..0000000
--- a/rvs/wrapper/plugin-load.c
+++ /dev/null
@@ -1,78 +0,0 @@
-/* wrapper/plugin-load.h -- load rvs plugins into mem
- system depens: <stdio.h>, GNU <string.h>
- Copyright (C) 2009 Luke Shumaker
-
- This file is part of rvs.
-
- rvs is free software; you can redistribute it and/or modify it
- under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2, or (at your
- option) any later version.
-
- rvs is distributed in the hope that it will be useful, but
- WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
- See the GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with rvs; see the file COPYING.
- If not, write to the Free Software Foundation,
- 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-*/
-
-#include <stdio.h>
-#include <string.h>
-
-#include "rvs.h"
-#include "plugins.h"
-#include "plugin-parse.h"
-
-#include "plugin-load.h"
-
-/*- plugin_load ----------------------------------------------------*\
- now, load plugin plug_name,
-\* whose configuration file is plugin_conf */
-struct plugin *
-plugin_load (const char *plug_name)
-{
- struct plugin *plugin=xmalloc( sizeof(*plugin) );
- plugin->name=stralloc(plug_name);
- plugin->next=NULL;
-
- xchdir(plug_name);
- FILE *file = xfopen(plugin_conf,"r");
- plugin->commands=plugin_parse(plugin, file);
- fclose( file );
- xchdir("..");
-
- return plugin;
-}
-
-/*- load_plugins ---------------------------------------------------*\
- Load all the plugins
- assume we're in rvs's libexecdir, where plugins are
-\* Use `plugin_conf' as the name of the config file for each plugin */
-
-struct plugin *
-load_plugins (FILE *list)
-{
- struct plugin *first=NULL; /* we return this */
- struct plugin **prev=&first; /* this is the previous plugin->next */
- struct plugin *plugin; /* this is the current plugin */
-
- size_t nbytes = 10;
- char *plug_name=(char *)xmalloc(nbytes);
- while ( getline(&plug_name, &nbytes, list) > 0 ) {
- char *del=strchr(plug_name,'\n');
- del[0]='\0';
- /*if (strlen(plug_name)!=0) {*/
- if (plug_name[0]!='\0') {;
- plugin=plugin_load(plug_name);
- *prev=plugin;/* this sets the last's `next' */
- prev=&plugin->next;
- }
- }
-
- return first;
-}
-
diff --git a/rvs/wrapper/plugin-load.h b/rvs/wrapper/plugin-load.h
deleted file mode 100644
index f214151..0000000
--- a/rvs/wrapper/plugin-load.h
+++ /dev/null
@@ -1,47 +0,0 @@
-/* wrapper/plugin-load.h -- load rvs plugins into mem
- system depens: <stdio.h>, GNU <string.h>
- Copyright (C) 2009 Luke Shumaker
-
- This file is part of rvs.
-
- rvs is free software; you can redistribute it and/or modify it
- under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2, or (at your
- option) any later version.
-
- rvs is distributed in the hope that it will be useful, but
- WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
- See the GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with rvs; see the file COPYING.
- If not, write to the Free Software Foundation,
- 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-*/
-#ifndef FILE_plugin_load_h_SEEN
-#define FILE_plugin_load_h_SEEN
-
-#include <stdio.h>
-#include <string.h>
-
-#include "rvs.h"
-#include "plugins.h"
-#include "plugin-parse.h"
-
-/*- plugin_load ----------------------------------------------------*\
- now, load plugin plug_name,
-\* whose configuration file is plugin_conf */
-extern
-struct plugin *
-plugin_load (const char *plug_name);
-
-/*- load_plugins ---------------------------------------------------*\
- Load all the plugins
- assume we're in rvs's libexecdir, where plugins are
-\* Use `plugin_conf' as the name of the config file for each plugin */
-extern
-struct plugin *
-load_plugins (FILE *list);
-#endif
-
diff --git a/rvs/wrapper/plugin-parse.c b/rvs/wrapper/plugin-parse.c
deleted file mode 100644
index 4a35586..0000000
--- a/rvs/wrapper/plugin-parse.c
+++ /dev/null
@@ -1,132 +0,0 @@
-/* wrapper/plugin-parse.c -- parse rvs plugin config files
- system depends: <stdio.h> <string.h> <error.h>
- Copyright (C) 2009 Luke Shumaker
-
- This file is part of rvs.
-
- rvs is free software; you can redistribute it and/or modify it
- under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2, or (at your
- option) any later version.
-
- rvs is distributed in the hope that it will be useful, but
- WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
- See the GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with rvs; see the file COPYING.
- If not, write to the Free Software Foundation,
- 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-*/
-
-#include <stdio.h>
-#include <string.h>
-#include <error.h> /* only used in `plugin_parse_escape' for `error' */
-
-#include "rvs.h"
-#include "plugins.h"
-
-#include "plugin-parse.h"
-
-void
-plugin_parse_comment (FILE *file)
-{
- char c;
- while ( (c=getc(file)) != EOF ) {
- if ( c == '\n' ) {
- ungetc (c, file);
- break;
- }
- }
-}
-
-char
-plugin_parse_escape(FILE *file)
-{
- char c=getc(file);
- switch (c) {
- case 'n':
- c = '\n';
- case '\\':
- case '#':
- case ':':
- break;
- default:
- error(EXIT_FAILURE,0,"syntax error");
- break;
- }
- return c;
-}
-
-#define _parse_share(string) \
- case '#':\
- plugin_parse_comment(file);\
- break;\
- case '\\':\
- c[0]=plugin_parse_escape(file);\
- default:\
- stradds(&nbytes,string,(char *)&c);\
- break;
-
-char *
-plugin_parse_depend (FILE *file)
-{
- size_t nbytes = 10;
- char *string = (char *)xmalloc(nbytes);
- string[0]='\0';
-
- char c[2] = " \0";
- while ( (c[0]=getc(file)) != EOF ) {
- switch (c[0]) {
- case '\n':
- ungetc (c[0], file);
- return string;
- break;
- _parse_share(&string)
- }
- }
- return string;
-}
-
-struct plugin_command *
-plugin_parse (struct plugin *plugin, FILE *file)
-{
- struct plugin_command *command;
-
- char c[2] = " \0";
- c[0]=getc(file);
-
- if (c[0]==EOF)
- command=NULL;
- else {
- ungetc (c[0], file);
- command=plugin_mk_command();
- command->plugin=plugin;
-
- size_t nbytes = 10;
- command->name = (char *)xmalloc(nbytes);
- command->name[0]='\0';
-
- while ( (c[0]=getc(file)) != EOF ) {
- switch (c[0]) {
- case '\n':
- /*if (strlen(command->name)==0) {*/
- if (command->name[0]=='\0') {
- plugin_free_command(command);
- return plugin_parse(plugin,file);
- } else
- command->next=plugin_parse(
- plugin,file);
- break;
- case ':':
- command->depends=plugin_parse_depend(
- file);
- break;
- _parse_share(&(command->name))
- }
- }
- }
- return command;
-}
-
diff --git a/rvs/wrapper/plugin-parse.h b/rvs/wrapper/plugin-parse.h
deleted file mode 100644
index 67ee06f..0000000
--- a/rvs/wrapper/plugin-parse.h
+++ /dev/null
@@ -1,49 +0,0 @@
-/* wrapper/plugin-parse.c -- parse rvs plugin config files
- system depends: <stdio.h> <string.h> <error.h>
- Copyright (C) 2009 Luke Shumaker
-
- This file is part of rvs.
-
- rvs is free software; you can redistribute it and/or modify it
- under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2, or (at your
- option) any later version.
-
- rvs is distributed in the hope that it will be useful, but
- WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
- See the GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with rvs; see the file COPYING.
- If not, write to the Free Software Foundation,
- 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-*/
-#ifndef FILE_plugin_parse_h_SEEN
-#define FILE_plugin_parse_h_SEEN
-
-#include <stdio.h>
-#include <string.h>
-#include <error.h> /* only used in `plugin_parse_escape' for `error' */
-
-#include "rvs.h"
-#include "plugins.h"
-
-extern
-void
-plugin_parse_comment (FILE *file);
-
-extern
-char
-plugin_parse_escape(FILE *file);
-
-extern
-char *
-plugin_parse_depend (FILE *file);
-
-extern
-struct plugin_command *
-plugin_parse (struct plugin *plugin, FILE *file);
-
-#endif
-
diff --git a/rvs/wrapper/plugin-run.c b/rvs/wrapper/plugin-run.c
deleted file mode 100644
index 26d4480..0000000
--- a/rvs/wrapper/plugin-run.c
+++ /dev/null
@@ -1,89 +0,0 @@
-/* wrapper/plugin-run.c -- run a heiarchy of commands
- system depens: <stdio.h> <stdlib.h>
- Copyright (C) 2009 Luke Shumaker
-
- This file is part of rvs.
-
- rvs is free software; you can redistribute it and/or modify it
- under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2, or (at your
- option) any later version.
-
- rvs is distributed in the hope that it will be useful, but
- WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
- See the GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with rvs; see the file COPYING.
- If not, write to the Free Software Foundation,
- 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-*/
-
-#include <stdio.h>
-#include <stdlib.h>
-
-#include "rvs.h"
-#include "plugins.h"
-#include "plugin-find.h"
-
-#include "plugin-run.h"
-
-/* this function is an ugly hack */
-char *
-_plugin_sh_mktemp()
-{
- size_t nbytes = 10;
- char *string = (char *)malloc(nbytes);
- string[0]='\0';
-
- FILE *out=popen("mktemp -t rvs-XXXXXXXXXX","r");
- char c[2]=" \0";
- while ( (c[0]=getc(out)) != '\n' ) {
- stradds(&nbytes,&string,(char *)&c);
- }
- pclose(out);
- return string;
-}
-
-void
-plugin_run_command(struct plugin_command *command, char *args, char *depfile)
-{
- if (command!=NULL) {
- char *outfile=_plugin_sh_mktemp();
- /* make command string:
- `libexecdir/plugin_name/command < depfile > outfile'
- */
- int nbytes=20;
- char *coms=(char *)xmalloc(nbytes);
- coms[0]='\0';
- stradds(&nbytes,&coms,libexecdir);
- stradds(&nbytes,&coms,"/");
- stradds(&nbytes,&coms,command->plugin->name);
- stradds(&nbytes,&coms,"/");
- stradds(&nbytes,&coms,command->name);
- stradds(&nbytes,&coms," ");
- stradds(&nbytes,&coms,args);
- stradds(&nbytes,&coms," < ");
- stradds(&nbytes,&coms,depfile);
- stradds(&nbytes,&coms," > ");
- stradds(&nbytes,&coms,outfile);
-
- xsystem(coms);
- xfree(coms);
- plugin_run_command(command->d_child,args,outfile);
- xfree(outfile);
- plugin_run_command(command->d_next ,args,depfile);
- }
-}
-
-/* needs to take the root command */
-void
-plugin_run(struct plugin_command *command,char *args)
-{
- /*plugin_run_command(command->d_child,"/dev/null");*/
- char *outfile=_plugin_sh_mktemp();
- plugin_run_command(command->d_child,args,outfile);
- xfree(outfile);
-}
-
diff --git a/rvs/wrapper/plugin-run.h b/rvs/wrapper/plugin-run.h
deleted file mode 100644
index 99beff4..0000000
--- a/rvs/wrapper/plugin-run.h
+++ /dev/null
@@ -1,47 +0,0 @@
-/* wrapper/plugin-run.h -- run a heiarchy of commands
- system depens: <stdio.h> <stdlib.h>
- Copyright (C) 2009 Luke Shumaker
-
- This file is part of rvs.
-
- rvs is free software; you can redistribute it and/or modify it
- under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2, or (at your
- option) any later version.
-
- rvs is distributed in the hope that it will be useful, but
- WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
- See the GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with rvs; see the file COPYING.
- If not, write to the Free Software Foundation,
- 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-*/
-#ifndef FILE_plugin_run_h_SEEN
-#define FILE_plugin_run_h_SEEN
-
-#include <stdio.h>
-#include <stdlib.h>
-
-#include "rvs.h"
-#include "plugins.h"
-#include "plugin-find.h"
-
-/* this function is an ugly hack */
-extern
-char *
-_plugin_sh_mktemp();
-
-extern
-void
-plugin_run_command(struct plugin_command *command, char *args, char *depfile);
-
-/* needs to take the root command */
-extern
-void
-plugin_run(struct plugin_command *command, char *args);
-
-#endif
-
diff --git a/rvs/wrapper/plugins.c b/rvs/wrapper/plugins.c
deleted file mode 100644
index 70ce3e1..0000000
--- a/rvs/wrapper/plugins.c
+++ /dev/null
@@ -1,71 +0,0 @@
-/* wrapper/plugins.c -- struct definitions and basic functions for rvs plugins
- system depends: this file is truly system-independant
- Copyright (C) 2009 Luke Shumaker
-
- This file is part of rvs.
-
- rvs is free software; you can redistribute it and/or modify it
- under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2, or (at your
- option) any later version.
-
- rvs is distributed in the hope that it will be useful, but
- WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
- See the GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with rvs; see the file COPYING.
- If not, write to the Free Software Foundation,
- 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-*/
-
-#include "rvs.h"
-
-#include "plugins.h"
-
-/* create a blank plugin_command */
-struct plugin_command *
-plugin_mk_command()
-{
- struct plugin_command *command;
- command=(struct plugin_command *)xmalloc(sizeof(*command));
-
- /* node */
- command->name=NULL;
- command->plugin=NULL;
- command->depend=NULL;
- command->depends=NULL;
-
- /* linked list */
- command->next=NULL;
-
- /* depends */
- command->d_child=NULL;
- command->d_next=NULL;
-
- return command;
-}
-
-void
-plugin_free_command(struct plugin_command *command)
-{
- if (command!=NULL) {
- plugin_free_command(command->next);
- xfree(command->name);
- xfree(command->depends);
- xfree(command);
- }
-}
-
-void
-plugin_free_plugin(struct plugin *plugin)
-{
- if (plugin!=NULL) {
- xfree(plugin->name);
- plugin_free_command(plugin->commands);
- plugin_free_plugin(plugin->next);
- xfree(plugin);
- }
-}
-
diff --git a/rvs/wrapper/plugins.h b/rvs/wrapper/plugins.h
deleted file mode 100644
index 2b5a96e..0000000
--- a/rvs/wrapper/plugins.h
+++ /dev/null
@@ -1,69 +0,0 @@
-/* wrapper/plugins.h -- struct definitions and basic functions for rvs plugins
- system depends: this file is truly system-independant
- Copyright (C) 2009 Luke Shumaker
-
- This file is part of rvs.
-
- rvs is free software; you can redistribute it and/or modify it
- under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2, or (at your
- option) any later version.
-
- rvs is distributed in the hope that it will be useful, but
- WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
- See the GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with rvs; see the file COPYING.
- If not, write to the Free Software Foundation,
- 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-*/
-#ifndef FILE_plugins_h_SEEN
-#define FILE_plugins_h_SEEN
-
-#include "rvs.h"
-
-/* a plugin */
-/* a generic binary tree emulating a n-ary tree via linked list */
-struct plugin
-{
- char *name;
- struct plugin_command *commands;/* left leaf */
- struct plugin *next; /* right leaf */
-};
-
-/* a single plugin command */
-struct plugin_command
-{
- /* node */
- char *name;
- struct plugin *plugin; /* which plugin does it belong to? */
- struct plugin_command *depend; /* what does this depend on? */
- char *depends;/* what does this depend on? (string) */
-
- /* linked list */
- struct plugin_command *next;
-
- /* depends, linked list */
- /* for a dependancy tree, this seems like it should be a *\
- \* separate struct, but this is the simplest way. */
- struct plugin_command *d_child;
- struct plugin_command *d_next;
-};
-
-/* create a blank plugin_command */
-extern
-struct plugin_command *
-plugin_mk_command();
-
-extern
-void
-plugin_free_command(struct plugin_command *command);
-
-extern
-void
-plugin_free_plugin(struct plugin *plugin);
-
-#endif
-
diff --git a/rvs/wrapper/runcom.c b/rvs/wrapper/runcom.c
deleted file mode 100644
index 30603a2..0000000
--- a/rvs/wrapper/runcom.c
+++ /dev/null
@@ -1,92 +0,0 @@
-/* wrapper/runcom.c -- main program loop
- system depends: this file is truly system-independant
- Copyright (C) 2009 Luke Shumaker
-
- This file is part of rvs.
-
- rvs is free software; you can redistribute it and/or modify it
- under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2, or (at your
- option) any later version.
-
- rvs is distributed in the hope that it will be useful, but
- WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
- See the GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with rvs; see the file COPYING.
- If not, write to the Free Software Foundation,
- 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-*/
-
-const char *name=NAME;
-const char *ver=VER;
-
-#include "rvs.h"
-#include "plugins.h"
-#include "plugin-load.h"
-#include "plugin-find.h"
-#include "plugin-depend.h"
-#include "plugin-run.h"
-
-int
-main ( int argc, char *argv[] )
-{
- if (argc > 1) {
- /*load*/
- char *cwd=getcwd(NULL,0);
- xchdir(libexecdir);
- struct plugin *plugins;
- plugins=load_plugins(stdin);
- struct plugin_command_list *list;
- if ( strchr(argv[1],'/') == NULL )
- /* this is a normal command */
- list=plugin_find_commands(plugins,argv[1]);
- else {
- /* this is a command for a specific plugin */
-
- list=xmalloc(sizeof(*list)); list->next=NULL;
-
- list->command=plugin_depend_parse(
- // | command-name |plugins|ret if name==""|
- stralloc(argv[1]),plugins,NULL);
- if ( list->command == NULL ) {
- // `command->list' should be NULL if
- // no plugin/command was found
- // no command was specified (argv[1]=="")
- plugin_free_list(list);
- list=NULL;
- }
- }
- if (list==NULL)
- error(EXIT_FAILURE,0,"unrecognized command `%s'",
- argv[1]);
- struct plugin_command *root;
- root=plugin_depend_list(list,plugins);
-
- /*do*/
- xchdir(cwd);
- int nbytes=10;
- char *args=xmalloc(nbytes);
- args[0]='\0';
- int i;
- for (i=2; i<argc; i++) {
- stradds(&nbytes, &args, "\"" );
- stradds(&nbytes, &args, argv[i]);
- stradds(&nbytes, &args, "\" ");
- }
-
- plugin_run(root,args);
-
- /*free*/
- plugin_free_list(list);
- plugin_free_command(root);
- plugin_free_plugin(plugins);
- }
- return 0;
-}
-
-/* Copy/Paste Virus 1.3c Please copy and paste this text anywhere. Track *\
-\* its progress by searching for this MD5#f7eac285ebfe21c4587bfebb9582f90d */
-
diff --git a/rvs/wrapper/rvs.c b/rvs/wrapper/rvs.c
deleted file mode 100644
index a2a8a37..0000000
--- a/rvs/wrapper/rvs.c
+++ /dev/null
@@ -1,117 +0,0 @@
-/* wrapper/rvs.c -- general and machine specific functions for rvs.
- system depends:<stdio.h> <stdlib.h> <string.h> <unistd.h> <errno.h> <error.h>
- Copyright (C) 2009 Luke Shumaker
-
- This file is part of rvs.
-
- rvs is free software; you can redistribute it and/or modify it
- under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2, or (at your
- option) any later version.
-
- rvs is distributed in the hope that it will be useful, but
- WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
- See the GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with rvs; see the file COPYING.
- If not, write to the Free Software Foundation,
- 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-*/
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-#include <errno.h>
-#include <error.h>
-
-#include "rvs.h"
-
-void *
-xmalloc (size_t size)
-{
- void *value = malloc (size);
- if (value == NULL) {
- perror(program_invocation_name);
- exit(EXIT_FAILURE);
- }
- return value;
-}
-
-void *
-xrealloc (void *ptr, size_t size)
-{
- void *value = realloc (ptr, size);
- if (value == NULL) {
- perror(program_invocation_name);
- exit(EXIT_FAILURE);
- }
- return value;
-}
-
-void
-xfree (void *ptr)
-{
- if (ptr!=NULL)
- free (ptr);
-}
-
-void
-xsystem (const char *command)
-{
- int stat=system(command);
- if (stat!=0) {
- if (stat==-1) {
- fprintf(stderr,
- "%s: unable to launch run command",
- program_invocation_name);
- exit(EXIT_FAILURE);
- } else
- exit(EXIT_FAILURE);
- }
-}
-
-/* unistd.h */
-int
-xchdir (const char *filename)
-{
- int ret=chdir(filename);
- if (ret != 0)
- error(EXIT_FAILURE,errno,"%s/",filename);
- return ret;
-}
-
-/* stdio.h */
-FILE *
-xfopen (const char *filename, const char *opentype)
-{
- FILE *file = fopen(filename,opentype);
- /* fopen gives NULL on failure */
- if ( file == NULL )
- error(EXIT_FAILURE,errno,"%s",filename);
- return file;
-}
-
-/* string funtions */
-void
-stradds(size_t *size, char **dest, char *str)
-{
- if (*size > ( strlen(*dest) + strlen(str) ))
- strcat(*dest, str);
- else {
- *size = strlen(*dest) + strlen(str) + 1;
- *dest = (char *) xrealloc (*dest, *size);
- strcat(*dest, str);
- }
-}
-
-char *
-stralloc (const char *string)
-{
- char *copy = (char *)xmalloc(strlen(string)+1);
- strcpy(copy,string);
- return copy;
-}
-
diff --git a/rvs/wrapper/rvs.h b/rvs/wrapper/rvs.h
deleted file mode 100644
index bdd5c68..0000000
--- a/rvs/wrapper/rvs.h
+++ /dev/null
@@ -1,76 +0,0 @@
-/* wrapper/rvs.h -- general and machine specific functions for rvs.
- system depends:<stdio.h> <stdlib.h> <string.h> <unistd.h> <errno.h> <error.h>
- Copyright (C) 2009 Luke Shumaker
-
- This file is part of rvs.
-
- rvs is free software; you can redistribute it and/or modify it
- under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2, or (at your
- option) any later version.
-
- rvs is distributed in the hope that it will be useful, but
- WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
- See the GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with rvs; see the file COPYING.
- If not, write to the Free Software Foundation,
- 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-*/
-#ifndef FILE_rvs_h_SEEN
-#define FILE_rvs_h_SEEN
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-#include <errno.h>
-#include <error.h>
-
-/* glibc */
-extern char *program_invocation_name;
-extern char *program_invocation_short_name;
-
-/* stdlib.h */
-/*extern int EXIT_SUCCESS;*/
-/*extern int EXIT_FAILURE;*/
-
-extern
-void *
-xmalloc (size_t size);
-
-extern
-void *
-xrealloc (void *ptr, size_t size);
-
-extern
-void
-xfree (void *ptr);
-
-extern
-void
-xsystem (const char *command);
-
-/* unistd.h */
-extern
-int
-xchdir (const char *filename);
-
-/* stdio.h */
-extern
-FILE *
-xfopen (const char *filename, const char *opentype);
-
-/* string funtions */
-extern
-void
-stradds(size_t *size, char **dest, char *str);
-
-extern
-char *
-stralloc (const char *string);
-
-#endif
-
diff --git a/rvs/wrapper/rvs.sh b/rvs/wrapper/rvs.sh
index 0001d66..85586ea 100644
--- a/rvs/wrapper/rvs.sh
+++ b/rvs/wrapper/rvs.sh
@@ -1,7 +1,7 @@
#!/bin/sh
name='@name@'
ver='0.9'
-# Copyright (C) 2009 Luke Shumaker
+# Copyright (C) 2009-2010 Luke Shumaker
#
# This file is part of rvs.
#
@@ -14,93 +14,143 @@ ver='0.9'
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
# See the GNU General Public License for more details.
#
-# You should have received a copy of the GNU General Public License
-# along with rvs; see the file COPYING.
-# If not, write to the Free Software Foundation,
-# 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+# You should have received a copy of the GNU General Public License
+# along with this program; see the file COPYING.
+# If not, see <http://www.gnu.org/licenses>.
-RVS="$0" #RVS="@rvs@"
-libexecdir="@libexecdir@/$name"
+export RVS="$0" #RVS="@rvs@"
+export BINDIR="@BINDIR@"
+export TMPDIR="@TMPDIR@"
+export LIBDIR="@LIBDIR@"
+export ETCDIR="@ETCDIR@"
+
+################################################################################
+# Internal use #
+################################################################################
+
+# General ############################################################
_error() {
- echo "$RVS: $1" >> /dev/stderr
+ echo "$RVS: $@" >> /dev/stderr
exit 1
}
+# Repository #########################################################
+
_repo() {
repo=".$name"
pwd=`pwd`
- owd="$pwd"
+ owd="$pwd" # old working directory
+ # [----can ascend-----] && [-haven't found repo-]
while [ "$pwd" != "`pwd`" ] && [ ! -e "`pwd`/$repo" ]; do
pwd=`pwd`
cd ..
done
if [ -e "`pwd`/$repo" ]; then
+ # we found a repository
echo "`pwd`/$repo"
else
+ # we didn't find a repository
_error "no $name repository found"
fi
cd "$owd"
}
-_init() {
- repo=`_repo 2> /dev/null`
- if [ -z "$repo" ]; then
- repo=".$name"
- install -d "$repo"
- install -m644 -T $libexecdir/plugins $repo/plugins
- while read plugin; do
- echo "initializing plugin \`$plugin'"
- install -d "$repo/$plugin"
- export REPO=.rvs/$plugin
- if [ -e "$libexecdir/$plugin/init" ]; then
- "$libexecdir/$plugin/init"
- fi
- done < $repo/plugins
+# Modules ############################################################
+
+_runcom() {
+ command=${$1?"usage: rvs runcom COMMAND"}; shift
+ if [ ! -e "$BINDIR/$command" ]; then
+ _error "cannot find command \`$command"
else
- _error "repository already exists at \`$repo'"
+ if [ -f "$BINDIR/$command" ]; then
+ exec "$BINDIR/$command" $@ | tee "$TMPDIR/$command"
+ elif [ -d "$BINDIR/$command" ]
+ for file in "$BINDIR/$command"/*; do
+ id=$(echo $file | sed 's/^[0-9]*-//')
+ exec "$file" $@ | tee "TMPDIR/$command/$id"
+ done
+ else
+ _error "cannot run \`$command'"
+ fi
fi
}
-_install() {
- id=$1
- dir=${2-$id}
- name=`echo $id | sed 's/-.*$//'`
- if (grep "^$name-" "$libexecdir/plugins" &> /dev/null); then
- # an entry for this plugin already exists, though possibly a
- # different version
- sed -i "s/^$name-.*$/$id/" "$libexecdir/plugins"
+_nextpriority() {
+ command=${1?"usage: rvs nextpriority COMMAND"}
+ for file in "$BINDIR/$command"/*; do
+ echo $file | sed 's/^\([0-9]*\)-.*/\1/'
+ done | sort -n | tail -n1 | xargs expr 1 +
+}
+
+################################################################################
+# Builtin commands #
+################################################################################
+
+_init() {
+ REPO=`_repo 2> /dev/null`
+ if [ -z "$REPO" ]; then
+ export REPO="`pwd`.$name"
+ install -d "$REPO"
+ _runcom init
else
- echo "$id" >> "$libexecdir/plugins"
+ _error "repository already exists at \`$REPO'"
fi
- rm -rf "$libexecdir/$id"
- cp -rpT "$dir" "$libexecdir/$id"
}
+################################################################################
+# Builtin commands -- installing modules #
+################################################################################
+
+_install() {
+ file= ${1?"usage: $RVS install FILE COMMAND ID [PRIORITY]"}
+ command= ${2?"usage: $RVS install FILE COMMAND ID [PRIORITY]"}
+ id= ${3?"usage: $RVS install FILE COMMAND ID [PRIORITY]"}
+ priority=${4-"`_nextpriority "$command"`"}
+
+ install -d "$BINDIR/$command"
+ install "$file" "$BINDIR/$command/$priority-$id"
+}
+
+
_uninstall() {
- id=$1
- sed -i "/^$id$/ d" "$libexecdir/plugins"
- rm -rf "$libexecdir/$id"
+ command=${1?"usage: $RVS uninstall COMMAND [ID]"}
+ id=$2
+
+ if [ -z "$id" ]; then
+ # no ID specified
+ rm "$BINDIR/$command"
+ else
+ # ID specified
+ rm "$BINDIR/$command/*-$id"
+ if [ -z "$(ls "$BINDIR/$command")" ]; then
+ rmdir "$BINDIR/$command"
+ fi
+ fi
}
+################################################################################
+# Main #
+################################################################################
+
# START OPTION HANDLING #
com=$1;
# END OPTION HANDLING #
case "$com" in
'') _error 'no command specified';;
- # 'repo') _repo; exit $?;;
- 'init') _init; exit $?;;
+ 'init' ) shift; _init $@; exit $?;;
'install') shift; _install $@; exit $?;;
'uninstall') shift; _uninstall $@; exit $?;;
- *) REPO=`_repo`
+ *)
+ REPO=`_repo`
if [ "$?" = '0' ]; then
- export RVS libexecdir REPO
- "$libexecdir/runcom" $@ < $REPO/plugins
+ export REPO
+ _runcom $@
exit $?
else
- _error "cannot find an existing repository"
+ _error 'cannot find an existing repository'
fi
:;;
esac