chiark / gitweb /
nailing-cargo: skip dependencies with path already specified
[nailing-cargo.git] / nailing-cargo
1 #!/bin/bash
2
3 #    nailing-cargo: wrapper to use unpublished local crates
4 #
5 #    Copyright (C) 2019 Ian Jackson
6 #
7 #    This program is free software: you can redistribute it and/or modify
8 #    it under the terms of the GNU Affero General Public License as
9 #    published by the Free Software Foundation, either version 3 of the
10 #    License, or (at your option) any later version.
11 #
12 #    This program is distributed in the hope that it will be useful,
13 #    but WITHOUT ANY WARRANTY; without even the implied warranty of
14 #    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15 #    GNU Affero General Public License for more details.
16 #
17 #    You should have received a copy of the GNU Affero General Public License
18 #    along with this program.  If not, see <http://www.gnu.org/licenses/>.
19
20 set -e
21
22 # example usages:
23 #   ../nailing-cargo/nailing-cargo make
24 #   ../nailing-cargo/nailing-cargo cargo build
25 #   CARGO='../nailing-cargo/nailing-cargo cargo' make
26
27
28 # Why do we need this ?
29 #
30 #  https://github.com/rust-lang/cargo/issues/6713
31 #  https://stackoverflow.com/questions/33025887/how-to-use-a-local-unpublished-crate
32 #  https://github.com/rust-lang/cargo/issues/1481
33
34
35 lock=${PWD%/*}/.nail.lock
36 if [ "x$NAILING_CARGO" != "x$lock" ]; then
37         NAILING_CARGO=$lock \
38         exec with-lock-ex -w "$lock" "$0" "$@"
39 fi
40
41 exec 203<../Cargo.nail
42 f=Cargo.toml
43
44 sed='
45 /^ *\[dependencies\]/,/^ \[/{
46 '
47
48 if test -e ../Cargo.nail-env; then
49         . ../Cargo.nail-env
50 fi
51
52 exec 204<../Cargo.nail
53 while read <&204 what where; do
54         if [ "x$what" = x- ]; then continue; fi
55         if [ "x$what" = 'x#' ]; then continue; fi
56         qwhere="${where//\//\\/}"
57         sed+='
58                 /{.*path *=/ b
59                 s/^'$what' *= *\(\".*\"\) *$/'$what' = { version = \1 }/;
60                 s#^'$what' *= *{#'$what' = { path = "'"${PWD%/*}"'/'"${qwhere}"'", #;
61                 /^'$what' *=/ s/version *= *\"[^"]*\"//;
62                 /^'$what' *=/ s/, *\([,}]\)/\1/;
63         '
64 done
65 sed+='}
66 '
67
68 exec 204<../Cargo.nail
69 while read <&204 what where; do
70         if [ "x$what" = 'x#' ]; then continue; fi
71         wf=../$where/$f
72         rm -f $wf.nailing~
73         sed <$wf >$wf.nailing~ "$sed"
74 done
75
76 exec 204<../Cargo.nail
77 while read <&204 what where; do
78         if [ "x$what" = 'x#' ]; then continue; fi
79         wf=../$where/$f
80         if ! test -e $wf.unnailed~; then
81                 ln $wf $wf.unnailed~
82         fi
83 done
84
85 trap '
86         set +e
87         while read <&203 what where; do
88                 if [ "x$what" = "x#" ]; then continue; fi
89                 wf=../$where/$f
90                 if test -e $wf.unnailed~; then
91                         rm -f $wf.nailed~
92                         ln $wf $wf.nailed~
93                         mv -f $wf.unnailed~ $wf
94                 fi
95         done
96         echo >&2 'Unnailed'
97 ' EXIT
98
99 exec 204<../Cargo.nail
100 printf >&2 'Nailing'
101 while read <&204 what where; do
102         if [ "x$what" = 'x#' ]; then continue; fi
103         wf=../$where/$f
104         printf >&2 ' %s' "$what"
105         if cmp -s $wf.nailed~ $wf.nailing~; then
106                 mv -f $wf.nailed~ $wf
107                 rm -f $wf.nailing
108         else
109                 mv -f $wf.nailing~ $wf
110                 rm -f $wf.nailed
111         fi
112 done
113 echo >&2
114
115 "$@"