/[smecontribs]/common/cvs-import.sh
ViewVC logotype

Annotation of /common/cvs-import.sh

Parent Directory Parent Directory | Revision Log Revision Log | View Revision Graph Revision Graph


Revision 1.8 - (hide annotations) (download) (as text)
Thu Nov 3 22:47:20 2011 UTC (13 years ago) by slords
Branch: MAIN
Changes since 1.7: +17 -3 lines
Content type: application/x-sh
Support imports on branches

1 slords 1.1 #!/bin/bash
2     #
3     # Import a given src.rpm on a given branch
4     # Licensed under the new-BSD license (http://www.opensource.org/licenses/bsd-license.php)
5     # Copyright (C) 2004-2005 Red Hat, Inc.
6     # Copyright (C) 2005 Fedora Foundation
7     #
8 slords 1.8 # $Id: cvs-import.sh,v 1.9 2011/11/03 22:44:53 slords Exp $
9 slords 1.5
10     shopt -s nocasematch
11 slords 1.1
12     # Initial setup
13     CVSTREE=${CVSTREE:=extras}
14     TOPLEVEL=${TOPLEVEL:=rpms}
15    
16     # Check that we're being run from a good location
17     MYDIR=$(dirname $0)
18     if [ ! -f ${MYDIR}/CVS/Root ] ; then
19     echo "ERROR: You need to run this script from the 'common' checkout" >&2
20     exit 1
21     fi
22    
23     # use the CVSROOT from the checkout
24     CVSROOT=$(cat ${MYDIR}/CVS/Root)
25    
26 slords 1.8 # use the TAG from the checkout
27     TAG=$(sed -n 's@^T@@p' $(pwd)/CVS/Tag 2> /dev/null)
28    
29 slords 1.1 # We need a writable directory for temporary checkouts and CVS work
30     WORKDIR="/tmp"
31     if test -w $(pwd) ; then
32     WORKDIR="$(pwd)"
33     fi
34    
35 slords 1.5 [ -f branch ] && BRANCH=$(cat branch)
36    
37 slords 1.1 # short usage help
38     Usage() {
39     cat <<EOF
40     Usage:
41    
42 slords 1.8 $0 [-b <branch>] [-t <cvs tag/branch>] [-m <message>] <package>
43 slords 1.1
44     Imports a package into the cvs repository. Will use the following defaults:
45     CVSROOT = $CVSROOT
46     BRANCH = ${BRANCH:-devel}
47 slords 1.8 TAG = ${TAG}
48 slords 1.1
49     The package can also be imported on a PRE-EXISTING branch using the
50     "-b BRANCH" flag. This script can not create new branches for you.
51     EOF
52     exit 1
53     }
54    
55     # Parse arguments
56     MESSAGE=
57     while [ -n "$1" ] ; do
58     case "$1" in
59     # import the package on the given branch. If the branch does
60     # not exist, we will branch the HEAD and then we will perform
61     # the import
62 slords 1.8 -t | --tag )
63     shift
64     TAG="$1"
65     if [ -z "$TAG" ] ; then
66     echo "ERROR: --tag requires an argument"
67     Usage
68     exit -1
69     fi
70     ;;
71    
72 slords 1.1 -b | --branch )
73     shift
74     BRANCH="$1"
75     if [ -z "$BRANCH" ] ; then
76     echo "ERROR: --branch requires an argument"
77     Usage
78     exit -1
79     fi
80     # protect against moronisms
81     if [ "$BRANCH" = "HEAD" -o "$BRANCH" = "devel" ] ; then
82     BRANCH=
83     fi
84     ;;
85    
86     -m | --message )
87     shift
88     MESSAGE="$1"
89     ;;
90    
91     # the always helpful help message
92     -h | --help )
93     Usage
94     exit 0
95     ;;
96    
97     * )
98     if [ -n "$PACKAGE" ] ; then
99     echo "ERROR: Only one package at a time, please" >&2
100     echo "Already got request for $PACKAGE" >&2
101     exit -1
102     fi
103     PACKAGE="$1"
104     if [ ! -e "$PACKAGE" ] ; then
105     echo "ERROR: Package $PACKAGE does not exist"
106     Usage
107     exit -2
108     fi
109     NVR=$(rpm -qp --qf "%{NAME}-%{VERSION}-%{RELEASE}" $PACKAGE 2>/dev/null)
110     SRCRPM=$(rpm -qp --qf "%{SOURCERPM}" $PACKAGE 2>/dev/null)
111     if [ -z "$NVR" -o "$SRCRPM" != "(none)" ] ; then
112     echo "ERROR: Package $PACKAGE does not look like a source RPM package"
113     Usage
114     exit -3
115     fi
116     # extract NAME VERSION RELEASE, like a 31337 h@x0r
117     RELEASE=${NVR##*-}
118     NAME=${NVR%%-$RELEASE}
119     VERSION=${NAME##*-}
120     NAME=${NAME%%-$VERSION}
121     ;;
122     esac
123     shift
124     done
125    
126     if [ -z "$PACKAGE" ] ; then
127     echo "RPM source package required for import"
128     Usage
129     exit 0
130     fi
131    
132     # make sure the PACKAGE is an absolute path, as we'll be changing
133     # directories fairly often in this script
134     PACKAGE="$(cd $(dirname $PACKAGE) && pwd)/$(basename $PACKAGE)"
135    
136     # all well
137     export CVSROOT
138     CVS="cvs -d $CVSROOT"
139    
140     # Grab a temp dir
141     TMPDIR=$(mktemp -d $WORKDIR/tmpcvsXXXXXX)
142     trap "rm -rf $TMPDIR" 0 9 15
143    
144     # A cleanup function that can be called from random places
145     CleanUp() {
146     if [ -n "$LOGFILE" ] ; then
147     rm -f $LOGFILE
148     fi
149     cd ${WORKDIR}
150     rm -rf $TMPDIR
151     echo
152     }
153    
154     CreateBranchMakefile() {
155     cat >Makefile <<EOF
156     # Makefile for source rpm: $NAME
157     # \$Id\$
158     NAME := $NAME
159     SPECFILE = \$(firstword \$(wildcard *.spec))
160    
161     define find-makefile-common
162 slords 1.4 for d in common ../common ../../common ; do if [ -f \$\$d/Makefile.common ] ; then if [ -f \$\$d/CVS/Root -a -w \$\$/Makefile.common ] ; then cd \$\$d ; cvs -Q update ; fi ; echo "\$\$d/Makefile.common" ; break ; fi ; done
163 slords 1.1 endef
164    
165     MAKEFILE_COMMON := \$(shell \$(find-makefile-common))
166    
167     ifeq (\$(MAKEFILE_COMMON),)
168     # attept a checkout
169     define checkout-makefile-common
170 slords 1.4 test -f CVS/Root && { cvs -Q -d \$\$(cat CVS/Root) checkout common && echo "common/Makefile.common" ; } || { echo "ERROR: I can't figure out how to checkout the 'common' module." ; exit -1 ; } >&2
171 slords 1.1 endef
172    
173     MAKEFILE_COMMON := \$(shell \$(checkout-makefile-common))
174     endif
175    
176     include \$(MAKEFILE_COMMON)
177     EOF
178     }
179    
180     # Check out the existing module
181     cd $TMPDIR
182     echo "Checking out module: '$NAME'"
183 slords 1.8 $CVS -Q checkout ${TAG:+-r $TAG} $TOPLEVEL/$NAME || { echo "ERROR: \"$NAME\" module does not exist in cvs."; exit 1; }
184 slords 1.1
185     # this is our working directory
186     cd $TOPLEVEL/$NAME
187    
188     [ -d ${BRANCH} ] || { echo "ERROR: \"$NAME/$BRANCH\" does not exist!"; exit 1; }
189    
190     # check if we have imported this entry
191     TAG=$(echo "${NAME##[0-9]}-$VERSION-$RELEASE" | sed -e 's/[$,.:;@]/_/g')
192     LOG_ENTRY="$TAG:${BRANCH:-HEAD}:$(basename $PACKAGE)"
193 slords 1.5 if [ -n "$(grep ""^$LOG_ENTRY"" ./${BRANCH}/import.log 2>/dev/null)" ] ; then
194     echo "ERROR: $PACKAGE was already imported on branch ${BRANCH:-HEAD}"
195     CleanUp
196     exit -2
197     fi
198     # Check here as well because back in the old days we used to write it here
199 slords 1.1 if [ -n "$(grep ""^$LOG_ENTRY"" ./import.log 2>/dev/null)" ] ; then
200     echo "ERROR: $PACKAGE was already imported on branch ${BRANCH:-HEAD}"
201     CleanUp
202     exit -2
203     fi
204    
205     # Now the real import job is starting up
206     BRANCH="${BRANCH:-devel}"
207    
208     # Unpack the src.rpm
209     TMP2=$(mktemp -d tmpXXXXXX)
210     pushd $TMP2 >/dev/null
211     echo "Unpacking source package: $(basename $PACKAGE)..."
212     rpm2cpio $PACKAGE | cpio -id --quiet || {
213     echo "This package appears to be corrupt."
214     echo "Skipping import for: $PACKAGE"
215     CleanUp
216     exit -1
217     } >&2
218     popd >/dev/null
219    
220     # grab a list of files from the src.rpm
221     FILES=$(rpm -qpl $PACKAGE 2>/dev/null)
222    
223     # Remove the files that are no longer present
224     OLDFILES=$(find ${BRANCH} -maxdepth 1 -type f \
225     -not -name branch \
226 slords 1.5 -not -name import.log \
227 slords 1.1 -not -name sources \
228     -not -name Makefile \
229     -not -name .cvsignore \
230     -print )
231     for f in $OLDFILES ; do
232     if [ ! -f "$TMP2/$(basename $f)" ] ; then
233     cvs -Q delete -f $f
234     echo "R $(basename $f)"
235     fi
236     done
237    
238     # Add the new files
239     >${BRANCH}/sources.new
240     >${BRANCH}/.cvsignore.new
241    
242     # Now build a list of what needs to be uploaded
243     UPLOADFILES=
244     for _f in $FILES ; do
245     # just to be sure. Who knows when rpm will start returning
246     # pathnames in src.rpm queries
247     f=$(basename ${_f})
248    
249     add_file="yes"
250     file_md5=$(cd $TMP2 && md5sum $f)
251     file_size=$(stat --format="%s" $TMP2/$f)
252    
253     # if the file exists or it is listed in the sources we don't add it
254     if [ -f ${BRANCH}/$f ] ; then
255     add_file="no"
256     cmp -s $TMP2/$f ${BRANCH}/$f || echo "U $f"
257     elif [ -n "$(grep ""$file_md5"" ${BRANCH}/sources 2>/dev/null)" ] ; then
258     add_file="no"
259     # keep it around...
260     echo "$file_md5" >> ${BRANCH}/sources.new
261     echo "$f" >> ${BRANCH}/.cvsignore.new
262     fi
263     # we catch changed patches this way...
264     mv -f $TMP2/$f ${BRANCH}/$f
265     # we need to add this file
266     pushd ${BRANCH} >/dev/null
267     if [ "$add_file" = "yes" ] ; then
268     case $f in
269 slords 1.5 *.tar | *gz | *.bz2 | *.lzma | *.Z | *.zip | \
270     *.ttf | *.bin | *.tbz | *.tbz2 | *.pdf | *.rpm | \
271     *.jar | *.war | *.db | *.cpio | *.jisp | *.egg | *.gem )
272 slords 1.1 UPLOADFILES="$UPLOADFILES $f"
273     if [ -n "$(grep $f sources 2>/dev/null)" ] ; then
274     # this file existed before with a different md5sum
275     echo "N $f"
276     else
277     echo "L $f"
278     fi
279     ;;
280     *)
281     cvs -Q add -ko $f
282     echo "A $f"
283     ;;
284     esac
285     fi
286     popd >/dev/null
287     done
288     # upload the tarballs
289     pushd ${BRANCH} >/dev/null
290     # Re-add the branch Makefile (during resurrection of dead packages).
291     if [ ! -f Makefile ] ; then
292     CreateBranchMakefile
293     cvs -Q add Makefile
294     fi
295     rm -f sources && mv sources.new sources
296     rm -f .cvsignore && mv .cvsignore.new .cvsignore
297     if [ -n "$UPLOADFILES" ] ; then
298     make upload FILES="$UPLOADFILES" || {
299     echo "ERROR: Uploading the source tarballs failed!"
300     exit 9
301     }
302     fi
303     popd >/dev/null
304    
305     # We no longer need this
306     rm -rf $TMP2
307    
308     # setup finished
309 slords 1.5 [ -f ./${BRANCH}/import.log ] || $(touch ./${BRANCH}/import.log; cvs add ./${BRANCH}/import.log)
310     echo "$LOG_ENTRY:$(date +%s)" >> ./${BRANCH}/import.log
311 slords 1.1
312     echo "======================================================================="
313     cvs -Q diff -u
314     echo "======================================================================="
315     echo "Please check the above cvs diff."
316     echo "If you want to make any changes before committing, please press Ctrl-C."
317     echo "Otherwise press Enter to proceed to commit."
318 slords 1.3 read
319 slords 1.1
320     cvs -Q update && \
321     echo "cvs commit..." && \
322 slords 1.5 cvs -Q commit ${MESSAGE:+-m "$MESSAGE"} && echo "Commit Complete" && \
323     cd ${BRANCH} && make tag && echo "Tagging '${TAG}' complete."
324 slords 1.1
325     # Clean up
326     CleanUp

admin@koozali.org
ViewVC Help
Powered by ViewVC 1.2.1 RSS 2.0 feed