# Haskell Stack Fix

Console program used to fix Stack build errors automatically

## How it works

Stack fix works by running `stack build` and by parsing and interpreting the build errors/suggestions it applies any build fixes required to the stack.yaml, .cabal, etc. These fixes usually involve specifying build dependencies versions or adding new build dependencies.

To use stack-fix:

* run `stack-fix` in the root of your stack project
* enjoy not having to waste countless hours on fixing build issues which can be fixed automatically by `stack-fix`

## Contributing

To contribute:

* Fork the project
* Pick any ticket you wish to work on from the project roadmap kanban board that is in the To Do column
* Assign the ticket to yourself and if it makes sense leave a comment detailing at high level what approach you will take
* Implement the feature
* Submit a pull request

Project roadmap kanban board: https://github.com/razvan-panda/haskell-stack-fix/projects/1

### Setting up operating system

#### Windows

We do not support building the project on Windows since many Haskell packages have issues building on Windows.

If you are a Windows user the recommended method is to use WSL or a Linux VMWare virtual machine for your development. The virtual machine option is preffered over WSL since WSL is currently much slower when building stuff than a virtual machine.

#### Linux or MacOS

The project should build fine on these operating systems.

### Setting up build tools

The recommended way to install `cabal-install` is by using the `Nix` package manager.

To install Nix run:

```shell
    curl https://nixos.org/nix/install | sh
```

To install `GHC`, `cabal-install` and `stack`,  create the file `~/.nixpkgs/config.nix`.

Copy paste this into the file:

```nix
let
  config = {
    allowUnfree = true;

    packageOverrides = pkgs: with pkgs;
      let jdk = openjdk11; in rec {
      unstable = import <nixpkgs> { inherit config; };

      all = pkgs.buildEnv {
        name = "all";

        paths = [
          haskell.compiler.ghc864
          haskellPackages.cabal-install
          unstable.haskellPackages.stack
          binutils.bintools # required on WSL
        ];
      };
    };
  };
in config
```

And run following command to install the packages:

```shell
nix-env -i all
```

Run this to update the cabal pacakges:

```shell
cabal v1-update
```

### Setting up your development tools

The recommended editors are Atom and VSCode together with the Haskell IDE Enginer extension.

To install the HIE executable required by the editor extensions via `~/.nixpkgs/config.nix` make changes reflected in the following:

```nix
let
  all-hies = import (fetchTarball "https://github.com/infinisil/all-hies/tarball/master") {};
  config = {
    allowUnfree = true;

    packageOverrides = pkgs: with pkgs;
      let jdk = openjdk11; in rec {
      unstable = import <nixpkgs> { inherit config; };

      all = pkgs.buildEnv {
        name = "all";

        paths = [
          haskell.compiler.ghc864
          haskellPackages.cabal-install
          unstable.haskellPackages.stack
          binutils.bintools # required on WSL
          (all-hies.selection { selector = p: { inherit (p) ghc864; }; })
        ];
      };
    };
  };
in config
```

Then install the HIE extension inside Atom or VSCode.

### Building the project

* open a shell window in the `haskell-stack-fix` project root.
* run `cabal v1-install --dependencies-only`
* run the command `cabal v1-build`