How to test your branch in an Arch Linux package
Tags: archlinux, linux, git, github
Published: 2020-08-13 14:17:29

In the previous post, we learned how to apply a git patch to a package. In this entry, we'll try to package a specific branch and run our code installed on our system.

## The easy way

There are a few alternatives to package a branch, but we'll use the most comfortable way. For this example, we want to compile the `master` branch using the PKGBUILD for `git-delta`.

In Arch Linux, the build is based in a git tag, so we should download the commits between the tag and the branch:

https://github.com/dandavison/delta/compare/0.4.1..master.patch

or, the diff alternative:

https://github.com/dandavison/delta/compare/0.4.1..master.diff

## The original PKGBUILD

You can see the PKGBUILD in https://aur.archlinux.org/packages/git-delta clicking the `View PKGBUILD` link. But this is the simplified version:

```bash
pkgname=git-delta
_name=delta
pkgver=0.4.1
pkgrel=1
pkgdesc='A syntax-highlighting pager for git and diff output'
arch=('i686' 'x86_64' 'arm' 'armv7h' 'armv6h' 'aarch64')
url="https://github.com/dandavison/$_name"
license=('MIT')
makedepends=('rust' 'clang' 'llvm')
source=("$url/archive/$pkgver.tar.gz")
sha256sums=('5c2e46e398702b13b2768043ba5dc6bea899fb34271120bad4608ff9a64b0434')

build() {
  cd "$_name-$pkgver"
  cargo build --release --locked
}

package() {
  cd "$_name-$pkgver"
  install -Dm755 "target/release/$_name" -t "$pkgdir/usr/bin/"
}
```

## Adding the prepare step

We just need to add the patch URL to the `source` variable and `SKIP` to the checksum:

```bash
source=("$url/archive/$pkgver.tar.gz"
        my.patch::"$url/compare/$pkgver..master.patch")
sha256sums=('5c2e46e398702b13b2768043ba5dc6bea899fb34271120bad4608ff9a64b0434'
            'SKIP')
```

And, the `prepare` function to patch the tag with the new commits:

```bash
prepare() {
  patch -d "$_name-$pkgver" -p1 -i ../my.patch
}
```

So, the PKGBUILD for build the `master` branch is:

```bash
pkgname=git-delta
_name=delta
pkgver=0.4.1
pkgrel=1
pkgdesc='A syntax-highlighting pager for git and diff output'
arch=('i686' 'x86_64' 'arm' 'armv7h' 'armv6h' 'aarch64')
url="https://github.com/dandavison/$_name"
license=('MIT')
makedepends=('rust' 'clang' 'llvm')

source=("$url/archive/$pkgver.tar.gz"
        my.patch::"$url/compare/$pkgver..master.patch")
sha256sums=('5c2e46e398702b13b2768043ba5dc6bea899fb34271120bad4608ff9a64b0434'
            'SKIP')

prepare() {
  patch -d "$_name-$pkgver" -p1 -i ../my.patch
}

build() {
  cd "$_name-$pkgver"
  cargo build --release --locked
}

package() {
  cd "$_name-$pkgver"
  install -Dm755 "target/release/$_name" -t "$pkgdir/usr/bin/"
}
```

## Building your package 

For build and install this you just need to use:

```bash
makepkg -si
```

Remember that if you rebuild the package with new commits the `makepkg` won't refresh the downloaded `my.patch` file, so we can use this command:

```bash
rm my.patch && makepkg -sicCf
```

The `-C`, or `--cleanbuild`, removes the `src/` folder before build. And, `-c`, or `--clean`, removes the `src/` and `pkg/` folders after build.

The `-f`, or `--force` to overwrite existing package if was already compiled.

## A final words

There is a `git-delta-git` package that compiles the latest commit but Arch needs to uninstall the `git-delta` before installing the `git-delta-git`, and for some packages this is not a choise because other packages depend on the package we are trying to update.

You can learn more of Delta [here](https://dev.to/cloudx/delta-a-new-git-diff-tool-to-rock-your-productivity-2773).