# Create XML source from Wiki page
#
#
# Wiki remote URL (source)
UWIKI=http://wiki.debian.org/DebianReference
#### Wiki local  URL (local copy)
###LWIKI=http://localhost/Wiki/DebianReference
# Debian archive URL up to release name
UDEBA=http://ftp.us.debian.org/debian/dists/sid
# Debian popcon file URL
UPOPC=http://popcon.debian.org/all-popcon-results.txt.gz

# Following names should have at least one upper case letter
# Wiki bare XML source
WBARE=Copy Abstract
# Wiki Chapter XML source
WCHPT= Preface Tutorial Package SystemInit Auth Network InternetApp Xwindow I18NL10N SystemTips DataManagement DataConversion Program
# Wiki Appendix XML source
WAPND=Appendix
# Wiki Test XML source
WTEST=Test
# All wiki pages
WPAGE=$(WBARE) $(WCHPT) $(WAPND) $(WTEST)
VERBOSE=
PXSLT=xslt
PBIN=bin
ARCH=amd64

### REAL TARGETS ###

### xml page download and conversion related ###
%.raw.xml:
	sleep 1
	w3m -dump_source "$(UWIKI)/$*?action=format&mimetype=xml/docbook" |\
	xmllint --format --noblanks - > $*.raw.xml 

%.bare0.xml: %.raw.xml
	xsltproc --novalid $(VERBOSE) $(PXSLT)/moin2bare.xsl $< > $@

%.bare1.xml: %.bare0.xml
	xsltproc --novalid $(VERBOSE) $(PXSLT)/moin2common.xsl $< > $@

%.bare.xml: %.bare1.xml
	xsltproc --novalid $(VERBOSE) $(PXSLT)/moin2table.xsl $< > $@

%.chpt0.xml: %.raw.xml
	xsltproc --novalid $(VERBOSE) $(PXSLT)/moin2chpt.xsl $< > $@

%.chpt1.xml: %.chpt0.xml
	xsltproc --novalid $(VERBOSE) $(PXSLT)/moin2common.xsl $< > $@

%.chpt.xml: %.chpt1.xml
	xsltproc --novalid $(VERBOSE) $(PXSLT)/moin2table.xsl $< > $@

%.apnd0.xml: %.raw.xml
	xsltproc --novalid $(VERBOSE) $(PXSLT)/moin2apnd.xsl $< > $@

%.apnd1.xml: %.apnd0.xml
	xsltproc --novalid $(VERBOSE) $(PXSLT)/moin2common.xsl $< > $@

%.apnd.xml: %.apnd1.xml
	xsltproc --novalid $(VERBOSE) $(PXSLT)/moin2table.xsl $< > $@

### auto generation of archive related information ###
.INTERMEDIATE: packages.all
packages.all: packages.main packages.contrib packages.non-free
	cat packages.main packages.contrib packages.non-free >$@
	echo done $@
packages.main:
	wget -O - $(UDEBA)/main/binary-$(ARCH)/Packages.bz2      | bzcat - > packages.main.tmp
	grep-dctrl -e -sPackage,Installed-Size -P "." packages.main.tmp >$@
	rm packages.main.tmp
	echo done $@
packages.contrib:
	wget -O - $(UDEBA)/contrib/binary-$(ARCH)/Packages.bz2   | bzcat - > packages.contrib.tmp
	grep-dctrl -e -sPackage,Installed-Size -P "." packages.contrib.tmp >$@
	rm packages.contrib.tmp
	echo done $@
packages.non-free:
	wget -O - $(UDEBA)/non-free/binary-$(ARCH)/Packages.bz2  | bzcat - > packages.non-free.tmp
	grep-dctrl -e -sPackage,Installed-Size -P "." packages.non-free.tmp >$@
	rm packages.non-free.tmp
	echo done $@
all-popcon-results.txt:
	wget -O - $(UPOPC) | zcat - > $@
	echo done $@

.INTERMEDIATE: %.pkgpop.lst
%.pkgpop.lst: %.raw.xml
	xsltproc --novalid $(VERBOSE) $(PXSLT)/moin2pkgpop.xsl $< > $@
	echo done $@
