Creating a package from a Git repository can be useful to test the latest source code from the development branch, and catch issues before making a new release using a Git tag. Also you can use other Version Control Systems (VCS) like SVN, but we're going to focus on Git today.
Some packages in the official Arch Linux repository like konsole
, have a VCS package version called konsole-git
in the AUR. The suffix -git
, -svn
, -hg
, etc. is a convention to let the package users know that this is a VCS package.
The providing and conflicts
In our PKGBUILD
we can define a provides
array variable to let pacman
know which additional or virtual packages are provided by our own package. E.g. konsole-git
provides konsole
.
pkgname=konsole-git
...
provides=('konsole')
This doesn't mean a conflict unless we define the conflicts
variable too.
conflicts=('konsole')
The implicit conflict
-
nodejs
implicitly providesnodejs
as thepkgname
itself. -
node-lts-fermium
providesnodejs
and conflicts withnodejs
. -
nodejs-lts-erbium
providesnodejs
and conflicts withnodejs
, but does not need to explicitly conflict withnode-lts-fermium
since packages providing the same feature are implicitly in conflict.
The pkgver as a function
The VCS packages always compile the latest version in the repository. This is achieved by using pkgver()
function as the following:
pkgver() {
cd ${pkgname}
printf "r%s.%s" "$(git rev-list --count HEAD)" "$(git rev-parse --short HEAD)"
}
Like every bash function, the return value is what the function prints to the stdout
(standard output).
The git rev-list --count HEAD
command prints the count of commits in the branch, and git rev-parse --short HEAD
prints the SHA-1 of the latest commit in short format (7 chars). The printf "r%s.%s"
just formats both values to something like r155.083ffa8
.
makepkg
The makepkg
will run the pkgver()
function and will update the PKGBUILD
value with the latest commit version value:
pkgver=r155.083ffa8
You can find other ways to define a VCS package version in the Arch Wiki.
The package source
The source
variable in the PKGBUILD
just needs to indicate the VCS (git
) to download the sources, and since we can't validate the checksum for a repository, it should be skipped.
sources=(git+https://github.com/dandavison/delta.git)
sha256sum=('SKIP')
The build
The build process for a VCS package is the same as for a package based on the latest released.
pkgname=git-delta-git
_pkgname=delta
pkgver=r319.f89300a
pkgrel=1
pkgdesc="A syntax-highlighting pager for git"
arch=('x86_64')
url="https://github.com/dandavison/delta"
license=('custom')
makedepends=('git' 'rust')
provides=('git-delta')
conflicts=('git-delta')
source=(git+$url.git)
sha256sums=('SKIP')
pkgver() {
cd "$srcdir/$_pkgname"
printf "r%s.%s" "$(git rev-list --count HEAD)" "$(git rev-parse --short HEAD)"
}
build() {
cd "$srcdir/$_pkgname"
cargo build --release --locked
}
check() {
cd "$srcdir/$_pkgname"
cargo test --release --locked
}
package() {
cd "$srcdir/$_pkgname"
install -Dm755 "target/release/$_pkgname" -t "$pkgdir/usr/bin"
install -Dm644 LICENSE "$pkgdir/usr/share/licenses/$pkgname/LICENSE"
}
Testing your code
With this kind of package you can easily test your apps in your computer using a continuous delivery method, and catch the bugs before creating the tag for a release. ๐
Top comments (0)