# Copyright (C) 2009 The Android Open Source Project
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

ASCIIDOC       ?= asciidoc
ASCIIDOC_EXTRA ?=
SVN            ?= svn
PUB_ROOT       ?= https://gerrit.googlecode.com/svn/documentation

all: html

clean:
	rm -f *.html
	rm -rf $(LOCAL_ROOT)

ifeq ($(origin VERSION), undefined)
  VERSION := $(shell ./GEN-DOC-VERSION 2>/dev/null)
endif

DOC_HTML      := $(patsubst %.txt,%.html,$(wildcard *.txt))
LOCAL_ROOT    := .published
COMMIT        := $(shell git describe HEAD | sed s/^v//)
PUB_DIR       := $(PUB_ROOT)/$(VERSION)
PRIOR          = PRIOR

ifeq ($(VERSION),)
  REVISION = $(COMMIT)
else
  ifeq ($(VERSION),$(COMMIT))
    REVISION := $(VERSION)
  else
    REVISION := $(VERSION) (from v$(COMMIT))
  endif
endif

html: $(DOC_HTML)

update: html
ifeq ($(VERSION),)
	./GEN-DOC-VERSION
endif
	@-rm -rf $(LOCAL_ROOT)
	@echo "Checking out current $(VERSION)"
	@if ! $(SVN) checkout $(PUB_DIR) $(LOCAL_ROOT) 2>/dev/null ; then \
		echo "Copying $(PRIOR) to $(VERSION) ..." && \
		$(SVN) cp -m "Create $(VERSION) documentation" $(PUB_ROOT)/$(PRIOR) $(PUB_DIR) && \
		$(SVN) checkout $(PUB_DIR) $(LOCAL_ROOT) ; \
	fi
	@rm -f $(LOCAL_ROOT)/*.html
	@cp *.html $(LOCAL_ROOT)
	@cd $(LOCAL_ROOT) && \
	  r=`$(SVN) status | perl -ne 'print if s/^!  *//' ` && \
	  if [ -n "$$r" ]; then $(SVN) rm $$r; fi && \
	  a=`$(SVN) status | perl -ne 'print if s/^\?  *//' ` && \
	  if [ -n "$$a" ]; then \
	    $(SVN) add $$a && \
	    $(SVN) propset svn:mime-type text/html $$a ; \
	    fi && \
	  echo "Committing $(VERSION) at v$(COMMIT)" && \
	  $(SVN) commit -m "Updated $(VERSION) documentation to v$(COMMIT)"
	@-rm -rf $(LOCAL_ROOT)

$(DOC_HTML): %.html : %.txt
	@echo "FORMAT $@"
	@rm -f $@+ $@
	@$(ASCIIDOC) -a toc \
		-a 'revision=$(REVISION)' \
		-b xhtml11 \
		-f asciidoc.conf \
		$(ASCIIDOC_EXTRA) \
		-o $@+ $<
	@mv $@+ $@
