haskell / haskell/cabal

[RFC] Summarize contiguous version ranges

Open
#9,831 4 comments 0 reactions 0 assignees View on GitHub
cabal-install: solver type: RFC
Dominant language
Haskell
Stars
1.7k
Forks
750
Avg merge
4d 3h
Merged PRs (30d)
28

Description

> I would prefer going further and attempt to summarize contiguous version ranges, even though this would be more work.

`[__0] rejecting: pandoc; 1.14 through 3.1.8`

_Originally posted by @gbaz in https://github.com/haskell/cabal/issues/9559#issuecomment-1868586636_

How would we summarize ranges? The suggestion above is very brief. How do I check that the solver has tried every version available?

Could we use something like [range extraction](https://rosettacode.org/wiki/Range_extraction#Haskell)? This is a bit more explicit.

How would this work with multiple levels of range? Would we show lower levels where each leaf is only a `.0` version? Is descending order readable for ranges?

```
3.0.2.0, 3.0.1.0, 3.0.0.0 => 3.0.{0-2}.0
```

Two lengthy examples to consider, `pandoc` and `Cabal`;

- `pandoc`

```
3.1.8, 3.1.7, 3.1.6.2, 3.1.6.1, 3.1.6, 3.1.5, 3.1.4,
3.1.3, 3.1.2, 3.1.1, 3.1, 3.0.1, 3.0, 2.19.2, 2.19.1, 2.19, 2.18, 2.17.1.1,
2.17.1, 2.17.0.1, 2.17, 2.16.2, 2.16.1, 2.16, 2.15, 2.14.2, 2.14.1, 2.14.0.3,
2.14.0.2, 2.14.0.1, 2.14, 2.13, 2.12, 2.11.4, 2.11.3.2, 2.11.3.1, 2.11.3,
2.11.2, 2.11.1.1, 2.11.1, 2.11.0.4, 2.11.0.2, 2.11.0.1, 2.11, 2.10.1, 2.10,
2.9.2.1, 2.9.2, 2.9.1.1, 2.9.1, 2.9, 2.8.1, 2.8.0.1, 2.8, 2.7.3, 2.7.2, 2.7.1,
2.7, 2.6, 2.5, 2.4, 2.3.1, 2.3, 2.2.3.2, 2.2.3.1, 2.2.3, 2.2.2.1, 2.2.2, 2.2.1,
2.2, 2.1.3, 2.1.2, 2.1.1, 2.1, 2.0.6, 2.0.5, 2.0.4, 2.0.3, 2.0.2, 2.0.1.1,
2.0.1, 2.0.0.1, 2.0, 1.19.2.4, 1.19.2.3, 1.19.2.2, 1.19.2.1, 1.19.2, 1.19.1,
1.19, 1.18, 1.17.2, 1.17.1, 1.17.0.3, 1.17.0.2, 1.17.0.1, 1.17, 1.16.0.2,
1.16.0.1, 1.16, 1.15.2.1, 1.15.2, 1.15.1.1, 1.15.1, 1.15.0.6, 1.15.0.5,
1.15.0.4, 1.15.0.3, 1.15.0.2, 1.14.1, 1.13.2.1, 1.13.2, 1.13.1, 1.13.0.1, 1.13,
1.12.4.2, 1.12.4, 1.12.3.3, 1.12.3.2, 1.12.3.1, 1.12.3, 1.12.2.1, 1.12.2,
1.12.1, 1.12.0.2, 1.12.0.1, 1.12, 1.11.1, 1.11, 1.10.1, 1.10.0.5, 1.10.0.4,
1.10.0.3, 1.10.0.2, 1.10.0.1, 1.10, 1.9.4.5, 1.9.4.4, 1.9.4.3, 1.9.4.2, 1.9.4.1,
1.9.4, 1.9.3, 1.9.2, 1.9.1.2, 1.9.1.1, 1.9.1, 1.9.0.5, 1.9.0.4, 1.9.0.3,
1.9.0.2, 1.9, 1.8.2.1, 1.8.2, 1.8.1.2, 1.8.1.1, 1.8.1, 1.8.0.3, 1.8.0.2,
1.8.0.1, 1.8, 1.6.0.1, 1.6, 1.5.1.1, 1.5.1, 1.5.0.1, 1.5, 1.4, 1.3, 1.2.1, 1.2,
1.1, 1.0.0.1, 1.0, 0.46, 0.45, 0.44, 0.43, 0.42, 0.41, 0.4, 2.11.0.3, 1.15.0.1,
1.15, 1.14.0.4, 1.14.0.3, 1.14.0.2, 1.14.0.1, 1.14
```

- `Cabal` with lots of trailing zeros

```
3.10.2.1, 3.10.2.0, 3.10.1.0, 3.8.1.0, 3.6.3.0, 3.6.2.0, 3.6.1.0, 3.6.0.0,
3.4.1.0, 3.4.0.0, 3.2.1.0, 3.2.0.0, 3.0.2.0, 3.0.1.0, 3.0.0.0, 2.4.1.0, 2.4.0.1,
2.4.0.0, 2.2.0.1, 2.2.0.0, 2.0.1.1, 2.0.1.0, 2.0.0.2, 1.24.2.0, 1.24.0.0,
1.22.8.0, 1.22.7.0, 1.22.6.0, 1.22.5.0, 1.22.4.0, 1.22.3.0, 1.22.2.0, 1.22.1.1,
1.22.1.0, 1.22.0.0, 1.20.0.4, 1.20.0.3, 1.20.0.2, 1.20.0.1, 1.20.0.0, 1.18.1.7,
1.18.1.6, 1.18.1.5, 1.18.1.4, 1.18.1.3, 1.18.1.2, 1.18.1.1, 1.18.1, 1.18.0,
1.16.0.3, 1.16.0.2, 1.16.0.1, 1.16.0, 1.14.0, 1.12.0, 1.10.2.0, 1.10.1.0,
1.10.0.0, 1.8.0.6, 1.8.0.4, 1.8.0.2, 1.6.0.3, 1.6.0.2, 1.6.0.1, 1.4.0.2,
1.4.0.1, 1.4.0.0, 1.2.4.0, 1.2.3.0, 1.2.2.0, 1.2.1, 1.1.6, 1.24.1.0
```

## Options

- ascending bounds `1.14 through 3.1.8`
- prefix `3.10.{2.1, 2.0, 1.0}`
- prefix with range extraction `3.10.{2.1-0, 1.0}`
- tree list
```
- 3
-- 10[2.1, 2.0, 1.0]
```

Contributor guide

Open the contributing guide

Research direction

The issue names no files or tests; begin by locating the solver's version-rejection output and compare the pandoc and Cabal examples. Resolve the competing range formats, ordering, nesting, and completeness questions before implementation. Done means an agreed summary format that clearly represents contiguous versions and shows whether every available version was tried.

Written by the indexing model from the issue text.

Assessment

Tech stack
haskell
Domain
build-system, cli
Issue type
Feature
Difficulty
5/5
Estimated time
Over a week
Activity status
Stale
Clarity
Needs clarification
Newbie friendliness
20/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.