[Git][debian-gis-team/mkgmap][upstream] New upstream version 0.0.0+svn4810

Bas Couwenberg (@sebastic) gitlab at salsa.debian.org
Mon Nov 1 04:41:18 GMT 2021



Bas Couwenberg pushed to branch upstream at Debian GIS Project / mkgmap


Commits:
38342b4f by Bas Couwenberg at 2021-11-01T05:33:00+01:00
New upstream version 0.0.0+svn4810
- - - - -


9 changed files:

- doc/options.txt
- resources/help/en/options
- resources/mkgmap-version.properties
- src/uk/me/parabola/mkgmap/CommandArgs.java
- src/uk/me/parabola/mkgmap/combiners/FileInfo.java
- src/uk/me/parabola/mkgmap/combiners/GmapiBuilder.java
- src/uk/me/parabola/mkgmap/combiners/MdrBuilder.java
- src/uk/me/parabola/mkgmap/combiners/TdbBuilder.java
- src/uk/me/parabola/mkgmap/main/Main.java


Changes:

=====================================
doc/options.txt
=====================================
@@ -72,6 +72,19 @@ into {user}\AppData\Roaming\Garmin\Maps or \ProgramData\Garmin\Maps
 and the map will be available to Garmin PC programs.
 The directory name is --family-name with extension .gmap.
 
+;--gmapi-minimal[=<include-pattern>]
+: 	Special option for map providers to reduce disk writes when updating. Works like
+--gmapi but does not write Product data for input files which are provided as
+*.img. It is assumed that the content of those files wasn't changed and thus
+doesn't need a rewrite. The optional include-pattern is a regular expression
+which can be used to specify *.img files for which a write should be forced. The
+pattern is used on the full path to the input file. The global index files and
+the *.tdb file will still contain all needed references.
+:	Example usage with pattern:
+::	--gmapi-minimal=.*4711[0-9]{4}\.img
+::	This pattern matches file names between 47110000.img and 47119999.img
+::	and ignores the path.
+
 ;-c filename
 ;--read-config=filename
 : 	Each line of the named file contains a command option in the form


=====================================
resources/help/en/options
=====================================
@@ -71,6 +71,20 @@ filename
     map will be available to Garmin PC programs. The directory name is
     --family-name with extension .gmap.
 
+--gmapi-minimal[=<include-pattern>]
+    Special option for map providers to reduce disk writes when updating. Works
+    like --gmapi but does not write Product data for input files which are
+    provided as *.img. It is assumed that the content of those files wasn't
+    changed and thus doesn't need a rewrite. The optional include-pattern is a
+    regular expression which can be used to specify *.img files for which a
+    write should be forced. The pattern is used on the full path to the input
+    file. The global index files and the *.tdb file will still contain all
+    needed references.
+    Example usage with pattern:
+        --gmapi-minimal=.*4711[0-9]{4}\.img
+        This pattern matches file names between 47110000.img and 47119999.img
+        and ignores the path.
+
 -c filename
 --read-config=filename
     Each line of the named file contains a command option in the form


=====================================
resources/mkgmap-version.properties
=====================================
@@ -1,2 +1,2 @@
-svn.version: 4807
-build.timestamp: 2021-09-14T09:45:24+0100
+svn.version: 4810
+build.timestamp: 2021-10-25T08:27:43+0100


=====================================
src/uk/me/parabola/mkgmap/CommandArgs.java
=====================================
@@ -27,7 +27,7 @@ public class CommandArgs {
 		for (String listOpt : Arrays.asList("mdr7-excl", "mdr7-del", "poi-excl-index", "location-autofill",
 				"overview-levels", "levels", "name-tag-list", "polygon-size-limits", "dem", "dem-dists", "drive-on",
 				"dead-ends", "add-pois-to-lines", "coastlinefile", "generate-sea", "nearby-poi-rules",
-				"line-types-with-direction")) {
+				"line-types-with-direction", "gmapi-minimal")) {
 			stringToList(get(listOpt,  null), listOpt);
 		}
 	}


=====================================
src/uk/me/parabola/mkgmap/combiners/FileInfo.java
=====================================
@@ -32,6 +32,7 @@ import uk.me.parabola.imgfmt.Utils;
 import uk.me.parabola.imgfmt.app.Area;
 import uk.me.parabola.imgfmt.app.BufferedImgFileReader;
 import uk.me.parabola.imgfmt.app.lbl.LBLFileReader;
+import uk.me.parabola.imgfmt.app.map.MapReader;
 import uk.me.parabola.imgfmt.app.srt.Sort;
 import uk.me.parabola.imgfmt.app.trergn.TREFileReader;
 import uk.me.parabola.imgfmt.app.trergn.TREHeader;
