| 1 | # Copyright 2004 Gentoo Technologies, Inc. |
1 | # Copyright 2011 Gentoo Technologies, Inc. |
| 2 | # Distributed under the terms of the GNU General Public License v2 |
2 | # Distributed under the terms of the GNU General Public License v2 |
| 3 | # $Header: /var/cvsroot/gentoo-x86/eclass/darcs.eclass,v 1.8 2010/03/14 12:31:41 kolmodin Exp $ |
3 | # $Header: /var/cvsroot/gentoo-x86/eclass/darcs.eclass,v 1.12 2011/08/22 04:46:31 vapier Exp $ |
|
|
4 | |
|
|
5 | # @ECLASS: darcs.eclass |
|
|
6 | # @MAINTAINER: |
|
|
7 | # "Gentoo's Haskell Language team" <haskell@gentoo.org> |
|
|
8 | # Sergei Trofimovich <slyfox@gentoo.org> |
|
|
9 | # @AUTHOR: |
|
|
10 | # Original Author: Jeffrey Yasskin <jyasskin@mail.utexas.edu> |
|
|
11 | # @BLURB: This eclass provides functions for fetch and unpack darcs repositories |
|
|
12 | # @DESCRIPTION: |
|
|
13 | # This eclass provides the generic darcs fetching functions. |
| 4 | # |
14 | # |
| 5 | # darcs eclass author: Andres Loeh <kosmikus@gentoo.org> |
15 | # Define the EDARCS_REPOSITORY variable at least. |
| 6 | # tla eclass author: <rphillips@gentoo.org> |
16 | # The ${S} variable is set to ${WORKDIR}/${P}. |
| 7 | # Original Author: Jeffrey Yasskin <jyasskin@mail.utexas.edu> |
17 | # @THANKS TO: |
| 8 | # |
18 | # <rphillips@gentoo.org> (tla eclass author) |
| 9 | # Originally derived from the tla eclass, which is derived from the |
19 | # Andres Loeh <kosmikus@gentoo.org> (darcs.eclass author) |
| 10 | # cvs eclass. |
20 | # Alexander Vershilov <alexander.vershilov@gmail.com> (various contributions) |
| 11 | # |
|
|
| 12 | # This eclass provides the generic darcs fetching functions. |
|
|
| 13 | # to use from an ebuild, set the 'ebuild-configurable settings' below in your |
|
|
| 14 | # ebuild before inheriting. then either leave the default src_unpack or extend |
|
|
| 15 | # over darcs_src_unpack. |
|
|
| 16 | |
21 | |
| 17 | # Most of the time, you will define only $EDARCS_REPOSITORY in your |
22 | # TODO: |
| 18 | # ebuild. |
|
|
| 19 | |
23 | |
| 20 | # TODO: support for tags, ... |
24 | # support for tags |
|
|
25 | |
|
|
26 | inherit eutils # eshopts_{push,pop} |
| 21 | |
27 | |
| 22 | # Don't download anything other than the darcs repository |
28 | # Don't download anything other than the darcs repository |
| 23 | SRC_URI="" |
29 | SRC_URI="" |
| 24 | |
30 | |
| 25 | # You shouldn't change these settings yourself! The ebuild/eclass inheriting |
31 | # You shouldn't change these settings yourself! The ebuild/eclass inheriting |
| 26 | # this eclass will take care of that. |
32 | # this eclass will take care of that. |
| 27 | |
33 | |
| 28 | # --- begin ebuild-configurable settings |
34 | # --- begin ebuild-configurable settings |
| 29 | |
35 | |
| 30 | # darcs command to run |
36 | # darcs command to run |
| 31 | [ -z "$EDARCS_DARCS_CMD" ] && EDARCS_DARCS_CMD="darcs" |
37 | # @ECLASS-VARIABLE: EDARCS_DARCS_CMD |
|
|
38 | # @DESCRIPTION: |
|
|
39 | # Path to darcs binary. |
|
|
40 | : ${EDARCS_DARCS_CMD:=darcs} |
| 32 | |
41 | |
| 33 | # darcs commands with command-specific options |
42 | # darcs commands with command-specific options |
| 34 | [ -z "$EDARCS_GET_CMD" ] && EDARCS_GET_CMD="get --partial" |
|
|
| 35 | [ -z "$EDARCS_UPDATE_CMD" ] && EDARCS_UPDATE_CMD="pull" |
|
|
| 36 | |
43 | |
|
|
44 | # @ECLASS-VARIABLE: EDARCS_GET_CMD |
|
|
45 | # @DESCRIPTION: |
|
|
46 | # First fetch darcs command. |
|
|
47 | : ${EDARCS_GET_CMD:=get --partial} |
|
|
48 | |
|
|
49 | # @ECLASS-VARIABLE: EDARCS_UPDATE_CMD |
|
|
50 | # @DESCRIPTION: |
|
|
51 | # Repo update darcs command. |
|
|
52 | : ${EDARCS_UPDATE_CMD:=pull} |
|
|
53 | |
|
|
54 | # @ECLASS-VARIABLE: EDARCS_OPTIONS |
|
|
55 | # @DESCRIPTION: |
| 37 | # options to pass to both the "get" and "update" commands |
56 | # Options to pass to both the "get" and "update" commands |
| 38 | [ -z "$EDARCS_OPTIONS" ] && EDARCS_OPTIONS="--set-scripts-executable" |
57 | : ${EDARCS_OPTIONS:=--set-scripts-executable} |
| 39 | |
58 | |
|
|
59 | # @ECLASS-VARIABLE: EDARCS_TOP_DIR |
|
|
60 | # @DESCRIPTION: |
| 40 | # Where the darcs repositories are stored/accessed |
61 | # Where the darcs repositories are stored/accessed |
| 41 | [ -z "$EDARCS_TOP_DIR" ] && EDARCS_TOP_DIR="${PORTAGE_ACTUAL_DISTDIR-${DISTDIR}}/darcs-src" |
62 | : ${EDARCS_TOP_DIR:=${PORTAGE_ACTUAL_DISTDIR-${DISTDIR}}/darcs-src} |
| 42 | |
63 | |
|
|
64 | # @ECLASS-VARIABLE: EDARCS_REPOSITORY |
|
|
65 | # @DESCRIPTION: |
| 43 | # The URI to the repository. |
66 | # The URI to the repository. |
| 44 | [ -z "$EDARCS_REPOSITORY" ] && EDARCS_REPOSITORY="" |
67 | : ${EDARCS_REPOSITORY:=} |
| 45 | |
68 | |
|
|
69 | # @ECLASS-VARIABLE: EDARCS_OFFLINE |
|
|
70 | # @DESCRIPTION: |
|
|
71 | # Set this variable to a non-empty value to disable the automatic updating of |
|
|
72 | # a darcs repository. this is intended to be set outside the darcs source |
|
|
73 | # tree by users. |
|
|
74 | : ${EDARCS_OFFLINE:=${ESCM_OFFLINE}} |
| 46 | |
75 | |
|
|
76 | # @ECLASS-VARIABLE: EDARCS_CLEAN |
|
|
77 | # @DESCRIPTION: |
| 47 | # EDARCS_CLEAN: set this to something to get a clean copy when updating |
78 | # Set this to something to get a clean copy when updating |
| 48 | # (removes the working directory, then uses $EDARCS_GET_CMD to |
79 | # (removes the working directory, then uses EDARCS_GET_CMD to |
| 49 | # re-download it.) |
80 | # re-download it.) |
|
|
81 | : ${EDARCS_CLEAN:=} |
| 50 | |
82 | |
| 51 | # --- end ebuild-configurable settings --- |
83 | # --- end ebuild-configurable settings --- |
| 52 | |
84 | |
| 53 | # add darcs to deps |
85 | # add darcs to deps |
| 54 | DEPEND="dev-vcs/darcs" |
86 | DEPEND="dev-vcs/darcs" |
| 55 | |
87 | |
|
|
88 | # @FUNCTION: darcs_patchcount |
|
|
89 | # @DESCRIPTION: |
|
|
90 | # Internal function to determine amount of patches in repository. |
|
|
91 | darcs_patchcount() { |
|
|
92 | set -- $(${EDARCS_DARCS_CMD} show repo | grep "Num Patches") |
|
|
93 | # handle string like: " Num Patches: 3860" |
|
|
94 | echo ${3} |
|
|
95 | } |
|
|
96 | |
|
|
97 | # @FUNCTION: darcs_fetch |
|
|
98 | # @DESCRIPTION: |
| 56 | # is called from darcs_src_unpack |
99 | # Internal function is called from darcs_src_unpack |
| 57 | darcs_fetch() { |
100 | darcs_fetch() { |
| 58 | |
|
|
| 59 | # The local directory to store the repository (useful to ensure a |
101 | # The local directory to store the repository (useful to ensure a |
| 60 | # unique local name); relative to EDARCS_TOP_DIR |
102 | # unique local name); relative to EDARCS_TOP_DIR |
| 61 | [ -z "$EDARCS_LOCALREPO" ] && [ -n "$EDARCS_REPOSITORY" ] \ |
103 | [[ -z ${EDARCS_LOCALREPO} ]] && [[ -n ${EDARCS_REPOSITORY} ]] \ |
| 62 | && EDARCS_LOCALREPO=${EDARCS_REPOSITORY%/} \ |
104 | && EDARCS_LOCALREPO=${EDARCS_REPOSITORY%/} \ |
| 63 | && EDARCS_LOCALREPO=${EDARCS_LOCALREPO##*/} |
105 | && EDARCS_LOCALREPO=${EDARCS_LOCALREPO##*/} |
| 64 | |
106 | |
| 65 | debug-print-function $FUNCNAME $* |
107 | debug-print-function ${FUNCNAME} $* |
| 66 | |
108 | |
| 67 | if [ -n "$EDARCS_CLEAN" ]; then |
109 | if [[ -n ${EDARCS_CLEAN} ]]; then |
|
|
110 | addwrite "${EDARCS_TOP_DIR}/${EDARCS_LOCALREPO}" |
| 68 | rm -rf $EDARCS_TOP_DIR/$EDARCS_LOCALREPO |
111 | rm -rf "${EDARCS_TOP_DIR}/${EDARCS_LOCALREPO}" |
| 69 | fi |
112 | fi |
| 70 | |
113 | |
| 71 | # create the top dir if needed |
114 | # create the top dir if needed |
| 72 | if [ ! -d "$EDARCS_TOP_DIR" ]; then |
115 | if [[ ! -d ${EDARCS_TOP_DIR} ]]; then |
| 73 | # note that the addwrite statements in this block are only there to allow creating EDARCS_TOP_DIR; |
116 | # note that the addwrite statements in this block are only there to allow creating EDARCS_TOP_DIR; |
| 74 | # we've already allowed writing inside it |
117 | # we've already allowed writing inside it |
| 75 | # this is because it's simpler than trying to find out the parent path of the directory, which |
118 | # this is because it's simpler than trying to find out the parent path of the directory, which |
| 76 | # would need to be the real path and not a symlink for things to work (so we can't just remove |
119 | # would need to be the real path and not a symlink for things to work (so we can't just remove |
| 77 | # the last path element in the string) |
120 | # the last path element in the string) |
| 78 | debug-print "$FUNCNAME: checkout mode. creating darcs directory" |
121 | debug-print "${FUNCNAME}: checkout mode. creating darcs directory" |
| 79 | addwrite /foobar |
122 | addwrite /foobar |
| 80 | addwrite / |
123 | addwrite / |
| 81 | mkdir -p "$EDARCS_TOP_DIR" |
124 | mkdir -p "${EDARCS_TOP_DIR}" |
| 82 | export SANDBOX_WRITE="${SANDBOX_WRITE//:\/foobar:\/}" |
125 | export SANDBOX_WRITE="${SANDBOX_WRITE//:\/foobar:\/}" |
| 83 | fi |
126 | fi |
| 84 | |
127 | |
| 85 | # in case EDARCS_DARCS_DIR is a symlink to a dir, get the real |
128 | # in case EDARCS_DARCS_DIR is a symlink to a dir, get the real |
| 86 | # dir's path, otherwise addwrite() doesn't work. |
129 | # dir's path, otherwise addwrite() doesn't work. |
| 87 | pushd . |
130 | pushd . |
| 88 | cd -P "$EDARCS_TOP_DIR" > /dev/null |
131 | cd -P "${EDARCS_TOP_DIR}" > /dev/null |
| 89 | EDARCS_TOP_DIR="`/bin/pwd`" |
132 | EDARCS_TOP_DIR="`/bin/pwd`" |
| 90 | |
133 | |
| 91 | # disable the sandbox for this dir |
134 | # disable the sandbox for this dir |
| 92 | addwrite "$EDARCS_TOP_DIR" |
135 | addwrite "${EDARCS_TOP_DIR}" |
| 93 | |
136 | |
| 94 | # determine checkout or update mode and change to the right directory. |
137 | # determine checkout or update mode and change to the right directory. |
| 95 | if [ ! -d "$EDARCS_TOP_DIR/$EDARCS_LOCALREPO/_darcs" ]; then |
138 | if [[ ! -d "${EDARCS_TOP_DIR}/${EDARCS_LOCALREPO}/_darcs" ]]; then |
| 96 | mode=get |
139 | mode=get |
| 97 | cd "$EDARCS_TOP_DIR" |
140 | cd "${EDARCS_TOP_DIR}" |
| 98 | else |
141 | else |
| 99 | mode=update |
142 | mode=update |
| 100 | cd "$EDARCS_TOP_DIR/$EDARCS_LOCALREPO" |
143 | cd "${EDARCS_TOP_DIR}/${EDARCS_LOCALREPO}" |
| 101 | fi |
144 | fi |
| 102 | |
145 | |
| 103 | # commands to run |
146 | # commands to run |
| 104 | local cmdget="${EDARCS_DARCS_CMD} ${EDARCS_GET_CMD} ${EDARCS_OPTIONS} --repo-name=${EDARCS_LOCALREPO} ${EDARCS_REPOSITORY}" |
147 | local cmdget="${EDARCS_DARCS_CMD} ${EDARCS_GET_CMD} ${EDARCS_OPTIONS} --repo-name=${EDARCS_LOCALREPO} ${EDARCS_REPOSITORY}" |
| 105 | local cmdupdate="${EDARCS_DARCS_CMD} ${EDARCS_UPDATE_CMD} --all ${EDARCS_OPTIONS} ${EDARCS_REPOSITORY}" |
148 | local cmdupdate="${EDARCS_DARCS_CMD} ${EDARCS_UPDATE_CMD} --all ${EDARCS_OPTIONS} ${EDARCS_REPOSITORY}" |
| 106 | |
149 | |
| 107 | if [ "${mode}" == "get" ]; then |
150 | if [[ ${mode} == "get" ]]; then |
| 108 | einfo "Running $cmdget" |
151 | einfo "Running ${cmdget}" |
| 109 | eval $cmdget || die "darcs get command failed" |
152 | eval ${cmdget} || die "darcs get command failed" |
|
|
153 | elif [[ -n ${EDARCS_OFFLINE} ]] ; then |
|
|
154 | einfo "Offline update" |
| 110 | elif [ "${mode}" == "update" ]; then |
155 | elif [[ ${mode} == "update" ]]; then |
| 111 | einfo "Running $cmdupdate" |
156 | einfo "Running ${cmdupdate}" |
| 112 | eval $cmdupdate || die "darcs update command failed" |
157 | eval ${cmdupdate} || die "darcs update command failed" |
| 113 | fi |
158 | fi |
|
|
159 | |
|
|
160 | export EDARCS_PATCHCOUNT=$(darcs_patchcount) |
|
|
161 | einfo " patches in repo: ${EDARCS_PATCHCOUNT}" |
| 114 | |
162 | |
| 115 | popd |
163 | popd |
| 116 | } |
164 | } |
| 117 | |
165 | |
| 118 | |
166 | # @FUNCTION: darcs_src_unpack |
|
|
167 | # @DESCRIPTION: |
|
|
168 | # src_upack function |
| 119 | darcs_src_unpack() { |
169 | darcs_src_unpack() { |
| 120 | # The local directory to store the repository (useful to ensure a |
170 | # The local directory to store the repository (useful to ensure a |
| 121 | # unique local name); relative to EDARCS_TOP_DIR |
171 | # unique local name); relative to EDARCS_TOP_DIR |
| 122 | [ -z "$EDARCS_LOCALREPO" ] && [ -n "$EDARCS_REPOSITORY" ] \ |
172 | [[ -z ${EDARCS_LOCALREPO} ]] && [[ -n ${EDARCS_REPOSITORY} ]] \ |
| 123 | && EDARCS_LOCALREPO=${EDARCS_REPOSITORY%/} \ |
173 | && EDARCS_LOCALREPO=${EDARCS_REPOSITORY%/} \ |
| 124 | && EDARCS_LOCALREPO=${EDARCS_LOCALREPO##*/} |
174 | && EDARCS_LOCALREPO=${EDARCS_LOCALREPO##*/} |
| 125 | local EDARCS_SHOPT |
|
|
| 126 | |
175 | |
| 127 | debug-print-function $FUNCNAME $* |
176 | debug-print-function ${FUNCNAME} $* |
| 128 | |
177 | |
| 129 | debug-print "$FUNCNAME: init: |
178 | debug-print "${FUNCNAME}: init: |
| 130 | EDARCS_DARCS_CMD=$EDARCS_DARCS_CMD |
179 | EDARCS_DARCS_CMD=${EDARCS_DARCS_CMD} |
| 131 | EDARCS_GET_CMD=$EDARCS_GET_CMD |
180 | EDARCS_GET_CMD=${EDARCS_GET_CMD} |
| 132 | EDARCS_UPDATE_CMD=$EDARCS_UPDATE_CMD |
181 | EDARCS_UPDATE_CMD=${EDARCS_UPDATE_CMD} |
| 133 | EDARCS_OPTIONS=$EDARCS_OPTIONS |
182 | EDARCS_OPTIONS=${EDARCS_OPTIONS} |
| 134 | EDARCS_TOP_DIR=$EDARCS_TOP_DIR |
183 | EDARCS_TOP_DIR=${EDARCS_TOP_DIR} |
| 135 | EDARCS_REPOSITORY=$EDARCS_REPOSITORY |
184 | EDARCS_REPOSITORY=${EDARCS_REPOSITORY} |
| 136 | EDARCS_LOCALREPO=$EDARCS_LOCALREPO |
185 | EDARCS_LOCALREPO=${EDARCS_LOCALREPO} |
| 137 | EDARCS_CLEAN=$EDARCS_CLEAN" |
186 | EDARCS_CLEAN=${EDARCS_CLEAN}" |
| 138 | |
187 | |
| 139 | einfo "Fetching darcs repository $EDARCS_REPOSITORY into $EDARCS_TOP_DIR..." |
188 | einfo "Fetching darcs repository ${EDARCS_REPOSITORY} into ${EDARCS_TOP_DIR}..." |
| 140 | darcs_fetch |
189 | darcs_fetch |
| 141 | |
190 | |
| 142 | einfo "Copying $EDARCS_LOCALREPO from $EDARCS_TOP_DIR..." |
191 | einfo "Copying ${EDARCS_LOCALREPO} from ${EDARCS_TOP_DIR}..." |
| 143 | debug-print "Copying $EDARCS_LOCALREPO from $EDARCS_TOP_DIR..." |
192 | debug-print "Copying ${EDARCS_LOCALREPO} from ${EDARCS_TOP_DIR}..." |
| 144 | |
193 | |
| 145 | # probably redundant, but best to make sure |
194 | # probably redundant, but best to make sure |
| 146 | # Use ${WORKDIR}/${P} rather than ${S} so user can point ${S} to something inside. |
195 | # Use ${WORKDIR}/${P} rather than ${S} so user can point ${S} to something inside. |
| 147 | mkdir -p "${WORKDIR}/${P}" |
196 | mkdir -p "${WORKDIR}/${P}" |
| 148 | |
197 | |
| 149 | EDARCS_SHOPT=$(shopt -p dotglob) |
|
|
| 150 | shopt -s dotglob # get any dotfiles too. |
198 | eshopts_push -s dotglob # get any dotfiles too. |
| 151 | rsync -rlpgo --exclude="_darcs/" "$EDARCS_TOP_DIR/$EDARCS_LOCALREPO"/* "${WORKDIR}/${P}" |
199 | rsync -rlpgo --exclude="_darcs/" "${EDARCS_TOP_DIR}/${EDARCS_LOCALREPO}"/* "${WORKDIR}/${P}" |
| 152 | eval ${EDARCS_SHOPT} # reset shopt |
200 | eshopts_pop |
| 153 | |
201 | |
| 154 | einfo "Darcs repository contents are now in ${WORKDIR}/${P}" |
202 | einfo "Darcs repository contents are now in ${WORKDIR}/${P}" |
| 155 | |
203 | |
| 156 | } |
204 | } |
| 157 | |
205 | |