11c606a6 (kx 2023-04-11 01:18:34 +0300 1)
11c606a6 (kx 2023-04-11 01:18:34 +0300 2) /**********************************************************************
11c606a6 (kx 2023-04-11 01:18:34 +0300 3)
11c606a6 (kx 2023-04-11 01:18:34 +0300 4) Copyright 2019 Andrey V.Kosteltsev
11c606a6 (kx 2023-04-11 01:18:34 +0300 5)
11c606a6 (kx 2023-04-11 01:18:34 +0300 6) Licensed under the Radix.pro License, Version 1.0 (the "License");
11c606a6 (kx 2023-04-11 01:18:34 +0300 7) you may not use this file except in compliance with the License.
11c606a6 (kx 2023-04-11 01:18:34 +0300 8) You may obtain a copy of the License at
11c606a6 (kx 2023-04-11 01:18:34 +0300 9)
11c606a6 (kx 2023-04-11 01:18:34 +0300 10) https://radix.pro/licenses/LICENSE-1.0-en_US.txt
11c606a6 (kx 2023-04-11 01:18:34 +0300 11)
11c606a6 (kx 2023-04-11 01:18:34 +0300 12) Unless required by applicable law or agreed to in writing, software
11c606a6 (kx 2023-04-11 01:18:34 +0300 13) distributed under the License is distributed on an "AS IS" BASIS,
11c606a6 (kx 2023-04-11 01:18:34 +0300 14) WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
11c606a6 (kx 2023-04-11 01:18:34 +0300 15) implied.
11c606a6 (kx 2023-04-11 01:18:34 +0300 16)
11c606a6 (kx 2023-04-11 01:18:34 +0300 17) **********************************************************************/
11c606a6 (kx 2023-04-11 01:18:34 +0300 18)
11c606a6 (kx 2023-04-11 01:18:34 +0300 19) #include <config.h>
11c606a6 (kx 2023-04-11 01:18:34 +0300 20)
11c606a6 (kx 2023-04-11 01:18:34 +0300 21) #include <stdlib.h>
11c606a6 (kx 2023-04-11 01:18:34 +0300 22) #include <stdio.h>
11c606a6 (kx 2023-04-11 01:18:34 +0300 23) #include <string.h>
11c606a6 (kx 2023-04-11 01:18:34 +0300 24) #include <linux/limits.h>
11c606a6 (kx 2023-04-11 01:18:34 +0300 25) #include <libgen.h> /* basename(3) */
11c606a6 (kx 2023-04-11 01:18:34 +0300 26) #include <unistd.h>
11c606a6 (kx 2023-04-11 01:18:34 +0300 27) #include <time.h>
11c606a6 (kx 2023-04-11 01:18:34 +0300 28) #include <math.h>
11c606a6 (kx 2023-04-11 01:18:34 +0300 29)
11c606a6 (kx 2023-04-11 01:18:34 +0300 30) #include <msglog.h>
11c606a6 (kx 2023-04-11 01:18:34 +0300 31) #include <wrapper.h>
11c606a6 (kx 2023-04-11 01:18:34 +0300 32)
11c606a6 (kx 2023-04-11 01:18:34 +0300 33) #include <make-pkglist.h>
11c606a6 (kx 2023-04-11 01:18:34 +0300 34)
11c606a6 (kx 2023-04-11 01:18:34 +0300 35) #include <cmpvers.h>
11c606a6 (kx 2023-04-11 01:18:34 +0300 36) #include <dlist.h>
11c606a6 (kx 2023-04-11 01:18:34 +0300 37) #include <btree.h>
11c606a6 (kx 2023-04-11 01:18:34 +0300 38) #include <jsmin.h>
11c606a6 (kx 2023-04-11 01:18:34 +0300 39) #include <pkglist.h>
11c606a6 (kx 2023-04-11 01:18:34 +0300 40)
11c606a6 (kx 2023-04-11 01:18:34 +0300 41)
11c606a6 (kx 2023-04-11 01:18:34 +0300 42) char *htmlroot = NULL;
11c606a6 (kx 2023-04-11 01:18:34 +0300 43) char *hardware = NULL;
11c606a6 (kx 2023-04-11 01:18:34 +0300 44) int minimize = 0;
11c606a6 (kx 2023-04-11 01:18:34 +0300 45)
11c606a6 (kx 2023-04-11 01:18:34 +0300 46) struct dlist *srcpkgs = NULL;
11c606a6 (kx 2023-04-11 01:18:34 +0300 47)
11c606a6 (kx 2023-04-11 01:18:34 +0300 48) struct dlist *packages = NULL;
11c606a6 (kx 2023-04-11 01:18:34 +0300 49) struct dlist *tarballs = NULL;
11c606a6 (kx 2023-04-11 01:18:34 +0300 50)
11c606a6 (kx 2023-04-11 01:18:34 +0300 51) struct dlist *provides = NULL;
11c606a6 (kx 2023-04-11 01:18:34 +0300 52) struct dlist *extern_requires = NULL;
11c606a6 (kx 2023-04-11 01:18:34 +0300 53)
11c606a6 (kx 2023-04-11 01:18:34 +0300 54) static struct dlist *tree = NULL;
11c606a6 (kx 2023-04-11 01:18:34 +0300 55)
11c606a6 (kx 2023-04-11 01:18:34 +0300 56) static char *pkgs_fname = NULL,
11c606a6 (kx 2023-04-11 01:18:34 +0300 57) *tree_fname = NULL,
11c606a6 (kx 2023-04-11 01:18:34 +0300 58) *html_fname = NULL;
11c606a6 (kx 2023-04-11 01:18:34 +0300 59)
11c606a6 (kx 2023-04-11 01:18:34 +0300 60) static char *pkgs_min_fname = NULL,
11c606a6 (kx 2023-04-11 01:18:34 +0300 61) *tree_min_fname = NULL;
11c606a6 (kx 2023-04-11 01:18:34 +0300 62)
11c606a6 (kx 2023-04-11 01:18:34 +0300 63) static const char *tarball_suffix = "txz";
11c606a6 (kx 2023-04-11 01:18:34 +0300 64)
11c606a6 (kx 2023-04-11 01:18:34 +0300 65) /***************************************************************
11c606a6 (kx 2023-04-11 01:18:34 +0300 66) tarballs List functions:
11c606a6 (kx 2023-04-11 01:18:34 +0300 67) =======================
11c606a6 (kx 2023-04-11 01:18:34 +0300 68)
11c606a6 (kx 2023-04-11 01:18:34 +0300 69) NOTE:
11c606a6 (kx 2023-04-11 01:18:34 +0300 70) ----
11c606a6 (kx 2023-04-11 01:18:34 +0300 71) TARBALLS is an optional list created in case when we have
11c606a6 (kx 2023-04-11 01:18:34 +0300 72) a set of PACKAGES as input of make-pkglist utility. When we
11c606a6 (kx 2023-04-11 01:18:34 +0300 73) are working with a set of input PKGLOGs the TARBALLS list
11c606a6 (kx 2023-04-11 01:18:34 +0300 74) is not chreated and pointer to the tarballs == NULL.
11c606a6 (kx 2023-04-11 01:18:34 +0300 75) */
11c606a6 (kx 2023-04-11 01:18:34 +0300 76) void add_tarball( char *tarball )
11c606a6 (kx 2023-04-11 01:18:34 +0300 77) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 78) tarballs = dlist_append( tarballs, (void *)xstrdup( (const char *)tarball ) );
11c606a6 (kx 2023-04-11 01:18:34 +0300 79) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 80)
11c606a6 (kx 2023-04-11 01:18:34 +0300 81) static void __free_tarball( void *data, void *user_data )
11c606a6 (kx 2023-04-11 01:18:34 +0300 82) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 83) if( data ) { free( data ); }
11c606a6 (kx 2023-04-11 01:18:34 +0300 84) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 85)
11c606a6 (kx 2023-04-11 01:18:34 +0300 86) void free_tarballs( void )
11c606a6 (kx 2023-04-11 01:18:34 +0300 87) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 88) if( tarballs ) { dlist_free( tarballs, __free_tarball ); tarballs = NULL; }
11c606a6 (kx 2023-04-11 01:18:34 +0300 89) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 90)
11c606a6 (kx 2023-04-11 01:18:34 +0300 91) static int __compare_tarballs( const void *a, const void *b )
11c606a6 (kx 2023-04-11 01:18:34 +0300 92) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 93) return strncmp( (const char *)a, (const char *)b, (size_t)strlen((const char *)b) );
11c606a6 (kx 2023-04-11 01:18:34 +0300 94) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 95)
11c606a6 (kx 2023-04-11 01:18:34 +0300 96) const char *find_tarball( const char *name )
11c606a6 (kx 2023-04-11 01:18:34 +0300 97) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 98) struct dlist *node = NULL;
11c606a6 (kx 2023-04-11 01:18:34 +0300 99)
11c606a6 (kx 2023-04-11 01:18:34 +0300 100) if( !tarballs || !name ) return NULL;
11c606a6 (kx 2023-04-11 01:18:34 +0300 101)
11c606a6 (kx 2023-04-11 01:18:34 +0300 102) node = dlist_find_data( tarballs, __compare_tarballs, (const void *)name );
11c606a6 (kx 2023-04-11 01:18:34 +0300 103) if( node )
11c606a6 (kx 2023-04-11 01:18:34 +0300 104) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 105) return (const char *)node->data;
11c606a6 (kx 2023-04-11 01:18:34 +0300 106) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 107)
11c606a6 (kx 2023-04-11 01:18:34 +0300 108) return NULL;
11c606a6 (kx 2023-04-11 01:18:34 +0300 109) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 110)
11c606a6 (kx 2023-04-11 01:18:34 +0300 111) /*********************
11c606a6 (kx 2023-04-11 01:18:34 +0300 112) Just for debugging:
11c606a6 (kx 2023-04-11 01:18:34 +0300 113) */
11c606a6 (kx 2023-04-11 01:18:34 +0300 114) static void __print_tarball( void *data, void *user_data )
11c606a6 (kx 2023-04-11 01:18:34 +0300 115) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 116) int *counter = (int *)user_data;
11c606a6 (kx 2023-04-11 01:18:34 +0300 117)
11c606a6 (kx 2023-04-11 01:18:34 +0300 118) if( counter ) { fprintf( stdout, "tarball[%.5d]: %s\n", *counter, (char *)data ); ++(*counter); }
11c606a6 (kx 2023-04-11 01:18:34 +0300 119) else { fprintf( stdout, "tarball: %s\n", (char *)data ); }
11c606a6 (kx 2023-04-11 01:18:34 +0300 120) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 121)
11c606a6 (kx 2023-04-11 01:18:34 +0300 122) void print_tarballs( void )
11c606a6 (kx 2023-04-11 01:18:34 +0300 123) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 124) int cnt = 0;
11c606a6 (kx 2023-04-11 01:18:34 +0300 125) if( tarballs ) { dlist_foreach( tarballs, __print_tarball, (void *)&cnt ); }
11c606a6 (kx 2023-04-11 01:18:34 +0300 126) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 127) /*
11c606a6 (kx 2023-04-11 01:18:34 +0300 128) End of tarballs List functions.
11c606a6 (kx 2023-04-11 01:18:34 +0300 129) ***************************************************************/
11c606a6 (kx 2023-04-11 01:18:34 +0300 130)
11c606a6 (kx 2023-04-11 01:18:34 +0300 131)
11c606a6 (kx 2023-04-11 01:18:34 +0300 132)
11c606a6 (kx 2023-04-11 01:18:34 +0300 133) char *strprio( enum _priority priority, int short_name )
11c606a6 (kx 2023-04-11 01:18:34 +0300 134) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 135) char *p = NULL;
11c606a6 (kx 2023-04-11 01:18:34 +0300 136)
11c606a6 (kx 2023-04-11 01:18:34 +0300 137) switch( priority )
11c606a6 (kx 2023-04-11 01:18:34 +0300 138) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 139) case REQUIRED:
11c606a6 (kx 2023-04-11 01:18:34 +0300 140) p = ( short_name ) ? "REQ" : "REQUIRED";
11c606a6 (kx 2023-04-11 01:18:34 +0300 141) break;
11c606a6 (kx 2023-04-11 01:18:34 +0300 142) case RECOMMENDED:
11c606a6 (kx 2023-04-11 01:18:34 +0300 143) p = ( short_name ) ? "REC" : "RECOMMENDED";
11c606a6 (kx 2023-04-11 01:18:34 +0300 144) break;
11c606a6 (kx 2023-04-11 01:18:34 +0300 145) case OPTIONAL:
11c606a6 (kx 2023-04-11 01:18:34 +0300 146) p = ( short_name ) ? "OPT" : "OPTIONAL";
11c606a6 (kx 2023-04-11 01:18:34 +0300 147) break;
11c606a6 (kx 2023-04-11 01:18:34 +0300 148) case SKIP:
11c606a6 (kx 2023-04-11 01:18:34 +0300 149) p = ( short_name ) ? "SKP" : "SKIP";
11c606a6 (kx 2023-04-11 01:18:34 +0300 150) break;
11c606a6 (kx 2023-04-11 01:18:34 +0300 151) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 152) return p;
11c606a6 (kx 2023-04-11 01:18:34 +0300 153) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 154)
11c606a6 (kx 2023-04-11 01:18:34 +0300 155) char *strproc( enum _procedure procedure )
11c606a6 (kx 2023-04-11 01:18:34 +0300 156) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 157) char *p = NULL;
11c606a6 (kx 2023-04-11 01:18:34 +0300 158)
11c606a6 (kx 2023-04-11 01:18:34 +0300 159) switch( procedure )
11c606a6 (kx 2023-04-11 01:18:34 +0300 160) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 161) case INSTALL:
11c606a6 (kx 2023-04-11 01:18:34 +0300 162) p = "install";
11c606a6 (kx 2023-04-11 01:18:34 +0300 163) break;
11c606a6 (kx 2023-04-11 01:18:34 +0300 164) case UPDATE:
11c606a6 (kx 2023-04-11 01:18:34 +0300 165) p = "update";
11c606a6 (kx 2023-04-11 01:18:34 +0300 166) break;
11c606a6 (kx 2023-04-11 01:18:34 +0300 167) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 168) return p;
11c606a6 (kx 2023-04-11 01:18:34 +0300 169) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 170)
11c606a6 (kx 2023-04-11 01:18:34 +0300 171)
11c606a6 (kx 2023-04-11 01:18:34 +0300 172) /***************************************************************
11c606a6 (kx 2023-04-11 01:18:34 +0300 173) PACKAGE functions:
11c606a6 (kx 2023-04-11 01:18:34 +0300 174) */
11c606a6 (kx 2023-04-11 01:18:34 +0300 175)
11c606a6 (kx 2023-04-11 01:18:34 +0300 176) struct pkg *pkg_alloc( void )
11c606a6 (kx 2023-04-11 01:18:34 +0300 177) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 178) struct pkg *pkg = NULL;
11c606a6 (kx 2023-04-11 01:18:34 +0300 179)
11c606a6 (kx 2023-04-11 01:18:34 +0300 180) pkg = (struct pkg *)malloc( sizeof( struct pkg ) );
11c606a6 (kx 2023-04-11 01:18:34 +0300 181) if( !pkg ) { FATAL_ERROR( "Cannot allocate memory" ); }
11c606a6 (kx 2023-04-11 01:18:34 +0300 182) bzero( (void *)pkg, sizeof( struct pkg ) );
11c606a6 (kx 2023-04-11 01:18:34 +0300 183)
11c606a6 (kx 2023-04-11 01:18:34 +0300 184) return pkg;
11c606a6 (kx 2023-04-11 01:18:34 +0300 185) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 186)
11c606a6 (kx 2023-04-11 01:18:34 +0300 187) void pkg_free( struct pkg *pkg )
11c606a6 (kx 2023-04-11 01:18:34 +0300 188) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 189) if( pkg )
11c606a6 (kx 2023-04-11 01:18:34 +0300 190) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 191) if( pkg->group ) { free( pkg->group ); pkg->group = NULL; }
11c606a6 (kx 2023-04-11 01:18:34 +0300 192) if( pkg->name ) { free( pkg->name ); pkg->name = NULL; }
11c606a6 (kx 2023-04-11 01:18:34 +0300 193) if( pkg->version ) { free( pkg->version ); pkg->version = NULL; }
11c606a6 (kx 2023-04-11 01:18:34 +0300 194)
11c606a6 (kx 2023-04-11 01:18:34 +0300 195) free( pkg );
11c606a6 (kx 2023-04-11 01:18:34 +0300 196) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 197) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 198)
11c606a6 (kx 2023-04-11 01:18:34 +0300 199) static void __pkg_free_func( void *data, void *user_data )
11c606a6 (kx 2023-04-11 01:18:34 +0300 200) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 201) struct pkg *pkg = (struct pkg *)data;
11c606a6 (kx 2023-04-11 01:18:34 +0300 202) if( pkg ) { pkg_free( pkg ); }
11c606a6 (kx 2023-04-11 01:18:34 +0300 203) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 204)
11c606a6 (kx 2023-04-11 01:18:34 +0300 205) void free_srcpkgs( void )
11c606a6 (kx 2023-04-11 01:18:34 +0300 206) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 207) if( srcpkgs ) { dlist_free( srcpkgs, __pkg_free_func ); srcpkgs = NULL; }
11c606a6 (kx 2023-04-11 01:18:34 +0300 208) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 209)
11c606a6 (kx 2023-04-11 01:18:34 +0300 210) void add_srcpkg( struct pkg *pkg )
11c606a6 (kx 2023-04-11 01:18:34 +0300 211) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 212) srcpkgs = dlist_append( srcpkgs, (void *)pkg );
11c606a6 (kx 2023-04-11 01:18:34 +0300 213) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 214)
11c606a6 (kx 2023-04-11 01:18:34 +0300 215)
11c606a6 (kx 2023-04-11 01:18:34 +0300 216) static struct pkginfo *__pkginfo_alloc( void )
11c606a6 (kx 2023-04-11 01:18:34 +0300 217) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 218) struct pkginfo *pkginfo = NULL;
11c606a6 (kx 2023-04-11 01:18:34 +0300 219)
11c606a6 (kx 2023-04-11 01:18:34 +0300 220) pkginfo = (struct pkginfo *)malloc( sizeof( struct pkginfo ) );
11c606a6 (kx 2023-04-11 01:18:34 +0300 221) if( !pkginfo ) { FATAL_ERROR( "Cannot allocate memory" ); }
11c606a6 (kx 2023-04-11 01:18:34 +0300 222) bzero( (void *)pkginfo, sizeof( struct pkginfo ) );
11c606a6 (kx 2023-04-11 01:18:34 +0300 223)
11c606a6 (kx 2023-04-11 01:18:34 +0300 224) return pkginfo;
11c606a6 (kx 2023-04-11 01:18:34 +0300 225) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 226)
11c606a6 (kx 2023-04-11 01:18:34 +0300 227) static void __pkginfo_free( struct pkginfo *pkginfo )
11c606a6 (kx 2023-04-11 01:18:34 +0300 228) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 229) if( pkginfo )
11c606a6 (kx 2023-04-11 01:18:34 +0300 230) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 231) if( pkginfo->name ) { free( pkginfo->name ); pkginfo->name = NULL; }
11c606a6 (kx 2023-04-11 01:18:34 +0300 232) if( pkginfo->version ) { free( pkginfo->version ); pkginfo->version = NULL; }
11c606a6 (kx 2023-04-11 01:18:34 +0300 233) if( pkginfo->arch ) { free( pkginfo->arch ); pkginfo->arch = NULL; }
11c606a6 (kx 2023-04-11 01:18:34 +0300 234) if( pkginfo->distro_name ) { free( pkginfo->distro_name ); pkginfo->distro_name = NULL; }
11c606a6 (kx 2023-04-11 01:18:34 +0300 235) if( pkginfo->distro_version ) { free( pkginfo->distro_version ); pkginfo->distro_version = NULL; }
11c606a6 (kx 2023-04-11 01:18:34 +0300 236) if( pkginfo->group ) { free( pkginfo->group ); pkginfo->group = NULL; }
11c606a6 (kx 2023-04-11 01:18:34 +0300 237) if( pkginfo->short_description ) { free( pkginfo->short_description ); pkginfo->short_description = NULL; }
11c606a6 (kx 2023-04-11 01:18:34 +0300 238) if( pkginfo->url ) { free( pkginfo->url ); pkginfo->url = NULL; }
11c606a6 (kx 2023-04-11 01:18:34 +0300 239) if( pkginfo->license ) { free( pkginfo->license ); pkginfo->license = NULL; }
11c606a6 (kx 2023-04-11 01:18:34 +0300 240)
11c606a6 (kx 2023-04-11 01:18:34 +0300 241) free( pkginfo );
11c606a6 (kx 2023-04-11 01:18:34 +0300 242) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 243) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 244)
11c606a6 (kx 2023-04-11 01:18:34 +0300 245)
11c606a6 (kx 2023-04-11 01:18:34 +0300 246) static struct references *__references_alloc( void )
11c606a6 (kx 2023-04-11 01:18:34 +0300 247) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 248) struct references *references = NULL;
11c606a6 (kx 2023-04-11 01:18:34 +0300 249)
11c606a6 (kx 2023-04-11 01:18:34 +0300 250) references = (struct references *)malloc( sizeof( struct references ) );
11c606a6 (kx 2023-04-11 01:18:34 +0300 251) if( !references ) { FATAL_ERROR( "Cannot allocate memory" ); }
11c606a6 (kx 2023-04-11 01:18:34 +0300 252) bzero( (void *)references, sizeof( struct references ) );
11c606a6 (kx 2023-04-11 01:18:34 +0300 253)
11c606a6 (kx 2023-04-11 01:18:34 +0300 254) return references;
11c606a6 (kx 2023-04-11 01:18:34 +0300 255) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 256)
11c606a6 (kx 2023-04-11 01:18:34 +0300 257) static void __references_free( struct references *references )
11c606a6 (kx 2023-04-11 01:18:34 +0300 258) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 259) if( references )
11c606a6 (kx 2023-04-11 01:18:34 +0300 260) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 261) if( references->list ) { dlist_free( references->list, __pkg_free_func ); references->list = NULL; }
11c606a6 (kx 2023-04-11 01:18:34 +0300 262) free( references );
11c606a6 (kx 2023-04-11 01:18:34 +0300 263) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 264) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 265)
11c606a6 (kx 2023-04-11 01:18:34 +0300 266)
11c606a6 (kx 2023-04-11 01:18:34 +0300 267) static struct requires *__requires_alloc( void )
11c606a6 (kx 2023-04-11 01:18:34 +0300 268) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 269) struct requires *requires = NULL;
11c606a6 (kx 2023-04-11 01:18:34 +0300 270)
11c606a6 (kx 2023-04-11 01:18:34 +0300 271) requires = (struct requires *)malloc( sizeof( struct requires ) );
11c606a6 (kx 2023-04-11 01:18:34 +0300 272) if( !requires ) { FATAL_ERROR( "Cannot allocate memory" ); }
11c606a6 (kx 2023-04-11 01:18:34 +0300 273) bzero( (void *)requires, sizeof( struct requires ) );
11c606a6 (kx 2023-04-11 01:18:34 +0300 274)
11c606a6 (kx 2023-04-11 01:18:34 +0300 275) return requires;
11c606a6 (kx 2023-04-11 01:18:34 +0300 276) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 277)
11c606a6 (kx 2023-04-11 01:18:34 +0300 278) static void __requires_free( struct requires *requires )
11c606a6 (kx 2023-04-11 01:18:34 +0300 279) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 280) if( requires )
11c606a6 (kx 2023-04-11 01:18:34 +0300 281) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 282) if( requires->list ) { dlist_free( requires->list, __pkg_free_func ); requires->list = NULL; }
11c606a6 (kx 2023-04-11 01:18:34 +0300 283) free( requires );
11c606a6 (kx 2023-04-11 01:18:34 +0300 284) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 285) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 286)
11c606a6 (kx 2023-04-11 01:18:34 +0300 287)
11c606a6 (kx 2023-04-11 01:18:34 +0300 288) static struct files *__files_alloc( void )
11c606a6 (kx 2023-04-11 01:18:34 +0300 289) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 290) struct files *files = NULL;
11c606a6 (kx 2023-04-11 01:18:34 +0300 291)
11c606a6 (kx 2023-04-11 01:18:34 +0300 292) files = (struct files *)malloc( sizeof( struct files ) );
11c606a6 (kx 2023-04-11 01:18:34 +0300 293) if( !files ) { FATAL_ERROR( "Cannot allocate memory" ); }
11c606a6 (kx 2023-04-11 01:18:34 +0300 294) bzero( (void *)files, sizeof( struct files ) );
11c606a6 (kx 2023-04-11 01:18:34 +0300 295)
11c606a6 (kx 2023-04-11 01:18:34 +0300 296) return files;
11c606a6 (kx 2023-04-11 01:18:34 +0300 297) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 298)
11c606a6 (kx 2023-04-11 01:18:34 +0300 299) static void __files_free_func( void *data, void *user_data )
11c606a6 (kx 2023-04-11 01:18:34 +0300 300) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 301) if( data ) { free( data ); }
11c606a6 (kx 2023-04-11 01:18:34 +0300 302) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 303)
11c606a6 (kx 2023-04-11 01:18:34 +0300 304) static void __files_free( struct files *files )
11c606a6 (kx 2023-04-11 01:18:34 +0300 305) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 306) if( files )
11c606a6 (kx 2023-04-11 01:18:34 +0300 307) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 308) if( files->list ) { dlist_free( files->list, __files_free_func ); files->list = NULL; }
11c606a6 (kx 2023-04-11 01:18:34 +0300 309) free( files );
11c606a6 (kx 2023-04-11 01:18:34 +0300 310) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 311) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 312)
11c606a6 (kx 2023-04-11 01:18:34 +0300 313)
11c606a6 (kx 2023-04-11 01:18:34 +0300 314) struct package *package_alloc( void )
11c606a6 (kx 2023-04-11 01:18:34 +0300 315) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 316) struct package *package = NULL;
11c606a6 (kx 2023-04-11 01:18:34 +0300 317) struct pkginfo *pkginfo = __pkginfo_alloc();
11c606a6 (kx 2023-04-11 01:18:34 +0300 318) struct references *references = __references_alloc();
11c606a6 (kx 2023-04-11 01:18:34 +0300 319) struct requires *requires = __requires_alloc();
11c606a6 (kx 2023-04-11 01:18:34 +0300 320) struct files *files = __files_alloc();
11c606a6 (kx 2023-04-11 01:18:34 +0300 321)
11c606a6 (kx 2023-04-11 01:18:34 +0300 322) package = (struct package *)malloc( sizeof( struct package ) );
11c606a6 (kx 2023-04-11 01:18:34 +0300 323) if( !package ) { FATAL_ERROR( "Cannot allocate memory" ); }
11c606a6 (kx 2023-04-11 01:18:34 +0300 324) bzero( (void *)package, sizeof( struct package ) );
11c606a6 (kx 2023-04-11 01:18:34 +0300 325)
11c606a6 (kx 2023-04-11 01:18:34 +0300 326) package->pkginfo = pkginfo;
11c606a6 (kx 2023-04-11 01:18:34 +0300 327) package->references = references;
11c606a6 (kx 2023-04-11 01:18:34 +0300 328) package->requires = requires;
11c606a6 (kx 2023-04-11 01:18:34 +0300 329) package->files = files;
11c606a6 (kx 2023-04-11 01:18:34 +0300 330)
11c606a6 (kx 2023-04-11 01:18:34 +0300 331) return package;
11c606a6 (kx 2023-04-11 01:18:34 +0300 332) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 333)
11c606a6 (kx 2023-04-11 01:18:34 +0300 334) void package_free( struct package *package )
11c606a6 (kx 2023-04-11 01:18:34 +0300 335) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 336) if( package )
11c606a6 (kx 2023-04-11 01:18:34 +0300 337) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 338) if( package->pkginfo ) { __pkginfo_free( package->pkginfo ); package->pkginfo = NULL; }
11c606a6 (kx 2023-04-11 01:18:34 +0300 339) if( package->references ) { __references_free( package->references ); package->references = NULL; }
11c606a6 (kx 2023-04-11 01:18:34 +0300 340) if( package->requires ) { __requires_free( package->requires ); package->requires = NULL; }
11c606a6 (kx 2023-04-11 01:18:34 +0300 341) if( package->files ) { __files_free( package->files ); package->files = NULL; }
11c606a6 (kx 2023-04-11 01:18:34 +0300 342)
11c606a6 (kx 2023-04-11 01:18:34 +0300 343) if( package->description ) { free( package->description ); package->description = NULL; }
11c606a6 (kx 2023-04-11 01:18:34 +0300 344) if( package->restore_links ) { free( package->restore_links ); package->restore_links = NULL; }
11c606a6 (kx 2023-04-11 01:18:34 +0300 345) if( package->install_script ) { free( package->install_script ); package->install_script = NULL; }
11c606a6 (kx 2023-04-11 01:18:34 +0300 346) if( package->hardware ) { free( package->hardware ); package->hardware = NULL; }
11c606a6 (kx 2023-04-11 01:18:34 +0300 347) if( package->tarball ) { free( package->tarball ); package->tarball = NULL; }
11c606a6 (kx 2023-04-11 01:18:34 +0300 348)
11c606a6 (kx 2023-04-11 01:18:34 +0300 349) free( package );
11c606a6 (kx 2023-04-11 01:18:34 +0300 350) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 351) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 352)
11c606a6 (kx 2023-04-11 01:18:34 +0300 353) static void __package_free_func( void *data, void *user_data )
11c606a6 (kx 2023-04-11 01:18:34 +0300 354) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 355) struct package *package = (struct package *)data;
11c606a6 (kx 2023-04-11 01:18:34 +0300 356) if( package ) { package_free( package ); }
11c606a6 (kx 2023-04-11 01:18:34 +0300 357) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 358)
11c606a6 (kx 2023-04-11 01:18:34 +0300 359) void free_packages( void )
11c606a6 (kx 2023-04-11 01:18:34 +0300 360) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 361) if( packages ) { dlist_free( packages, __package_free_func ); packages = NULL; }
11c606a6 (kx 2023-04-11 01:18:34 +0300 362) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 363)
11c606a6 (kx 2023-04-11 01:18:34 +0300 364)
11c606a6 (kx 2023-04-11 01:18:34 +0300 365) static int __compare_packages( const void *a, const void *b )
11c606a6 (kx 2023-04-11 01:18:34 +0300 366) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 367) int ret = -1;
11c606a6 (kx 2023-04-11 01:18:34 +0300 368)
11c606a6 (kx 2023-04-11 01:18:34 +0300 369) struct package *pkg1 = (struct package *)a;
11c606a6 (kx 2023-04-11 01:18:34 +0300 370) struct package *pkg2 = (struct package *)b;
11c606a6 (kx 2023-04-11 01:18:34 +0300 371)
11c606a6 (kx 2023-04-11 01:18:34 +0300 372) if( pkg1->pkginfo->group && pkg2->pkginfo->group )
11c606a6 (kx 2023-04-11 01:18:34 +0300 373) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 374) ret = strcmp( pkg1->pkginfo->group, pkg2->pkginfo->group );
11c606a6 (kx 2023-04-11 01:18:34 +0300 375) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 376) else if( !pkg1->pkginfo->group && !pkg2->pkginfo->group )
11c606a6 (kx 2023-04-11 01:18:34 +0300 377) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 378) ret = 0;
11c606a6 (kx 2023-04-11 01:18:34 +0300 379) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 380) else if( pkg1->pkginfo->group )
11c606a6 (kx 2023-04-11 01:18:34 +0300 381) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 382) ret = 1;
11c606a6 (kx 2023-04-11 01:18:34 +0300 383) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 384)
11c606a6 (kx 2023-04-11 01:18:34 +0300 385) if( ! ret )
11c606a6 (kx 2023-04-11 01:18:34 +0300 386) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 387) return strcmp( pkg1->pkginfo->name, pkg2->pkginfo->name );
11c606a6 (kx 2023-04-11 01:18:34 +0300 388) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 389) return ret;
11c606a6 (kx 2023-04-11 01:18:34 +0300 390) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 391)
11c606a6 (kx 2023-04-11 01:18:34 +0300 392) static int __compare_packages_with_version( const void *a, const void *b )
11c606a6 (kx 2023-04-11 01:18:34 +0300 393) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 394) int ret = -1;
11c606a6 (kx 2023-04-11 01:18:34 +0300 395)
11c606a6 (kx 2023-04-11 01:18:34 +0300 396) struct package *pkg1 = (struct package *)a;
11c606a6 (kx 2023-04-11 01:18:34 +0300 397) struct package *pkg2 = (struct package *)b;
11c606a6 (kx 2023-04-11 01:18:34 +0300 398)
11c606a6 (kx 2023-04-11 01:18:34 +0300 399) if( pkg1->pkginfo->group && pkg2->pkginfo->group )
11c606a6 (kx 2023-04-11 01:18:34 +0300 400) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 401) ret = strcmp( pkg1->pkginfo->group, pkg2->pkginfo->group );
11c606a6 (kx 2023-04-11 01:18:34 +0300 402) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 403) else if( !pkg1->pkginfo->group && !pkg2->pkginfo->group )
11c606a6 (kx 2023-04-11 01:18:34 +0300 404) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 405) ret = 0;
11c606a6 (kx 2023-04-11 01:18:34 +0300 406) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 407) else if( pkg1->pkginfo->group )
11c606a6 (kx 2023-04-11 01:18:34 +0300 408) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 409) ret = 1;
11c606a6 (kx 2023-04-11 01:18:34 +0300 410) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 411)
11c606a6 (kx 2023-04-11 01:18:34 +0300 412) if( ! ret )
11c606a6 (kx 2023-04-11 01:18:34 +0300 413) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 414) ret = strcmp( pkg1->pkginfo->name, pkg2->pkginfo->name );
11c606a6 (kx 2023-04-11 01:18:34 +0300 415) if( ! ret )
11c606a6 (kx 2023-04-11 01:18:34 +0300 416) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 417) return cmp_version( (const char *)pkg1->pkginfo->version, (const char *)pkg2->pkginfo->version );
11c606a6 (kx 2023-04-11 01:18:34 +0300 418) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 419) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 420) return ret;
11c606a6 (kx 2023-04-11 01:18:34 +0300 421) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 422)
11c606a6 (kx 2023-04-11 01:18:34 +0300 423)
11c606a6 (kx 2023-04-11 01:18:34 +0300 424) void add_package( struct package *package )
11c606a6 (kx 2023-04-11 01:18:34 +0300 425) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 426) packages = dlist_append( packages, (void *)package );
11c606a6 (kx 2023-04-11 01:18:34 +0300 427) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 428)
11c606a6 (kx 2023-04-11 01:18:34 +0300 429) void add_reference( struct package *package, struct pkg *pkg )
11c606a6 (kx 2023-04-11 01:18:34 +0300 430) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 431) if( package && package->references && pkg )
11c606a6 (kx 2023-04-11 01:18:34 +0300 432) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 433) package->references->list = dlist_append( package->references->list, (void *)pkg );
11c606a6 (kx 2023-04-11 01:18:34 +0300 434) package->references->size = dlist_length( package->references->list );
11c606a6 (kx 2023-04-11 01:18:34 +0300 435) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 436) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 437)
11c606a6 (kx 2023-04-11 01:18:34 +0300 438) void add_required( struct package *package, struct pkg *pkg )
11c606a6 (kx 2023-04-11 01:18:34 +0300 439) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 440) if( package && package->requires && pkg )
11c606a6 (kx 2023-04-11 01:18:34 +0300 441) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 442) package->requires->list = dlist_append( package->requires->list, (void *)pkg );
11c606a6 (kx 2023-04-11 01:18:34 +0300 443) package->requires->size = dlist_length( package->requires->list );
11c606a6 (kx 2023-04-11 01:18:34 +0300 444) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 445) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 446)
11c606a6 (kx 2023-04-11 01:18:34 +0300 447) void add_file( struct package *package, const char *fname )
11c606a6 (kx 2023-04-11 01:18:34 +0300 448) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 449) if( package && package->files && fname )
11c606a6 (kx 2023-04-11 01:18:34 +0300 450) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 451) package->files->list = dlist_append( package->files->list, (void *)xstrdup( (const char *)fname ) );
11c606a6 (kx 2023-04-11 01:18:34 +0300 452) package->files->size = dlist_length( package->files->list );
11c606a6 (kx 2023-04-11 01:18:34 +0300 453) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 454) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 455)
11c606a6 (kx 2023-04-11 01:18:34 +0300 456) /*********************
11c606a6 (kx 2023-04-11 01:18:34 +0300 457) Just for debugging:
11c606a6 (kx 2023-04-11 01:18:34 +0300 458) */
11c606a6 (kx 2023-04-11 01:18:34 +0300 459) static void __print_reference( void *data, void *user_data )
11c606a6 (kx 2023-04-11 01:18:34 +0300 460) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 461) struct pkg *pkg = (struct pkg *)data;
11c606a6 (kx 2023-04-11 01:18:34 +0300 462)
11c606a6 (kx 2023-04-11 01:18:34 +0300 463) if( pkg )
11c606a6 (kx 2023-04-11 01:18:34 +0300 464) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 465) if( pkg->group ) { fprintf( stdout, "reference: %s/%s=%s\n", pkg->group, pkg->name, pkg->version ); }
11c606a6 (kx 2023-04-11 01:18:34 +0300 466) else { fprintf( stdout, "reference: %s=%s\n", pkg->name, pkg->version ); }
11c606a6 (kx 2023-04-11 01:18:34 +0300 467) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 468) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 469)
11c606a6 (kx 2023-04-11 01:18:34 +0300 470) void package_print_references( struct package *package )
11c606a6 (kx 2023-04-11 01:18:34 +0300 471) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 472) if( !package ) return;
11c606a6 (kx 2023-04-11 01:18:34 +0300 473)
11c606a6 (kx 2023-04-11 01:18:34 +0300 474) if( package->references->list )
11c606a6 (kx 2023-04-11 01:18:34 +0300 475) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 476) dlist_foreach( package->references->list, __print_reference, NULL );
11c606a6 (kx 2023-04-11 01:18:34 +0300 477) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 478) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 479)
11c606a6 (kx 2023-04-11 01:18:34 +0300 480) static void __print_required( void *data, void *user_data )
11c606a6 (kx 2023-04-11 01:18:34 +0300 481) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 482) struct pkg *pkg = (struct pkg *)data;
11c606a6 (kx 2023-04-11 01:18:34 +0300 483)
11c606a6 (kx 2023-04-11 01:18:34 +0300 484) if( pkg )
11c606a6 (kx 2023-04-11 01:18:34 +0300 485) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 486) if( pkg->group ) { fprintf( stdout, "required: %s/%s=%s\n", pkg->group, pkg->name, pkg->version ); }
11c606a6 (kx 2023-04-11 01:18:34 +0300 487) else { fprintf( stdout, "required: %s=%s\n", pkg->name, pkg->version ); }
11c606a6 (kx 2023-04-11 01:18:34 +0300 488) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 489) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 490)
11c606a6 (kx 2023-04-11 01:18:34 +0300 491) void package_print_requires( struct package *package )
11c606a6 (kx 2023-04-11 01:18:34 +0300 492) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 493) if( !package ) return;
11c606a6 (kx 2023-04-11 01:18:34 +0300 494)
11c606a6 (kx 2023-04-11 01:18:34 +0300 495) if( package->requires->list )
11c606a6 (kx 2023-04-11 01:18:34 +0300 496) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 497) dlist_foreach( package->requires->list, __print_required, NULL );
11c606a6 (kx 2023-04-11 01:18:34 +0300 498) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 499) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 500)
11c606a6 (kx 2023-04-11 01:18:34 +0300 501) static void __print_file( void *data, void *user_data )
11c606a6 (kx 2023-04-11 01:18:34 +0300 502) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 503) int *counter = (int *)user_data;
11c606a6 (kx 2023-04-11 01:18:34 +0300 504)
11c606a6 (kx 2023-04-11 01:18:34 +0300 505) if( counter ) { fprintf( stdout, "file[%.5d]: %s\n", *counter, (char *)data ); ++(*counter); }
11c606a6 (kx 2023-04-11 01:18:34 +0300 506) else { fprintf( stdout, "file: %s\n", (char *)data ); }
11c606a6 (kx 2023-04-11 01:18:34 +0300 507) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 508)
11c606a6 (kx 2023-04-11 01:18:34 +0300 509) void package_print_files( struct package *package )
11c606a6 (kx 2023-04-11 01:18:34 +0300 510) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 511) int cnt = 0;
11c606a6 (kx 2023-04-11 01:18:34 +0300 512)
11c606a6 (kx 2023-04-11 01:18:34 +0300 513) if( !package ) return;
11c606a6 (kx 2023-04-11 01:18:34 +0300 514)
11c606a6 (kx 2023-04-11 01:18:34 +0300 515) if( package->files->list )
11c606a6 (kx 2023-04-11 01:18:34 +0300 516) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 517) dlist_foreach( package->files->list, __print_file, (void *)&cnt );
11c606a6 (kx 2023-04-11 01:18:34 +0300 518) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 519) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 520)
11c606a6 (kx 2023-04-11 01:18:34 +0300 521) /*
11c606a6 (kx 2023-04-11 01:18:34 +0300 522) End of PACKAGES functions.
11c606a6 (kx 2023-04-11 01:18:34 +0300 523) ***************************************************************/
11c606a6 (kx 2023-04-11 01:18:34 +0300 524)
11c606a6 (kx 2023-04-11 01:18:34 +0300 525) /***************************************************************
11c606a6 (kx 2023-04-11 01:18:34 +0300 526) Extern REQUIRES list functions:
11c606a6 (kx 2023-04-11 01:18:34 +0300 527) */
11c606a6 (kx 2023-04-11 01:18:34 +0300 528)
11c606a6 (kx 2023-04-11 01:18:34 +0300 529) static int __compare_required( const void *a, const void *b )
11c606a6 (kx 2023-04-11 01:18:34 +0300 530) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 531) int ret = -1;
11c606a6 (kx 2023-04-11 01:18:34 +0300 532)
11c606a6 (kx 2023-04-11 01:18:34 +0300 533) struct pkg *pkg1 = (struct pkg *)a;
11c606a6 (kx 2023-04-11 01:18:34 +0300 534) struct pkg *pkg2 = (struct pkg *)b;
11c606a6 (kx 2023-04-11 01:18:34 +0300 535)
11c606a6 (kx 2023-04-11 01:18:34 +0300 536) if( pkg1->group && pkg2->group )
11c606a6 (kx 2023-04-11 01:18:34 +0300 537) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 538) ret = strcmp( pkg1->group, pkg2->group );
11c606a6 (kx 2023-04-11 01:18:34 +0300 539) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 540) else if( !pkg1->group && !pkg2->group )
11c606a6 (kx 2023-04-11 01:18:34 +0300 541) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 542) ret = 0;
11c606a6 (kx 2023-04-11 01:18:34 +0300 543) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 544) else if( pkg1->group )
11c606a6 (kx 2023-04-11 01:18:34 +0300 545) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 546) ret = 1;
11c606a6 (kx 2023-04-11 01:18:34 +0300 547) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 548)
11c606a6 (kx 2023-04-11 01:18:34 +0300 549) if( ! ret )
11c606a6 (kx 2023-04-11 01:18:34 +0300 550) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 551) return strcmp( pkg1->name, pkg2->name );
11c606a6 (kx 2023-04-11 01:18:34 +0300 552) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 553) return ret;
11c606a6 (kx 2023-04-11 01:18:34 +0300 554) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 555)
11c606a6 (kx 2023-04-11 01:18:34 +0300 556) static int __compare_required_with_version( const void *a, const void *b )
11c606a6 (kx 2023-04-11 01:18:34 +0300 557) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 558) int ret = -1;
11c606a6 (kx 2023-04-11 01:18:34 +0300 559)
11c606a6 (kx 2023-04-11 01:18:34 +0300 560) struct pkg *pkg1 = (struct pkg *)a;
11c606a6 (kx 2023-04-11 01:18:34 +0300 561) struct pkg *pkg2 = (struct pkg *)b;
11c606a6 (kx 2023-04-11 01:18:34 +0300 562)
11c606a6 (kx 2023-04-11 01:18:34 +0300 563) if( pkg1->group && pkg2->group )
11c606a6 (kx 2023-04-11 01:18:34 +0300 564) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 565) ret = strcmp( pkg1->group, pkg2->group );
11c606a6 (kx 2023-04-11 01:18:34 +0300 566) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 567) else if( !pkg1->group && !pkg2->group )
11c606a6 (kx 2023-04-11 01:18:34 +0300 568) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 569) ret = 0;
11c606a6 (kx 2023-04-11 01:18:34 +0300 570) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 571) else if( pkg1->group )
11c606a6 (kx 2023-04-11 01:18:34 +0300 572) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 573) ret = 1;
11c606a6 (kx 2023-04-11 01:18:34 +0300 574) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 575)
11c606a6 (kx 2023-04-11 01:18:34 +0300 576) if( ! ret )
11c606a6 (kx 2023-04-11 01:18:34 +0300 577) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 578) ret = strcmp( pkg1->name, pkg2->name );
11c606a6 (kx 2023-04-11 01:18:34 +0300 579) if( ! ret )
11c606a6 (kx 2023-04-11 01:18:34 +0300 580) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 581) return cmp_version( (const char *)pkg1->version, (const char *)pkg2->version );
11c606a6 (kx 2023-04-11 01:18:34 +0300 582) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 583) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 584) return ret;
11c606a6 (kx 2023-04-11 01:18:34 +0300 585) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 586)
11c606a6 (kx 2023-04-11 01:18:34 +0300 587) static void __add_unique_required( void *data, void *user_data )
11c606a6 (kx 2023-04-11 01:18:34 +0300 588) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 589) struct pkg *pkg = (struct pkg *)data;
11c606a6 (kx 2023-04-11 01:18:34 +0300 590)
11c606a6 (kx 2023-04-11 01:18:34 +0300 591) if( pkg )
11c606a6 (kx 2023-04-11 01:18:34 +0300 592) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 593) struct dlist *found = dlist_find_data( extern_requires, __compare_required, (const void *)data );
11c606a6 (kx 2023-04-11 01:18:34 +0300 594)
11c606a6 (kx 2023-04-11 01:18:34 +0300 595) if( found )
11c606a6 (kx 2023-04-11 01:18:34 +0300 596) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 597) if( cmp_version( (const char *)((struct pkg *)found->data)->version, (const char *)pkg->version ) )
11c606a6 (kx 2023-04-11 01:18:34 +0300 598) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 599) char *s = ((struct pkg *)found->data)->version;
11c606a6 (kx 2023-04-11 01:18:34 +0300 600) ((struct pkg *)found->data)->version =
11c606a6 (kx 2023-04-11 01:18:34 +0300 601) xstrdup( (const char *)max_version( (const char *)((struct pkg *)found->data)->version,
11c606a6 (kx 2023-04-11 01:18:34 +0300 602) (const char *)pkg->version ) );
11c606a6 (kx 2023-04-11 01:18:34 +0300 603) free( s );
11c606a6 (kx 2023-04-11 01:18:34 +0300 604) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 605) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 606) else
11c606a6 (kx 2023-04-11 01:18:34 +0300 607) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 608) struct pkg *req = pkg_alloc();
11c606a6 (kx 2023-04-11 01:18:34 +0300 609) if( req )
11c606a6 (kx 2023-04-11 01:18:34 +0300 610) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 611) if( pkg->group )
11c606a6 (kx 2023-04-11 01:18:34 +0300 612) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 613) req->group = xstrdup( (const char *)pkg->group );
11c606a6 (kx 2023-04-11 01:18:34 +0300 614) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 615) req->name = xstrdup( (const char *)pkg->name );
11c606a6 (kx 2023-04-11 01:18:34 +0300 616) req->version = xstrdup( (const char *)pkg->version );
11c606a6 (kx 2023-04-11 01:18:34 +0300 617)
11c606a6 (kx 2023-04-11 01:18:34 +0300 618) extern_requires = dlist_append( extern_requires, (void *)req );
11c606a6 (kx 2023-04-11 01:18:34 +0300 619) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 620) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 621) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 622) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 623)
11c606a6 (kx 2023-04-11 01:18:34 +0300 624) static void __fill_extern_requires( void *data, void *user_data )
11c606a6 (kx 2023-04-11 01:18:34 +0300 625) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 626) struct package *package = (struct package *)data;
11c606a6 (kx 2023-04-11 01:18:34 +0300 627)
11c606a6 (kx 2023-04-11 01:18:34 +0300 628) if( package )
11c606a6 (kx 2023-04-11 01:18:34 +0300 629) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 630) struct pkg *provide = pkg_alloc();
11c606a6 (kx 2023-04-11 01:18:34 +0300 631)
11c606a6 (kx 2023-04-11 01:18:34 +0300 632) if( provide )
11c606a6 (kx 2023-04-11 01:18:34 +0300 633) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 634) if( package->pkginfo->group )
11c606a6 (kx 2023-04-11 01:18:34 +0300 635) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 636) provide->group = xstrdup( (const char *)package->pkginfo->group );
11c606a6 (kx 2023-04-11 01:18:34 +0300 637) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 638) provide->name = xstrdup( (const char *)package->pkginfo->name );
11c606a6 (kx 2023-04-11 01:18:34 +0300 639) provide->version = xstrdup( (const char *)package->pkginfo->version );
11c606a6 (kx 2023-04-11 01:18:34 +0300 640)
11c606a6 (kx 2023-04-11 01:18:34 +0300 641) provides = dlist_append( provides, (void *)provide );
11c606a6 (kx 2023-04-11 01:18:34 +0300 642) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 643)
11c606a6 (kx 2023-04-11 01:18:34 +0300 644) if( package->requires->list )
11c606a6 (kx 2023-04-11 01:18:34 +0300 645) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 646) dlist_foreach( package->requires->list, __add_unique_required, NULL );
11c606a6 (kx 2023-04-11 01:18:34 +0300 647) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 648) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 649) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 650)
11c606a6 (kx 2023-04-11 01:18:34 +0300 651) static void __clean_extern_requires( void *data, void *user_data )
11c606a6 (kx 2023-04-11 01:18:34 +0300 652) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 653) if( data )
11c606a6 (kx 2023-04-11 01:18:34 +0300 654) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 655) extern_requires = dlist_remove_data( extern_requires, __compare_required_with_version, __pkg_free_func, (const void *)data );
11c606a6 (kx 2023-04-11 01:18:34 +0300 656) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 657) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 658)
11c606a6 (kx 2023-04-11 01:18:34 +0300 659) static int __compare_provided_old_package( const void *a, const void *b )
11c606a6 (kx 2023-04-11 01:18:34 +0300 660) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 661) int ret = -1;
11c606a6 (kx 2023-04-11 01:18:34 +0300 662)
11c606a6 (kx 2023-04-11 01:18:34 +0300 663) struct package *pkg1 = (struct package *)a;
11c606a6 (kx 2023-04-11 01:18:34 +0300 664) struct pkg *pkg2 = (struct pkg *)b;
11c606a6 (kx 2023-04-11 01:18:34 +0300 665)
11c606a6 (kx 2023-04-11 01:18:34 +0300 666) if( pkg1->pkginfo->group && pkg2->group )
11c606a6 (kx 2023-04-11 01:18:34 +0300 667) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 668) ret = strcmp( pkg1->pkginfo->group, pkg2->group );
11c606a6 (kx 2023-04-11 01:18:34 +0300 669) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 670) else if( !pkg1->pkginfo->group && !pkg2->group )
11c606a6 (kx 2023-04-11 01:18:34 +0300 671) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 672) ret = 0;
11c606a6 (kx 2023-04-11 01:18:34 +0300 673) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 674) else if( pkg1->pkginfo->group )
11c606a6 (kx 2023-04-11 01:18:34 +0300 675) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 676) ret = 1;
11c606a6 (kx 2023-04-11 01:18:34 +0300 677) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 678)
11c606a6 (kx 2023-04-11 01:18:34 +0300 679) if( ! ret )
11c606a6 (kx 2023-04-11 01:18:34 +0300 680) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 681) ret = strcmp( pkg1->pkginfo->name, pkg2->name );
11c606a6 (kx 2023-04-11 01:18:34 +0300 682) if( ! ret )
11c606a6 (kx 2023-04-11 01:18:34 +0300 683) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 684) pkg2->procedure = UPDATE; /* mark as too old */
11c606a6 (kx 2023-04-11 01:18:34 +0300 685) return ret;
11c606a6 (kx 2023-04-11 01:18:34 +0300 686) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 687) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 688) return ret;
11c606a6 (kx 2023-04-11 01:18:34 +0300 689) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 690)
11c606a6 (kx 2023-04-11 01:18:34 +0300 691) static void __remove_old_package( void *data, void *user_data )
11c606a6 (kx 2023-04-11 01:18:34 +0300 692) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 693) packages = dlist_remove_data( packages, __compare_provided_old_package, __package_free_func, (const void *)data );
11c606a6 (kx 2023-04-11 01:18:34 +0300 694) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 695)
11c606a6 (kx 2023-04-11 01:18:34 +0300 696) static void remove_old_packages( void )
11c606a6 (kx 2023-04-11 01:18:34 +0300 697) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 698) dlist_foreach( extern_requires, __remove_old_package, NULL );
11c606a6 (kx 2023-04-11 01:18:34 +0300 699) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 700) /*
11c606a6 (kx 2023-04-11 01:18:34 +0300 701) End of Extern REQUIRES list functions.
11c606a6 (kx 2023-04-11 01:18:34 +0300 702) ***************************************************************/
11c606a6 (kx 2023-04-11 01:18:34 +0300 703)
11c606a6 (kx 2023-04-11 01:18:34 +0300 704)
11c606a6 (kx 2023-04-11 01:18:34 +0300 705) /***************************************************************
11c606a6 (kx 2023-04-11 01:18:34 +0300 706) Check REQUIRES functions:
11c606a6 (kx 2023-04-11 01:18:34 +0300 707) */
11c606a6 (kx 2023-04-11 01:18:34 +0300 708) static int __compare_provided( const void *a, const void *b )
11c606a6 (kx 2023-04-11 01:18:34 +0300 709) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 710) int ret = -1;
11c606a6 (kx 2023-04-11 01:18:34 +0300 711)
11c606a6 (kx 2023-04-11 01:18:34 +0300 712) struct package *pkg1 = (struct package *)a;
11c606a6 (kx 2023-04-11 01:18:34 +0300 713) struct pkg *pkg2 = (struct pkg *)b;
11c606a6 (kx 2023-04-11 01:18:34 +0300 714)
11c606a6 (kx 2023-04-11 01:18:34 +0300 715) if( pkg1->pkginfo->group && pkg2->group )
11c606a6 (kx 2023-04-11 01:18:34 +0300 716) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 717) ret = strcmp( pkg1->pkginfo->group, pkg2->group );
11c606a6 (kx 2023-04-11 01:18:34 +0300 718) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 719) else if( !pkg1->pkginfo->group && !pkg2->group )
11c606a6 (kx 2023-04-11 01:18:34 +0300 720) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 721) ret = 0;
11c606a6 (kx 2023-04-11 01:18:34 +0300 722) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 723) else if( pkg1->pkginfo->group )
11c606a6 (kx 2023-04-11 01:18:34 +0300 724) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 725) ret = 1;
11c606a6 (kx 2023-04-11 01:18:34 +0300 726) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 727)
11c606a6 (kx 2023-04-11 01:18:34 +0300 728) if( ! ret )
11c606a6 (kx 2023-04-11 01:18:34 +0300 729) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 730) return strcmp( pkg1->pkginfo->name, pkg2->name );
11c606a6 (kx 2023-04-11 01:18:34 +0300 731) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 732) return ret;
11c606a6 (kx 2023-04-11 01:18:34 +0300 733) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 734)
11c606a6 (kx 2023-04-11 01:18:34 +0300 735) static int __compare_packages_by_name( const void *a, const void *b )
11c606a6 (kx 2023-04-11 01:18:34 +0300 736) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 737) int ret = -1;
11c606a6 (kx 2023-04-11 01:18:34 +0300 738)
11c606a6 (kx 2023-04-11 01:18:34 +0300 739) struct package *pkg1 = (struct package *)a;
11c606a6 (kx 2023-04-11 01:18:34 +0300 740) struct package *pkg2 = (struct package *)b;
11c606a6 (kx 2023-04-11 01:18:34 +0300 741)
11c606a6 (kx 2023-04-11 01:18:34 +0300 742) if( !strcmp( pkg1->pkginfo->name, pkg2->pkginfo->name ) )
11c606a6 (kx 2023-04-11 01:18:34 +0300 743) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 744) if( pkg1->pkginfo->group && pkg2->pkginfo->group )
11c606a6 (kx 2023-04-11 01:18:34 +0300 745) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 746) ret = strcmp( pkg1->pkginfo->group, pkg2->pkginfo->group );
11c606a6 (kx 2023-04-11 01:18:34 +0300 747) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 748) else if( !pkg1->pkginfo->group && !pkg2->pkginfo->group )
11c606a6 (kx 2023-04-11 01:18:34 +0300 749) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 750) ret = 0;
11c606a6 (kx 2023-04-11 01:18:34 +0300 751) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 752) else if( pkg1->pkginfo->group )
11c606a6 (kx 2023-04-11 01:18:34 +0300 753) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 754) ret = 1;
11c606a6 (kx 2023-04-11 01:18:34 +0300 755) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 756)
11c606a6 (kx 2023-04-11 01:18:34 +0300 757) /* returns equal only if groups are not equal */
11c606a6 (kx 2023-04-11 01:18:34 +0300 758) if( ret ) return 0;
11c606a6 (kx 2023-04-11 01:18:34 +0300 759) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 760)
11c606a6 (kx 2023-04-11 01:18:34 +0300 761) return ret;
11c606a6 (kx 2023-04-11 01:18:34 +0300 762) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 763)
11c606a6 (kx 2023-04-11 01:18:34 +0300 764) static int check_dependencies( struct package *package )
11c606a6 (kx 2023-04-11 01:18:34 +0300 765) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 766) struct dlist *list = NULL, *next = NULL, *update = NULL;
11c606a6 (kx 2023-04-11 01:18:34 +0300 767) int depended = -1;
11c606a6 (kx 2023-04-11 01:18:34 +0300 768)
11c606a6 (kx 2023-04-11 01:18:34 +0300 769) if( !package ) return depended;
11c606a6 (kx 2023-04-11 01:18:34 +0300 770) depended = 0;
11c606a6 (kx 2023-04-11 01:18:34 +0300 771)
11c606a6 (kx 2023-04-11 01:18:34 +0300 772) if( !(list = package->requires->list) ) return depended;
11c606a6 (kx 2023-04-11 01:18:34 +0300 773)
11c606a6 (kx 2023-04-11 01:18:34 +0300 774) while( list )
11c606a6 (kx 2023-04-11 01:18:34 +0300 775) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 776) next = dlist_next( list );
11c606a6 (kx 2023-04-11 01:18:34 +0300 777) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 778) int has_extern_dependencies = 0, already_provided = 0;
11c606a6 (kx 2023-04-11 01:18:34 +0300 779)
11c606a6 (kx 2023-04-11 01:18:34 +0300 780) struct pkg *pkg = (struct pkg *)list->data;
11c606a6 (kx 2023-04-11 01:18:34 +0300 781) struct dlist *found = dlist_find_data( extern_requires, __compare_required, (const void *)pkg );
11c606a6 (kx 2023-04-11 01:18:34 +0300 782)
11c606a6 (kx 2023-04-11 01:18:34 +0300 783) if( found )
11c606a6 (kx 2023-04-11 01:18:34 +0300 784) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 785) if( cmp_version( (const char *)((struct pkg *)found->data)->version, (const char *)pkg->version ) >= 0 )
11c606a6 (kx 2023-04-11 01:18:34 +0300 786) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 787) /* required package is found in the extern_requires list */
11c606a6 (kx 2023-04-11 01:18:34 +0300 788) has_extern_dependencies += 1;
11c606a6 (kx 2023-04-11 01:18:34 +0300 789) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 790) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 791)
11c606a6 (kx 2023-04-11 01:18:34 +0300 792) found = dlist_find_data( provides, __compare_provided, (const void *)pkg );
11c606a6 (kx 2023-04-11 01:18:34 +0300 793) if( found )
11c606a6 (kx 2023-04-11 01:18:34 +0300 794) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 795) if( cmp_version( (const char *)((struct package *)found->data)->pkginfo->version, (const char *)pkg->version ) >= 0 )
11c606a6 (kx 2023-04-11 01:18:34 +0300 796) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 797) /* required package is found in the extern_requires list */
11c606a6 (kx 2023-04-11 01:18:34 +0300 798) already_provided += 1;
11c606a6 (kx 2023-04-11 01:18:34 +0300 799) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 800) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 801)
11c606a6 (kx 2023-04-11 01:18:34 +0300 802) if( !already_provided && !has_extern_dependencies ) depended += 1;
11c606a6 (kx 2023-04-11 01:18:34 +0300 803) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 804) list = next;
11c606a6 (kx 2023-04-11 01:18:34 +0300 805) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 806)
11c606a6 (kx 2023-04-11 01:18:34 +0300 807) /* Check if the package with the same name already exists in the provides list */
11c606a6 (kx 2023-04-11 01:18:34 +0300 808) update = dlist_find_data( provides, __compare_packages_by_name, (const void *)package );
11c606a6 (kx 2023-04-11 01:18:34 +0300 809) if( update )
11c606a6 (kx 2023-04-11 01:18:34 +0300 810) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 811) /* Set install procedure to UPDATE: */
11c606a6 (kx 2023-04-11 01:18:34 +0300 812) package->procedure = UPDATE;
11c606a6 (kx 2023-04-11 01:18:34 +0300 813) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 814)
11c606a6 (kx 2023-04-11 01:18:34 +0300 815) return depended;
11c606a6 (kx 2023-04-11 01:18:34 +0300 816) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 817) /*
11c606a6 (kx 2023-04-11 01:18:34 +0300 818) End of Check REQUIRES functions.
11c606a6 (kx 2023-04-11 01:18:34 +0300 819) ***************************************************************/
11c606a6 (kx 2023-04-11 01:18:34 +0300 820)
11c606a6 (kx 2023-04-11 01:18:34 +0300 821) static void __fill_provides_list( void *data, void *user_data )
11c606a6 (kx 2023-04-11 01:18:34 +0300 822) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 823) struct package *package = (struct package *)data;
11c606a6 (kx 2023-04-11 01:18:34 +0300 824)
11c606a6 (kx 2023-04-11 01:18:34 +0300 825) if( package )
11c606a6 (kx 2023-04-11 01:18:34 +0300 826) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 827) if( !check_dependencies( package ) )
11c606a6 (kx 2023-04-11 01:18:34 +0300 828) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 829) /* move independed package to the provides list */
11c606a6 (kx 2023-04-11 01:18:34 +0300 830) packages = dlist_remove( packages, (const void *)data );
11c606a6 (kx 2023-04-11 01:18:34 +0300 831) provides = dlist_append( provides, (void *)package );
11c606a6 (kx 2023-04-11 01:18:34 +0300 832) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 833) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 834) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 835)
11c606a6 (kx 2023-04-11 01:18:34 +0300 836)
11c606a6 (kx 2023-04-11 01:18:34 +0300 837) static void __print_extern_package( void *data, void *user_data )
11c606a6 (kx 2023-04-11 01:18:34 +0300 838) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 839) FILE *output = (FILE *)user_data;
11c606a6 (kx 2023-04-11 01:18:34 +0300 840) struct pkg *pkg = (struct pkg *)data;
11c606a6 (kx 2023-04-11 01:18:34 +0300 841)
11c606a6 (kx 2023-04-11 01:18:34 +0300 842) if( pkg )
11c606a6 (kx 2023-04-11 01:18:34 +0300 843) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 844) if( pkg->group ) { fprintf( output, "# required: %s/%s=%s\n", pkg->group, pkg->name, pkg->version ); }
11c606a6 (kx 2023-04-11 01:18:34 +0300 845) else { fprintf( output, "# required: %s=%s\n", pkg->name, pkg->version ); }
11c606a6 (kx 2023-04-11 01:18:34 +0300 846) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 847) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 848)
11c606a6 (kx 2023-04-11 01:18:34 +0300 849) static void __print_provided_package( void *data, void *user_data )
11c606a6 (kx 2023-04-11 01:18:34 +0300 850) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 851) FILE *output = (FILE *)user_data;
11c606a6 (kx 2023-04-11 01:18:34 +0300 852) struct package *package = (struct package *)data;
11c606a6 (kx 2023-04-11 01:18:34 +0300 853)
11c606a6 (kx 2023-04-11 01:18:34 +0300 854) if( package )
11c606a6 (kx 2023-04-11 01:18:34 +0300 855) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 856) fprintf( output, "%s:", package->pkginfo->name );
11c606a6 (kx 2023-04-11 01:18:34 +0300 857) fprintf( output, "%s:", package->pkginfo->version );
11c606a6 (kx 2023-04-11 01:18:34 +0300 858) fprintf( output, "%s:", package->pkginfo->short_description );
11c606a6 (kx 2023-04-11 01:18:34 +0300 859) if( package->tarball )
11c606a6 (kx 2023-04-11 01:18:34 +0300 860) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 861) fprintf( output, "%s:", package->tarball );
11c606a6 (kx 2023-04-11 01:18:34 +0300 862) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 863) else
11c606a6 (kx 2023-04-11 01:18:34 +0300 864) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 865) if( package->pkginfo->group ) fprintf( output, "%s/", package->pkginfo->group );
11c606a6 (kx 2023-04-11 01:18:34 +0300 866)
11c606a6 (kx 2023-04-11 01:18:34 +0300 867) fprintf( output, "%s-", package->pkginfo->name );
11c606a6 (kx 2023-04-11 01:18:34 +0300 868) fprintf( output, "%s-", package->pkginfo->version );
11c606a6 (kx 2023-04-11 01:18:34 +0300 869) fprintf( output, "%s-", package->pkginfo->arch );
11c606a6 (kx 2023-04-11 01:18:34 +0300 870) fprintf( output, "%s-", package->pkginfo->distro_name );
11c606a6 (kx 2023-04-11 01:18:34 +0300 871) fprintf( output, "%s.", package->pkginfo->distro_version );
11c606a6 (kx 2023-04-11 01:18:34 +0300 872) fprintf( output, "%s:", tarball_suffix ); /* default is '.txz' */
11c606a6 (kx 2023-04-11 01:18:34 +0300 873) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 874) fprintf( output, "%s:", strproc( package->procedure ) );
11c606a6 (kx 2023-04-11 01:18:34 +0300 875) fprintf( output, "%s\n", strprio( package->priority, 0 ) );
11c606a6 (kx 2023-04-11 01:18:34 +0300 876) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 877) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 878)
11c606a6 (kx 2023-04-11 01:18:34 +0300 879)
11c606a6 (kx 2023-04-11 01:18:34 +0300 880) static void __reduce_packages_list( struct pkg *pkg )
11c606a6 (kx 2023-04-11 01:18:34 +0300 881) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 882) struct package *package = NULL;
11c606a6 (kx 2023-04-11 01:18:34 +0300 883) struct dlist *found = NULL;
11c606a6 (kx 2023-04-11 01:18:34 +0300 884)
11c606a6 (kx 2023-04-11 01:18:34 +0300 885) if( !pkg ) return;
11c606a6 (kx 2023-04-11 01:18:34 +0300 886)
11c606a6 (kx 2023-04-11 01:18:34 +0300 887) found = dlist_find_data( packages, __compare_provided, (const void *)pkg );
11c606a6 (kx 2023-04-11 01:18:34 +0300 888) if( found && found->data )
11c606a6 (kx 2023-04-11 01:18:34 +0300 889) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 890) struct dlist *list = NULL, *next = NULL;
11c606a6 (kx 2023-04-11 01:18:34 +0300 891)
11c606a6 (kx 2023-04-11 01:18:34 +0300 892) package = (struct package *)found->data;
11c606a6 (kx 2023-04-11 01:18:34 +0300 893)
11c606a6 (kx 2023-04-11 01:18:34 +0300 894) packages = dlist_remove( packages, (const void *)package );
11c606a6 (kx 2023-04-11 01:18:34 +0300 895) provides = dlist_append( provides, (void *)package );
11c606a6 (kx 2023-04-11 01:18:34 +0300 896)
11c606a6 (kx 2023-04-11 01:18:34 +0300 897) if( !(list = package->requires->list) ) return;
11c606a6 (kx 2023-04-11 01:18:34 +0300 898)
11c606a6 (kx 2023-04-11 01:18:34 +0300 899) while( list )
11c606a6 (kx 2023-04-11 01:18:34 +0300 900) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 901) next = dlist_next( list );
11c606a6 (kx 2023-04-11 01:18:34 +0300 902) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 903) __reduce_packages_list( (struct pkg *)list->data );
11c606a6 (kx 2023-04-11 01:18:34 +0300 904) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 905) list = next;
11c606a6 (kx 2023-04-11 01:18:34 +0300 906) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 907) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 908) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 909)
11c606a6 (kx 2023-04-11 01:18:34 +0300 910) static void __reduce_packages_list_single( void *data, void *user_data )
11c606a6 (kx 2023-04-11 01:18:34 +0300 911) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 912) struct pkg *pkg = (struct pkg *)data;
11c606a6 (kx 2023-04-11 01:18:34 +0300 913)
11c606a6 (kx 2023-04-11 01:18:34 +0300 914) if( pkg ) { __reduce_packages_list( pkg ); }
11c606a6 (kx 2023-04-11 01:18:34 +0300 915) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 916)
11c606a6 (kx 2023-04-11 01:18:34 +0300 917)
11c606a6 (kx 2023-04-11 01:18:34 +0300 918) static void reduce_packages_list( struct dlist *srcpkgs )
11c606a6 (kx 2023-04-11 01:18:34 +0300 919) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 920) if( ! srcpkgs ) return;
11c606a6 (kx 2023-04-11 01:18:34 +0300 921)
11c606a6 (kx 2023-04-11 01:18:34 +0300 922) dlist_foreach( srcpkgs, __reduce_packages_list_single, NULL );
11c606a6 (kx 2023-04-11 01:18:34 +0300 923)
11c606a6 (kx 2023-04-11 01:18:34 +0300 924) dlist_free( packages, __package_free_func );
11c606a6 (kx 2023-04-11 01:18:34 +0300 925) if( dlist_length( provides ) != 0 )
11c606a6 (kx 2023-04-11 01:18:34 +0300 926) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 927) packages = provides;
11c606a6 (kx 2023-04-11 01:18:34 +0300 928) provides = NULL;
11c606a6 (kx 2023-04-11 01:18:34 +0300 929) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 930) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 931)
11c606a6 (kx 2023-04-11 01:18:34 +0300 932) int create_provides_list( struct dlist *srcpkgs )
11c606a6 (kx 2023-04-11 01:18:34 +0300 933) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 934) int ret = 0;
11c606a6 (kx 2023-04-11 01:18:34 +0300 935)
11c606a6 (kx 2023-04-11 01:18:34 +0300 936) if( !packages ) return ret;
11c606a6 (kx 2023-04-11 01:18:34 +0300 937)
11c606a6 (kx 2023-04-11 01:18:34 +0300 938) if( srcpkgs && dlist_length( srcpkgs ) > 0 )
11c606a6 (kx 2023-04-11 01:18:34 +0300 939) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 940) /******************************************************************
11c606a6 (kx 2023-04-11 01:18:34 +0300 941) Reduce packages list to the list of requires of source packages:
11c606a6 (kx 2023-04-11 01:18:34 +0300 942) */
11c606a6 (kx 2023-04-11 01:18:34 +0300 943) reduce_packages_list( srcpkgs );
11c606a6 (kx 2023-04-11 01:18:34 +0300 944) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 945)
11c606a6 (kx 2023-04-11 01:18:34 +0300 946) /* Fill two lists: provides and extern_requires: */
11c606a6 (kx 2023-04-11 01:18:34 +0300 947) dlist_foreach( packages, __fill_extern_requires, NULL );
11c606a6 (kx 2023-04-11 01:18:34 +0300 948)
11c606a6 (kx 2023-04-11 01:18:34 +0300 949) /* Remove packages from extern_requires list which present in the provides list: */
11c606a6 (kx 2023-04-11 01:18:34 +0300 950) dlist_foreach( provides, __clean_extern_requires, NULL );
11c606a6 (kx 2023-04-11 01:18:34 +0300 951)
11c606a6 (kx 2023-04-11 01:18:34 +0300 952) /* Now we don't need previous contents of provides list: */
11c606a6 (kx 2023-04-11 01:18:34 +0300 953) dlist_free( provides, __pkg_free_func );
11c606a6 (kx 2023-04-11 01:18:34 +0300 954) provides = NULL;
11c606a6 (kx 2023-04-11 01:18:34 +0300 955)
11c606a6 (kx 2023-04-11 01:18:34 +0300 956) /* Remove old packages if required new version of them */
11c606a6 (kx 2023-04-11 01:18:34 +0300 957) remove_old_packages();
11c606a6 (kx 2023-04-11 01:18:34 +0300 958)
11c606a6 (kx 2023-04-11 01:18:34 +0300 959) /* move packages into provides list in order of installation: */
11c606a6 (kx 2023-04-11 01:18:34 +0300 960) while( dlist_length( packages ) != 0 )
11c606a6 (kx 2023-04-11 01:18:34 +0300 961) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 962) dlist_foreach( packages, __fill_provides_list, NULL );
11c606a6 (kx 2023-04-11 01:18:34 +0300 963) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 964)
11c606a6 (kx 2023-04-11 01:18:34 +0300 965) return dlist_length( extern_requires );
11c606a6 (kx 2023-04-11 01:18:34 +0300 966) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 967)
11c606a6 (kx 2023-04-11 01:18:34 +0300 968) void free_provides_list( void )
11c606a6 (kx 2023-04-11 01:18:34 +0300 969) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 970) if( htmlroot ) { free( htmlroot ); htmlroot = NULL; }
11c606a6 (kx 2023-04-11 01:18:34 +0300 971) if( hardware ) { free( hardware ); hardware = NULL; }
11c606a6 (kx 2023-04-11 01:18:34 +0300 972)
11c606a6 (kx 2023-04-11 01:18:34 +0300 973) dlist_free( extern_requires, __pkg_free_func );
11c606a6 (kx 2023-04-11 01:18:34 +0300 974) dlist_free( provides, __package_free_func );
11c606a6 (kx 2023-04-11 01:18:34 +0300 975) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 976)
11c606a6 (kx 2023-04-11 01:18:34 +0300 977) void print_provides_list( const char *plist_fname )
11c606a6 (kx 2023-04-11 01:18:34 +0300 978) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 979) FILE *plist = NULL;
11c606a6 (kx 2023-04-11 01:18:34 +0300 980)
11c606a6 (kx 2023-04-11 01:18:34 +0300 981) if( !plist_fname || !provides ) return;
11c606a6 (kx 2023-04-11 01:18:34 +0300 982)
11c606a6 (kx 2023-04-11 01:18:34 +0300 983) plist = fopen( plist_fname, "w" );
11c606a6 (kx 2023-04-11 01:18:34 +0300 984) if( !plist )
11c606a6 (kx 2023-04-11 01:18:34 +0300 985) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 986) FATAL_ERROR( "Cannot create output %s file", basename( (char *)plist_fname ) );
11c606a6 (kx 2023-04-11 01:18:34 +0300 987) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 988)
11c606a6 (kx 2023-04-11 01:18:34 +0300 989) fprintf( plist, "#\n" );
11c606a6 (kx 2023-04-11 01:18:34 +0300 990) fprintf( plist, "# file format:\n" );
11c606a6 (kx 2023-04-11 01:18:34 +0300 991) fprintf( plist, "# ===========\n" );
11c606a6 (kx 2023-04-11 01:18:34 +0300 992) fprintf( plist, "#\n" );
11c606a6 (kx 2023-04-11 01:18:34 +0300 993) fprintf( plist, "# Each line contains six fields separated by colon symbol ':' like following.\n" );
11c606a6 (kx 2023-04-11 01:18:34 +0300 994) fprintf( plist, "#\n" );
11c606a6 (kx 2023-04-11 01:18:34 +0300 995) fprintf( plist, "# pkgname:version:description:tarball:procedure:priority\n" );
11c606a6 (kx 2023-04-11 01:18:34 +0300 996) fprintf( plist, "#\n" );
11c606a6 (kx 2023-04-11 01:18:34 +0300 997) fprintf( plist, "# where:\n" );
11c606a6 (kx 2023-04-11 01:18:34 +0300 998) fprintf( plist, "#\n" );
11c606a6 (kx 2023-04-11 01:18:34 +0300 999) fprintf( plist, "# pkgname - should be the same as the value of pkgname in the '.DESCRIPTION' file;\n" );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1000) fprintf( plist, "# version - package version for showing in check list dialog box if this file is\n" );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1001) fprintf( plist, "# used to complete common check dialog for installing group of packages;\n" );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1002) fprintf( plist, "# description - short description for showing in check list dialog box if this file is\n" );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1003) fprintf( plist, "# used to complete common check dialog for installing group of packages;\n" );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1004) fprintf( plist, "# tarball - should end in '.txz';\n" );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1005) fprintf( plist, "# procedure - installation procedure {install | update}:\n" );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1006) fprintf( plist, "# * 'install' - if package requires normal installation,\n" );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1007) fprintf( plist, "# * 'update' - if already installed package should be updated by this\n" );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1008) fprintf( plist, "# package archive;\n" );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1009) fprintf( plist, "# priority - { REQUIRED|RECOMMENDED|OPTIONAL|SKIP }\n" );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1010) fprintf( plist, "# synonims:\n" );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1011) fprintf( plist, "# { REQUIRED | required | REQ | req }\n" );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1012) fprintf( plist, "# { RECOMMENDED | recommended | REC | rec }\n" );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1013) fprintf( plist, "# { OPTIONAL | optional | OPT | opt }\n" );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1014) fprintf( plist, "# { SKIP | skip | SKP | skp }\n" );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1015) fprintf( plist, "#\n" );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1016)
11c606a6 (kx 2023-04-11 01:18:34 +0300 1017) if( extern_requires )
11c606a6 (kx 2023-04-11 01:18:34 +0300 1018) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 1019) dlist_foreach( extern_requires, __print_extern_package, plist );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1020) fprintf( plist, "#\n" );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1021) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1022) dlist_foreach( provides, __print_provided_package, plist );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1023)
11c606a6 (kx 2023-04-11 01:18:34 +0300 1024) fflush( plist );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1025) fclose( plist );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1026) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1027)
11c606a6 (kx 2023-04-11 01:18:34 +0300 1028)
11c606a6 (kx 2023-04-11 01:18:34 +0300 1029) /***************************************************************
11c606a6 (kx 2023-04-11 01:18:34 +0300 1030) Requires TREE functions:
11c606a6 (kx 2023-04-11 01:18:34 +0300 1031) */
11c606a6 (kx 2023-04-11 01:18:34 +0300 1032)
11c606a6 (kx 2023-04-11 01:18:34 +0300 1033) struct _ctx
11c606a6 (kx 2023-04-11 01:18:34 +0300 1034) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 1035) FILE *output;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1036) int index, size, depth;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1037) };
11c606a6 (kx 2023-04-11 01:18:34 +0300 1038)
11c606a6 (kx 2023-04-11 01:18:34 +0300 1039) /**************************
11c606a6 (kx 2023-04-11 01:18:34 +0300 1040) HTML Template Variables:
11c606a6 (kx 2023-04-11 01:18:34 +0300 1041) */
11c606a6 (kx 2023-04-11 01:18:34 +0300 1042) static char *root = NULL;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1043) static char *bug_url = NULL;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1044)
11c606a6 (kx 2023-04-11 01:18:34 +0300 1045) static int svg_width = 2;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1046) static int svg_height = 2;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1047)
11c606a6 (kx 2023-04-11 01:18:34 +0300 1048) static char *json_pkgs_file = NULL;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1049) static char *json_tree_file = NULL;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1050)
11c606a6 (kx 2023-04-11 01:18:34 +0300 1051) static char *copying = "Radix cross Linux";
11c606a6 (kx 2023-04-11 01:18:34 +0300 1052)
11c606a6 (kx 2023-04-11 01:18:34 +0300 1053) #define max(a,b) ({ typeof (a) _a = (a); typeof (b) _b = (b); _a > _b ? _a : _b; })
11c606a6 (kx 2023-04-11 01:18:34 +0300 1054)
11c606a6 (kx 2023-04-11 01:18:34 +0300 1055) /*
11c606a6 (kx 2023-04-11 01:18:34 +0300 1056) формирование имен файлов для вывода REQUIRES tree:
11c606a6 (kx 2023-04-11 01:18:34 +0300 1057)
11c606a6 (kx 2023-04-11 01:18:34 +0300 1058) json_fname | last argument of make-pkglist | last argument type
11c606a6 (kx 2023-04-11 01:18:34 +0300 1059) -------------------------+-------------------------------+--------------------
11c606a6 (kx 2023-04-11 01:18:34 +0300 1060) './a.txt' | a.txt | regular file
11c606a6 (kx 2023-04-11 01:18:34 +0300 1061) './a.json' | a.json | regular file
11c606a6 (kx 2023-04-11 01:18:34 +0300 1062) './.json' | .json | regular file
11c606a6 (kx 2023-04-11 01:18:34 +0300 1063) './khadas-vim.json' | . | directory
11c606a6 (kx 2023-04-11 01:18:34 +0300 1064) './tmp/khadas-vim.json' | tmp | directory
11c606a6 (kx 2023-04-11 01:18:34 +0300 1065) -------------------------+-------------------------------+--------------------
11c606a6 (kx 2023-04-11 01:18:34 +0300 1066)
11c606a6 (kx 2023-04-11 01:18:34 +0300 1067) - если есть основное базовое имя файла и расширение, то расширение
11c606a6 (kx 2023-04-11 01:18:34 +0300 1068) заменяем на: '.pkgs.json', '.tree.json', '.tree.html';
11c606a6 (kx 2023-04-11 01:18:34 +0300 1069)
11c606a6 (kx 2023-04-11 01:18:34 +0300 1070) - если есть основное базовое имя файла без расширения, то добавляем
11c606a6 (kx 2023-04-11 01:18:34 +0300 1071) расширение: '.pkgs.json', '.tree.json', '.tree.html';
11c606a6 (kx 2023-04-11 01:18:34 +0300 1072)
11c606a6 (kx 2023-04-11 01:18:34 +0300 1073) - если основное базовое имя файла начинается с точки, то расширение
11c606a6 (kx 2023-04-11 01:18:34 +0300 1074) заменяем на: 'pkgs.json', 'tree.json', 'tree.html'.
11c606a6 (kx 2023-04-11 01:18:34 +0300 1075) */
11c606a6 (kx 2023-04-11 01:18:34 +0300 1076) static void allocate_fnames( const char *json_fname )
11c606a6 (kx 2023-04-11 01:18:34 +0300 1077) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 1078) char *p, *e, *f = NULL;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1079) char *buf = NULL;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1080)
11c606a6 (kx 2023-04-11 01:18:34 +0300 1081) buf = (char *)malloc( (size_t)PATH_MAX );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1082) if( !buf ) { FATAL_ERROR( "Cannot allocate memory" ); }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1083) bzero( (void *)buf, PATH_MAX );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1084)
11c606a6 (kx 2023-04-11 01:18:34 +0300 1085) (void)sprintf( &buf[0], "%s", json_fname );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1086) p = rindex( (const char *)&buf[0], '/' );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1087) if( p )
11c606a6 (kx 2023-04-11 01:18:34 +0300 1088) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 1089) if( p != &buf[0] ) f = ++p;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1090) else f = &buf[0];
11c606a6 (kx 2023-04-11 01:18:34 +0300 1091) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1092) e = rindex( (const char *)f, '.' );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1093) if( e )
11c606a6 (kx 2023-04-11 01:18:34 +0300 1094) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 1095) if( e != f )
11c606a6 (kx 2023-04-11 01:18:34 +0300 1096) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 1097) (void)sprintf( e, ".pkgs.json" ); pkgs_fname = xstrdup( (const char *)&buf[0] );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1098) (void)sprintf( e, ".tree.json" ); tree_fname = xstrdup( (const char *)&buf[0] );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1099) (void)sprintf( e, ".tree.html" ); html_fname = xstrdup( (const char *)&buf[0] );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1100)
11c606a6 (kx 2023-04-11 01:18:34 +0300 1101) (void)sprintf( e, ".pkgs.min.json" ); pkgs_min_fname = xstrdup( (const char *)&buf[0] );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1102) (void)sprintf( e, ".tree.min.json" ); tree_min_fname = xstrdup( (const char *)&buf[0] );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1103) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1104) else
11c606a6 (kx 2023-04-11 01:18:34 +0300 1105) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 1106) (void)sprintf( e, "pkgs.json" ); pkgs_fname = xstrdup( (const char *)&buf[0] );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1107) (void)sprintf( e, "tree.json" ); tree_fname = xstrdup( (const char *)&buf[0] );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1108) (void)sprintf( e, "tree.html" ); html_fname = xstrdup( (const char *)&buf[0] );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1109)
11c606a6 (kx 2023-04-11 01:18:34 +0300 1110) (void)sprintf( e, "pkgs.min.json" ); pkgs_min_fname = xstrdup( (const char *)&buf[0] );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1111) (void)sprintf( e, "tree.min.json" ); tree_min_fname = xstrdup( (const char *)&buf[0] );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1112) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1113) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1114) else
11c606a6 (kx 2023-04-11 01:18:34 +0300 1115) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 1116) e = f + strlen( f );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1117)
11c606a6 (kx 2023-04-11 01:18:34 +0300 1118) (void)sprintf( e, ".pkgs.json" ); pkgs_fname = xstrdup( (const char *)&buf[0] );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1119) (void)sprintf( e, ".tree.json" ); tree_fname = xstrdup( (const char *)&buf[0] );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1120) (void)sprintf( e, ".tree.html" ); html_fname = xstrdup( (const char *)&buf[0] );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1121)
11c606a6 (kx 2023-04-11 01:18:34 +0300 1122) (void)sprintf( e, ".pkgs.min.json" ); pkgs_min_fname = xstrdup( (const char *)&buf[0] );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1123) (void)sprintf( e, ".tree.min.json" ); tree_min_fname = xstrdup( (const char *)&buf[0] );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1124) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1125)
11c606a6 (kx 2023-04-11 01:18:34 +0300 1126) if( minimize )
11c606a6 (kx 2023-04-11 01:18:34 +0300 1127) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 1128) json_pkgs_file = xstrdup( (const char *)basename( pkgs_min_fname ) );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1129) json_tree_file = xstrdup( (const char *)basename( tree_min_fname ) );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1130) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1131) else
11c606a6 (kx 2023-04-11 01:18:34 +0300 1132) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 1133) json_pkgs_file = xstrdup( (const char *)basename( pkgs_fname ) );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1134) json_tree_file = xstrdup( (const char *)basename( tree_fname ) );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1135) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1136)
11c606a6 (kx 2023-04-11 01:18:34 +0300 1137) free( buf );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1138) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1139)
11c606a6 (kx 2023-04-11 01:18:34 +0300 1140)
11c606a6 (kx 2023-04-11 01:18:34 +0300 1141) /*******************************************************************
11c606a6 (kx 2023-04-11 01:18:34 +0300 1142) find_pkg():
11c606a6 (kx 2023-04-11 01:18:34 +0300 1143) ----------
11c606a6 (kx 2023-04-11 01:18:34 +0300 1144) Returns package found in packages list coresponded to pkg.
11c606a6 (kx 2023-04-11 01:18:34 +0300 1145) */
11c606a6 (kx 2023-04-11 01:18:34 +0300 1146) static struct package *find_pkg( struct dlist *list, struct pkg *pkg )
11c606a6 (kx 2023-04-11 01:18:34 +0300 1147) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 1148) struct package *package = NULL;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1149) struct dlist *found = NULL;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1150)
11c606a6 (kx 2023-04-11 01:18:34 +0300 1151) if( !pkg ) return package;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1152)
11c606a6 (kx 2023-04-11 01:18:34 +0300 1153) found = dlist_find_data( list, __compare_provided, (const void *)pkg );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1154) if( found )
11c606a6 (kx 2023-04-11 01:18:34 +0300 1155) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 1156) return (struct package *)found->data;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1157) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1158)
11c606a6 (kx 2023-04-11 01:18:34 +0300 1159) return package;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1160) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1161)
11c606a6 (kx 2023-04-11 01:18:34 +0300 1162) /*******************************************************************
11c606a6 (kx 2023-04-11 01:18:34 +0300 1163) find_package():
11c606a6 (kx 2023-04-11 01:18:34 +0300 1164) --------------
11c606a6 (kx 2023-04-11 01:18:34 +0300 1165) Returns package found in packages list coresponded to package.
11c606a6 (kx 2023-04-11 01:18:34 +0300 1166) */
11c606a6 (kx 2023-04-11 01:18:34 +0300 1167) static struct package *find_package( struct dlist *list, struct package *pkg )
11c606a6 (kx 2023-04-11 01:18:34 +0300 1168) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 1169) struct package *package = NULL;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1170) struct dlist *found = NULL;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1171)
11c606a6 (kx 2023-04-11 01:18:34 +0300 1172) if( !pkg ) return package;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1173)
11c606a6 (kx 2023-04-11 01:18:34 +0300 1174) found = dlist_find_data( list, __compare_packages, (const void *)pkg );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1175) if( found )
11c606a6 (kx 2023-04-11 01:18:34 +0300 1176) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 1177) return (struct package *)found->data;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1178) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1179)
11c606a6 (kx 2023-04-11 01:18:34 +0300 1180) return package;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1181) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1182)
11c606a6 (kx 2023-04-11 01:18:34 +0300 1183) static void __print_package_data( FILE *output, struct package *package )
11c606a6 (kx 2023-04-11 01:18:34 +0300 1184) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 1185) if( !output || !package ) return;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1186)
11c606a6 (kx 2023-04-11 01:18:34 +0300 1187) /* "id": "net:bind-9.10.1", */
11c606a6 (kx 2023-04-11 01:18:34 +0300 1188) if( package->pkginfo->group ) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 1189) fprintf( output, " \"id\": \"%s:%s-%s\",\n", package->pkginfo->group,
11c606a6 (kx 2023-04-11 01:18:34 +0300 1190) package->pkginfo->name,
11c606a6 (kx 2023-04-11 01:18:34 +0300 1191) package->pkginfo->version );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1192) } else {
11c606a6 (kx 2023-04-11 01:18:34 +0300 1193) fprintf( output, " \"id\": \"%s-%s\",\n", package->pkginfo->name,
11c606a6 (kx 2023-04-11 01:18:34 +0300 1194) package->pkginfo->version );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1195) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1196) /* "name": "bind", */
11c606a6 (kx 2023-04-11 01:18:34 +0300 1197) fprintf( output, " \"name\": \"%s\",\n", package->pkginfo->name );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1198) /* "version": "9.10.1", */
11c606a6 (kx 2023-04-11 01:18:34 +0300 1199) fprintf( output, " \"version\": \"%s\",\n", package->pkginfo->version );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1200) /* "group": "net", */
11c606a6 (kx 2023-04-11 01:18:34 +0300 1201) if( package->pkginfo->group ) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 1202) fprintf( output, " \"group\": \"%s\",\n", package->pkginfo->group );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1203) } else {
11c606a6 (kx 2023-04-11 01:18:34 +0300 1204) fprintf( output, " \"group\": \"\",\n" );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1205) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1206) /* "arch": "omap543x-eglibc", */
11c606a6 (kx 2023-04-11 01:18:34 +0300 1207) fprintf( output, " \"arch\": \"%s\",\n", package->pkginfo->arch );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1208) /* "hardware": "omap5uevm", */
11c606a6 (kx 2023-04-11 01:18:34 +0300 1209) fprintf( output, " \"hardware\": \"%s\",\n", hardware );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1210) /* "license": "custom", */
11c606a6 (kx 2023-04-11 01:18:34 +0300 1211) fprintf( output, " \"license\": \"%s\",\n", package->pkginfo->license );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1212) /* "description": "bind 9.10.1 (DNS server and utilities)", */
11c606a6 (kx 2023-04-11 01:18:34 +0300 1213) fprintf( output, " \"description\": \"%s %s (%s)\",\n", package->pkginfo->name,
11c606a6 (kx 2023-04-11 01:18:34 +0300 1214) package->pkginfo->version,
11c606a6 (kx 2023-04-11 01:18:34 +0300 1215) package->pkginfo->short_description );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1216) /* "uncompressed_size": "17M", */
11c606a6 (kx 2023-04-11 01:18:34 +0300 1217) fprintf( output, " \"uncompressed_size\": \"" );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1218) if( package->pkginfo->uncompressed_size > 1048576 ) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 1219) fprintf( output, "%ldG\",\n", package->pkginfo->uncompressed_size / 1048576 );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1220) } else if( package->pkginfo->uncompressed_size > 1024 ) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 1221) fprintf( output, "%ldM\",\n", package->pkginfo->uncompressed_size / 1024 );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1222) } else {
11c606a6 (kx 2023-04-11 01:18:34 +0300 1223) fprintf( output, "%ldK\",\n", package->pkginfo->uncompressed_size );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1224) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1225) /* "total_files": "421" */
11c606a6 (kx 2023-04-11 01:18:34 +0300 1226) fprintf( output, " \"total_files\": \"%d\"\n", package->pkginfo->total_files );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1227) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1228)
11c606a6 (kx 2023-04-11 01:18:34 +0300 1229) static void __print_pkgs_node( void *data, void *user_data )
11c606a6 (kx 2023-04-11 01:18:34 +0300 1230) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 1231) struct package *package = (struct package *)data;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1232) struct _ctx *ctx = (struct _ctx *)user_data;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1233)
11c606a6 (kx 2023-04-11 01:18:34 +0300 1234) if( !package || !ctx ) return;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1235)
11c606a6 (kx 2023-04-11 01:18:34 +0300 1236) if( ctx->index != 0 )
11c606a6 (kx 2023-04-11 01:18:34 +0300 1237) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 1238) fprintf( ctx->output, " },\n {\n" );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1239) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1240) __print_package_data( ctx->output, package );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1241) ++ctx->index;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1242) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1243)
11c606a6 (kx 2023-04-11 01:18:34 +0300 1244) static void print_pkgs_json( FILE *output, struct dlist *list )
11c606a6 (kx 2023-04-11 01:18:34 +0300 1245) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 1246) struct _ctx ctx;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1247)
11c606a6 (kx 2023-04-11 01:18:34 +0300 1248) if( !output ) return;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1249)
11c606a6 (kx 2023-04-11 01:18:34 +0300 1250) bzero( (void *)&ctx, sizeof(struct _ctx) );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1251)
11c606a6 (kx 2023-04-11 01:18:34 +0300 1252) ctx.output = output;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1253) ctx.index = 0;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1254)
11c606a6 (kx 2023-04-11 01:18:34 +0300 1255) fprintf( output, "[{\n" );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1256)
11c606a6 (kx 2023-04-11 01:18:34 +0300 1257) dlist_foreach( list, __print_pkgs_node, (void *)&ctx );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1258)
11c606a6 (kx 2023-04-11 01:18:34 +0300 1259) fprintf( output, " }]\n" );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1260) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1261)
11c606a6 (kx 2023-04-11 01:18:34 +0300 1262) static void __remove_required_package( void *data, void *user_data )
11c606a6 (kx 2023-04-11 01:18:34 +0300 1263) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 1264) struct package *package = NULL;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1265) struct pkg *pkg = (struct pkg *)data;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1266)
11c606a6 (kx 2023-04-11 01:18:34 +0300 1267) if( pkg )
11c606a6 (kx 2023-04-11 01:18:34 +0300 1268) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 1269) package = find_pkg( tree, pkg );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1270) if( package )
11c606a6 (kx 2023-04-11 01:18:34 +0300 1271) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 1272) /*******************************************
11c606a6 (kx 2023-04-11 01:18:34 +0300 1273) if package reqired for some other package
11c606a6 (kx 2023-04-11 01:18:34 +0300 1274) we have to remove it from tree list:
11c606a6 (kx 2023-04-11 01:18:34 +0300 1275) */
11c606a6 (kx 2023-04-11 01:18:34 +0300 1276) tree = dlist_remove_data( tree, __compare_packages, NULL, (const void *)package );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1277) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1278) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1279) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1280)
11c606a6 (kx 2023-04-11 01:18:34 +0300 1281) static void __remove_required_packages( void *data, void *user_data )
11c606a6 (kx 2023-04-11 01:18:34 +0300 1282) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 1283) struct package *package = (struct package *)data;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1284) struct dlist *list = NULL;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1285)
11c606a6 (kx 2023-04-11 01:18:34 +0300 1286) if( !package ) return;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1287)
11c606a6 (kx 2023-04-11 01:18:34 +0300 1288) if( !(list = package->requires->list) ) return;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1289)
11c606a6 (kx 2023-04-11 01:18:34 +0300 1290) dlist_foreach( list, __remove_required_package, NULL );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1291) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1292)
11c606a6 (kx 2023-04-11 01:18:34 +0300 1293) static void remove_required_packages( struct dlist *list )
11c606a6 (kx 2023-04-11 01:18:34 +0300 1294) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 1295) dlist_foreach( list, __remove_required_packages, NULL );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1296) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1297)
11c606a6 (kx 2023-04-11 01:18:34 +0300 1298)
11c606a6 (kx 2023-04-11 01:18:34 +0300 1299) static void __check_pkg_requires( void *data, void *user_data )
11c606a6 (kx 2023-04-11 01:18:34 +0300 1300) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 1301) struct pkg *pkg = (struct pkg *)data;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1302) int *counter = (int *)user_data;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1303)
11c606a6 (kx 2023-04-11 01:18:34 +0300 1304) if( pkg )
11c606a6 (kx 2023-04-11 01:18:34 +0300 1305) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 1306) struct package *package = find_pkg( provides, pkg );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1307) if( package ) { ++(*counter); }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1308) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1309) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1310)
11c606a6 (kx 2023-04-11 01:18:34 +0300 1311) static int check_pkg_requires( struct dlist *list )
11c606a6 (kx 2023-04-11 01:18:34 +0300 1312) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 1313) int cnt = 0;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1314) dlist_foreach( list, __check_pkg_requires, (void *)&cnt );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1315) return cnt;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1316) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1317)
11c606a6 (kx 2023-04-11 01:18:34 +0300 1318)
11c606a6 (kx 2023-04-11 01:18:34 +0300 1319) /***************************************************************
11c606a6 (kx 2023-04-11 01:18:34 +0300 1320) Sort Requires Tree functions:
11c606a6 (kx 2023-04-11 01:18:34 +0300 1321) ----------------------------
11c606a6 (kx 2023-04-11 01:18:34 +0300 1322)
11c606a6 (kx 2023-04-11 01:18:34 +0300 1323) NOTE:
11c606a6 (kx 2023-04-11 01:18:34 +0300 1324) Requires sorted in reverse installation order according to
11c606a6 (kx 2023-04-11 01:18:34 +0300 1325) provides list.
11c606a6 (kx 2023-04-11 01:18:34 +0300 1326) */
11c606a6 (kx 2023-04-11 01:18:34 +0300 1327)
11c606a6 (kx 2023-04-11 01:18:34 +0300 1328) static int __install_pkg_index( struct dlist *list, struct pkg *pkg )
11c606a6 (kx 2023-04-11 01:18:34 +0300 1329) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 1330) int index = -1;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1331)
11c606a6 (kx 2023-04-11 01:18:34 +0300 1332) if( !pkg ) return index;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1333)
11c606a6 (kx 2023-04-11 01:18:34 +0300 1334) if( list )
11c606a6 (kx 2023-04-11 01:18:34 +0300 1335) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 1336) struct package *package = find_pkg( list, pkg );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1337)
11c606a6 (kx 2023-04-11 01:18:34 +0300 1338) index = dlist_index( list, package );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1339) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1340)
11c606a6 (kx 2023-04-11 01:18:34 +0300 1341) return index;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1342) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1343)
11c606a6 (kx 2023-04-11 01:18:34 +0300 1344) static int __install_package_index( struct dlist *list, struct package *package )
11c606a6 (kx 2023-04-11 01:18:34 +0300 1345) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 1346) int index = -1;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1347)
11c606a6 (kx 2023-04-11 01:18:34 +0300 1348) if( !package ) return index;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1349)
11c606a6 (kx 2023-04-11 01:18:34 +0300 1350) if( list )
11c606a6 (kx 2023-04-11 01:18:34 +0300 1351) index = dlist_index( list, package );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1352)
11c606a6 (kx 2023-04-11 01:18:34 +0300 1353) return index;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1354) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1355)
11c606a6 (kx 2023-04-11 01:18:34 +0300 1356) static int __compare_pkg_order( const void *a, const void *b )
11c606a6 (kx 2023-04-11 01:18:34 +0300 1357) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 1358) int ret = 0;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1359) int ia = -1, ib = -1;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1360)
11c606a6 (kx 2023-04-11 01:18:34 +0300 1361) ia = __install_pkg_index( provides, (struct pkg *)a );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1362) ib = __install_pkg_index( provides, (struct pkg *)b );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1363)
11c606a6 (kx 2023-04-11 01:18:34 +0300 1364) if( ia < ib ) ret = -1;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1365) if( ia > ib ) ret = 1;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1366)
11c606a6 (kx 2023-04-11 01:18:34 +0300 1367) return ret;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1368) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1369)
11c606a6 (kx 2023-04-11 01:18:34 +0300 1370) static int __compare_package_order( const void *a, const void *b )
11c606a6 (kx 2023-04-11 01:18:34 +0300 1371) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 1372) int ret = 0;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1373) int ia = -1, ib = -1;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1374)
11c606a6 (kx 2023-04-11 01:18:34 +0300 1375) ia = __install_package_index( provides, (struct package *)a );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1376) ib = __install_package_index( provides, (struct package *)b );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1377)
11c606a6 (kx 2023-04-11 01:18:34 +0300 1378) if( ia < ib ) ret = -1;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1379) if( ia > ib ) ret = 1;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1380)
11c606a6 (kx 2023-04-11 01:18:34 +0300 1381) return ret;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1382) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1383)
11c606a6 (kx 2023-04-11 01:18:34 +0300 1384) static void __sort_requires( void *data, void *user_data )
11c606a6 (kx 2023-04-11 01:18:34 +0300 1385) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 1386) struct package *package = (struct package *)data;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1387) struct dlist *reqs = NULL;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1388)
11c606a6 (kx 2023-04-11 01:18:34 +0300 1389) if( !package ) return;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1390)
11c606a6 (kx 2023-04-11 01:18:34 +0300 1391) if( (reqs = package->requires->list) && check_pkg_requires( reqs ) > 0 )
11c606a6 (kx 2023-04-11 01:18:34 +0300 1392) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 1393) package->requires->list = reqs = dlist_sort( reqs, __compare_pkg_order );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1394) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1395) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1396)
11c606a6 (kx 2023-04-11 01:18:34 +0300 1397) static struct dlist *sort_requires_tree( struct dlist *list )
11c606a6 (kx 2023-04-11 01:18:34 +0300 1398) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 1399) int lenght = 0;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1400)
11c606a6 (kx 2023-04-11 01:18:34 +0300 1401) if( !list ) return list;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1402)
11c606a6 (kx 2023-04-11 01:18:34 +0300 1403) lenght = dlist_length( list );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1404)
11c606a6 (kx 2023-04-11 01:18:34 +0300 1405) if( lenght > 1 )
11c606a6 (kx 2023-04-11 01:18:34 +0300 1406) list = dlist_sort( list, __compare_package_order );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1407)
11c606a6 (kx 2023-04-11 01:18:34 +0300 1408) return list;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1409) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1410)
11c606a6 (kx 2023-04-11 01:18:34 +0300 1411) static void sort_requires( struct dlist *list )
11c606a6 (kx 2023-04-11 01:18:34 +0300 1412) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 1413) int lenght = 0;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1414)
11c606a6 (kx 2023-04-11 01:18:34 +0300 1415) if( !list ) return;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1416)
11c606a6 (kx 2023-04-11 01:18:34 +0300 1417) dlist_foreach( list, __sort_requires, NULL );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1418) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1419) /*
11c606a6 (kx 2023-04-11 01:18:34 +0300 1420) End of Sort Requires Tree functions:
11c606a6 (kx 2023-04-11 01:18:34 +0300 1421) ***************************************************************/
11c606a6 (kx 2023-04-11 01:18:34 +0300 1422)
11c606a6 (kx 2023-04-11 01:18:34 +0300 1423) /***************************************************************
11c606a6 (kx 2023-04-11 01:18:34 +0300 1424) Binary Tree functions:
11c606a6 (kx 2023-04-11 01:18:34 +0300 1425) ---------------------
11c606a6 (kx 2023-04-11 01:18:34 +0300 1426) */
11c606a6 (kx 2023-04-11 01:18:34 +0300 1427) static struct dlist *pkgs = NULL;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1428) static struct btree *btree = NULL;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1429)
11c606a6 (kx 2023-04-11 01:18:34 +0300 1430) static struct pkg *duplicate_pkg( struct package *package )
11c606a6 (kx 2023-04-11 01:18:34 +0300 1431) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 1432) struct pkg *pkg = NULL;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1433)
11c606a6 (kx 2023-04-11 01:18:34 +0300 1434) if( !package ) return pkg;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1435)
11c606a6 (kx 2023-04-11 01:18:34 +0300 1436) pkg = pkg_alloc();
11c606a6 (kx 2023-04-11 01:18:34 +0300 1437) pkg->name = xstrdup( (const char *)package->pkginfo->name );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1438) pkg->group = xstrdup( (const char *)package->pkginfo->group );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1439) pkg->version = xstrdup( (const char *)package->pkginfo->version );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1440) pkg->procedure = package->procedure;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1441)
11c606a6 (kx 2023-04-11 01:18:34 +0300 1442) return pkg;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1443) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1444)
11c606a6 (kx 2023-04-11 01:18:34 +0300 1445) static void __fill_pkgs_list( void *data, void *user_data )
11c606a6 (kx 2023-04-11 01:18:34 +0300 1446) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 1447) struct package *package = (struct package *)data;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1448) struct pkg *pkg = NULL;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1449)
11c606a6 (kx 2023-04-11 01:18:34 +0300 1450) if( !package ) return;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1451)
11c606a6 (kx 2023-04-11 01:18:34 +0300 1452) pkg = duplicate_pkg( package );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1453) pkgs = dlist_append( pkgs, (void *)pkg );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1454) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1455)
11c606a6 (kx 2023-04-11 01:18:34 +0300 1456) /*******************************************
11c606a6 (kx 2023-04-11 01:18:34 +0300 1457) create_pkgs_list():
11c606a6 (kx 2023-04-11 01:18:34 +0300 1458) ------------------
11c606a6 (kx 2023-04-11 01:18:34 +0300 1459) Creates pkgs list from provides list.
11c606a6 (kx 2023-04-11 01:18:34 +0300 1460) */
11c606a6 (kx 2023-04-11 01:18:34 +0300 1461) static void create_pkgs_list( struct dlist *list )
11c606a6 (kx 2023-04-11 01:18:34 +0300 1462) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 1463) if( !list ) return;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1464)
11c606a6 (kx 2023-04-11 01:18:34 +0300 1465) dlist_foreach( list, __fill_pkgs_list, NULL );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1466) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1467)
11c606a6 (kx 2023-04-11 01:18:34 +0300 1468) static void free_pkgs_list()
11c606a6 (kx 2023-04-11 01:18:34 +0300 1469) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 1470) if( pkgs )
11c606a6 (kx 2023-04-11 01:18:34 +0300 1471) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 1472) dlist_free( pkgs, __pkg_free_func );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1473) pkgs = NULL;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1474) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1475) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1476)
11c606a6 (kx 2023-04-11 01:18:34 +0300 1477) static int __compare_pkg( const void *a, const void *b )
11c606a6 (kx 2023-04-11 01:18:34 +0300 1478) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 1479) int ret = -1;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1480)
11c606a6 (kx 2023-04-11 01:18:34 +0300 1481) struct pkg *pkg1 = (struct pkg *)a;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1482) struct pkg *pkg2 = (struct pkg *)b;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1483)
11c606a6 (kx 2023-04-11 01:18:34 +0300 1484) if( pkg1->group && pkg2->group )
11c606a6 (kx 2023-04-11 01:18:34 +0300 1485) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 1486) ret = strcmp( pkg1->group, pkg2->group );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1487) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1488) else if( !pkg1->group && !pkg2->group )
11c606a6 (kx 2023-04-11 01:18:34 +0300 1489) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 1490) ret = 0;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1491) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1492) else if( pkg1->group )
11c606a6 (kx 2023-04-11 01:18:34 +0300 1493) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 1494) ret = 1;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1495) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1496)
11c606a6 (kx 2023-04-11 01:18:34 +0300 1497) if( ! ret )
11c606a6 (kx 2023-04-11 01:18:34 +0300 1498) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 1499) return strcmp( pkg1->name, pkg2->name );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1500) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1501) return ret;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1502) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1503)
11c606a6 (kx 2023-04-11 01:18:34 +0300 1504) static struct pkg *__find_pkg( struct dlist *list, struct pkg *package )
11c606a6 (kx 2023-04-11 01:18:34 +0300 1505) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 1506) struct pkg *pkg = NULL;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1507) struct dlist *found = NULL;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1508)
11c606a6 (kx 2023-04-11 01:18:34 +0300 1509) if( !package ) return pkg;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1510)
11c606a6 (kx 2023-04-11 01:18:34 +0300 1511) found = dlist_find_data( list, __compare_pkg, (const void *)package );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1512) if( found )
11c606a6 (kx 2023-04-11 01:18:34 +0300 1513) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 1514) return (struct pkg *)found->data;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1515) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1516)
11c606a6 (kx 2023-04-11 01:18:34 +0300 1517) return pkg;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1518) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1519)
11c606a6 (kx 2023-04-11 01:18:34 +0300 1520) static int __compare_pkg_with_package( const void *a, const void *b )
11c606a6 (kx 2023-04-11 01:18:34 +0300 1521) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 1522) int ret = -1;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1523)
11c606a6 (kx 2023-04-11 01:18:34 +0300 1524) struct pkg *pkg1 = (struct pkg *)a;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1525) struct package *pkg2 = (struct package *)b;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1526)
11c606a6 (kx 2023-04-11 01:18:34 +0300 1527) if( pkg1->group && pkg2->pkginfo->group )
11c606a6 (kx 2023-04-11 01:18:34 +0300 1528) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 1529) ret = strcmp( pkg1->group, pkg2->pkginfo->group );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1530) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1531) else if( !pkg1->group && !pkg2->pkginfo->group )
11c606a6 (kx 2023-04-11 01:18:34 +0300 1532) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 1533) ret = 0;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1534) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1535) else if( pkg2->pkginfo->group )
11c606a6 (kx 2023-04-11 01:18:34 +0300 1536) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 1537) ret = 1;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1538) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1539)
11c606a6 (kx 2023-04-11 01:18:34 +0300 1540) if( ! ret )
11c606a6 (kx 2023-04-11 01:18:34 +0300 1541) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 1542) return strcmp( pkg1->name, pkg2->pkginfo->name );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1543) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1544) return ret;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1545) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1546)
11c606a6 (kx 2023-04-11 01:18:34 +0300 1547) static struct pkg *__find_pkg_by_package( struct dlist *list, struct package *package )
11c606a6 (kx 2023-04-11 01:18:34 +0300 1548) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 1549) struct pkg *pkg = NULL;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1550) struct dlist *found = NULL;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1551)
11c606a6 (kx 2023-04-11 01:18:34 +0300 1552) if( !package ) return pkg;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1553)
11c606a6 (kx 2023-04-11 01:18:34 +0300 1554) found = dlist_find_data( list, __compare_pkg_with_package, (const void *)package );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1555) if( found )
11c606a6 (kx 2023-04-11 01:18:34 +0300 1556) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 1557) return (struct pkg *)found->data;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1558) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1559)
11c606a6 (kx 2023-04-11 01:18:34 +0300 1560) return pkg;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1561) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1562)
11c606a6 (kx 2023-04-11 01:18:34 +0300 1563) static struct pkg *__find_pkg_by_pkg( struct dlist *list, struct pkg *package )
11c606a6 (kx 2023-04-11 01:18:34 +0300 1564) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 1565) struct pkg *pkg = NULL;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1566) struct dlist *found = NULL;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1567)
11c606a6 (kx 2023-04-11 01:18:34 +0300 1568) if( !package ) return pkg;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1569)
11c606a6 (kx 2023-04-11 01:18:34 +0300 1570) found = dlist_find_data( list, __compare_pkg, (const void *)package );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1571) if( found )
11c606a6 (kx 2023-04-11 01:18:34 +0300 1572) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 1573) return (struct pkg *)found->data;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1574) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1575)
11c606a6 (kx 2023-04-11 01:18:34 +0300 1576) return pkg;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1577) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1578)
11c606a6 (kx 2023-04-11 01:18:34 +0300 1579) static void __btree_add_requires( struct btree *tree );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1580)
11c606a6 (kx 2023-04-11 01:18:34 +0300 1581) static struct btree *__btree_add_left( void *data, void *user_data )
11c606a6 (kx 2023-04-11 01:18:34 +0300 1582) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 1583) struct btree *tree = (struct btree *)user_data;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1584) struct pkg *left = (struct pkg *)data;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1585) struct pkg *pkg = NULL;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1586) struct btree *node = NULL;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1587)
11c606a6 (kx 2023-04-11 01:18:34 +0300 1588) if( !tree || !left ) return node;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1589)
11c606a6 (kx 2023-04-11 01:18:34 +0300 1590) pkg = __find_pkg_by_pkg( pkgs, left );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1591)
11c606a6 (kx 2023-04-11 01:18:34 +0300 1592) node = btree_insert_left( tree, __btree_alloc( (void *)pkg ) );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1593) __btree_add_requires( node );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1594)
11c606a6 (kx 2023-04-11 01:18:34 +0300 1595) return node;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1596) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1597)
11c606a6 (kx 2023-04-11 01:18:34 +0300 1598) static void __btree_add_right( void *data, void *user_data )
11c606a6 (kx 2023-04-11 01:18:34 +0300 1599) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 1600) struct btree *tree = *((struct btree **)user_data);
11c606a6 (kx 2023-04-11 01:18:34 +0300 1601) struct pkg *right = (struct pkg *)data;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1602) struct pkg *pkg = NULL;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1603) struct btree *node = NULL;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1604)
11c606a6 (kx 2023-04-11 01:18:34 +0300 1605) if( !tree || !right ) return;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1606)
11c606a6 (kx 2023-04-11 01:18:34 +0300 1607) pkg = __find_pkg_by_pkg( pkgs, right );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1608)
11c606a6 (kx 2023-04-11 01:18:34 +0300 1609) node = btree_insert_right( tree, __btree_alloc( (void *)pkg ) );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1610) __btree_add_requires( node );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1611)
11c606a6 (kx 2023-04-11 01:18:34 +0300 1612) *((struct btree **)user_data) = node;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1613) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1614)
11c606a6 (kx 2023-04-11 01:18:34 +0300 1615) static void __btree_add_requires( struct btree *tree )
11c606a6 (kx 2023-04-11 01:18:34 +0300 1616) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 1617) struct package *package = NULL;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1618)
11c606a6 (kx 2023-04-11 01:18:34 +0300 1619) if( !tree ) return;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1620)
11c606a6 (kx 2023-04-11 01:18:34 +0300 1621) package = find_pkg( provides, (struct pkg *)tree->data );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1622) if( package )
11c606a6 (kx 2023-04-11 01:18:34 +0300 1623) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 1624) struct dlist *list = NULL;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1625)
11c606a6 (kx 2023-04-11 01:18:34 +0300 1626) if( (list = package->requires->list) )
11c606a6 (kx 2023-04-11 01:18:34 +0300 1627) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 1628) struct pkg *pkg = NULL;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1629) struct btree *node = NULL;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1630)
11c606a6 (kx 2023-04-11 01:18:34 +0300 1631) pkg = __find_pkg_by_pkg( pkgs, (struct pkg *)list->data );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1632)
11c606a6 (kx 2023-04-11 01:18:34 +0300 1633) node = __btree_add_left( (void *)pkg, (void *)tree );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1634)
11c606a6 (kx 2023-04-11 01:18:34 +0300 1635) if( dlist_length( list ) > 1 )
11c606a6 (kx 2023-04-11 01:18:34 +0300 1636) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 1637) dlist_foreach( list->next, __btree_add_right, (void *)&node );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1638) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1639) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1640) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1641) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1642)
11c606a6 (kx 2023-04-11 01:18:34 +0300 1643) static void __fill_btree( void *data, void *user_data )
11c606a6 (kx 2023-04-11 01:18:34 +0300 1644) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 1645) struct btree *tree = *((struct btree **)user_data);
11c606a6 (kx 2023-04-11 01:18:34 +0300 1646) struct package *package = (struct package *)data;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1647) struct pkg *pkg = NULL;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1648) struct btree *node = NULL;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1649)
11c606a6 (kx 2023-04-11 01:18:34 +0300 1650) if( !tree || !package ) return;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1651)
11c606a6 (kx 2023-04-11 01:18:34 +0300 1652) pkg = __find_pkg_by_package( pkgs, package );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1653)
11c606a6 (kx 2023-04-11 01:18:34 +0300 1654) node = btree_insert_right( tree, __btree_alloc( (void *)pkg ) );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1655) __btree_add_requires( node );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1656)
11c606a6 (kx 2023-04-11 01:18:34 +0300 1657) *((struct btree **)user_data) = node;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1658) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1659)
11c606a6 (kx 2023-04-11 01:18:34 +0300 1660) /*******************************************************************
11c606a6 (kx 2023-04-11 01:18:34 +0300 1661) __print_btree_pkg():
11c606a6 (kx 2023-04-11 01:18:34 +0300 1662) -------------------
11c606a6 (kx 2023-04-11 01:18:34 +0300 1663) Print out package "group/name-version". Used for debuging only.
11c606a6 (kx 2023-04-11 01:18:34 +0300 1664) */
11c606a6 (kx 2023-04-11 01:18:34 +0300 1665) static void __print_btree_pkg( void *data, void *user_data )
11c606a6 (kx 2023-04-11 01:18:34 +0300 1666) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 1667) struct pkg *pkg = (struct pkg *)data;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1668)
11c606a6 (kx 2023-04-11 01:18:34 +0300 1669) if( !pkg ) return;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1670)
11c606a6 (kx 2023-04-11 01:18:34 +0300 1671) fprintf( stdout, "%s/%s-%s\n", pkg->group, pkg->name, pkg->version );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1672) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1673)
11c606a6 (kx 2023-04-11 01:18:34 +0300 1674) /*****************************************************************
11c606a6 (kx 2023-04-11 01:18:34 +0300 1675) __print_btree_node():
11c606a6 (kx 2023-04-11 01:18:34 +0300 1676) --------------------
11c606a6 (kx 2023-04-11 01:18:34 +0300 1677) Print out package in JSON format. Used by btree_print_json().
11c606a6 (kx 2023-04-11 01:18:34 +0300 1678) */
11c606a6 (kx 2023-04-11 01:18:34 +0300 1679) static void __print_btree_node( void *data, void *user_data )
11c606a6 (kx 2023-04-11 01:18:34 +0300 1680) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 1681) struct pkg *pkg = (struct pkg *)data;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1682) struct _bctx *ctx = (struct _bctx *)user_data;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1683)
11c606a6 (kx 2023-04-11 01:18:34 +0300 1684) char *p, buf[PATH_MAX*2];
11c606a6 (kx 2023-04-11 01:18:34 +0300 1685) int depth = 0, max_depth = PATH_MAX + PATH_MAX / 2;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1686)
11c606a6 (kx 2023-04-11 01:18:34 +0300 1687) if( !pkg || !ctx ) return;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1688)
11c606a6 (kx 2023-04-11 01:18:34 +0300 1689) buf[0] = ' ';
11c606a6 (kx 2023-04-11 01:18:34 +0300 1690) buf[1] = '\0';
11c606a6 (kx 2023-04-11 01:18:34 +0300 1691)
11c606a6 (kx 2023-04-11 01:18:34 +0300 1692) p = (char *)&buf[1];
11c606a6 (kx 2023-04-11 01:18:34 +0300 1693) depth = ctx->indent;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1694)
11c606a6 (kx 2023-04-11 01:18:34 +0300 1695) if( depth < 1 ) depth = 0;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1696) if( depth > max_depth ) depth = max_depth;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1697)
11c606a6 (kx 2023-04-11 01:18:34 +0300 1698) while( depth )
11c606a6 (kx 2023-04-11 01:18:34 +0300 1699) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 1700) (void)sprintf( p, " " ); --depth; ++p; *p = '\0';
11c606a6 (kx 2023-04-11 01:18:34 +0300 1701) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1702)
11c606a6 (kx 2023-04-11 01:18:34 +0300 1703) if( pkg->group )
11c606a6 (kx 2023-04-11 01:18:34 +0300 1704) (void)sprintf( p, "\"name\": \"%s:%s-%s\"", pkg->group,
11c606a6 (kx 2023-04-11 01:18:34 +0300 1705) pkg->name,
11c606a6 (kx 2023-04-11 01:18:34 +0300 1706) pkg->version );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1707) else
11c606a6 (kx 2023-04-11 01:18:34 +0300 1708) (void)sprintf( p, "\"name\": \"%s-%s\"", pkg->name,
11c606a6 (kx 2023-04-11 01:18:34 +0300 1709) pkg->version );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1710)
11c606a6 (kx 2023-04-11 01:18:34 +0300 1711) fprintf( ctx->output, (char *)&buf[0] );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1712) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1713)
11c606a6 (kx 2023-04-11 01:18:34 +0300 1714) static int __width_factor( int width )
11c606a6 (kx 2023-04-11 01:18:34 +0300 1715) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 1716) double w, x = (double)width;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1717)
11c606a6 (kx 2023-04-11 01:18:34 +0300 1718) if( width < 2 ) return 48;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1719)
11c606a6 (kx 2023-04-11 01:18:34 +0300 1720) if( width > 1 && width < 150 )
11c606a6 (kx 2023-04-11 01:18:34 +0300 1721) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 1722) w = floor( (38.399 - 7.4262 * log( x )) + 8.0 );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1723)
11c606a6 (kx 2023-04-11 01:18:34 +0300 1724) return (int)w;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1725) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1726) else
11c606a6 (kx 2023-04-11 01:18:34 +0300 1727) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 1728) return 8;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1729) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1730) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1731)
11c606a6 (kx 2023-04-11 01:18:34 +0300 1732) /*******************************************************************
11c606a6 (kx 2023-04-11 01:18:34 +0300 1733) __print_btree_header():
11c606a6 (kx 2023-04-11 01:18:34 +0300 1734) ----------------------
11c606a6 (kx 2023-04-11 01:18:34 +0300 1735) Print out Binary Tree Header.
11c606a6 (kx 2023-04-11 01:18:34 +0300 1736) */
11c606a6 (kx 2023-04-11 01:18:34 +0300 1737) static void __print_btree_header( FILE *fp, struct btree *btree, struct dlist *tree )
11c606a6 (kx 2023-04-11 01:18:34 +0300 1738) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 1739) struct package *package = NULL;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1740)
11c606a6 (kx 2023-04-11 01:18:34 +0300 1741) if( !fp || !btree || !tree ) return;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1742)
11c606a6 (kx 2023-04-11 01:18:34 +0300 1743) package = find_pkg( provides, (struct pkg *)btree->data );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1744)
11c606a6 (kx 2023-04-11 01:18:34 +0300 1745) if( package )
11c606a6 (kx 2023-04-11 01:18:34 +0300 1746) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 1747) char *buf = NULL;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1748)
11c606a6 (kx 2023-04-11 01:18:34 +0300 1749) if( dlist_length( tree ) > 1 )
11c606a6 (kx 2023-04-11 01:18:34 +0300 1750) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 1751) buf = (char *)malloc( (size_t)PATH_MAX );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1752) if( !buf ) { FATAL_ERROR( "Cannot allocate memory" ); }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1753) bzero( (void *)buf, PATH_MAX );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1754)
11c606a6 (kx 2023-04-11 01:18:34 +0300 1755) (void)sprintf( &buf[0], "%s", htmlroot );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1756) root = xstrdup( (const char *)&buf[0] );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1757) (void)sprintf( &buf[0], "%s", package->pkginfo->url );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1758) bug_url = xstrdup( (const char *)&buf[0] );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1759) free( buf );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1760) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1761) else
11c606a6 (kx 2023-04-11 01:18:34 +0300 1762) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 1763) buf = (char *)malloc( (size_t)PATH_MAX );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1764) if( !buf ) { FATAL_ERROR( "Cannot allocate memory" ); }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1765) bzero( (void *)buf, PATH_MAX );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1766)
11c606a6 (kx 2023-04-11 01:18:34 +0300 1767) if( package->pkginfo->group )
11c606a6 (kx 2023-04-11 01:18:34 +0300 1768) (void)sprintf( &buf[0], "%s/%s-%s", package->pkginfo->group,
11c606a6 (kx 2023-04-11 01:18:34 +0300 1769) package->pkginfo->name,
11c606a6 (kx 2023-04-11 01:18:34 +0300 1770) package->pkginfo->version );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1771) else
11c606a6 (kx 2023-04-11 01:18:34 +0300 1772) (void)sprintf( &buf[0], "%s-%s", package->pkginfo->name,
11c606a6 (kx 2023-04-11 01:18:34 +0300 1773) package->pkginfo->version );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1774)
11c606a6 (kx 2023-04-11 01:18:34 +0300 1775) root = xstrdup( (const char *)&buf[0] );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1776) (void)sprintf( &buf[0], "%s", package->pkginfo->url );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1777) bug_url = xstrdup( (const char *)&buf[0] );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1778) free( buf );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1779) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1780)
11c606a6 (kx 2023-04-11 01:18:34 +0300 1781) fprintf( fp, " \"distro\": [ \"%s\", \"%s\", \"%s\" ],\n",
11c606a6 (kx 2023-04-11 01:18:34 +0300 1782) package->pkginfo->distro_name,
11c606a6 (kx 2023-04-11 01:18:34 +0300 1783) package->pkginfo->distro_version,
11c606a6 (kx 2023-04-11 01:18:34 +0300 1784) package->pkginfo->url );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1785) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1786) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1787)
11c606a6 (kx 2023-04-11 01:18:34 +0300 1788)
11c606a6 (kx 2023-04-11 01:18:34 +0300 1789) /***************************************
11c606a6 (kx 2023-04-11 01:18:34 +0300 1790) create_btree():
11c606a6 (kx 2023-04-11 01:18:34 +0300 1791) --------------
11c606a6 (kx 2023-04-11 01:18:34 +0300 1792) Creates btree from tree list (DAG).
11c606a6 (kx 2023-04-11 01:18:34 +0300 1793) */
11c606a6 (kx 2023-04-11 01:18:34 +0300 1794) static void create_btree( struct dlist *dag, struct dlist *install )
11c606a6 (kx 2023-04-11 01:18:34 +0300 1795) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 1796) struct pkg *pkg = NULL;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1797) struct package *package = NULL;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1798) struct dlist *list = NULL;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1799) struct btree *node = NULL;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1800)
11c606a6 (kx 2023-04-11 01:18:34 +0300 1801) if( !dag || !install ) return;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1802)
11c606a6 (kx 2023-04-11 01:18:34 +0300 1803) /* first package: */
11c606a6 (kx 2023-04-11 01:18:34 +0300 1804) package = (struct package *)dag->data;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1805) pkg = __find_pkg_by_package( pkgs, package );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1806)
11c606a6 (kx 2023-04-11 01:18:34 +0300 1807) node = btree = __btree_alloc( (void *)pkg );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1808)
11c606a6 (kx 2023-04-11 01:18:34 +0300 1809) __btree_add_requires( node );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1810)
11c606a6 (kx 2023-04-11 01:18:34 +0300 1811) if( dlist_length( dag ) > 1 )
11c606a6 (kx 2023-04-11 01:18:34 +0300 1812) dlist_foreach( dag->next, __fill_btree, (void *)&node );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1813)
11c606a6 (kx 2023-04-11 01:18:34 +0300 1814) btree_reduce( btree, __compare_pkg, NULL );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1815) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1816) /*
11c606a6 (kx 2023-04-11 01:18:34 +0300 1817) End of Binary Tree functions:
11c606a6 (kx 2023-04-11 01:18:34 +0300 1818) ***************************************************************/
11c606a6 (kx 2023-04-11 01:18:34 +0300 1819)
11c606a6 (kx 2023-04-11 01:18:34 +0300 1820)
11c606a6 (kx 2023-04-11 01:18:34 +0300 1821) /***************************************************************
11c606a6 (kx 2023-04-11 01:18:34 +0300 1822) Print json format of DAG functions:
11c606a6 (kx 2023-04-11 01:18:34 +0300 1823) */
11c606a6 (kx 2023-04-11 01:18:34 +0300 1824) static void __print_pkg_tree( struct _ctx *ctx, struct dlist *list )
11c606a6 (kx 2023-04-11 01:18:34 +0300 1825) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 1826) struct dlist *next = NULL;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1827)
11c606a6 (kx 2023-04-11 01:18:34 +0300 1828) if( !ctx || !list ) return;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1829)
11c606a6 (kx 2023-04-11 01:18:34 +0300 1830) ctx->depth += 2;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1831) svg_width = max( svg_width, ctx->depth );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1832)
11c606a6 (kx 2023-04-11 01:18:34 +0300 1833) while( list )
11c606a6 (kx 2023-04-11 01:18:34 +0300 1834) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 1835) next = dlist_next( list );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1836) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 1837) struct pkg *pkg = (struct pkg *)list->data;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1838) struct package *package = find_pkg( provides, pkg );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1839)
11c606a6 (kx 2023-04-11 01:18:34 +0300 1840) if( package )
11c606a6 (kx 2023-04-11 01:18:34 +0300 1841) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 1842) char *p, *buf = NULL;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1843) int depth = 0;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1844)
11c606a6 (kx 2023-04-11 01:18:34 +0300 1845) struct dlist *reqs = NULL;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1846)
11c606a6 (kx 2023-04-11 01:18:34 +0300 1847) buf = (char *)malloc( (size_t)PATH_MAX );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1848) if( !buf ) { FATAL_ERROR( "Cannot allocate memory" ); }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1849) bzero( (void *)buf, PATH_MAX );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1850)
11c606a6 (kx 2023-04-11 01:18:34 +0300 1851) buf[0] = ' ';
11c606a6 (kx 2023-04-11 01:18:34 +0300 1852) buf[1] = '\0';
11c606a6 (kx 2023-04-11 01:18:34 +0300 1853)
11c606a6 (kx 2023-04-11 01:18:34 +0300 1854) p = (char *)&buf[1];
11c606a6 (kx 2023-04-11 01:18:34 +0300 1855) depth = ctx->depth;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1856)
11c606a6 (kx 2023-04-11 01:18:34 +0300 1857) while( depth ) { (void)sprintf( p, " " ); --depth; ++p; *p = '\0'; }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1858)
11c606a6 (kx 2023-04-11 01:18:34 +0300 1859) (void)sprintf( p - 1, "{\n" );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1860) fprintf( ctx->output, (char *)&buf[0] );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1861) *(p - 1) = ' '; *p = '\0';
11c606a6 (kx 2023-04-11 01:18:34 +0300 1862)
11c606a6 (kx 2023-04-11 01:18:34 +0300 1863) if( pkg->group )
11c606a6 (kx 2023-04-11 01:18:34 +0300 1864) (void)sprintf( p, "\"name\": \"%s:%s-%s\"", pkg->group,
11c606a6 (kx 2023-04-11 01:18:34 +0300 1865) pkg->name,
11c606a6 (kx 2023-04-11 01:18:34 +0300 1866) pkg->version );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1867) else
11c606a6 (kx 2023-04-11 01:18:34 +0300 1868) (void)sprintf( p, "\"name\": \"%s-%s\"", pkg->name,
11c606a6 (kx 2023-04-11 01:18:34 +0300 1869) pkg->version );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1870)
11c606a6 (kx 2023-04-11 01:18:34 +0300 1871) fprintf( ctx->output, (char *)&buf[0] );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1872)
11c606a6 (kx 2023-04-11 01:18:34 +0300 1873) if( (reqs = package->requires->list) && check_pkg_requires( reqs ) > 0 )
11c606a6 (kx 2023-04-11 01:18:34 +0300 1874) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 1875) fprintf( ctx->output, ",\n" );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1876)
11c606a6 (kx 2023-04-11 01:18:34 +0300 1877) (void)sprintf( p, "\"children\": [\n" );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1878) fprintf( ctx->output, (char *)&buf[0] );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1879)
11c606a6 (kx 2023-04-11 01:18:34 +0300 1880) __print_pkg_tree( ctx, reqs );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1881)
11c606a6 (kx 2023-04-11 01:18:34 +0300 1882) (void)sprintf( p, "]\n" );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1883) fprintf( ctx->output, (char *)&buf[0] );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1884) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1885) else
11c606a6 (kx 2023-04-11 01:18:34 +0300 1886) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 1887) fprintf( ctx->output, "\n" );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1888) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1889)
11c606a6 (kx 2023-04-11 01:18:34 +0300 1890) (void)sprintf( p - 1, "}" );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1891) fprintf( ctx->output, (char *)&buf[0] );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1892) *(p - 1) = ' '; *p = '\0';
11c606a6 (kx 2023-04-11 01:18:34 +0300 1893)
11c606a6 (kx 2023-04-11 01:18:34 +0300 1894) if( next ) { fprintf( ctx->output, ",\n" ); }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1895) else { fprintf( ctx->output, "\n" ); }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1896)
11c606a6 (kx 2023-04-11 01:18:34 +0300 1897) free( buf );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1898) } /* End if( package ) */
11c606a6 (kx 2023-04-11 01:18:34 +0300 1899) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1900) list = next;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1901) } /* End of while( list ) */
11c606a6 (kx 2023-04-11 01:18:34 +0300 1902)
11c606a6 (kx 2023-04-11 01:18:34 +0300 1903) ctx->depth -= 2;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1904) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1905)
11c606a6 (kx 2023-04-11 01:18:34 +0300 1906) static void __print_package_node( struct _ctx *ctx, struct package *package )
11c606a6 (kx 2023-04-11 01:18:34 +0300 1907) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 1908) char *p, *buf = NULL;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1909) int depth = 0;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1910)
11c606a6 (kx 2023-04-11 01:18:34 +0300 1911) struct dlist *list = NULL;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1912)
11c606a6 (kx 2023-04-11 01:18:34 +0300 1913) if( !package || !ctx ) return;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1914)
11c606a6 (kx 2023-04-11 01:18:34 +0300 1915) buf = (char *)malloc( (size_t)PATH_MAX );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1916) if( !buf ) { FATAL_ERROR( "Cannot allocate memory" ); }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1917) bzero( (void *)buf, PATH_MAX );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1918)
11c606a6 (kx 2023-04-11 01:18:34 +0300 1919) buf[0] = ' ';
11c606a6 (kx 2023-04-11 01:18:34 +0300 1920) buf[1] = '\0';
11c606a6 (kx 2023-04-11 01:18:34 +0300 1921)
11c606a6 (kx 2023-04-11 01:18:34 +0300 1922) p = (char *)&buf[1];
11c606a6 (kx 2023-04-11 01:18:34 +0300 1923) depth = ctx->depth;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1924)
11c606a6 (kx 2023-04-11 01:18:34 +0300 1925) while( depth ) { (void)sprintf( p, " " ); --depth; ++p; *p = '\0'; }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1926)
11c606a6 (kx 2023-04-11 01:18:34 +0300 1927) (void)sprintf( p - 1, "{\n" );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1928) fprintf( ctx->output, (char *)&buf[0] );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1929) *(p - 1) = ' '; *p = '\0';
11c606a6 (kx 2023-04-11 01:18:34 +0300 1930)
11c606a6 (kx 2023-04-11 01:18:34 +0300 1931) if( package->pkginfo->group )
11c606a6 (kx 2023-04-11 01:18:34 +0300 1932) (void)sprintf( p, "\"name\": \"%s:%s-%s\"", package->pkginfo->group,
11c606a6 (kx 2023-04-11 01:18:34 +0300 1933) package->pkginfo->name,
11c606a6 (kx 2023-04-11 01:18:34 +0300 1934) package->pkginfo->version );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1935) else
11c606a6 (kx 2023-04-11 01:18:34 +0300 1936) (void)sprintf( p, "\"name\": \"%s-%s\"", package->pkginfo->name,
11c606a6 (kx 2023-04-11 01:18:34 +0300 1937) package->pkginfo->version );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1938)
11c606a6 (kx 2023-04-11 01:18:34 +0300 1939) fprintf( ctx->output, (char *)&buf[0] );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1940)
11c606a6 (kx 2023-04-11 01:18:34 +0300 1941) if( (list = package->requires->list) && check_pkg_requires( list ) > 0 )
11c606a6 (kx 2023-04-11 01:18:34 +0300 1942) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 1943) fprintf( ctx->output, ",\n" );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1944)
11c606a6 (kx 2023-04-11 01:18:34 +0300 1945) (void)sprintf( p, "\"children\": [\n" );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1946) fprintf( ctx->output, (char *)&buf[0] );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1947)
11c606a6 (kx 2023-04-11 01:18:34 +0300 1948) __print_pkg_tree( ctx, list );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1949)
11c606a6 (kx 2023-04-11 01:18:34 +0300 1950) (void)sprintf( p, "]\n" );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1951) fprintf( ctx->output, (char *)&buf[0] );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1952) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1953) else
11c606a6 (kx 2023-04-11 01:18:34 +0300 1954) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 1955) fprintf( ctx->output, "\n" );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1956) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1957)
11c606a6 (kx 2023-04-11 01:18:34 +0300 1958) (void)sprintf( p - 1, "}" );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1959) fprintf( ctx->output, (char *)&buf[0] );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1960) *(p - 1) = ' '; *p = '\0';
11c606a6 (kx 2023-04-11 01:18:34 +0300 1961)
11c606a6 (kx 2023-04-11 01:18:34 +0300 1962) free( buf );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1963) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1964)
11c606a6 (kx 2023-04-11 01:18:34 +0300 1965) static void __print_tree_node( void *data, void *user_data )
11c606a6 (kx 2023-04-11 01:18:34 +0300 1966) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 1967) struct package *package = (struct package *)data;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1968) struct _ctx *ctx = (struct _ctx *)user_data;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1969)
11c606a6 (kx 2023-04-11 01:18:34 +0300 1970) if( !package || !ctx ) return;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1971)
11c606a6 (kx 2023-04-11 01:18:34 +0300 1972) if( ctx->size > 1 )
11c606a6 (kx 2023-04-11 01:18:34 +0300 1973) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 1974) if( ctx->index == 0 )
11c606a6 (kx 2023-04-11 01:18:34 +0300 1975) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 1976) char *buf = NULL;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1977)
11c606a6 (kx 2023-04-11 01:18:34 +0300 1978) buf = (char *)malloc( (size_t)PATH_MAX );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1979) if( !buf ) { FATAL_ERROR( "Cannot allocate memory" ); }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1980) bzero( (void *)buf, PATH_MAX );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1981)
11c606a6 (kx 2023-04-11 01:18:34 +0300 1982) (void)sprintf( &buf[0], "%s", htmlroot );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1983) root = xstrdup( (const char *)&buf[0] );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1984) (void)sprintf( &buf[0], "%s", package->pkginfo->url );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1985) bug_url = xstrdup( (const char *)&buf[0] );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1986) free( buf );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1987)
11c606a6 (kx 2023-04-11 01:18:34 +0300 1988) fprintf( ctx->output, " \"distro\": [ \"%s\", \"%s\", \"%s\" ],\n",
11c606a6 (kx 2023-04-11 01:18:34 +0300 1989) package->pkginfo->distro_name,
11c606a6 (kx 2023-04-11 01:18:34 +0300 1990) package->pkginfo->distro_version,
11c606a6 (kx 2023-04-11 01:18:34 +0300 1991) package->pkginfo->url );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1992) fprintf( ctx->output, " \"name\": \"%s\",\n", htmlroot );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1993) fprintf( ctx->output, " \"children\": [\n" );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1994) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 1995)
11c606a6 (kx 2023-04-11 01:18:34 +0300 1996)
11c606a6 (kx 2023-04-11 01:18:34 +0300 1997) __print_package_node( ctx, package );
11c606a6 (kx 2023-04-11 01:18:34 +0300 1998) svg_height += 2;
11c606a6 (kx 2023-04-11 01:18:34 +0300 1999)
11c606a6 (kx 2023-04-11 01:18:34 +0300 2000)
11c606a6 (kx 2023-04-11 01:18:34 +0300 2001) if( ctx->index < ctx->size - 1 ) fprintf( ctx->output, "," );
11c606a6 (kx 2023-04-11 01:18:34 +0300 2002) else fprintf( ctx->output, "\n ]" );
11c606a6 (kx 2023-04-11 01:18:34 +0300 2003)
11c606a6 (kx 2023-04-11 01:18:34 +0300 2004) fprintf( ctx->output, "\n" );
11c606a6 (kx 2023-04-11 01:18:34 +0300 2005) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 2006) else
11c606a6 (kx 2023-04-11 01:18:34 +0300 2007) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 2008) struct dlist *reqs = NULL;
11c606a6 (kx 2023-04-11 01:18:34 +0300 2009) char *buf = NULL;
11c606a6 (kx 2023-04-11 01:18:34 +0300 2010)
11c606a6 (kx 2023-04-11 01:18:34 +0300 2011) buf = (char *)malloc( (size_t)PATH_MAX );
11c606a6 (kx 2023-04-11 01:18:34 +0300 2012) if( !buf ) { FATAL_ERROR( "Cannot allocate memory" ); }
11c606a6 (kx 2023-04-11 01:18:34 +0300 2013) bzero( (void *)buf, PATH_MAX );
11c606a6 (kx 2023-04-11 01:18:34 +0300 2014)
11c606a6 (kx 2023-04-11 01:18:34 +0300 2015) if( package->pkginfo->group )
11c606a6 (kx 2023-04-11 01:18:34 +0300 2016) (void)sprintf( &buf[0], "%s/%s-%s", package->pkginfo->group,
11c606a6 (kx 2023-04-11 01:18:34 +0300 2017) package->pkginfo->name,
11c606a6 (kx 2023-04-11 01:18:34 +0300 2018) package->pkginfo->version );
11c606a6 (kx 2023-04-11 01:18:34 +0300 2019) else
11c606a6 (kx 2023-04-11 01:18:34 +0300 2020) (void)sprintf( &buf[0], "%s-%s", package->pkginfo->name,
11c606a6 (kx 2023-04-11 01:18:34 +0300 2021) package->pkginfo->version );
11c606a6 (kx 2023-04-11 01:18:34 +0300 2022)
11c606a6 (kx 2023-04-11 01:18:34 +0300 2023) root = xstrdup( (const char *)&buf[0] );
11c606a6 (kx 2023-04-11 01:18:34 +0300 2024) (void)sprintf( &buf[0], "%s", package->pkginfo->url );
11c606a6 (kx 2023-04-11 01:18:34 +0300 2025) bug_url = xstrdup( (const char *)&buf[0] );
11c606a6 (kx 2023-04-11 01:18:34 +0300 2026) free( buf );
11c606a6 (kx 2023-04-11 01:18:34 +0300 2027)
11c606a6 (kx 2023-04-11 01:18:34 +0300 2028) fprintf( ctx->output, " \"distro\": [ \"%s\", \"%s\", \"%s\" ],\n",
11c606a6 (kx 2023-04-11 01:18:34 +0300 2029) package->pkginfo->distro_name,
11c606a6 (kx 2023-04-11 01:18:34 +0300 2030) package->pkginfo->distro_version,
11c606a6 (kx 2023-04-11 01:18:34 +0300 2031) package->pkginfo->url );
11c606a6 (kx 2023-04-11 01:18:34 +0300 2032) if( package->pkginfo->group )
11c606a6 (kx 2023-04-11 01:18:34 +0300 2033) fprintf( ctx->output, " \"name\": \"%s:%s-%s\"", package->pkginfo->group,
11c606a6 (kx 2023-04-11 01:18:34 +0300 2034) package->pkginfo->name,
11c606a6 (kx 2023-04-11 01:18:34 +0300 2035) package->pkginfo->version );
11c606a6 (kx 2023-04-11 01:18:34 +0300 2036) else
11c606a6 (kx 2023-04-11 01:18:34 +0300 2037) fprintf( ctx->output, " \"name\": \"%s-%s\"", package->pkginfo->name,
11c606a6 (kx 2023-04-11 01:18:34 +0300 2038) package->pkginfo->version );
11c606a6 (kx 2023-04-11 01:18:34 +0300 2039)
11c606a6 (kx 2023-04-11 01:18:34 +0300 2040)
11c606a6 (kx 2023-04-11 01:18:34 +0300 2041) svg_height += 2;
11c606a6 (kx 2023-04-11 01:18:34 +0300 2042) ctx->depth -=2;
11c606a6 (kx 2023-04-11 01:18:34 +0300 2043)
11c606a6 (kx 2023-04-11 01:18:34 +0300 2044) if( (reqs = package->requires->list) && check_pkg_requires( reqs ) > 0 )
11c606a6 (kx 2023-04-11 01:18:34 +0300 2045) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 2046) fprintf( ctx->output, ",\n" );
11c606a6 (kx 2023-04-11 01:18:34 +0300 2047)
11c606a6 (kx 2023-04-11 01:18:34 +0300 2048) fprintf( ctx->output, " \"children\": [\n" );
11c606a6 (kx 2023-04-11 01:18:34 +0300 2049)
11c606a6 (kx 2023-04-11 01:18:34 +0300 2050) __print_pkg_tree( ctx, reqs );
11c606a6 (kx 2023-04-11 01:18:34 +0300 2051)
11c606a6 (kx 2023-04-11 01:18:34 +0300 2052) fprintf( ctx->output, " ]\n" );
11c606a6 (kx 2023-04-11 01:18:34 +0300 2053) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 2054)
11c606a6 (kx 2023-04-11 01:18:34 +0300 2055) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 2056)
11c606a6 (kx 2023-04-11 01:18:34 +0300 2057) ++ctx->index;
11c606a6 (kx 2023-04-11 01:18:34 +0300 2058) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 2059)
11c606a6 (kx 2023-04-11 01:18:34 +0300 2060) static void print_tree_json( FILE *output, struct dlist *list )
11c606a6 (kx 2023-04-11 01:18:34 +0300 2061) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 2062) struct _ctx ctx;
11c606a6 (kx 2023-04-11 01:18:34 +0300 2063)
11c606a6 (kx 2023-04-11 01:18:34 +0300 2064) if( !output || !list ) return;
11c606a6 (kx 2023-04-11 01:18:34 +0300 2065)
11c606a6 (kx 2023-04-11 01:18:34 +0300 2066) bzero( (void *)&ctx, sizeof(struct _ctx) );
11c606a6 (kx 2023-04-11 01:18:34 +0300 2067)
11c606a6 (kx 2023-04-11 01:18:34 +0300 2068) ctx.output = output;
11c606a6 (kx 2023-04-11 01:18:34 +0300 2069) ctx.index = 0;
11c606a6 (kx 2023-04-11 01:18:34 +0300 2070) ctx.size = dlist_length( list );
11c606a6 (kx 2023-04-11 01:18:34 +0300 2071) ctx.depth = 2;
11c606a6 (kx 2023-04-11 01:18:34 +0300 2072)
11c606a6 (kx 2023-04-11 01:18:34 +0300 2073) fprintf( output, "{\n" );
11c606a6 (kx 2023-04-11 01:18:34 +0300 2074) dlist_foreach( list, __print_tree_node, (void *)&ctx );
11c606a6 (kx 2023-04-11 01:18:34 +0300 2075) fprintf( output, "}\n" );
11c606a6 (kx 2023-04-11 01:18:34 +0300 2076)
11c606a6 (kx 2023-04-11 01:18:34 +0300 2077) svg_height += svg_width / 2;
11c606a6 (kx 2023-04-11 01:18:34 +0300 2078)
11c606a6 (kx 2023-04-11 01:18:34 +0300 2079) svg_width = (svg_width + 4) * 160;
11c606a6 (kx 2023-04-11 01:18:34 +0300 2080) svg_height = (svg_height + 4) * 24;
11c606a6 (kx 2023-04-11 01:18:34 +0300 2081) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 2082) /*
11c606a6 (kx 2023-04-11 01:18:34 +0300 2083) End of print json format of DAG functions.
11c606a6 (kx 2023-04-11 01:18:34 +0300 2084) ***************************************************************/
11c606a6 (kx 2023-04-11 01:18:34 +0300 2085)
11c606a6 (kx 2023-04-11 01:18:34 +0300 2086) #include <pkglist.html.c>
11c606a6 (kx 2023-04-11 01:18:34 +0300 2087)
11c606a6 (kx 2023-04-11 01:18:34 +0300 2088) void print_provides_tree( const char *json_fname, enum _tree_format tree_format )
11c606a6 (kx 2023-04-11 01:18:34 +0300 2089) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 2090) FILE *pkgs_fp = NULL, *tree_fp = NULL, *html_fp = NULL;
11c606a6 (kx 2023-04-11 01:18:34 +0300 2091)
11c606a6 (kx 2023-04-11 01:18:34 +0300 2092) allocate_fnames( json_fname );
11c606a6 (kx 2023-04-11 01:18:34 +0300 2093)
11c606a6 (kx 2023-04-11 01:18:34 +0300 2094) pkgs_fp = fopen( (const char *)pkgs_fname, "w" );
11c606a6 (kx 2023-04-11 01:18:34 +0300 2095) if( !pkgs_fp ) { FATAL_ERROR( "Cannot create %s file", basename( pkgs_fname ) ); }
11c606a6 (kx 2023-04-11 01:18:34 +0300 2096) tree_fp = fopen( (const char *)tree_fname, "w" );
11c606a6 (kx 2023-04-11 01:18:34 +0300 2097) if( !tree_fp ) { FATAL_ERROR( "Cannot create %s file", basename( tree_fname ) ); }
11c606a6 (kx 2023-04-11 01:18:34 +0300 2098) html_fp = fopen( (const char *)html_fname, "w" );
11c606a6 (kx 2023-04-11 01:18:34 +0300 2099) if( !html_fp ) { FATAL_ERROR( "Cannot create %s file", basename( html_fname ) ); }
11c606a6 (kx 2023-04-11 01:18:34 +0300 2100)
11c606a6 (kx 2023-04-11 01:18:34 +0300 2101) tree = dlist_copy( provides );
11c606a6 (kx 2023-04-11 01:18:34 +0300 2102)
11c606a6 (kx 2023-04-11 01:18:34 +0300 2103) /*****************************************************
11c606a6 (kx 2023-04-11 01:18:34 +0300 2104) print out the array of all packages in JSON format:
11c606a6 (kx 2023-04-11 01:18:34 +0300 2105) */
11c606a6 (kx 2023-04-11 01:18:34 +0300 2106) print_pkgs_json( pkgs_fp, provides );
11c606a6 (kx 2023-04-11 01:18:34 +0300 2107) fflush( pkgs_fp ); fclose( pkgs_fp );
11c606a6 (kx 2023-04-11 01:18:34 +0300 2108)
11c606a6 (kx 2023-04-11 01:18:34 +0300 2109) provides = dlist_reverse( provides );
11c606a6 (kx 2023-04-11 01:18:34 +0300 2110) sort_requires( provides ); /* sort requires in reverse installation order */
11c606a6 (kx 2023-04-11 01:18:34 +0300 2111)
11c606a6 (kx 2023-04-11 01:18:34 +0300 2112) /********************************************************
11c606a6 (kx 2023-04-11 01:18:34 +0300 2113) Sort the REQUIRES TREE in reverse installation order.
11c606a6 (kx 2023-04-11 01:18:34 +0300 2114) */
11c606a6 (kx 2023-04-11 01:18:34 +0300 2115) tree = sort_requires_tree( tree );
11c606a6 (kx 2023-04-11 01:18:34 +0300 2116)
11c606a6 (kx 2023-04-11 01:18:34 +0300 2117) /********************************************************
11c606a6 (kx 2023-04-11 01:18:34 +0300 2118) remove unneded packages from tree list to leave the
11c606a6 (kx 2023-04-11 01:18:34 +0300 2119) last installation layer of packages presented in DAG:
11c606a6 (kx 2023-04-11 01:18:34 +0300 2120) */
11c606a6 (kx 2023-04-11 01:18:34 +0300 2121) remove_required_packages( provides );
11c606a6 (kx 2023-04-11 01:18:34 +0300 2122)
11c606a6 (kx 2023-04-11 01:18:34 +0300 2123)
11c606a6 (kx 2023-04-11 01:18:34 +0300 2124) if( tree_format == TFMT_BIN )
11c606a6 (kx 2023-04-11 01:18:34 +0300 2125) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 2126) int width = 0, height = 0;
11c606a6 (kx 2023-04-11 01:18:34 +0300 2127)
11c606a6 (kx 2023-04-11 01:18:34 +0300 2128) /********************************************************************
11c606a6 (kx 2023-04-11 01:18:34 +0300 2129) print out the REQUIRES TREE in JSON format as reduced binary tree:
11c606a6 (kx 2023-04-11 01:18:34 +0300 2130) */
11c606a6 (kx 2023-04-11 01:18:34 +0300 2131) create_pkgs_list( provides );
11c606a6 (kx 2023-04-11 01:18:34 +0300 2132) create_btree( tree, provides );
11c606a6 (kx 2023-04-11 01:18:34 +0300 2133)
11c606a6 (kx 2023-04-11 01:18:34 +0300 2134) width = btree_width( btree );
11c606a6 (kx 2023-04-11 01:18:34 +0300 2135) height = btree_height( btree );
11c606a6 (kx 2023-04-11 01:18:34 +0300 2136)
11c606a6 (kx 2023-04-11 01:18:34 +0300 2137) svg_width = (height + 4) * 240;
11c606a6 (kx 2023-04-11 01:18:34 +0300 2138) svg_height = (width + 4) * __width_factor( width );
11c606a6 (kx 2023-04-11 01:18:34 +0300 2139)
11c606a6 (kx 2023-04-11 01:18:34 +0300 2140) fprintf( tree_fp, "{\n" );
11c606a6 (kx 2023-04-11 01:18:34 +0300 2141) __print_btree_header( tree_fp, btree, tree );
11c606a6 (kx 2023-04-11 01:18:34 +0300 2142) btree_print_json( tree_fp, btree, __print_btree_node );
11c606a6 (kx 2023-04-11 01:18:34 +0300 2143) fprintf( tree_fp, "}\n" );
11c606a6 (kx 2023-04-11 01:18:34 +0300 2144)
11c606a6 (kx 2023-04-11 01:18:34 +0300 2145) __btree_free( btree );
11c606a6 (kx 2023-04-11 01:18:34 +0300 2146) free_pkgs_list();
11c606a6 (kx 2023-04-11 01:18:34 +0300 2147) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 2148) else
11c606a6 (kx 2023-04-11 01:18:34 +0300 2149) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 2150) /****************************************************
11c606a6 (kx 2023-04-11 01:18:34 +0300 2151) print out the REQUIRES TREE in JSON format as DAG:
11c606a6 (kx 2023-04-11 01:18:34 +0300 2152) */
11c606a6 (kx 2023-04-11 01:18:34 +0300 2153) print_tree_json( tree_fp, tree );
11c606a6 (kx 2023-04-11 01:18:34 +0300 2154) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 2155)
11c606a6 (kx 2023-04-11 01:18:34 +0300 2156) fflush( tree_fp ); fclose( tree_fp );
11c606a6 (kx 2023-04-11 01:18:34 +0300 2157)
11c606a6 (kx 2023-04-11 01:18:34 +0300 2158) if( minimize )
11c606a6 (kx 2023-04-11 01:18:34 +0300 2159) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 2160) if( minimize_json( (const char *)pkgs_fname, (const char *)pkgs_min_fname ) < 1 )
11c606a6 (kx 2023-04-11 01:18:34 +0300 2161) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 2162) (void)unlink( (const char *)pkgs_min_fname );
11c606a6 (kx 2023-04-11 01:18:34 +0300 2163) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 2164) if( minimize_json( (const char *)tree_fname, (const char *)tree_min_fname ) < 1 )
11c606a6 (kx 2023-04-11 01:18:34 +0300 2165) {
11c606a6 (kx 2023-04-11 01:18:34 +0300 2166) (void)unlink( (const char *)tree_min_fname );
11c606a6 (kx 2023-04-11 01:18:34 +0300 2167) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 2168) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 2169)
11c606a6 (kx 2023-04-11 01:18:34 +0300 2170)
11c606a6 (kx 2023-04-11 01:18:34 +0300 2171) /***********************************************
11c606a6 (kx 2023-04-11 01:18:34 +0300 2172) print out the HTML to view REQIIRES TREE:
11c606a6 (kx 2023-04-11 01:18:34 +0300 2173) */
11c606a6 (kx 2023-04-11 01:18:34 +0300 2174) print_tree_html( html_fp );
11c606a6 (kx 2023-04-11 01:18:34 +0300 2175) fflush( html_fp ); fclose( html_fp );
11c606a6 (kx 2023-04-11 01:18:34 +0300 2176)
11c606a6 (kx 2023-04-11 01:18:34 +0300 2177)
11c606a6 (kx 2023-04-11 01:18:34 +0300 2178) /*****************
11c606a6 (kx 2023-04-11 01:18:34 +0300 2179) free resources:
11c606a6 (kx 2023-04-11 01:18:34 +0300 2180) */
11c606a6 (kx 2023-04-11 01:18:34 +0300 2181) if( root ) { free( root ); root = NULL; }
11c606a6 (kx 2023-04-11 01:18:34 +0300 2182) if( bug_url ) { free( bug_url ); bug_url = NULL; }
11c606a6 (kx 2023-04-11 01:18:34 +0300 2183)
11c606a6 (kx 2023-04-11 01:18:34 +0300 2184) if( pkgs_fname ) { free( pkgs_fname ); pkgs_fname = NULL; }
11c606a6 (kx 2023-04-11 01:18:34 +0300 2185) if( tree_fname ) { free( tree_fname ); tree_fname = NULL; }
11c606a6 (kx 2023-04-11 01:18:34 +0300 2186) if( html_fname ) { free( html_fname ); html_fname = NULL; }
11c606a6 (kx 2023-04-11 01:18:34 +0300 2187)
11c606a6 (kx 2023-04-11 01:18:34 +0300 2188) if( pkgs_min_fname ) { free( pkgs_min_fname ); pkgs_min_fname = NULL; }
11c606a6 (kx 2023-04-11 01:18:34 +0300 2189) if( tree_min_fname ) { free( tree_min_fname ); tree_min_fname = NULL; }
11c606a6 (kx 2023-04-11 01:18:34 +0300 2190)
11c606a6 (kx 2023-04-11 01:18:34 +0300 2191) if( json_pkgs_file ) { free( json_pkgs_file ); json_pkgs_file = NULL; }
11c606a6 (kx 2023-04-11 01:18:34 +0300 2192) if( json_tree_file ) { free( json_tree_file ); json_tree_file = NULL; }
11c606a6 (kx 2023-04-11 01:18:34 +0300 2193)
11c606a6 (kx 2023-04-11 01:18:34 +0300 2194) __dlist_free( tree ); /* do not free node data */
11c606a6 (kx 2023-04-11 01:18:34 +0300 2195) }
11c606a6 (kx 2023-04-11 01:18:34 +0300 2196) /*
11c606a6 (kx 2023-04-11 01:18:34 +0300 2197) End of Requires TREE functions.
11c606a6 (kx 2023-04-11 01:18:34 +0300 2198) ***************************************************************/