@@ -85,6 +86,7 @@ public class FileInfo {
 	private int codePage;
 	private int sortOrderId;
 	private int demsize;
+	private MapReader mapReader;
 
 	private FileInfo(String filename, FileKind kind) {
 		this.filename = filename;
@@ -475,4 +477,17 @@ public class FileInfo {
 	public void setDemsize(int demsize) {
 		this.demsize = demsize;
 	}
+	
+	public MapReader getMapReader() throws FileNotFoundException {
+		if (mapReader == null)
+			mapReader = new MapReader(filename);
+		return mapReader;
+	}
+	
+	public void closeMapReader() {
+		if (mapReader != null) {
+			Utils.closeFile(mapReader);
+			mapReader = null;
+		}
+	}
 }


=====================================
src/uk/me/parabola/mkgmap/combiners/GmapiBuilder.java
=====================================
@@ -34,6 +34,7 @@ import uk.me.parabola.imgfmt.fs.DirectoryEntry;
 import uk.me.parabola.imgfmt.fs.FileSystem;
 import uk.me.parabola.imgfmt.fs.ImgChannel;
 import uk.me.parabola.imgfmt.sys.ImgFS;
+import uk.me.parabola.log.Logger;
 import uk.me.parabola.mkgmap.CommandArgs;
 
 import static java.nio.file.StandardOpenOption.*;
@@ -45,9 +46,11 @@ import static java.nio.file.StandardOpenOption.*;
  * each .img file.
  */
 public class GmapiBuilder implements Combiner {
+	private static final Logger log = Logger.getLogger(GmapiBuilder.class);
 	private static final String NS = "http://www.garmin.com/xmlschemas/MapProduct/v1";
 
 	private final Map<String, Combiner> combinerMap;
+	private final Map<String, String> sourceMap;
 
 	private Path gmapDir;
 	private final Map<Integer, ProductInfo> productMap = new HashMap<>();
@@ -58,8 +61,13 @@ public class GmapiBuilder implements Combiner {
 
 	private String typFile;
 
-	public GmapiBuilder(Map<String, Combiner> combinerMap) {
+	private boolean forceWrite;
+	private String mustWritePattern;
+
+
+	public GmapiBuilder(Map<String, Combiner> combinerMap, Map<String, String> sourceMap) {
 		this.combinerMap = combinerMap;
+		this.sourceMap = sourceMap;
 	}
 
 	/**
@@ -75,6 +83,9 @@ public class GmapiBuilder implements Combiner {
 		productVersion = (short) args.get("product-version", 100);
 
 		gmapDir = Paths.get(args.getOutputDir(), String.format("%s.gmap", familyName));
+		forceWrite = args.exists("gmapi");
+		
+		mustWritePattern = args.get("gmapi-minimal", null);
 	}
 
 	/**
@@ -93,8 +104,10 @@ public class GmapiBuilder implements Combiner {
 
 		// Unzip the image into the product tile directory.
 		try {
-			if (info.isImg())
-				unzipImg(fn, mapname, productId);
+			if (info.isImg()) {
+				if (forceWrite || shouldWrite(info))
+					unzipImg(fn, mapname, productId);
+			}
 			else if (info.getKind() == FileKind.TYP_KIND)
 				typFile = info.getFilename();
 
@@ -103,6 +116,23 @@ public class GmapiBuilder implements Combiner {
 		}
 	}
 
+	private boolean shouldWrite(FileInfo info) {
+		String fn = info.getFilename();
+		String source = sourceMap.get(fn);
+		if (!source.equals(fn)) {
+			log.diagnostic("gmapi-minimal: Writing freshly compiled file " + fn);
+			return true;
+		}
+		if (mustWritePattern != null) {
+			if (fn.matches(mustWritePattern)) {
+				log.diagnostic("gmapi-minimal: Writing old file " + fn + " because it matches pattern " + mustWritePattern);
+				return true;
+			}
+		}
+		log.diagnostic("gmapi-minimal: Skipping file " + fn);
+		return false;
+	}
+
 	/**
 	 * The complete map set has been processed.  Finish off anything that needs
 	 * doing.
@@ -157,7 +187,7 @@ public class GmapiBuilder implements Combiner {
 		unzipImg(srcImgName, destDir);
 	}
 
-	private static void unzipImg(String srcImgName, Path destDir) throws IOException {
+	private void unzipImg(String srcImgName, Path destDir) throws IOException {
 		FileSystem fs = ImgFS.openFs(srcImgName);
 		for (DirectoryEntry ent : fs.list()) {
 			String fullname = ent.getFullName();
@@ -168,7 +198,8 @@ public class GmapiBuilder implements Combiner {
 					continue;
 
 				Files.createDirectories(destDir);
-				copyToFile(f, destDir.resolve(name));
+				Path out = destDir.resolve(name);
+				copyToFile(f, out);
 			}
 		}
 	}


=====================================
src/uk/me/parabola/mkgmap/combiners/MdrBuilder.java
=====================================
@@ -155,9 +155,8 @@ public class MdrBuilder implements Combiner {
 		mdrFile.addMap(info.getHexname(), info.getCodePage());
 
 		String filename = info.getFilename();
-		MapReader mr = null;
 		try {
-			mr = new MapReader(filename);
+			MapReader mr = info.getMapReader();
 
 			AreaMaps maps = new AreaMaps();
 
@@ -172,8 +171,6 @@ public class MdrBuilder implements Combiner {
 			addZips(mr);
 		} catch (FileNotFoundException e) {
 			throw new ExitException("Could not open " + filename + " when creating mdr file");
-		} finally {
-			Utils.closeFile(mr);
 		}
 	}
 


=====================================
src/uk/me/parabola/mkgmap/combiners/TdbBuilder.java
=====================================
@@ -135,10 +135,9 @@ public class TdbBuilder implements Combiner {
 		for (String m : msgs)
 			tdb.addCopyright(m);
 
-		MapReader mapReader = null;
 		String filename = finfo.getFilename();
 		try{
-			mapReader = new MapReader(filename);
+			MapReader mapReader = finfo.getMapReader();
 
 			msgs = mapReader.getCopyrights();
 			boolean found = false;
@@ -157,8 +156,6 @@ public class TdbBuilder implements Combiner {
 
 		} catch (FileNotFoundException e) {
 			throw new ExitException("Could not open " + filename + " when creating tdb file");
-		} finally {
-			Utils.closeFile(mapReader);
 		}
 
 


=====================================
src/uk/me/parabola/mkgmap/main/Main.java
=====================================
@@ -104,6 +104,7 @@ public class Main implements ArgumentProcessor {
 	private volatile int programRC = 0;
 
 	private final Map<String, Combiner> combinerMap = new HashMap<>();
+	private final Map<String, String> sourceMap = new HashMap<>();
 	private boolean informationDisplayed = false;
 
 	/**
@@ -297,6 +298,7 @@ public class Main implements ArgumentProcessor {
 			}
 		});
 		task.setArgs(args);
+		task.setSource(filename);
 		futures.add(task);
 	}
 
@@ -618,6 +620,7 @@ public class Main implements ArgumentProcessor {
 		final Map<String, Integer> nameToHex = new HashMap<>();
 		for (FilenameTask f : filenames) {
 			if (f.getFilename().endsWith(".img")) {
+				sourceMap.put(f.getFilename(), f.getSource());
 				int hex;
 				try {
 					hex = FileInfo.getFileInfo(f.getFilename() ).getHexname();
@@ -675,6 +678,7 @@ public class Main implements ArgumentProcessor {
 						continue;
 					c.onMapEnd(fileInfo);
 				}
+				fileInfo.closeMapReader();
 			} catch (FileNotFoundException e) {
 				throw new MapFailedException("could not open file " + e.getMessage());
 			}
@@ -706,10 +710,13 @@ public class Main implements ArgumentProcessor {
 		boolean indexOpt = args.exists("index");
 		boolean gmapsuppOpt = args.exists("gmapsupp");
 		boolean tdbOpt = args.exists("tdbfile");
-		boolean gmapiOpt = args.exists("gmapi");
+		boolean gmapiOpt = args.exists("gmapi") || args.exists("gmapi-minimal"); 
 		boolean nsisOpt = args.exists("nsis");
 
-		for (String opt : Arrays.asList("gmapi", "nsis")) {
+		if (args.exists("gmapi") && args.exists("gmapi-minimal")) {
+			throw new ExitException("Options --gmapi and --gmapi-minimal are mutually exclusive");
+		}
+		for (String opt : Arrays.asList("gmapi", "nsis", "gmapi-minimal")) {
 			if (!createTdbFiles && args.exists(opt)) {
 				throw new ExitException("Options --" + opt  + " and --no-tdbfiles are mutually exclusive");
 			}
@@ -729,7 +736,7 @@ public class Main implements ArgumentProcessor {
 			addCombiner("mdx", new MdxBuilder());
 		}
 		if (gmapiOpt) {
-			addCombiner("gmapi", new GmapiBuilder(combinerMap));
+			addCombiner("gmapi", new GmapiBuilder(combinerMap, sourceMap));
 		}
 		if (nsisOpt) {
 			addCombiner("nsis", new NsisBuilder(combinerMap));
@@ -772,6 +779,7 @@ public class Main implements ArgumentProcessor {
 	private static class FilenameTask extends FutureTask<String> {
 		private CommandArgs args;
 		private String filename;
+		private String source;
 
 		private FilenameTask(Callable<String> callable) {
 			super(callable);
@@ -794,7 +802,16 @@ public class Main implements ArgumentProcessor {
 		}
 
 		public String toString() {
-			return filename;
+			return source + " -> " + filename;
+		}
+		
+		public void setSource(String source) {
+			this.source = source;
 		}
+
+		public String getSource() {
+			return source;
+		}
+
 	}
 }



View it on GitLab: https://salsa.debian.org/debian-gis-team/mkgmap/-/commit/38342b4f0f4055f954920037d20eef8bd1e56208

-- 
View it on GitLab: https://salsa.debian.org/debian-gis-team/mkgmap/-/commit/38342b4f0f4055f954920037d20eef8bd1e56208
You're receiving this email because of your account on salsa.debian.org.


-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://alioth-lists.debian.net/pipermail/pkg-grass-devel/attachments/20211101/c4fce2b3/attachment-0001.htm>


More information about the Pkg-grass-devel mailing list