LogoopenSUSE Build Service > Projects
Sign Up | Log In

View File upstream-collect.sh of Package translation-update-upstream (Project openSUSE:11.4)

#!/bin/bash

# This program collects all upstream translations defined in
# configuration and merges them together.

# If you want to use po files for completing of translations, you can remove --no-fuzzy-matching.
# It will run much slower, but you could start with fuzzy matches.

WORK_DIR=$PWD
DEBUG=false

set -o errexit
shopt -s nullglob

source ${0%.sh}.conf

function rpmprep {
    RPMDIR=$HOME/.var.rpmpatch$$
    rm -rf BUILD $HOME/.var.rpmpatch$$
    trap "rm -rf $RPMDIR" 0
    mkdir -p BUILD $RPMDIR
    # Add "%BUILD_ORIG 1" to support original source translation:
    cat >$RPMDIR/macros <<EOF
%_sourcedir      $PWD
%_builddir       $PWD/BUILD
EOF

    # remove <RELEASE> tag from Release.
    sed -i '/^Release:/s/[<>]//g' *.spec
    eval rpmbuild --macros=/usr/lib/rpm/macros:/usr/lib/rpm/suse_macros:/usr/lib/rpm/platform/$(uname -i)-linux/macros:/etc/rpm/\\\*:$RPMDIR/macros --nodeps -bp ${*:-*.spec}
    rm -rf $RPMDIR
    trap - 0
}

ONLY_PACKAGE=
FULL_PROCESS=true
SNAPSHOT=$(LC_ALL=C LANG=C date +%Y%m%d)
case $1 in
    --help )
	# "only_new" is tricky: Processing new is the default. "only_new" has no match => only_new.
	echo "Usage: $0 [ package | only_new ]"
	exit
	;;
    # no arguments: process everything
    "" )
	;;
    * )
	ONLY_PACKAGE="$1"
	FULL_PROCESS=false
	;;
esac

rm -rf UPSTREAM
mkdir UPSTREAM
if ! test -d STAMPS ; then
    mkdir OSC PACKAGES UPDATE STAMPS pot
    rm -f upstream-collect.log
fi

# wd may contain ":" in the name, use ~/ instead:
mkdir -p ~/.upstream-collect.tmp
cat >~/.upstream-collect.tmp/translation-update-upstream <<EOF
#!/bin/sh
echo "Dummy translation-update-upstream for upstream-collect.sh. Skipping merge of old translations."
echo \${3:-intltool-update --gettext-package=\${2:-\$T_U_U_DOMAIN} --pot} >\${1:-po}/.translation-update-upstream-implemented
EOF
chmod +x ~/.upstream-collect.tmp/translation-update-upstream

# executable flag does not survive some build systems
chmod +x msgheadermerge msgheadermerge-compose msgheadermerge-parse upstream-collect.sh create-tlst-step*.sh

# Strings in installed instance of gnome-patch-translation may interfere
# with upstream-collect.sh. Use of dummies allows to import upstream
# strings, that are part of openSUSE patches.
for FILE in gnome-patch-translation-prepare gnome-patch-translation-update ; do
    cat >~/.upstream-collect.tmp/$FILE <<EOF
#!/bin/sh
echo "Dummy $FILE for upstream-collect.sh. Skipping gnome-patch-translation."
mkdir -p gnome-patch-translation
EOF
    chmod +x ~/.upstream-collect.tmp/$FILE
done

export PATH=~/.upstream-collect.tmp:$PATH

