summaryrefslogtreecommitdiff
path: root/Master/tlpkg/dev
diff options
context:
space:
mode:
authorNorbert Preining <preining@logic.at>2011-05-14 00:51:28 +0000
committerNorbert Preining <preining@logic.at>2011-05-14 00:51:28 +0000
commit81f299adf44799e1d7c9bf0f952fa41a17f009f4 (patch)
treeca6a9526952272abd8405b4d9041422367c2737f /Master/tlpkg/dev
parentce4b1c2e116b95a4848520bd47a975586eabba3a (diff)
move lib from dev to archive, is is horribly outdated
git-svn-id: svn://tug.org/texlive/trunk@22471 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/tlpkg/dev')
-rw-r--r--Master/tlpkg/dev/lib/C/Makefile7
-rw-r--r--Master/tlpkg/dev/lib/C/tlp-config.c75
-rw-r--r--Master/tlpkg/dev/lib/C/tlp-config.h23
-rw-r--r--Master/tlpkg/dev/lib/C/tlp-src.c321
-rw-r--r--Master/tlpkg/dev/lib/C/tlp-src.h75
-rw-r--r--Master/tlpkg/dev/lib/C/tlp-utils.c182
-rw-r--r--Master/tlpkg/dev/lib/C/tlp-utils.h73
-rw-r--r--Master/tlpkg/dev/lib/bash/TeXLiveInfra.sh261
-rw-r--r--Master/tlpkg/dev/lib/python/TeXLive.py1744
9 files changed, 0 insertions, 2761 deletions
diff --git a/Master/tlpkg/dev/lib/C/Makefile b/Master/tlpkg/dev/lib/C/Makefile
deleted file mode 100644
index 396b9744290..00000000000
--- a/Master/tlpkg/dev/lib/C/Makefile
+++ /dev/null
@@ -1,7 +0,0 @@
-CFLAGS = -Wall -I.
-SO = dylib
-
-all: libtlp.$(SO)
-
-libtlp.$(SO): tlp-src.o tlp-config.o tlp-utils.o
- $(CC) $^ -dynamiclib -o $@
diff --git a/Master/tlpkg/dev/lib/C/tlp-config.c b/Master/tlpkg/dev/lib/C/tlp-config.c
deleted file mode 100644
index 5633db611dd..00000000000
--- a/Master/tlpkg/dev/lib/C/tlp-config.c
+++ /dev/null
@@ -1,75 +0,0 @@
-/* tlp-config.c - module exporting configuration stuff
- *
- * Copyright 2007 Jjgod Jiang
- * Derived from the Perl implementation by Norbert Preining
- *
- * This file is licensed under the GNU General Public License version 2
- * or any later version. */
-
-#include <tlp-utils.h>
-#include <stdlib.h>
-
-#define TLP_META_CATEGORIES "Collection", "Scheme"
-#define TLP_NORMAL_CATEGORIES "Package", "TLCore", "Documentation"
-#define TLP_DEFAULT_CATEGORY "Package"
-
-const char *_tlp_meta_categories[] = {
- TLP_META_CATEGORIES,
-};
-
-const char *_tlp_normal_categories[] = {
- TLP_NORMAL_CATEGORIES,
-};
-
-const char *_tlp_categories[] = {
- TLP_META_CATEGORIES,
- TLP_NORMAL_CATEGORIES,
-};
-
-tlp_str_list *tlp_meta_categories;
-tlp_str_list *tlp_normal_categories;
-tlp_str_list *tlp_categories;
-tlp_str tlp_default_category;
-
-#define ARR_SIZE(arr) (sizeof(arr) / sizeof(arr[0]))
-
-/* TODO: we might have more complicated implementation later. */
-tlp_result tlp_config_init()
-{
- tlp_meta_categories = tlp_str_list_from_array(_tlp_meta_categories);
- if (tlp_meta_categories == NULL)
- goto failed1;
-
- tlp_normal_categories = tlp_str_list_from_array(_tlp_normal_categories);
- if (tlp_normal_categories == NULL)
- goto failed2;
-
- tlp_categories = tlp_str_list_from_array(_tlp_categories);
- if (tlp_categories == NULL)
- goto failed3;
-
- tlp_default_category = tlp_str_from_bytes(TLP_DEFAULT_CATEGORY);
- if (tlp_default_category == NULL)
- goto failed4;
-
- return TLP_OK;
-
-failed4:
- tlp_str_list_free(tlp_categories);
-failed3:
- tlp_str_list_free(tlp_normal_categories);
-failed2:
- tlp_str_list_free(tlp_meta_categories);
-failed1:
- return TLP_FAILED;
-}
-
-void tlp_config_free()
-{
- tlp_str_list_free(tlp_meta_categories);
- tlp_str_list_free(tlp_normal_categories);
- tlp_str_list_free(tlp_categories);
-
- tlp_str_free(tlp_default_category);
-}
-
diff --git a/Master/tlpkg/dev/lib/C/tlp-config.h b/Master/tlpkg/dev/lib/C/tlp-config.h
deleted file mode 100644
index c00e2143c84..00000000000
--- a/Master/tlpkg/dev/lib/C/tlp-config.h
+++ /dev/null
@@ -1,23 +0,0 @@
-/* tlp-config.c - header exporting configuration stuff
- *
- * Copyright 2007 Jjgod Jiang
- * Derived from the Perl implementation by Norbert Preining
- *
- * This file is licensed under the GNU General Public License version 2
- * or any later version. */
-
-#ifndef __TLP_CONFIG__
-#define __TLP_CONFIG__
-
-/* We use the following pointers to encapsulate the real config module
- * implementation: we could use static allocated arrays, or we could
- * use dynamic allocated ones, as long as we follow the rule (put a
- * NULL pointer at the end of it), internal implementation does not
- * matter. */
-
-extern tlp_str_list tlp_meta_categories;
-extern tlp_str_list tlp_normal_categories;
-extern tlp_str_list tlp_categories;
-
-#endif
-
diff --git a/Master/tlpkg/dev/lib/C/tlp-src.c b/Master/tlpkg/dev/lib/C/tlp-src.c
deleted file mode 100644
index a67aacbb74f..00000000000
--- a/Master/tlpkg/dev/lib/C/tlp-src.c
+++ /dev/null
@@ -1,321 +0,0 @@
-/* tlp-src.c - module for using tlpsrc files
- *
- * Copyright 2007 Jjgod Jiang
- * Derived from the Perl implementation by Norbert Preining
- *
- * This file is licensed under the GNU General Public License version 2
- * or any later version. */
-
-#include <tlp-src.h>
-#include <stdio.h>
-
-/* internal function prototypes {{{ */
-
-tlp_result tlp_src_process_line(tlp_src *src, tlp_str line,
- int *started, int *finished,
- const char *file);
-
-tlp_result tlp_str_get_word(tlp_str str, tlp_str word, int max);
-
-tlp_result tlp_src_get_name(tlp_str line,
- tlp_src *src,
- int *started,
- const char *file);
-
-tlp_result tlp_src_get_category(tlp_str line,
- tlp_src *src,
- int *started,
- const char *file);
-
-/* }}} */
-
-/* internal data structures {{{ */
-
-struct tlp_src_field {
- const char *key;
- tlp_result (*func)(tlp_str line,
- tlp_src *src,
- int *started,
- const char *file);
-};
-
-/* for lines start with "name", we use function tlp_src_get_name() to
- * process it, and feed it with the current tlp_src instance. */
-
-struct tlp_src_field tlp_src_fields[] = {
- { "name", tlp_src_get_name },
- { "category", tlp_src_get_category }, /*
- { "shortdesc", tlp_src_get_shortdesc },
- { "longdesc", tlp_src_get_longdesc },
- { "catalogue", tlp_src_get_catalogue },
-
- { "runpatterns", tlp_src_get_runpatterns },
- { "srcpatterns", tlp_src_get_srcpatterns },
- { "docpatterns", tlp_src_get_docpatterns },
- { "binpatterns", tlp_src_get_binpatterns },
-
- { "execute", tlp_src_get_execute },
- { "depend", tlp_src_get_depend }, */
-};
-
-#define TLP_SRC_TOTAL_FIELDS (sizeof(tlp_src_fields) / sizeof(tlp_src_fields[0]))
-
-/* }}} */
-
-/* tlp_src related {{{ */
-
-tlp_src *tlp_src_new(tlp_str name,
- tlp_str category,
- tlp_str shortdesc,
- tlp_str longdesc,
- tlp_str catalogue,
- tlp_pattern *runpatterns,
- tlp_pattern *srcpatterns,
- tlp_pattern *docpatterns,
- tlp_pattern *binpatterns,
- tlp_execute *executes,
- tlp_depend *depends)
-{
- tlp_src *src = tlp_new(tlp_src);
- if (! src)
- return NULL;
-
- src->name = tlp_str_copy(name);
- src->category = tlp_str_copy(category);
- src->shortdesc = tlp_str_copy(shortdesc);
- src->longdesc = tlp_str_copy(longdesc);
- src->catalogue = tlp_str_copy(catalogue);
-
- src->runpatterns = runpatterns;
- src->srcpatterns = srcpatterns;
- src->docpatterns = docpatterns;
- src->binpatterns = binpatterns;
-
- src->executes = executes;
- src->depends = depends;
-
- return src;
-}
-
-void tlp_src_free(tlp_src *src)
-{
- if (! src)
- return;
-
- tlp_str_free(src->name);
- tlp_str_free(src->category);
- tlp_str_free(src->shortdesc);
- tlp_str_free(src->longdesc);
- tlp_str_free(src->catalogue);
-
- tlp_patterns_free(src->runpatterns);
- tlp_patterns_free(src->srcpatterns);
- tlp_patterns_free(src->docpatterns);
- tlp_patterns_free(src->binpatterns);
-
- tlp_executes_free(src->executes);
- tlp_depends_free(src->depends);
-
- free(src);
- src = NULL;
-}
-
-tlp_src *tlp_src_from_file(char *file)
-{
- FILE *fp;
- tlp_src *src;
- tlp_char line[TLP_SRC_LINE_MAX];
- int started, finished;
-
- fp = fopen(file, "r");
- if (! fp)
- return NULL;
-
- src = tlp_new(tlp_src);
-
- /* TODO: if the argument is not readable as is, try looking
- * for it in the hierarchy where we are.*/
- if (! src)
- return NULL;
-
- started = finished = 0;
-
- while (tlp_fgets(line, TLP_SRC_LINE_MAX, fp))
- {
- if (tlp_src_process_line(src, line,
- &started,
- &finished,
- file) != TLP_OK)
- goto failed;
- }
-
- fclose(fp);
- return src;
-
-failed:
- tlp_src_free(src);
- fclose(fp);
- return NULL;
-}
-
-tlp_result tlp_src_process_line(tlp_src *src, tlp_str line,
- int *started, int *finished,
- const char *file)
-{
- int i;
-
- /* skip all leading spaces */
- for (i = 0; tlp_char_is_space(line[i]); i++)
- ;
-
- /* skip comment lines */
- if (line[i] == TLP_CHAR_COMMENT)
- return TLP_OK;
-
- if (tlp_char_is_eol(line[i]))
- {
- if (! *started || *finished)
- return TLP_OK;
-
- tlp_error_msg("%s: empty line not allowed in tlpsrc\n", file);
- return TLP_FAILED;
- }
-
- /* something like " name ..." is not allowed */
- if (line[0] == ' ')
- {
- tlp_error_msg("%s: continuation line not allowed in tlpsrc: ", file);
- tlp_error_str(line);
-
- return TLP_FAILED;
- }
-
- for (i = 0; i < TLP_SRC_TOTAL_FIELDS; i++)
- if (tlp_str_start_with_bytes(line, tlp_src_fields[i].key))
- return tlp_src_fields[i].func(line, src, started, file);
-
- tlp_error_msg("%s: unknown tlpsrc directive, please fix: %s",
- file, line);
- return TLP_OK;
-}
-
-tlp_result tlp_src_get_name(tlp_str line,
- tlp_src *src,
- int *started,
- const char *file)
-{
- tlp_char name[TLP_SRC_NAME_MAX];
-
- if (*started)
- {
- tlp_error_msg("%s: tlpsrc cannot have two name directives", file);
- return TLP_FAILED;
- }
-
- if (tlp_str_get_word(line + tlp_str_len(TLP_STR("name")),
- name, TLP_SRC_NAME_MAX) == TLP_OK)
- {
- src->name = tlp_str_copy(name);
- *started = 1;
-
- return TLP_OK;
- }
- else
- return TLP_FAILED;
-}
-
-tlp_result tlp_src_get_category(tlp_str line,
- tlp_src *src,
- int *started,
- const char *file)
-{
- if (! *started)
- {
- tlp_error_msg("%s: first tlpsrc directive must be 'name'", file);
- return TLP_FAILED;
- }
-
- return TLP_OK;
-}
-
-/* }}} */
-
-/* tlp_pattern related {{{ */
-
-void tlp_pattern_free(tlp_pattern *pat)
-{
- if (pat != NULL)
- return;
-
- switch (pat->type)
- {
- case TLP_PATTERN_T:
- tlp_str_list_free(pat->u.t);
- break;
-
- case TLP_PATTERN_F:
- tlp_str_free(pat->u.f);
- break;
-
- case TLP_PATTERN_D:
- tlp_str_free(pat->u.d);
- break;
-
- case TLP_PATTERN_R:
- tlp_str_free(pat->u.r);
- break;
- }
-
- free(pat);
- pat = NULL;
-}
-
-void tlp_patterns_free(tlp_pattern *pat)
-{
- tlp_pattern *node = pat, *temp;
-
- while (node != NULL)
- {
- temp = node->next;
- tlp_pattern_free(node);
- node = temp;
- }
-
- pat = NULL;
-}
-
-/* }}} */
-
-/* remaining stuff used in tlp_src processing {{{ */
-
-tlp_result tlp_str_get_word(tlp_str str, tlp_str word, int max)
-{
- int i, j;
-
- /* skip all leading spaces */
- for (i = 0; tlp_char_is_space(str[i]); i++)
- ;
-
- j = 0;
- for (; ! tlp_char_is_eol(str[i]); i++)
- {
- if (str[i] != TLP_CHAR('-') &&
- ! tlp_char_in_word(str[i]))
- return TLP_FAILED;
-
- if (j >= max)
- return TLP_FAILED;
-
- word[j++] = str[i];
- }
-
- if (j == 0)
- return TLP_FAILED;
-
- word[j] = TLP_CHAR_END;
- return TLP_OK;
-}
-
-/* }}} */
-
-/* vim:set ts=4 sts=4 sw=4 expandtab foldmethod=marker: */
diff --git a/Master/tlpkg/dev/lib/C/tlp-src.h b/Master/tlpkg/dev/lib/C/tlp-src.h
deleted file mode 100644
index cf04de32dc7..00000000000
--- a/Master/tlpkg/dev/lib/C/tlp-src.h
+++ /dev/null
@@ -1,75 +0,0 @@
-/* tlp-src.h - header for using tlpsrc files
- *
- * Copyright 2007 Jjgod Jiang
- * Derived from the Perl implementation by Norbert Preining
- *
- * This file is licensed under the GNU General Public License version 2
- * or any later version. */
-
-#ifndef __TLP_SRC__
-#define __TLP_SRC__
-
-#include <tlp-utils.h>
-
-enum tlp_src_limits {
- TLP_SRC_LINE_MAX = 1024,
- TLP_SRC_NAME_MAX = 256,
-};
-
-enum tlp_pattern_type {
- TLP_PATTERN_T, TLP_PATTERN_F,
- TLP_PATTERN_D, TLP_PATTERN_R
-};
-
-typedef struct tlp_pattern {
- enum tlp_pattern_type type;
-
- union {
- tlp_str_list *t;
- tlp_str f;
- tlp_str d;
- tlp_str r;
- } u;
-
- struct tlp_pattern *next;
-} tlp_pattern;
-
-typedef struct tlp_src {
- /* name of the package */
- tlp_str name;
- /* Collection Scheme TLCore Package Documentation */
- tlp_str category;
- /* short one line desc */
- tlp_str shortdesc;
- /* longer multiline dscription */
- tlp_str longdesc;
- /* name of the respective Catalogue entry */
- tlp_str catalogue;
-
- tlp_pattern *runpatterns;
- tlp_pattern *srcpatterns;
- tlp_pattern *docpatterns;
- tlp_pattern *binpatterns;
-
- tlp_execute *executes;
- tlp_depend *depends;
-} tlp_src;
-
-tlp_src *tlp_src_new(tlp_str name,
- tlp_str category,
- tlp_str shortdesc,
- tlp_str longdesc,
- tlp_str catalogue,
- tlp_pattern *runpatterns,
- tlp_pattern *srcpatterns,
- tlp_pattern *docpatterns,
- tlp_pattern *binpatterns,
- tlp_execute *executes,
- tlp_depend *depends);
-
-void tlp_src_free(tlp_src *src);
-void tlp_patterns_free(tlp_pattern *pat);
-void tlp_pattern_free(tlp_pattern *pat);
-
-#endif
-
diff --git a/Master/tlpkg/dev/lib/C/tlp-utils.c b/Master/tlpkg/dev/lib/C/tlp-utils.c
deleted file mode 100644
index 864b7a0597c..00000000000
--- a/Master/tlpkg/dev/lib/C/tlp-utils.c
+++ /dev/null
@@ -1,182 +0,0 @@
-/* tlp-utils.h - module for general tlp utilities
- *
- * Copyright 2007 Jjgod Jiang
- * Derived from the Perl implementation by Norbert Preining
- *
- * This file is licensed under the GNU General Public License version 2
- * or any later version. */
-
-#include <tlp-utils.h>
-#include <string.h>
-#include <stdio.h>
-#include <ctype.h>
-
-tlp_str tlp_str_from_bytes(const char *bytes)
-{
- return (tlp_str) strdup(bytes);
-}
-
-tlp_str tlp_str_copy(tlp_str str)
-{
- if (str == NULL)
- return NULL;
-
- return strdup(str);
-}
-
-void tlp_str_free(tlp_str str)
-{
- free(str);
-}
-
-tlp_str_list *tlp_str_list_new()
-{
- tlp_str_list *list = tlp_new(tlp_str_list);
- if (list == NULL)
- return NULL;
-
- list->head = list->tail = NULL;
- return list;
-}
-
-tlp_str_list *tlp_str_list_from_array(const char *array[])
-{
- tlp_str_list *list = tlp_str_list_new();
- int i, size;
-
- if (list == NULL)
- return NULL;
-
- size = sizeof(array) / sizeof(array[0]);
- for (i = 0; i < size; i++)
- if (tlp_str_list_append_bytes(list, array[i]) != TLP_OK)
- {
- tlp_str_list_free(list);
- return NULL;
- }
-
- return list;
-}
-
-tlp_result tlp_str_list_append(tlp_str_list *list, tlp_str str)
-{
- tlp_str_list_node *node = tlp_new(tlp_str_list_node);
-
- if (node == NULL)
- return TLP_FAILED;
-
- node->str = str;
- node->next = NULL;
-
- if (list->head == NULL)
- list->head = node;
-
- if (list->tail == NULL)
- list->tail = node;
-
- else
- {
- list->tail->next = node;
- list->tail = node;
- }
-
- return TLP_OK;
-}
-
-tlp_result tlp_str_list_append_bytes(tlp_str_list *list, const char *bytes)
-{
- tlp_str str = tlp_str_from_bytes(bytes);
- if (str == NULL)
- return TLP_FAILED;
-
- return tlp_str_list_append(list, str);
-}
-
-void tlp_str_list_free(tlp_str_list *list)
-{
- tlp_str_list_node *node = list->head, *temp;
-
- while (node != NULL)
- {
- temp = node->next;
-
- tlp_str_free(node->str);
- free(node);
-
- node = temp;
- }
-
- free(list);
- list = NULL;
-}
-
-tlp_str tlp_fgets(tlp_str s, int n, FILE *fp)
-{
- return (tlp_str) fgets((char *) s, n, fp);
-}
-
-void tlp_str_output(FILE *fp, tlp_str str)
-{
- fprintf(stderr, "%s", (char *) str);
-}
-
-size_t tlp_str_len(tlp_str str)
-{
- return strlen((const char *) str);
-}
-
-int tlp_str_start_with(tlp_str str, tlp_str prefix)
-{
- int len = tlp_str_len(prefix);
-
- if (tlp_str_len(str) < len)
- return 0;
-
- return strncmp((const char *) str,
- (const char *) prefix, len);
-}
-
-int tlp_str_start_with_bytes(tlp_str str, const char *prefix)
-{
- tlp_str prefix_str;
- int ret;
-
- prefix_str = tlp_str_from_bytes(prefix);
- if (prefix_str == NULL)
- return 0;
-
- ret = tlp_str_start_with(str, prefix_str);
-
- tlp_str_free(prefix_str);
- return ret;
-}
-
-int tlp_char_is_space(tlp_char ch)
-{
- return isspace((int) ch);
-}
-
-int tlp_char_is_eol(tlp_char ch)
-{
- return (ch == '\r' || ch == '\n');
-}
-
-int tlp_char_in_word(tlp_char ch)
-{
- return (isalnum(ch) || ch == '_');
-}
-
-void tlp_error_msg(const char *fmt, ...)
-{
- va_list ap;
-
- va_start(ap, fmt);
- vfprintf(stderr, fmt, ap);
- va_end(ap);
-}
-
-void tlp_error_str(tlp_str str)
-{
- tlp_str_output(stderr, str);
-}
-
diff --git a/Master/tlpkg/dev/lib/C/tlp-utils.h b/Master/tlpkg/dev/lib/C/tlp-utils.h
deleted file mode 100644
index a2332bf8d4f..00000000000
--- a/Master/tlpkg/dev/lib/C/tlp-utils.h
+++ /dev/null
@@ -1,73 +0,0 @@
-/* tlp-utils.h - header for general tlp definitions
- *
- * Copyright 2007 Jjgod Jiang
- * Derived from the Perl implementation by Norbert Preining
- *
- * This file is licensed under the GNU General Public License version 2
- * or any later version. */
-
-#ifndef __TLP_UTILS__
-#define __TLP_UTILS__
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <stdarg.h>
-
-typedef char tlp_char;
-typedef tlp_char *tlp_str;
-
-#define TLP_CHAR(x) ((tlp_char) x)
-
-enum tlp_special_chars {
- TLP_CHAR_COMMENT = TLP_CHAR('#'),
- TLP_CHAR_END = TLP_CHAR('\0'),
-};
-
-typedef struct tlp_str_list_node {
- tlp_str str;
- struct tlp_str_list_node *next;
-} tlp_str_list_node;
-
-typedef struct tlp_str_list {
- struct tlp_str_list_node *head;
- struct tlp_str_list_node *tail;
-} tlp_str_list;
-
-typedef tlp_str_list tlp_execute;
-typedef tlp_str_list tlp_depend;
-
-#define tlp_executes_free(x) tlp_str_list_free(x)
-#define tlp_depends_free(x) tlp_str_list_free(x)
-
-typedef enum tlp_result {
- TLP_FAILED = 0, TLP_OK = 1
-} tlp_result;
-
-#define tlp_new(x) ((x *) malloc(sizeof(x)))
-
-tlp_str tlp_str_from_bytes(const char *bytes);
-tlp_str tlp_str_copy(tlp_str str);
-void tlp_str_free(tlp_str str);
-
-
-tlp_str_list *tlp_str_list_new();
-tlp_str_list *tlp_str_list_from_array(const char *array[]);
-tlp_result tlp_str_list_append(tlp_str_list *list, tlp_str str);
-tlp_result tlp_str_list_append_bytes(tlp_str_list *list, const char *bytes);
-void tlp_str_list_free(tlp_str_list *list);
-
-tlp_str tlp_fgets(tlp_str s, int n, FILE *fp);
-size_t tlp_str_len(tlp_str str);
-void tlp_str_output(FILE *fp, tlp_str str);
-int tlp_str_start_with(tlp_str str, tlp_str prefix);
-int tlp_str_start_with_bytes(tlp_str str, const char *prefix);
-
-int tlp_char_is_space(tlp_char ch);
-int tlp_char_is_eol(tlp_char ch);
-int tlp_char_in_word(tlp_char ch);
-
-void tlp_error_msg(const char *fmt, ...);
-void tlp_error_str(tlp_str str);
-
-#endif
-
diff --git a/Master/tlpkg/dev/lib/bash/TeXLiveInfra.sh b/Master/tlpkg/dev/lib/bash/TeXLiveInfra.sh
deleted file mode 100644
index f3eca766017..00000000000
--- a/Master/tlpkg/dev/lib/bash/TeXLiveInfra.sh
+++ /dev/null
@@ -1,261 +0,0 @@
-# $Id$
-# TeXLiveInfra.sh - shell library for the access to TLDB and TLP
-#
-# Copyright 2007 Norbert Preining
-# This file is licensed under the GNU General Public License version 2
-# or any later version.
-
-die() {
- echo $*
- exit 1
-}
-
-test_tlp() {
- tlpfile="$1"
- if [ ! -r "$tlpfile" ] ; then
- die "tlp file not readable: $tlpfile"
- fi
-}
-
-# we read the whole tlp again and again
-# if we could use some multi-line grepping this could be speed up
-# but I guess we would need perl regexp grepping
-# BETTER: use an awk program for this, but I am not able to write
-# such an awk program. And do we have it available everywhere?
-_tlp_get_multi() {
- entry="$1"
- tlpfile="$2"
- arch="$3"
- test_tlp "$tlpfile"
- ( SAVEDIFS=$IFS ; IFS= ; cat "$tlpfile" | __tlp_get_multi "$entry" "$arch" )
-}
-__tlp_get_multi() {
- entry="$1"
- arch="$2"
- if [ "$arch" = "" ] ; then
- pat="$entry*"
- else
- pat="$entry*arch=$arch*"
- fi
- reading_multi=0
- while read line ; do
- case "$line" in
- $pat)
- reading_multi=1
- ;;
- \ *)
- if [ $reading_multi = 1 ] ; then
- ( IFS=$SAVEDIFS ; echo $line )
- fi
- ;;
- *)
- if [ $reading_multi = 1 ] ; then
- # we already have read the interesting part, return now
- return
- fi
- ;;
- esac
- done
-}
-
-_tlp_get_multi_simple() {
- entry="$1"
- tlpfile="$2"
- test_tlp "$tlpfile"
- grep "^$entry" "$tlpfile" | sed -e "s@^$entry[ \t]*@@"
-}
-
-_tlp_get_simple() {
- entry="$1"
- tlpfile="$2"
- field="$3"
- prefix="$4"
- test_tlp "$tlpfile"
- cat "$tlpfile" | __tlp_get_simple $entry $field $prefix
-}
-
-__tlp_get_simple() {
- entry="$1"
- field="$2"
- prefix="$3"
- if [ "$field" = "" ] ; then
- grep -m 1 "^$entry " | sed -e "s@^$entry[ \t]*@@" | sed -e "s@^$prefix@@"
- else
- grep -m 1 "^$entry " | awk "{print\$${field}}" | sed -e "s@^$prefix@@"
- fi
-}
-
-tlp_get_name()
-{
- _tlp_get_simple name "$1"
-}
-tlp_get_revision()
-{
- _tlp_get_simple revision "$1"
-}
-tlp_get_category ()
-{
- _tlp_get_simple category "$1"
-}
-tlp_get_shortdesc ()
-{
- _tlp_get_simple shortdesc "$1"
-}
-tlp_get_catalogue ()
-{
- _tlp_get_simple catalogue "$1"
-}
-tlp_get_longdesc ()
-{
- _tlp_get_multi longdesc "$1"
-}
-tlp_get_depends ()
-{
- _tlp_get_multi_simple depend "$1"
-}
-tlp_get_executes ()
-{
- _tlp_get_multi_simple execute "$1"
-}
-tlp_get_srcfiles ()
-{
- _tlp_get_multi srcfiles "$1"
-}
-tlp_get_docfiles () {
- _tlp_get_multi docfiles "$1"
-}
-tlp_get_runfiles () {
- _tlp_get_multi runfiles "$1"
-}
-tlp_get_srcsize () {
- _tlp_get_simple srcfiles "$1" 2 "size="
-}
-tlp_get_docsize ()
-{
- _tlp_get_simple docfiles "$1" 2 "size="
-}
-tlp_get_runsize ()
-{
- _tlp_get_simple runfiles "$1" 2 "size="
-}
-
-tlp_get_binsize ()
-{
- tlpfile="$1"
- arch="$2"
- _tlp_get_simple "binfiles[ \t]*arch=$arch" "$1" 3 "size="
-}
-tlp_get_binfiles ()
-{
- _tlp_get_multi binfile "$1" "$2"
-}
-
-tlp_get_available_arch ()
-{
- test_tlp "$tlpfile"
- grep 'binfiles[ \t]*arch=' "$tlpfile" | awk '{print$2}' | sed -e 's/arch=//'
-}
-
-test_tldb() {
- tldbfile="$1"
- if [ ! -r "$tldbfile" ] ; then
- die "tldb file not readable: $tldbfile"
- fi
-}
-
-_tldb_tlp_get_multi()
-{
- tldb="$1"
- tlp="$2"
- entry="$3"
- arch="$4"
- test_tldb "$tldb"
- foundpackage=0
- ( SAVEDIFS=$IFS ; IFS= ; while read line ; do
- case "$line" in
- name\ $tlp*)
- foundpackage=1
- __tlp_get_multi $entry $arch
- ;;
- *)
- if [ $foundpackage = 1 ] ; then
- return
- fi
- ;;
- esac
- done ) <$tldb
-}
-_tldb_tlp_get_simple()
-{
- tldb="$1"
- tlp="$2"
- entry="$3"
- field="$4"
- prefix="$5"
- test_tldb "$tldb"
- foundpackage=0
- ( SAVEDIFS=$IFS ; IFS= ; while read line ; do
- case "$line" in
- name\ $tlp*)
- foundpackage=1
- __tlp_get_simple $entry $field $prefix
- ;;
- *)
- if [ $foundpackage = 1 ] ; then
- return
- fi
- ;;
- esac
- done ) <$tldb
-}
-
-
-tldb_tlp_get_revision()
-{
- _tldb_tlp_get_simple "$1" "$2" revision "$3" "$4"
-}
-tldb_tlp_get_category ()
-{
- _tldb_tlp_get_simple "$1" "$2" category "$3" "$4"
-}
-tldb_tlp_get_shortdesc ()
-{
- _tldb_tlp_get_simple "$1" "$2" shortdesc "$3" "$4"
-}
-tldb_tlp_get_catalogue ()
-{
- _tldb_tlp_get_simple "$1" "$2" catalogue "$3" "$4"
-}
-tldb_tlp_get_longdesc ()
-{
- _tldb_tlp_get_multi "$1" "$2" longdesc "$3"
-}
-tldb_tlp_get_srcfiles ()
-{
- _tldb_tlp_get_multi "$1" "$2" srcfiles "$3"
-}
-tldb_tlp_get_docfiles () {
- _tldb_tlp_get_multi "$1" "$2" docfiles "$3"
-}
-tldb_tlp_get_runfiles () {
- _tldb_tlp_get_multi "$1" "$2" runfiles "$3"
-}
-tldb_tlp_get_binfiles ()
-{
- _tldb_tlp_get_multi "$1" "$2" binfile "$3"
-}
-
-tldb_get_installed_packages ()
-{
- tldb="$1"
- test_tldb "$tldb"
- grep ^name "$tldb" | awk '{print$2}'
-}
-
-
-### Local Variables:
-### perl-indent-level: 4
-### tab-width: 4
-### indent-tabs-mode: t
-### End:
-# vim:set tabstop=4: #
diff --git a/Master/tlpkg/dev/lib/python/TeXLive.py b/Master/tlpkg/dev/lib/python/TeXLive.py
deleted file mode 100644
index fe302acee9b..00000000000
--- a/Master/tlpkg/dev/lib/python/TeXLive.py
+++ /dev/null
@@ -1,1744 +0,0 @@
-#!/usr/bin/python2.4 -u
-# TeXLive.py
-# -*- encoding: utf-8 -*-
-# Usage: call with argument of --help
-# 2007-Aug-05 Jim Hefferon ftpmaint@tug.ctan.org
-"""Understand a TeX Live package and the associated dB file.
-
-TeX Live has a format for metadata located in trunk/Master/tlpkg (for
-the 'src' packages and documentation of the format) and
-trunk/Master/texlive.tlpdb (see also -withctan ?). This module reads the
-two formats, can transform them by adding package documentation from the
-ctanWeb database, and can write them back out.
-
-"""
-__version__='1.0.0'
-__author__='Jim Hefferon'
-__date__='2007-Aug-05'
-__notes__="""
-Bugs:
-1) Does not expand patterns for the src module, and does not
- redo the sizes, etc., for obj files.
-2) You can't from the command line change the name of the db files.
-3) This version for the TeX Live svn tree has the dB stripped out, so
- the option -a doesn't work, and the option -n has no effect.
-"""
-
-import os, os.path, sys
-import re
-import optparse
-import codecs
-import tempfile
-import time
-import pprint
-import glob
-
-## import library
-## from util import *
-## import dBUtils
-## from defaults import DEFAULT_ENCODING, DEFAULT_DATABASE_ENCODING, DEBUG, LOGGING
-DEFAULT_ENCODING='UTF-8'
-
-TLPDB_FILENAME='/home/svn/texlive/trunk/Master/texlive.tlpdb'
-
-THIS_SCRIPT=sys.argv[0]
-DEBUG=True
-LOGGING=True
-LOGFILE_NAME=os.path.splitext(os.path.basename(THIS_SCRIPT))[0]+'.log'
-VERBOSE=True
-
-# What encoding for the terminal?
-import locale
-locale_language, locale_output_encoding = locale.getdefaultlocale()
-if locale_output_encoding is None:
- locale_output_encoding='UTF-8'
-
-
-#---------------------- stuff from util.py
-import StringIO # for msg
-import traceback # for msg
-import logging # for openLog, msg
-import locale # for warn messages
-import types
-
-import grp, pwd # get user name and group name
-
-import pprint # to make nice debugging structures
-
-termEncoding='UTF-8'
-
-class utilError(StandardError):
- pass
-
-# Getting the string from the exception is a problem if you want unicode,
-# since str() is no good for that, and I can't get err.message to work.
-# I need the same functionality for my exceptions as for Python's so
-# I wrap a call to err[0]
-def errorValue(err):
- """Return the string error message from an exception.
- err exception instance
- Note: I cannot get err.message to work. I sent a note to clp on
- Jan 29 2007 with a related query and this is the best that I figured
- out.
- """
- try:
- return str(err)
- except:
- return err[0] # one of mine, in unicode
-
-class jhError(StandardError):
- """Subclass this to get exceptions that behave correctly when
- you do this.
- try:
- raise subclassOfJhError, 'some error message with unicode chars'
- except subclassOfJhError, err
- mesg='the message is '+unicode(err)
- I don't believe that the built-in exceptions ever pass unicode so you can
- use unicode(err) on those also, I think, provided that you don't
- raise them yourself.
- """
- def __unicode__(self):
- return errorValue(self)
-
-# You can use a string to set the level, or a constant from the logging
-# module
-_logLevels={'debug':logging.DEBUG,
- 'info':logging.INFO,
- 'warn':logging.WARN,
- 'error':logging.ERROR,
- 'critical':logging.CRITICAL,
- logging.DEBUG:logging.DEBUG,
- logging.INFO:logging.INFO,
- logging.WARN:logging.WARN,
- logging.WARN:logging.ERROR,
- logging.CRITICAL:logging.CRITICAL}
-
-
-# openLog Open a logging instance
-def openLog(fn,name=None,purpose=None,format="%(levelname)s\t%(asctime)s: %(message)s",level=logging.DEBUG,announce=False):
- """Open an instance of the logging module. Does not append to an old file;
- instead it makes a new one.
- fn Name of the file.
- name=None Name of the logging instance; if None then fn is used
- purpose=None Name of calling program; if None then no head line on log
- file is written
- format='%(levelname)s %(asctime)s: %(message)s' Format for log file
- entries
- announce=False Announce in log file that logging has started
- These are available for the format:
- %(name)s Name of the logger (logging channel)
- %(levelno)s Numeric logging level for the message (DEBUG, INFO,
- WARN, ERROR, CRITICAL)
- %(levelname)s Text logging level for the message ("DEBUG", "INFO",
- "WARN", "ERROR", "CRITICAL")
- %(pathname)s Full pathname of the source file where the logging
- call was issued (if available)
- %(filename)s Filename portion of pathname
- %(module)s Module (name portion of filename)
- %(lineno)d Source line number where the logging call was issued
- (if available)
- %(created)f Time when the LogRecord was created (time.time()
- return value)
- %(asctime)s Textual time when the LogRecord was created
- %(msecs)d Millisecond portion of the creation time
- %(relativeCreated)d Time in milliseconds when the LogRecord was created,
- relative to the time the logging module was loaded
- (typically at application startup time)
- %(thread)d Thread ID (if available)
- %(message)s The result of record.getMessage(), computed just as
- the record is emitted
- May raise a utilError.
- """
- if not(purpose is None): # write a header on the file, if it is new
- if not(os.path.isfile(fn)):
- try:
- f=open(fn,'w')
- f.write("# log file for %s\n" % (purpose,))
- f.close()
- except IOError, err:
- raise utilError, "Log file %s not present and unable to open and write to a new log file: %s" % (fn,errorValue(err))
- if name is None:
- log=logging.getLogger(fn)
- else:
- log=logging.getLogger(name)
- logger_formatter=logging.Formatter(format)
- try:
- logger_handler=logging.FileHandler(fn)
- except Exception, err:
- raise utilError, "Unable to associate a log with %s: %s" % (fn,errorValue(err))
- logger_handler.setFormatter(logger_formatter)
- log.addHandler(logger_handler)
- try:
- log.setLevel(_logLevels[level])
- except:
- raise utilError, "Unable to set level of the log"
- if announce:
- try:
- log.info("Logging started")
- except Exception, err:
- raise utilError, "Unable to initially write to the log with file name %s: %s" % (fn,errorValue(err))
- return log
-
-# msg return a message, for debugging, feedback to the user, etc., and
-# optionally log
-def msg(m,devel=None,log=None,logLevel='debug',debug=False,**mDct):
- """Return a message. Options allow it to be logged, or for a special
- debugging flag to be switched to give additional information
- m The message returned. Substitutions from the keyword arguments at end
- devel=None String that will be used if the DEBUG flag is set for
- developer (and used for writing to the log). If devel=None, then m
- is used.
- log A logging object
- logLevel='debug' One of 'debug', 'info', 'warn', 'error', 'critical',
- or logging.DEBUG, .. logging.CRITICAL
- debug=False Boolean select which message m or mDevel is shown.
- **mDct Keyword argument that are substituted into m and mDevel
- Note that if an exception is pending then a traceback gets printed to the
- log file.
- """
- # Indicate log level
- try:
- level=_logLevels[logLevel]
- except:
- raise utilError, "Unable to set level of the log to %s" % (repr(logLevel),)
- # The main part
- if devel is None:
- devel_str=m
- else:
- devel_str=devel
- #if log:
- # log.debug("in msg: m=<%s>, devel_str=<%s>" % (m,devel_str))
- if log:
- (excClass,excObj,excTb)=sys.exc_info() # is there a pending exception?
- if excClass:
- tbStr=StringIO.StringIO()
- traceback.print_exc(None,tbStr)
- mDct['tB']=tbStr.getvalue().rstrip()
- log.log(level,(devel_str+"\n %(tB)s") % mDct)
- else:
- log.log(level,devel_str % mDct)
- if debug:
- m=devel_str
- # expect that everybody needs to be encoded; print can't do characters numbered greater than 128
- for (k,v) in mDct.items():
- try:
- if not(isinstance(v,UnicodeType)):
- mDct[k]=unicode(v,termEncoding,'replace')
- except:
- try:
- mDct[k]=unicode(str(v),termEncoding,'replace') #? has no unicode method, but has a str method? Like StandardError?
- except:
- mDct[k]="Error in util.msg() -- string conversion to unicode impossible: %s" % (repr(v),) # give a message with some hint of what's gone wrong
- return m % mDct
-
-
-DEFAULT_EXCEPTION=utilError
-WARNINGS_WANTED=False # sometimes, as for unit testing, nice to turn off
-def noteException(m,devel=None,log=None,logLevel='error',exception=DEFAULT_EXCEPTION,debug=None,**mDct):
- """
- Raise an exception, and also, optionally, note it in a log file
- m string Error message for users; use '%(id)s'-style substitution
- devel=None string String for development; sub as in m.
- log Instance of logging module
- exception An exception
- debug Print the error to the stderr?
- **mDct Additional keyword arguments; like 'id=7' will be subbed into
- m, devel
- Uses the msg function; will raise exception.
- """
- # print "util.py.noteException: m is: ",m," mDct is",pprint.pformat(mDct)
- if sys.exc_info()[0]: # if there is an active exception
- extraStr=" (exception is %s)" % (exceptionName(),)
- if devel is None:
- m+=extraStr
- else:
- devel+=extraStr
- r=msg(m,devel=devel,log=log,logLevel=logLevel,debug=debug,**mDct)
- if (debug
- and not(log)
- and WARNINGS_WANTED):
- warn(r,log=None,debug=debug) # print to stderr
- raise exception, r
-
-def warn(s,leader='WARNING: ',log=None,debug=False,**mDct):
- """Send a message to stderr and possibly log it
- s Message to report
- log=None A logging object
- debug=False Whether to report debugging information
- Warning! You can't use leader, log, or debug as a key
- """
- # print >>sys.stderr, leader, msg(s,log=log,logLevel='error',debug=debug,**mDct).encode(locale.getdefaultlocale()[1])
- if not(isinstance(s,types.UnicodeType)):
- s=unicode(s,termEncoding,'replace')
- # print "in warn(): s=",s," and mDct.keys() is ",repr(mDct.keys()),"<<<<<==="
- print >>sys.stderr, leader, msg(s,log=log,logLevel='error',debug=debug,**mDct).encode(termEncoding)
- return None
-
-def ann(s,log=None,debug=False,**mDct):
- """Issue a warning-like message without the 'WARNING' message.
- s Message to report; may contain %(var)s as long as they are matched
- by var=var in the tailing arguments
- log=None,debug=False debugging stuff
- **mDct variables to substitute in s
- """
- return warn(s,leader='',log=log,debug=debug,**mDct)
-
-def note(s,log,flag=os.environ.has_key('GATEWAY_INTERFACE'),leader="NOTE: "):
- """Take the message s and either log it or print it, depending
- on the flag. The idea is to debug with note('informational message',log)
- and have it do the right thing, in a cgi context or not.
- s message to use
- log logging instance
- flag=os.environ.has_key('GATEWAY_INTERFACE') if True, use log. If
- False, use stdout (default is True iff running as a CGI script)
- """
- # programming note:
- # I've avoided too many options, such as potentially outputting
- # to stderr or using another log level; we'll see if simple works.
- if flag and log:
- log.info(s)
- else:
- warn(s,leader=leader,log=log) # no debug because no devel string
-
-
-def fail(s,returnCode=1,log=None,debug=False,**mDct):
- """Drop out, reporting a return code, and possibly logging a message
- s Message to report
- returnCode=1 return code
- log=None A logging object
- debug=False Whether to report debugging information
- Warning! You can't use returnCode, leader, log, or debug as a key
- """
- warn(s,leader='ERROR: ',log=log,debug=debug,**mDct)
- sys.exit(returnCode)
-
-# exceptionName: get the name of the raised exception
-# for use as:
-# try:
-# ..
-# except specificError, err:
-# ..
-# except Exception, err:
-# eN=exceptionName()
-# print "exception was",eN
-#
-def exceptionName():
- """Get the name of the currently raised exception.
- """
- fullName=sys.exc_info()[0] # looks like "'exceptions.AttributeError'"
- if fullName is None:
- return 'No exception' # return rather than None, as I don't expect it to happen, and I don't want the failure if it is None
- else:
- return str(fullName).split('.')[-1]
-#----------------------------------------
-
-#-------------------------------stuff from dButils.py
-## import psycopg2, psycopg2.extensions
-
-## DEFAULT_DBCONNECTION_STRING="user=hefferon dbname=ctan password=Gd6eBitK55y"
-## DEFAULT_DATABASE_ENCODING='UTF-8'
-
-## dBConnectionString=DEFAULT_DBCONNECTION_STRING # can be force-changed for debugging
-
-## class dBUtilsError(StandardError):
-## pass
-
-## def opendB(connectionstring=dBConnectionString,log=None,debug=DEBUG,encoding=DEFAULT_DATABASE_ENCODING,utc=True):
-## """
-## Make a connection to the database; return the pair (connection, cursor).
-## connectionstring=dBConnectionstring string See doc for psycopg
-## log=None logging object
-## debug=DEBUG Whether to output extra information
-## encoding='UNICODE' What to set the client encoding to (default is utf-8)
-## utc=True Set time zone to utc (alternative is local time)
-## May raise a dBUtilsError.
-## """
-## if encoding.upper()=='UTF-8':
-## encoding='UNICODE' # postgres's name for UTF-8
-## if not(encoding in psycopg2.extensions.encodings.keys()):
-## mesg=u'Unable to make a database connection'
-## noteException(mesg,devel=mesg+" using connection string %(connectionstring)s because the called-for encoding %(encoding)s is not one known to psycopg2",log=log,exception=dBUtilsError,debug=debug,connectionstring=connectionstring,encoding=encoding)
-## try:
-## dBcnx = psycopg2.connect(connectionstring)
-## # dBcnx.set_client_encoding(encoding) # causes a failure JH 05-10-12
-## dBcsr = dBcnx.cursor()
-## if utc:
-## dBcsr.execute("SET TIME ZONE 'UTC'")
-## dBcsr.execute("SET client_encoding TO "+encoding)
-## if encoding=='UNICODE': # any way to systematize this code?
-## psycopg2.extensions.register_type(psycopg2.extensions.UNICODE)
-## elif encoding=='LATIN1':
-## psycopg2.extensions.register_type(psycopg2.extensions.LATIN1)
-## elif encoding=='SQL_ASCII':
-## psycopg2.extensions.register_type(psycopg2.extensions.SQL_ASCII)
-## elif encoding=='latin-1':
-## psycopg2.extensions.register_type(psycopg2.extensions.LATIN1)
-## except psycopg2.DatabaseError, err:
-## mesg=u'Unable to connect to the database'
-## noteException(mesg,devel=mesg+" using connection string %(connectionstring)s: %(err)s",log=log,exception=dBUtilsError,debug=debug,connectionstring=connectionstring,err=err)
-## except Exception, err:
-## eN=exceptionName()
-## mesg=u'Unable to connect to the database'
-## noteException(mesg,devel=mesg+" (exception: %(eN)s) using connection string %(connectionstring)s: %(err)s",log=log,exception=dBUtilsError,debug=debug,eN=eN,connectionstring=connectionstring,err=err)
-## return (dBcnx,dBcsr)
-
-## def getData(sql,dct={},dBcsr=None,selectOne=False,log=None,debug=DEBUG,listtype='list from the database'):
-## """
-## Get data out of the database, returning a list of lists
-## sql SQL statement; typically a SELECT statement
-## dct={} Dictionary of substitutions into SQL statement (unicode strings
-## are encoded according to the encoding)
-## dBcsr=None database cursor. If None, one will be generated
-## log=None Instance of logging object
-## selectOne=False With a dB result, issue a fetchone() or a fetchall()?
-## debug=DEBUG Whether to include debugging information
-## listtype Phrase for use in error messages
-## Psycopg2 will handle conversion of unicode strings.
-## """
-## if not(dBcsr): # sanity check
-## mesg=u'Error getting access to the database'
-## noteException(mesg,devel=mesg+": no database cursor, while getting a %(listtype)s",log=log,exception=dBUtilsError,debug=debug,listtype=listtype)
-## try:
-## dBcsr.execute(sql,dct)
-## if selectOne:
-## dBres=dBcsr.fetchone()
-## if dBres is None:
-## lst=[] # an empty list so always yield a sequence
-## else:
-## lst=dBres # one tuple
-## else:
-## lst=dBcsr.fetchall() # a list with possibly many tuples
-## except psycopg2.DatabaseError, err:
-## mesg=u'Database operation error fetching a %(listtype)s'
-## noteException(mesg,devel=mesg+" with query "+dBcsr.query+": %(err)s -- "+dBcsr.statusmessage,log=log,exception=dBUtilsError,debug=debug,listtype=listtype,sql=sql,dct=repr(dct),err=err)
-## except Exception, err:
-## eN=exceptionName()
-## noteException("Database error (unknown kind) fetching a %(listtype)s",devel="Database error (exception %(eN)s) fetching a %(listtype)s with sql='%(sql)s' and dct=%(dct)s: %(err)s",log=log,exception=dBUtilsError,debug=debug,listtype=listtype,eN=eN,err=err)
-## return lst
-
-## def putData(sql,dct={},dBcsr=None,log=None,encoding=DEFAULT_DATABASE_ENCODING,debug=DEBUG,listtype='list to the database'):
-## """
-## Put data into the database, encoding unicode strings on their way in
-## sql SQL statement; should be an INSERT or an UPDATE
-## dct={} Dictionary of substitutions into SQL statement (unicode strings
-## are encoded according to the encoding)
-## dBcsr=None database cursor. If None, one will be generated
-## log=None Instance of logging object
-## encoding=DEFAULT_DATABASE_ENCODING Unicode encoding to use for the
-## database
-## debug=DEBUG Whether to include debugging information
-## listtype Phrase for use in error messages
-## Does *not* do a dBcsr.commit().
-## """
-## if not(dBcsr): # sanity check
-## mesg=u'Error accessing the database'
-## noteException(mesg,devel=mesg+" while putting a %(listtype)s: no database cursor",log=log,exception=dBUtilsError,debug=debug,listtype=listtype)
-## try:
-## dBcsr.execute(sql,dct)
-## except (psycopg2.DatabaseError,psycopg2.ProgrammingError), err:
-## eN=exceptionName()
-## mesg=u'Database operation error'
-## noteException(mesg,devel=mesg+" (exception %(eN)s) %(err)s while putting a %(listtype)s with query="+dBcsr.query+": %(err)s -- "+dBcsr.statusmessage,log=log,exception=dBUtilsError,debug=debug,listtype=listtype,eN=eN,err=err)
-## except Exception, err:
-## eN=exceptionName()
-## mesg=u'Database operation error'
-## noteException(mesg,devel=mesg+" (exception %(eN)s) %(err)s while putting a %(listtype)s",log=log,exception=dBUtilsError,debug=debug,eN=eN,err=str(err),listtype=listtype)
-## return None
-
-#-------------------------------------------------
-
-class tlError(jhError):
- pass
-
-tlobjKeys=set(['name','category','catalogue','shortdesc','longdesc','depend','execute','revision','srcsize','srcfiles','docsize','docfiles','runsize','runfiles','binsize','binfiles','cataloguedata','srcpattern','runpattern','docpattern','binpattern'])
-
-class tlp(object):
- """Give information based on a TeXLive object file
- """
- def __init__(self,verbose=False,log=None,debug=False):
- """Initialize an object.
- """
- self.verbose=verbose
- self.log=log
- self.debug=debug
- self.name=None # string id of package
- self.category=None # string category into which package falls
- self.catalogue=None # string id of associated Catalogue package
- self.shortdesc=None # string one-liner
- self.longdesc=None # string may have newlines
- self.depend=None # list of the form Category/Name
- self.execute=None # list free-form strings
- return None
-
- def __unicode__(self):
- r=[]
- r.append("name: %s" % (pprint.pformat(self.name),))
- r.append(" category: %s" % (pprint.pformat(self.category),))
- r.append(" catalogue: %s" % (pprint.pformat(self.catalogue),))
- r.append(" shortdesc: %s" % (pprint.pformat(self.shortdesc),))
- r.append(" longdesc: %s" % (pprint.pformat(self.longdesc),))
- r.append(" depend: %s" % (pprint.pformat(self.depend),))
- r.append(" execute: %s" % (pprint.pformat(self.execute),))
- return "\n".join(r)
-
- def writeout(self,fn=None):
- """Write a textual representation
- fn=None file name; if None use sys.stdout
- """
- if fn is None:
- f=sys.stdout
- if f.encoding!=DEFAULT_ENCODING:
- warn('using STDOUT but the encoding is %(fEncoding)s and not the expected %(defaultEncoding)s',log=self.log,debug=self.debug,fEncoding=repr(f.encoding),defaultEncoding=repr(DEFAULT_ENCODING))
- else:
- if self.debug:
- errors='strict'
- else:
- errors='replace'
- try:
- f=codecs.open(fn,'w',DEFAULT_ENCODING,errors)
- except Exception, err:
- mesg='unable to open the file for writing'
- noteException(mesg,devel=mesg+' %(fn)s: %(err)s',exception=tlError,log=log,debug=self.debug,fn=repr(fn),err=unicode(err))
- self.writeout_fh(f)
- f.close()
- return None
-
- def _stringToWriteout(self):
- """String that will be written out during writeout_fh
- """
- r=[]
- r.append("name %s" % (self.name,))
- if self.category:
- r.append("category %s" % (self.category,))
- if self.shortdesc:
- r.append("shortdesc %s" % (self.shortdesc,))
- if self.longdesc:
- for line in self.longdesc.split("\n"):
- r.append("longdesc %s" % (line,))
- if self.depend:
- for line in self.depend:
- r.append("depend %s" % (line,))
- if self.execute:
- for line in self.execute:
- r.append("execute %s" % (line,))
- return "\n".join(r)
-
- def writeout_fh(self,f):
- """Write a string representation of the user variables to the
- filehandle.
- f filehandle
- """
- s=self._stringToWriteout()
- f.write(s)
- return None
-
- def get_associated_cat_ids(self,dBcsr,log=None,debug=False):
- """Return the matching catalogue ids
- """
- sql="""SELECT pkg_id FROM tl_cat
- WHERE tl_id=%(tlId)s
- AND pkg_id IS NOT NULL"""
- dct={'tlId':self.name}
- try:
- dBres=dBUtils.getData(sql,dct=dct,dBcsr=dBcsr,log=log,debug=debug,listtype='get catalogue package ids related to this TeX Live package id')
- except dBUtils.dBUtilsError, err:
- mesg=u'unable to get texlive-catalogue packages record'
- noteException(mesg,devel=mesg+' for TeX Live package %(tlId)s: %(err)s',exception=tlError,log=log,debug=debug,tlId=repr(tlId),err=errorValue(err))
- return [catId for (catId,) in dBres]
-
- def add_cat_desc(self,dBcsr,catId=None,log=None,debug=False):
- """If there is not now a description, and there is a matching
- Catalogue package, add its descriptions. (Also sets the catalogue
- variable)
- dBcsr database cursor
- catId=None string or None if present, the name of the Catalogue
- package whose descriptions will be added.
- log=None,debug=False debugging
- """
- if not(catId):
- catIds=self.get_associated_cat_ids(dBcsr,log=log,debug=debug)
- if len(catIds)==1:
- catId=catIds[0]
- if not(catId):
- return False
- sql="""SELECT caption, description FROM pkg_text
- WHERE id=%(catId)s
- AND iso_code='en'"""
- dct={'catId':catId}
- try:
- dBres=dBUtils.getData(sql,dct=dct,dBcsr=dBcsr,log=log,debug=debug,listtype='get catalogue descriptions related to this TeX Live package id')
- except dBUtils.dBUtilsError, err:
- mesg=u'unable to get catalogue package descriptions for this TeX Live package'
- noteException(mesg,devel=mesg+' for TeX Live package %(tlId)s and catalogue id %(catId)s: %(err)s',exception=tlError,log=log,debug=debug,tlId=repr(tlId),catId=repr(catId),err=errorValue(err))
- res=dBres[0]
- if res:
- (catCaption,catDesc)=dBres[0]
- if (not(self.shortdesc)
- and not(self.longdesc)):
- self.catalogue=catId
- self.shortdesc=catCaption
- self.longdesc=catDesc
- return True
-
- def from_file(self,fn=None,multi=False):
- """Read a tlp object from a file.
- fn=None string file name or None, which means sys.stdin
- multi=False boolean whether to allow multiple pkgs in a file
- """
- if fn is None:
- f=sys.stdin
- if f.encoding!=DEFAULT_ENCODING:
- warn('using STDIN but the encoding is %(fEncoding)s and not the expected %(defaultEncoding)s',log=self.log,debug=self.debug,fEncoding=repr(f.encoding),defaultEncoding=repr(DEFAULT_ENCODING))
- else:
- try:
- if self.debug:
- errors='strict'
- else:
- errors='replace'
- f=codecs.open(fn,'rU',DEFAULT_ENCODING,errors)
- except Exception, err:
- mesg='unable to open file for reading'
- noteException(mesg,devel=mesg+' %(fn)s: %(err)s',exception=tlError,log=log,debug=self.debug,fn=repr(fn),err=unicode(err))
- r=self.from_fh(f,multi=multi,lineNo=0)
- return None
-
- initialState='init'
- keyValueStates=tlobjKeys # line of form "key value"
- filePathStates=set(['srcfiles_file','runfiles_file','docfiles_file','binfiles_file']) # line contains file path indented by space
- nextStates={initialState:tlobjKeys,
- 'name':keyValueStates-set(['name']),
- 'category':keyValueStates-set(['category']),
- 'catalogue':keyValueStates-set(['catalogue']),
- 'shortdesc':keyValueStates-set(['shortdesc']),
- 'longdesc':keyValueStates,
- 'depend':keyValueStates,
- 'execute':keyValueStates}
- def from_fh(self,f,multi=None,lineNo=0):
- """Read tlp information from a file handle. Returns None if EOF is
- read before anything is found. Note that files have been opened
- with codecs.open() (except for stdin)
- f an opened file
- multi=None If not None then multiple tplobj's in the file are
- treated as an error
- lineNo=0 debugging
- May raise tlError.
- """
- # Implementation note: I am putting the full parsing routine in
- # this base class, except for some "handle" routines, to allow
- # me to have the handle routines report error messages in the
- # tplobj and tplsrc classes.
- state=self.initialState
- # Look for blank lines that are delimeters between tlp parts
- anyNonblankLinesRead=False
- while True:
- line=f.readline()
- if not(line): # EOF?
- return False
- lineNo+=1
- if self.debug and self.verbose:
- note('line is '+repr(line),self.log)
- line=line.rstrip()
- if not(anyNonblankLinesRead):
- if (not(line)
- or line[0]=='#'): # toss initial blank lines or comments
- continue
- else:
- anyNonblankLinesRead=True
- elif not(line):
- if multi is None:
- mesg=u'unexpected multiple tpl objects'
- noteException(mesg,devel=mesg+'; trailing blank line found at line %(lineNo)s',exception=tlError,log=self.log,debug=self.debug,lineNo=repr(lineNo))
- else:
- return self
- # Get the next state (the key) and the part of the line after key.
- # The "srcfiles", etc., states need special handling as they
- # put the reader in a position where the first thing on the line
- # is not the next state.
- restOfLine=""
- if line[0]==' ':
- if (state=='srcfiles'
- or state=='srcfiles_file'):
- newState='srcfiles_file'
- restOfLine=line[1:]
- elif (state=='runfiles'
- or state=='runfiles_file'):
- newState='runfiles_file'
- restOfLine=line[1:]
- elif (state=='docfiles'
- or state=='docfiles_file'):
- newState='docfiles_file'
- restOfLine=line[1:]
- elif (state=='binfiles'
- or state=='binfiles_file'):
- newState='binfiles_file'
- restOfLine=line[1:]
- else:
- try:
- fields=line.split()
- newState=fields[0].lower()
- restOfLine=line[len(newState):] # can't lstrip() if it is longdesc
- except:
- mesg=u'no key in line number=%(lineNo)s'
- noteException(mesg,devel=mesg+'; while in state %(state)s unable to get the new state for line=%(line)s',exception=tlError,log=self.log,debug=self.debug,lineNo=lineNo,line=repr(line),state=repr(state))
- # Reject illegal newState's
- if not(newState=='binfiles_file'):
- self.currentArch=None
- if not(newState in self.nextStates[state]):
- # print"newState",repr(newState),"state",repr(state),'self.nextStates[state]=',repr(self.nextStates[state])," type",repr(type(self.nextStates[state]))
- mesg=u'unable to transition to the next state in line number=%(lineNo)s'
- noteException(mesg,devel=mesg+'; while in state %(state)s the next state %(newState)s is not legal in line=%(line)s',exception=tlError,log=self.log,debug=self.debug,lineNo=lineNo,line=repr(line),state=repr(state),newState=repr(newState))
- # Main part of routine: handle the line depending on the newState.
- # if self.debug:
- # print "newState is ",repr(newState)," line is ",repr(line)
- if newState==self.initialState:
- mesg=u'unexpected initial state in line=%(lineNo)s'
- noteException(mesg,devel=mesg+'; while in state %(state)s now in initial state reading line=%(line)s',exception=tlError,log=self.log,debug=self.debug,lineNo=lineNo,line=repr(line),state=repr(state))
- if newState=='name':
- try:
- fields=restOfLine.strip().split()
- self.name=fields[0]
- if self.debug:
- note("package name is "+repr(self.name),self.log)
- except Exception, err:
- mesg=u'no "value" text in line number=%(lineNo)s'
- noteException(mesg,devel=mesg+'; now in state %(newState)s reading line=%(line)s: %(err)s',exception=tlError,log=self.log,debug=self.debug,lineNo=lineNo,line=repr(line),newState=repr(newState),err=errorValue(err))
- elif newState=='category':
- try:
- fields=restOfLine.strip().split()
- self.category=fields[0]
- except:
- mesg=u'no "value" text in line number=%(lineNo)s'
- noteException(mesg,devel=mesg+'; now in state %(newState)s reading line=%(line)s',exception=tlError,log=self.log,debug=self.debug,lineNo=lineNo,line=repr(line),newState=repr(newState))
- elif newState=='catalogue':
- try:
- fields=restOfLine.strip().split()
- self.catalogue=fields[0]
- except:
- mesg=u'no "value" text in line number=%(lineNo)s'
- noteException(mesg,devel=mesg+'; now in state %(newState)s reading line=%(line)s',exception=tlError,log=self.log,debug=self.debug,lineNo=lineNo,line=repr(line),newState=repr(newState))
- elif newState=='shortdesc':
- try:
- # I'll allow multiline shortdesc's, although I'll regret it
- if self.shortdesc is None:
- self.shortdesc=""
- if self.shortdesc:
- self.shortdesc+=' '
- self.shortdesc+=restOfLine
- except:
- mesg=u'no value in line number=%(lineNo)s'
- noteException(mesg,devel=mesg+'; now in state %(newState)s reading line=%(line)s',exception=tlError,log=self.log,debug=self.debug,lineNo=lineNo,line=repr(line),newState=repr(newState))
- elif newState=='longdesc':
- try:
- if self.longdesc is None:
- self.longdesc=""
- if self.longdesc:
- self.longdesc+="\n"
- self.longdesc+=restOfLine
- except Exception, err:
- mesg=u'no value in line number=%(lineNo)s'
- noteException(mesg,devel=mesg+'; now in state %(newState)s reading line=%(line)s: %(err)s',exception=tlError,log=self.log,debug=self.debug,lineNo=lineNo,line=repr(line),newState=repr(newState),err=errorValuse(err))
- elif newState=='depend':
- fields=restOfLine.strip().split()
- if len(fields)>0:
- if self.depend is None:
- self.depend=[]
- self.depend.append(restOfLine.strip())
- else:
- mesg=u'no value in line number=%(lineNo)s'
- noteException(mesg,devel=mesg+'; now in state %(newState)s reading line=%(line)s',exception=tlError,log=self.log,debug=self.debug,lineNo=lineNo,line=repr(line),newState=repr(newState))
- elif newState=='execute':
- fields=restOfLine.strip().split()
- if len(fields)>0:
- if self.execute is None:
- self.execute=[]
- self.execute.append(restOfLine.strip())
- else:
- mesg=u'no value in line number=%(lineNo)s'
- noteException(mesg,devel=mesg+'; now in state %(newState)s reading line=%(line)s',exception=tlError,log=self.log,debug=self.debug,lineNo=lineNo,line=repr(line),newState=repr(newState))
- elif newState=='revision':
- self.handleRevision(newState,restOfLine,line,lineNo)
- elif newState=='srcfiles':
- self.handleSrcfiles(newState,restOfLine,line,lineNo)
- elif newState=='srcfiles_file':
- self.handleSrcfilesFile(newState,restOfLine,line,lineNo)
- elif newState=='docfiles':
- self.handleDocfiles(newState,restOfLine,line,lineNo)
- elif newState=='docfiles_file':
- self.handleDocfilesFile(newState,restOfLine,line,lineNo)
- elif newState=='runfiles':
- self.handleRunfiles(newState,restOfLine,line,lineNo)
- elif newState=='runfiles_file':
- self.handleRunfilesFile(newState,restOfLine,line,lineNo)
- elif newState=='binfiles':
- self.handleBinfiles(newState,restOfLine,line,lineNo)
- elif newState=='binfiles_file':
- self.handleBinfilesFile(newState,restOfLine,line,lineNo)
- elif newState=='srcpattern':
- self.handleSrcpattern(newState,restOfLine,line,lineNo)
- elif newState=='runpattern':
- self.handleRunpattern(newState,restOfLine,line,lineNo)
- elif newState=='docpattern':
- self.handleDocpattern(newState,restOfLine,line,lineNo)
- elif newState=='binpattern':
- self.handleBinpattern(newState,restOfLine,line,lineNo)
- elif newState.startswith('cataloguedata-'):
- self.handleCataloguedata(newState,restOfLine,line,lineNo)
- else:
- mesg=u'unknown key in line number=%(lineNo)s'
- noteException(mesg,devel=mesg+'; key is %(newState)s reading line=%(line)s',exception=tlError,log=self.log,debug=self.debug,lineNo=repr(lineNo),line=repr(line),newState=repr(newState))
- # Cycle back to read next line
- state=newState
- return True
-
- def handleRevision(self,newState,restOfLine,line,lineNo):
- """What to do if the newState is 'revision'
- """
- mesg=u'the new state is not allowed here, line number=%(lineNo)s'
- noteException(mesg,devel=mesg+"; this object %(objName) cannot be in the state %(newState)s: line=%(line)s",exception=tlError,log=self.log,debug=self.debug,objName=repr(self.__class__.__name__),newState=repr(newState),lineNo=repr(lineNo),line=repr(line))
- return None
- def handleSrcfiles(self,newState,restOfLine,line,lineNo):
- """What to do if the newState is 'srcfiles'
- """
- mesg=u'the new state is not allowed here, line number=%(lineNo)s'
- noteException(mesg,devel=mesg+"; this object %(objName) cannot be in the state %(newState)s: line=%(line)s",exception=tlError,log=self.log,debug=self.debug,objName=repr(self.__class__.__name__),newState=repr(newState),lineNo=repr(lineNo),line=repr(line))
- return None
- def handleSrcfilesFile(self,newState,restOfLine,line,lineNo):
- """What to do if the newState is 'srcfiles_file'
- """
- mesg=u'the new state is not allowed here, line number=%(lineNo)s'
- noteException(mesg,devel=mesg+"; this object %(objName) cannot be in the state %(newState)s: line=%(line)s",exception=tlError,log=self.log,debug=self.debug,objName=repr(self.__class__.__name__),newState=repr(newState),lineNo=repr(lineNo),line=repr(line))
- return None
- def handleDocfiles(self,newState,restOfLine,line,lineNo):
- """What to do if the newState is 'docfiles'
- """
- mesg=u'the new state is not allowed here, line number=%(lineNo)s'
- noteException(mesg,devel=mesg+"; this object %(objName) cannot be in the state %(newState)s: line=%(line)s",exception=tlError,log=self.log,debug=self.debug,objName=repr(self.__class__.__name__),newState=repr(newState),lineNo=repr(lineNo),line=repr(line))
- return None
- def handleDocfilesFile(self,newState,restOfLine,line,lineNo):
- """What to do if the newState is 'docfiles_file'
- """
- mesg=u'the new state is not allowed here, line number=%(lineNo)s'
- noteException(mesg,devel=mesg+"; this object %(objName) cannot be in the state %(newState)s: line=%(line)s",exception=tlError,log=self.log,debug=self.debug,objName=repr(self.__class__.__name__),newState=repr(newState),lineNo=repr(lineNo),line=repr(line))
- return None
- def handleRunfiles(self,newState,restOfLine,line,lineNo):
- """What to do if the newState is 'runfiles'
- """
- mesg=u'the new state is not allowed here, line number=%(lineNo)s'
- noteException(mesg,devel=mesg+"; this object %(objName) cannot be in the state %(newState)s: line=%(line)s",exception=tlError,log=self.log,debug=self.debug,objName=repr(self.__class__.__name__),newState=repr(newState),lineNo=repr(lineNo),line=repr(line))
- return None
- def handleRunfilesFile(self,newState,restOfLine,line,lineNo):
- """What to do if the newState is 'runfiles_file'
- """
- mesg=u'the new state is not allowed here, line number=%(lineNo)s'
- noteException(mesg,devel=mesg+"; this object %(objName) cannot be in the state %(newState)s: line=%(line)s",exception=tlError,log=self.log,debug=self.debug,objName=repr(self.__class__.__name__),newState=repr(newState),lineNo=repr(lineNo),line=repr(line))
- return None
- def handleBinfiles(self,newState,restOfLine,line,lineNo):
- """What to do if the newState is 'binfiles'
- """
- mesg=u'the new state is not allowed here, line number=%(lineNo)s'
- noteException(mesg,devel=mesg+"; this object %(objName) cannot be in the state %(newState)s: line=%(line)s",exception=tlError,log=self.log,debug=self.debug,objName=repr(self.__class__.__name__),newState=repr(newState),lineNo=repr(lineNo),line=repr(line))
- return None
- def handleBinfilesFile(self,newState,restOfLine,line,lineNo):
- """What to do if the newState is 'binfiles_file'
- """
- mesg=u'the new state is not allowed here, line number=%(lineNo)s'
- noteException(mesg,devel=mesg+"; this object %(objName) cannot be in the state %(newState)s: line=%(line)s",exception=tlError,log=self.log,debug=self.debug,objName=repr(self.__class__.__name__),newState=repr(newState),lineNo=repr(lineNo),line=repr(line))
- return None
- def handleSrcpattern(self,newState,restOfLine,line,lineNo):
- """What to do if the newState is 'srcpattern'
- """
- mesg=u'the new state is not allowed here, line number=%(lineNo)s'
- noteException(mesg,devel=mesg+"; this object %(objName) cannot be in the state %(newState)s: line=%(line)s",exception=tlError,log=self.log,debug=self.debug,objName=repr(self.__class__.__name__),newState=repr(newState),lineNo=repr(lineNo),line=repr(line))
- return None
- def handleRunpattern(self,newState,restOfLine,line,lineNo):
- """What to do if the newState is 'runpattern'
- """
- mesg=u'the new state is not allowed here, line number=%(lineNo)s'
- noteException(mesg,devel=mesg+"; this object %(objName) cannot be in the state %(newState)s: line=%(line)s",exception=tlError,log=self.log,debug=self.debug,objName=repr(self.__class__.__name__),newState=repr(newState),lineNo=repr(lineNo),line=repr(line))
- return None
- def handleDocpattern(self,newState,restOfLine,line,lineNo):
- """What to do if the newState is 'docpattern'
- """
- mesg=u'the new state is not allowed here, line number=%(lineNo)s'
- noteException(mesg,devel=mesg+"; this object %(objName) cannot be in the state %(newState)s: line=%(line)s",exception=tlError,log=self.log,debug=self.debug,objName=repr(self.__class__.__name__),newState=repr(newState),lineNo=repr(lineNo),line=repr(line))
- return None
- def handleBinpattern(self,newState,restOfLine,line,lineNo):
- """What to do if the newState is 'binpattern'
- """
- mesg=u'the new state is not allowed here, line number=%(lineNo)s'
- noteException(mesg,devel=mesg+"; this object %(objName) cannot be in the state %(newState)s: line=%(line)s",exception=tlError,log=self.log,debug=self.debug,objName=repr(self.__class__.__name__),newState=repr(newState),lineNo=repr(lineNo),line=repr(line))
- return None
- def handleCataloguedata(self,newState,restOfLine,line,lineNo):
- """What to do if the newState is 'cataloguedata-xxx'
- """
- mesg=u'the new state is not allowed here, line number=%(lineNo)s'
- noteException(mesg,devel=mesg+"; this object %(objName) cannot be in the state %(newState)s: line=%(line)s",exception=tlError,log=self.log,debug=self.debug,objName=repr(self.__class__.__name__),newState=repr(newState),lineNo=repr(lineNo),line=repr(line))
- return None
-
-
-class tlp_db(object):
- """Give information based on a tl file database. This class exists
- for tlpobj_db and tlpsrc_db to inherit from
- """
- def __init__(self,verbose=False,log=None,debug=False):
- """Initialize an instance.
- """
- self.verbose=verbose
- self.log=log
- self.debug=debug
- self.value={} # map name --> tl pkg
- return None
-
- def __unicode__(self):
- names=self.value.keys()
- names.sort()
- return u" ".join(names)
-
- def get_package(self,name):
- try:
- return self.value[name]
- except:
- return None
-
- def _makeSingle(self):
- """Helper fcn to make one of whatever self.value is holding multiple
- of. Used in from_file.
- """
- return tlp(log=self.log,debug=self.debug)
-
- def from_file(self,fn=None,multi=True):
- """Read a tlp db file. Set self.value.
- """
- if fn is None:
- f=sys.stdin
- if f.encoding!=DEFAULT_ENCODING:
- warn('using STDIN but the encoding is %(fEncoding)s and not the expected %(defaultEncoding)s',log=self.log,debug=self.debug,fEncoding=repr(f.encoding),defaultEncoding=repr(DEFAULT_ENCODING))
- else:
- if self.debug:
- errors='strict'
- else:
- errors='replace'
- try:
- f=codecs.open(fn,'rU',DEFAULT_ENCODING,errors)
- except Exception, err:
- mesg='unable to open tlpobj file'
- noteException(mesg,devel=mesg+' %(fn)s: %(err)s',exception=tlError,log=log,debug=self.debug,fn=repr(fn),err=unicode(err))
- r=self._makeSingle()
- retVal=r.from_fh(f,multi=multi,lineNo=0)
- self.value[r.name]=r
- while retVal:
- r=self._makeSingle()
- retVal=r.from_fh(f,multi=multi,lineNo=0)
- self.value[r.name]=r
- return None
-
- def write_file(self,fn=None):
- if fn is None:
- f=sys.stdout
- if f.encoding!=DEFAULT_ENCODING:
- warn('using STDOUT but the encoding is %(fEncoding)s and not the expected %(defaultEncoding)s',log=self.log,debug=self.debug,fEncoding=repr(f.encoding),defaultEncoding=repr(DEFAULT_ENCODING))
- else:
- if self.debug:
- errors='strict'
- else:
- errors='replace'
- try:
- f=codecs.open(fn,'w',DEFAULT_ENCODING,errors)
- except Exception, err:
- mesg=u'unable to write because unable to open the file'
- noteException(mesg,devel=mesg+': %(err)s',exception=tlError,log=self.log,debug=self.debug,err=errorValue(err))
- pkgNames=self.value.keys()
- pkgNames.sort()
- pkgNo=1
- for k in pkgNames:
- v=self.value[k]
- v.writeout_fh(f)
- f.write("\n")
- if pkgNo<len(pkgNames): # keep off extra \n after end
- f.write("\n")
- pkgNo+=1
- f.close()
- return None
-
- def add_cat_descs(self,dBcsr):
- """Add catalogue descriptions to all matching TL packages that do not
- already have a description.
- """
- pkgNames=self.value.keys()
- pkgNames.sort()
- for k in pkgNames:
- self.value[k].add_cat_desc(dBcsr,log=self.log,debug=self.debug)
- return None
-
-
-
-class tlpobj(tlp):
- """Give information based on a TeXLive object file
- """
- def __init__(self,verbose=False,log=None,debug=False):
- """Initialize an object.
- """
- super(tlpobj,self).__init__(verbose=verbose,log=log,debug=debug)
- self.revision=None # integer
- self.srcfiles=None # list of files
- self.runfiles=None # list of files
- self.docfiles=None # dct fileName--> (dct tagkey --> tagval)
- self.binfiles=None # arch --> list of files
- self.srcsize=None # int (or None)
- self.runsize=None # int (or None)
- self.docsize=None # int (or None)
- self.binsize=None # arch --> size (or None)
- self.cataloguedata=None # cataloguekey --> value
- return None
-
- def __unicode__(self):
- r=[]
- r.append(super(tlpobj,self).__unicode__())
- r.append(" revision: %s" % (pprint.pformat(self.revision),))
- r.append(" srcsize: %s" % (pprint.pformat(self.srcsize),))
- r.append(" srcfiles: %s" % (pprint.pformat(self.srcfiles),))
- r.append(" docsize: %s" % (pprint.pformat(self.docsize),))
- r.append(" docfiles: %s" % (pprint.pformat(self.docfiles),))
- r.append(" runsize: %s" % (pprint.pformat(self.runsize),))
- r.append(" runfiles: %s" % (pprint.pformat(self.runfiles),))
- r.append(" binsize: %s" % (pprint.pformat(self.binsize),))
- r.append(" binfiles: %s" % (pprint.pformat(self.binfiles),))
- r.append(" cataloguedata: %s" % (pprint.pformat(self.cataloguedata),))
- return "\n".join(r)
-
- def _stringToWriteout(self):
- """String that will be written out during writeout_fh
- """
- r=[]
- r.append(super(tlpobj,self)._stringToWriteout())
- if self.revision:
- r.append("revision %s" % (self.revision,))
- if self.docfiles:
- if self.docsize is None:
- mesg='docsize is not there but there are docfiles'
- noteException(mesg,devel=mesg,exception=tlError,log=self.log,debug=self.debug)
- r.append("docfiles size=%s" % (self.docsize,))
- dFiles=self.docfiles.keys()
- dFiles.sort()
- for line in dFiles:
- s=[]
- for (k,v) in self.docfiles[line].items():
- s.append("%s=%s" % (k,v))
- dLine=" "+line
- if s:
- dLine+=" "+(" ".join(s))
- r.append(dLine)
- if self.srcfiles:
- if self.srcsize is None:
- mesg='srcsize is not there but there are srcfiles'
- noteException(mesg,devel=mesg,exception=tlError,log=self.log,debug=self.debug)
- r.append("srcfiles size=%s" % (self.srcsize,))
- self.srcfiles.sort()
- for line in self.srcfiles:
- r.append(" "+line)
- if self.runfiles:
- if self.runsize is None:
- mesg='runsize is not there but there are runfiles'
- noteException(mesg,devel=mesg,exception=tlError,log=self.log,debug=self.debug)
- r.append("runfiles size=%s" % (self.runsize,))
- self.runfiles.sort()
- for line in self.runfiles:
- r.append(" "+line)
- if self.binfiles:
- arches=self.binfiles.keys()
- arches.sort()
- for arch in arches:
- if self.binsize[arch] is None:
- mesg='binsize is not there but there are binfiles'
- noteException(mesg,devel=mesg+" for %(arch)s",exception=tlError,log=self.log,debug=self.debug,arch=repr(arch))
- r.append("binfiles arch=%s size=%s" % (arch,self.binsize[arch],))
- sBinfiles=self.binfiles[arch]
- sBinfiles.sort()
- for line in sBinfiles:
- r.append(" "+line)
- if self.cataloguedata:
- cdKeys=self.cataloguedata.keys()
- for k in cdKeys:
- r.append("catalogue-%s %s" % (k,self.cataloguedata[k]))
- return "\n".join(r)
-
-## def to_db(self,dBcsr,dBcnx,careful=True,associatedCatPkgs=None,verbose=False):
-## """Put the yyy-file information to a database
-## dBcsr, dBcnx database cursor and connection
-## careful=True raise exception on error?
-## associatedCatPkgs=None list of catalogue package id's that either
-## are part of this texlive package of of which this texlive package
-## is a part (None is the same as using what is now in the dB)
-## verbose=False Give warnings
-## """
-## tlId=self.name
-## # Drop the file records if they are there
-## sql="DELETE FROM tds_files WHERE tl_id=%(tlId)s"
-## dct={'tlId':tlId}
-## try:
-## dBUtils.putData(sql,dct=dct,dBcsr=dBcsr,log=self.log,debug=self.debug,listtype='drop old texlive files record')
-## except dBUtils.dBUtilsError, err:
-## mesg=u'unable to drop existing tds files record'
-## noteException(mesg,devel=mesg+' for package %(pkgId)s: %(err)s',log=self.log,debug=self.debug,pkgId=repr(pkgId),err=errorValue(err))
-## # Do the tl_cat records; see which ones to do
-## if associatedCatPkgs is None:
-## sql="SELECT pkg_id FROM tl_cat WHERE tl_id=%(tlId)s"
-## dct['tlId']=tlId
-## try:
-## dBres=dBUtils.getData(sql,dct=dct,dBcsr=dBcsr,log=self.log,debug=self.debug,listtype='get list of catalogue packages for this texlive package')
-## except dBUtils.dBUtilsError, err:
-## mesg=u'unable to get list of catalogue packages for this texlive packages '
-## noteException(mesg,devel=mesg+'%(tlId)s: %(err)s',log=self.log,debug=self.debug,tlId=repr(tlId),err=errorValue(err))
-## associatedCatPkgs=[a for (a,) in dBres]
-## if not(associatedCatPkgs): # try tlId
-## possiblePkgId=tlId.lower()
-## sql="SELECT id FROM package WHERE id=%(pkgId)s"
-## dct['pkgId']=possiblePkgId
-## try:
-## dBres=dBUtils.getData(sql,dct=dct,dBcsr=dBcsr,log=self.log,debug=self.debug,listtype='check for existence of a catalogue id')
-## except dBUtils.dBUtilsError, err:
-## mesg=u'unable to check for existence of a catalogue id'
-## noteException(mesg,devel=mesg+'%(pkgId)s: %(err)s',log=self.log,debug=self.debug,pkgId=repr(possiblePkgId),err=errorValue(err))
-## if dBres:
-## associatedCatPkgs.append(possiblePkgId)
-## # drop any that are there now
-## sql="DELETE FROM tl_cat WHERE tl_id=%(tlId)s"
-## dct={'tlId':tlId}
-## try:
-## dBUtils.putData(sql,dct=dct,dBcsr=dBcsr,log=self.log,debug=self.debug,listtype='drop old texlive package-catalogue package association')
-## except dBUtils.dBUtilsError, err:
-## mesg=u'unable to drop existing texlive package record'
-## noteException(mesg,devel=mesg+' for package %(tlId)s: %(err)s',log=self.log,debug=self.debug,tlId=repr(tlId),err=errorValue(err))
-## # Drop the tl records if they are there
-## sql="DELETE FROM tl WHERE tl_id=%(tlId)s"
-## dct={'tlId':tlId}
-## try:
-## dBUtils.putData(sql,dct=dct,dBcsr=dBcsr,log=self.log,debug=self.debug,listtype='drop old texlive package record')
-## except dBUtils.dBUtilsError, err:
-## mesg=u'unable to drop existing texlive package record'
-## noteException(mesg,devel=mesg+' for package %(tlId)s: %(err)s',log=self.log,debug=self.debug,tlId=repr(tlId),err=errorValue(err))
-## # Insert new tl record
-## sql="INSERT INTO tl (tl_id,shortdesc,longdesc) VALUES (%(tlId)s,%(shortdesc)s,%(longdesc)s)"
-## dct['shortdesc']=self.shortdesc
-## dct['longdesc']=self.longdesc
-## try:
-## dBUtils.putData(sql,dct=dct,dBcsr=dBcsr,log=self.log,debug=self.debug,listtype='insert new texlive package record')
-## except dBUtils.dBUtilsError, err:
-## mesg=u'unable to insert new texlive package record'
-## noteException(mesg,devel=mesg+' for package %(tlId)s: %(err)s',log=self.log,debug=self.debug,tlId=repr(tlId),err=errorValue(err))
-## # insert new tl_cat records
-## if not(tlId.startswith('bin-')
-## or tlId.startswith('collection-')
-## or tlId.startswith('hyphen-')
-## or tlId.startswith('lib-')
-## or tlId.startswith('scheme-')
-## or tlId.startswith('texlive-')):
-## if (not(associatedCatPkgs)
-## and careful
-## and verbose):
-## mesg=u'there are no catalogue packages associated with the TeX Live package %(tlId)s'
-## warn(mesg,log=self.log,debug=self.debug,tlId=repr(tlId))
-## for pkgId in associatedCatPkgs:
-## sql="INSERT INTO tl_cat (tl_id,pkg_id) VALUES (%(tlId)s,%(pkgId)s)"
-## dct['pkgId']=pkgId
-## try:
-## dBUtils.putData(sql,dct=dct,dBcsr=dBcsr,log=self.log,debug=self.debug,listtype='insert new tl_cat package record')
-## except dBUtils.dBUtilsError, err:
-## mesg=u'unable to insert new association between a texlive package and a catalogue package'
-## noteException(mesg,devel=mesg+' for texlive package %(tlId)s and catalgoue package %(pkgId)s: %(err)s',log=self.log,debug=self.debug,tlId=repr(tlId),pkgId=repr(pkgId),err=errorValue(err))
-## # Insert the file records
-## # First build a list of pairs: (fileName,fileType)
-## fileList=[]
-## if self.srcfiles:
-## for fn in self.srcfiles:
-## fileList.append((fn,'src'))
-## if self.runfiles:
-## for fn in self.runfiles:
-## fileList.append((fn,'run'))
-## if self.docfiles:
-## for fn in self.docfiles.keys():
-## fileList.append((fn,'doc'))
-## if self.binfiles:
-## for arch in self.binfiles.keys():
-## for fn in self.binfiles[arch]:
-## fileList.append((fn,'bin'))
-## # .. then put the info in the dB
-## dct={'tlId':tlId}
-## for (fn,fileType) in fileList:
-## pathDir,pathBase=os.path.split(fn)
-## sql="INSERT INTO tds_files (tl_id,type,path_dir,path_base) VALUES (%(tlId)s,%(fileType)s,%(pathDir)s,%(pathBase)s)"
-## dct['fileType']=fileType
-## dct['pathDir']=pathDir
-## dct['pathBase']=pathBase
-## try:
-## dBUtils.putData(sql,dct=dct,dBcsr=dBcsr,log=self.log,debug=self.debug,listtype='insert new texlive files record')
-## except dBUtils.dBUtilsError, err:
-## mesg=u'unable to insert new tds files record'
-## noteException(mesg,devel=mesg+' for package %(tlId)s with type=%(fileType)s, pathDir=%(pathDir)s, pathBase=%(pathBase)s: %(err)s',log=self.log,debug=self.debug,tlId=repr(tlId),fileType=repr(fileType),pathDir=repr(pathDir),pathBase=repr(pathBase),err=errorValue(err))
-## # Commit
-## try:
-## dBcnx.commit()
-## except Exception, err:
-## mesg=u'unable to commit the insert of the new tds files record'
-## noteException(mesg,devel=mesg+' for package %(pkgId)s: %(err)s',log=self.log,debug=self.debug,tlId=repr(tlId),err=errorValue(err))
-## return None
-
- initialState=tlp.initialState
- nextStates=tlp.nextStates
- nextStates['revision']=tlp.keyValueStates-set(['revision'])
- nextStates['srcfiles']=tlp.keyValueStates | set(['srcfiles_file'])-set(['srcfiles'])
- nextStates['srcfiles_file']=tlp.keyValueStates | set(['srcfiles_file'])
- nextStates['runfiles']=tlp.keyValueStates | set(['runfiles_file'])-set(['runfiles'])
- nextStates['runfiles_file']=tlp.keyValueStates | set(['runfiles_file'])
- nextStates['docfiles']=tlp.keyValueStates | set(['docfiles_file'])-set(['docfiles'])
- nextStates['docfiles_file']=tlp.keyValueStates | set(['docfiles_file'])-set(['docfiles'])
- nextStates['binfiles']=tlp.keyValueStates | set(['binfiles_file'])
- nextStates['binfiles_file']=tlp.keyValueStates | set(['binfiles_file'])
- nextStates['cataloguedata']=tlp.keyValueStates
-
- def handleRevision(self,newState,restOfLine,line,lineNo):
- """What to do if the newState is 'revision'
- """
- try:
- fields=restOfLine.strip().split()
- self.revision=int(fields[0])
- except:
- mesg=u'no "value" integer in line number=%(lineNo)s'
- noteException(mesg,devel=mesg+'; now in state %(newState)s reading line=%(line)s',exception=tlError,log=self.log,debug=self.debug,lineNo=lineNo,line=repr(line),newState=repr(newState))
- return None
-
- def handleSrcfiles(self,newState,restOfLine,line,lineNo):
- """What to do if the newState is 'srcfiles'
- """
- try:
- fields=restOfLine.strip().split()
- sizeString=fields[0]
- except:
- mesg=u'no value in line number=%(lineNo)s'
- noteException(mesg,devel=mesg+'; now in state %(newState)s reading line=%(line)s',exception=tlError,log=self.log,debug=self.debug,lineNo=lineNo,line=repr(line),newState=repr(newState))
- try:
- sizeFields=sizeString.split('=')
- if sizeFields[0].lower()!='size':
- raise tlError
- size=int(sizeFields[1])
- if self.srcsize is None:
- self.srcsize=0
- self.srcsize+=size
- except:
- mesg=u'expected a value of size=NNNNNN in line number=%(lineNo)s'
- noteException(mesg,devel=mesg+'; now in state %(newState)s reading line=%(line)s',exception=tlError,log=self.log,debug=self.debug,lineNo=lineNo,line=repr(line),newState=repr(newState))
- if self.srcfiles is None:
- self.srcfiles=[]
- return None
-
- def handleSrcfilesFile(self,newState,restOfLine,line,lineNo):
- """What to do if the newState is 'srcfiles_file'
- """
- try:
- fields=restOfLine.strip().split() # recall that restOfLine=line[1:]
- self.srcfiles.append(fields[0])
- except:
- mesg=u'unable to understand source file name in line number=%(lineNo)s'
- noteException(mesg,devel=mesg+'; now in state %(newState)s reading line=%(line)s',exception=tlError,log=self.log,debug=self.debug,lineNo=lineNo,line=repr(line),newState=repr(newState))
- return None
-
- def handleDocfiles(self,newState,restOfLine,line,lineNo):
- """What to do if the newState is 'docfiles'
- """
- try:
- fields=restOfLine.strip().split()
- sizeString=fields[0]
- except:
- mesg=u'no value in line number=%(lineNo)s'
- noteException(mesg,devel=mesg+'; now in state %(newState)s reading line=%(line)s',exception=tlError,log=self.log,debug=self.debug,lineNo=lineNo,line=repr(line),newState=repr(newState))
- try:
- sizeFields=sizeString.split('=',1)
- if sizeFields[0].lower()!='size':
- raise tlError
- size=int(sizeFields[1])
- if self.docsize is None:
- self.docsize=0
- self.docsize+=size
- except:
- mesg=u'expected a value of size=NNNNNN in line number=%(lineNo)s'
- noteException(mesg,devel=mesg+'; now in state %(newState)s reading line=%(line)s',exception=tlError,log=self.log,debug=self.debug,lineNo=lineNo,line=repr(line),newState=repr(newState))
- if self.docfiles is None:
- self.docfiles={}
- return None
-
- def handleDocfilesFile(self,newState,restOfLine,line,lineNo):
- """What to do if the newState is 'docfiles_file'
- """
- fields=restOfLine.strip().split() # recall that restOfLine=line[1:]
- kvDct={}
- kvString=None
- try:
- for kvString in fields[1:]:
- if kvString:
- k,v=kvString.split("=",1)
- kvDct[k]=v
- except:
- mesg=u'unable to understand doc file description in line number=%(lineNo)s'
- noteException(mesg,devel=mesg+'; now in state %(newState)s; key-value description string=%(kvString)s; reading line=%(line)s',exception=tlError,log=self.log,debug=self.debug,lineNo=lineNo,line=repr(line),newState=repr(newState),kvString=repr(kvString))
- try:
- self.docfiles[fields[0].strip()]=kvDct
- except Exception, err:
- mesg=u'unable to understand doc file name in line number=%(lineNo)s'
- noteException(mesg,devel=mesg+'; now in state %(newState)s reading line=%(line)s: %(err)s',exception=tlError,log=self.log,debug=self.debug,lineNo=lineNo,line=repr(line),newState=repr(newState),err=errorValue(err))
- return None
-
- def handleRunfiles(self,newState,restOfLine,line,lineNo):
- """What to do if the newState is 'runfiles'
- """
- try:
- fields=restOfLine.strip().split()
- sizeString=fields[0]
- except:
- mesg=u'no value in line number=%(lineNo)s'
- noteException(mesg,devel=mesg+'; now in state %(newState)s reading line=%(line)s',exception=tlError,log=self.log,debug=self.debug,lineNo=lineNo,line=repr(line),newState=repr(newState))
- try:
- sizeFields=sizeString.split('=',1)
- if sizeFields[0].lower()!='size':
- raise tlError
- size=int(sizeFields[1])
- if self.runsize is None:
- self.runsize=0
- self.runsize+=size
- except:
- mesg=u'expected a value of size=NNNNNN in line number=%(lineNo)s'
- noteException(mesg,devel=mesg+'; now in state %(newState)s reading line=%(line)s',exception=tlError,log=self.log,debug=self.debug,lineNo=lineNo,line=repr(line),newState=repr(newState))
- if self.runfiles is None:
- self.runfiles=[]
- return None
-
- def handleRunfilesFile(self,newState,restOfLine,line,lineNo):
- """What to do if the newState is 'runfiles_file'
- """
- try:
- fields=restOfLine.strip().split() # recall that restOfLine=line[1:]
- self.runfiles.append(fields[0].strip())
- except:
- mesg=u'unable to understand run file name in line number=%(lineNo)s'
- noteException(mesg,devel=mesg+'; now in state %(newState)s reading line=%(line)s',exception=tlError,log=self.log,debug=self.debug,lineNo=lineNo,line=repr(line),newState=repr(newState))
- return None
-
- def handleBinfiles(self,newState,restOfLine,line,lineNo):
- """What to do if the newState is 'binfiles'
- """
- try:
- fields=restOfLine.strip().split()
- firstString,secondString=fields[0],fields[1]
- except:
- mesg=u'expected an arch=XXXX size=NNNNNN in line number=%(lineNo)s'
- noteException(mesg,devel=mesg+'; now in state %(newState)s reading line=%(line)s',exception=tlError,log=self.log,debug=self.debug,lineNo=lineNo,line=repr(line),newState=repr(newState))
- try:
- firstStringFields=firstString.split('=',1)
- secondStringFields=secondString.split('=',1)
- if firstStringFields[0].lower()=='arch':
- archFields=firstStringFields
- sizeFields=secondStringFields
- else:
- archFields=secondStringFields
- sizeFields=firstStringFields
- if (archFields[0].lower()!='arch'
- or sizeFields[0].lower()!='size'):
- raise tlError
- self.currentArch=archFields[1]
- except:
- mesg=u'expected two values of the form x=y in line number=%(lineNo)s'
- noteException(mesg,devel=mesg+'; now in state %(newState)s reading line=%(line)s',exception=tlError,log=self.log,debug=self.debug,lineNo=lineNo,line=repr(line),newState=repr(newState))
- try:
- if self.binsize is None:
- self.binsize={}
- self.binsize[self.currentArch]=int(sizeFields[1])
- except:
- mesg=u'expected size to be an integer in line number=%(lineNo)s'
- noteException(mesg,devel=mesg+'; now in state %(newState)s reading line=%(line)s',exception=tlError,log=self.log,debug=self.debug,lineNo=lineNo,line=repr(line),newState=repr(newState))
- if self.binfiles is None:
- self.binfiles={}
- self.binfiles[self.currentArch]=[]
- return None
-
- def handleBinfilesFile(self,newState,restOfLine,line,lineNo):
- """What to do if the newState is 'binfiles_file'
- """
- if self.currentArch is None:
- mesg=u'do not know the right architecture in line number=%(lineNo)s'
- noteException(mesg,devel=mesg+'; now in state %(newState)s reading line=%(line)s',exception=tlError,log=self.log,debug=self.debug,lineNo=lineNo,line=repr(line),newState=repr(newState))
- try:
- fields=restOfLine.strip().split() # recall that restOfLine=line[1:]
- self.binfiles[self.currentArch].append(fields[0].strip())
- except:
- mesg=u'unable to understand bin file path in line number=%(lineNo)s'
- noteException(mesg,devel=mesg+'; now in state %(newState)s with architecture %(currentArch)s reading line=%(line)s',exception=tlError,log=self.log,debug=self.debug,lineNo=lineNo,line=repr(line),newState=repr(newState),currentArch=repr(currentArch))
- return None
-
- def is_arch_dependent(self):
- """Returns True if there are binfiles.
- """
- if self.binfiles:
- return True
- else:
- return False
-
- def total_size(self,*archs):
- """Returns the sum of the sizes of srcfiles, docfiles, runfiles,
- and binfiles any architectures given.
- """
- if self.srcsize is None:
- srcsize=0
- else:
- srcsize=self.srcsize
- if self.docsize is None:
- docsize=0
- else:
- docsize=self.docsize
- if self.runsize is None:
- runsize=0
- else:
- runsize=self.runsize
- s=srcsize+docsize+runsize
- try:
- for arch in archs:
- s+=self.binsize[arch]
- except:
- mesg=u'unable to recognize an architecture'
- noteException(mesg,devel=mesg+': %(arch)s',exception=tlError,log=self.log,debug=self.debug,arch=repr(arch))
- return s
-
- def _subtractList(self,l1,l2):
- """From l1 remove any elements of l2, as many times as they occur.
- """
- for f in l2:
- while True: # more than one f in l1?
- try:
- l1.remove(f)
- except:
- break
- return l1
- def add_srcfiles(self,fileList):
- self.srcfiles+=fileList
- def remove_srcfiles(self,fileList):
- self.srcfiles=self._subtractList(self.srcfiles,fileList)
- def add_docfiles(self,fileList):
- self.docfiles+=fileList
- def remove_docfiles(self,fileList):
- self.docfiles=self._subtractList(self.docfiles,fileList)
- def add_runfiles(self,fileList):
- self.runfiles+=fileList
- def remove_runfiles(self,fileList):
- self.runfiles=self._subtractList(self.runfiles,fileList)
- def add_binfiles(self,arch,fileList):
- self.binfiles[arch]+=fileList
- def remove_binfiles(self,arch,fileList):
- self.binfiles[arch]=self._subtractList(self.binfiles[arch],fileList)
- def add_files(self,t,fileList):
- if t=='src':
- self.add_srcfiles(fileList)
- elif t=='doc':
- self.add_docfiles(fileList)
- elif t=='run':
- self.add_runfiles(fileList)
- else:
- mesg=u'file type not known'
- noteException(mesg,devel=mesg+': %(t)s',exception=tlError,log=self.log,debug=self.debug,t=repr(t))
- def remove_files(self,t,fileList):
- if t=='src':
- self.remove_srcfiles(fileList)
- elif t=='doc':
- self.remove_docfiles(fileList)
- elif t=='run':
- self.remove_runfiles(fileList)
- else:
- mesg=u'file type not known'
- noteException(mesg,devel=mesg+': %(t)s',exception=tlError,log=self.log,debug=self.debug,t=repr(t))
-
- def list_files(self):
- """Return a string of lines with file names for all files
- """
- r=[]
- if self.srcfiles:
- r+=self.srcfiles
- if self.runfiles:
- r+=self.runfiles
- if self.docfiles:
- r+=self.docfiles.keys()
- if self.binfiles:
- for arch in self.binfiles.keys():
- r+=self.binfiles[arch]
- r.sort()
- return "\n".join(r)
-
-
-class tlpobj_db(tlp_db):
- """Give information based on a TeXLive object file database
- """
- def _makeSingle(self):
- """Helper fcn to make one of whatever self.value is holding multiple
- of
- f file handle
- """
- return tlpobj(log=self.log,debug=self.debug)
-
-## def to_db(self,dBcsr,dBcnx,verbose=False):
-## """Write all records to the database
-## dBcsr,dBcnx database cursor and connection
-## """
-## pkgNames=self.value.keys()
-## pkgNames.sort()
-## for k in pkgNames:
-## v=self.value[k]
-## v.to_db(dBcsr,dBcnx,verbose=verbose)
-## return None
-
-
-class tlpsrc(tlp):
- """Give information based on a TeXLive source file
- """
- def __init__(self,verbose=False,log=None,debug=False):
- """Initialize an object.
- """
- super(tlpsrc,self).__init__(verbose=verbose,log=log,debug=debug)
- self.srcpattern=None # list of strings (or None)
- self.runpattern=None # list of strings (or None)
- self.docpattern=None # list of strings (or None)
- self.binpattern=None # list of strings (or None)
- return None
-
- def __unicode__(self):
- r=[]
- r.append(super(tlpsrc,self).__unicode__())
- r.append(" srcpattern: %s" % (pprint.pformat(self.srcpattern),))
- r.append(" runpattern: %s" % (pprint.pformat(self.runpattern),))
- r.append(" docpattern: %s" % (pprint.pformat(self.docpattern),))
- r.append(" binpattern: %s" % (pprint.pformat(self.binpattern),))
- return "\n".join(r)
-
- def _stringToWriteout(self):
- """String that will be written out during writeout_fh
- """
- r=[]
- r.append(super(tlpsrc,self)._stringToWriteout())
- if self.srcpattern:
- for line in self.srcpattern:
- r.append("srcpattern %s" % (line,))
- if self.runpattern:
- for line in self.runpattern:
- r.append("runpattern %s" % (line,))
- if self.docpattern:
- for line in self.docpattern:
- r.append("docpattern %s" % (line,))
- if self.binpattern:
- for line in self.binpattern:
- r.append("binpattern %s" % (line,))
- return "\n".join(r)
-
- initialState=tlp.initialState
- nextStates=tlp.nextStates
- nextStates['srcpattern']=tlp.keyValueStates
- nextStates['runpattern']=tlp.keyValueStates
- nextStates['docpattern']=tlp.keyValueStates
- nextStates['binpattern']=tlp.keyValueStates
-
- def handleSrcpattern(self,newState,restOfLine,line,lineNo):
- """What to do if the newState is 'srcpattern'
- """
- try:
- if self.srcpattern is None:
- self.srcpattern=[]
- self.srcpattern.append(restOfLine.rstrip())
- except:
- mesg=u'no "value" text in line number=%(lineNo)s'
- noteException(mesg,devel=mesg+'; now in state %(newState)s reading line=%(line)s',exception=tlError,log=self.log,debug=self.debug,lineNo=lineNo,line=repr(line),newState=repr(newState))
- return None
-
- def handleRunpattern(self,newState,restOfLine,line,lineNo):
- """What to do if the newState is 'runpattern'
- """
- try:
- if self.runpattern is None:
- self.runpattern=[]
- self.runpattern.append(restOfLine.rstrip())
- except:
- mesg=u'no "value" text in line number=%(lineNo)s'
- noteException(mesg,devel=mesg+'; now in state %(newState)s reading line=%(line)s',exception=tlError,log=self.log,debug=self.debug,lineNo=lineNo,line=repr(line),newState=repr(newState))
- return None
-
- def handleDocpattern(self,newState,restOfLine,line,lineNo):
- """What to do if the newState is 'docpattern'
- """
- try:
- if self.docpattern is None:
- self.docpattern=[]
- self.docpattern.append(restOfLine.rstrip())
- except:
- mesg=u'no "value" text in line number=%(lineNo)s'
- noteException(mesg,devel=mesg+'; now in state %(newState)s reading line=%(line)s',exception=tlError,log=self.log,debug=self.debug,lineNo=lineNo,line=repr(line),newState=repr(newState))
- return None
-
- def handleBinpattern(self,newState,restOfLine,line,lineNo):
- """What to do if the newState is 'binpattern'
- """
- try:
- if self.binpattern is None:
- self.binpattern=[]
- self.binpattern.append(restOfLine.rstrip())
- except:
- mesg=u'no "value" text in line number=%(lineNo)s'
- noteException(mesg,devel=mesg+'; now in state %(newState)s reading line=%(line)s',exception=tlError,log=self.log,debug=self.debug,lineNo=lineNo,line=repr(line),newState=repr(newState))
- return None
-
-
-class tlpsrc_db(tlp_db):
- """Give information based on a TeXLive src file list
- """
- def from_dir(self,dn=None):
- """Read a set of tlpsrc files. Set self.value.
- dn=None directory name. If None, use the canonical name.
- """
- if dn is None:
- dn=os.path.join(os.path.dirname(TLPDB_FILENAME),'tlpkg/tlpsrc')
- globPattern=os.path.join(dn,'*.tlpsrc')
- for fn in glob.glob(globPattern):
- self.from_file(fn=fn)
- return None
-
- def _makeSingle(self):
- """Helper fcn to make one of whatever self.value is holding multiple
- of.
- """
- return tlpsrc(log=self.log,debug=self.debug)
-
- def to_dir(self,dn=None):
- """Write a set of tlpsrc files.
- dn=None directory name. If None, use the canonical name.
- """
- if dn is None:
- dn=os.path.join(os.path.basename(TLPDB_FILENAME),'tlpsrc')
- if not(os.path.exists(dn)):
- os.makedirs(dn)
- pkgNames=self.value.keys()
- for k in pkgNames:
- v=self.value[k]
- fn=os.path.join(dn,v.name+'.tlpsrc')
- v.writeout(fn=fn)
- return None
-
-
-def getRelatedCatPkg(tlId,dBcsr,log=None,debug=False):
- """Get the list of catalogue packages that are related to the given
- TeX Live package (does not return None values).
- tlId string
- dBcsr database cursor
- log=None,debug=False debugging
- """
- sql="""SELECT pkg_id FROM tl_cat
- WHERE tl_id=%(tlId)s
- AND pkg_id IS NOT NULL"""
- dct={'tlId':tlId}
- try:
- dBres=dBUtils.getData(sql,dct=dct,dBcsr=dBcsr,log=log,debug=debug,listtype='get catalogue package ids related to this TeX Live package id')
- except dBUtils.dBUtilsError, err:
- mesg=u'unable to get texlive-catalogue packages record'
- noteException(mesg,devel=mesg+' for TeX Live package %(tlId)s: %(err)s',log=log,debug=debug,tlId=repr(tlId),err=errorValue(err))
- return set([catId for (catId,) in dBres])
-
-def getRelatedTlPkg(pkgId,dBcsr,log=None,debug=False):
- """Get the list of TeX Live packages that are related to the given
- Catalogue package.
- pkgId string
- dBcsr database cursor
- log=None,debug=False debugging
- """
- sql="""SELECT tl_id FROM tl_cat
- WHERE pkg_id=%(pkgId)s"""
- dct={'pkgId':pkgId}
- try:
- dBres=dBUtils.getData(sql,dct=dct,dBcsr=dBcsr,log=log,debug=debug,listtype='get TeX Live package ids related to this catalogue package id')
- except dBUtils.dBUtilsError, err:
- mesg=u'unable to get catalogue-texlive packages record'
- noteException(mesg,devel=mesg+' for catalogue package %(pkgId)s: %(err)s',log=log,debug=debug,pkgId=repr(pkgId),err=errorValue(err))
- return set([tlId for (tlId,) in dBres])
-
-
-#......................................................................
-def main(argv=None,log=None,debug=DEBUG):
- """The main logic if called from the command line
- argv The arguments to the routine
- log=None, debug=DEBUG Debugging stuff
- """
- if argv is None:
- argv=sys.argv
- # Parse the arguments
- usage="""%prog: read a TeX Live tlp src or obj file; typically write the obj filelists to the dB
- %prog [options]"""
- oP=optparse.OptionParser(usage=usage,version=__version__)
- oP.add_option('--output','-o',action='store_true',default=False,dest='output',help='show all package records')
- oP.add_option('--no-database','-n',action='store_true',default=False,dest='noDb',help='do not put all package records to the database')
- oP.add_option('--source-read','-s',action='store_true',default=False,dest='srcDir',help='read the source files')
- oP.add_option('--add-catalogue-information','-a',action='store_true',default=False,dest='catInfo',help='add catalogue information to the source or object information')
- oP.add_option('--debug','-D',action='store_true',default=DEBUG,dest='debug',help='output debugging information')
- oP.add_option('--verbose','-V',action='store_true',default=VERBOSE,dest='verbose',help='talk a lot')
- opts, args=oP.parse_args(argv[1:])
- # Handle the options
- # Handle positional arguments
- if args[1:]:
- tlpdbFilename=args[1]
- else:
- tlpdbFilename=TLPDB_FILENAME
- # Handle the various command line switches
-## try:
-## (dBcnx,dBcsr)=dBUtils.opendB()
-## except dBUtils.dBUtilsError, err:
-## fail("Unable to connect to the database: %(err)s",returnCode=10,log=log,debug=opts.debug,err=errorValue(err))
- if opts.srcDir:
- try:
- t=tlpsrc_db(log=log,debug=opts.debug)
- t.from_dir(dn=None)
- if opts.catInfo:
- t.add_cat_descs(dBcsr)
- t.to_dir(dn='tmpTexlive')
- except Exception, err:
- mesg="trouble reading the object file and writing: "+errorValue(err)
- fail(mesg,returnCode=10,log=log,debug=opts.debug)
- return None
- if opts.output:
- try:
- t=tlpobj_db(log=log,debug=opts.debug)
- t.from_file(tlpdbFilename)
- if opts.catInfo:
- t.add_cat_descs(dBcsr)
- t.write_file()
- except Exception, err:
- mesg="trouble reading the object file and writing: "+errorValue(err)
- fail(mesg,returnCode=10,log=log,debug=opts.debug)
- return None
-## if not(opts.noDb):
-## try:
-## t=tlpobj_db(log=log,debug=opts.debug)
-## t.from_file(tlpdbFilename)
-## t.to_db(dBcsr,dBcnx,verbose=opts.verbose)
-## except Exception, err:
-## mesg="trouble reading the object file and sending the results to the database: "+errorValue(err)
-## fail(mesg,returnCode=10,log=log,debug=opts.debug)
- return None
-
-
-# ............... script start .......................
-if __name__=='__main__':
- log=None
- if LOGGING:
- log=openLog(LOGFILE_NAME,purpose=THIS_SCRIPT)
- if DEBUG and __notes__.strip():
- note(__notes__,log,leader="NOTES FOR %s:" % (THIS_SCRIPT,),)
- try:
- main(argv=sys.argv,log=log,debug=DEBUG)
- except KeyboardInterrupt:
- mesg=u"Keyboard interrupt"
- fail(mesg,returnCode=1,log=log,debug=DEBUG)
- except StandardError, err:
- mesg=u"General programming error: "+errorValue(err)
- fail(mesg,returnCode=2,log=log,debug=DEBUG)
- except SystemExit, err: # fail() inside a subroutine
- pass
- sys.exit(0)