#
# Copyright (c) 2016, 2022, Oracle and/or its affiliates. All rights reserved.
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
#
# This code is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License version 2 only, as
# published by the Free Software Foundation.  Oracle designates this
# particular file as subject to the "Classpath" exception as provided
# by Oracle in the LICENSE file that accompanied this code.
#
# This code is distributed in the hope that it will be useful, but WITHOUT
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
# version 2 for more details (a copy is included in the LICENSE file that
# accompanied this code).
#
# You should have received a copy of the GNU General Public License version
# 2 along with this work; if not, write to the Free Software Foundation,
# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
#
# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
# or visit www.oracle.com if you need additional information or have any
# questions.
#

include $(SPEC)
include MakeBase.gmk

$(eval $(call IncludeCustomExtension, SourceRevision-pre.gmk))

################################################################################
# Keep track of what source revision is used to create the build, by creating
# a tracker file in the output directory. This tracker file is included in the
# source image, and can be used to recreate the source revision used.
#
# We're either building directly from an SCM repository, and if so, use the
# current revision from that SCM. Otherwise, we are building from a source
# bundle. As a part of creating this source bundle, the current SCM revisions of
# all repos will be stored in a file in the top dir, which is then used when
# creating the tracker file.

STORED_SOURCE_REVISION := $(TOPDIR)/.src-rev

USE_SCM := false
ifneq ($(and $(GIT), $(wildcard $(TOPDIR)/.git)), )
  USE_SCM := true
  SCM_DIR := .git
  ID_COMMAND := $(PRINTF) "git:%s%s\n" \
      "$$($(GIT) log -n1 --format=%H | cut -c1-12)" \
      "$$(if test -n "$$($(GIT) status --porcelain)"; then printf '+'; fi)"
endif

ifeq ($(USE_SCM), true)

  # Verify that the entire forest is consistent
  $(foreach repo, $(call FindAllReposRel), \
    $(if $(wildcard $(TOPDIR)/$(repo)/$(SCM_DIR)),, \
        $(error Inconsistent revision control: $(repo) is missing $(SCM_DIR) directory)) \
  )

  # Replace "." with "_top" and "/" with "-"
  MakeFilenameFromRepo = \
      $(strip $(subst .,top, $(subst /,-, $1)))

  ################################################################################
  # SetupGetRevisionForRepo defines a make rule for creating a file containing
  # the name of the repository and the output of the scm command for that
  # repository.
  #
  # Argument 1 is the relative path to the repository from the top dir.
  #
  SetupGetRevisionForRepo = $(NamedParamsMacroTemplate)
  define SetupGetRevisionForRepoBody
    $1_REPO_PATH :=  $$(TOPDIR)/$$(strip $1)
    $1_FILENAME := $$(call MakeFilenameFromRepo, $1)

    $$(SUPPORT_OUTPUTDIR)/src-rev/$$($1_FILENAME): FRC
	$$(call MakeDir, $$(@D))
	$$(ECHO) $$(strip $1):`$$(CD) $$($1_REPO_PATH) && $$(ID_COMMAND)` > $$@

    REPO_REVISIONS += $$(SUPPORT_OUTPUTDIR)/src-rev/$$($1_FILENAME)
  endef

  # Setup rules for all repos. This makes sure all the "git log" calls are made
  # in parallel.
  $(foreach repo, $(call FindAllReposRel), \
    $(eval $(call SetupGetRevisionForRepo, $(repo))) \
  )

  # Create a complete source revision output file from all repos
  # Param 1: The output file
  define CreateSourceRevisionFile
    $1: $$(REPO_REVISIONS)
	$$(call MakeDir, $$(@D))
	$$(ECHO) `$$(CAT) $$(REPO_REVISIONS)` > $$@.tmp
	if [ ! -f $$@ ] || [ "`$$(CAT) $$@`" != "`$$(CAT) $$@.tmp`" ]; then \
	  $$(MV) $$@.tmp $$@ ; \
	else \
	  $$(RM) $$@.tmp ; \
	fi
  endef

  $(eval $(call CreateSourceRevisionFile, $(STORED_SOURCE_REVISION)))

  scm-store-source-revision: $(STORED_SOURCE_REVISION)

  $(eval $(call CreateSourceRevisionFile, $(SOURCE_REVISION_TRACKER)))

  scm-create-source-revision-tracker: $(SOURCE_REVISION_TRACKER)

  STORE_SOURCE_REVISION_TARGET := scm-store-source-revision
  CREATE_SOURCE_REVISION_TRACKER_TARGET := scm-create-source-revision-tracker

  .PHONY: scm-store-source-revision scm-create-source-revision-tracker

else
  # Not using any SCM

  ifneq ($(wildcard $(STORED_SOURCE_REVISION)), )
    # We have a stored source revision (.src-rev)

    src-store-source-revision:
	$(call LogInfo, No SCM configuration present$(COMMA) not updating .src-rev)

    $(SOURCE_REVISION_TRACKER): $(STORED_SOURCE_REVISION)
	$(install-file)

    src-create-source-revision-tracker: $(SOURCE_REVISION_TRACKER)
  else
    # We don't have a stored source revision. Can't do anything, really.

    src-store-source-revision:
	$(call LogWarn, Error: No SCM configuration present$(COMMA) cannot create .src-rev)
	exit 2

    src-create-source-revision-tracker:
	$(call LogWarn, Warning: No SCM configuration present and no .src-rev)
  endif

  STORE_SOURCE_REVISION_TARGET := src-store-source-revision
  CREATE_SOURCE_REVISION_TRACKER_TARGET := src-create-source-revision-tracker

  .PHONY: src-store-source-revision src-create-source-revision-tracker

endif

################################################################################

$(eval $(call IncludeCustomExtension, SourceRevision-post.gmk))

################################################################################

store-source-revision: $(STORE_SOURCE_REVISION_TARGET)

create-source-revision-tracker: $(CREATE_SOURCE_REVISION_TRACKER_TARGET)

FRC: # Force target

.PHONY: store-source-revision create-source-revision-tracker
