diff --git a/default.nix b/default.nix index f5120de..4b7267c 100644 --- a/default.nix +++ b/default.nix @@ -4,7 +4,7 @@ let composerEnv = import ./src/Composer2Nix/composer-env.nix { - inherit (pkgs) stdenv lib writeTextFile fetchurl unzip; + inherit (pkgs) stdenv lib writeTextFile fetchurl unzip libarchive; inherit php phpPackages; }; in diff --git a/src/Composer2Nix/Expressions/CompositionExpression.php b/src/Composer2Nix/Expressions/CompositionExpression.php index 15e5cca..d3a1e61 100644 --- a/src/Composer2Nix/Expressions/CompositionExpression.php +++ b/src/Composer2Nix/Expressions/CompositionExpression.php @@ -84,7 +84,8 @@ class CompositionExpression extends NixASTNode "lib" => new NixInherit("pkgs"), "writeTextFile" => new NixInherit("pkgs"), "fetchurl" => new NixInherit("pkgs"), - "unzip" => new NixInherit("pkgs"), + "unzip" => new NixInherit("pkgs"), + "libarchive" => new NixInherit("pkgs"), "php" => new NixInherit(), "phpPackages" => new NixInherit() )) diff --git a/src/Composer2Nix/Sources/Source.php b/src/Composer2Nix/Sources/Source.php index ecf85c5..81fb77f 100644 --- a/src/Composer2Nix/Sources/Source.php +++ b/src/Composer2Nix/Sources/Source.php @@ -67,7 +67,9 @@ abstract class Source extends NixASTNode case "path": return new PathSource($package, $sourceObj); case "zip": - return new ZipSource($package, $sourceObj); + return new ZipSource($package, $sourceObj); + case "tar": + return new TarSource($package, $sourceObj); case "git": return new GitSource($package, $sourceObj); case "hg": diff --git a/src/Composer2Nix/Sources/TarSource.php b/src/Composer2Nix/Sources/TarSource.php new file mode 100644 index 0000000..6aa7162 --- /dev/null +++ b/src/Composer2Nix/Sources/TarSource.php @@ -0,0 +1,74 @@ +reference = ""; + + if(substr($this->sourceObj["url"], 0, 7) === "http://" || substr($this->sourceObj["url"], 0, 8) === "https://") + { + $this->hash = shell_exec('nix-prefetch-url "'.$this->sourceObj['url'].'"'); + + if($this->hash === false) + throw new Exception("Error while invoking nix-prefetch-url"); + } + else + $this->hash = null; + } + + /** + * @see NixASTNode::toNixAST() + */ + public function toNixAST() + { + $ast = parent::toNixAST(); + + if($this->hash === null) + $src = new NixFile($this->sourceObj['url']); + else + { + $src = new NixFunInvocation(new NixFile("fetchurl"), array( + "url" => $this->sourceObj["url"], + "sha256" => substr($this->hash, 0, -1) + )); + } + + $ast["src"] = new NixFunInvocation(new NixExpression("composerEnv.buildTarPackage"), array( + "name" => strtr($this->package["name"], "/", "-").$this->reference, + "src" => $src + )); + + return $ast; + } +} +?> diff --git a/src/Composer2Nix/composer-env.nix b/src/Composer2Nix/composer-env.nix index 71714b7..ad1d206 100644 --- a/src/Composer2Nix/composer-env.nix +++ b/src/Composer2Nix/composer-env.nix @@ -1,6 +1,6 @@ # This file originates from composer2nix -{ stdenv, lib, writeTextFile, fetchurl, php, unzip, phpPackages }: +{ stdenv, lib, writeTextFile, fetchurl, php, unzip, phpPackages, libarchive }: let inherit (phpPackages) composer; @@ -21,6 +21,20 @@ let mv * $out ''; }; + + buildTarPackage = { name, src }: + stdenv.mkDerivation { + inherit name src; + nativeBuildInputs = [ libarchive ]; + buildCommand = '' + shopt -s dotglob + bsdtar -xf $src + baseDir=$(find . -type d -mindepth 1 -maxdepth 1) + cd $baseDir + mkdir -p $out + mv * $out + ''; + }; buildPackage = { name @@ -240,5 +254,6 @@ in inherit filterSrc; composer = lib.makeOverridable composer; buildZipPackage = lib.makeOverridable buildZipPackage; + buildTarPackage = lib.makeOverridable buildTarPackage; buildPackage = lib.makeOverridable buildPackage; }