From f429baaa4a1a87f29628c7fd4fbee96de3c03970 Mon Sep 17 00:00:00 2001
From: "J. Konrad Tegtmeier-Rottach" <jktr@0x16.de>
Date: Mon, 1 May 2023 14:17:40 +0200
Subject: [PATCH] Bump project layout

---
 ChangeLog.md                                  |   3 -
 cabal.project                                 |   1 +
 flake.nix                                     |  79 ++++++++-----
 ghcid                                         |  16 ---
 ghcid-wrapper                                 |  38 ++++++
 hie.yaml                                      |   2 +
 LICENSE => qbar/LICENSE                       |   0
 {app => qbar/app}/Main.hs                     |   0
 {bin => qbar/bin}/install                     |   0
 {bin => qbar/bin}/run                         |   0
 {bin => qbar/bin}/run-sway                    |   0
 qbar.cabal => qbar/qbar.cabal                 | 109 ++++--------------
 {src => qbar/src}/QBar/BlockHelper.hs         |   0
 {src => qbar/src}/QBar/BlockOutput.hs         |   0
 {src => qbar/src}/QBar/Blocks.hs              |   0
 {src => qbar/src}/QBar/Blocks/Battery.hs      |   0
 {src => qbar/src}/QBar/Blocks/CpuUsage.hs     |   0
 {src => qbar/src}/QBar/Blocks/Date.hs         |   0
 {src => qbar/src}/QBar/Blocks/DiskUsage.hs    |   0
 .../src}/QBar/Blocks/NetworkManager.hs        |   0
 {src => qbar/src}/QBar/Blocks/Pipe.hs         |   0
 {src => qbar/src}/QBar/Blocks/Qubes.hs        |   0
 {src => qbar/src}/QBar/Blocks/Script.hs       |   0
 {src => qbar/src}/QBar/Blocks/Squeekboard.hs  |   0
 {src => qbar/src}/QBar/Blocks/Utils.hs        |   0
 {src => qbar/src}/QBar/Cli.hs                 |   0
 {src => qbar/src}/QBar/Color.hs               |   0
 {src => qbar/src}/QBar/ControlSocket.hs       |   0
 {src => qbar/src}/QBar/Core.hs                |   0
 {src => qbar/src}/QBar/DefaultConfig.hs       |   0
 {src => qbar/src}/QBar/Host.hs                |   0
 {src => qbar/src}/QBar/Pango.hs               |   0
 {src => qbar/src}/QBar/Prelude.hs             |   0
 {src => qbar/src}/QBar/Qubes/AdminAPI.hs      |   0
 {src => qbar/src}/QBar/Server.hs              |   0
 {src => qbar/src}/QBar/TagParser.hs           |   0
 {src => qbar/src}/QBar/Theme.hs               |   0
 {src => qbar/src}/QBar/Time.hs                |   0
 {src => qbar/src}/QBar/Utils.hs               |   0
 {test => qbar/test}/Spec.hs                   |   0
 40 files changed, 114 insertions(+), 134 deletions(-)
 delete mode 100644 ChangeLog.md
 create mode 100644 cabal.project
 delete mode 100755 ghcid
 create mode 100755 ghcid-wrapper
 create mode 100644 hie.yaml
 rename LICENSE => qbar/LICENSE (100%)
 rename {app => qbar/app}/Main.hs (100%)
 rename {bin => qbar/bin}/install (100%)
 rename {bin => qbar/bin}/run (100%)
 rename {bin => qbar/bin}/run-sway (100%)
 rename qbar.cabal => qbar/qbar.cabal (61%)
 rename {src => qbar/src}/QBar/BlockHelper.hs (100%)
 rename {src => qbar/src}/QBar/BlockOutput.hs (100%)
 rename {src => qbar/src}/QBar/Blocks.hs (100%)
 rename {src => qbar/src}/QBar/Blocks/Battery.hs (100%)
 rename {src => qbar/src}/QBar/Blocks/CpuUsage.hs (100%)
 rename {src => qbar/src}/QBar/Blocks/Date.hs (100%)
 rename {src => qbar/src}/QBar/Blocks/DiskUsage.hs (100%)
 rename {src => qbar/src}/QBar/Blocks/NetworkManager.hs (100%)
 rename {src => qbar/src}/QBar/Blocks/Pipe.hs (100%)
 rename {src => qbar/src}/QBar/Blocks/Qubes.hs (100%)
 rename {src => qbar/src}/QBar/Blocks/Script.hs (100%)
 rename {src => qbar/src}/QBar/Blocks/Squeekboard.hs (100%)
 rename {src => qbar/src}/QBar/Blocks/Utils.hs (100%)
 rename {src => qbar/src}/QBar/Cli.hs (100%)
 rename {src => qbar/src}/QBar/Color.hs (100%)
 rename {src => qbar/src}/QBar/ControlSocket.hs (100%)
 rename {src => qbar/src}/QBar/Core.hs (100%)
 rename {src => qbar/src}/QBar/DefaultConfig.hs (100%)
 rename {src => qbar/src}/QBar/Host.hs (100%)
 rename {src => qbar/src}/QBar/Pango.hs (100%)
 rename {src => qbar/src}/QBar/Prelude.hs (100%)
 rename {src => qbar/src}/QBar/Qubes/AdminAPI.hs (100%)
 rename {src => qbar/src}/QBar/Server.hs (100%)
 rename {src => qbar/src}/QBar/TagParser.hs (100%)
 rename {src => qbar/src}/QBar/Theme.hs (100%)
 rename {src => qbar/src}/QBar/Time.hs (100%)
 rename {src => qbar/src}/QBar/Utils.hs (100%)
 rename {test => qbar/test}/Spec.hs (100%)

