From 064a5e854492b8df4715a2e20932b6cee3da56af Mon Sep 17 00:00:00 2001
From: Paul Eggert <eggert@cs.ucla.edu>
Date: Sun, 22 Apr 2018 13:20:29 -0700
Subject: [PROPOSED 1/2] Automate building of rearguard tarball

Change 'make tarballs' to also output a rearguard-format tarball; see:
https://mm.icann.org/pipermail/tz/2018-February/026204.html
Improve on the earlier suggestion by marking the tarball as rearguard,
and by making far fewer changes to the traditional files.
* Makefile (TRADITIONAL_ASC, ALL_ASC): New macros.
(tarballs_version, signatures_version):
Also build rearguard tarball and sig.
(traditional_signatures_version): Use new macros.
(tzdata$(VERSION)-rearguard.tar.gz):
(tzdata$(VERSION)-rearguard.tar.gz.asc): New rules.
($(ALL_ASC)): Simplify by using one gpg rule for all targets.
* NEWS: Mention change.
* ziguard.awk: Work on individual files, too.
(dataform_type): Rename from dst_type.
Index is now just the dataform.  All uses changed.
(BEGIN): Take type from DATAFORM, not outfile.
All uses changed.
---
 Makefile    | 46 ++++++++++++++++++++++++++++++++++++----------
 NEWS        | 11 +++++++++++
 ziguard.awk | 14 +++++++-------
 3 files changed, 54 insertions(+), 17 deletions(-)

diff --git a/Makefile b/Makefile
index 2365d7c..3ac1a67 100644
--- a/Makefile
+++ b/Makefile
@@ -560,8 +560,8 @@ version:	$(VERSION_DEPS)
 
 # These files can be tailored by setting BACKWARD, PACKRATDATA, etc.
 vanguard.zi main.zi rearguard.zi: $(DSTDATA_ZI_DEPS)
-		$(AWK) -v outfile='$@' -f ziguard.awk $(TDATA) $(PACKRATDATA) \
-		  >$@.out
+		$(AWK) -v DATAFORM=`expr $@ : '\(.*\).zi'` -f ziguard.awk \
+		  $(TDATA) $(PACKRATDATA) >$@.out
 		mv $@.out $@
 tzdata.zi:	$(DATAFORM).zi version
 		version=`sed 1q version` && \
@@ -901,6 +901,13 @@ check_time_t_alternatives:
 		done
 		rm -fr time_t.dir
 
+TRADITIONAL_ASC = \
+  tzcode$(VERSION).tar.gz.asc \
+  tzdata$(VERSION).tar.gz.asc
+ALL_ASC = $(TRADITIONAL_ASC) \
+  tzdata$(VERSION)-rearguard.tar.gz.asc \
+  tzdb-$(VERSION).tar.lz.asc
+
 tarballs traditional_tarballs signatures traditional_signatures: version
 		VERSION=`cat version` && \
 		$(MAKE) VERSION="$$VERSION" $@_version
@@ -908,12 +915,13 @@ tarballs traditional_tarballs signatures traditional_signatures: version
 # These *_version rules are intended for use if VERSION is set by some
 # other means.  Ordinarily these rules are used only by the above
 # non-_version rules, which set VERSION on the 'make' command line.
-tarballs_version: traditional_tarballs_version tzdb-$(VERSION).tar.lz
+tarballs_version: traditional_tarballs_version \
+  tzdata$(VERSION)-rearguard.tar.gz \
+  tzdb-$(VERSION).tar.lz
 traditional_tarballs_version: \
   tzcode$(VERSION).tar.gz tzdata$(VERSION).tar.gz
-signatures_version: traditional_signatures_version tzdb-$(VERSION).tar.lz.asc
-traditional_signatures_version: \
-  tzcode$(VERSION).tar.gz.asc tzdata$(VERSION).tar.gz.asc \
+signatures_version: $(ALL_ASC)
+traditional_signatures_version: $(TRADITIONAL_ASC)
 
 tzcode$(VERSION).tar.gz: set-timestamps.out
 		LC_ALL=C && export LC_ALL && \
@@ -928,6 +936,26 @@ tzdata$(VERSION).tar.gz: set-timestamps.out
 		  gzip $(GZIPFLAGS) >$@.out
 		mv $@.out $@
 
