From b98a1443550c70bf6b5af026fb88ba9a2ea491d7 Mon Sep 17 00:00:00 2001 From: Michael Raskin <7c6f434c@mail.ru> Date: Mon, 2 Jun 2008 08:21:38 +0000 Subject: [PATCH] Added a generator for CPAN expressions. Expressions often require manual editing, but still something.. svn path=/nixpkgs/trunk/; revision=11947 --- .../filtered-requirements.sh | 18 ++++++++++ .../expression-generator/full-requirements.sh | 21 ++++++++++++ .../expression-generator/grab-url.sh | 20 +++++++++++ .../expression-generator/lib-cache.sh | 19 +++++++++++ .../expression-generator/make-clean-dir.sh | 5 +++ .../expression-generator/requirements.sh | 17 ++++++++++ .../retrieve-file-link.sh | 14 ++++++++ .../retrieve-meta-yaml.sh | 16 +++++++++ .../retrieve-modulepage.sh | 5 +++ .../source-download-link.sh | 17 ++++++++++ .../expression-generator/usage.txt | 10 ++++++ .../write-nix-expression.sh | 34 +++++++++++++++++++ 12 files changed, 196 insertions(+) create mode 100755 pkgs/development/perl-modules/expression-generator/filtered-requirements.sh create mode 100755 pkgs/development/perl-modules/expression-generator/full-requirements.sh create mode 100755 pkgs/development/perl-modules/expression-generator/grab-url.sh create mode 100644 pkgs/development/perl-modules/expression-generator/lib-cache.sh create mode 100755 pkgs/development/perl-modules/expression-generator/make-clean-dir.sh create mode 100755 pkgs/development/perl-modules/expression-generator/requirements.sh create mode 100755 pkgs/development/perl-modules/expression-generator/retrieve-file-link.sh create mode 100755 pkgs/development/perl-modules/expression-generator/retrieve-meta-yaml.sh create mode 100755 pkgs/development/perl-modules/expression-generator/retrieve-modulepage.sh create mode 100755 pkgs/development/perl-modules/expression-generator/source-download-link.sh create mode 100644 pkgs/development/perl-modules/expression-generator/usage.txt create mode 100755 pkgs/development/perl-modules/expression-generator/write-nix-expression.sh diff --git a/pkgs/development/perl-modules/expression-generator/filtered-requirements.sh b/pkgs/development/perl-modules/expression-generator/filtered-requirements.sh new file mode 100755 index 000000000000..98c01508fd5a --- /dev/null +++ b/pkgs/development/perl-modules/expression-generator/filtered-requirements.sh @@ -0,0 +1,18 @@ +#! /bin/sh + +source lib-cache.sh; + +print_reqs() { + module_name="$1"; + + ./requirements.sh "$1"| while read; do + if let "$(./source-download-link.sh "${REPLY}" | wc -c)" && [ perl != "$REPLY" ]; then + echo "$REPLY"; + fi; + done; +} + +module_name="$1"; +module_basename="${module_name//::/-}"; + +cached_output print_reqs "$module_basename" "$module_name" "pure.deps"; diff --git a/pkgs/development/perl-modules/expression-generator/full-requirements.sh b/pkgs/development/perl-modules/expression-generator/full-requirements.sh new file mode 100755 index 000000000000..29ed83668ed5 --- /dev/null +++ b/pkgs/development/perl-modules/expression-generator/full-requirements.sh @@ -0,0 +1,21 @@ +#! /bin/sh + +source lib-cache.sh; + +print_requirements () { + module_name="$1"; + + ./requirements.sh "$module_name" | while read; do + echo "$REPLY"; + print_reqs_cache "$REPLY"; + done | sort | uniq +}; + +print_reqs_cache () { + module_name="$1"; + module_basename="${module_name//::/-}"; + + cached_output print_requirements "$module_basename" "$module_name" "full.deps"; +}; + +print_reqs_cache "$@"; diff --git a/pkgs/development/perl-modules/expression-generator/grab-url.sh b/pkgs/development/perl-modules/expression-generator/grab-url.sh new file mode 100755 index 000000000000..809cf87fcebf --- /dev/null +++ b/pkgs/development/perl-modules/expression-generator/grab-url.sh @@ -0,0 +1,20 @@ +#! /bin/sh + +source lib-cache.sh + +get_file() { + url="$1"; + + if [ -n "$url" ]; then + curl "$1"; + else + echo -n; + fi; +} + +url="$1"; +name="$2"; +name=${name:-$(basename "$url")} + +cached_output get_file "${name%%.*}" "$url" "${name#*.}" + diff --git a/pkgs/development/perl-modules/expression-generator/lib-cache.sh b/pkgs/development/perl-modules/expression-generator/lib-cache.sh new file mode 100644 index 000000000000..7473e2d1c15e --- /dev/null +++ b/pkgs/development/perl-modules/expression-generator/lib-cache.sh @@ -0,0 +1,19 @@ + +# First argument: command to run +# Second argument: cache name +# Third argument: argument to command +# Fourth argument: cache type +cached_output () { + cmd="$1"; + basename="$2"; + arg="$3"; + ext="$4"; + + if ! [ -e "cache-${ext//./-}/${basename}.${ext}" ]; then + mkdir -p "cache-${ext//./-}"; + $cmd $arg > "cache-${ext//./-}/${basename}.${ext}"; + fi; + + cat "cache-${ext//./-}/${basename}.${ext}"; +} + diff --git a/pkgs/development/perl-modules/expression-generator/make-clean-dir.sh b/pkgs/development/perl-modules/expression-generator/make-clean-dir.sh new file mode 100755 index 000000000000..996cb92e6958 --- /dev/null +++ b/pkgs/development/perl-modules/expression-generator/make-clean-dir.sh @@ -0,0 +1,5 @@ +#! /bin/sh + +rm -rf test; +mkdir test; +for i in *.sh; do ln -s ../$i test; done; diff --git a/pkgs/development/perl-modules/expression-generator/requirements.sh b/pkgs/development/perl-modules/expression-generator/requirements.sh new file mode 100755 index 000000000000..60ee68d99ada --- /dev/null +++ b/pkgs/development/perl-modules/expression-generator/requirements.sh @@ -0,0 +1,17 @@ +#! /bin/sh + +source lib-cache.sh; + +module_name="$1"; +module_basename="${1//::/-}"; + +print_requirements () { + module_name="$1"; + + ./retrieve-meta-yaml.sh "$module_name" | + sed -re '1,/^requires:/d; /^[a-z]/,$d; s@^\s*@@; s@:\s.*@@'; + ./retrieve-meta-yaml.sh "$module_name" | + sed -re '1,/^build_requires:/d; /^[a-z]/,$d; s@^\s*@@; s@:\s.*@@'; +}; + +cached_output print_requirements "$module_basename" "$module_name" "direct.deps"; diff --git a/pkgs/development/perl-modules/expression-generator/retrieve-file-link.sh b/pkgs/development/perl-modules/expression-generator/retrieve-file-link.sh new file mode 100755 index 000000000000..a9cf0d94e0d3 --- /dev/null +++ b/pkgs/development/perl-modules/expression-generator/retrieve-file-link.sh @@ -0,0 +1,14 @@ +#! /bin/sh + +module_basename="$1"; +file_name="$2"; + +version_regexp="${module_basename}(-[0-9.a-z]+){0,1}"; +author_regexp="[A-Z0-9]+"; + +./retrieve-modulepage.sh "$module_basename" | + egrep "[<]a href=\"[a-z0-9/]*/(${author_regexp}/){0,1}${version_regexp}/${file_name}" | + sed -re "s@.*href=\"@@; s@\".*@@" | + sed -re 's@^/@http://search.cpan.org/@'; + +echo "$link_line"; diff --git a/pkgs/development/perl-modules/expression-generator/retrieve-meta-yaml.sh b/pkgs/development/perl-modules/expression-generator/retrieve-meta-yaml.sh new file mode 100755 index 000000000000..2c85d45691f0 --- /dev/null +++ b/pkgs/development/perl-modules/expression-generator/retrieve-meta-yaml.sh @@ -0,0 +1,16 @@ +#! /bin/sh + +source lib-cache.sh; + +print_meta_yaml () { + module_name="$1"; + module_basename="${module_name//::/-}"; + + ./grab-url.sh "$(./retrieve-file-link.sh "$module_basename" "META.yml")" \ + "${module_basename}.meta.yml"; +}; + +module_name="$1"; +module_basename="${module_name//::/-}"; + +cached_output print_meta_yaml "$module_basename" "$module_name" meta.yaml; diff --git a/pkgs/development/perl-modules/expression-generator/retrieve-modulepage.sh b/pkgs/development/perl-modules/expression-generator/retrieve-modulepage.sh new file mode 100755 index 000000000000..866dfa13f944 --- /dev/null +++ b/pkgs/development/perl-modules/expression-generator/retrieve-modulepage.sh @@ -0,0 +1,5 @@ +#! /bin/sh + +module_basename="$1"; + +./grab-url.sh "http://search.cpan.org/dist/$module_basename/" "$module_basename".html; diff --git a/pkgs/development/perl-modules/expression-generator/source-download-link.sh b/pkgs/development/perl-modules/expression-generator/source-download-link.sh new file mode 100755 index 000000000000..575f47629c26 --- /dev/null +++ b/pkgs/development/perl-modules/expression-generator/source-download-link.sh @@ -0,0 +1,17 @@ +#! /bin/sh + +source lib-cache.sh; + +module_name="$1"; +module_basename="${module_name//::/-}"; + +write_link() { + module_basename="$1"; + + ./retrieve-modulepage.sh "$module_basename" | + grep -A 2 "This Release" | + grep href | + sed -re 's/.*href="//; s/".*//; s@^/@http://search.cpan.org/@'; +} + +cached_output write_link "$module_basename" "$module_basename" src.link; diff --git a/pkgs/development/perl-modules/expression-generator/usage.txt b/pkgs/development/perl-modules/expression-generator/usage.txt new file mode 100644 index 000000000000..1aa0737afdbd --- /dev/null +++ b/pkgs/development/perl-modules/expression-generator/usage.txt @@ -0,0 +1,10 @@ +/path/to/write-nix-expression.sh Group::Module::Submodule + +It will output Nix assignment formatted for placing into +all-packages.nix amongst all the perl packages, like perlAlgorithmDiff. +Actually it will grab distribution unit Group-Module-Submodule via +search.cpan.org, and make some effort to write correct dependencies. +If among requirements there are some that have empty META.yml, or if +any of requirements acannot be installed by just getting distribution +unit whose name can be guessed by replacing :: with -, manual editing +will be needed. diff --git a/pkgs/development/perl-modules/expression-generator/write-nix-expression.sh b/pkgs/development/perl-modules/expression-generator/write-nix-expression.sh new file mode 100755 index 000000000000..cfe1506640b3 --- /dev/null +++ b/pkgs/development/perl-modules/expression-generator/write-nix-expression.sh @@ -0,0 +1,34 @@ +#! /bin/sh + +cd $(dirname $0); + +source lib-cache.sh; + +print_expression () { + module_name="$1"; + module_basename="${module_name//::/-}"; + module_compressedname="perl${module_name//::/}"; + sourcelink="$(./source-download-link.sh "${module_name}")"; + version_name="${sourcelink%.tar.*}"; + version_name="${version_name##*/}"; + dependencies="$(./filtered-requirements.sh "$module_name" | sed -e 's/^/perl/; s/:://g' | xargs)"; + source_hash=$(nix-prefetch-url "$sourcelink" 2>/dev/null); + + cat <