#! /usr/bin/gawk -f # # FILE1 -- The packages to be installed # FILE2 -- The cygwin setup.ini file function make_key(package, suffix) { return package DS suffix; } function compare(requires1, requires2, __ARGVEND__, a1,n1,a2,n2,i) { n1 = split(requires1, a1); n2 = split(requires2, a2); if( n1 == n2 ) { asort(a1); asort(a2); for(i=1; i<=n1; i++) { # printf("%s -- %s\n", a1[i], a2[i]) >STDERR; if(a1[i] != a2[i]) return -1; } return 0; } return n1-n2; } function in_array(val, array, __ARGVEND__, i) { for(i in array) { if( array[i] == val ) { # printf("IN\n") >STDERR; return 1; } } # printf("OUT\n") >STDERR;; return 0; } function join(requires1, requires2, __ARGVEND__, a1,n1,a2,n2,i,r) { n1 = split(requires1, a1); n2 = split(requires2, a2); r = ""; for(i=1; i<=n1; i++) r = r " " a1[i]; for(i=1; i<=n2; i++) { if( !in_array(a2[i], a1) ) { r = r " " a2[i]; } } return r; } function get_cygwin_packages(all_packages, requires, __ARGVEND__, max_requires, more_requires, req, i, n, key_requires, package) { max_requires = requires; # printf("Enter: Level: %d\n", level) >STDERR; # printf("requries: %s\n", requires) >STDERR; n = split(requires, req); for(i=1; i<=n; i++) { package = req[i]; key_requires = make_key(package, "requires"); # printf("key: %s\n", key_requires) >STDERR; more_requires = all_packages[key_requires]; # printf("more_requries: %s\n", more_requires) >STDERR; max_requires = join(max_requires, more_requires); } # printf("requires: %s\n", requires) >STDERR; # printf("max_requires: %s\n", max_requires) >STDERR; if( compare(max_requires, requires) != 0 ) { more_requires = get_cygwin_packages(all_packages, max_requires); max_requires = join(max_requires, more_requires); } # printf("Leave: Level: %d\n", level) >STDERR; return max_requires; } function resolve_packages(all_packages, packages, __ARGVEND__, a, n, i, key, files) { files = ""; n = split(packages, a); for(i=1; i<=n; i++) { key = make_key(a[i], "install"); if( all_packages[key] != "" ) files = files " " all_packages[key]; } return files; } BEGIN { FS = "(:|[ \t]+)"; # STDERR = "/dev/stderr"; STDERR = "/dev/null"; skip_prev = 1; DS = "#"; } FILENAME==ARGV[1] && $1 { packages_to_install = packages_to_install " " $1; } FILENAME==ARGV[2] { delete words num_words = 0; for(i=1; i<=NF; i++) { if($i != "") { num_words++; words[num_words] = $i; # printf("%s--", $i) >STDERR; } } # printf("\n") >STDERR; switch(words[1]) { case "@": skip_prev = 0; cur_package = words[2]; printf("@ %s\n", cur_package) >STDERR; break; case "requires": if(!skip_prev) { key = make_key(cur_package, "requires"); requires = ""; for(i=2; i<=num_words; i++) requires = requires " " words[i]; all_packages[key] = requires; printf("requires: %s\n", requires) >STDERR; } break; case "install": if(!skip_prev) { key = make_key(cur_package, "install"); all_packages[key] = words[2]; p2p_array[word[1]] = cur_package; printf("install: %s\n", words[2]) >STDERR; } break; case "[prev]": skip_prev = 1; break; } } END { pkg = get_cygwin_packages(all_packages, packages_to_install); printf("%s\n", pkg ); # printf("%s\n", resolve_packages(all_packages,pkg) ); }