if ! $FULL_PROCESS ; then
    # more tarballs are available => use the latest one
    # FIXME: Fix 20090213.10 < 20090213.9
    # (but it should not happen for people who update and submit)
    for ARCHIVE_ in translation-update-upstream-*.tar.bz2 ; do
	ARCHIVE=$ARCHIVE_
    done
    if ! test -d UPDATE_OLD ; then
	mkdir UPDATE_OLD
	cd UPDATE_OLD
	tar -jxf ../$ARCHIVE
	# If it is not a full process, increment only release
	# SNAPSHOT 20090213 -> 20090213.1, 20090213.1 -> 20090213.2
    fi
    SNAPSHOT=${ARCHIVE#translation-update-upstream-}
    SNAPSHOT=${SNAPSHOT%.tar.bz2}
    SNAPSHOT_PART1=${SNAPSHOT%.*}
    SNAPSHOT_PART2=${SNAPSHOT#*.}
    if test "$SNAPSHOT_PART1" = "$SNAPSHOT" ; then
	SNAPSHOT_PART2=1
    else
	let SNAPSHOT_PART2++
    fi
    SNAPSHOT=$SNAPSHOT_PART1.$SNAPSHOT_PART2
    cd ..
fi

SERIAL=0
for TLST in *.tlst ; do
    exec <$WORK_DIR/$TLST

    while read PACKAGE DOMAIN METHOD REPO DIR BRANCH MANDATORY ; do

	# Continue for empty lines and comments
	if test "${PACKAGE###}" != "$PACKAGE" ; then
	    continue
	fi
	if test -z "$PACKAGE" ; then
	    continue
	fi
	if test "$MANDATORY" = "mandatory" ; then
	    MANDATORY=true
	else
	    MANDATORY=false
	fi

	echo
	echo "$(tput setf 3)Processing: package=$PACKAGE gettext-package=$DOMAIN method=$METHOD repository=$REPO directory=$DIR branch=${BRANCH:-(default)} mandatory=$MANDATORY$(tput init)"

	# NOTE: Force a limitation: tlst rules for one package must be placed on contiguous line sequence
	if ! $DEBUG ; then
	    if test "$OLD_PACKAGE" != "$PACKAGE" ; then
		if test -n "$RPMPKGDIR" ; then
		    rm -rf $RPMPKGDIR $WORK_DIR/STAMPS/$PACKAGE/.builddir_ok
		fi
	    fi
	    OLD_PACKAGE=$PACKAGE
	fi

	if test -d $WORK_DIR/STAMPS/$PACKAGE/$DOMAIN/$METHOD/${REPO//[\/:.]/_}/$DIR/${BRANCH:-__HEAD__} ; then
	    echo "   Already successfully processed. Skipping..."
	    continue
	fi

	if test -n "$ONLY_PACKAGE" ; then
	    if test "$ONLY_PACKAGE" != "$PACKAGE" ; then
		if test -d $WORK_DIR/UPDATE_OLD/po/$DOMAIN ; then
		    if test -d $WORK_DIR/UPDATE/po/$DOMAIN ; then
			echo "Should not happen. Internal error."
			exit 255
		    else
			echo "   Not scheduled to process. Recycling old update..."
			mkdir -p $WORK_DIR/UPDATE/po
			 mv $WORK_DIR/UPDATE_OLD/po/$DOMAIN $WORK_DIR/UPDATE/po/
		    fi
		else
		    if test -d $WORK_DIR/UPDATE/po/$DOMAIN ; then
			echo "   Already recycled old update..."
		    else
			echo "   Not scheduled to process. No update available..."
		    fi
		fi
		mkdir -p $WORK_DIR/STAMPS/$PACKAGE/$DOMAIN/$METHOD/${REPO//[\/:.]/_}/$DIR/${BRANCH:-__HEAD__}
		touch $WORK_DIR/STAMPS/$PACKAGE/.builddir_ok
		continue
	    fi
	fi

	cd $WORK_DIR/OSC

	RPMPKGDIR=$(echo $WORK_DIR/PACKAGES/$PACKAGE)

	if ! test -f $WORK_DIR/STAMPS/$PACKAGE/.builddir_ok ; then
	    if ! test -d "$RPMPKGDIR" ; then
		for OSC_REPOSITORY in "${OSC_REPOSITORIES[@]}" ; do
		    echo "Trying to check-out PACKAGES $PACKAGE from $OSC_REPOSITORY..."
		    # FIXME: When obs-service-download_url appears in Factory, use --source-service-files
		    if osc ${OSC_APIURL:+--apiurl=$OSC_APIURL} checkout --server-side-source-service-files --expand-link $OSC_REPOSITORY $PACKAGE >gnome-patch-translation-collect-tmp.log 2>&1 ; then
			mv $OSC_REPOSITORY/$PACKAGE $WORK_DIR/PACKAGES/
			for FILE in $WORK_DIR/PACKAGES/$PACKAGE/_service\:download_url\:* ; do
				mv "$FILE" "${FILE/_service:download_url:/}"
			done
			break
		    fi
		    if ! grep -q "HTTP Error 404" gnome-patch-translation-collect-tmp.log ; then
			cat gnome-patch-translation-collect-tmp.log
			rm gnome-patch-translation-collect-tmp.log
			echo "ERROR: Checkout failed!"
			exit 1
		    fi
		done
		rm gnome-patch-translation-collect-tmp.log
	    else
		rm -rf "$RPMPKGDIR" $WORK_DIR/STAMPS/$PACKAGE
		echo "$(tput setf 4)Removed possibly incorrect temporary files from previous runs. Please re-run $0 now.$(tput init)"
		exit 1
	    fi
	    RPMPKGDIR=$(echo $WORK_DIR/PACKAGES/$PACKAGE)
	    cd $RPMPKGDIR
	    T_U_U_DOMAIN=$DOMAIN rpmprep $PACKAGE.spec
	else
	# During processing, builddir may contain incomplete po files:
	    rm $WORK_DIR/STAMPS/$PACKAGE/.builddir_ok
	fi
	REPODIR=$DIR
	RPMPODIR=$(echo $RPMPKGDIR/BUILD/*/${DIR#*/})

	if test -f $WORK_DIR/${TLST%.tlst}.hook ; then
	    source $WORK_DIR/${TLST%.tlst}.hook
	fi

	cd $RPMPODIR
	if test -f .translation-update-upstream-implemented ; then
	    if bash ./.translation-update-upstream-implemented ; then
		cp -a $DOMAIN.pot $WORK_DIR/pot/
	    else
		# translation-update-upstream is implemented but fails:
		if test -f $DOMAIN.pot ; then
		    echo >>$WORK_DIR/upstream-collect.log "package=$PACKAGE gettext-package=$DOMAIN method=$METHOD repository=$REPO directory=$DIR branch=${BRANCH:(default)}: pot file update error, continuing with original $DOMAIN.pot"
		    cp -a $DOMAIN.pot $WORK_DIR/pot/
		else
		    echo >>$WORK_DIR/upstream-collect.log "package=$PACKAGE gettext-package=$DOMAIN method=$METHOD repository=$REPO directory=$DIR branch=${BRANCH:(default)}: pot file update error, no way to update"
		    mkdir -p $WORK_DIR/STAMPS/$PACKAGE/$DOMAIN/$METHOD/${REPO//[\/:.]/_}/$REPODIR/${BRANCH:-__HEAD__}
		    continue
		fi
	    fi
	else
	    echo "$RPMPODIR: Missing or incorrect translation-update-upstream in the spec file."
	    # translation-update-upstream is implemented, try the default:
	    if intltool-update --gettext-package=$DOMAIN --pot ; then
		echo >>$WORK_DIR/upstream-collect.log "package=$PACKAGE gettext-package=$DOMAIN method=$METHOD repository=$REPO directory=$DIR branch=${BRANCH:(default)}: packaging error, package does not call translation-update-upstream properly"
		cp -a $DOMAIN.pot $WORK_DIR/pot/
	    else
		echo >>$WORK_DIR/upstream-collect.log "package=$PACKAGE gettext-package=$DOMAIN method=$METHOD repository=$REPO directory=$DIR branch=${BRANCH:(default)}: packaging error, package does not call translation-update-upstream properly and intltool-update fails, no way to update"
		mkdir -p $WORK_DIR/STAMPS/$PACKAGE/$DOMAIN/$METHOD/${REPO//[\/:.]/_}/$REPODIR/${BRANCH:-__HEAD__}
		continue
	    fi
	fi

	cd $WORK_DIR/UPSTREAM
	let SERIAL++ || :
	mkdir $SERIAL
	cd $SERIAL

	case "$METHOD" in
	    cvs )
		cvs -z3 -d:pserver:anoncvs@$REPO co $REPODIR $BRANCH
		cd $REPODIR
		;;
	    svn )
		if test -z "$BRANCH" ; then
		    svn co $REPO/${REPODIR%%/*}/trunk/${REPODIR#*/}
		else
		    svn co $REPO/${REPODIR%%/*}/branches/$BRANCH/${REPODIR#*/}
		fi
		cd ${REPODIR##*/}
		;;
	    git )
		if ! test -d $WORK_DIR/GIT/${REPO//[\/:.]/_} ; then
		    mkdir -p $WORK_DIR/GIT/${REPO//[\/:.]/_}
		    cd $WORK_DIR/GIT/${REPO//[\/:.]/_}
		    git clone $REPO
		    cd $OLDPWD
		fi
		cp -a $WORK_DIR/GIT/${REPO//[\/:.]/_}/* .
		if test -n "$BRANCH" ; then
		    cd *
		    git checkout remotes/origin/$BRANCH
		    cd $OLDPWD
		fi
		cd $REPODIR
		;;
	    # Web-based Git repository viewer makes possible to download particular file.
	    cgit )
		# Some tricks to be able to recycle git:// URI
		CGIT_URI=$REPO
		CGIT_URI=${CGIT_URI/git:\/\/anongit./http://cgit.}
		CGIT_URI=${CGIT_URI/git:\/\//http://}
		CGIT_BRANCH=${BRANCH:+?id=$BRANCH}
		CGIT_SERVER=${CGIT_URI#http://}
		CGIT_SERVER=${CGIT_SERVER%%/*}
		curl $CGIT_URI/tree/${REPODIR#*/}$CGIT_BRANCH | sed -n 's:^.*class='\''ls-blob[^'\'']*'\'' href='\''\([^'\'']*\)'\''.*$:\1:p' |
		    while read ; do
			wget -N http://$CGIT_SERVER${REPLY/\/tree\///plain/}
		    done
		;;
	    # standard http directory with po files (BRANCH is not supported)
	    http )
		wget -N -r --no-parent --level=1 http://$REPO/$REPODIR/$DIR
		cd $REPO/$REPODIR/$DIR
		;;
	    # GNOME Translation project l10n directory
	    gtp )
		GTP_NAME_BASE=${REPODIR%%/*}
		# Projects with multiple domains have custom handling in GTP.
		case $DOMAIN in
		    gimp20-libgimp ) GTP_NAME_BASE=gimp-libgimp ;;
		    gimp20-python ) GTP_NAME_BASE=gimp-python ;;
		    gimp20-script-fu ) GTP_NAME_BASE=gimp-script-fu ;;
		    gimp20-std-plug-ins ) GTP_NAME_BASE=gimp-plug-ins ;;
		    gimp20-tags ) GTP_NAME_BASE=gimp-tags ;;
		    gimp20-tips ) GTP_NAME_BASE=gimp-tips ;;
		    gnumeric-functions ) GTP_NAME_BASE=gnumeric-functions ;;
		    gtk20-properties ) GTP_NAME_BASE=gtk+-properties ;;
		    libgweather-locations ) GTP_NAME_BASE=locations ;;
		esac
		curl http://$REPO/${REPODIR%%/*}.${BRANCH:-master}/ | sed -n 's:^.*href="\([^"]*\.po\)".*$:\1:p' |
		    while read ; do
			case $REPLY in
			    $GTP_NAME_BASE.${BRANCH:-master}.*)
				wget -N http://$REPO/${REPODIR%%/*}.${BRANCH:-master}/$REPLY
				mv $REPLY ${REPLY#$GTP_NAME_BASE.${BRANCH:-master}.}
				;;
			esac
		    done
		;;
	    tbz )
		wget -N $REPO
		tar -jxf ${REPO##*/}
		cd $REPODIR
		;;
	    tgz )
		wget -N $REPO
		tar -zxf ${REPO##*/}
		cd $REPODIR
		;;
	    lcn )
		if ! test -d $WORK_DIR/LCN-${BRANCH:-trunk} ; then
		    mkdir  $WORK_DIR/LCN-${BRANCH:-trunk}
		    cd  $WORK_DIR/LCN-${BRANCH:-trunk}
		    if test "${BRANCH:-trunk}" = "trunk" ; then
			BRANCH_PATH="${BRANCH:-trunk}"
		    else
			BRANCH_PATH="branches/$BRANCH"
		    fi
		    svn co https://svn.berlios.de/svnroot/repos/opensuse-i18n/$BRANCH_PATH/lcn
		    for PO in lcn/*/po/*.po ; do
			LCN_LANG=${PO%/*}
			LCN_LANG=${LCN_LANG#lcn/}
			LCN_LANG=${LCN_LANG%%/*}
			LCN_DOMAIN=${PO##*/}
			LCN_DOMAIN=${LCN_DOMAIN%.$LCN_LANG.po}
			mkdir -p data/$LCN_DOMAIN
			ln $PO data/$LCN_DOMAIN/$LCN_LANG.po
		    done
		    cd -
		fi
		cp -a $WORK_DIR/LCN-${BRANCH:-trunk}/data/${REPODIR%/po} .
		cd ${REPODIR%/po}
		;;
	    * )
		echo "$PACKAGE: Unknown update method $METHOD"
		exit 1
		;;
	esac

#
# Files created in this section:
#
# upstream dir:
# foo-backport.po: raw upstream translation backported to the downstream
# foo-uheader.po: header with the upstream date from the branch modified as last
# foo-upstream.po: backport + updates from all upstreams processed before (date from the branch modified as last)
# foo-allfz.po: downstream + joined updates. Strings that were modified create fuzzy multi-match.
# foo-all.po: downstream + joined updates. Strings that were modified use the last processed instance.
# foo-fixes.po: Strings that are different while comparing downstream and joined updates.
# foo-additions.po: Strings that are newly introduced in joined updates while comparing with downstream.
# foo-header.po: header with the lastest date, either upstream date from the branch modified as last or the downstream date
# foo-fixes-clean.po: fixes with a nice header.
#
# downstream dir:
# foo-downstream.po: cleaned and complete downstream po file
# foo-updatesraw.po: fixes + additions in a single file, raw form
# foo-updates.po: fixes + additions in a single file, clean form with an useful header (this file will be copied to UPDATE/)
#
	for PO in *.po ; do
	    if $MANDATORY ; then
		# Mandatory sources: copy the whole source to the mandatory po directory. Strings must not be skipped.
		mkdir -p $WORK_DIR/UPDATE/po-mandatory/$DOMAIN
		if test -f $WORK_DIR/UPDATE/po-mandatory/$DOMAIN/$PO ; then
		    msgcat --use-first $PO $WORK_DIR/UPDATE/po-mandatory/$DOMAIN/$PO -o $WORK_DIR/UPDATE/po-mandatory/$DOMAIN/$PO~
		    mv $WORK_DIR/UPDATE/po-mandatory/$DOMAIN/$PO~ $WORK_DIR/UPDATE/po-mandatory/$DOMAIN/$PO
		else
		    msgcat $PO -o $WORK_DIR/UPDATE/po-mandatory/$DOMAIN/$PO
		fi
	    else
		# step 0: Merge new po file into old project. Removes unused (too new) translations.
		if ! msgmerge --no-fuzzy-matching $PO $RPMPODIR/$DOMAIN.pot -o ${PO%.po}-backport.po ; then
		    echo >>$WORK_DIR/upstream-collect.log "package=$PACKAGE gettext-package=$DOMAIN method=$METHOD repository=$REPO directory=$DIR branch=${BRANCH:(default)} po=$PO: msgmerge error"
		    continue
		fi
		if test -f $RPMPODIR/$PO ; then
		# step 1: Clean the RPM po file to be safe.
		    if ! msgmerge --no-fuzzy-matching $RPMPODIR/$PO $RPMPODIR/$DOMAIN.pot -o $RPMPODIR/${PO%.po}-downstream.po ; then
			echo >>$WORK_DIR/upstream-collect.log "package=$PACKAGE gettext-package=$DOMAIN repository=$REPO directory=$RPMPODIR branch=${BRANCH:(default)} po=$PO: package msgmerge error"
			# Failed initial msgmerge is fatal. There is no way to update. Build may fail.
			continue
		    fi
		    # Do the magic:
		    # step 2: Merge new upstream po and previous upstream updates to RPM po (if any).
		    OLD_UPDATE=false
		    if test -f $WORK_DIR/UPDATE/po/$DOMAIN/$PO ; then
			if $WORK_DIR/msgheadermerge $WORK_DIR/UPDATE/po/$DOMAIN/$PO $PO ${PO%.po}-uheader.po --mergemode --continue ; then
			    echo >>$WORK_DIR/upstream-collect.log "package=$PACKAGE gettext-package=$DOMAIN repository=$REPO directory=$RPMPODIR branch=${BRANCH:(default)} po=$PO: old po file, skipping fixes"
			    OLD_UPDATE=true
			fi
			msgcat --force-po --use-first ${PO%.po}-uheader.po ${PO%.po}-backport.po $WORK_DIR/UPDATE/po/$DOMAIN/$PO -o ${PO%.po}-upstream.po
		    else
			cp -a ${PO%.po}-backport.po ${PO%.po}-upstream.po
		    fi
		    # step 3: Join both translations, without --use-first string changes will disappear as fuzzy.
		    msgcat --force-po ${PO%.po}-upstream.po $RPMPODIR/${PO%.po}-downstream.po -o ${PO%.po}-allfz.po
		    msgcat --use-first --force-po ${PO%.po}-upstream.po $RPMPODIR/${PO%.po}-downstream.po -o ${PO%.po}-all.po
		    # step 4: Find string fixes (existed before, now different).
		    msgcat --force-po --unique ${PO%.po}-all.po ${PO%.po}-allfz.po -o ${PO%.po}-fixes.po
		    # step 5: Find newly translated strings (translation removal is not supported).
		    msgcat --force-po --unique $RPMPODIR/${PO%.po}-downstream.po ${PO%.po}-all.po -o ${PO%.po}-additions.po
		    # step 6: Join both to collect all known fixes.
		    if $OLD_UPDATE ; then
			# If the update has an old time stamp, don't include fixes. Use just additions.
			msgcat ${PO%.po}-additions.po -o $RPMPODIR/${PO%.po}-updatesraw.po
		    else
			msgcat ${PO%.po}-fixes.po ${PO%.po}-additions.po -o $RPMPODIR/${PO%.po}-updatesraw.po
		    fi
		    # Are there any updated? If no, game over.
		    if test -f $RPMPODIR/${PO%.po}-updatesraw.po ; then
			# step 7: Compose the best po file header.
			$WORK_DIR/msgheadermerge $RPMPODIR/$PO ${PO%.po}-upstream.po ${PO%.po}-header.po --newdate
			# step 8: And yet another ugly game to get rid commented out garbage.
			sed '/#~/d' <$RPMPODIR/${PO%.po}-updatesraw.po >$RPMPODIR/${PO%.po}-updates.po~
			# step 9: Merge correct header to the updates file.
			msgcat --no-location --use-first ${PO%.po}-header.po $RPMPODIR/${PO%.po}-updates.po~ -o $RPMPODIR/${PO%.po}-updates.po
		    fi
		    # step 10: Prepare texts for review. We created them in previous steps, but files need cleanup.
		    if test -f ${PO%.po}-header.po ; then
			if test -f ${PO%.po}-additions.po ; then
			    sed -i '/#~/d' ${PO%.po}-additions.po
			    mkdir -p $WORK_DIR/po-review/${PO%.po}/additions
			    msgcat --use-first ${PO%.po}-header.po ${PO%.po}-additions.po -o $WORK_DIR/po-review/${PO%.po}/additions/$DOMAIN.po
			    rmdir --ignore-fail-on-non-empty --parents $WORK_DIR/po-review/${PO%.po}/additions
			fi
			if test -f ${PO%.po}-fixes.po ; then
			    sed -i '/#~/d' ${PO%.po}-fixes.po
			    msgcat --use-first ${PO%.po}-header.po ${PO%.po}-fixes.po -o ${PO%.po}-fixes-clean.po
			fi
			if test -f ${PO%.po}-fixes-clean.po ; then
			    msgmerge ${PO%.po}-allfz.po ${PO%.po}-fixes-clean.po -o ${PO%.po}-fixes-review.po~
			    sed -i '/#~/d' ${PO%.po}-fixes-review.po~
			    msgcat ${PO%.po}-fixes-review.po~ -o ${PO%.po}-fixes-review.po
			    if $OLD_UPDATE ; then
				mkdir -p $WORK_DIR/po-review/${PO%.po}/excluded-changes/${REPO//[\/:.]/_}/$REPODIR
				cp -a ${PO%.po}-fixes-clean.po $WORK_DIR/po-review/${PO%.po}/excluded-changes/${REPO//[\/:.]/_}/$REPODIR/$DOMAIN.po
				cp -a ${PO%.po}-fixes-review.po $WORK_DIR/po-review/${PO%.po}/excluded-changes/${REPO//[\/:.]/_}/$REPODIR/$DOMAIN-review.po
				rmdir --ignore-fail-on-non-empty --parents $WORK_DIR/po-review/${PO%.po}/excluded-changes/${REPO//[\/:.]/_}/$REPODIR
				if test -d $WORK_DIR/po-review/${PO%.po}/excluded-changes ; then
				    echo -e "Excluded changes contains changes introduced by upstream po files with\ntime stamp older than our package." >$WORK_DIR/po-review/${PO%.po}/excluded-changes/README
				fi
			    else
				mkdir -p $WORK_DIR/po-review/${PO%.po}/changes
				cp -a ${PO%.po}-fixes-clean.po $WORK_DIR/po-review/${PO%.po}/changes/$DOMAIN.po
				cp -a ${PO%.po}-fixes-review.po $WORK_DIR/po-review/${PO%.po}/changes/$DOMAIN-review.po
				rmdir --ignore-fail-on-non-empty --parents $WORK_DIR/po-review/${PO%.po}/changes
			    fi
			fi
		    fi
		else
		    # If backport was empty, no file was generated.
		    if test -f ${PO%.po}-backport.po ; then
			# step 1: Merge new po and previous updates (if any).
			sed -i '/#~/d' ${PO%.po}-backport.po
			if test -f $RPMPODIR/${PO%.po}-updates.po ; then
			    if ! msgcat --force-po --use-first ${PO%.po}-backport.po $RPMPODIR/${PO%.po}-updates.po -o $RPMPODIR/${PO%.po}-updates.po~ ; then
				echo >>$WORK_DIR/upstream-collect.log "package=$PACKAGE gettext-package=$DOMAIN method=$METHOD repository=$REPO directory=$DIR branch=${BRANCH:(default)} po=$PO: msgcat error"
				continue
			    fi
			    mv $RPMPODIR/${PO%.po}-updates.po~ $RPMPODIR/${PO%.po}-updates.po
			else
			    # To get surely a valid po file, use msgcat instead of cp.
			    if ! msgcat ${PO%.po}-backport.po -o $RPMPODIR/${PO%.po}-updates.po ; then
				echo >>$WORK_DIR/upstream-collect.log "package=$PACKAGE gettext-package=$DOMAIN method=$METHOD repository=$REPO directory=$DIR branch=${BRANCH:(default)} po=$PO: msgcat error"
				continue
			    fi
			fi
			# step 2: Prepare texts for review.
			mkdir -p $WORK_DIR/po-review/${PO%.po}/new-files
			cp -a $RPMPODIR/${PO%.po}-updates.po $WORK_DIR/po-review/${PO%.po}/new-files/$DOMAIN.po
			rmdir --ignore-fail-on-non-empty --parents $WORK_DIR/po-review/${PO%.po}/new-files
		    fi
		fi
	    fi
	done

	mkdir -p $WORK_DIR/UPDATE/po/$DOMAIN
	cd $RPMPODIR
	for POX in *-updates.po ; do
	    PO=${POX/-updates/}
	    cp -a $POX $WORK_DIR/UPDATE/po/$DOMAIN/$PO
	done

	mkdir -p $WORK_DIR/STAMPS/$PACKAGE/$DOMAIN/$METHOD/${REPO//[\/:.]/_}/$DIR/${BRANCH:-__HEAD__}
	touch $WORK_DIR/STAMPS/$PACKAGE/.builddir_ok

	if ! $DEBUG ; then
	    rm -rf $WORK_DIR/UPSTREAM/$SERIAL
	fi

    done

done

if ! $DEBUG ; then
    if test -n "$RPMPKGDIR" ; then
	rm -rf $RPMPKGDIR $WORK_DIR/STAMPS/$PACKAGE/.builddir_ok
    fi
fi

cd $WORK_DIR/UPDATE
if test -d po ; then
    tar -j -c -f $WORK_DIR/translation-update-upstream-$SNAPSHOT.tar.bz2 po
fi
if test -d po-mandatory ; then
    tar -j -c -f $WORK_DIR/translation-update-mandatory-$SNAPSHOT.tar.bz2 po-mandatory
fi

cd $WORK_DIR
if ! $DEBUG ; then
    rm -rf UPSTREAM OSC PACKAGES UPDATE UPDATE_OLD STAMPS BIN
fi
rm -rf ~/.upstream-collect.tmp

echo ""
echo "$(tput setf 2)Done. Please update version date in the spec file.$(tput init)"