# To make real stable releases or devel snapshots, use either:
# 	make release-check
# or	make release-publish

TAR_OPTIONS = --owner=0 --group=0

RELEASE_UPLOAD_HOST = clutter-project.org
RELEASE_UPLOAD_USER = clutter
RELEASE_UPLOAD_DIR  = $(RELEASE_UPLOAD_USER)@$(RELEASE_UPLOAD_HOST):~$(RELEASE_UPLOAD_USER)/upload-source

RELEASE_URL_BASE = http://source.clutter-project.org/sources/clutter
RELEASE_URL      = $(RELEASE_URL_BASE)/$(CLUTTER_MAJOR_VERSION).$(CLUTTER_MINOR_VERSION)

RELEASE_ANNOUNCE_LIST = clutter-announce@clutter-project.org
RELEASE_ANNOUNCE_CC   = gnome-announce-list@gnome.org

RELEASE_DOC_URL = http://docs.clutter-project.org/docs/

BUGS_URL = http://bugzilla.gnome.org/enter_bug.cgi?product=clutter

tar_file    = $(distdir).tar.xz
sha256_file = $(distdir).sha256sum

$(sha256_file): $(tar_file)
	$(AM_V_GEN)sha256sum $^ > $@

release-tag:
	@if test "x$(CLUTTER_RELEASE_STATUS)" = "xgit"; then \
	  echo "*** Cannot tag a Git version; please, update the Clutter version" >&2; \
	else \
	  if test -d "$(top_srcdir)/.git"; then \
	    echo " GIT   Tagging release $(CLUTTER_VERSION)..." ; \
	    $(top_srcdir)/build/missing --run git tag \
	 	-s \
	      	-m "Clutter $(CLUTTER_VERSION) ($(CLUTTER_RELEASE_STATUS))" \
		$(CLUTTER_VERSION) ; \
	  else \
	    echo "*** A git checkout is required to tag a release" >&2; \
	  fi \
	fi

release-check: release-verify-even-micro release-verify-sane-changelogs release-verify-news
	TAR_OPTIONS="$(TAR_OPTIONS)" $(MAKE) $(AM_MAKEFLAGS) distcheck

release-verify-news:
	@echo -n " CHK   Checking that the NEWS file has been updated..."
	@if ! grep -q "$(CLUTTER_VERSION)" $(top_srcdir)/NEWS; then \
	  (echo "Ouch." && \
	   echo "*** The version in the NEWS file does not match $(CLUTTER_VERSION)." && \
	   echo "*** This probably means you haven't updated the NEWS file." && \
	   false); else :; fi
	@echo "Good."

release-verify-sane-changelogs: changelogs
	@echo -n " CHK   Checking that the ChangeLog files are sane..."
	@if grep -q "is required to generate" $(CHANGELOGS); then \
	  (echo "Ouch." && \
	   echo "*** Some of the ChangeLogs are not generated correctly." && \
	   echo "*** Remove ChangeLog* and make changelogs" && false); else :; fi
	@echo "Good."

release-verify-even-micro:
	@echo -n " CHK   Checking that $(VERSION) has an even micro component..."
	@test "$(CLUTTER_MICRO_VERSION)" = "`echo $(CLUTTER_MICRO_VERSION)/2*2 | bc`" || \
	  (echo "Ouch." && \
	   echo "*** The version micro component '$(CLUTTER_MICRO_VERSION)' is not an even number." && \
	   echo "*** The version in configure.ac must be incremented before a new release." && \
	   false)
	@echo "Good."

release-upload: $(sha256_file)
	@echo " SCP   Uploading to $(RELEASE_UPLOAD_HOST)..."
	@scp $(tar_file) $(RELEASE_UPLOAD_DIR)
	@echo " SCP   Uploading to master.gnome.org..."
	@scp $(tar_file) master.gnome.org:
	@echo " EXEC  Running ftpadmin install..."
	@ssh master.gnome.org ftpadmin install $(tar_file)
	@mv -f $(sha256_file) $(top_builddir)/build/$(sha256_file)
	@echo "Done."