pkgpop.lst: $(patsubst %, %.pkgpop.lst, $(WCHPT) $(WAPND) $(WTEST))
	cat $^ | sort | uniq > $@
	echo done $@

# Although "grep -f pkgpop.lst" to narrow down package list is the slowest part of this Makefile, trying to use file system
# to narrow down package list is even slower since it start processes for each package.
#
#pop: all-popcon-results.txt
#	grep -e '^Package:' $< | while read x ; do y=$$(echo $$x |awk '{print $$2}'); z=$$(echo $$y |sed -e 's/^\(lib.\).*$$/\1/' -e 's/^\([^l]\).*$$/\1/' -e 's/^\(l[^i]\).*$$/l/' -e 's/^\(li[^b]\).*$$/l/'); mkdir -p popcon/$$z ; echo $$x > popcon/$$z/$$y ; done
##$ time make pop
##grep -e '^Package:' all-popcon-results.txt | while read x ; do y=$(echo $x |awk '{print $2}'); z=$(echo $y |sed -e 's/^\(lib.\).*$/\1/' -e 's/^\([^l]\).*$/\1/' -e 's/^\(l[^i]\).*$/l/' -e 's/^\(li[^b]\).*$/l/'); mkdir -p popcon/$z ; echo $x > popcon/$z/$y ; done
##
##real	12m32.390s
##user	3m41.758s
##sys	8m35.272s
##$ time make popcont.ent
##real	1m54.500s
##user	1m54.167s
##sys	0m1.600s

popcon.ent: all-popcon-results.txt pkgpop.lst
	echo "<!ENTITY pop-date \"$(shell LC_ALL=en_US.UTF-8 ls -l all-popcon-results.txt|LC_ALL=en_US.UTF-8 cut -c34-43)\">" > $@
	echo "<!ENTITY pop-submissions \"$(shell sed -n -e 's/^Submissions: *\([^ ]*\) *$$/\1/p' < all-popcon-results.txt)\">" >> $@
	echo "<!ENTITY pop-architectures \"$(shell grep -e '^Architecture:' all-popcon-results.txt | wc -l)\">" >> $@
	echo "<!ENTITY pop-packages \"$(shell grep -e '^Package:' all-popcon-results.txt | wc -l)\">" >> $@
	echo "<!ENTITY pop-postscript \"Not applicable\">" >> $@
	grep -e '^Package:' $< | grep -f pkgpop.lst | $(PBIN)/popconent $(shell sed -n -e 's/^Submissions: *\([^ ]*\) *$$/\1/p' < $< ) >> $@
	echo done $@

.INTERMEDIATE: %.urls.lst
%.urls.lst: %.raw.xml
	xsltproc --novalid $(VERBOSE) $(PXSLT)/moin2urls.xsl $< > $@
	echo done $@
urls.ent: $(patsubst %, %.urls.lst, $(WCHPT) $(WAPND) $(WTEST))
	cat $^ | sort | uniq | sed -e 's/%28/(/g' -e 's/%29/)/g' -e 's/&/&amp;/g' > $@
	echo done $@

.INTERMEDIATE: %.pkgsize.lst
%.pkgsize.lst: %.raw.xml
	xsltproc --novalid $(VERBOSE) $(PXSLT)/moin2pkgsize.xsl $< > $@
	echo done $@
pkgsize.lst: $(patsubst %, %.pkgsize.lst, $(WCHPT) $(WAPND) $(WTEST))
	cat $^ | sort | uniq > $@
	echo done $@
pkgsize.ent: pkgsize.lst packages.all $(patsubst %, packages.%, main contrib non-free)
	echo "<!ENTITY all-packages \"$(shell grep -e '^Package:' packages.all | wc -l)\">"            > $@
	echo "<!ENTITY main-packages \"$(shell grep -e '^Package:' packages.main | wc -l)\">"         >> $@
	echo "<!ENTITY contrib-packages \"$(shell grep -e '^Package:' packages.contrib | wc -l)\">"   >> $@
	echo "<!ENTITY non-free-packages \"$(shell grep -e '^Package:' packages.non-free | wc -l)\">" >> $@
	$(PBIN)/sizeent packages.all < pkgsize.lst                                                    >> $@
	echo done $@

# always update this
.PHONY: common.ent
common.ent:
	echo "<!ENTITY build-date \"$(shell date -u +'%F %T %Z')\">" > $@
	echo "<!ENTITY arch \"$(ARCH)\">" >> $@
	echo "<!ENTITY codename-stable   \"lenny\">" >> $@
	echo "<!ENTITY codename-testing  \"squeeze\">" >> $@
	echo "<!ENTITY codename-nexttesting  \"squeeze+1\">" >> $@
	echo "<!ENTITY codename-unstable \"sid\">" >> $@
	echo done $@

### PHONY TARGETS for UTILITIES ###

.PHONY:	all hard soft xml
all:	xml soft hard
	echo done $@
soft:	xml common.ent urls.ent
	echo done $@
hard:	popcon.ent pkgsize.ent
	echo done $@
xml: 	$(patsubst %, %.bare.xml, $(WBARE)) $(patsubst %, %.chpt.xml, $(WCHPT) $(WTEST)) $(patsubst %, %.apnd.xml, $(WAPND)) 
	for x in $(WBARE); do $(PBIN)/tidyxml $$x.bare.xml  > $$(echo $$x|tr 'A-Z' 'a-z').en.xml; rm $$x.bare.xml;  done
	for x in $(WCHPT); do $(PBIN)/tidyxml $$x.chpt.xml > $$(echo $$x|tr 'A-Z' 'a-z').en.xml; rm $$x.chpt.xml; done
	for x in $(WTEST); do $(PBIN)/tidyxml $$x.chpt.xml > $$(echo $$x|tr 'A-Z' 'a-z').en.xml; rm $$x.chpt.xml; done
	for x in $(WAPND); do $(PBIN)/tidyxml $$x.apnd.xml > $$(echo $$x|tr 'A-Z' 'a-z').en.xml; rm $$x.apnd.xml; done
	$(PBIN)/rootxml >debian-reference.en.xml
	$(PBIN)/testxml >test-all.en.xml
	echo done $@

.PHONY:	renew reset diff
renew:
	$(MAKE) wikiclean 
	$(MAKE) diff
	$(MAKE) reset
	$(MAKE) all
	$(MAKE) clean
%.remote.txt:
	sleep 1
	w3m -dump_source "$(UWIKI)/$*?action=raw" > $@
	fromdos $@
reset: $(patsubst %, %.remote.txt, $(WPAGE))
	for x in $(WPAGE); do cp -f $$x.remote.txt $$x.ref.txt; done
%.diff: %.remote.txt
	diff -u $*.ref.txt $*.remote.txt >$@ || true
diff: $(patsubst %, %.diff, $(WPAGE))
	ls -l $^ >$@
	gedit $@ $^

# $$ needed for the doller sign in Makefile
.PHONY: url
url:
	awk '{ print $$2}' <urls.ent |uniq -d
	awk '{ print $$3}' <urls.ent |sed 's/>$$//' |xargs -n1 wget -O /dev/null -nv

.PHONY: clean wikiclean distclean
clean:
	-rm -f *.lst
	-rm -f packages.all
	-rm -f *.remote.txt
	-rm -f *.remote.sha1
	-rm -f *.diff diff
	-rm -f *.sha1
	-rm -f *.bare?.xml
	-rm -f *.chpt?.xml
	-rm -f *.apnd?.xml
	-rm -f *.swp *~
	-rm -f *.edit.txt
wikiclean: clean
	-rm -f $(patsubst %, %.raw.xml, $(WPAGE))
	-rm -f common.ent urls.ent
	-rm -f popcon.ent pkgsize.ent
distclean: wikiclean
	-rm -f all-popcon-results.txt
	-rm -f $(patsubst %, packages.%, main contrib non-free)
	-rm -f *.xml *.ent

.SECONDARY: all-popcon-results.txt $(patsubst %, packages.%, main contrib non-free)
.SECONDARY:  $(patsubst %, %.raw.xml, $(WPAGE))