+tzdata$(VERSION)-rearguard.tar.gz: rearguard.zi set-timestamps.out
+		rm -fr tzdata$(VERSION)-rearguard.dir
+		mkdir tzdata$(VERSION)-rearguard.dir
+		ln $(COMMON) $(DATA) $(MISC) tzdata$(VERSION)-rearguard.dir
+		cd tzdata$(VERSION)-rearguard.dir && \
+		  rm -f $(TDATA) $(PACKRATDATA) version
+		for f in $(TDATA) $(PACKRATDATA); do \
+		  rearf=tzdata$(VERSION)-rearguard.dir/$$f; \
+		  $(AWK) -v DATAFORM=rearguard -f ziguard.awk $$f >$$rearf && \
+		  touch -cmr `ls -t ziguard.awk $$f` $$rearf || exit; \
+		done
+		sed '1s/$$/-rearguard/' \
+		  <version >tzdata$(VERSION)-rearguard.dir/version
+		touch -cmr version tzdata$(VERSION)-rearguard.dir/version
+		LC_ALL=C && export LC_ALL && \
+		  (cd tzdata$(VERSION)-rearguard.dir && \
+		   tar $(TARFLAGS) -cf - $(COMMON) $(DATA) $(MISC) | \
+		     gzip $(GZIPFLAGS)) >$@.out
+		mv $@.out $@
+
 tzdb-$(VERSION).tar.lz: set-timestamps.out
 		rm -fr tzdb-$(VERSION)
 		mkdir tzdb-$(VERSION)
@@ -938,12 +966,10 @@ tzdb-$(VERSION).tar.lz: set-timestamps.out
 		mv $@.out $@
 
 tzcode$(VERSION).tar.gz.asc: tzcode$(VERSION).tar.gz
-		gpg --armor --detach-sign $?
-
 tzdata$(VERSION).tar.gz.asc: tzdata$(VERSION).tar.gz
-		gpg --armor --detach-sign $?
-
+tzdata$(VERSION)-rearguard.tar.gz.asc: tzdata$(VERSION)-rearguard.tar.gz
 tzdb-$(VERSION).tar.lz.asc: tzdb-$(VERSION).tar.lz
+$(ALL_ASC):
 		gpg --armor --detach-sign $?
 
 typecheck:
diff --git a/NEWS b/NEWS
index 13652fc..772a762 100644
--- a/NEWS
+++ b/NEWS
@@ -4,8 +4,19 @@ Unreleased, experimental changes
 
   Briefly:
 
+    'make tarballs' now also builds a rearguard tarball.
     New 's' and 'd' suffixes in SAVE columns of Rule and Zone lines.
 
+  Changes to build procedure
+
+    The command 'make tarballs' now also builds the tarball
+    tzdataVERSION-rearguard.tar.gz, which is like tzdataVERSION.tar.gz
+    except that it uses rearguard format intended for trailing-edge
+    data parsers.  Although the two tarballs currently are the same
+    except for version, they will differ more when negative DST
+    offsets are moved from vanguard to main format, since rearguard
+    format will continue to avoid negative DST offsets.
+
   Changes to data format and to code
 
     The SAVE column of Rule and Zone lines can now have an 's' or 'd'
diff --git a/ziguard.awk b/ziguard.awk
index dbe64d6..42e2910 100644
--- a/ziguard.awk
+++ b/ziguard.awk
@@ -13,18 +13,18 @@
 # rearguard format.
 
 BEGIN {
-  dst_type["vanguard.zi"] = 1
-  dst_type["main.zi"] = 1
-  dst_type["rearguard.zi"] = 1
+  dataform_type["vanguard"] = 1
+  dataform_type["main"] = 1
+  dataform_type["rearguard"] = 1
 
-  # The command line should set OUTFILE to the name of the output file.
-  if (!dst_type[outfile]) exit 1
-  vanguard = outfile == "vanguard.zi"
+  # The command line should set DATAFORM.
+  if (!dataform_type[DATAFORM]) exit 1
+  vanguard = DATAFORM == "vanguard"
 }
 
 /^Zone/ { zone = $2 }
 
-outfile != "main.zi" {
+DATAFORM != "main" {
   in_comment = /^#/
   uncomment = comment_out = 0
 
-- 
2.7.4