release-message:
	@echo "     Release URL: $(RELEASE_URL)/$(tar_file)"
	@echo "Release checksum: $(RELEASE_URL)/$(sha256_file)"
	@echo "Send an email to: $(RELEASE_ANNOUNCE_LIST)"
	@echo "              Cc: $(RELEASE_ANNOUNCE_CC)"
	@echo "         Subject: ANNOUNCE: Clutter $(CLUTTER_VERSION) ($(CLUTTER_RELEASE_STATUS))"
	@echo "        Contents:"
	@echo "--- CUT HERE ---"
	@echo "Good news, everyone!"
	@echo ""
	@echo "A new Clutter $(CLUTTER_RELEASE_STATUS) is now available at:"
	@echo ""
	@echo "  http://source.clutter-project.org/sources/clutter/$(CLUTTER_MAJOR_VERSION).$(CLUTTER_MINOR_VERSION)/"
	@echo "  http://download.gnome.org/sources/clutter/$(CLUTTER_MAJOR_VERSION).$(CLUTTER_MINOR_VERSION)/"
	@echo ""
	@echo "SHA256 Checksum:"
	@echo ""
	@cat $(top_builddir)/build/$(sha256_file)
	@echo ""
	@echo "Additionally, a git clone of the source tree:"
	@echo "  git clone git://git.gnome.org/clutter"
	@echo ""
	@echo "will include a signed $(CLUTTER_VERSION) tag which points to a commit named:"
	@echo "  `git cat-file tag $(CLUTTER_VERSION) | $(GREP) ^object | $(SED) -e 's,object ,,'`"
	@echo ""
	@echo "which can be verified with:"
	@echo "  git verify-tag $(CLUTTER_VERSION)"
	@echo ""
	@echo "and can be checked out with a command such as:"
	@echo "  git checkout -b build $(CLUTTER_VERSION)"
	@echo ""
	@echo "Clutter is a library for creating compelling, dynamic and portable graphical"
	@echo "user interfaces. Clutter is released under the terms of the GNU Lesser"
	@echo "General Public License, version 2.1 or (at your option) later."
	@echo ""
	@echo "Clutter depends on:"
	@echo "  GLib ≥ @GLIB_REQ_VERSION@"
	@echo "  JSON-GLib ≥ @JSON_GLIB_REQ_VERSION@"
	@echo "  Cogl ≥ @COGL_REQ_VERSION@"
	@echo "  Cairo ≥ @CAIRO_REQ_VERSION@"
	@echo "  Pango ≥ @PANGO_REQ_VERSION@"
	@echo "  Atk ≥ @ATK_REQ_VERSION@"
	@echo ""
	@echo "Clutter also has platform-specific dependencies; for more information, see"
	@echo "the README file included in the release."
	@echo ""
	@echo "Documentation:"
	@echo "   Clutter: $(RELEASE_DOC_URL)/clutter/$(CLUTTER_MAJOR_VERSION).$(CLUTTER_MINOR_VERSION)/"
	@echo "     Cally: $(RELEASE_DOC_URL)/cally/$(CLUTTER_MAJOR_VERSION).$(CLUTTER_MINOR_VERSION)/"
	@echo "  Cookbook: $(RELEASE_DOC_URL)/clutter-cookbook/$(CLUTTER_API_VERSION)/"
	@echo ""
	@echo "Release Notes:"
	@if test "x$(CLUTTER_RELEASE_STATUS)" = "xsnapshot"; then \
	   echo "  - This is an unstable snapshot of Clutter; there are no compatibility"; \
	   echo "    guarantees for API added during a development cycle." ; \
	 fi
	@echo "  - This version is API and ABI compatible with the current stable"
	@echo "    release of Clutter."
	@echo "  - Installing the contents of this release will overwrite the files"
	@echo "    from the installation of the current release of Clutter."
	@echo "  - Bugs should be reported on the Clutter Bugzilla product, at:"
	@echo "    ${BUGS_URL}"
	@echo ""
	@$(SED) -n '1bend;/^Clutter /q;:end;2,$$p' $(top_srcdir)/NEWS | $(GREP) -v '^======'
	@echo ""
	@echo "Have fun with Clutter!"
	@echo "--- CUT HERE ---"

release-publish: release-check
	$(MAKE) $(AM_MAKEFLAGS) release-tag
	$(MAKE) $(AM_MAKEFLAGS) release-upload
	$(MAKE) $(AM_MAKEFLAGS) release-message
	
.PHONY: \
	release-check \
	release-message \
	release-publish \
	release-tag \
	release-upload \
	release-verify-even-micro \
	release-verify-sane-changelogs
