[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

debian/rules and "git rev-list" in a subshell - Automatically retrieve upstream GIT repository using ISO date to package source tarball



Hi list

I'm revisiting one of my first Debian packages, "cjk".
In debian/rules I have created a "get-orig-source" target that clones
the upstream GIT repository and rolls it back up to the ISO date that
is found in the Debian package version in debian/changelog (then
converted to UNIX timestamp).

But a particular line in my old debian/rules doesn't seem to work
anymore, and I can't find why not.  I have an ugly hack around it, but
I'm trying to understand why my original code fails.
At the end of the mail you will find the complete code in
debian/rules.  Here's a minimal example:

upstream_version := cjk-4.8.2+git20090105
unixdate := 1231196400

get-orig-source:
	git clone git://git.sv.gnu.org/cjk.git cjk-$(upstream_version)
	cd cjk-$(upstream_version) && git reset --hard $(shell cd
cjk-$(upstream_version) && git rev-list --all -n 1
--before=$(unixdate))

In other words, I clone the GIT repository, and then want to revert it
to a somewhat older version, based on the UNIX timestamp.  I open a
subshell to get the hash of the latest GIT commit before the UNIX
timestamp.

I don't see anything wrong with the line above, but now I just get an
empty string after "--hard".  My /bin/sh is linked to `dash'.

The weird thing is that I can make it work with an ugly hack using `xargs':

	cd cjk-$(upstream_version) && echo `git rev-list --all -n 1
--before=$(unixdate)` | xargs git reset --hard


Do you have any idea why the first command doesn't work as I expect?
Your input is most welcome.


Here is a more elaborate piece of the code:

SHELL = /bin/sh

# Stuff for get-orig-source.
upstream_version := $(shell dpkg-parsechangelog | sed -ne 's/^Version:
\(.*\)-.*/\1/p')
isodate := $(shell dpkg-parsechangelog | sed -ne
's/^Version.*git\(.*\)-.*/\1/p')
unixdate := $(shell date -d $(isodate) +%s)
# Add 24 hours to the Unix time.
unixdate := $(shell expr $(unixdate) + 86400 )


get-orig-source:
	# Cleaning
	rm -rf cjk-$(upstream_version)
	rm -f ../cjk_$(upstream_version).orig.tar.gz

	# Download the latest GIT version and downgrade it to $(isodate).
	git clone git://git.sv.gnu.org/cjk.git cjk-$(upstream_version)

#	cd cjk-$(upstream_version) && git reset --hard $(shell cd
cjk-$(upstream_version) && git rev-list --all -n 1
--before=$(unixdate))
#unixdate = 1231196400
#hash of GIT commit = 1d3f869e61dc5139d16596075a9e2c4e9a2f503f
# Ugly hack with "xargs" that works.
	cd cjk-$(upstream_version) && echo `git rev-list --all -n 1
--before=$(unixdate)` | xargs git reset --hard

	# Make a pristine package.
# --no-name/-n is important because it won't save the timestamp in the
# 5th to 8th byte of the gzip.
	cd cjk-$(upstream_version) && git archive --format=tar
--prefix=cjk-$(upstream_version)/ master | gzip -9 --no-name >
../../tarballs/cjk_$(upstream_version).orig.tar.gz

	# Clean again, because we use svn-buildpackage afterwards.
	rm -rf cjk-$(upstream_version)



BR


-- 
Danai


Reply to: