]> git.pld-linux.org Git - packages/rpm-build-tools.git/blob - rust-crates.sh
f5c5a3206e5ffb636e000c0c2aa8711d9bbd033b
[packages/rpm-build-tools.git] / rust-crates.sh
1 #!/bin/sh
2
3 usage() {
4   echo "Usage: $0 [-p <package_name>] [-o <crates_file>] [-f] [-v] [-h] [<pkg_name>.spec]"
5   echo
6   echo "\t-p <package_name>\tforce cargo <package_name> for version override instead of automatic detection"
7   echo "\t-o <crates_file>\tforce output file name instead of automatically determined name"
8   echo "\t-f\t\t\toverwrite creates file if it already exists"
9   echo "\t-v\t\t\tset cargo package version to @@VERSION@@ for easier crates tarball reuse"
10   echo "\t-h\t\t\tprint this help"
11   echo
12   echo "\t<pkg_name>.spec is optional and defaults to package found in current working directory"
13 }
14
15 for cmd in bsdtar rpm-specdump cargo perl awk; do
16   if ! command -v $cmd > /dev/null 2> /dev/null; then
17     not_installed="$not_installed$cmd "
18   fi
19 done
20
21 if [ -n "$not_installed" ]; then
22   echo "ERROR: required commands not found: $not_installed" >&2
23   exit 1
24 fi
25
26 while getopts p:o:fvh OPTNAME; do
27   case $OPTNAME in
28     p)
29       force_cargo_package="$OPTARG"
30       ;;
31     f)
32       overwrite=1
33       ;;
34     o)
35       crates_file="$OPTARG"
36       ;;
37     v)
38       version_override=1
39       ;;
40     h)
41       usage
42       exit 0
43       ;;
44     ?)
45       echo "ERROR: unknown option '-$OPTNAME'" >&2
46       usage
47       exit 1
48       ;;
49   esac
50 done
51
52 shift $(($OPTIND - 1))
53
54 rpm_topdir=$(rpm -E %{_topdir})
55
56 if [ -n "$1" ]; then
57   pkg_name=$(basename "$1")
58   pkg_name=${pkg_name%.spec}
59   pkg_dir="$rpm_topdir/$pkg_name"
60   if [ ! -f "$pkg_dir/$pkg_name.spec" ]; then
61     echo "ERROR: no package $pkg_name found" >&2
62     exit 1
63   fi
64 else
65   pkg_dir="$(pwd)"
66   pkg_name=$(basename "$pkg_dir")
67   if [ "$(readlink -f "$rpm_topdir")" != "$(readlink -f "$(dirname "$pkg_dir")")" ] || [ ! -f "$pkg_dir/$pkg_name.spec" ]; then
68     echo "ERROR: failed to determine package name" >&2
69     exit 1
70   fi
71 fi
72
73 spec_dump=$(rpm-specdump "$pkg_dir/$pkg_name.spec")
74 pkg_version=$(echo "$spec_dump" | grep PACKAGE_VERSION | cut -f3 -d' ')
75 pkg_src=$(basename $(echo "$spec_dump" | grep SOURCEURL0 | cut -f3- -d' '))
76 if [ -z "$crates_file" ]; then
77   crates_file="$pkg_name-crates-$pkg_version.tar.xz"
78 fi
79
80 if [ -e "$pkg_dir/$crates_file" ] && [ -z "$overwrite" ]; then
81   echo "ERROR: crates file $crates_file already exists" >&2
82   exit 1
83 fi
84
85 if [ ! -f "$pkg_dir/$pkg_src" ]; then
86   echo "ERROR: source file $pkg_src not found" >&2
87   exit 1
88 fi
89
90 tmpdir=$(mktemp -d)
91
92 rm_tmpdir() {
93   if [ -n "$tmpdir" -a -d "$tmpdir" ]; then
94     rm -rf "$tmpdir"
95   fi
96 }
97
98 trap rm_tmpdir EXIT INT HUP
99
100 cd "$tmpdir"
101 bsdtar xf "$pkg_dir/$pkg_src"
102 src_dir=$(ls)
103 if [ $(echo "$src_dir" | wc -l) -ne 1 ]; then
104   echo "ERROR: unexpected source structure:\n$src_dir" >&2
105   exit 1
106 fi
107
108 cd "$src_dir"
109 cargo vendor
110 if [ $? -ne 0 ]; then
111   echo "ERROR: cargo vendor failed" >&2
112   exit 1
113 fi
114
115 if [ -n "$version_override" ]; then
116   if [ -n "$force_cargo_package" ]; then
117     cargo_package=$force_cargo_package
118   else
119     cargo_package=$(awk '/^[[:space:]]*\[package\]/ { in_package=1; } /^[[:space:]]*name[[:space:]]*=/ { if (in_package) { gsub("^[[:space:]]*name[[:space:]]*=[[:space:]]*","");gsub("(^\"|\"$)","");print; exit; } }' Cargo.toml)
120   fi
121
122   if [ -z "$cargo_package" ]; then
123     echo "ERROR: failed to determine cargo package name" >&2
124     exit 1
125   fi
126
127   # replace cargo package version with @@VERSION@@
128   perl -pi -e 'BEGIN { undef $/;} s/(\[\[package\]\]\nname\s*=\s*"'"$cargo_package"'"\nversion\s*=\s*")[^"]+/$1\@\@VERSION\@\@/m' Cargo.lock
129 fi
130
131 cd ..
132 tar cJf "$pkg_dir/$crates_file" "$src_dir"/{Cargo.lock,vendor}
133 echo "Created $pkg_dir/$crates_file"
134
135 # vim: expandtab shiftwidth=2 tabstop=2
This page took 0.031854 seconds and 3 git commands to generate.