Skip to content

Instantly share code, notes, and snippets.

@jirutka
Created April 14, 2017 00:34
Show Gist options
  • Save jirutka/59be5141dd442abcbc183431e0cef8eb to your computer and use it in GitHub Desktop.
Save jirutka/59be5141dd442abcbc183431e0cef8eb to your computer and use it in GitHub Desktop.
#!/bin/sh
# vim: set ts=4:
#----
# Usage: @SCRIPT_NAME@ [PATH | -h | --help]
#
# Parse crate dependencies from metadata section of the Cargo.lock,
# derive their download URIs and print them in format suitable for
# APKBUILD's $source.
#
# PATH Path to Cargo.lock or directory containing Cargo.lock file.
# Defaults to the current working directory.
#----
set -eu
CRATE_DOWNLOAD_URI='\1-\2.crate::https://crates.io/api/v1/crates/\1/\2/download'
help_message() {
sed -En '/^#----$/,/^#----$/p' "$0" \
| sed -E -e 's/^# ?//; 1d;$d;' -e "s|@SCRIPT_NAME@|$0|"
}
case "${1:-}" in
-h | --help) help_message; exit 0;;
esac
lock_file="${1:-$(pwd)}"
if [ -d "$lock_file" ]; then
lock_file="$lock_file/Cargo.lock"
fi
if [ ! -r "$lock_file" ]; then
echo "ERROR: $lock_file does not exist or not readable!" >&2
exit 1
fi
sed -En "/^\s*\[metadata\]/,/^\s*\[/\
s|['\"]checksum (\w[^ ]+) (\d+[^ ]+) \(registry.*|$CRATE_DOWNLOAD_URI|p" \
"$lock_file"
#!/bin/sh
# vim: set ts=4:
#----
# Usage:
# @SCRIPT_NAME@ [options] DIR CRATE...
# @SCRIPT_NAME@ -h
#
# Unpack crates into DIR, generate .cargo-checksum.json for each and
# optionally generate Cargo config file to use DIR as a Directory Source
# (aka vendored sources).
#
# DIR The directory source, i.e. where to put unpacked crates.
# CRATE The crate archive.
#
# Options:
# -c Create Cargo config file in $CARGO_HOME with settings to use
# DIR as a Directory Source.
# -q Be quiet, do not print any messages except errors.
# -s Strip version from name of the crate directory.
# -h Print this message.
#----
set -eu
# Prints a help message parsed from the initial comment in this file.
help_message() {
sed -En '/^#----$/,/^#----$/p' "$0" \
| sed -E -e 's/^# ?//; 1d;$d;' -e "s|@SCRIPT_NAME@|$0|"
}
# Prints the error message and exists with code 1.
die() {
if [ -t 1 ]; then # stdout is a terminal
printf '\033[1;31mERROR:\033[0m %s\n' "$0" >&2 # bold red
else
printf 'ERROR: %s\n' "$0" >&2
fi
exit 1
}
# Prints the message. Note that this function is overriden to no-op function
# when -q (quiet) is used.
log() {
printf '%s\n' "$@" >&2
}
# Generates cargo-checksum metadata for given crate and prints it to stdout.
#
# $1: Path to the .crate file.
cargo_checksum() {
local crate_file="$1"
local shasum="$(sha256sum "$crate_file" | cut -d ' ' -f 1)"
cat <<-EOF
{
"package": "$shasum",
"files": {}
}
EOF
}
# Generates cargo config for a "directory source" (aka vendored dependencies)
# and prints it to stdout.
# See http://doc.crates.io/source-replacement.html#directory-sources.
#
# $1: The directory with unpacked crates.
cargo_config() {
local source_dir="$(readlink -f "$1")"
cat <<-EOF
[source.crates-io]
replace-with = "local"
local-registry = "/dummy"
[source.local]
directory = "$source_dir"
EOF
}
# Unpack the crate under the specified directory and create
# .cargo-checksum.json for it. The actual directory with unpacked crate sources
# will be `$2/<name>-<version>`, or `$2/<name>` for stripped version. This
# directory must not exists prior running this function!
#
# $1: Path to the .crate file.
# $2: The base destination directory where to unpack crate.
# $3: Strip version from name of the crate directory?
# Missing argument, empty string and "no" means no, anything else is yes.
unpack_crate() {
local crate_file="$1"
local dest_dir="$2"
local strip_version="${3:-no}"
local crate_name="$(basename "$crate_file" .crate)"
if [ "$strip_version" != 'no' ]; then
crate_name="${crate_name%-*}"
fi
local crate_dir="$dest_dir/$crate_name"
log "Unpacking $crate_file into $crate_dir"
test ! -e "$crate_dir" || die "$crate_dir already exists!"
if [ "$strip_version" != 'no' ]; then
mkdir -p "$crate_dir"
tar -xf "$crate_file" -C "$crate_dir"/ --strip-components=1
else
tar -xf "$crate_file" -C "$dest_dir"/
fi
cargo_checksum "$crate_file" > "$crate_dir"/.cargo-checksum.json
}
#-------------------- M a i n --------------------#
create_config='no'
strip_version='no'
while getopts 'chqs' OPT; do
case "$OPT" in
c) create_config='yes';;
h) help_message; exit 0;;
q) log() { :; };; # replace log function with no-op
s) strip_version='yes';;
--) break;;
esac
done
shift $(($OPTIND - 1))
if [ $# -lt 2 ]; then
help_message >&2; exit 1
fi
destdir="$1"; shift
mkdir -p "$destdir"
for crate in "$@"; do
test -r "$crate" \
|| die "Crate file '$crate' does not exist or not readable!"
unpack_crate "$crate" "$destdir" "$strip_version"
done
if [ "$create_config" = 'yes' ]; then
test -n "${CARGO_HOME:-}" || die '$CARGO_HOME is not set!'
test ! -e "$CARGO_HOME/config" || die "$CARGO_HOME/config already exists!"
log "Writing $CARGO_HOME/config"
mkdir -p "$CARGO_HOME"
cargo_config "$destdir" > "$CARGO_HOME"/config
fi
# Contributor: André Klitzing <[email protected]>
# Maintainer: André Klitzing <[email protected]>
pkgname=ripgrep
pkgver=0.5.1
pkgrel=0
pkgdesc="ripgrep combines the usability of The Silver Searcher with the raw speed of grep"
url="https://github.com/BurntSushi/ripgrep"
arch="x86_64" # limited by cargo pkg
license="MIT public-domain"
makedepends="cargo"
subpackages="$pkgname-doc
$pkgname-bash-completion:bashcomp:noarch
$pkgname-zsh-completion:zshcomp:noarch
$pkgname-fish-completion:fishcomp:noarch"
# https://github.com/BurntSushi/ripgrep/issues/448
source="$pkgname-$pkgver.tar.gz::https://github.com/BurntSushi/$pkgname/archive/$pkgver.tar.gz
avoid_issue_448.patch
$(acargo-dep-uris)"
builddir="$srcdir/"$pkgname-$pkgver
export CARGO_HOME="$srcdir/.cargo"
unpack() {
cd "$srcdir"
acargo-unpack-crates -c deps/ *.crate
default_unpack
}
build() {
cd "$builddir"
cargo build --release --frozen
}
check() {
cd "$builddir"
cargo test
}
package() {
cd "$builddir"
install -Dm755 target/release/rg "$pkgdir"/usr/bin/rg
install -Dm644 doc/rg.1 "$pkgdir"/usr/share/man/man1/rg.1
}
bashcomp() {
pkgdesc="Bash completions for $pkgname"
depends=""
install_if="$pkgname=$pkgver-r$pkgrel bash-completion"
mkdir -p "$subpkgdir"/usr/share/bash-completion/completions/
install -Dm644 "$builddir"/target/release/build/ripgrep-*/out/rg.bash-completion \
"$subpkgdir"/usr/share/bash-completion/completions/rg
}
zshcomp() {
pkgdesc="Zsh completions for $pkgname"
depends=""
install_if="$pkgname=$pkgver-r$pkgrel zsh"
mkdir -p "$subpkgdir"/usr/share/zsh/site-functions/
install -Dm644 "$builddir"/target/release/build/ripgrep-*/out/_rg \
"$subpkgdir"/usr/share/zsh/site-functions/_rg
}
fishcomp() {
pkgdesc="Fish completions for $pkgname"
depends=""
install_if="$pkgname=$pkgver-r$pkgrel fish"
mkdir -p "$subpkgdir"/usr/share/fish/completions/
install -Dm644 "$builddir"/target/release/build/ripgrep-*/out/rg.fish \
"$subpkgdir"/usr/share/fish/completions/rg.fish
}
sha512sums="20efefbf0e5c5ae95434cdf2dc0e0d45956291a9705614e02cee4e316c1e1e2394dd81ba46f7eff5e67f4447c86f935006f42ff55a2ddc60ef095a10a77184a3 ripgrep-0.5.1.tar.gz
72414b133db84b1ddb41ddb6e0e470e8383fcca8d83b4cce1022cf1166977ed04f4d0ca874a3d0caa4a7090e642ae2e412c7a45d9c540ba9f4708e880397e5a5 avoid_issue_448.patch
4d0d55d8a6657fe13009d66728b7417926325dd9ca4f7ad7cd5d40e59cf0a55b906cd109d724a0b385ee988526535fc64a467ded171419e452c5a8c90196ae45 aho-corasick-0.6.3.crate
4b5297d80f2a7fa840aeb1c31e7b893b33abcc7ce7f6f54371f6d7fc8e2915b43b5e3be3baab32b0821e174d8f7b58961029569a4f9e59b8a46c05f24ecaf04b ansi_term-0.9.0.crate
6e6e2cede7f280a53a61c78126783ec0338c13a8e9bbabb91d4b6fc43aacc56a4f7e86556210029595acf18e444121998101992b40e35a64cce884ec08247d0a atty-0.2.2.crate
c38b9c52b43d3c6bda5096bf67d5d02d04ec628a958204cae12effa30a20754a8469e6c6a3dfb2e5e528a86940860a75ce6a3437389e31d813727739849ee87b bitflags-0.8.2.crate
e9d75cb5b0565f7faacbfa83c9bf4a389d392378ce4c24373a8bd7bfe39959dc5e0e03c3d77ce614e8eb277edce20143041ce03f34f486dcb9fd502c42b52265 bytecount-0.1.6.crate
d2f10ae39a7fe712cd9d228e3b5a96448acaeab3b92d1b97229d54e5201237b9434ceecb1f38f1ebc1f678da5cfc33aa46c810f422f68a21aa341666c27572fb cfg-if-0.1.0.crate
44cddc285945b56420a23bfa98aa68c93c6b22b99e7538894010532bcc2c6cfc7083309e5e7c8895a522e8aea916147cc96a35fe3dfd81f3a93eb41d1c4e0a6d clap-2.23.1.crate
cdefcda7626c08ca59bdf5581e0e8d3e6367081089cc32dad6e84b5f643c7cbc5b08ce47034dd925fe2f5e2dfcfd18afb51fba511265ee3598fc1844838948f2 crossbeam-0.2.10.crate
6b3bda8aa401d39290a60adc68c663552d78815151111b420294149ea7c182afdd973245164ae6162190fd48bcfffb788a4ded51fab2d663760be9fcde73c5a5 encoding_rs-0.5.0.crate
97d73292892bdc9439252494ccdf27e27c5871637ec0d6053dd8eef8df71913baea54ae45ceee3dcf8425a8be797f136957eece69eb1ecbe876dafa74c070703 env_logger-0.4.2.crate
a851ed060bf49224436acb1b5cc3125d30a3b527be9d7abd09f4170eee6243de8067b0bae5b136e62fdb8ee026e42a150109e90fcdf4cc4258f4de045d6069a8 fnv-1.0.5.crate
2c27424c716fa69a0d53784285683d8d87a26abe2875bfb9135502622ec4656ac6ebfe508a24b413444aa5c0077c2a022dfdb3d19bf4836d8dd9d006af5c418d fs2-0.4.1.crate
682bc7c629aefd035966a2873518fd60719121cca7d63d89d6c97ff5306f24d8b5055a3c91b4eedaec22b1d5dd3fb8b48ff7341a05bbd72d86e06c422dab473b kernel32-sys-0.2.2.crate
2aef8842be22e88cfa89df0900b312eb1d516a700d2e8edf3f4dee85390150c526b2dfbe8aa752c98781b21c0449f8ec97d1c0be266868948a07a809d9de6b7f lazy_static-0.2.6.crate
987cb36af3e333ff93a79b0164c24ea481aa72354a9294e9824fbb29bcb4ecc4fc95f68315c5831fc2d59521cb395825e7fd400ca943f36f5dd30b595c34c1bd libc-0.2.21.crate
6befd815071738e24b62feb8f45de23d9927406dc185f37c63c0d9141e315cc75077194dc8e8e1d3cddb279836decfcbf077346a086ed7673b43b4aa512e0dfb log-0.3.7.crate
70ee14fcba41cf896f563da48c8acc683f8cdf77c54cf9786d6a938bd14eca7bcc22c86d0d70a3cae56b2c2f9eeecad2950be759abf02fc98ef96a643af91be6 memchr-1.0.1.crate
c2ccb0afa6795831f1a032c4995d74daeb3bd739059146007b2524ec066517f39f7a2fcf56e69d17a5d091511011b9c0794a8e3ada7322dfc5f20a3d9f6c1b05 memmap-0.5.2.crate
000a17ed9c1e7b65697cd79658ae78b16816aa55ca7ba82ba4fc184f01543c01d69ae19c836f23c2fdcdd78034909e8b0db3e8fae581e220813c628ae56a8fe7 num_cpus-1.3.0.crate
d098065bc8365e2ec584634bbf2547b89f51fc08825d10cc26fa6b8c81213612a552420fc16ebff322637baff95669552bf95400cbef0bc9a86fe7e0bed9a0f4 regex-0.2.1.crate
c2167926c7bc383c71205e607f21490f434b90a0802eacecd0805c9307bf58cbfa7437e1034f96586e472dfc09d63b2907b4a8179321efb38365b4029458616b regex-syntax-0.4.0.crate
2d3d03ab0dd4add93cd32e7ca43041d541bee41000fd8d98575a58cbd192fe4498234ab80baa3c4791de9f3d4214feae90f628fd655e3510ede61f757be3a82c same-file-0.1.3.crate
ed58383bbee3d0a5bc537629cdb242d5ae8ff46d4e8911df16e34a9fe9da693f1347b89f77614d1835391f57c27176824c46feb9733de89915ed4709217466f2 simd-0.1.1.crate
43cbcf2cab7f91515f52f20719e8013cff23807ca79a9a69f1997ec1ba2eacf713d64c88e33f4c9ba852fb3dda4b87e943587ae4b6ff5bfbbb81deb6dbf76a97 strsim-0.6.0.crate
09a7e95e82c673b55b11acd18b9a7f9507247967f5ec9d8576aff91b2d64f68172cab8dcdd3a626c1d12edabee4f7b55c72db0d7eed3eb89d049e2cad4d59261 term_size-0.2.3.crate
39d02053fc3b0f667e0a0e8d8dff26ab393d9fcedecf54541ff3cd5abd0fb25a445a4a72160e97fb36b137ca15f7e8e751cd8bc93d537d73b743049146e92bf0 thread-id-3.0.0.crate
19b4d445c2688898d149a05aec7c157f5c8cf48a60fa98b8890bc70ee8f391fc94d454ec218002063bbaaa715326957ab2dfda0537b782a2643e908b64e0f22d thread_local-0.3.3.crate
1cac2212b05d196ef3109390a9fd902430d88f01a8df9a66367c2535ebc57546ba5a923e0b1262f9858ad5a6851e6aaf7eb22d20ffaf1ed77d38009e7af64bc0 unicode-segmentation-1.1.0.crate
f06b243e533ab9c68d88ccd06a283dfff5fd13e9340cf11bfa74473fc9100bb704c34e7fb66919202a97e7d2ba2e7eed968eced02d557835a06e6a0166865ea3 unicode-width-0.1.4.crate
81d7e8740630ef90341bed76f5be55c928c1f28cf46ef23431a7f610445cae884eea532df805784b2fa04034e831255a3102a29fe2c228b8c1c1afe15d01cca0 unreachable-0.1.1.crate
da498433597582970860db1c66ff1cc2ed8b0e2bf816e6aabdb40424ec03c3f28e6ca5e7592e464442004077735dca4144acd13c8f6a2e799d67504699422643 utf8-ranges-1.0.0.crate
ce4b3e1ed8a7846ff63dbef7051cac76232295c443f560d3c5f7b658a2123c7881c40ebfa90907d500d3e943beaf32b25c8a8068999ac7a28528db273f2e0983 vec_map-0.7.0.crate
1cc7d282600dc0164d7e410aa895d5dc99de1174991549c6733c94cc2027026517f66797751d737869eae58c560fa26edbf43f36b3015eb2fd99828fe40e0aa1 void-1.0.2.crate
d5752c39c055dcd163bd74db3495a16e1865fd32e3f0cd779455fb818e78106ee4bdf0cbbcd36331f860c5ca8de658f848988a47194c5b9e130f28a77c4576d3 walkdir-1.0.7.crate
115e6f027cdd4a56f77ca24f4ab249d2a6cac1e1f955c826a9b6ee05db4861790a533f5e674aebbb540370fff52ed41618c2cd7c906e73200e92df213109cebe winapi-0.2.8.crate
8b0a239e205a5368892f41c870a8a7ea16e3468c364b03382bef7fa3a2e7159b09c07661e95b1227578f6d72c14879daa4444b28c51ae20ef15d985d59ca5a77 winapi-build-0.1.1.crate"
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment