dnl macros to set GST_PACKAGE_RELEASE_DATETIME

dnl ===========================================================================
dnl AG_GST_SET_PACKAGE_RELEASE_DATETIME
dnl
dnl Usage:
dnl
dnl AG_GST_SET_PACKAGE_RELEASE_DATETIME()
dnl AG_GST_SET_PACKAGE_RELEASE_DATETIME([no]...)
dnl sets the release datetime to the current date
dnl (no = this is not a release, but git or prerelease)
dnl
dnl AG_GST_SET_PACKAGE_RELEASE_DATETIME([YYYY-MM-DD])
dnl AG_GST_SET_PACKAGE_RELEASE_DATETIME([yes], [YYYY-MM-DD])
dnl sets the release datetime to the specified date (and time, if given)
dnl (yes = this is a release, not git or prerelease)
dnl
dnl AG_GST_SET_PACKAGE_RELEASE_DATETIME([yes], [DOAP-FILE], [RELEASE-VERSION])
dnl sets the release date to the release date associated with version
dnl RELEASE-VERSION in the .doap file DOAP-FILE
dnl (yes = this is a release, not git or prerelease)
dnl
dnl We need to treat pre-releases like git because there won't be an entry
dnl in the .doap file for pre-releases yet, and we don't want to use the
dnl date of the last release either.
dnl ===========================================================================
AC_DEFUN([AG_GST_SET_PACKAGE_RELEASE_DATETIME],
[
  dnl AG_GST_SET_PACKAGE_RELEASE_DATETIME()
  dnl AG_GST_SET_PACKAGE_RELEASE_DATETIME([no]...)
  if test "x$1" = "xno" -o "x$1" = "x"; then
    GST_PACKAGE_RELEASE_DATETIME=`date -u "+%Y-%m-%dT%H:%MZ"`
  elif test "x$1" = "xyes"; then
    dnl AG_GST_SET_PACKAGE_RELEASE_DATETIME([yes], [YYYY-MM-DD])
    dnl AG_GST_SET_PACKAGE_RELEASE_DATETIME([yes], [DOAP-FILE], [RELEASE-VERSION])
changequote(<<, >>)dnl
    if ( echo $2 | grep '^20[1-9][0-9]-[0-1][0-9]-[0-3][0-9]' >/dev/null ) ; then
changequote([, ])dnl
      GST_PACKAGE_RELEASE_DATETIME=$2
    else
      dnl we assume the .doap file contains the date as YYYY-MM-DD
      YYYY_MM_DD=`sh "${srcdir}/common/extract-release-date-from-doap-file" $3 $2`;
      if test "x$YYYY_MM_DD" != "x"; then
        GST_PACKAGE_RELEASE_DATETIME=$YYYY_MM_DD
      else
        AC_MSG_ERROR([SET_PACKAGE_RELEASE_DATETIME: could not extract
            release date for release version $3 from $2])
        GST_PACKAGE_RELEASE_DATETIME=""
      fi
    fi
  dnl AG_GST_SET_PACKAGE_RELEASE_DATETIME([YYYY-MM-DD])
changequote(<<, >>)dnl
  elif ( echo $1 | grep '^20[1-9][0-9]-[0-1][0-9]-[0-3][0-9]' >/dev/null ) ; then
changequote([, ])dnl
    GST_PACKAGE_RELEASE_DATETIME=$1
  else
    AC_MSG_WARN([SET_PACKAGE_RELEASE_DATETIME: invalid first argument])
    GST_PACKAGE_RELEASE_DATETIME=""
  fi

  if test "x$GST_PACKAGE_RELEASE_DATETIME" = "x"; then
    AC_MSG_WARN([Invalid package release date time: $GST_PACKAGE_RELEASE_DATETIME])
  else
    AC_MSG_NOTICE([Setting GST_PACKAGE_RELEASE_DATETIME to $GST_PACKAGE_RELEASE_DATETIME])

    AC_DEFINE_UNQUOTED([GST_PACKAGE_RELEASE_DATETIME],
        ["$GST_PACKAGE_RELEASE_DATETIME"],
        [GStreamer package release date/time for plugins as YYYY-MM-DD])
  fi
])

dnl ===========================================================================
dnl AG_GST_SET_PACKAGE_RELEASE_DATETIME_WITH_NANO
dnl
dnl Usage:
dnl
dnl AG_GST_SET_PACKAGE_RELEASE_DATETIME([NANO-VERSION], [DOAP-FILE], [RELEASE-VERSION])
dnl if NANO-VERSION is 0, sets the release date to the release date associated
dnl with version RELEASE-VERSION in the .doap file DOAP-FILE, otherwise sets
dnl the release date and time to the current date/time.
dnl
dnl We need to treat pre-releases like git because there won't be an entry
dnl in the .doap file for pre-releases yet, and we don't want to use the
dnl date of the last release either.
dnl ===========================================================================
AC_DEFUN([AG_GST_SET_PACKAGE_RELEASE_DATETIME_WITH_NANO],
[
  if test "x$1" = "x0"; then
    AG_GST_SET_PACKAGE_RELEASE_DATETIME([yes], [ $2 ], [ $3 ])
  else
    AG_GST_SET_PACKAGE_RELEASE_DATETIME([no])
  fi
])
