Here are the steps to follow to create a new pixman release:

1) Ensure that there are no uncommitted changes or unpushed commits,
   and that you are up to date with the latest commits in the central
   repository. Here are a couple of useful commands:

	git diff			(no output)
	
	git status			(should report "nothing to commit")

	git log master...origin		(no output; note: *3* dots)

2) Increment pixman_(major|minor|micro) in configure.ac according to
   the directions in that file.

3) Run 

	make PREV=<last version> release-check

   and fix things until it passes. If your freedesktop username is
   different from your local username, then also set the variable
   USER on the commandline.

   A very useful thing to do is to run the cairo test suite
   against pixman. This can be done by running the following
   commands in the "test" directory of the latest cairo release:

	tar xzf cairo-X.Y.Z.tar.gz
	cd cairo
	CAIRO_TEST_TARGET=image make test

4) Use "git commit" to record any changes made in steps 2 and 3.

5) Generate and publish the tar files by running 

	make PREV=<last version> GPGKEY=<your gpg key id> release-publish

6) Run 

	make release-publish-message

   to generate a draft release announcement. Edit it as appropriate and
   send it to 

	cairo-announce@cairographics.org

   and 

	xorg-announce@lists.freedesktop.org


7) Increment pixman_micro to the next larger (odd) number in
   configure.ac. Commit this change, and push all commits created
   during this process using

	git push
	git push --tags

   You must use "--tags" here; otherwise the new tag will not
   be pushed out. This is because technobabble.

