nixpkgs/lib/versions.nix
İlkecan Bozdoğan e394a579b0 lib: update type signatures
- concrete types start with uppercase: Int, String, Bool, Derivation,
  etc.
- type variables start with lowercase: a, b, etc.
- list:
  - use `[x]` for homogeneous lists instead of `List x` or `[ x ]`
  - use `List` for heterogeneous lists (not that common in `lib`)
- attr:
  - use `AttrSet` for a generic attribute set type
  - use `{ key1 :: Type1; key2 :: Type2; ... }` for adding signatures
    for known attribute names and types
  - use `{ key1 = value1; key2 = value2; ... }` for adding attributes
    with known literals
  - end with an ellipsis (`...`) if the set can contain unknown
    attributes
  - use `{ [String] :: x }` if all the attributes has the same type `x`
- prefer `Any` over `a` if the latter is not reused
2026-03-04 00:10:00 +03:00

186 lines
2.5 KiB
Nix

# Version string functions.
{ lib }:
rec {
inherit (builtins) compareVersions;
/**
Break a version string into its component parts.
# Type
```
splitVersion :: String -> [String]
```
# Examples
:::{.example}
## `splitVersion` usage example
```nix
splitVersion "1.2.3"
=> ["1" "2" "3"]
```
:::
*/
splitVersion = builtins.splitVersion;
/**
Get the major version string from a string.
# Inputs
`v`
: 1\. Function argument
# Type
```
major :: String -> String
```
# Examples
:::{.example}
## `major` usage example
```nix
major "1.2.3"
=> "1"
```
:::
*/
major = v: builtins.elemAt (splitVersion v) 0;
/**
Get the minor version string from a string.
# Inputs
`v`
: 1\. Function argument
# Type
```
minor :: String -> String
```
# Examples
:::{.example}
## `minor` usage example
```nix
minor "1.2.3"
=> "2"
```
:::
*/
minor = v: builtins.elemAt (splitVersion v) 1;
/**
Get the patch version string from a string.
# Inputs
`v`
: 1\. Function argument
# Type
```
patch :: String -> String
```
# Examples
:::{.example}
## `patch` usage example
```nix
patch "1.2.3"
=> "3"
```
:::
*/
patch = v: builtins.elemAt (splitVersion v) 2;
/**
Get string of the first two parts (major and minor)
of a version string.
# Inputs
`v`
: 1\. Function argument
# Type
```
majorMinor :: String -> String
```
# Examples
:::{.example}
## `majorMinor` usage example
```nix
majorMinor "1.2.3"
=> "1.2"
```
:::
*/
majorMinor = v: builtins.concatStringsSep "." (lib.take 2 (splitVersion v));
/**
Pad a version string with zeros to match the given number of components.
# Inputs
`n`
: 1\. Function argument
`version`
: 2\. Function argument
# Type
```
pad :: Int -> String -> String
```
# Examples
:::{.example}
## `pad` usage example
```nix
pad 3 "1.2"
=> "1.2.0"
pad 3 "1.3-rc1"
=> "1.3.0-rc1"
pad 3 "1.2.3.4"
=> "1.2.3"
```
:::
*/
pad =
n: version:
let
numericVersion = lib.head (lib.splitString "-" version);
versionSuffix = lib.removePrefix numericVersion version;
in
lib.concatStringsSep "." (lib.take n (lib.splitVersion numericVersion ++ lib.genList (_: "0") n))
+ versionSuffix;
}