blob: f843fd354f4e7f4d6da00d811c19bc1c17a95b3b [file] [log] [blame]
package org.unicode.cldr.tool;
import java.io.File;
import java.util.Collections;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Objects;
import java.util.Set;
import java.util.TreeMap;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.unicode.cldr.util.CLDRConfig;
import org.unicode.cldr.util.CLDRFile;
import org.unicode.cldr.util.CLDRFile.Status;
import org.unicode.cldr.util.CLDRPaths;
import org.unicode.cldr.util.CldrUtility;
import org.unicode.cldr.util.Factory;
import org.unicode.cldr.util.LanguageTagParser;
import org.unicode.cldr.util.Level;
import org.unicode.cldr.util.Organization;
import org.unicode.cldr.util.PathHeader;
import org.unicode.cldr.util.PatternCache;
import org.unicode.cldr.util.XMLSource;
import com.google.common.collect.ImmutableSet;
import com.google.common.collect.Multimap;
import com.google.common.collect.TreeMultimap;
import com.ibm.icu.util.Output;
public class GetChanges {
static CLDRConfig testInfo = ToolConfig.getToolInstance();
static CLDRFile english = testInfo.getEnglish();
static boolean verbose = true;
public static void main(String[] args) {
System.out.println("#Dir\tState\tTrunk Value\tmodify_config.txt Locale\tAction\tlabel\tPath Value\tlabel\tNew Value");
Matcher localeFilter = Pattern.compile(".*").matcher("");
File vxml = new File(CLDRPaths.AUX_DIRECTORY, "voting/"
+ "35"
+ "/vxml2");
for (File vxmlDir : vxml.listFiles()) {
if (!vxmlDir.isDirectory()) {
continue;
}
//System.out.println("#Dir=\t" + vxmlDir);
// common, ...
File[] commonSeedFiles = vxmlDir.listFiles();
if (commonSeedFiles == null) {
System.out.println("##No files in: " + vxmlDir);
continue;
}
for (File commonSeed : commonSeedFiles) {
if (!commonSeed.isDirectory()
|| "dtd".equals(commonSeed.getName())) {
continue;
}
//System.out.println("#Dir=\t" + commonSeed);
String subDir = vxmlDir.getName() + "/" + commonSeed.getName();
String l2 = CLDRPaths.BASE_DIRECTORY + subDir;
// main, annotations
Factory factoryVxml = Factory.make(commonSeed.toString(), ".*");
Factory factoryTrunk = Factory.make(l2, ".*");
for (String locale : factoryVxml.getAvailable()) {
if (!localeFilter.reset(locale).matches()) {
continue;
}
if (locale.equals("root")) {
continue;
}
CLDRFile vxmlFile;
try {
vxmlFile = factoryVxml.make(locale, true);
} catch (Exception e1) {
System.out.println("##Error: dir=\t" + commonSeed + "\t locale=\t" + locale + "\tmsg=\t" + e1.getMessage());
continue;
}
CLDRFile trunkFile = null;
try {
trunkFile = factoryTrunk.make(locale, true);
} catch (Exception e) {
}
compare(subDir, vxmlFile, trunkFile);
}
}
}
}
public static final Set<String> ROOT_OR_CODE_FALLBACK = ImmutableSet.of(XMLSource.CODE_FALLBACK_ID, XMLSource.ROOT_ID);
private static void compare(String dir, CLDRFile vxmlFileResolved, CLDRFile trunkFileResolved) {
String localeID = vxmlFileResolved.getLocaleID();
if (localeID.equals("ccp")) {
int debug = 0;
}
CLDRFile vxmlFileUnresolved = vxmlFileResolved.getUnresolved();
//System.out.println("#Dir: " + dir + ";\tLocale: " + localeID);
Output<String> localeWhereFound = new Output<>();
Output<String> pathWhereFound = new Output<>();
Status status = new Status();
int countNew = 0;
int countChanged = 0;
for (String path : vxmlFileUnresolved) {
if (path.contains("/identity")) {
continue;
}
if (path.contains("ccp")) {
int debug = 0;
}
// get trunk value. If not accessible or ROOT_OR_CODE_FALLBACK, then set to null
String trunkValue = null;
if (trunkFileResolved != null) {
trunkValue = trunkFileResolved.getStringValue(path);
String foundId = trunkFileResolved.getSourceLocaleID(path, status);
if (ROOT_OR_CODE_FALLBACK.contains(foundId)) {
trunkValue = null;
}
}
String vxmlValue = vxmlFileResolved.getStringValue(path);
// quick test; will repeat
if (Objects.equals(vxmlValue, trunkValue)) {
continue;
}
// If vxmlValue is INHERITANCE_MARKER, then get bailey
// if ROOT_OR_CODE_FALLBACK location, then we skip
if (vxmlValue.equals(CldrUtility.INHERITANCE_MARKER)) {
vxmlValue = vxmlFileResolved.getBaileyValue(path, pathWhereFound, localeWhereFound);
if (ROOT_OR_CODE_FALLBACK.contains(localeWhereFound.value)) {
continue;
}
// if (!path.equals(pathWhereFound.value)) {
// continue;
// }
}
if (Objects.equals(vxmlValue, trunkValue)) {
continue;
}
if (trunkValue == null) {
++countNew;
if (verbose) {
System.out.println(
dir
+";\tnew\t"
+ "\tlocale=" + localeID + ";"
+ "\taction=add;"
+ "\tpath=\t" + path
+ "\tnew_value=\t" + vxmlValue
);
}
} else {
// we do a lot of processing on the annotations, so most likely are just changes introduced by that.
// So ignore for now
if (path.startsWith("//ldml/annotations")) {
continue;
}
++countChanged;
if (verbose) {
System.out.println(
dir
+ ";\ttrunk=\t" + trunkValue
+ "\tlocale=" + localeID + ";"
+ "\taction=add;"
+ "\tpath=\t" + path
+ "\tnew_value=\t" + vxmlValue
);
}
}
// if (countNew != 0 || countChanged != 0) {
// System.out.println("#Dir=\t" + dir + "\tLocale=\t" + localeID + "\tCountNew=\t" + countNew + "\tCountChanged=\t" + countChanged);
// }
}
}
static class Data {
final String valueLastRelease;
final String valueSnapshot;
final String valueTrunk;
public Data(String valueLastRelease, String valueSnapshot, String valueTrunk) {
super();
this.valueLastRelease = valueLastRelease;
this.valueSnapshot = valueSnapshot;
this.valueTrunk = valueTrunk;
}
@Override
public String toString() {
return "«" + valueLastRelease + "»"
+ (!CldrUtility.equals(valueTrunk, valueLastRelease) ? "‡" : "")
+ "\t"
+ "«" + valueSnapshot + "»"
+ (CldrUtility.equals(valueTrunk, valueSnapshot) ? "†" : "");
}
}
private void old() {
boolean onlyMissing = true;
String release = "33.1";
String subdir = "annotations"; // "main";
Factory lastReleaseFactory = Factory.make(CLDRPaths.LAST_DIRECTORY + "common/"
+ subdir, ".*");
Factory trunkFactory = testInfo.getAnnotationsFactory(); // CldrFactory();
Factory snapshotFactory = Factory.make(CLDRPaths.AUX_DIRECTORY + "voting/"
+ release
+ "/vxml/common/"
+ subdir, ".*");
PathHeader.Factory phf = PathHeader.getFactory(english);
int totalCount = 0;
int localeCount = 0;
Output<String> localeWhereFound = new Output<String>();
Output<String> pathWhereFound = new Output<String>();
CLDRFile englishCldrFile = trunkFactory.make("en", false);
final Set<String> paths = ImmutableSet.copyOf(englishCldrFile.iterator());
System.out.println("english paths: " + paths.size());
Multimap<String,PathHeader> missing = TreeMultimap.create();
Set<String> locales = testInfo.getStandardCodes().getLocaleCoverageLocales(Organization.cldr, Collections.singleton(Level.MODERN));
LanguageTagParser ltp = new LanguageTagParser();
for (String locale : locales) {
if (!ltp.set(locale).getRegion().isEmpty() || locale.equals("sr_Latn")) {
continue; // skip region locales, they'll inherit
}
// if (!locale.equals("sr_Latn")) {
// continue;
// }
System.out.println(locale);
CLDRFile snapshot;
try {
snapshot = snapshotFactory.make(locale, false);
} catch (Exception e) {
System.out.println("##Skipping " + locale + ", no data in annotations/");
continue;
}
CLDRFile lastRelease = null;
try {
lastRelease = lastReleaseFactory.make(locale, false);
} catch (Exception e) {
}
CLDRFile trunk = null;
try {
trunk = trunkFactory.make(locale, false);
} catch (Exception e) {
}
Map<PathHeader, Data> results = new TreeMap<PathHeader, Data>();
for (String xpath : paths) {
if (xpath.contains("fallbackRegionFormat")
|| xpath.contains("exemplar")
|| xpath.contains("/identity")) {
continue;
}
String newPath = fixOldPath(xpath);
String valueSnapshot = snapshot.getStringValue(newPath);
PathHeader ph = null;
if (valueSnapshot == null) {
ph = phf.fromPath(newPath);
missing.put(locale, ph);
}
String valueLastRelease = lastRelease == null ? null : lastRelease.getStringValue(xpath);
if (valueSnapshot == null) {
ph = phf.fromPath(newPath);
missing.put(locale, ph);
}
if (onlyMissing) {
continue;
}
if (valueSnapshot != null && Objects.equals(valueLastRelease, valueSnapshot)) {
continue;
}
String valueTrunk = trunk == null ? null : trunk.getStringValue(newPath);
// if (valueSnapshot == null && valueTrunk == null) { // committee deletion
// continue;
// }
// skip inherited
String baileyValue = snapshot.getConstructedBaileyValue(xpath, pathWhereFound, localeWhereFound);
if (!"root".equals(localeWhereFound.value)
&& !"code-fallback".equals(localeWhereFound.value)
&& CldrUtility.equals(valueSnapshot, baileyValue)) {
continue;
}
ph = ph != null ? ph : phf.fromPath(newPath);
results.put(ph, new Data(valueLastRelease, valueSnapshot, valueTrunk));
}
if (results.isEmpty()) {
continue;
}
int itemCount = 0;
localeCount++;
for (Entry<PathHeader, Data> entry : results.entrySet()) {
PathHeader ph = entry.getKey();
String englishValue = englishCldrFile.getStringValue(ph.getOriginalPath());
System.out.println(localeCount
+ "\t" + ++itemCount
+ "\t" + locale
+ "\t" + english.getName(locale)
+ "\t" + ph
+ "\t«" + englishValue
+ "»\t" + entry.getValue());
}
totalCount += itemCount;
}
System.out.println("##Total:\t" + totalCount);
for ( Entry<String, PathHeader> entry : missing.entries()) {
System.out.println(entry.getKey() + "\t" + entry.getValue());
}
}
static Pattern OLD_PATH = PatternCache.get("//ldml/units/unit\\[@type=\"([^\"]*)\"]/unitPattern\\[@count=\"([^\"]*)\"](\\[@alt=\"([^\"]*)\"])?");
static Matcher OLD_PATH_MATCHER = OLD_PATH.matcher("");
private static String fixOldPath(String xpath) {
// //ldml/units/unit[@type="day-future"]/unitPattern[@count="one"]
// to
// //ldml/units/unitLength[@type="long"]/unit[@type="duration-day-future"]/unitPattern[@count="one"]
if (OLD_PATH_MATCHER.reset(xpath).matches()) {
String type = OLD_PATH_MATCHER.group(4);
return "//ldml/units/unitLength[@type=\"" + (type == null ? "long" : type)
+ "\"]/unit[@type=\"duration-" + OLD_PATH_MATCHER.group(1)
+ "\"]/unitPattern[@count=\"" + OLD_PATH_MATCHER.group(2)
+ "\"]";
}
return xpath;
}
}