From b8514a17276edfe668ec43bef017ffa0c1c8d636 Mon Sep 17 00:00:00 2001
From: Peter Hoeg <peter@hoeg.com>
Date: Tue, 22 Dec 2020 12:09:10 +0800
Subject: [PATCH] crystal2nix: unstable-2018-07-31 -> 0.1.0

---
 .../compilers/crystal/crystal2nix.cr          | 42 -------------------
 .../compilers/crystal/crystal2nix.nix         | 22 ----------
 .../compilers/crystal2nix/default.nix         | 36 ++++++++++++++++
 .../compilers/crystal2nix/shards.nix          | 14 +++++++
 pkgs/top-level/all-packages.nix               |  5 ++-
 5 files changed, 53 insertions(+), 66 deletions(-)
 delete mode 100644 pkgs/development/compilers/crystal/crystal2nix.cr
 delete mode 100644 pkgs/development/compilers/crystal/crystal2nix.nix
 create mode 100644 pkgs/development/compilers/crystal2nix/default.nix
 create mode 100644 pkgs/development/compilers/crystal2nix/shards.nix

diff --git a/pkgs/development/compilers/crystal/crystal2nix.cr b/pkgs/development/compilers/crystal/crystal2nix.cr
deleted file mode 100644
index 0610de5cfa4d..000000000000
--- a/pkgs/development/compilers/crystal/crystal2nix.cr
+++ /dev/null
@@ -1,42 +0,0 @@
-require "yaml"
-require "json"
-
-class PrefetchJSON
-  JSON.mapping(sha256: String)
-end
-
-class ShardLock
-  YAML.mapping(
-    version: Float32,
-    shards: Hash(String, Hash(String, String))
-  )
-end
-
-File.open "shards.nix", "w+" do |file|
-  file.puts %({)
-  yaml = ShardLock.from_yaml(File.read("shard.lock"))
-  yaml.shards.each do |key, value|
-    owner, repo = value["github"].split("/")
-    url = "https://github.com/#{value["github"]}"
-    rev = if value["version"]?
-            "v#{value["version"]}"
-          else
-            value["commit"]
-          end
-
-    sha256 = ""
-    args = ["--url", url, "--rev", rev]
-    Process.run("@nixPrefetchGit@", args: args) do |x|
-      x.error.each_line { |e| puts e }
-      sha256 = PrefetchJSON.from_json(x.output).sha256
-    end
-
-    file.puts %(  #{key} = {)
-    file.puts %(    owner = "#{owner}";)
-    file.puts %(    repo = "#{repo}";)
-    file.puts %(    rev = "#{rev}";)
-    file.puts %(    sha256 = "#{sha256}";)
-    file.puts %(  };)
-  end
-  file.puts %(})
-end
diff --git a/pkgs/development/compilers/crystal/crystal2nix.nix b/pkgs/development/compilers/crystal/crystal2nix.nix
deleted file mode 100644
index 5fc40cd23741..000000000000
--- a/pkgs/development/compilers/crystal/crystal2nix.nix
+++ /dev/null
@@ -1,22 +0,0 @@
-{ lib, crystal, nix-prefetch-git }:
-
-crystal.buildCrystalPackage {
-  pname = "crystal2nix";
-  version = "unstable-2018-07-31";
-
-  nixPrefetchGit = "${lib.getBin nix-prefetch-git}/bin/nix-prefetch-git";
-  unpackPhase = "substituteAll ${./crystal2nix.cr} crystal2nix.cr";
-
-  format = "crystal";
-
-  crystalBinaries.crystal2nix.src = "crystal2nix.cr";
-
-  # it will blow up without a shard.yml file
-  doInstallCheck = false;
-
-  meta = with lib; {
-    description = "Utility to convert Crystal's shard.lock files to a Nix file";
-    license = licenses.mit;
-    maintainers = with maintainers; [ manveru ];
-  };
-}
diff --git a/pkgs/development/compilers/crystal2nix/default.nix b/pkgs/development/compilers/crystal2nix/default.nix
new file mode 100644
index 000000000000..25cbbd4d01aa
--- /dev/null
+++ b/pkgs/development/compilers/crystal2nix/default.nix
@@ -0,0 +1,36 @@
+{ lib, fetchFromGitHub, fetchgit, crystal, makeWrapper, nix-prefetch-git }:
+
+crystal.buildCrystalPackage rec {
+  pname = "crystal2nix";
+  version = "0.1.0";
+
+  src = fetchFromGitHub {
+    owner = "peterhoeg";
+    repo = "crystal2nix";
+    rev = "v${version}";
+    sha256 = "sha256-K1ElG8VC/D0axmSRaufH3cE50xNQisAmFucDkV+5O0s=";
+  };
+
+  format = "shards";
+
+  shardsFile = ./shards.nix;
+
+  nativeBuildInputs = [ makeWrapper ];
+
+  postInstall = ''
+    wrapProgram $out/bin/crystal2nix \
+      --prefix PATH : ${lib.makeBinPath [ nix-prefetch-git ]}
+  '';
+
+  # temporarily off. We need the checks to execute the wrapped binary
+  doCheck = false;
+
+  # it requires an internet connection when run
+  doInstallCheck = false;
+
+  meta = with lib; {
+    description = "Utility to convert Crystal's shard.lock files to a Nix file";
+    license = licenses.mit;
+    maintainers = with maintainers; [ manveru peterhoeg ];
+  };
+}
diff --git a/pkgs/development/compilers/crystal2nix/shards.nix b/pkgs/development/compilers/crystal2nix/shards.nix
new file mode 100644
index 000000000000..abfc0f93072d
--- /dev/null
+++ b/pkgs/development/compilers/crystal2nix/shards.nix
@@ -0,0 +1,14 @@
+{
+  json_mapping = {
+    owner = "crystal-lang";
+    repo = "json_mapping.cr";
+    rev = "v0.1.0";
+    sha256 = "1qq5vs2085x7cwmp96rrjns0yz9kiz1lycxynfbz5psxll6b8p55";
+  };
+  yaml_mapping = {
+    owner = "crystal-lang";
+    repo = "yaml_mapping.cr";
+    rev = "v0.1.0";
+    sha256 = "02spz1521g59ar6rp0znnr01di766kknbjxjnygs39yn0cmpzqc1";
+  };
+}
diff --git a/pkgs/top-level/all-packages.nix b/pkgs/top-level/all-packages.nix
index 7030f3a71794..b183ed808f06 100644
--- a/pkgs/top-level/all-packages.nix
+++ b/pkgs/top-level/all-packages.nix
@@ -9051,8 +9051,9 @@ in
     crystal_0_33
     crystal_0_34
     crystal_0_35
-    crystal
-    crystal2nix;
+    crystal;
+
+  crystal2nix = callPackage ../development/compilers/crystal2nix { };
 
   icr = callPackage ../development/tools/icr { };