diff --git a/ChangeLog.md b/ChangeLog.md
deleted file mode 100644
index 26a2a1a..0000000
--- a/ChangeLog.md
+++ /dev/null
@@ -1,3 +0,0 @@
-# Changelog for qbar
-
-## Unreleased changes
diff --git a/cabal.project b/cabal.project
new file mode 100644
index 0000000..f44a24c
--- /dev/null
+++ b/cabal.project
@@ -0,0 +1 @@
+packages: */*.cabal
diff --git a/flake.nix b/flake.nix
index 8d30d18..18bc096 100644
--- a/flake.nix
+++ b/flake.nix
@@ -1,44 +1,65 @@
 {
-  outputs = { self, nixpkgs }: with nixpkgs.lib; let
+  inputs.nixpkgs.url = github:NixOS/nixpkgs/nixos-unstable;
 
+  outputs = { self, nixpkgs }:
+  with nixpkgs.lib;
+  let
     systems = platforms.unix;
-    forAllSystems = f: genAttrs systems (system: f system);
-
+    forAllSystems = fn: (genAttrs systems (system:
+      fn (import nixpkgs {
+        inherit system;
+        overlays = [
+          self.overlays.default
+        ];
+      })
+    ));
+    getHaskellPackages = pkgs: pattern: pipe pkgs.haskell.packages [
+      attrNames
+      (filter (x: !isNull (strings.match pattern x)))
+      (sort (x: y: x>y))
+      (map (x: pkgs.haskell.packages.${x}))
+      head
+    ];
   in {
+    packages = forAllSystems (pkgs: let
+      ghc92 = getHaskellPackages pkgs "ghc92.";
+    in rec {
+      default = qbar;
+      qbar = ghc92.qbar;
+    });
 
-    packages = forAllSystems (system:
-      let pkgs = import nixpkgs { inherit system; overlays = [ self.overlay ]; };
-      in rec {
-        default = qbar;
-        qbar = pkgs.haskellPackages.qbar;
-      }
-    );
-
-    defaultPackage = forAllSystems (system: self.packages.${system}.qbar);
+    overlays = {
+      default = final: prev: {
+        haskell = prev.haskell // {
+          packageOverrides = hfinal: hprev: prev.haskell.packageOverrides hfinal hprev // {
+            qbar = hfinal.callCabal2nix "qbar" ./qbar {};
 
-    overlay = final: prev: {
-      haskell = prev.haskell // {
-        packageOverrides = hfinal: hprev: prev.haskell.packageOverrides hfinal hprev // {
-          qbar = import ./. {
-            pkgs = final;
-            haskellPackages = hfinal;
+            # https://gitlab.haskell.org/ghc/ghc/-/issues/22425
+            ListLike = final.haskell.lib.dontCheck hprev.ListLike;
           };
         };
       };
     };
 
-    devShell = forAllSystems (system:
+    devShells = forAllSystems (pkgs:
       let
-        pkgs = nixpkgs.legacyPackages.${system};
-      in pkgs.mkShell {
-        inputsFrom = [ self.packages.${system}.default.env ];
-        packages = [
-          pkgs.cabal-install
-          pkgs.zsh
-          pkgs.entr
-          pkgs.ghcid
-          pkgs.haskell-language-server
-        ];
+        haskellPackages = getHaskellPackages pkgs "ghc92.";
+      in rec {
+        default = haskellPackages.shellFor {
+          packages = hpkgs: [
+            hpkgs.qbar
+          ];
+          nativeBuildInputs = [
+            haskellPackages.haskell-language-server
+            pkgs.cabal-install
+            pkgs.hlint
+
+            # in addition, for ghcid-wrapper
+            pkgs.zsh
+            pkgs.entr
+            pkgs.ghcid
+          ];
+        };
       }
     );
 
diff --git a/ghcid b/ghcid
deleted file mode 100755
index c3d50cc..0000000
--- a/ghcid
+++ /dev/null
@@ -1,16 +0,0 @@
-#!/usr/bin/env -S nix develop . -c zsh
-
-print -P %F{yellow}Cleaning repository%f
-nix develop -c cabal clean
-
-(git ls-files test; git ls-files '*.cabal'; git ls-files 'flake.*') | \
-  entr -r \
-    nix develop -c \
-      ghcid \
-        --warnings \
-        "--command=cabal repl lib:qbar" \
-        "--test=:! \
-          cabal test --disable-optimisation --enable-debug-info=2 --test-show-details=direct --ghc-option -fdiagnostics-color=always && \
-          cabal build --disable-optimisation --enable-debug-info=2 --ghc-option -fdiagnostics-color=always && \
-          zsh -c 'print -P %F{green}Build and tests passed%f' \
-        "
diff --git a/ghcid-wrapper b/ghcid-wrapper
new file mode 100755
index 0000000..dbee7e5
--- /dev/null
+++ b/ghcid-wrapper
@@ -0,0 +1,38 @@
+#!/usr/bin/env -S nix develop -L -c zsh
+
+set -euo pipefail
+
+readonly target=${1:-lib:qbar}
+readonly executable=${2:-}
+
+if [[ -n $executable ]]
+then
+  run_executable="cabal run \
+    --disable-optimisation \
+    --ghc-option -fdiagnostics-color=always \
+    $executable \
+    "
+else
+  run_executable=true
+fi
+
+print -P %F{yellow}Cleaning repository%f
+cabal clean
+
+(
+  git ls-files 'examples/*' '*/test' '*/*.cabal' 'flake.*'
+  echo "ghcid-wrapper"
+) | \
+  entr -r \
+    nix develop -L -c \
+      ghcid \
+        --warnings \
+        "--command=cabal repl $target" \
+        "--test=:! \
+          cabal test \
+            --disable-optimisation \
+            --test-show-details=direct \
+            --ghc-option -fdiagnostics-color=always && \
+          $run_executable && \
+          zsh -c 'print -P %F{green}Build and tests passed%f' \
+        "
diff --git a/hie.yaml b/hie.yaml
new file mode 100644
index 0000000..04cd243
--- /dev/null
+++ b/hie.yaml
@@ -0,0 +1,2 @@
+cradle:
+  cabal:
diff --git a/LICENSE b/qbar/LICENSE
similarity index 100%
rename from LICENSE
rename to qbar/LICENSE
diff --git a/app/Main.hs b/qbar/app/Main.hs
similarity index 100%
rename from app/Main.hs
rename to qbar/app/Main.hs
diff --git a/bin/install b/qbar/bin/install
similarity index 100%
rename from bin/install
rename to qbar/bin/install
diff --git a/bin/run b/qbar/bin/run
similarity index 100%
rename from bin/run
rename to qbar/bin/run
diff --git a/bin/run-sway b/qbar/bin/run-sway
similarity index 100%
rename from bin/run-sway
rename to qbar/bin/run-sway
diff --git a/qbar.cabal b/qbar/qbar.cabal
similarity index 61%
rename from qbar.cabal
rename to qbar/qbar.cabal
index a9b6227..676c8e3 100644
--- a/qbar.cabal
+++ b/qbar/qbar.cabal
@@ -1,6 +1,7 @@
 cabal-version: 3.0
 
 name:           qbar
+
 version:        0.1.0.0
 author:         Jens Nolte
 maintainer:     Jens Nolte
@@ -14,67 +15,31 @@ extra-source-files:
 
 --source-repository head
 --  type: git
---  location: https://git.c3pb.de/jens/qbar.git
+--  location: https:////git.c3pb.de/jens/qbar.git
 
 common shared-properties
+  default-language: GHC2021
   default-extensions:
-    AllowAmbiguousTypes
-    BangPatterns
-    BlockArguments
-    ConstraintKinds
-    DataKinds
-    DefaultSignatures
-    DeriveAnyClass
-    DeriveGeneric
-    DerivingStrategies
-    DisambiguateRecordFields
+    ApplicativeDo
     DuplicateRecordFields
-    ExistentialQuantification
-    FlexibleContexts
-    FlexibleInstances
-    FunctionalDependencies
-    GADTs
-    GeneralizedNewtypeDeriving
-    ImportQualifiedPost
-    InstanceSigs
     LambdaCase
-    -- Enable once 9.0.1 is required
-    --LexicalNegation
-    MultiParamTypeClasses
-    NamedFieldPuns
+    MultiWayIf
     NoImplicitPrelude
-    NumericUnderscores
     OverloadedStrings
-    PolyKinds
-    RankNTypes
-    ScopedTypeVariables
-    StandaloneDeriving
-    TemplateHaskell
-    TupleSections
-    TypeApplications
-    TypeFamilies
-    TypeOperators
-    ViewPatterns
-  default-language: Haskell2010
   ghc-options:
     -Weverything
     -Wno-all-missed-specialisations
-    -Wno-missing-safe-haskell-mode
-    -Wno-missing-kind-signatures
+    -Wno-missing-deriving-strategies
+    -Wno-implicit-prelude
     -Wno-missing-import-lists
+    -Wno-missing-kind-signatures
+    -Wno-missing-safe-haskell-mode
     -Wno-unsafe
     -Werror=incomplete-patterns
     -Werror=missing-fields
     -Werror=missing-home-modules
     -Werror=missing-methods
 
-common shared-executable-properties
-  import: shared-properties
-  ghc-options:
-    -threaded
-    -rtsopts
-    "-with-rtsopts=-N -I0"
-
 library
   import: shared-properties
   build-depends:
@@ -138,56 +103,29 @@ library
     QBar.Theme
     QBar.Time
     QBar.Utils
+  other-modules:
   hs-source-dirs:
     src
-  default-extensions:
-    MultiWayIf
 
 executable qbar
-  import: shared-executable-properties
-  main-is: Main.hs
-  other-modules:
-    Paths_qbar
-  hs-source-dirs:
-    app
+  import: shared-properties
+  ghc-options:
+    -threaded
+    -rtsopts
+    "-with-rtsopts=-N -I0"
   build-depends:
-    aeson,
-    async,
-    attoparsec,
-    base >=4.7 && <5,
-    binary,
-    bytestring,
-    colour,
-    concurrent-extra,
-    containers,
-    dbus,
-    directory,
-    filepath,
-    gitrev,
-    hostname,
-    lens,
-    mtl,
-    network,
-    optparse-applicative,
-    pipes,
-    pipes-aeson,
-    pipes-concurrency,
-    pipes-network,
-    pipes-parse,
-    pipes-safe,
     qbar,
-    random,
-    sorted-list,
-    stm,
-    text,
-    time,
-    typed-process,
-    unix,
-    unordered-containers,
+  hs-source-dirs:
+    app
+  main-is: Main.hs
 
 test-suite qbar-test
-  import: shared-executable-properties
+  import: shared-properties
   type: exitcode-stdio-1.0
+  ghc-options:
+    -threaded
+    -rtsopts
+    "-with-rtsopts=-N -I0"
   main-is: Spec.hs
   other-modules:
     Paths_qbar
@@ -195,4 +133,3 @@ test-suite qbar-test
     test
   build-depends:
     base >=4.7 && <5,
-    qbar,
\ No newline at end of file
diff --git a/src/QBar/BlockHelper.hs b/qbar/src/QBar/BlockHelper.hs
similarity index 100%
rename from src/QBar/BlockHelper.hs
rename to qbar/src/QBar/BlockHelper.hs
diff --git a/src/QBar/BlockOutput.hs b/qbar/src/QBar/BlockOutput.hs
similarity index 100%
rename from src/QBar/BlockOutput.hs
rename to qbar/src/QBar/BlockOutput.hs
diff --git a/src/QBar/Blocks.hs b/qbar/src/QBar/Blocks.hs
similarity index 100%
rename from src/QBar/Blocks.hs
rename to qbar/src/QBar/Blocks.hs
diff --git a/src/QBar/Blocks/Battery.hs b/qbar/src/QBar/Blocks/Battery.hs
similarity index 100%
rename from src/QBar/Blocks/Battery.hs
rename to qbar/src/QBar/Blocks/Battery.hs
diff --git a/src/QBar/Blocks/CpuUsage.hs b/qbar/src/QBar/Blocks/CpuUsage.hs
similarity index 100%
rename from src/QBar/Blocks/CpuUsage.hs
rename to qbar/src/QBar/Blocks/CpuUsage.hs
diff --git a/src/QBar/Blocks/Date.hs b/qbar/src/QBar/Blocks/Date.hs
similarity index 100%
rename from src/QBar/Blocks/Date.hs
rename to qbar/src/QBar/Blocks/Date.hs
diff --git a/src/QBar/Blocks/DiskUsage.hs b/qbar/src/QBar/Blocks/DiskUsage.hs
similarity index 100%
rename from src/QBar/Blocks/DiskUsage.hs
rename to qbar/src/QBar/Blocks/DiskUsage.hs
diff --git a/src/QBar/Blocks/NetworkManager.hs b/qbar/src/QBar/Blocks/NetworkManager.hs
similarity index 100%
rename from src/QBar/Blocks/NetworkManager.hs
rename to qbar/src/QBar/Blocks/NetworkManager.hs
diff --git a/src/QBar/Blocks/Pipe.hs b/qbar/src/QBar/Blocks/Pipe.hs
similarity index 100%
rename from src/QBar/Blocks/Pipe.hs
rename to qbar/src/QBar/Blocks/Pipe.hs
diff --git a/src/QBar/Blocks/Qubes.hs b/qbar/src/QBar/Blocks/Qubes.hs
similarity index 100%
rename from src/QBar/Blocks/Qubes.hs
rename to qbar/src/QBar/Blocks/Qubes.hs
diff --git a/src/QBar/Blocks/Script.hs b/qbar/src/QBar/Blocks/Script.hs
similarity index 100%
rename from src/QBar/Blocks/Script.hs
rename to qbar/src/QBar/Blocks/Script.hs
diff --git a/src/QBar/Blocks/Squeekboard.hs b/qbar/src/QBar/Blocks/Squeekboard.hs
similarity index 100%
rename from src/QBar/Blocks/Squeekboard.hs
rename to qbar/src/QBar/Blocks/Squeekboard.hs
diff --git a/src/QBar/Blocks/Utils.hs b/qbar/src/QBar/Blocks/Utils.hs
similarity index 100%
rename from src/QBar/Blocks/Utils.hs
rename to qbar/src/QBar/Blocks/Utils.hs
diff --git a/src/QBar/Cli.hs b/qbar/src/QBar/Cli.hs
similarity index 100%
rename from src/QBar/Cli.hs
rename to qbar/src/QBar/Cli.hs
diff --git a/src/QBar/Color.hs b/qbar/src/QBar/Color.hs
similarity index 100%
rename from src/QBar/Color.hs
rename to qbar/src/QBar/Color.hs
diff --git a/src/QBar/ControlSocket.hs b/qbar/src/QBar/ControlSocket.hs
similarity index 100%
rename from src/QBar/ControlSocket.hs
rename to qbar/src/QBar/ControlSocket.hs
diff --git a/src/QBar/Core.hs b/qbar/src/QBar/Core.hs
similarity index 100%
rename from src/QBar/Core.hs
rename to qbar/src/QBar/Core.hs
diff --git a/src/QBar/DefaultConfig.hs b/qbar/src/QBar/DefaultConfig.hs
similarity index 100%
rename from src/QBar/DefaultConfig.hs
rename to qbar/src/QBar/DefaultConfig.hs
diff --git a/src/QBar/Host.hs b/qbar/src/QBar/Host.hs
similarity index 100%
rename from src/QBar/Host.hs
rename to qbar/src/QBar/Host.hs
diff --git a/src/QBar/Pango.hs b/qbar/src/QBar/Pango.hs
similarity index 100%
rename from src/QBar/Pango.hs
rename to qbar/src/QBar/Pango.hs
diff --git a/src/QBar/Prelude.hs b/qbar/src/QBar/Prelude.hs
similarity index 100%
rename from src/QBar/Prelude.hs
rename to qbar/src/QBar/Prelude.hs
diff --git a/src/QBar/Qubes/AdminAPI.hs b/qbar/src/QBar/Qubes/AdminAPI.hs
similarity index 100%
rename from src/QBar/Qubes/AdminAPI.hs
rename to qbar/src/QBar/Qubes/AdminAPI.hs
diff --git a/src/QBar/Server.hs b/qbar/src/QBar/Server.hs
similarity index 100%
rename from src/QBar/Server.hs
rename to qbar/src/QBar/Server.hs
diff --git a/src/QBar/TagParser.hs b/qbar/src/QBar/TagParser.hs
similarity index 100%
rename from src/QBar/TagParser.hs
rename to qbar/src/QBar/TagParser.hs
diff --git a/src/QBar/Theme.hs b/qbar/src/QBar/Theme.hs
similarity index 100%
rename from src/QBar/Theme.hs
rename to qbar/src/QBar/Theme.hs
diff --git a/src/QBar/Time.hs b/qbar/src/QBar/Time.hs
similarity index 100%
rename from src/QBar/Time.hs
rename to qbar/src/QBar/Time.hs
diff --git a/src/QBar/Utils.hs b/qbar/src/QBar/Utils.hs
similarity index 100%
rename from src/QBar/Utils.hs
rename to qbar/src/QBar/Utils.hs
diff --git a/test/Spec.hs b/qbar/test/Spec.hs
similarity index 100%
rename from test/Spec.hs
rename to qbar/test/Spec.hs
-- 
GitLab