# HG changeset patch # User Artem Tikhomirov # Date 1305573036 -7200 # Node ID 4252faa556cd493583b1e52cb135f93030867320 # Parent 644ee58c9f16743104d02dbebe0ee3a1f36b4dd3 Use custom timezone identifier to avoid applying daylight savings from the zone guessed diff -r 644ee58c9f16 -r 4252faa556cd src/org/tmatesoft/hg/core/HgDate.java --- a/src/org/tmatesoft/hg/core/HgDate.java Fri Apr 29 02:37:52 2011 +0200 +++ b/src/org/tmatesoft/hg/core/HgDate.java Mon May 16 21:10:36 2011 +0200 @@ -42,9 +42,16 @@ // @see http://pydoc.org/2.5.1/time.html time.timezone -- difference in seconds between UTC and local standard time // UTC - local = timezone. local = UTC - timezone // In Java, timezone is positive right of Greenwich, UTC+timezone = local + // + // + /* + * The approach with available-short didn't work out as final timezone still relied + * on daylight saving settings (and added/substracted hour shift according to date supplied) + * E.g. 1218917104000 in zone GMT+2 (hello sample, changeset #2), results in EET timezone and 23 hours instead of 22 + * String[] available = TimeZone.getAvailableIDs(-timezone * 1000); assert available != null && available.length > 0 : String.valueOf(timezone); - // this is sort of hach, I don't know another way how to get + // this is sort of hack, I don't know another way how to get // abbreviated name from zone offset (other than to have own mapping) // And I can't use any id, because e.g. zone with id "US/Mountain" // gives incorrect (according to hg cmdline) result, unlike MST or US/Arizona (all ids for zone -0700) @@ -53,6 +60,11 @@ // XXX in fact, might need to handle daylight saving time, but not sure how, // getTimeZone(GMT-timezone*1000).inDaylightTime()? TimeZone tz = TimeZone.getTimeZone(shortID); + */ + int tz_hours = -timezone/3600; + int tz_mins = timezone % 3600; + String customId = String.format("GMT%+02d:%02d", tz_hours, tz_mins); + TimeZone tz = TimeZone.getTimeZone(customId); tzone = tz; } diff -r 644ee58c9f16 -r 4252faa556cd test/org/tmatesoft/hg/test/TestHistory.java --- a/test/org/tmatesoft/hg/test/TestHistory.java Fri Apr 29 02:37:52 2011 +0200 +++ b/test/org/tmatesoft/hg/test/TestHistory.java Mon May 16 21:10:36 2011 +0200 @@ -20,6 +20,7 @@ import static org.hamcrest.CoreMatchers.is; import static org.junit.Assert.assertTrue; +import java.io.File; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; @@ -69,11 +70,12 @@ public TestHistory() throws Exception { this(new HgLookup().detectFromWorkingDir()); +// this(new HgLookup().detect("\\temp\\hg\\hello")); } private TestHistory(HgRepository hgRepo) { repo = hgRepo; - eh = new ExecHelper(changelogParser = new LogOutputParser(true), null); + eh = new ExecHelper(changelogParser = new LogOutputParser(true), new File(repo.getLocation())); } @@ -88,39 +90,34 @@ @Test public void testFollowHistory() throws Exception { final Path f = Path.create("cmdline/org/tmatesoft/hg/console/Remote.java"); - try { - if (repo.getFileNode(f).exists()) { // FIXME getFileNode shall not fail with IAE - changelogParser.reset(); - eh.run("hg", "log", "--debug", "--follow", f.toString()); - - class H extends CollectHandler implements FileHistoryHandler { - boolean copyReported = false; - boolean fromMatched = false; - public void copy(FileRevision from, FileRevision to) { - copyReported = true; - fromMatched = "src/com/tmate/hgkit/console/Remote.java".equals(from.getPath().toString()); - } - }; - H h = new H(); - new HgLogCommand(repo).file(f, true).execute(h); - String what = "hg log - FOLLOW FILE HISTORY"; - errorCollector.checkThat(what + "#copyReported ", h.copyReported, is(true)); - errorCollector.checkThat(what + "#copyFromMatched", h.fromMatched, is(true)); - // - // cmdline always gives in changesets in order from newest (bigger rev number) to oldest. - // LogCommand does other way round, from oldest to newest, follewed by revisions of copy source, if any - // (apparently older than oldest of the copy target). Hence need to sort Java results according to rev numbers - final LinkedList sorted = new LinkedList(h.getChanges()); - Collections.sort(sorted, new Comparator() { - public int compare(HgChangeset cs1, HgChangeset cs2) { - return cs1.getRevision() < cs2.getRevision() ? 1 : -1; - } - }); - report(what, sorted, false); + assertTrue(repo.getFileNode(f).exists()); + changelogParser.reset(); + eh.run("hg", "log", "--debug", "--follow", f.toString()); + + class H extends CollectHandler implements FileHistoryHandler { + boolean copyReported = false; + boolean fromMatched = false; + public void copy(FileRevision from, FileRevision to) { + copyReported = true; + fromMatched = "src/com/tmate/hgkit/console/Remote.java".equals(from.getPath().toString()); } - } catch (IllegalArgumentException ex) { - System.out.println("Can't test file history with follow because need to query specific file with history"); - } + }; + H h = new H(); + new HgLogCommand(repo).file(f, true).execute(h); + String what = "hg log - FOLLOW FILE HISTORY"; + errorCollector.checkThat(what + "#copyReported ", h.copyReported, is(true)); + errorCollector.checkThat(what + "#copyFromMatched", h.fromMatched, is(true)); + // + // cmdline always gives in changesets in order from newest (bigger rev number) to oldest. + // LogCommand does other way round, from oldest to newest, follewed by revisions of copy source, if any + // (apparently older than oldest of the copy target). Hence need to sort Java results according to rev numbers + final LinkedList sorted = new LinkedList(h.getChanges()); + Collections.sort(sorted, new Comparator() { + public int compare(HgChangeset cs1, HgChangeset cs2) { + return cs1.getRevision() < cs2.getRevision() ? 1 : -1; + } + }); + report(what, sorted, false); } private void report(String what, List r, boolean reverseConsoleResult) { @@ -142,7 +139,7 @@ } Record cr = consoleResultItr.next(); int x = cs.getRevision() == cr.changesetIndex ? 0x1 : 0; - x |= cs.getDate().equals(cr.date) ? 0x2 : 0; + x |= cs.getDate().toString().equals(cr.date) ? 0x2 : 0; x |= cs.getNodeid().toString().equals(cr.changesetNodeid) ? 0x4 : 0; x |= cs.getUser().equals(cr.user) ? 0x8 : 0; // need to do trim() on comment because command-line template does, and there are