Git.pm: Handle failed commands' output
[gitweb.git] / perl / Git.xs
index 9e754d25385f80dd402c61ea9c05e00cc5aa8b74..9d247b7130dee4582b4b7358c1b229576a68ac1e 100644 (file)
@@ -8,6 +8,8 @@
 #include "../cache.h"
 #include "../exec_cmd.h"
 
+#define die perlyshadow_die__
+
 /* XS and Perl interface */
 #include "EXTERN.h"
 #include "perl.h"
 
 #include "ppport.h"
 
+#undef die
+
+
+static char *
+report_xs(const char *prefix, const char *err, va_list params)
+{
+       static char buf[4096];
+       strcpy(buf, prefix);
+       vsnprintf(buf + strlen(prefix), 4096 - strlen(prefix), err, params);
+       return buf;
+}
+
+void
+die_xs(const char *err, va_list params)
+{
+       char *str;
+       str = report_xs("fatal: ", err, params);
+       croak(str);
+}
+
+int
+error_xs(const char *err, va_list params)
+{
+       char *str;
+       str = report_xs("error: ", err, params);
+       warn(str);
+       return -1;
+}
+
 
 MODULE = Git           PACKAGE = Git
 
 PROTOTYPES: DISABLE
 
+
+BOOT:
+{
+       set_error_routine(error_xs);
+       set_die_routine(die_xs);
+}
+
+
 # /* TODO: xs_call_gate(). See Git.pm. */
 
 
+const char *
+xs_version()
+CODE:
+{
+       RETVAL = GIT_VERSION;
+}
+OUTPUT:
+       RETVAL
+
+
 const char *
 xs_exec_path()
 CODE:
@@ -33,6 +82,28 @@ OUTPUT:
        RETVAL
 
 
+void
+xs__execv_git_cmd(...)
+CODE:
+{
+       const char **argv;
+       int i;
+
+       argv = malloc(sizeof(const char *) * (items + 1));
+       if (!argv)
+               croak("malloc failed");
+       for (i = 0; i < items; i++)
+               argv[i] = strdup(SvPV_nolen(ST(i)));
+       argv[i] = NULL;
+
+       execv_git_cmd(argv);
+
+       for (i = 0; i < items; i++)
+               if (argv[i])
+                       free((char *) argv[i]);
+       free((char **) argv);
+}
+
 char *
 xs_hash_object(file, type = "blob")
        SV *file;