1767e7c
/*
1767e7c
 * tl2rpm 0.0.1, TeX Live to RPM converter.
1767e7c
 * 
1767e7c
 * Copyright (C) 2009-2012 Jindrich Novy (jnovy@users.sf.net)
1767e7c
 * 
1767e7c
 * This program is free software; you can redistribute it and/or modify
1767e7c
 * it under the terms of the GNU General Public License as published by
1767e7c
 * the Free Software Foundation; either version 2 of the License, or
1767e7c
 * (at your option) any later version.
1767e7c
 * 
1767e7c
 * This program is distributed in the hope that it will be useful,
1767e7c
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
1767e7c
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
1767e7c
 * GNU General Public License for more details.
1767e7c
 * 
1767e7c
 * You should have received a copy of the GNU General Public License
1767e7c
 * along with this program; if not, write to the Free Software
1767e7c
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
1767e7c
 */
1767e7c
1767e7c
#define _GNU_SOURCE
1767e7c
1767e7c
//#define PACKAGE_SOURCE
1767e7c
#define PACKAGE_DOCS
1767e7c
//#define MERGE_DOCS
1767e7c
//#define SRPMS
1767e7c
//#define SHORTEN_FILELISTS
1767e7c
//#define FEDORA_FONTS
1767e7c
#define UNPACK "xz"
1767e7c
#define REQ_POSTTRANS "Requires: "
97d0db0
#define REQ_POST_POSTUN "Requires(post,postun): "
1767e7c
#ifndef TL2010
3969a3e
//#  define CTAN_URL "ftp://ftp.ctex.org/mirrors/CTAN/systems/texlive/tlnet/archive/"
3969a3e
#  define CTAN_URL "http://ctan.sharelatex.com/tex-archive/systems/texlive/tlnet/archive/"
1767e7c
#else
1767e7c
#  define CTAN_URL ""
1767e7c
#endif
1b033d6
#ifdef DEBUG
1b033d6
#  define REDIR "\n"
1b033d6
#else
1b033d6
#  define REDIR " > /dev/null 2>&1\n"
1b033d6
#endif
1767e7c
1767e7c
#include <stdlib.h>
1767e7c
#include <stdio.h>
d7af6e6
#include <ctype.h>
1767e7c
#include <string.h>
1767e7c
#include <sys/stat.h>
1767e7c
#include <sys/types.h>
1767e7c
#include <unistd.h>
3f5e6b6
#include "tl-oldpkgs.h"
1767e7c
1767e7c
char arch[] = "i386-linux";
1767e7c
char *m;
1767e7c
off_t size, pos;
1767e7c
1767e7c
typedef struct {
1767e7c
	char *token;
1767e7c
	int num;
1767e7c
	size_t s;
1767e7c
} match;
1767e7c
1767e7c
enum {CAT_COLLECTION, CAT_DOCUMENTATION, CAT_PACKAGE, CAT_SCHEME, CAT_TLCORE, CAT_CONTEXT};
1767e7c
match category[] = {
1767e7c
	{"Collection", CAT_COLLECTION},
1767e7c
	{"Documentation", CAT_DOCUMENTATION},
1767e7c
	{"Package", CAT_PACKAGE},
1767e7c
	{"Scheme", CAT_SCHEME},
1767e7c
	{"TLCore", CAT_TLCORE},
1767e7c
	{"ConTeXt", CAT_CONTEXT},
1767e7c
	{NULL, 0}
1767e7c
};
1767e7c
1767e7c
enum {
1767e7c
	LIC_GPL		= 1<<0,
1767e7c
	LIC_LPPL	= 1<<1,
1767e7c
	LIC_OTHER_FREE	= 1<<2,
1767e7c
	LIC_PD		= 1<<3,
1767e7c
	LIC_LGPL	= 1<<4,
1767e7c
	LIC_GFSL	= 1<<5,
1767e7c
	LIC_BSD		= 1<<6,
1767e7c
	LIC_GFL		= 1<<7,
1767e7c
	LIC_ARTISTIC2	= 1<<8,
1767e7c
	LIC_FDL		= 1<<9,
1767e7c
	LIC_COLLECTION	= 1<<10,
1767e7c
	LIC_OTHER	= 1<<11,
1767e7c
	LIC_OFL		= 1<<12,
1767e7c
	LIC_APACHE2	= 1<<13,
1767e7c
	LIC_NOINFO	= 1<<14,
1767e7c
	LIC_UNKNOWN	= 1<<15,
1767e7c
	LIC_KNUTH	= 1<<16,
1767e7c
	LIC_ARTISTIC	= 1<<17,
1767e7c
	LIC_NOSOURCE	= 1<<18,
1767e7c
	LIC_NOSELL	= 1<<19,
1767e7c
	LIC_NOCOMMERCIAL= 1<<20,
1767e7c
	LIC_GPL2	= 1<<21,
1767e7c
	LIC_GPL3	= 1<<22,
1767e7c
	LIC_LPPL12	= 1<<23,
1767e7c
	LIC_LPPL13	= 1<<24,
1767e7c
};
1767e7c
#define LIC_PROBLEMATIC (LIC_NOINFO | LIC_UNKNOWN | LIC_ARTISTIC | LIC_NOSOURCE | LIC_NOSELL | LIC_NOCOMMERCIAL | LIC_OTHER)
38566cc
#define LIC_NOTALLOWED LIC_PROBLEMATIC
1767e7c
1767e7c
match license[] = {
1767e7c
	{"gpl3", LIC_GPL3},
1767e7c
	{"gpl2", LIC_GPL2},
1767e7c
	{"gpl", LIC_GPL},
1767e7c
	{"lppl1.3", LIC_LPPL13},
1767e7c
	{"lppl1.2", LIC_LPPL12},
1767e7c
	{"lppl1", LIC_LPPL},
1767e7c
	{"lppl", LIC_LPPL},
1767e7c
	{"other-free", LIC_OTHER_FREE},
1767e7c
	{"pd", LIC_PD},
1767e7c
	{"noinfo", LIC_NOINFO},
1767e7c
	{"lgpl2.1", LIC_LGPL},
1767e7c
	{"lgpl", LIC_LGPL},
1767e7c
	{"gfsl", LIC_GFSL},
1767e7c
	{"bsd", LIC_BSD},
1767e7c
	{"knuth", LIC_KNUTH},
1767e7c
	{"unknown", LIC_UNKNOWN},
1767e7c
	{"gfl", LIC_GFL},
1767e7c
	{"artistic2", LIC_ARTISTIC2},
1767e7c
	{"fdl", LIC_FDL},
1767e7c
	{"collection", LIC_COLLECTION},
1767e7c
	{"artistic", LIC_ARTISTIC},
1767e7c
	{"other-nonfree", LIC_OTHER},
1767e7c
	{"other", LIC_OTHER},
1767e7c
	{"ofl", LIC_OFL},
1767e7c
	{"apache2", LIC_APACHE2},
1767e7c
	{"nosource", LIC_NOSOURCE},
1767e7c
	{"nosell", LIC_NOSOURCE},
1767e7c
	{"nocommercial", LIC_NOCOMMERCIAL},
1767e7c
	{NULL, 0}
1767e7c
};
1767e7c
1767e7c
match spec_license[] = {
1767e7c
	{"GPL+", LIC_GPL},
1767e7c
	{"GPLv2+", LIC_GPL2},
1767e7c
	{"GPLv3+", LIC_GPL3},
1767e7c
	{"LPPL", LIC_LPPL},
1767e7c
	{"LPPL 1.2", LIC_LPPL12},
1767e7c
	{"LPPL 1.3", LIC_LPPL13},
1767e7c
	{"Freely redistributable without restriction", LIC_OTHER_FREE},
1767e7c
	{"Public Domain", LIC_PD},
1767e7c
	{"No Info", LIC_NOINFO},
1767e7c
	{"LGPLv2+", LIC_LGPL},
1767e7c
	{"GFSL", LIC_GFSL},
1767e7c
	{"BSD", LIC_BSD},
1767e7c
	{"Knuth", LIC_KNUTH},
1767e7c
	{"Unknown", LIC_UNKNOWN},
1767e7c
	{"LPPL", LIC_GFL},
1767e7c
	{"Artistic 2.0", LIC_ARTISTIC2},
1767e7c
	{"GFDL", LIC_FDL},
1767e7c
	{"Public Domain", LIC_COLLECTION},
1767e7c
	{"Artistic", LIC_ARTISTIC},
1767e7c
	{"Other", LIC_OTHER},
d7af6e6
	{"OFL", LIC_OFL},
1767e7c
	{"ASL 2.0", LIC_APACHE2},
1767e7c
	{"No Source", LIC_NOSOURCE},
1767e7c
	{"No Sell", LIC_NOSOURCE},
1767e7c
	{"Non-commercial", LIC_NOCOMMERCIAL},
1767e7c
	{NULL, 0}
1767e7c
};
1767e7c
1767e7c
typedef struct pk {
1767e7c
	char *name;
1767e7c
	unsigned long namehash;
1767e7c
	int category;
1767e7c
	char *shortdesc;
1767e7c
	char **longdesc;
1767e7c
	int longdesc_lines;
1767e7c
	char **runf;
1767e7c
	int runfs;
1767e7c
	char **docf;
1767e7c
	int docfs;
1767e7c
	char **srcf;
1767e7c
	int srcfs;
1767e7c
	char **binf;
1767e7c
	int binfs;
1767e7c
	char *revision;
1767e7c
	char *catalogue_ctan;
1767e7c
	int catalogue_license;
1767e7c
	char *fedora_license;
1767e7c
	char *catalogue_date;
1767e7c
	char *catalogue_version;
1767e7c
	char **dep;
1767e7c
	struct pk **req;
1767e7c
	int reqs;
1767e7c
	char **file_req;
1767e7c
	int file_reqs;
1767e7c
	char **file_prov;
1767e7c
	int file_provs;
1767e7c
	char **exe;
1767e7c
	int exes;
1767e7c
	int reloc;
1767e7c
	int has_man;
1767e7c
	int has_info;
70bc52c
	int main_pkg_written;
3f5e6b6
	int any_pkg_written;
1767e7c
} package;
1767e7c
1767e7c
typedef struct {
1767e7c
	char *dir;
1767e7c
	unsigned long dirhash;
1767e7c
	char **pkg;
1767e7c
	unsigned long *pkghash;
1767e7c
	int *lic;
1767e7c
	int pkgs;
1767e7c
} dir_type;
1767e7c
dir_type *dir;
1767e7c
int dirs;
1767e7c
1767e7c
package *pkg;
1767e7c
int p = 0;
1767e7c
1767e7c
/* Packages to be ignored and not included */
1767e7c
char *pkg_blacklist[] = {
1767e7c
	"getafm",
1767e7c
	"psutils",
1767e7c
	"t1utils",
1767e7c
	"texworks",
38566cc
	"xindy",	// dependency on clisp
a46721e
	"asymptote",	// special build procedure, packaged separately
1767e7c
	"asymptote.i386-linux",
1767e7c
	"asymptote-by-example-zh-cn",
1767e7c
	"asymptote-faq-zh-cn",
1767e7c
	"asymptote-manual-zh-cn",
1767e7c
	"latex-tds",	// only source
a46721e
	"biber",	// packaged separately
1767e7c
	"euro-ce",	// nonfree license
cb7df5f
	"latexmk",	// packaged separately
3969a3e
        "uwmslide",	// artistic (non-free)
3969a3e
	"texdiff",	// artistic (non-free)
1767e7c
	NULL,
1767e7c
};
1767e7c
1767e7c
char *rem[] = {		/* any file beginning with this will be removed */
d409867
	"texmf-dist/doc/info/kpathsea.info",
2addf26
	"texmf-dist/scripts/context/stubs/source",
2addf26
	"readme-txt.dir",
ee8e5e1
	"tlpkg/installer",
2addf26
	"install-tl",
1767e7c
	NULL,
1767e7c
};
1767e7c
1767e7c
char *fedora_license[] = {
1767e7c
#include "texlive-fedora-licenses.h"
1767e7c
	NULL, NULL
1767e7c
};
1767e7c
1767e7c
char *get_line() {
1767e7c
	if ( pos
1767e7c
		off_t rpos;
1767e7c
		while ( pos
1767e7c
		if ( pos == size ) return NULL;
1767e7c
		rpos = pos;
1767e7c
		while ( pos
1767e7c
		if ( pos == size ) return NULL;
1767e7c
		m[pos] = 0;
1767e7c
		return &m[rpos];
1767e7c
	} else {
1767e7c
		return NULL;
1767e7c
	}
1767e7c
}
1767e7c
1767e7c
int get_token( char *s, match *m ) {
1767e7c
	int i, found = -1;
1767e7c
//	char *r;
1767e7c
1767e7c
	for ( i=0; m[i].token; i++ ) {
1767e7c
		if ( !strncmp(s, m[i].token, m[i].s?m[i].s:(m[i].s=strlen(m[i].token))) ) {
1767e7c
			if ( found == -1 ) {
1767e7c
				found = i;
1767e7c
			} else {
1767e7c
				if ( m[found].s < m[i].s ) found = i;
1767e7c
			}
1767e7c
		}
1767e7c
	}
1767e7c
1767e7c
	if ( found != -1 ) {
1767e7c
		return m[found].num;
1767e7c
	}
1767e7c
1767e7c
//	r = strchr(s,'\n');
1767e7c
//	*r = '\0';
1767e7c
//	fprintf(stderr,"No match: '%s'\nin '", s);
1767e7c
//	*r = '\n';
1767e7c
//	for ( i=0; m[i].token; i++ ) {
1767e7c
//		fprintf(stderr, "%s ", m[i].token);
1767e7c
//	}
1767e7c
//	fprintf(stderr, "'\nin package %s\n", pkg[p-1].name);
1767e7c
//	exit(1);
1767e7c
1767e7c
	return 0;
1767e7c
}
1767e7c
1767e7c
char *put_token( int t, match *m ) {
1767e7c
	for ( ;m->token; m++ ) {
1767e7c
		if ( m->num == t ) return m->token;
1767e7c
	}
1767e7c
1767e7c
	return NULL;
1767e7c
}
1767e7c
1767e7c
unsigned long hash(char *str) {
1767e7c
	unsigned long hash = 5381;
1767e7c
	int c;
1767e7c
1767e7c
	while ((c = *str++))
1767e7c
		hash = ((hash << 5) + hash) + c; /* hash * 33 + c */
1767e7c
1767e7c
	return hash;
1767e7c
}
1767e7c
1767e7c
enum {FT_NONE, FT_DOC, FT_RUN, FT_SRC, FT_BIN};
1767e7c
1767e7c
void skipspace(char **sp) {
1767e7c
	char *s = *sp;
1767e7c
	while (*s == ' ' || *s == '\t' || *s == '\n' || *s == '\r') s++;
1767e7c
	while (*s == '%') {
1767e7c
		while ( *s != '\n' ) s++;
1767e7c
		while (*s == ' ' || *s == '\t' || *s == '\n' || *s == '\r') s++;
1767e7c
	}
1767e7c
	*sp = s;
1767e7c
}
1767e7c
1767e7c
void parse() {
1767e7c
	char *l;
1767e7c
	int filetype = FT_NONE;
1767e7c
1767e7c
	while ( (l=get_line()) ) {
1767e7c
		if ( !*l ) continue;
1767e7c
		if ( *l == ' ' ) {
1767e7c
			char pkgname[0x100];
1767e7c
			unsigned long pkghash;
1767e7c
			char *end = strchr(++l, ' ');
1767e7c
			if ( end ) {
1767e7c
				*end = '\0';
1767e7c
			}
1767e7c
			if ( pkg[p-1].reloc ) {
1767e7c
				char *rel = strstr(l, "RELOC");
1767e7c
				char *new_l = NULL;
3969a3e
				int ret;
3969a3e
				ret = asprintf(&new_l, "texmf-dist%s", rel+5);
3969a3e
				if (ret == -1) {
3969a3e
					fprintf(stderr, "asprintf failed?");
3969a3e
				}
1767e7c
				l = new_l;
1767e7c
			}
d409867
			if (!strncmp(l, "texmf-dist/doc/man/man", 22)) {  /* does package have any man pages? */
1767e7c
				pkg[p-1].has_man = 1;
1767e7c
				if ( l[strlen(l)-2] == '.' && l[strlen(l)-1] >= '0' && l[strlen(l)-1] <= '9' ) {
1767e7c
					pkg[p-1].runf = realloc(pkg[p-1].runf, (pkg[p-1].runfs+1)*sizeof(char *));
1767e7c
					pkg[p-1].runf[pkg[p-1].runfs] = l;
1767e7c
					pkg[p-1].runfs++;
1767e7c
					snprintf(pkgname, sizeof(pkgname), "%s", pkg[p-1].name);
1767e7c
					goto skip;
1767e7c
				}
1767e7c
				goto skip;
1767e7c
			}
d409867
			if (!strncmp(l, "texmf-dist/doc/info/", 20)) {  /* does package have any info pages? */
1767e7c
				pkg[p-1].has_info = 1;
1767e7c
				if ( !strncmp(&l[strlen(l)-5], ".info", 5) ) {
1767e7c
					pkg[p-1].runf = realloc(pkg[p-1].runf, (pkg[p-1].runfs+1)*sizeof(char *));
1767e7c
					pkg[p-1].runf[pkg[p-1].runfs] = l;
1767e7c
					pkg[p-1].runfs++;
1767e7c
					snprintf(pkgname, sizeof(pkgname), "%s", pkg[p-1].name);
1767e7c
					goto skip;
1767e7c
				}
1767e7c
				goto skip;
1767e7c
			}
38566cc
			switch ( filetype ) {
1767e7c
				case FT_RUN:
1767e7c
#ifdef PACKAGE_DOCS
1767e7c
#ifdef MERGE_DOCS
1767e7c
				case FT_DOC:
1767e7c
#endif
1767e7c
#endif
1767e7c
					pkg[p-1].runf = realloc(pkg[p-1].runf, (pkg[p-1].runfs+1)*sizeof(char *));
1767e7c
					pkg[p-1].runf[pkg[p-1].runfs] = l;
1767e7c
					pkg[p-1].runfs++;
1767e7c
					snprintf(pkgname, sizeof(pkgname), "%s", pkg[p-1].name);
1767e7c
					break;
1767e7c
#ifdef PACKAGE_DOCS
1767e7c
#ifndef MERGE_DOCS
1767e7c
				case FT_DOC:
1767e7c
					pkg[p-1].docf = realloc(pkg[p-1].docf, (pkg[p-1].docfs+1)*sizeof(char *));
1767e7c
					pkg[p-1].docf[pkg[p-1].docfs] = l;
1767e7c
					pkg[p-1].docfs++;
1767e7c
					snprintf(pkgname, sizeof(pkgname), "%s-doc", pkg[p-1].name);
1767e7c
					break;
1767e7c
#endif
1767e7c
#else
1767e7c
				case FT_DOC:
1767e7c
					pkg[p-1].docf = realloc(pkg[p-1].docf, (pkg[p-1].docfs+1)*sizeof(char *));
1767e7c
					pkg[p-1].docf[pkg[p-1].docfs] = l;
1767e7c
					pkg[p-1].docfs++;
1767e7c
					snprintf(pkgname, sizeof(pkgname), "%s-doc", pkg[p-1].name);
1767e7c
					continue;
1767e7c
#endif
1767e7c
				case FT_SRC:
1767e7c
					pkg[p-1].srcf = realloc(pkg[p-1].srcf, (pkg[p-1].srcfs+1)*sizeof(char *));
1767e7c
					pkg[p-1].srcf[pkg[p-1].srcfs] = l;
1767e7c
					pkg[p-1].srcfs++;
1767e7c
					snprintf(pkgname, sizeof(pkgname), "%s-source", pkg[p-1].name);
1767e7c
#ifndef PACKAGE_SOURCE
1767e7c
					continue;
1767e7c
#endif
1767e7c
					break;
1767e7c
				case FT_BIN:
1767e7c
					pkg[p-1].binf = realloc(pkg[p-1].binf, (pkg[p-1].binfs+1)*sizeof(char *));
1767e7c
					pkg[p-1].binf[pkg[p-1].binfs] = l;
1767e7c
					pkg[p-1].binfs++;
1767e7c
					snprintf(pkgname, sizeof(pkgname), "%s", pkg[p-1].name);
1767e7c
					break;
1767e7c
				default:
1767e7c
					fprintf(stderr, "No filetype: %s\n", l);
1767e7c
					exit(1);
1767e7c
			}
1767e7c
skip:
1767e7c
			pkghash = hash(pkgname);
1767e7c
			end = strrchr(l, '/');
1767e7c
			if (!end) end = l;
1767e7c
			if ( end ) {
1767e7c
				int i;
1767e7c
				unsigned long h;
1767e7c
				char saved = *end;
1767e7c
				*end = '\0';
1767e7c
				h = hash(l);
1767e7c
				for ( i=0; i
1767e7c
					if ( dir[i].dirhash == h && !strcmp(l, dir[i].dir) ) {
1767e7c
						int n;
1767e7c
						for ( n=0; n
1767e7c
							if ( dir[i].pkghash[n] == pkghash && !strcmp(dir[i].pkg[n], pkgname) ) {
1767e7c
								goto exit;
1767e7c
							}
1767e7c
						}
1767e7c
						dir[i].pkg = realloc(dir[i].pkg, (dir[i].pkgs+1)*sizeof(char *));
1767e7c
						dir[i].pkghash = realloc(dir[i].pkghash, (dir[i].pkgs+1)*sizeof(unsigned long));
1767e7c
						dir[i].lic = realloc(dir[i].lic, (dir[i].pkgs+1)*sizeof(int));
1767e7c
						dir[i].pkg[dir[i].pkgs] = strdup(pkgname);
1767e7c
						dir[i].pkghash[dir[i].pkgs] = pkghash;
1767e7c
						dir[i].lic[dir[i].pkgs] = pkg[p-1].catalogue_license;
1767e7c
						dir[i].pkgs++;
1767e7c
						goto exit;
1767e7c
					}
1767e7c
				}
1767e7c
				dirs++;
1767e7c
				dir = realloc(dir, dirs*sizeof(dir_type));
1767e7c
				dir[dirs-1].dir = strdup(l);
1767e7c
				dir[dirs-1].dirhash = h;
1767e7c
				dir[dirs-1].pkgs = 1;
1767e7c
				dir[dirs-1].pkg = malloc(sizeof(char *));
1767e7c
				dir[dirs-1].pkghash = malloc(sizeof(unsigned long));
1767e7c
				dir[dirs-1].lic = malloc(sizeof(int));
1767e7c
				dir[dirs-1].pkg[0] = strdup(pkgname);
1767e7c
				dir[dirs-1].pkghash[0] = pkghash;
1767e7c
				dir[dirs-1].lic[0] = pkg[p-1].catalogue_license;
1767e7c
exit:
1767e7c
				*end = saved;
1767e7c
			}
1767e7c
			continue;
1767e7c
		}
1767e7c
next_name:
1767e7c
		if ( !strncmp(l,"name ", 5) ) {
1767e7c
			size_t sarch, sname;
1767e7c
			int i, blacklisted = 0;
1767e7c
			for (i=0; pkg_blacklist[i]; i++) {
cb7df5f
				if ( !strncmp(l+5, pkg_blacklist[i], strlen(pkg_blacklist[i])) ) {
1767e7c
					blacklisted = 1;
1767e7c
					break;
1767e7c
				}
1767e7c
			}
1767e7c
			if (!blacklisted) {
1767e7c
				for (i=0; fedora_license[i]; i+=2) {
1767e7c
					if ( !strcmp(l+5, fedora_license[i]) && !fedora_license[i+1]) {
1767e7c
						blacklisted = 1;
1767e7c
						break;
1767e7c
					}
1767e7c
				}
1767e7c
			}
1767e7c
			if ( blacklisted ) {
1767e7c
				fprintf(stderr, "Blacklisted: %s\n", pkg_blacklist[i]);
1767e7c
				while ( (l=get_line()) ) {
1767e7c
					if ( !strncmp(l, "name ", 5) ) break;
1767e7c
				}
1767e7c
				if (!l) continue;
1767e7c
				goto next_name;
1767e7c
			}
1767e7c
			p++;
1767e7c
			pkg = realloc(pkg, p*sizeof(package));
1767e7c
			memset(&pkg[p-1], 0, sizeof(package));
1767e7c
			sarch = strlen(arch);
1767e7c
			sname = strlen(l+5);
1767e7c
			if ( sname > sarch && !strncmp(&(l+5)[sname-sarch], arch, sarch) ) {
1767e7c
				pkg[p-1].name = calloc(sname-sarch+5, 1);
1767e7c
				memcpy(pkg[p-1].name, l+5, sname-sarch);
1767e7c
				memcpy(&pkg[p-1].name[sname-sarch], "ARCH", 4);
1767e7c
			} else {
1767e7c
				pkg[p-1].name = l+5;
1767e7c
			}
1767e7c
			pkg[p-1].namehash = hash(pkg[p-1].name);
1767e7c
			filetype = FT_NONE;
1767e7c
			/* look for license first */
1767e7c
			{
1767e7c
				off_t opos = pos;
1767e7c
				while ( (l=get_line()) ) {
1767e7c
					m[pos] = '\n';
1767e7c
					if ( !strncmp(l, "name ", 5) ) break;
1767e7c
					if ( !strncmp(l,"catalogue-license ", 18) ) {
1767e7c
						pkg[p-1].catalogue_license = get_token(l+18, license);
1767e7c
						if ( pkg[p-1].catalogue_license & LIC_PROBLEMATIC ) printf("L: %s - %s\n", pkg[p-1].name, put_token(pkg[p-1].catalogue_license, spec_license));
1767e7c
						break;
1767e7c
					}
1767e7c
				}
1767e7c
				pos = opos;
1767e7c
			}
1767e7c
			continue;
1767e7c
		}
1767e7c
		if ( !strncmp(l,"category ", 9) ) {
1767e7c
			pkg[p-1].category = get_token(l+9, category);
1767e7c
			continue;
1767e7c
		}
1767e7c
		if ( !strncmp(l,"shortdesc ", 10) ) {
1767e7c
			size_t len;
1767e7c
			pkg[p-1].shortdesc = l+10;
1767e7c
			len = strlen(pkg[p-1].shortdesc);
1767e7c
			if ( pkg[p-1].shortdesc[len-1] == '.' ) pkg[p-1].shortdesc[len-1] = '\0';
1767e7c
			continue;
1767e7c
		}
1767e7c
		if ( !strncmp(l,"longdesc ", 9) ) {
1767e7c
			pkg[p-1].longdesc = realloc(pkg[p-1].longdesc, (pkg[p-1].longdesc_lines+1)*sizeof(char *));
1767e7c
			pkg[p-1].longdesc[pkg[p-1].longdesc_lines] = l+9;
1767e7c
			pkg[p-1].longdesc_lines++;
1767e7c
			continue;
1767e7c
		}
1767e7c
		if ( !strncmp(l,"docfiles ", 9) ) {
1767e7c
			filetype = FT_DOC;
1767e7c
			continue;
1767e7c
		}
1767e7c
		if ( !strncmp(l,"relocated 1", 11) ) {
1767e7c
			pkg[p-1].reloc = 1;
1767e7c
			continue;
1767e7c
		}
1767e7c
		if ( !strncmp(l,"runfiles ", 9) ) {
1767e7c
			filetype = FT_RUN;
1767e7c
			continue;
1767e7c
		}
1767e7c
		if ( !strncmp(l,"srcfiles ", 9) ) {
1767e7c
			filetype = FT_SRC;
1767e7c
			continue;
1767e7c
		}
1767e7c
		if ( !strncmp(l,"binfiles ", 9) ) {
1767e7c
			filetype = FT_BIN;
1767e7c
			continue;
1767e7c
		}
1767e7c
		if ( !strncmp(l,"depend ", 7) ) {
1767e7c
			pkg[p-1].dep = realloc(pkg[p-1].dep, (pkg[p-1].reqs+1)*sizeof(char *));
1767e7c
			pkg[p-1].req = realloc(pkg[p-1].req, (pkg[p-1].reqs+1)*sizeof(package *));
1767e7c
			pkg[p-1].dep[pkg[p-1].reqs] = l+7;
1767e7c
			pkg[p-1].req[pkg[p-1].reqs] = NULL;
1767e7c
			pkg[p-1].reqs++;
1767e7c
			continue;
1767e7c
		}
1767e7c
		if ( !strncmp(l,"execute ", 8) ) {
1767e7c
			pkg[p-1].exe = realloc(pkg[p-1].exe, (pkg[p-1].exes+1)*sizeof(char *));
1767e7c
			pkg[p-1].exe[pkg[p-1].exes] = l+8;
1767e7c
			pkg[p-1].exes++;
1767e7c
			continue;
1767e7c
		}
1767e7c
		if ( !strncmp(l,"catalogue-ctan ", 15) ) {
1767e7c
			pkg[p-1].catalogue_ctan = l+15;
1767e7c
			continue;
1767e7c
		}
1767e7c
		if ( !strncmp(l,"catalogue-license ", 18) ) {
1767e7c
			pkg[p-1].catalogue_license = get_token(l+18, license);
1767e7c
			{
1767e7c
				int n;
1767e7c
				for (n=0; fedora_license[n]; n+=2) {
1767e7c
					if (!strcmp(fedora_license[n], pkg[p-1].name)) {
1767e7c
						pkg[p-1].fedora_license = fedora_license[n+1];
1767e7c
						break;
1767e7c
					}
1767e7c
				}
1767e7c
			}
1767e7c
			continue;
1767e7c
		}
1767e7c
		if ( !strncmp(l,"catalogue-date ", 15) ) {
1767e7c
			pkg[p-1].catalogue_date = l+15;
1767e7c
			continue;
1767e7c
		}
1767e7c
		if ( !strncmp(l,"catalogue-version ", 18) ) {
1767e7c
			pkg[p-1].catalogue_version = l+18;
1767e7c
			/* substitute unallowed '/', '-', ' ', '~' characters with '_' */
1767e7c
			{
1767e7c
				char *v;
1767e7c
				for ( v=pkg[p-1].catalogue_version; *v; v++ ) {
1767e7c
					if ( *v == '/' || *v == '-' || *v == ' ' || *v == '~' || *v == ',' || *v == '(' || *v == ')') *v = '_';
1767e7c
				}
1767e7c
			}
1767e7c
			continue;
1767e7c
		}
1767e7c
		if ( !strncmp(l,"revision ", 9) ) {
1767e7c
			pkg[p-1].revision = l+9;
1767e7c
			continue;
1767e7c
		}
1767e7c
		if ( !strncmp(l,"containersize ", 14) ||
1767e7c
		     !strncmp(l,"containermd5 ", 13) ||
1767e7c
		     !strncmp(l,"doccontainersize ", 17) ||
1767e7c
		     !strncmp(l,"doccontainermd5 ", 16) ||
1767e7c
		     !strncmp(l,"srccontainersize ", 17) ||
1767e7c
		     !strncmp(l,"srccontainermd5 ", 16) ||
3969a3e
		     !strncmp(l,"catalogue ", 10) ||
3969a3e
                     !strncmp(l,"postaction ", 11)
1767e7c
		) {
1767e7c
			continue;
1767e7c
		}
1767e7c
		fprintf(stderr, "unknown token: '%s'\n", l);
1767e7c
	}
1767e7c
}
1767e7c
1767e7c
package **inst;
f9db426
int installed, srcno=100, mainsrcno = 7000, mainpkg;
1767e7c
FILE *fpack, *ffile, *funpack, *fsrc, *fremove, *ffont;
1767e7c
1767e7c
char *cnf_files[] = {
d409867
	"texmf-dist/web2c/fmtutil.cnf",
d409867
	"texmf-dist/web2c/updmap.cfg",
d409867
	"texmf-dist/web2c/texmf.cnf",
d409867
	"texmf-dist/web2c/context.cnf",
d409867
	"texmf-dist/web2c/mktex.cnf",
d409867
	"texmf-dist/dvips/config/config.ps",		/* rhbz#441171 */
d409867
	"texmf-dist/tex/generic/config/language.dat",	/* rhbz#929367 */
1767e7c
	NULL,
1767e7c
};
1767e7c
1767e7c
int main_written;
1767e7c
void append_filelist( char *pkg, char *pkgsuf, int files, char **filelist, char *pkglicense ) {
1767e7c
	char pkgname[0x100];
1767e7c
	unsigned long pkghash;
1767e7c
	int x, y, n, bin = 0;
1767e7c
	char *binpos;
1767e7c
1767e7c
	strncpy(pkgname, pkg, sizeof(pkgname));
1767e7c
	if ( pkgsuf && *pkgsuf ) {
1767e7c
		strcat(pkgname, "-");
1767e7c
		strcat(pkgname, pkgsuf);
1767e7c
	}
1767e7c
1767e7c
	pkghash = hash(pkgname);
1767e7c
1767e7c
	if ( (binpos=strstr(pkgname, ".ARCH")) ) {
1767e7c
		bin = 1;
1767e7c
		*binpos = '\0';
1767e7c
		strcat(binpos, "-bin");
1767e7c
	}
1767e7c
	if ( pkglicense && get_token(pkglicense, license) && !(get_token(pkglicense, license)&LIC_PROBLEMATIC) ) {
1767e7c
			fprintf(ffile, "%%files %s\n%%defattr(-,root,root)\n%%doc %s.txt\n", mainpkg?(!main_written?"":pkgsuf):pkgname, pkglicense);
1767e7c
	} else {
1767e7c
		fprintf(ffile, "%%files %s\n%%defattr(-,root,root)\n", mainpkg?(!main_written?"":pkgsuf):pkgname);
1767e7c
	}
1767e7c
	if ( bin ) {
1767e7c
		*binpos = '\0';
1767e7c
		strcat(binpos, ".ARCH");
1767e7c
	}
1767e7c
1767e7c
	for (y=0; y
1767e7c
		for (x=0; x
1767e7c
			if ( dir[y].pkghash[x] == pkghash && !strcmp(dir[y].pkg[x], pkgname) ) {
1767e7c
				size_t bin_index = 0;
1767e7c
				if ( bin ) bin_index = 5+strlen(arch);
1767e7c
				if ( dir[y].pkgs == 1 ) {
1767e7c
					if ( !bin ) {
1767e7c
#ifdef SHORTEN_FILELISTS
1767e7c
						int found = 0;
1767e7c
#endif
1767e7c
						for (n=0; n
1767e7c
							if ( y==n ) continue;
1767e7c
							if ( !strncmp(dir[n].dir, dir[y].dir, strlen(dir[y].dir)) ) {
1767e7c
#ifdef SHORTEN_FILELISTS
1767e7c
								found = 1;
1767e7c
#endif
1767e7c
								break;
1767e7c
							}
1767e7c
						}
1767e7c
#ifdef SHORTEN_FILELISTS
1767e7c
						if ( !found ) {
1767e7c
							fprintf(ffile, "%%{_texdir}/%s/*\n", dir[y].dir);
1767e7c
							for (n=0; n
1767e7c
								char *name = strrchr(filelist[n], '/');
1767e7c
								if (name && name[1] == '.') {
1767e7c
									fprintf(ffile, "%%{_texdir}/%s\n", filelist[n]);
1767e7c
								}
1767e7c
							}
1767e7c
							continue;
1767e7c
						}
1767e7c
#endif
1767e7c
					}
1767e7c
				}
1767e7c
				for (n=0; n
1767e7c
					char *end = strrchr(filelist[n], '/');
1767e7c
					if (!end) end = filelist[n];
1767e7c
					if (end) {
1767e7c
						char saved = *end;
1767e7c
						*end = '\0';
1767e7c
						if ( !strcmp(dir[y].dir, filelist[n]) ) {
1767e7c
							int i;
1767e7c
							*end = saved;
1767e7c
							if ( strstr(&filelist[n][bin_index], arch) ) continue; /* fool texlive.infra - don't install lzma/xz */
2addf26
							if (strstr(&filelist[n][bin_index], "win32") || strstr(&filelist[n][bin_index], "mswin") ||
2addf26
							    strstr(&filelist[n][bin_index], "Win32") || strstr(&filelist[n][bin_index], "tlmgr") ||
d7af6e6
							    !strncmp(&filelist[n][bin_index], "texmf-dist/source/", 18) ||
d7af6e6
							    strstr(&filelist[n][bin_index], ".swf")) {
1767e7c
								fprintf(fremove, "rm -f %%{buildroot}/%s/%s\n", bin?"%{_bindir}":"%{_texdir}", &filelist[n][bin_index]);
1767e7c
								printf("*** %s\n", &filelist[n][bin_index]);
1767e7c
								goto next;
1767e7c
							}
1767e7c
							for (i=0; rem[i]; i++) {
1767e7c
								if (!strncmp(&filelist[n][bin_index], rem[i], strlen(rem[i]))) {
1767e7c
									fprintf(fremove, "rm -f %%{buildroot}/%s/%s\n", bin?"%{_bindir}":"%{_texdir}", &filelist[n][bin_index]);
1767e7c
									printf("*** %s\n", &filelist[n][bin_index]);
1767e7c
									goto next;
1767e7c
								}
1767e7c
							}
d409867
							if (!strncmp(&filelist[n][bin_index], "texmf-dist/doc/man/man", 22)) {  /* relocate man pages to correct paths */
1767e7c
								size_t sz = strlen(&filelist[n][bin_index]);
1767e7c
								char *man = &filelist[n][bin_index];
1767e7c
								if (man[sz-1] >= '0' && man[sz-1] <= '9') {
d409867
									fprintf(ffile, "%%{_mandir}/%s*\n", &filelist[n][bin_index+19]);
1767e7c
								}
1767e7c
								goto next;
1767e7c
							}
d409867
							if (!strncmp(&filelist[n][bin_index], "texmf-dist/doc/info", 19)) {  /* relocate path for info files, ignore all other files such as 'dir' */
1767e7c
								if (!strncmp(&filelist[n][strlen(filelist[n])-5], ".info", 5)) {
d409867
									fprintf(ffile, "%%{_infodir}/%s*\n", &filelist[n][bin_index+20]);
1767e7c
								}
1767e7c
								goto next;
1767e7c
							}
d409867
							if (!strcmp(&filelist[n][bin_index], "texmf-dist/web2c/updmap.cfg")) {
1767e7c
								fprintf(fremove, "\n# disable all Maps/MixedMaps we add them by scriptlets\n");
d409867
								fprintf(fremove, "sed -i '/^M/d' %%{buildroot}%%{_texdir}/texmf-dist/web2c/updmap.cfg\n");
1767e7c
							} else
d409867
							if (!strcmp(&filelist[n][bin_index], "texmf-dist/web2c/fmtutil.cnf")) {
1767e7c
								fprintf(fremove, "\n# disable all formats\n");
d409867
								fprintf(fremove, "sed -i '/^[a-z].*$/s/^/\\#\\!\\ /' %%{buildroot}%%{_texdir}/texmf-dist/web2c/fmtutil.cnf\n");
1767e7c
							} else
d409867
							if (!strcmp(&filelist[n][bin_index], "texmf-dist/tex/generic/config/language.us")) {
1767e7c
								fprintf(fremove, "\n# disable all hyphenations\n");
d409867
								fprintf(fremove, "cp -f %%{buildroot}%%{_texdir}/texmf-dist/tex/generic/config/language.us %%{buildroot}%%{_texdir}/texmf-dist/tex/generic/config/language.dat\n");
1767e7c
							} else
d409867
							if (!strcmp(&filelist[n][bin_index], "texmf-dist/tex/generic/config/language.us.def")) {
1767e7c
								fprintf(fremove, "\n# disable all hyphenations\n");
d409867
								fprintf(fremove, "cp -f %%{buildroot}%%{_texdir}/texmf-dist/tex/generic/config/language.us.def %%{buildroot}%%{_texdir}/texmf-dist/tex/generic/config/language.def\n");
1767e7c
							}
1767e7c
							{			/* add %config(noreplace) for config files */
1767e7c
								int i;
1767e7c
1767e7c
								for ( i=0; cnf_files[i]; i++ ) {
1767e7c
									if ( !strcmp(&filelist[n][bin_index], cnf_files[i]) ) {
1767e7c
										fprintf(ffile, "%%config(noreplace) ");
1767e7c
										break;
1767e7c
									}
1767e7c
								}
1767e7c
							}
1767e7c
							fprintf(ffile, "%s/%s\n", bin?"%{_bindir}":"%{_texdir}", &filelist[n][bin_index]);
1767e7c
						}
1767e7c
next:
1767e7c
						*end = saved;
1767e7c
					}
1767e7c
				}
1767e7c
			}
1767e7c
		}
1767e7c
	}
1767e7c
	fprintf(ffile, "\n");
1767e7c
}
1767e7c
3969a3e
#if 0
3969a3e
1767e7c
static void provide_file(package *p, char *suf) {
1767e7c
	int n;
1767e7c
	for (n=0; n<p->runfs; n++) {
1767e7c
		if ( !strncmp(&p->runf[n][strlen(p->runf[n])-strlen(suf)], suf, strlen(suf)) ) {
1767e7c
			fprintf(fpack, "Provides: tex(%s) = %%{tl_version}\n", strrchr(p->runf[n], '/')+1);
1767e7c
		   }
1767e7c
	}
1767e7c
}
1767e7c
1767e7c
static void fill_provide_file(package *p, char *suf) {
1767e7c
	int n;
1767e7c
	for (n=0; n<p->runfs; n++) {
1767e7c
		if ( !strncmp(&p->runf[n][strlen(p->runf[n])-strlen(suf)], suf, strlen(suf)) ) {
1767e7c
			fprintf(fpack, "Provides: tex(%s) = %%{tl_version}\n", strrchr(p->runf[n], '/')+1);
1767e7c
		   }
1767e7c
	}
1767e7c
}
1767e7c
3969a3e
#endif
3969a3e
1767e7c
static void fill_file_reqprov() {
1767e7c
	int i, j, n, k;
1767e7c
	char ss[0x100];
1767e7c
	char *se;
1767e7c
	char *sufs[] = { ".tfm", ".ttf", ".ttc", ".pfa", ".pfb", ".pcf",
1767e7c
			 ".otf", ".tex", ".cnf", ".cfg", ".def", ".dat",
1767e7c
			 ".ldf", ".fd", ".enc", ".map", ".vf", ".vpl",
38566cc
			 ".clo", ".bug", ".bg2", ".cbx", ".bbx", ".cls",
1767e7c
			 ".sty", NULL };
1767e7c
1767e7c
	for (i=0; i
1767e7c
		for (n=0; n
1767e7c
			for (k=0; sufs[k]; k++) {
1767e7c
				if (!strncmp(&pkg[i].runf[n][strlen(pkg[i].runf[n])-strlen(sufs[k])], sufs[k], strlen(sufs[k]))) {
1767e7c
					pkg[i].file_prov = realloc(pkg[i].file_prov, (pkg[i].file_provs+1)*sizeof(char *));
1767e7c
					pkg[i].file_prov[pkg[i].file_provs] = strdup(strrchr(pkg[i].runf[n], '/')+1);
1767e7c
					pkg[i].file_provs++;
1767e7c
				}
1767e7c
			}
1767e7c
1767e7c
			if ( !strncmp(&pkg[i].runf[n][strlen(pkg[i].runf[n])-4], ".sty", 4) ||
1767e7c
			     !strncmp(&pkg[i].runf[n][strlen(pkg[i].runf[n])-4], ".cls", 4) ||
1767e7c
			     !strncmp(&pkg[i].runf[n][strlen(pkg[i].runf[n])-4], ".ldf", 4) ||
1767e7c
			     !strncmp(&pkg[i].runf[n][strlen(pkg[i].runf[n])-4], ".bbx", 4) ||
1767e7c
			     !strncmp(&pkg[i].runf[n][strlen(pkg[i].runf[n])-4], ".cbx", 4) ||
1767e7c
			     !strncmp(&pkg[i].runf[n][strlen(pkg[i].runf[n])-4], ".bug", 4) ||
1767e7c
			     !strncmp(&pkg[i].runf[n][strlen(pkg[i].runf[n])-4], ".bg2", 4) ||
1767e7c
			     !strncmp(&pkg[i].runf[n][strlen(pkg[i].runf[n])-4], ".clo", 4)
1767e7c
			   ) {
1767e7c
				char fl[0x100] = "texlive.expanded/";
1767e7c
				FILE *f;
1767e7c
				char *m, *s;
1767e7c
				off_t size;
1767e7c
1767e7c
				strcat(fl, pkg[i].runf[n]);
1767e7c
				if ( !(f=fopen(fl,"rt")) ) {
1767e7c
					printf("file missing: %s\n", pkg[i].runf[n]);
1767e7c
					exit(1);
1767e7c
				}
1767e7c
				fseek(f, 0, SEEK_END);
1767e7c
				size = ftell(f);
1767e7c
				fseek(f, 0, SEEK_SET);
1767e7c
				m = malloc(size+1);
1767e7c
				fread(m, size, 1, f);
1767e7c
				fclose(f);
1767e7c
				m[size] = '\0';
1767e7c
1767e7c
				if ( !strncmp(&pkg[i].runf[n][strlen(pkg[i].runf[n])-4], ".bbx", 4) ) {
1767e7c
					for ( s=m; (s=strstr(s,"\\RequireBibliographyStyle{")); ) {
1767e7c
						s += 26;
1767e7c
						se = strchr(s, '}');
1767e7c
						*se = '\0';
1767e7c
						strcpy(ss, s);
1767e7c
						strcat(ss, ".bbx");
1767e7c
						for (k=0; k
1767e7c
							if (!strcmp(pkg[i].file_req[k], ss)) goto next_bbx;
1767e7c
						}
1767e7c
						pkg[i].file_req = realloc(pkg[i].file_req, (pkg[i].file_reqs+1)*sizeof(char *));
1767e7c
						pkg[i].file_req[pkg[i].file_reqs] = strdup(ss);
1767e7c
						pkg[i].file_reqs++;
1767e7c
next_bbx:
1767e7c
						*se = '}';
1767e7c
					}
1767e7c
					goto skip;
1767e7c
				}
1767e7c
1767e7c
				if ( !strncmp(&pkg[i].runf[n][strlen(pkg[i].runf[n])-4], ".cbx", 4) ) {
1767e7c
					for ( s=m; (s=strstr(s,"\\RequireCitationStyle{")); ) {
1767e7c
						s += 22;
1767e7c
						se = strchr(s, '}');
1767e7c
						*se = '\0';
1767e7c
						strcpy(ss, s);
1767e7c
						strcat(ss, ".cbx");
1767e7c
						for (k=0; k
1767e7c
							if (!strcmp(pkg[i].file_req[k], ss)) goto next_cbx;
1767e7c
						}
1767e7c
						pkg[i].file_req = realloc(pkg[i].file_req, (pkg[i].file_reqs+1)*sizeof(char *));
1767e7c
						pkg[i].file_req[pkg[i].file_reqs] = strdup(ss);
1767e7c
						pkg[i].file_reqs++;
1767e7c
next_cbx:
1767e7c
						*se = '}';
1767e7c
					}
1767e7c
					goto skip;
1767e7c
				}
1767e7c
1767e7c
				for ( s=strstr(m, "\\ProvidesPackage"); s; s=strstr(s, "\\ProvidesPackage") ) {
1767e7c
					char *os = s+16;
1767e7c
					char dep[0x100], *d;
1767e7c
					dep[0] = '\0';
1767e7c
					for (; s>=m; s--) {
1767e7c
						if (*s == '\n') break;
1767e7c
					}
1767e7c
					while (*s == ' ' || *s == '\t' || *s == '\n' || *s == '\r') s++;
1767e7c
					if ( *s == '%' ) goto nextprov;
1767e7c
					s = os;
1767e7c
					skipspace(&s);
1767e7c
					if ( *s == '[' ) {
1767e7c
						s++;
1767e7c
						while (*s != ']') if (*s == '%') skipspace(&s); else s++;
1767e7c
						s++;
1767e7c
						skipspace(&s);
1767e7c
					}
1767e7c
					if ( *s != '{' ) goto nextprov;
1767e7c
					s++;
1767e7c
					for ( d=dep, os=s; ; s++ ) {
1767e7c
						if ( *s == ' ' || *s == '\t' || *s == '\n' || *s == '\r' ) continue;
1767e7c
						if ( (*s >= 'a' && *s <= 'z') || (*s >= 'A' && *s <= 'Z') || (*s >= '0' && *s <= '9') || *s == '-' ) {
1767e7c
							*d = *s;
1767e7c
							d++;
1767e7c
							continue;
1767e7c
						}
1767e7c
						if ( *s == '%') {
1767e7c
							skipspace(&s);
1767e7c
							s--;
1767e7c
							continue;
1767e7c
						}
1767e7c
						if ( *s == ',' || *s == '}' ) {
1767e7c
							*d = '\0';
1767e7c
							strcpy(ss, dep);
1767e7c
							strcat(ss, ".sty");
1767e7c
1767e7c
							for (k=0; k
1767e7c
								if (!strcmp(ss, pkg[i].file_prov[k])) goto nextprov;
1767e7c
							}
1767e7c
1767e7c
							if ( *dep ) {
1767e7c
								pkg[i].file_prov = realloc(pkg[i].file_prov, (pkg[i].file_provs+1)*sizeof(char *));
1767e7c
								pkg[i].file_prov[pkg[i].file_provs] = strdup(ss);
1767e7c
								pkg[i].file_provs++;
1767e7c
							}
1767e7c
1767e7c
							if ( *s == '}' ) break;
1767e7c
							d = dep;
1767e7c
							continue;
1767e7c
						}
1767e7c
						goto nextprov;
1767e7c
					}
1767e7c
nextprov:
1767e7c
					s = os;
1767e7c
				}
1767e7c
1767e7c
				for ( s=strstr(m, "\\RequirePackage"); s; s=strstr(s, "\\RequirePackage") ) {
1767e7c
					char *os = s+15;
1767e7c
					char dep[0x100], *d;
1767e7c
					for (; s>=m; s--) {
1767e7c
						if (*s == '\n') break;
1767e7c
					}
1767e7c
					while (*s == ' ' || *s == '\t' || *s == '\n' || *s == '\r') s++;
1767e7c
					if ( *s == '%' ) goto nextreq;
1767e7c
					s = os;
1767e7c
					if (!strncmp(s, "WithOptions", 11)) s+=11;
1767e7c
					skipspace(&s);
1767e7c
					if ( *s == '[' ) {
1767e7c
						s++;
1767e7c
						while (*s != ']') if (*s == '%') skipspace(&s); else s++;
1767e7c
						s++;
1767e7c
						skipspace(&s);
1767e7c
					}
1767e7c
					if ( *s != '{' ) goto nextreq;
1767e7c
					s++;
1767e7c
					for ( d=dep, os=s; ; s++ ) {
1767e7c
					if ( *s == ' ' || *s == '\t' || *s == '\n' || *s == '\r' ) continue;
1767e7c
						if ( (*s >= 'a' && *s <= 'z') || (*s >= 'A' && *s <= 'Z') || (*s >= '0' && *s <= '9') || *s == '-' ) {
1767e7c
							*d = *s;
1767e7c
							d++;
1767e7c
							continue;
1767e7c
						}
1767e7c
						if ( *s == '%') {
1767e7c
							skipspace(&s);
1767e7c
							s--;
1767e7c
							continue;
1767e7c
						}
1767e7c
						if ( *s == ',' || *s == '}' ) {
1767e7c
							*d = '\0';
1767e7c
							strcpy(ss, dep);
1767e7c
							strcat(ss, ".sty");
1767e7c
1767e7c
							for (k=0; k
1767e7c
								if (!strcmp(ss, pkg[i].file_req[k])) goto nextreq;
1767e7c
							}
1767e7c
1767e7c
							for (k=0; k
1767e7c
								if (!strcmp(ss, pkg[i].file_prov[k])) goto nextreq;
1767e7c
							}
1767e7c
1767e7c
							if ( *dep ) {
1767e7c
								pkg[i].file_req = realloc(pkg[i].file_req, (pkg[i].file_reqs+1)*sizeof(char *));
1767e7c
								pkg[i].file_req[pkg[i].file_reqs] = strdup(ss);
1767e7c
								pkg[i].file_reqs++;
1767e7c
							}
1767e7c
1767e7c
							if ( *s == '}' ) break;
1767e7c
							d = dep;
1767e7c
							continue;
1767e7c
						}
1767e7c
						goto nextreq;
1767e7c
					}
1767e7c
nextreq:
1767e7c
					s = os;
1767e7c
				}
1767e7c
1767e7c
				for ( s=strstr(m, "\\input"); s; s=strstr(s, "\\input") ) {
1767e7c
					char *os = s+6;
1767e7c
					char dep[0x100], *d;
1767e7c
					int has_space = 0;
1767e7c
					for (s--; s>=m; s--) {
1767e7c
						if (*s == '\n') break;
1767e7c
						if (*s != ' ' || *s != '\t') goto nextinput;
1767e7c
					}
1767e7c
					s++;
1767e7c
					while (*s == ' ' || *s == '\t') s++;
1767e7c
					if ( *s == '%' ) goto nextinput;
1767e7c
					s = os;
1767e7c
					if (*s == ' ' || *s == '\t') {
1767e7c
						has_space = 1;
1767e7c
						while (*s == ' ' || *s == '\t') s++;
1767e7c
					}
1767e7c
					if (*s == '{') {
1767e7c
						has_space = 1;
1767e7c
						s++;
1767e7c
						while (*s == ' ' || *s == '\t') s++;
1767e7c
					}
1767e7c
					if ( !has_space ) goto nextinput;
1767e7c
					for (d=dep; (*s >= 'a' && *s <= 'z') || (*s >= 'A' && *s <= 'Z') || (*s >= '0' && *s <= '9') || *s == '-' || *s == '.'; s++) {
1767e7c
						*d = *s;
1767e7c
						d++;
1767e7c
					}
1767e7c
					if ( d == dep ) goto nextinput;
1767e7c
					while (*s == ' ' || *s == '\t') s++;
1767e7c
					if ( *s == '}' || *s == '%' || *s == '\n' || *s == '\r') {
1767e7c
						int x;
1767e7c
						size_t sz;
1767e7c
						*d = '\0';
1767e7c
						if (!strchr(dep, '.')) strcat(dep, ".tex");
1767e7c
						sz = strlen(dep);
1767e7c
						for ( x=0; x
1767e7c
							if ( !strcmp(&pkg[i].runf[x][strlen(pkg[i].runf[x])-sz], dep) && pkg[i].runf[x][strlen(pkg[i].runf[x])-sz-1] == '/' ) {
1767e7c
								goto nextinput;
1767e7c
							}
1767e7c
						}
1767e7c
						pkg[i].file_req = realloc(pkg[i].file_req, (pkg[i].file_reqs+1)*sizeof(char *));
1767e7c
						pkg[i].file_req[pkg[i].file_reqs] = strdup(dep);
1767e7c
						pkg[i].file_reqs++;
1767e7c
					}
1767e7c
nextinput:
1767e7c
					s = os;
1767e7c
				}
1767e7c
skip:
1767e7c
				free(m);
1767e7c
			}
1767e7c
		}
1767e7c
		/* Do not require self-provided files */
1767e7c
		for (k=0; k
1767e7c
			for (n=0; n
1767e7c
				if (!strcmp(pkg[i].file_prov[n], pkg[i].file_req[k])) {
1767e7c
					memmove(&pkg[i].file_req[k], &pkg[i].file_req[k+1], (pkg[i].file_reqs-k-1)*sizeof(char*));
1767e7c
					pkg[i].file_reqs--;
1767e7c
					break;
1767e7c
				}
1767e7c
			}
1767e7c
		}
1767e7c
	}
1767e7c
1767e7c
	for (i=0; i
1767e7c
		for (n=0; n
1767e7c
			int found = 0;
1767e7c
			for (k=0; k
1767e7c
				for (j=0; j
1767e7c
					if ( !strcmp(pkg[k].file_prov[j], pkg[i].file_req[n]) ) {
1767e7c
						found = 1;
1767e7c
						break;
1767e7c
					}
1767e7c
				}
1767e7c
				if (found) break;
1767e7c
			}
1767e7c
			if (!found) {
1767e7c
				fprintf(stderr, "Nothing provides: %s required by %s\n", pkg[i].file_req[n], pkg[i].name);
1767e7c
				memmove(&pkg[i].file_req[n], &pkg[i].file_req[n+1], (pkg[i].file_reqs-n-1)*sizeof(char*));
1767e7c
				pkg[i].file_reqs--;
1767e7c
				n--;
1767e7c
			}
1767e7c
		}
1767e7c
	}
1767e7c
}
1767e7c
2addf26
static char *print_noarch_version( package *p ) {
2addf26
	static char noarchver[0x100];
2addf26
2addf26
	if ( p->catalogue_version ) {
2e16460
		snprintf(noarchver, sizeof(noarchver), "svn%s.%s", p->revision, p->catalogue_version );
2addf26
	} else {
2e16460
		snprintf(noarchver, sizeof(noarchver), "svn%s.0", p->revision);
2addf26
	}
2addf26
2addf26
	return noarchver;
2addf26
}
2addf26
d7af6e6
static char *skipspaces( char *s ) {
d7af6e6
	while ( isblank(*s) ) s++;
d7af6e6
d7af6e6
	return s;
d7af6e6
}
d7af6e6
1767e7c
int level;
1767e7c
void solve(char *name) {
1767e7c
	unsigned long h;
1767e7c
	int i, found = 0, doc_expanded = 0;
1767e7c
#ifdef SRPMS
1767e7c
	FILE *ofpack = NULL, *offile = NULL, *ofunpack = NULL, *ofsrc = NULL, *ofremove = NULL, *offont = NULL;
1767e7c
#endif
1767e7c
	h = hash(name);
1767e7c
1767e7c
	if ( !fpack ) {
1767e7c
		fpack = fopen("_packages.spec", "wt");
1767e7c
	}
1767e7c
	if ( !ffile ) {
1767e7c
		ffile = fopen("_files.spec", "wt");
1767e7c
	}
1767e7c
	if ( !funpack ) {
1767e7c
		funpack = fopen("_unpack.spec", "wt");
1767e7c
	}
1767e7c
	if ( !fsrc ) {
1767e7c
		fsrc = fopen("_sources.spec", "wt");
1767e7c
	}
1767e7c
	if ( !fremove ) {
1767e7c
		fremove = fopen("_remove.spec", "wt");
1767e7c
	}
1767e7c
	if ( !ffont ) {
1767e7c
		ffont = fopen("_font.spec", "wt");
1767e7c
	}
1767e7c
1767e7c
	for (i=0; i
1767e7c
		if ( inst[i]->namehash == h && !strcmp(inst[i]->name, name) ) {
1767e7c
			return;
1767e7c
		}
1767e7c
	}
1767e7c
1767e7c
	for (i=0; i
1767e7c
	printf("%s\n", name);
1767e7c
1767e7c
	for (i=0; i
1767e7c
		if ( pkg[i].namehash == h && !strcmp(pkg[i].name, name)) {
7a7bfd0
			int n, has_noarch_pkg = 0;
1767e7c
			if ( pkg[i].catalogue_license & LIC_NOTALLOWED ) {
1767e7c
				printf("Bad license: %s\n", pkg[i].name);
1767e7c
				continue;
1767e7c
			}
1767e7c
			if ( pkg[i].srcfs && !(pkg[i].runfs || pkg[i].docfs || pkg[i].exes || pkg[i].reqs) ) {
1767e7c
				printf("onlysrc: %s\n", name);
1767e7c
				continue;
1767e7c
			}
1767e7c
			level++;
1767e7c
			inst = realloc(inst, (installed+1)*sizeof(package*));
1767e7c
			inst[installed++] = &pkg[i];
1767e7c
1767e7c
			if ( pkg[i].exes ) {
1767e7c
				for (n=0; n
1767e7c
					int m;
1767e7c
					for (m=0; m
1767e7c
					printf("> %s\n", pkg[i].exe[n]);
1767e7c
				}
1767e7c
			}
1767e7c
			if ( pkg[i].binfs ) {
7a7bfd0
				char s[0x100], *pp;
7a7bfd0
				unsigned long hh;
1767e7c
				strcpy(s, name);
7a7bfd0
				pp = strstr(s, ".ARCH");
7a7bfd0
				*pp = 0;
7a7bfd0
				hh = hash(s);
7a7bfd0
				for (n=0; n
7a7bfd0
					if ( pkg[n].namehash == hh && !strcmp(pkg[n].name, s)) {
70bc52c
						has_noarch_pkg = pkg[n].main_pkg_written;
7a7bfd0
						break;
7a7bfd0
					}
7a7bfd0
				}
70bc52c
				if ( has_noarch_pkg && pkg[n].catalogue_license & LIC_NOTALLOWED ) {
70bc52c
					printf("Bad license: %s\n", pkg[n].name);
70bc52c
					continue;
70bc52c
				}
70bc52c
				fprintf(fsrc, "Source%04d: "CTAN_URL"%s.%s.tar."UNPACK"\n", mainsrcno, s, arch);
70bc52c
				fprintf(funpack, UNPACK" -dc %%{SOURCE%d} | tar x -C %%{buildroot}\n", mainsrcno);
70bc52c
				mainsrcno++;
1767e7c
			}
1767e7c
			/* is it collection or scheme? then don't create a separate package for it and put it to main one */
1767e7c
			if ( !strncmp(name, "collection-", 11) || !strncmp(name, "scheme-", 7) ) {
3f5e6b6
				pkg[i].any_pkg_written = 1;
1767e7c
				fprintf(funpack, UNPACK" -dc %%{SOURCE%d} | tar x -C %%{buildroot}%%{_texdir}%s\n", mainsrcno, pkg[i].reloc?"/texmf-dist":"");
1767e7c
				fprintf(fpack, "%%package %s\n", name);
1767e7c
				if ( pkg[i].shortdesc ) {
1767e7c
					fprintf(fpack, "Summary: %s\n", pkg[i].shortdesc);
1767e7c
				} else {
1767e7c
					fprintf(fpack, "Summary: %s package\n", name);
1767e7c
				}
2addf26
				fprintf(fpack, "Version: %s\n", print_noarch_version(&pkg[i]));
2addf26
				fprintf(fpack, "Release: %%{tl_release}\n");
1767e7c
				fprintf(fpack, "BuildArch: noarch\n");
1767e7c
				fprintf(fsrc, "Source%04d: "CTAN_URL"%s.tar."UNPACK"\n", mainsrcno++, name);
1767e7c
				fprintf(fpack, "Requires: texlive-base\n");
1767e7c
				for (n=0; n
1767e7c
					if ( pkg[i].req[n] ) {
1767e7c
						if ( pkg[i].req[n]->catalogue_license & LIC_NOTALLOWED ) {
1767e7c
							continue;
1767e7c
						}
1767e7c
						if ( pkg[i].req[n]->reqs || pkg[i].req[n]->runfs || pkg[i].req[n]->exes ) {
1767e7c
							if (strncmp(pkg[i].dep[n], "collection-", 11)) {
1767e7c
								fprintf(fpack, "Requires: tex-%s\n", pkg[i].dep[n]);
1767e7c
							} else {
1767e7c
								fprintf(fpack, "Requires: texlive-%s\n", pkg[i].dep[n]);
1767e7c
							}
1767e7c
							continue;
1767e7c
						}
1767e7c
#ifdef PACKAGE_DOCS
1767e7c
						if ( pkg[i].req[n]->docfs ) {
1767e7c
							fprintf(fpack, "Requires: texlive-%s-doc\n", pkg[i].dep[n]);
1767e7c
							continue;
1767e7c
						}
1767e7c
#endif
1767e7c
#ifdef PACKAGE_SOURCE
1767e7c
						if ( pkg[i].req[n]->srcfs ) {
1767e7c
							fprintf(fpack, "Requires: texlive-%s-source\n", pkg[i].dep[n]);
1767e7c
							continue;
1767e7c
						}
1767e7c
#endif
1767e7c
						if ( pkg[i].req[n]->binfs ) {
1767e7c
							size_t spost = strlen(pkg[i].dep[n])-5;
1767e7c
							if (strcmp(&pkg[i].dep[n][spost], ".ARCH")) {
1767e7c
								printf("Doesn't have .ARCH suffix!\n");
1767e7c
								exit(1);
1767e7c
							}
1767e7c
							pkg[i].dep[n][spost] = '\0';
1767e7c
							fprintf(fpack, "Requires: texlive-%s-bin\n", pkg[i].dep[n]);
1767e7c
							pkg[i].dep[n][spost] = '.';
1767e7c
							continue;
1767e7c
						}
1767e7c
					}
1767e7c
				}
1767e7c
				/* write virtual provides */
1767e7c
				if ( !strncmp(name, "collection-", 11) ) {
ee8e5e1
					if (!strcmp(name+11, "latexrecommended")) {
1767e7c
						fprintf(fpack, "Provides: tex(latex) = %%{tl_version}, texlive-latex = %%{tl_version}\n");
ee8e5e1
						fprintf(fpack, "Requires: texlive-collection-fontsrecommended\n");
ee8e5e1
					} else if (!strcmp(name+11, "latex")) {
ee8e5e1
						fprintf(fpack, "Provides: tex(latex-base) = %%{tl_version}\n");
1767e7c
					} else if (!strcmp(name+11, "basic")) {
1767e7c
						fprintf(fpack, "Provides: tex(tex) = %%{tl_version}, tex = %%{tl_version}\n");
d409867
						fprintf(fpack, "Requires: dvipdfmx, xdvik\n");
1767e7c
					} else if (!strcmp(name+11, "langcjk")) {
1767e7c
						fprintf(fpack, "Provides: tex(japanese) = %%{tl_version}\n");
1767e7c
						fprintf(fpack, "Provides: tex(east-asian) = %%{tl_version}\n");
1767e7c
						fprintf(fpack, "Obsoletes: texlive-east-asian < %%{tl_version}\n");
1767e7c
						fprintf(fpack, "Obsoletes: texlive-texmf-east-asian < %%{tl_version}\n");
1767e7c
					} else if (!strcmp(name+11, "documentation-base")) {
1767e7c
						fprintf(fpack, "Provides: texlive-texmf-doc = %%{tl_version}\n");
1767e7c
						fprintf(fpack, "Obsoletes: texlive-texmf-doc < %%{tl_version}\n");
1767e7c
					} else if (!strcmp(name+11, "fontsrecommended")) {
1767e7c
						fprintf(fpack, "Provides: tetex-fonts = 3.1-99\n");
1767e7c
						fprintf(fpack, "Obsoletes: tetex-fonts < 3.1-99\n");
1767e7c
						fprintf(fpack, "Provides: texlive-texmf-fonts = %%{tl_version}\n");
1767e7c
						fprintf(fpack, "Obsoletes: texlive-texmf-fonts < %%{tl_version}\n");
1767e7c
					} else if (!strcmp(name+11, "binextra")) {
1767e7c
						fprintf(fpack, "Obsoletes: texlive-utils < %%{tl_version}\n");
1767e7c
						fprintf(fpack, "Requires: dvipng\n");
1767e7c
					} else if (!strcmp(name+11, "xetex")) {
1767e7c
						fprintf(fpack, "Provides: tex(xetex) = %%{tl_version}\n");
1767e7c
						fprintf(fpack, "Obsoletes: texlive-texmf-xetex < %%{tl_version}\n");
1767e7c
					} else if (!strcmp(name+11, "fontutils")) {
1767e7c
						fprintf(fpack, "Requires: t1utils, psutils, lcdf-typetools\n");
1767e7c
					}
1767e7c
1767e7c
				}
1767e7c
				if ( !strcmp(name, "scheme-tetex") ) {
1767e7c
					fprintf(fpack, "Provides: tetex = 3.1-99\n");
1767e7c
					fprintf(fpack, "Obsoletes: tetex < 3.1-99\n");
1767e7c
					fprintf(fpack, "Obsoletes: texlive-dviutils < %%{tl_version}\n");
1767e7c
				}
1767e7c
				if ( !strcmp(name, "scheme-context") ) {
1767e7c
					fprintf(fpack, "Provides: tex(context) = %%{tl_version}\n");
1767e7c
					fprintf(fpack, "Obsoletes: texlive-texmf-context < %%{tl_version}\n");
1767e7c
				}
63887bc
				if ( !strcmp(name, "ps2pk") ) {
63887bc
					fprintf(fpack, "Provides: texlive-ps2pkm = %%{tl_version}\n");
63887bc
					fprintf(fpack, "Obsoletes: texlive-ps2pkm < %%{tl_version}\n");
63887bc
				}
63887bc
				if ( !strcmp(name, "ps2pk-bin") ) {
38860dc
					fprintf(fpack, "Provides: texlive-ps2pkm-bin%%{_isa} = %%{tl_version}\n");
63887bc
					fprintf(fpack, "Provides: texlive-ps2pkm-bin = %%{tl_version}\n");
63887bc
					fprintf(fpack, "Obsoletes: texlive-ps2pkm-bin < %%{tl_version}\n");
63887bc
				}
63887bc
1767e7c
				/* description */
1767e7c
				fprintf(fpack, "\n%%description %s\n", name);
1767e7c
				for (n=0; n
1767e7c
					fprintf(fpack, "%s\n", pkg[i].longdesc[n]);
1767e7c
				}
1767e7c
				if ( !pkg[i].longdesc_lines ) fprintf(fpack, "%s package\n", name);
1767e7c
				if ( pkg[i].catalogue_date ) fprintf(fpack, "\ndate: %s\n", pkg[i].catalogue_date);
1767e7c
				fprintf(fpack, "\n");
1767e7c
				fprintf(ffile, "%%files %s\n%%defattr(-,root,root)\n\n", name);
1767e7c
				goto slv;
1767e7c
			}
1767e7c
#ifdef SRPMS
1767e7c
			if ( !pkg[i].binfs ) {
1767e7c
				char path[0x100];
1767e7c
				char p[0x100];
1767e7c
1767e7c
				ofpack = fpack;
1767e7c
				offile = ffile;
1767e7c
				ofunpack = funpack;
1767e7c
				ofsrc = fsrc;
1767e7c
				ofremove = fremove;
1767e7c
				offont = ffont;
1767e7c
1767e7c
				snprintf(path, sizeof(path), "specs/tex-%s", name);
1767e7c
				mkdir(path, 0775);
1767e7c
				snprintf(p, sizeof(p), "%s/_packages.spec", path);
1767e7c
				fpack = fopen(p, "wt");
1767e7c
				snprintf(p, sizeof(p), "%s/_files.spec", path);
1767e7c
				ffile = fopen(p, "wt");
1767e7c
				snprintf(p, sizeof(p), "%s/_unpack.spec", path);
1767e7c
				funpack = fopen(p, "wt");
1767e7c
				snprintf(p, sizeof(p), "%s/_sources.spec", path);
1767e7c
				fsrc = fopen(p, "wt");
1767e7c
				snprintf(p, sizeof(p), "%s/_remove.spec", path);
1767e7c
				fremove = fopen(p, "wt");
1767e7c
				snprintf(p, sizeof(p), "%s/_font.spec", path);
1767e7c
				ffont = fopen(p, "wt");
1767e7c
				snprintf(p, sizeof(p), "%s/_main.spec", path);
1767e7c
				symlink("../../_main_subpackage.spec", p);
1767e7c
1767e7c
				srcno = 0;
1767e7c
			}
1767e7c
			if ( pkg[i].catalogue_license ) fprintf(funpack, "ln -s %%{_texdir}/licenses/%s.txt %s.txt\n", put_token(pkg[i].catalogue_license, license), put_token(pkg[i].catalogue_license, license));
1767e7c
#endif
1767e7c
			/* write main packages */
1767e7c
			if ( pkg[i].runfs || pkg[i].reqs || pkg[i].exes ) {
3f5e6b6
				pkg[i].main_pkg_written = pkg[i].any_pkg_written = 1;
1767e7c
				fprintf(funpack, UNPACK" -dc %%{SOURCE%d} | tar x -C %%{buildroot}%%{_texdir}%s\n", srcno, pkg[i].reloc?"/texmf-dist":"");
1767e7c
#ifndef SRPMS
1767e7c
				fprintf(fpack, "%%package %s\n", name);
1767e7c
				fprintf(fpack, "Provides: tex-%s = %%{tl_version}\n", name);
1767e7c
#else
1767e7c
				fprintf(fpack, "Name: tex-%s\n", name);
1767e7c
				fprintf(fpack, "Obsoletes: texlive-%s texlive-%s-doc texlive-%s-fedora-fonts\n", name, name, name);
1767e7c
#endif
1767e7c
				fprintf(fpack, "License: %s\n", pkg[i].fedora_license?pkg[i].fedora_license:(put_token(pkg[i].catalogue_license, spec_license)?put_token(pkg[i].catalogue_license, spec_license):"LPPL"));
1767e7c
				if ( pkg[i].shortdesc ) {
1767e7c
					fprintf(fpack, "Summary: %s\n", pkg[i].shortdesc);
1767e7c
				} else {
1767e7c
					fprintf(fpack, "Summary: %s package\n", name);
1767e7c
				}
2addf26
				fprintf(fpack, "Version: %s\n", print_noarch_version(&pkg[i]));
1767e7c
				fprintf(fpack, "Release: %%{tl_noarch_release}\n");
d7af6e6
				fprintf(fpack, "BuildArch: noarch\n");
d7af6e6
				if (!strcmp(name,"pdfcrop")) {
d7af6e6
					fprintf(fpack, "AutoReqProv: No\n");
d7af6e6
				}
1767e7c
				fprintf(fsrc, "Source%04d: "CTAN_URL"%s.tar."UNPACK"\n", srcno++, name);
1767e7c
				if ( pkg[i].has_man || pkg[i].has_info ) {
1767e7c
					char nm[0x100];
1767e7c
					FILE *f;
1767e7c
					snprintf(nm, sizeof(nm), "texlive/archive/%s.doc.tar."UNPACK, name);
1767e7c
					f = fopen(nm, "rb");
1767e7c
					if ( f ) {
1767e7c
						fprintf(funpack, UNPACK" -dc %%{SOURCE%d} | tar x -C %%{buildroot}%%{_texdir}%s\n", srcno, pkg[i].reloc?"/texmf-dist":"");
1767e7c
						fprintf(fsrc, "Source%04d: "CTAN_URL"%s.doc.tar."UNPACK"\n", srcno++, name);
1767e7c
						doc_expanded = 1;
1767e7c
						fclose(f);
1767e7c
					}
1767e7c
				}
1767e7c
1767e7c
				if ( strncmp(name, "kpathsea", 8) ) {
1767e7c
					fprintf(fpack, "Requires: texlive-base\n");
1767e7c
				} else {
1767e7c
					fprintf(fpack, "Provides: kpathsea = %%{tl_version}\n");
1767e7c
					fprintf(fpack, "Obsoletes: kpathsea < %%{tl_version}\n");
1767e7c
					fprintf(funpack, "\n# add reference to support old texmf tree\n"
d409867
					"sed -i 's|TEXMFLOCAL = $SELFAUTOPARENT/../texmf-local|TEXMFLOCAL = $SELFAUTOPARENT/../texmf|g' %%{buildroot}%%{_texdir}/texmf-dist/web2c/texmf.cnf\n\n");
1767e7c
				}
1767e7c
				if ( !strncmp(name, "asana-math", 10) ) {
1767e7c
					fprintf(fpack, "Provides: texlive-Asana-Math = %%{tl_version}.1\n");
1767e7c
					fprintf(fpack, "Obsoletes: texlive-Asana-Math < %%{tl_version}.1\n");
1767e7c
					fprintf(fpack, "Obsoletes: texlive-Asana-Math-fedora-fonts < %%{tl_version}.1\n");
1767e7c
				}
1767e7c
				if ( !strncmp(name, "lineara", 10) ) {
1767e7c
					fprintf(fpack, "Provides: texlive-linearA = %%{tl_version}.1\n");
1767e7c
					fprintf(fpack, "Obsoletes: texlive-linearA < %%{tl_version}.1\n");
1767e7c
					fprintf(fpack, "Obsoletes: texlive-linearA-fedora-fonts < %%{tl_version}.1\n");
1767e7c
				}
1767e7c
				if ( !strncmp(name, "minted", 6) ) {
1767e7c
					fprintf(fpack, "Requires: python-pygments\n");
1767e7c
				}
1767e7c
/*				if ( !strncmp(name, "asymptote", 9) ) {
1767e7c
					fprintf(fpack, "Provides: asymptote = %%{tl_version}\n");
1767e7c
					fprintf(fpack, "Obsoletes: asymptote < %%{tl_version}\n");
38566cc
				}*/
38566cc
				if ( !strncmp(name, "jadetex", 7) ) {
1767e7c
					fprintf(fpack, "Provides: jadetex = %%{tl_version}\n");
1767e7c
					fprintf(fpack, "Obsoletes: jadetex < %%{tl_version}\n");
1767e7c
				}
1767e7c
				fprintf(fpack, REQ_POSTTRANS"texlive-kpathsea-bin, tex-kpathsea\n");
1767e7c
				if ( pkg[i].exes ) {
1767e7c
					fprintf(fpack, REQ_POSTTRANS"texlive-tetex-bin, tex-tetex\n");
8caac5f
					fprintf(fpack, REQ_POST_POSTUN"texlive-tetex-bin, tex-tetex, tex-hyphen-base, texlive-base, texlive-texlive.infra\n");
1767e7c
				}
ceba7ad
				/* require coreutils if there is %post scriptlet present */
ceba7ad
				if ( pkg[i].exes || pkg[i].runfs ) fprintf(fpack, REQ_POST_POSTUN"coreutils\n");
38566cc
//				if ( pkg[i].runfs ) fprintf(fpack, REQ_POST_POSTUN"texlive-kpathsea-bin, tex-kpathsea\n");
1767e7c
				for (n=0; n
1767e7c
					if ( pkg[i].req[n] ) {
1767e7c
						if ( pkg[i].req[n]->catalogue_license & LIC_NOTALLOWED ) {
1767e7c
							continue;
1767e7c
						}
1767e7c
						if ( pkg[i].req[n]->reqs || pkg[i].req[n]->runfs || pkg[i].req[n]->exes ) {
1767e7c
							fprintf(fpack, "Requires: tex-%s\n", pkg[i].dep[n]);
1767e7c
							continue;
1767e7c
						}
1767e7c
#ifdef PACKAGE_DOCS
1767e7c
						if ( pkg[i].req[n]->docfs ) {
1767e7c
							fprintf(fpack, "Requires: tex-%s-doc\n", pkg[i].dep[n]);
1767e7c
							continue;
1767e7c
						}
1767e7c
#endif
1767e7c
#ifdef PACKAGE_SOURCE
1767e7c
						if ( pkg[i].req[n]->srcfs ) {
1767e7c
							fprintf(fpack, "Requires: tex-%s-source\n", pkg[i].dep[n]);
1767e7c
							continue;
1767e7c
						}
1767e7c
#endif
1767e7c
						if ( pkg[i].req[n]->binfs ) {
1767e7c
							size_t spost = strlen(pkg[i].dep[n])-5;
1767e7c
							if (strcmp(&pkg[i].dep[n][spost], ".ARCH")) {
1767e7c
								printf("Doesn't have .ARCH suffix!\n");
1767e7c
								exit(1);
1767e7c
							}
1767e7c
							pkg[i].dep[n][spost] = '\0';
1767e7c
							fprintf(fpack, "Requires: texlive-%s-bin\n", pkg[i].dep[n]);
1767e7c
							pkg[i].dep[n][spost] = '.';
1767e7c
							continue;
1767e7c
						}
1767e7c
					}
1767e7c
				}
1767e7c
				/* Ruby dependencies */
1767e7c
				for (n=0; n
1767e7c
					if ( !strncmp(&pkg[i].runf[n][strlen(pkg[i].runf[n])-3], ".rb", 3)
1767e7c
					   ) {
1767e7c
						fprintf(fpack, "Requires: ruby\n");
1767e7c
						break;
1767e7c
					   }
1767e7c
				}
1767e7c
				/* Require needed files */
1767e7c
				for (n=0; n
1767e7c
					fprintf(fpack, "Requires: tex(%s)\n", pkg[i].file_req[n]);
1767e7c
				}
1767e7c
				/* Provide all important files */
1767e7c
				for (n=0; n
1767e7c
					fprintf(fpack, "Provides: tex(%s) = %%{tl_version}\n", pkg[i].file_prov[n]);
1767e7c
				}
1767e7c
#ifdef FEDORA_FONTS
1767e7c
				/* check for fonts */
1767e7c
				for (n=0; n
1767e7c
					size_t s = strlen(pkg[i].runf[n]);
1767e7c
					if (s > 4) {
1767e7c
						if (!strcmp(&pkg[i].runf[n][s-4], ".ttf") ||
1767e7c
						    !strcmp(&pkg[i].runf[n][s-4], ".ttc") ||
1767e7c
						    !strcmp(&pkg[i].runf[n][s-4], ".pfa") ||
1767e7c
						    !strcmp(&pkg[i].runf[n][s-4], ".pfb") ||
1767e7c
						    !strcmp(&pkg[i].runf[n][s-4], ".pcf") ||
1767e7c
						    !strcmp(&pkg[i].runf[n][s-4], ".otf")
1767e7c
						) {
1767e7c
							fprintf(fpack, "Requires: tex-%s-fedora-fonts\n", name);
1767e7c
							break;
1767e7c
						}
1767e7c
					}
1767e7c
				}
1767e7c
#endif
1767e7c
				/* write virtual provides */
1767e7c
				if ( !strcmp(name, "dvips") ) {
1767e7c
					fprintf(fpack, "Provides: tex(dvips) = %%{tl_version}, tetex-dvips = 3.1-99, texlive-texmf-dvips = %%{tl_version}, texlive-dvips = %%{tl_version}\n");
1767e7c
					fprintf(fpack, "Obsoletes: tetex-dvips < 3.1-99, texlive-texmf-dvips < %%{tl_version}\n");
2e16460
					fprintf(fpack, "Requires: texlive-latex-fonts\n");
1767e7c
				}
1767e7c
				if ( !strcmp(name, "tex4ht") ) {
1767e7c
					fprintf(fpack, "Provides: tetex-tex4ht = %%{tl_version}\n");
1767e7c
					fprintf(fpack, "Obsoletes: tetex-tex4ht < %%{tl_version}\n");
1767e7c
				}
1767e7c
				if ( !strcmp(name, "latex") ) {
1767e7c
					fprintf(fpack, "Provides: tetex-latex = 3.1-99, texlive-texmf-latex = %%{tl_version}\n");
1767e7c
					fprintf(fpack, "Obsoletes: tetex-latex < 3.1-99, texlive-texmf-latex < %%{tl_version}\n");
1767e7c
				}
1767e7c
				if ( !strcmp(name, "IEEEtran") ) {
1767e7c
					fprintf(fpack, "Provides: tetex-IEEEtran = %%{tl_version}\n");
1767e7c
					fprintf(fpack, "Obsoletes: tetex-IEEEtran < %%{tl_version}\n");
1767e7c
				}
1767e7c
				if ( !strcmp(name, "bytefield") ) {
1767e7c
					fprintf(fpack, "Provides: tetex-bytefield = %%{tl_version}\n");
1767e7c
					fprintf(fpack, "Obsoletes: tetex-bytefield < %%{tl_version}\n");
1767e7c
				}
1767e7c
				if ( !strcmp(name, "elsevier") ) {
1767e7c
					fprintf(fpack, "Provides: tetex-elsevier = %%{tl_version}\n");
1767e7c
					fprintf(fpack, "Obsoletes: tetex-elsevier < %%{tl_version}\n");
1767e7c
				}
1767e7c
				if ( !strcmp(name, "perltex") ) {
1767e7c
					fprintf(fpack, "Provides: tetex-perltex = %%{tl_version}\n");
1767e7c
					fprintf(fpack, "Obsoletes: tetex-perltex < %%{tl_version}\n");
1767e7c
				}
1767e7c
				if ( !strcmp(name, "prosper") ) {
1767e7c
					fprintf(fpack, "Provides: tetex-prosper = %%{tl_version}\n");
1767e7c
					fprintf(fpack, "Obsoletes: tetex-prosper < %%{tl_version}\n");
1767e7c
				}
1767e7c
				if ( !strcmp(name, "texdoc") ) {
1767e7c
					fprintf(fpack, "Provides: texlive-doc = %%{tl_version}\n");
1767e7c
					fprintf(fpack, "Obsoletes: texlive-doc < %%{tl_version}\n");
1767e7c
				}
1767e7c
				if ( !strcmp(name, "pdfjam") ) {
1767e7c
					fprintf(fpack, "Provides: pdfjam = %%{tl_version}\n");
1767e7c
					fprintf(fpack, "Obsoletes: pdfjam < %%{tl_version}\n");
1767e7c
				}
1767e7c
				if ( !strcmp(name, "ptex") ) {
1767e7c
					fprintf(fpack, "Provides: mendexk = %%{tl_version}\n");
1767e7c
					fprintf(fpack, "Obsoletes: mendexk < %%{tl_version}\n");
1767e7c
				}
1767e7c
				if ( !strcmp(name, "japanese") ) {
1767e7c
					fprintf(fpack, "Provides: texlive-east-asian = %%{tl_version}\n");
1767e7c
					fprintf(fpack, "Obsoletes: texlive-east-asian < %%{tl_version}\n");
1767e7c
				}
1767e7c
				if ( !strcmp(name, "preview") ) {
1767e7c
					fprintf(fpack, "Provides: tex-preview = %%{tl_version}\n");
1767e7c
					fprintf(fpack, "Obsoletes: tex-preview < %%{tl_version}\n");
1767e7c
				}
cb7df5f
/*				if ( !strcmp(name, "latexmk") ) {	// rhbz#868996
1767e7c
					fprintf(fpack, "Provides: latexmk = %%{tl_version}\n");
1767e7c
					fprintf(fpack, "Obsoletes: latexmk < %%{tl_version}\n");
cb7df5f
				}*/
b99ffd1
				if ( !strcmp(name, "chktex") ) {	/* rhbz#864211 */
b99ffd1
					fprintf(fpack, "Provides: chktex = %%{tl_version}\n");
b99ffd1
					fprintf(fpack, "Obsoletes: chktex < %%{tl_version}\n");
b99ffd1
				}
fba03f6
				if ( !strcmp(name, "metauml") ) {	/* rhbz#573863 */
fba03f6
					fprintf(fpack, "Provides: metapost-metauml = %%{tl_version}\n");
fba03f6
					fprintf(fpack, "Obsoletes: metapost-metauml < %%{tl_version}\n");
fba03f6
				}
e4a92fe
				if ( !strcmp(name, "cm-lgc") ) {	/* rhbz#907728 */
e4a92fe
					fprintf(fpack, "Obsoletes: tex-cm-lgc < %%{tl_version}\n");
e4a92fe
				}
e4a92fe
				if ( !strcmp(name, "simplecv") ) {	/* rhbz#907728 */
e4a92fe
					fprintf(fpack, "Obsoletes: tex-simplecv < %%{tl_version}\n");
e4a92fe
				}
e4a92fe
				if ( !strcmp(name, "kerkis") ) {	/* rhbz#907728 */
e4a92fe
					fprintf(fpack, "Obsoletes: tex-kerkis < %%{tl_version}\n");
e4a92fe
				}
e4a92fe
				if ( !strcmp(name, "detex") ) {		/* rhbz#913678 */
e4a92fe
					fprintf(fpack, "Obsoletes: detex < %%{tl_version}\n");
e4a92fe
				}
e4a92fe
				if ( !strcmp(name, "latexdiff") ) {	/* rhbz#913678 */
e4a92fe
					fprintf(fpack, "Obsoletes: latexdiff < %%{tl_version}\n");
e4a92fe
				}
e4a92fe
				if ( !strcmp(name, "pdfjam") ) {	/* rhbz#913678 */
e4a92fe
					fprintf(fpack, "Obsoletes: pdfbook < %%{tl_version}1212\n");
e4a92fe
				}
d5df12b
				if ( !strcmp(name, "musixtex-fnts") ) {
d5df12b
					fprintf(fpack, "Provides: ctan-musixtex-fonts = %%{tl_version}\n");
d5df12b
					fprintf(fpack, "Obsoletes: ctan-musixtex-fonts < %%{tl_version}\n");
d5df12b
				}
d5df12b
				if ( !strcmp(name, "musixtex-doc") ) {
d5df12b
					fprintf(fpack, "Provides: tex-musixtex-doc = %%{tl_version}\n");
d5df12b
					fprintf(fpack, "Obsoletes: tex-musixtex-doc < %%{tl_version}\n");
d5df12b
				}
d5df12b
				if ( !strcmp(name, "musixtex") ) {
d5df12b
					fprintf(fpack, "Provides: tex-musixtex = %%{tl_version}\n");
d5df12b
					fprintf(fpack, "Obsoletes: tex-musixtex < %%{tl_version}\n");
d5df12b
				}
ceba7ad
				if ( !strcmp(name, "dvipdfmx") ) {	/* rhbz#968358 */
ceba7ad
					fprintf(fpack, "Provides: texlive-dvipdfm = 3:%%{tl_version}\n");
ceba7ad
					fprintf(fpack, "Obsoletes: texlive-dvipdfm < 3:%%{tl_version}\n");
ceba7ad
				}
1767e7c
				/* description */
1767e7c
#ifndef SRPMS
1767e7c
				fprintf(fpack, "\n%%description %s\n", name);
1767e7c
#else
1767e7c
				fprintf(fpack, "\n%%description\n");
1767e7c
#endif
1767e7c
				for (n=0; n
1767e7c
					fprintf(fpack, "%s\n", pkg[i].longdesc[n]);
1767e7c
				}
1767e7c
				if ( !pkg[i].longdesc_lines ) fprintf(fpack, "%s package\n", name);
1767e7c
				if ( pkg[i].catalogue_date ) fprintf(fpack, "\ndate: %s\n", pkg[i].catalogue_date);
1767e7c
				fprintf(fpack, "\n");
1767e7c
				/* preun/post/postun scriptlets */
1767e7c
				if ( pkg[i].exes ) {
1767e7c
					int run_updmap, run_fmtutil;
1767e7c
#ifndef SRPMS
1767e7c
					fprintf(fpack, "%%post %s\n", name);
1767e7c
#else
1767e7c
					fprintf(fpack, "%%post\n");
1767e7c
#endif
1767e7c
					fprintf(fpack, "mkdir -p /var/run/texlive\ntouch /var/run/texlive/run-texhash\n");
1767e7c
					if ( pkg[i].has_info ) {
1767e7c
						int k;
1767e7c
1767e7c
						for (k=0; k
d409867
							if (!strncmp(pkg[i].runf[k], "texmf-dist/doc/info/", 20)) {
d409867
								fprintf(fpack, "/sbin/install-info %%{_infodir}/%s %%{_infodir}/dir 2>/dev/null\n", &pkg[i].runf[k][20]);
1767e7c
							}
1767e7c
						}
1767e7c
					}
1767e7c
					fprintf(fpack, "if [ $1 -gt 0 ] ; then\n");
1767e7c
					for (run_updmap=run_fmtutil=n=0; n
1767e7c
						if ( !strncmp(pkg[i].exe[n], "addLuaMap ", 9) ) {
1767e7c
							continue;
1767e7c
						}
1767e7c
						if ( !strncmp(pkg[i].exe[n], "addMap ", 7) ) {
d7af6e6
							fprintf(fpack, "%%{_bindir}/updmap-sys --quiet --nomkmap --enable Map=%s"REDIR, skipspaces(&pkg[i].exe[n][7]));
1767e7c
							run_updmap = 1;
1767e7c
							continue;
1767e7c
						}
1767e7c
						if ( !strncmp(pkg[i].exe[n], "addMixedMap ", 12) ) {
d7af6e6
							fprintf(fpack, "%%{_bindir}/updmap-sys --quiet --nomkmap --enable MixedMap=%s"REDIR, skipspaces(&pkg[i].exe[n][12]));
1767e7c
							run_updmap = 1;
1767e7c
							continue;
1767e7c
						}
1767e7c
						if ( !strncmp(pkg[i].exe[n], "addKanjiMap ", 12) ) {
d7af6e6
							fprintf(fpack, "%%{_bindir}/updmap-sys --quiet --nomkmap --enable KanjiMap=%s"REDIR, skipspaces(&pkg[i].exe[n][12]));
1767e7c
							run_updmap = 1;
1767e7c
							continue;
1767e7c
						}
1767e7c
						if ( !strncmp(pkg[i].exe[n], "BuildFormat ", 12) ) {
1b033d6
							fprintf(fpack, "%%{_bindir}/fmtutil-sys --enablefmt %s"REDIR, &pkg[i].exe[n][12]);
1767e7c
							run_fmtutil = 1;
1767e7c
							continue;
1767e7c
						}
1767e7c
						if ( !strncmp(pkg[i].exe[n], "AddFormat ", 10) ) {
1767e7c
							char *name	= strstr(pkg[i].exe[n], "name="),
1767e7c
							     *engine	= strstr(pkg[i].exe[n], "engine="),
1767e7c
							     *patterns	= strstr(pkg[i].exe[n], "patterns="),
1767e7c
							     *options	= strstr(pkg[i].exe[n], "options=");
1767e7c
							char *opt, opt_char;
1767e7c
1767e7c
							if ( !name || !engine || !options ) {
1767e7c
								fprintf(stderr, "Invalid AddFormat entry in package %s: '%s' '%s' '%s' '%s'.\n", pkg[i].name, name, engine, patterns, options);
1767e7c
								exit(1);
1767e7c
							}
1767e7c
							name += 5;
1767e7c
							engine += 7;
1767e7c
							if ( patterns ) patterns += 9;
1767e7c
							options += 8;
1767e7c
1767e7c
							*strchr(name, ' ') = '\0';
1767e7c
							*strchr(engine, ' ') = '\0';
1767e7c
							if ( patterns && strchr(patterns, ' ') ) *strchr(patterns, ' ') = '\0';
1767e7c
							if ( *options == '"' ) {
1767e7c
								options++;
1767e7c
								opt = strchr(options, '"');
1767e7c
							} else {
1767e7c
								for (opt=options; *opt != ' ' && *opt != '\n'; opt++);
1767e7c
							}
1767e7c
							opt_char = *opt;
1767e7c
							*opt = '\0';
1767e7c
d409867
							fprintf(fpack, "sed -i 's/^\\#\\!\\ %s.*$/%s %s %s %s/' %%{_texdir}/texmf-dist/web2c/fmtutil.cnf\n", name, name, engine, patterns?patterns:"-", options);
1767e7c
1767e7c
							name[strlen(name)] = ' ';
1767e7c
							engine[strlen(engine)] = ' ';
1767e7c
							if ( patterns ) patterns[strlen(patterns)] = ' ';
1767e7c
							*opt = opt_char;
1767e7c
1767e7c
							run_fmtutil = 1;
1767e7c
							continue;
1767e7c
						}
1767e7c
						if ( !strncmp(pkg[i].exe[n], "AddHyphen ", 10) ) {
1767e7c
							char *name		= strstr(pkg[i].exe[n], "name="),
1767e7c
							     *synonyms		= strstr(pkg[i].exe[n], "synonyms="),
1767e7c
							     *lefthyphenmin	= strstr(pkg[i].exe[n], "lefthyphenmin="),
1767e7c
							     *righthyphenmin	= strstr(pkg[i].exe[n], "righthyphenmin="),
1767e7c
							     *file		= strstr(pkg[i].exe[n], "file=");
1767e7c
							int k;
1767e7c
1767e7c
							if ( !name || !lefthyphenmin || !righthyphenmin || !file ) {
1767e7c
								fprintf(stderr, "Invalid AddHyphen entry in package %s.\n", pkg[i].name);
1767e7c
								exit(1);
1767e7c
							}
1767e7c
							name += 5;
1767e7c
							if ( synonyms ) synonyms += 9;
1767e7c
							lefthyphenmin += 14;
1767e7c
							righthyphenmin += 15;
1767e7c
							file += 5;
1767e7c
							for (k=10; pkg[i].exe[n][k]; k++) if ( pkg[i].exe[n][k] == ' ' ) pkg[i].exe[n][k] = '\0';
1767e7c
d409867
							fprintf(fpack, "sed -i '/%s.*/d' %%{_texdir}/texmf-dist/tex/generic/config/language.dat\n", name);
d409867
							fprintf(fpack, "echo \"%s %s\" >> %%{_texdir}/texmf-dist/tex/generic/config/language.dat\n", name, file);
1767e7c
							if ( synonyms ) {
1767e7c
								char *syn = synonyms, *s;
1767e7c
								while ( (s=strchr(syn, ',')) ) {
1767e7c
									*s = '\0';
d409867
									fprintf(fpack, "sed -i '/=%s/d' %%{_texdir}/texmf-dist/tex/generic/config/language.dat\n", syn);
d409867
									fprintf(fpack, "echo \"=%s\" >> %%{_texdir}/texmf-dist/tex/generic/config/language.dat\n", syn);
1767e7c
									*s = ',';
1767e7c
									syn = s+1;
1767e7c
								}
d409867
								fprintf(fpack, "sed -i '/=%s/d' %%{_texdir}/texmf-dist/tex/generic/config/language.dat\n", syn);
d409867
								fprintf(fpack, "echo \"=%s\" >> %%{_texdir}/texmf-dist/tex/generic/config/language.dat\n", syn);
1767e7c
							}
d409867
							fprintf(fpack, "sed -i '/\\\\addlanguage{%s}.*/d' %%{_texdir}/texmf-dist/tex/generic/config/language.def\n", name);
d409867
							fprintf(fpack, "echo \"\\addlanguage{%s}{%s}{}{%s}{%s}\" >> %%{_texdir}/texmf-dist/tex/generic/config/language.def\n", name, file, lefthyphenmin, righthyphenmin);
1767e7c
							if ( synonyms ) {
1767e7c
								char *syn = synonyms, *s;
1767e7c
								while ( (s=strchr(syn, ',')) ) {
1767e7c
									*s = '\0';
d409867
									fprintf(fpack, "sed -i '/\\\\addlanguage{%s}.*/d' %%{_texdir}/texmf-dist/tex/generic/config/language.def\n", syn);
d409867
									fprintf(fpack, "echo \"\\addlanguage{%s}{%s}{}{%s}{%s}\" >> %%{_texdir}/texmf-dist/tex/generic/config/language.def\n", syn, file, lefthyphenmin, righthyphenmin);
1767e7c
									*s = ',';
1767e7c
									syn = s+1;
1767e7c
								}
d409867
								fprintf(fpack, "sed -i '/\\\\addlanguage{%s}.*/d' %%{_texdir}/texmf-dist/tex/generic/config/language.def\n", syn);
d409867
								fprintf(fpack, "echo \"\\addlanguage{%s}{%s}{}{%s}{%s}\" >> %%{_texdir}/texmf-dist/tex/generic/config/language.def\n", syn, file, lefthyphenmin, righthyphenmin);
1767e7c
							}
1767e7c
							for (--k; k>=10; k--) if ( pkg[i].exe[n][k] == '\0' ) pkg[i].exe[n][k] = ' ';
1767e7c
							run_fmtutil = 1;
1767e7c
							continue;
1767e7c
						}
1767e7c
						fprintf(stderr, "Unknown exec format: %s\n", pkg[i].exe[n]);
1767e7c
						exit(1);
1767e7c
						continue;
1767e7c
					}
1767e7c
					if ( run_updmap ) fprintf(fpack, "touch /var/run/texlive/run-updmap\n");
1767e7c
					if ( run_fmtutil ) fprintf(fpack, "touch /var/run/texlive/run-fmtutil\n");
1767e7c
					fprintf(fpack, "fi\n:\n");
1767e7c
#ifndef SRPMS
1767e7c
					fprintf(fpack, "\n%%postun %s\n", name);
1767e7c
#else
1767e7c
					fprintf(fpack, "\n%%postun\n");
1767e7c
#endif
1767e7c
					fprintf(fpack, "if [ $1 == 0 ] ; then\n");
1767e7c
					for (run_updmap=n=0; n
1767e7c
						if ( !strncmp(pkg[i].exe[n], "addLuaMap", 9) ) {
1767e7c
							continue;
1767e7c
						}
1767e7c
						if ( !strncmp(pkg[i].exe[n], "addMap ", 7) ) {
d7af6e6
							fprintf(fpack, "%%{_bindir}/updmap-sys --nomkmap --disable Map=%s"REDIR, skipspaces(&pkg[i].exe[n][7]));
1767e7c
							run_updmap = 1;
1767e7c
							continue;
1767e7c
						}
1767e7c
						if ( !strncmp(pkg[i].exe[n], "addMixedMap ", 12) ) {
d7af6e6
							fprintf(fpack, "%%{_bindir}/updmap-sys --nomkmap --disable MixedMap=%s"REDIR, skipspaces(&pkg[i].exe[n][12]));
1767e7c
							run_updmap = 1;
1767e7c
							continue;
1767e7c
						}
1767e7c
						if ( !strncmp(pkg[i].exe[n], "addKanjiMap ", 12) ) {
d7af6e6
							fprintf(fpack, "%%{_bindir}/updmap-sys --nomkmap --disable KanjiMap=%s"REDIR, skipspaces(&pkg[i].exe[n][12]));
1767e7c
							run_updmap = 1;
1767e7c
							continue;
1767e7c
						}
1767e7c
						if ( !strncmp(pkg[i].exe[n], "BuildFormat ", 12) ) {
1b033d6
							fprintf(fpack, "%%{_bindir}/fmtutil-sys --disablefmt %s"REDIR, &pkg[i].exe[n][12]);
1767e7c
							run_fmtutil = 1;
1767e7c
							continue;
1767e7c
						}
1767e7c
						if ( !strncmp(pkg[i].exe[n], "AddFormat ", 10) ) {
1767e7c
							char *name	= strstr(pkg[i].exe[n], "name="),
1767e7c
							     *engine	= strstr(pkg[i].exe[n], "engine="),
1767e7c
							     *patterns	= strstr(pkg[i].exe[n], "patterns="),
1767e7c
							     *options	= strstr(pkg[i].exe[n], "options=");
1767e7c
							char *opt, opt_char;
1767e7c
1767e7c
							if ( !name || !engine || !options ) {
1767e7c
								fprintf(stderr, "Invalid AddFormat entry in package %s: '%s' '%s' '%s' '%s'.\n", pkg[i].name, name, engine, patterns, options);
1767e7c
								exit(1);
1767e7c
							}
1767e7c
							name += 5;
1767e7c
							engine += 7;
1767e7c
							if ( patterns ) patterns += 9;
1767e7c
							options += 8;
1767e7c
1767e7c
							*strchr(name, ' ') = '\0';
1767e7c
							*strchr(engine, ' ') = '\0';
1767e7c
							if ( patterns ) *strchr(patterns, ' ') = '\0';
1767e7c
							if ( *options == '"' ) {
1767e7c
								options++;
1767e7c
								opt = strchr(options, '"');
1767e7c
							} else {
1767e7c
								for (opt=options; *opt != ' ' && *opt != '\n'; opt++);
1767e7c
							}
1767e7c
							opt_char = *opt;
1767e7c
							*opt = '\0';
1767e7c
1b033d6
							fprintf(fpack, "sed -i 's/^%s.*$/\\#\\!\\ %s %s %s %s/' %%{_texdir}/texmf-dist/web2c/fmtutil.cnf"REDIR, name, name, engine, patterns?patterns:"-", options);
1767e7c
1767e7c
							name[strlen(name)] = ' ';
1767e7c
							engine[strlen(engine)] = ' ';
1767e7c
							if ( patterns ) patterns[strlen(patterns)] = ' ';
1767e7c
							*opt = opt_char;
1767e7c
1767e7c
							run_fmtutil = 1;
1767e7c
							continue;
1767e7c
						}
1767e7c
						if ( !strncmp(pkg[i].exe[n], "AddHyphen ", 10) ) {
1767e7c
							char *name		= strstr(pkg[i].exe[n], "name="),
1767e7c
							     *synonyms		= strstr(pkg[i].exe[n], "synonyms="),
1767e7c
							     *lefthyphenmin	= strstr(pkg[i].exe[n], "lefthyphenmin="),
1767e7c
							     *righthyphenmin	= strstr(pkg[i].exe[n], "righthyphenmin="),
1767e7c
							     *file		= strstr(pkg[i].exe[n], "file=");
1767e7c
							int k;
1767e7c
1767e7c
							if ( !name || !lefthyphenmin || !righthyphenmin || !file ) {
1767e7c
								fprintf(stderr,"Invalid AddHyphen entry in package %s.\n", pkg[i].name);
1767e7c
								exit(1);
1767e7c
							}
1767e7c
							name += 5;
1767e7c
							if ( synonyms ) synonyms += 9;
1767e7c
							lefthyphenmin += 14;
1767e7c
							righthyphenmin += 15;
1767e7c
							file += 5;
1767e7c
							for (k=10; pkg[i].exe[n][k]; k++) if ( pkg[i].exe[n][k] == ' ' ) pkg[i].exe[n][k] = '\0';
1767e7c
1b033d6
							fprintf(fpack, "sed -i '/%s.*/d' %%{_texdir}/texmf-dist/tex/generic/config/language.dat"REDIR, name);
1767e7c
							if ( synonyms ) {
1767e7c
								char *syn = synonyms, *s;
1767e7c
								while ( (s=strchr(syn, ',')) ) {
1767e7c
									*s = '\0';
1b033d6
									fprintf(fpack, "  sed -i '/=%s/d' %%{_texdir}/texmf-dist/tex/generic/config/language.dat"REDIR, syn);
1767e7c
									*s = ',';
1767e7c
									syn = s+1;
1767e7c
								}
1b033d6
								fprintf(fpack, "  sed -i '/=%s/d' %%{_texdir}/texmf-dist/tex/generic/config/language.dat"REDIR, syn);
1767e7c
							}
1b033d6
							fprintf(fpack, "sed -i '/\\\\addlanguage{%s}.*/d' %%{_texdir}/texmf-dist/tex/generic/config/language.def"REDIR, name);
1767e7c
							if ( synonyms ) {
1767e7c
								char *syn = synonyms, *s;
1767e7c
								while ( (s=strchr(syn, ',')) ) {
1767e7c
									*s = '\0';
1b033d6
									fprintf(fpack, "sed -i '/\\\\addlanguage{%s}.*/d' %%{_texdir}/texmf-dist/tex/generic/config/language.def"REDIR, syn);
1767e7c
									*s = ',';
1767e7c
									syn = s+1;
1767e7c
								}
1b033d6
								fprintf(fpack, "sed -i '/\\\\addlanguage{%s}.*/d' %%{_texdir}/texmf-dist/tex/generic/config/language.def"REDIR, syn);
1767e7c
							}
1767e7c
							for (--k; k>=10; k--) if ( pkg[i].exe[n][k] == '\0' ) pkg[i].exe[n][k] = ' ';
1767e7c
							run_fmtutil = 1;
1767e7c
							continue;
1767e7c
						}
1767e7c
					}
659f73f
					fprintf(fpack, "mkdir -p /var/run/texlive\ntouch /var/run/texlive/run-texhash\ntouch /var/run/texlive/run-mtxrun\n");
1767e7c
					if ( run_updmap ) fprintf(fpack, "touch /var/run/texlive/run-updmap\n");
1767e7c
					if ( run_fmtutil ) fprintf(fpack, "touch /var/run/texlive/run-fmtutil\n");
1767e7c
					fprintf(fpack, "fi\n:\n\n");
1767e7c
#ifndef SRPMS
1767e7c
					fprintf(fpack, "%%posttrans %s\n", name);
1767e7c
#else
1767e7c
					fprintf(fpack, "%%posttrans\n");
1767e7c
#endif
e4a92fe
					fprintf(fpack, "if [ -e /var/run/texlive/run-texhash ]; then %%{_bindir}/texhash 2> /dev/null; rm -f /var/run/texlive/run-texhash; fi\n");
1b033d6
					if ( run_updmap ) fprintf(fpack, "if [ -e /var/run/texlive/run-updmap ]; then %%{_bindir}/updmap-sys --quiet --nomkmap &> /dev/null;rm -f /var/run/texlive/run-updmap; fi\n");
e4a92fe
					if ( run_fmtutil ) fprintf(fpack, "if [ -e /var/run/texlive/run-fmtutil ]; then %%{_bindir}/fmtutil-sys --all &> /dev/null; rm -f /var/run/texlive/run-fmtutil; fi\n");
d409867
					fprintf(fpack, "if [ -e /var/run/texlive/run-mtxrun ]; then export TEXMF=/usr/share/texlive/texmf-dist; export TEXMFCNF=/usr/share/texlive/texmf-dist/web2c; export TEXMFCACHE=/var/lib/texmf; %%{_bindir}/mtxrun --generate &> /dev/null; rm -f /var/run/texlive/run-mtxrun; fi\n");
1767e7c
					fprintf(fpack, ":\n\n");
1767e7c
				} else if ( pkg[i].runfs ) {
1767e7c
#ifndef SRPMS
1767e7c
					fprintf(fpack, "%%post %s\n", name);
1767e7c
#else
1767e7c
					fprintf(fpack, "%%post\n");
1767e7c
#endif
659f73f
					fprintf(fpack, "mkdir -p /var/run/texlive\ntouch /var/run/texlive/run-texhash\ntouch /var/run/texlive/run-mtxrun\n");
1767e7c
					if ( pkg[i].has_info ) {
1767e7c
						int k;
1767e7c
1767e7c
						for (k=0; k
d409867
							if (!strncmp(pkg[i].runf[k], "texmf-dist/doc/info/", 20)) {
d409867
								fprintf(fpack, "/sbin/install-info %%{_infodir}/%s %%{_infodir}/dir 2>/dev/null\n", &pkg[i].runf[k][20]);
1767e7c
							}
1767e7c
						}
1767e7c
					}
1767e7c
					fprintf(fpack, ":\n");
1767e7c
#ifndef SRPMS
1767e7c
					fprintf(fpack, "\n%%postun %s\n", name);
1767e7c
#else
1767e7c
					fprintf(fpack, "\n%%postun\n");
1767e7c
#endif
1767e7c
					fprintf(fpack, "if [ $1 == 1 ]; then\n  mkdir -p /var/run/texlive\n  touch /var/run/run-texhash\nelse\n  %%{_bindir}/texhash 2> /dev/null\nfi\n");
1767e7c
					fprintf(fpack, ":\n\n");
1767e7c
#ifndef SRPMS
1767e7c
					fprintf(fpack, "%%posttrans %s\n", name);
1767e7c
#else
1767e7c
					fprintf(fpack, "%%posttrans\n");
1767e7c
#endif
e4a92fe
					fprintf(fpack, "if [ -e /var/run/texlive/run-texhash ] && [ -e %%{_bindir}/texhash ]; then %%{_bindir}/texhash 2> /dev/null; rm -f /var/run/texlive/run-texhash; fi\n");
d409867
					fprintf(fpack, "if [ -e /var/run/texlive/run-mtxrun ]; then export TEXMF=/usr/share/texlive/texmf-dist; export TEXMFCNF=/usr/share/texlive/texmf-dist/web2c; export TEXMFCACHE=/var/lib/texmf; %%{_bindir}/mtxrun --generate &> /dev/null; rm -f /var/run/texlive/run-mtxrun; fi\n");
1767e7c
					fprintf(fpack, ":\n\n");
1767e7c
				}
1767e7c
1767e7c
				/* ... and main files */
1767e7c
#ifdef SRPMS
1767e7c
				mainpkg = 1;
1767e7c
#endif
8caac5f
				main_written = 0;
1767e7c
				append_filelist(pkg[i].name, "", pkg[i].runfs, pkg[i].runf, pkg[i].fedora_license?pkg[i].fedora_license:put_token(pkg[i].catalogue_license, license));
1767e7c
#ifdef SRPMS
1767e7c
				mainpkg = 0;
1767e7c
#endif
1767e7c
			}
8caac5f
			main_written = pkg[i].runfs || pkg[i].reqs || pkg[i].exes;
1767e7c
#ifdef PACKAGE_DOCS
1767e7c
			/* write doc package if exists */
1767e7c
			if ( pkg[i].docfs ) {
3f5e6b6
				pkg[i].any_pkg_written = 1;
1767e7c
				if ( !doc_expanded ) {
1767e7c
					fprintf(funpack, UNPACK" -dc %%{SOURCE%d} | tar x -C %%{buildroot}%%{_texdir}%s\n", srcno, pkg[i].reloc?"/texmf-dist":"");
1767e7c
					fprintf(fsrc, "Source%04d: "CTAN_URL"%s.doc.tar."UNPACK"\n", srcno++, name);
1767e7c
				}
1767e7c
				doc_expanded = 0;
1767e7c
#ifdef SRPMS
1767e7c
				if ( !main_written ) {
1767e7c
					fprintf(fpack, "Name: tex-%s-doc\n", name);
1767e7c
					fprintf(fpack, "Obsoletes: texlive-%s-doc\n", name);
1767e7c
					fprintf(fpack, "License: %s\n", pkg[i].fedora_license?pkg[i].fedora_license:(put_token(pkg[i].catalogue_license, spec_license)?put_token(pkg[i].catalogue_license, spec_license):"LPPL"));
1767e7c
				} else {
1767e7c
					fprintf(fpack, "%%package doc\n");
1767e7c
				}
1767e7c
#else
1767e7c
				fprintf(fpack, "%%package %s-doc\n", name);
1767e7c
#endif
1767e7c
				fprintf(fpack, "Summary: Documentation for %s\n", name);
2addf26
				fprintf(fpack, "Version: %s\n", print_noarch_version(&pkg[i]));
1767e7c
				fprintf(fpack, "Release: %%{tl_noarch_release}\n");
38566cc
				fprintf(fpack, "Provides: tex-%s-doc\n", name);
1767e7c
				fprintf(fpack, "BuildArch: noarch\nAutoReqProv: No\n");
1767e7c
				for (n=0; n
1767e7c
					if ( !pkg[i].req[n] ) continue;
1767e7c
					if ( pkg[i].req[n]->catalogue_license & LIC_NOTALLOWED ) continue;
1767e7c
					if ( pkg[i].req[n]->docfs )
1767e7c
						fprintf(fpack, "Requires: tex-%s-doc\n", pkg[i].dep[n]);
1767e7c
				}
1767e7c
				if ( main_written ) {
1767e7c
#ifndef SRPMS
1767e7c
					fprintf(fpack, "\n%%description %s-doc\n", name);
1767e7c
#else
1767e7c
					fprintf(fpack, "\n%%description doc\n");
1767e7c
#endif
1767e7c
				} else {
1767e7c
#ifdef SRPMS
1767e7c
					fprintf(fpack, "\n%%description\n");
1767e7c
#else
1767e7c
					fprintf(fpack, "\n%%description %s-doc\n", name);
1767e7c
#endif
1767e7c
				}
1767e7c
				fprintf(fpack, "Documentation for %s\n\n", name);
1767e7c
209d9f5
#ifndef SRPMS
209d9f5
                                fprintf(fpack, "%%post %s-doc\n", name);
209d9f5
#else
209d9f5
                                fprintf(fpack, "%%post\n");
209d9f5
#endif
209d9f5
                                fprintf(fpack, "mkdir -p /var/run/texlive\ntouch /var/run/texlive/run-texhash\n");
209d9f5
                                fprintf(fpack, ":\n");
209d9f5
#ifndef SRPMS
209d9f5
                                fprintf(fpack, "\n%%postun %s-doc\n", name);
209d9f5
#else
209d9f5
                                fprintf(fpack, "\n%%postun\n");
209d9f5
#endif
209d9f5
                                fprintf(fpack, "if [ $1 == 1 ]; then\n  mkdir -p /var/run/texlive\n  touch /var/run/run-texhash\nelse\n  %%{_bindir}/texhash 2> /dev/null\nfi\n");
209d9f5
                                fprintf(fpack, ":\n\n");
209d9f5
#ifndef SRPMS
209d9f5
                                fprintf(fpack, "%%posttrans %s-doc\n", name);
209d9f5
#else
209d9f5
                                fprintf(fpack, "%%posttrans\n");
209d9f5
#endif
209d9f5
                                fprintf(fpack, "if [ -e /var/run/texlive/run-texhash ] && [ -e %%{_bindir}/texhash ]; then %%{_bindir}/texhash 2> /dev/null; rm -f /var/run/texlive/run-texhash; fi\n");
209d9f5
                                fprintf(fpack, ":\n\n");
209d9f5
1767e7c
				/* ... and doc files */
1767e7c
#ifdef SRPMS
1767e7c
				mainpkg = 1;
1767e7c
#endif
1767e7c
				append_filelist(pkg[i].name, "doc", pkg[i].docfs, pkg[i].docf, pkg[i].fedora_license?pkg[i].fedora_license:put_token(pkg[i].catalogue_license, license));
1767e7c
#ifdef SRPMS
1767e7c
				mainpkg = 0;
1767e7c
#endif
1767e7c
1767e7c
			}
1767e7c
#endif
1767e7c
#ifdef PACKAGE_SOURCE
1767e7c
			/* write source package if exists */
1767e7c
			if ( pkg[i].srcfs ) {
1767e7c
				fprintf(funpack, UNPACK" -dc %%{SOURCE%d} | tar x -C %%{buildroot}%%{_texdir}%s\n", srcno, pkg[i].reloc?"/texmf-dist":"");
1767e7c
				fprintf(fsrc, "Source%04d: "CTAN_URL"%s.source.tar."UNPACK"\n", srcno++, name);
1767e7c
#ifndef SRPMS
1767e7c
				fprintf(fpack, "%%package %s-source\n", name);
1767e7c
#else
1767e7c
				fprintf(fpack, "%%package source\n");
1767e7c
#endif
1767e7c
				fprintf(fpack, "Summary: Sources for %s\n", name);
2addf26
				fprintf(fpack, "Version: %s\n", print_noarch_version(&pkg[i]));
1767e7c
				fprintf(fpack, "Release: %%{tl_noarch_release}\n");
1767e7c
				if ( strncmp(name, "kpathsea", 8) ) fprintf(fpack, "Requires: texlive-base\n");
1767e7c
				fprintf(fpack, "BuildArch: noarch\nAutoReqProv: No\n");
1767e7c
				for (n=0; n
1767e7c
					if ( !pkg[i].req[n] ) continue;
1767e7c
					if ( pkg[i].req[n]->catalogue_license & LIC_NOTALLOWED ) continue;
1767e7c
					if ( pkg[i].req[n]->srcfs )
1767e7c
						fprintf(fpack, "Requires: tex-%s-source\n", pkg[i].dep[n]);
1767e7c
				}
1767e7c
#ifndef SRPMS
1767e7c
				fprintf(fpack, "\n%%description %s-source\n", name);
1767e7c
#else
1767e7c
				fprintf(fpack, "\n%%description source\n");
1767e7c
#endif
1767e7c
				fprintf(fpack, "Sources for %s\n\n", name);
1767e7c
1767e7c
				/* ... and src files */
1767e7c
#ifdef SRPMS
1767e7c
				mainpkg = 1;
1767e7c
#endif
1767e7c
				append_filelist(pkg[i].name, "source", pkg[i].srcfs, pkg[i].srcf, pkg[i].fedora_license?pkg[i].fedora_license:put_token(pkg[i].catalogue_license, license));
1767e7c
#ifdef SRPMS
1767e7c
				mainpkg = 0;
1767e7c
#endif
1767e7c
			}
1767e7c
#else
1767e7c
			/* write just link to source */
1767e7c
			if ( pkg[i].srcfs ) {
1767e7c
				fprintf(fsrc, "Source%04d: "CTAN_URL"%s.source.tar."UNPACK"\n", srcno++, name);
1767e7c
			}
1767e7c
#endif
1767e7c
#ifdef FEDORA_FONTS
1767e7c
			/* fonts */
1767e7c
			{
1767e7c
				int n, has_fonts = 0, k;
1767e7c
1767e7c
				for (n=0; n
1767e7c
					size_t s = strlen(pkg[i].runf[n]);
1767e7c
					if (s > 4) {
1767e7c
						if (!strcmp(&pkg[i].runf[n][s-4], ".ttf") ||
1767e7c
						    !strcmp(&pkg[i].runf[n][s-4], ".ttc") ||
1767e7c
						    !strcmp(&pkg[i].runf[n][s-4], ".pfa") ||
1767e7c
						    !strcmp(&pkg[i].runf[n][s-4], ".pfb") ||
1767e7c
						    !strcmp(&pkg[i].runf[n][s-4], ".pcf") ||
1767e7c
						    !strcmp(&pkg[i].runf[n][s-4], ".otf")
1767e7c
						) {
1767e7c
							if ( !has_fonts ) {
1767e7c
#ifdef SRPMS
1767e7c
								fprintf(fpack, "%%package fedora-fonts\n");
1767e7c
#else
1767e7c
								fprintf(fpack, "%%package %s-fedora-fonts\n", name);
1767e7c
#endif
1767e7c
								fprintf(fpack, "Summary: Fonts for %s\n", name);
2addf26
								fprintf(fpack, "Version: %s\n", print_noarch_version(&pkg[i]));
1767e7c
								fprintf(fpack, "Release: %%{tl_noarch_release}\n");
1767e7c
								fprintf(fpack, "Requires: fontpackages-filesystem\n");
1767e7c
								fprintf(fpack, "BuildRequires: fontpackages-devel\n");
1767e7c
								fprintf(fpack, "Requires: tex-%s\n", name);
1767e7c
								fprintf(fpack, "BuildArch: noarch\n");
1767e7c
#ifdef SRPMS
1767e7c
								fprintf(fpack, "\n%%description fedora-fonts\n");
1767e7c
#else
1767e7c
								fprintf(fpack, "\n%%description %s-fedora-fonts\n", name);
1767e7c
#endif
1767e7c
								for (k=0; k
1767e7c
									fprintf(fpack, "%s\n", pkg[i].longdesc[k]);
1767e7c
								}
1767e7c
								if ( !pkg[i].longdesc_lines ) fprintf(fpack, "Fonts for %s package.\n", name);
1767e7c
								if ( pkg[i].catalogue_date ) fprintf(fpack, "\ndate: %s\n", pkg[i].catalogue_date);
1767e7c
								fprintf(fpack, "\n");
1767e7c
								fprintf(ffont, "\n# link installed fonts with Fedora\n");
1767e7c
								fprintf(ffont, "install -d -m 0755 %%{buildroot}%%{_fontdir}\n");
1767e7c
								fprintf(ffont, "pushd %%{buildroot}%%{_fontdir}\n");
1767e7c
#ifdef SRPMS
1767e7c
								fprintf(ffile, "%%files fedora-fonts\n");
1767e7c
#else
1767e7c
								fprintf(ffile, "%%files %s-fedora-fonts\n", name);
1767e7c
#endif
1767e7c
								fprintf(ffile, "%%defattr(-,root,root)\n%%dir %%{_fontdir}\n");
1767e7c
							}
1767e7c
							has_fonts = 1;
1767e7c
							for (--s; pkg[i].runf[n][s] != '/'; s--);
1767e7c
							fprintf(ffont, "mv %%{buildroot}%%{_texdir}/%s .\n", pkg[i].runf[n]);
1767e7c
							fprintf(ffont, "ln -s %%{_fontdir}%s %%{buildroot}%%{_texdir}/%s\n", &pkg[i].runf[n][s], pkg[i].runf[n]);
1767e7c
							fprintf(ffile, "%%{_fontdir}%s\n", &pkg[i].runf[n][s]);
1767e7c
							printf("%%{_fontdir}%s\n", &pkg[i].runf[n][s]);
1767e7c
						}
1767e7c
					}
1767e7c
				}
1767e7c
				if ( has_fonts ) {
1767e7c
					fprintf(ffont, "popd\n");
1767e7c
#ifdef SRPMS
1767e7c
					fprintf(ffont, "%%_font_pkg -n fedora *\n");
1767e7c
#endif
1767e7c
				}
1767e7c
			}
1767e7c
#endif
1767e7c
#ifdef SRPMS
1767e7c
			if (pkg[i].has_man) {
1767e7c
				fprintf(fremove, "mkdir -p %%{buildroot}/%%{_datadir}/\n");
d409867
				fprintf(fremove, "mv %%{buildroot}/%%{_texdir}/texmf-dist/doc/man %%{buildroot}/%%{_datadir}/\n");
1767e7c
			}
1767e7c
			if (pkg[i].has_info) {
1767e7c
				fprintf(fremove, "mkdir -p %%{buildroot}/%%{_infodir}/\n");
d409867
				fprintf(fremove, "mv %%{buildroot}/%%{_texdir}/texmf-dist/doc/info/* %%{buildroot}/%%{_infodir}/\n");
1767e7c
			}
1767e7c
#endif
1767e7c
#ifdef SRPMS
1767e7c
			if ( !pkg[i].binfs ) {
1767e7c
				fclose(ffont);
1767e7c
				fclose(fremove);
1767e7c
				fclose(fsrc);
1767e7c
				fclose(funpack);
1767e7c
				fclose(ffile);
1767e7c
				fclose(fpack);
1767e7c
1767e7c
				fpack = ofpack;
1767e7c
				ffile = offile;
1767e7c
				funpack = ofunpack;
1767e7c
				fsrc = ofsrc;
1767e7c
				fremove = ofremove;
1767e7c
				ffont = offont;
1767e7c
			}
1767e7c
#endif
70bc52c
			if ( pkg[i].binfs && (has_noarch_pkg || pkg[i].binfs > 1) ) {
1767e7c
				char *ar = strstr(name, ".ARCH");
3f5e6b6
				pkg[i].any_pkg_written = 1;
1767e7c
				*ar = '\0';
1767e7c
				fprintf(fpack, "%%package %s-bin\n", name);
1767e7c
				fprintf(fpack, "Summary: Binaries for %s\n", name);
2addf26
				fprintf(fpack, "Version: %s\n", print_noarch_version(&pkg[i]));
7a7bfd0
				if ( strncmp(name, "kpathsea", 8) ) fprintf(fpack, "Requires: texlive-base\n");
7a7bfd0
				if ( has_noarch_pkg ) fprintf(fpack, "Requires: texlive-%s\n", name);
1767e7c
				if ( !strcmp(name, "xetex") ) {
1767e7c
					fprintf(fpack, "Requires: teckit\n");
1767e7c
					fprintf(fpack, "Provides: xdvipdfmx = %%{version}-%%{release}\n");
1767e7c
					fprintf(fpack, "Obsoletes: xdvipdfmx < %%{version}-%%{release}\n");
1767e7c
				}
1767e7c
				if ( !strcmp(name, "dvipdfmx") ) {
ceba7ad
					fprintf(fpack, "Provides: dvipdfmx = %%{tl_version}, dvipdfm = %%{tl_version}, texlive-dvipdfm-bin = 3:%%{tl_version}\n");
ceba7ad
					fprintf(fpack, "Obsoletes: dvipdfmx < %%{tl_version}, dvipdfm < %%{tl_version}, texlive-dvipdfm-bin < 3:%%{tl_version}\n");
1767e7c
				}
1767e7c
				if ( !strcmp(name, "xdvi") ) {
1767e7c
					fprintf(fpack, "Provides: xdvi = %%{tl_version}, xdvik = %%{tl_version}, tetex-xdvi = 3.1-99\n");
1767e7c
					fprintf(fpack, "Obsoletes: xdvi < %%{tl_version}, xdvik < %%{tl_version}, tetex-xdvi < 3.1-99\n");
1767e7c
				}
1767e7c
				if ( !strcmp(name, "dvipng") ) {
1767e7c
					fprintf(fpack, "Provides: dvipng = %%{tl_version}\n");
1767e7c
					fprintf(fpack, "Obsoletes: dvipng < %%{tl_version}\n");
1767e7c
				}
ceba7ad
				if ( !strcmp(name, "pdfcrop") ) {
ceba7ad
					fprintf(fpack, "Requires: ghostscript-devel\n");
ceba7ad
				}
1767e7c
				if ( !strcmp(name, "dvisvgm") ) {
1767e7c
					fprintf(fpack, "Provides: dvisvgm = %%{tl_version}\n");
1767e7c
					fprintf(fpack, "Obsoletes: dvisvgm < %%{tl_version}\n");
1767e7c
				}
1767e7c
				if ( !strcmp(name, "lcdftypetools") ) {
1767e7c
					fprintf(fpack, "Provides: lcdf-typetools = %%{tl_version}\n");
1767e7c
					fprintf(fpack, "Obsoletes: lcdf-typetools < %%{tl_version}\n");
1767e7c
				}
1767e7c
				if ( !strcmp(name, "xmltex") ) {
fba03f6
					fprintf(fpack, "Provides: xmltex = %%{tl_version}0101\n");
fba03f6
					fprintf(fpack, "Obsoletes: xmltex < %%{tl_version}0101\n");
1767e7c
				}
1767e7c
				if ( !strcmp(name, "pstools") ) {
1767e7c
					fprintf(fpack, "Provides: ps2eps = %%{tl_version}\n");
1767e7c
					fprintf(fpack, "Obsoletes: ps2eps < %%{tl_version}\n");
1767e7c
				}
1767e7c
/*				if ( !strcmp(name, "asymptote") ) {
1767e7c
					fprintf(fpack, "Provides: asymptote = %%{tl_version}\n");
1767e7c
					fprintf(fpack, "Obsoletes: asymptote < %%{tl_version}\n");
38566cc
				}*/
38566cc
1767e7c
				printf("bin-package %s contains %d files\n", pkg[i].name, pkg[i].binfs);
1767e7c
				{
1767e7c
					int n, noarch = 1;
1767e7c
					char s[0x100];
1767e7c
1767e7c
					for (n=0; n
1767e7c
						FILE *f;
1767e7c
						struct stat sb;
1767e7c
1767e7c
						snprintf(s, sizeof(s), "texlive.expanded/%s", pkg[i].binf[n]);
1767e7c
						lstat(s, &sb);
1767e7c
1767e7c
						if ((sb.st_mode&S_IFMT) == S_IFLNK) continue;
1767e7c
1767e7c
						if ( (f=fopen(s,"rb")) ) {
1767e7c
							unsigned char d[4];
1767e7c
							fread(d, 4, 1, f);
1767e7c
							fclose(f);
1767e7c
							if ( d[0] == 0x7f && d[1] == 0x45 && d[2] == 0x4c && d[3] == 0x46 ) {
1767e7c
								noarch = 0;
1767e7c
								break;
1767e7c
							}
1767e7c
						} else {
1767e7c
							printf("Unable to open: %s\n", s);
1767e7c
							exit(1);
1767e7c
						}
1767e7c
					}
2addf26
					fprintf(fpack, "Release: %%{tl_release}\n");
97d0db0
					if ( noarch ) {
1767e7c
						fprintf(fpack, "BuildArch: noarch\n");
f144dd9
					} else {
3969a3e
						fprintf(fpack, "Requires: texlive-kpathsea-lib%%{?_isa} = %%{epoch}:%%{tl_version}\n");
1767e7c
					}
1767e7c
				}
1767e7c
				fprintf(fpack, "\n%%description %s-bin\n", name);
1767e7c
				fprintf(fpack, "Binaries for %s\n\n", name);
1767e7c
				*ar = '.';
1767e7c
1767e7c
				/* ... and add bin files */
1767e7c
				{
1767e7c
					char s[0x100], *lic_name = NULL;
1767e7c
					int ii, lic_code = LIC_LPPL;
1767e7c
					unsigned long h;
1767e7c
1767e7c
					strcpy(s, pkg[i].name);
1767e7c
					*strstr(s,".ARCH") = 0;
1767e7c
					h = hash(s);
1767e7c
					for (ii=0; ii
1767e7c
						if ( pkg[ii].namehash == h && !strcmp(pkg[ii].name, s)) {
1767e7c
							lic_code = pkg[ii].catalogue_license?pkg[ii].catalogue_license:LIC_LPPL;
1767e7c
							lic_name = pkg[ii].fedora_license;
1767e7c
							break;
1767e7c
						}
1767e7c
					}
1767e7c
					append_filelist(pkg[i].name, "", pkg[i].binfs, pkg[i].binf, lic_name?lic_name:put_token(lic_code, license));
1767e7c
				}
1767e7c
			}
1767e7c
slv:
1767e7c
			for (n=0; n
1767e7c
				solve(pkg[i].dep[n]);
1767e7c
			}
1767e7c
			level--;
1767e7c
			found = 1;
1767e7c
			break;
1767e7c
		}
1767e7c
	}
1767e7c
1767e7c
	if ( !found ) fprintf(stderr, "Unknown dep: %s\n", name);
1767e7c
}
1767e7c
3f5e6b6
void gen_obsoletes() {
3f5e6b6
	size_t i, op = sizeof(old_pkgs)/sizeof(old_pkgs[0]);
3f5e6b6
	FILE *fobs = fopen("_obsoletes.spec","wt");
3f5e6b6
3f5e6b6
	for (i=0; i
3f5e6b6
		size_t n, fnd=0;
3f5e6b6
		unsigned long h = hash(old_pkgs[i]);
3f5e6b6
3f5e6b6
		for (n=0; n
3f5e6b6
			if (h == pkg[n].namehash && !strcmp(pkg[n].name, old_pkgs[i]) && pkg[n].any_pkg_written) {
3f5e6b6
				fnd = 1;
3f5e6b6
				break;
3f5e6b6
			}
3f5e6b6
		}
3f5e6b6
3f5e6b6
		if (!fnd) {
3f5e6b6
			fprintf(fobs,"Obsoletes: texlive-%s <= 3:%%{tl_version}\n", old_pkgs[i]);
3f5e6b6
			if (strncmp(old_pkgs[i], "collection-", 11)) {
3f5e6b6
				fprintf(fobs,"Obsoletes: texlive-%s-bin <= 3:%%{tl_version}\n", old_pkgs[i]);
3f5e6b6
				fprintf(fobs,"Obsoletes: texlive-%s-doc <= 3:%%{tl_version}\n", old_pkgs[i]);
3f5e6b6
				fprintf(fobs,"Obsoletes: texlive-%s-fedora-fonts <= 3:%%{tl_version}\n", old_pkgs[i]);
3f5e6b6
			}
3f5e6b6
		}
3f5e6b6
	}
3f5e6b6
3f5e6b6
	fclose(fobs);
3f5e6b6
}
3f5e6b6
1767e7c
int main() {
1767e7c
	FILE *f = fopen("texlive.tlpdb","rt");
1767e7c
1767e7c
	if ( !f ) {
1767e7c
		fprintf(stderr, "Unable to open TeX Live package database\n");
1767e7c
		return 1;
1767e7c
	}
1767e7c
1767e7c
	fseek(f,0,SEEK_END);
1767e7c
	size=ftell(f);
1767e7c
	fseek(f,0,SEEK_SET);
1767e7c
	m=malloc(size);
1767e7c
	if ( fread(m, size, 1, f) != 1 ) {
1767e7c
		fprintf(stderr,"Error reading TeX Live package database\n");
1767e7c
		return 1;
1767e7c
	}
1767e7c
1767e7c
	parse();
1767e7c
1767e7c
	{
1767e7c
		int i, n;
1767e7c
1767e7c
		for (i=0; i
1767e7c
			for (n=0; n
1767e7c
				if ( pkg[i].req[n] ) continue;
1767e7c
				{
1767e7c
					int x, y, found = 0;
1767e7c
					unsigned long h;
1767e7c
					package *pk = NULL;
1767e7c
					char *depname = pkg[i].dep[n];
1767e7c
1767e7c
					h = hash(depname);
1767e7c
1767e7c
					for (x=0; x
1767e7c
						if ( pkg[x].namehash == h && !strcmp(pkg[x].name, depname) ) {
1767e7c
							pk = &pkg[x];
1767e7c
							found = 1;
1767e7c
							break;
1767e7c
						}
1767e7c
					}
1767e7c
1767e7c
					if ( !found ) {
1767e7c
						fprintf(stderr, "Unknown dependency: %s\n", depname);
1767e7c
						continue;
1767e7c
					}
1767e7c
1767e7c
					for (x=0; x
1767e7c
						for (y=0; y
1767e7c
							if ( !strcmp(pkg[x].dep[y], pk->name) ) {
1767e7c
								pkg[x].req[y] = pk;
1767e7c
							}
1767e7c
						}
1767e7c
					}
1767e7c
				}
1767e7c
			}
1767e7c
		}
1767e7c
#ifdef SRPMS
1767e7c
		system("rm -rf ./specs; mkdir specs");
1767e7c
#endif
1767e7c
		fill_file_reqprov();
38566cc
		for (i=0; i
1767e7c
	}
1767e7c
3f5e6b6
	gen_obsoletes();
3f5e6b6
1767e7c
	{
1767e7c
		int i, n, ndirs;
1767e7c
		FILE *fdirs = fopen("_dirs.spec","wt");
1767e7c
#ifdef SRPMS
1767e7c
		FILE *fmkdirs = fopen("_mkdirs.spec","wt");
1767e7c
#endif
1767e7c
1767e7c
		ndirs = dirs;
1767e7c
		for ( i=0; i
1767e7c
			char *end, *d;
1767e7c
			int pass;
1767e7c
1767e7c
			if ( !strncmp(dir[i].dir, "bin/", 4) || !strncmp(dir[i].dir, "tlpkg/", 6) || dir[i].pkgs < 1 ) continue;
1767e7c
1767e7c
			for ( pass=n=0; n
1767e7c
				if ( !(dir[i].lic[0]&LIC_NOTALLOWED) ) {
1767e7c
					pass = 1;
1767e7c
					break;
1767e7c
				}
1767e7c
			}
1767e7c
			if ( !pass ) continue;
1767e7c
1767e7c
			if ( !(strstr(dir[i].pkg[0], "win32") || strstr(dir[i].dir, "win32")) ) {
1767e7c
				fprintf(fdirs, "%%dir %%{_texdir}/%s\n", dir[i].dir);
1767e7c
#ifdef SRPMS
1767e7c
				fprintf(fmkdirs, "mkdir -p %%{buildroot}%%{_texdir}/%s\n", dir[i].dir);
1767e7c
#endif
1767e7c
			} else continue;
1767e7c
1767e7c
			d = strdup(dir[i].dir);
1767e7c
			while ( (end=strrchr(d, '/')) ) {
1767e7c
				unsigned long h;
1767e7c
				*end = '\0';
1767e7c
				h = hash(d);
1767e7c
				for ( n=0; n
1767e7c
					if ( h == dir[n].dirhash && !strcmp(d, dir[n].dir) ) {
1767e7c
						goto done;
1767e7c
					}
1767e7c
				}
1767e7c
				dirs++;
1767e7c
				dir = realloc(dir, dirs*sizeof(dir_type));
1767e7c
				dir[dirs-1].dir = strdup(d);
1767e7c
				dir[dirs-1].dirhash = h;
1767e7c
				dir[dirs-1].pkgs = 0;
1767e7c
				fprintf(fdirs, "%%dir %%{_texdir}/%s\n", d);
1767e7c
			}
1767e7c
done:
1767e7c
			free(d);
1767e7c
		}
1767e7c
#ifdef SRPMS
1767e7c
		fclose(fmkdirs);
1767e7c
#endif
1767e7c
		fclose(fdirs);
1767e7c
	}
1767e7c
1767e7c
	fclose(fpack);
1767e7c
	fclose(ffile);
1767e7c
	fclose(funpack);
1767e7c
	fclose(fsrc);
1767e7c
	fclose(fremove);
1767e7c
	fclose(ffont);
1767e7c
1767e7c
	return 0;
1767e7c
}