{"thread":{"id":"20618","subject":"[JGIT PATCH 1/2] Add time and timezone to SystemReader properties","startedAt":"2009-08-16T21:36:51Z","lastAt":"2009-08-16T21:36:52Z","messageCount":2,"participants":["Robin Rosenberg"],"isPatch":true,"patchVersion":1,"patchTotal":2},"messages":[{"id":"120788","messageId":"1250458612-21095-1-git-send-email-robin.rosenberg@dewire.com","threadId":"20618","inReplyTo":null,"subject":"[JGIT PATCH 1/2] Add time and timezone to SystemReader properties","fromName":"Robin Rosenberg","fromEmail":"robin.rosenberg@dewire.com","sentAt":"2009-08-16T21:36:51Z","receivedAt":"2009-08-16T21:36:51Z","isPatch":true,"sender":{"key":"robin.rosenberg@dewire.com","avatar":"https://avatars.githubusercontent.com/u/46357?v=4"},"body":"Having an uncontrollable variable time and timezone is\ninconvenient for unit testing.\n\nSigned-off-by: Robin Rosenberg <robin.rosenberg@dewire.com>\n---\n .../tst/org/spearce/jgit/lib/MockSystemReader.java |   11 ++++++++++\n .../src/org/spearce/jgit/lib/PersonIdent.java      |    6 +++-\n .../src/org/spearce/jgit/util/SystemReader.java    |   22 ++++++++++++++++++++\n 3 files changed, 37 insertions(+), 2 deletions(-)\n\ndiff --git a/org.spearce.jgit.test/tst/org/spearce/jgit/lib/MockSystemReader.java b/org.spearce.jgit.test/tst/org/spearce/jgit/lib/MockSystemReader.java\nindex 7a65f99..e51df7e 100644\n--- a/org.spearce.jgit.test/tst/org/spearce/jgit/lib/MockSystemReader.java\n+++ b/org.spearce.jgit.test/tst/org/spearce/jgit/lib/MockSystemReader.java\n@@ -39,6 +39,7 @@\n \n import java.util.HashMap;\n import java.util.Map;\n+import java.util.TimeZone;\n \n import org.spearce.jgit.util.SystemReader;\n \n@@ -75,4 +76,14 @@ public FileBasedConfig openUserConfig() {\n \tpublic String getHostname() {\n \t\treturn \"fake.host.example.com\";\n \t}\n+\n+\t@Override\n+\tpublic long getCurrentTime() {\n+\t\treturn 1250379778668L; // Sat Aug 15 20:12:58 GMT-03:30 2009 \n+\t}\n+\n+\t@Override\n+\tpublic int getTimezone(long when) {\n+\t\treturn TimeZone.getTimeZone(\"GMT-3:30\").getOffset(when);\n+\t}\n }\ndiff --git a/org.spearce.jgit/src/org/spearce/jgit/lib/PersonIdent.java b/org.spearce.jgit/src/org/spearce/jgit/lib/PersonIdent.java\nindex 393e177..a0418ab 100644\n--- a/org.spearce.jgit/src/org/spearce/jgit/lib/PersonIdent.java\n+++ b/org.spearce.jgit/src/org/spearce/jgit/lib/PersonIdent.java\n@@ -44,6 +44,8 @@\n import java.util.Locale;\n import java.util.TimeZone;\n \n+import org.spearce.jgit.util.SystemReader;\n+\n /**\n  * A combination of a person identity and time in Git.\n  * \n@@ -70,8 +72,8 @@ public PersonIdent(final Repository repo) {\n \t\tfinal RepositoryConfig config = repo.getConfig();\n \t\tname = config.getCommitterName();\n \t\temailAddress = config.getCommitterEmail();\n-\t\twhen = System.currentTimeMillis();\n-\t\ttzOffset = TimeZone.getDefault().getOffset(when) / (60 * 1000);\n+\t\twhen = SystemReader.getInstance().getCurrentTime();\n+\t\ttzOffset = SystemReader.getInstance().getTimezone(when);\n \t}\n \n \t/**\ndiff --git a/org.spearce.jgit/src/org/spearce/jgit/util/SystemReader.java b/org.spearce.jgit/src/org/spearce/jgit/util/SystemReader.java\nindex 51a0d29..083d120 100644\n--- a/org.spearce.jgit/src/org/spearce/jgit/util/SystemReader.java\n+++ b/org.spearce.jgit/src/org/spearce/jgit/util/SystemReader.java\n@@ -40,6 +40,7 @@\n import java.io.File;\n import java.net.InetAddress;\n import java.net.UnknownHostException;\n+import java.util.TimeZone;\n \n import org.spearce.jgit.lib.FileBasedConfig;\n \n@@ -81,6 +82,16 @@ public String getHostname() {\n \t\t\t}\n \t\t\treturn hostname;\n \t\t}\n+\n+\t\t@Override\n+\t\tpublic long getCurrentTime() {\n+\t\t\treturn System.currentTimeMillis();\n+\t\t}\n+\n+\t\t@Override\n+\t\tpublic int getTimezone(long when) {\n+\t\t\treturn TimeZone.getDefault().getOffset(when) / (60 * 1000);\n+\t\t}\n \t};\n \n \t/** @return the live instance to read system properties. */\n@@ -120,4 +131,15 @@ public static void setInstance(SystemReader newReader) {\n \t * @return the git configuration found in the user home\n \t */\n \tpublic abstract FileBasedConfig openUserConfig();\n+\n+\t/**\n+\t * @return the current system time\n+\t */\n+\tpublic abstract long getCurrentTime();\n+\n+\t/**\n+\t * @param when TODO\n+\t * @return the local time zone\n+\t */\n+\tpublic abstract int getTimezone(long when);\n }\n-- \n1.6.4.115.gc0eb0\n"},{"id":"120789","messageId":"1250458612-21095-2-git-send-email-robin.rosenberg@dewire.com","threadId":"20618","inReplyTo":"1250458612-21095-1-git-send-email-robin.rosenberg@dewire.com","subject":"[JGIT PATCH 2/2] Update the reflog for HEAD when the referenced branch is modified","fromName":"Robin Rosenberg","fromEmail":"robin.rosenberg@dewire.com","sentAt":"2009-08-16T21:36:52Z","receivedAt":"2009-08-16T21:36:52Z","isPatch":true,"sender":{"key":"robin.rosenberg@dewire.com","avatar":"https://avatars.githubusercontent.com/u/46357?v=4"},"body":"This omission was mentioned in http://code.google.com/p/egit/issues/detail?id=5\n\nSigned-off-by: Robin Rosenberg <robin.rosenberg@dewire.com>\n---\n .../tst/org/spearce/jgit/lib/RefUpdateTest.java    |   32 ++++++++++++++++++++\n .../src/org/spearce/jgit/lib/RefLogWriter.java     |    6 ++-\n .../src/org/spearce/jgit/lib/RefRename.java        |    6 +++-\n .../src/org/spearce/jgit/lib/RefUpdate.java        |   11 ++++++-\n 4 files changed, 51 insertions(+), 4 deletions(-)\n\ndiff --git a/org.spearce.jgit.test/tst/org/spearce/jgit/lib/RefUpdateTest.java b/org.spearce.jgit.test/tst/org/spearce/jgit/lib/RefUpdateTest.java\nindex 655e54e..edccf37 100644\n--- a/org.spearce.jgit.test/tst/org/spearce/jgit/lib/RefUpdateTest.java\n+++ b/org.spearce.jgit.test/tst/org/spearce/jgit/lib/RefUpdateTest.java\n@@ -82,6 +82,15 @@ public void testNoCacheObjectIdSubclass() throws IOException {\n \t\tassertNotSame(newid, r.getObjectId());\n \t\tassertSame(ObjectId.class, r.getObjectId().getClass());\n \t\tassertEquals(newid.copy(), r.getObjectId());\n+\t\tList<org.spearce.jgit.lib.ReflogReader.Entry> reverseEntries1 = db.getReflogReader(\"refs/heads/abc\").getReverseEntries();\n+\t\torg.spearce.jgit.lib.ReflogReader.Entry entry1 = reverseEntries1.get(0);\n+\t\tassertEquals(1, reverseEntries1.size());\n+\t\tassertEquals(ObjectId.zeroId(), entry1.getOldId());\n+\t\tassertEquals(r.getObjectId(), entry1.getNewId());\n+\t\tassertEquals(new PersonIdent(db).toString(),  entry1.getWho().toString());\n+\t\tassertEquals(\"\", entry1.getComment());\n+\t\tList<org.spearce.jgit.lib.ReflogReader.Entry> reverseEntries2 = db.getReflogReader(\"HEAD\").getReverseEntries();\n+\t\tassertEquals(0, reverseEntries2.size());\n \t}\n \n \tpublic void testNewNamespaceConflictWithLoosePrefixNameExists()\n@@ -103,6 +112,8 @@ public void testNewNamespaceConflictWithLoosePrefixNameExists()\n \t\tru.setNewObjectId(newid2);\n \t\tResult update2 = ru2.update();\n \t\tassertEquals(Result.LOCK_FAILURE, update2);\n+\t\tassertEquals(1, db.getReflogReader(\"refs/heads/z\").getReverseEntries().size());\n+\t\tassertEquals(0, db.getReflogReader(\"HEAD\").getReverseEntries().size());\n \t}\n \n \tpublic void testNewNamespaceConflictWithPackedPrefixNameExists()\n@@ -115,6 +126,8 @@ public void testNewNamespaceConflictWithPackedPrefixNameExists()\n \t\tru.setNewObjectId(newid);\n \t\tResult update = ru.update();\n \t\tassertEquals(Result.LOCK_FAILURE, update);\n+\t\tassertNull(db.getReflogReader(\"refs/heads/master/x\"));\n+\t\tassertEquals(0, db.getReflogReader(\"HEAD\").getReverseEntries().size());\n \t}\n \n \tpublic void testNewNamespaceConflictWithLoosePrefixOfExisting()\n@@ -136,6 +149,9 @@ public void testNewNamespaceConflictWithLoosePrefixOfExisting()\n \t\tru.setNewObjectId(newid2);\n \t\tResult update2 = ru2.update();\n \t\tassertEquals(Result.LOCK_FAILURE, update2);\n+\t\tassertEquals(1, db.getReflogReader(\"refs/heads/z/a\").getReverseEntries().size());\n+\t\tassertNull(db.getReflogReader(\"refs/heads/z\"));\n+\t\tassertEquals(0, db.getReflogReader(\"HEAD\").getReverseEntries().size());\n \t}\n \n \tpublic void testNewNamespaceConflictWithPackedPrefixOfExisting()\n@@ -148,6 +164,8 @@ public void testNewNamespaceConflictWithPackedPrefixOfExisting()\n \t\tru.setNewObjectId(newid);\n \t\tResult update = ru.update();\n \t\tassertEquals(Result.LOCK_FAILURE, update);\n+\t\tassertNull(db.getReflogReader(\"refs/heads/prefix\"));\n+\t\tassertEquals(0, db.getReflogReader(\"HEAD\").getReverseEntries().size());\n \t}\n \n \t/**\n@@ -167,6 +185,8 @@ public void testDeleteHEADreferencedRef() throws IOException {\n \t\tResult delete = updateRef2.delete();\n \t\tassertEquals(Result.REJECTED_CURRENT_BRANCH, delete);\n \t\tassertEquals(pid, db.resolve(\"refs/heads/master\"));\n+\t\tassertEquals(1,db.getReflogReader(\"refs/heads/master\").getReverseEntries().size());\n+\t\tassertEquals(0,db.getReflogReader(\"HEAD\").getReverseEntries().size());\n \t}\n \n \tpublic void testLooseDelete() throws IOException {\n@@ -175,11 +195,14 @@ public void testLooseDelete() throws IOException {\n \t\tref.update(); // create loose ref\n \t\tref = updateRef(newRef); // refresh\n \t\tdelete(ref, Result.NO_CHANGE);\n+\t\tassertNull(db.getReflogReader(\"refs/heads/abc\"));\n \t}\n \n \tpublic void testDeleteHead() throws IOException {\n \t\tfinal RefUpdate ref = updateRef(Constants.HEAD);\n \t\tdelete(ref, Result.REJECTED_CURRENT_BRANCH, true, false);\n+\t\tassertEquals(0, db.getReflogReader(\"refs/heads/master\").getReverseEntries().size());\n+\t\tassertEquals(0, db.getReflogReader(\"HEAD\").getReverseEntries().size());\n \t}\n \n \t/**\n@@ -498,6 +521,10 @@ public void testRenameBranchAlsoInPack() throws IOException {\n \t\tassertNull(db.resolve(\"refs/heads/b\"));\n \t\tassertEquals(\"Branch: renamed b to new/name\", db.getReflogReader(\n \t\t\t\t\"new/name\").getLastEntry().getComment());\n+\t\tassertEquals(3, db.getReflogReader(\"refs/heads/new/name\").getReverseEntries().size());\n+\t\tassertEquals(\"Branch: renamed b to new/name\", db.getReflogReader(\"refs/heads/new/name\").getReverseEntries().get(0).getComment());\n+\t\tassertEquals(0, db.getReflogReader(\"HEAD\").getReverseEntries().size());\n+\t\t// make sure b's log file is gone too.\n \t\tassertFalse(new File(db.getDirectory(), \"logs/refs/heads/b\").exists());\n \n \t\t// Create new Repository instance, to reread caches and make sure our\n@@ -640,6 +667,9 @@ public void testRenameRefNameColission1avoided() throws IOException {\n \t\t\t\t.getReverseEntries().get(1).getComment());\n \t\tassertEquals(\"Setup\", db.getReflogReader(\"a/b\").getReverseEntries()\n \t\t\t\t.get(2).getComment());\n+\t\t// same thing was logged to HEAD\n+\t\tassertEquals(\"Branch: renamed a to a/b\", db.getReflogReader(\"HEAD\")\n+\t\t\t\t.getReverseEntries().get(0).getComment());\n \t}\n \n \tpublic void testRenameRefNameColission2avoided() throws IOException {\n@@ -673,5 +703,7 @@ public void testRenameRefNameColission2avoided() throws IOException {\n \t\t\t\t.getReverseEntries().get(1).getComment());\n \t\tassertEquals(\"Setup\", db.getReflogReader(\"prefix\").getReverseEntries()\n \t\t\t\t.get(2).getComment());\n+\t\tassertEquals(\"Branch: renamed prefix/a to prefix\", db.getReflogReader(\n+\t\t\t\t\"HEAD\").getReverseEntries().get(0).getComment());\n \t}\n }\ndiff --git a/org.spearce.jgit/src/org/spearce/jgit/lib/RefLogWriter.java b/org.spearce.jgit/src/org/spearce/jgit/lib/RefLogWriter.java\nindex 0864209..4aad809 100644\n--- a/org.spearce.jgit/src/org/spearce/jgit/lib/RefLogWriter.java\n+++ b/org.spearce.jgit/src/org/spearce/jgit/lib/RefLogWriter.java\n@@ -56,13 +56,15 @@ static void append(final RefUpdate u, final String msg) throws IOException {\n \t\tfinal PersonIdent ident = u.getRefLogIdent();\n \n \t\tappendOneRecord(oldId, newId, ident, msg, db, u.getName());\n+\t\tif (!u.getName().equals(u.getOrigName()))\n+\t\t\tappendOneRecord(oldId, newId, ident, msg, db, u.getOrigName());\n \t}\n \n-\tstatic void append(RefRename refRename, String msg) throws IOException {\n+\tstatic void append(RefRename refRename, String logName, String msg) throws IOException {\n \t\tfinal ObjectId id = refRename.getObjectId();\n \t\tfinal Repository db = refRename.getRepository();\n \t\tfinal PersonIdent ident = refRename.getRefLogIdent();\n-\t\tappendOneRecord(id, id, ident, msg, db, refRename.getToName());\n+\t\tappendOneRecord(id, id, ident, msg, db, logName);\n \t}\n \n \tstatic void renameTo(final Repository db, final RefUpdate from,\ndiff --git a/org.spearce.jgit/src/org/spearce/jgit/lib/RefRename.java b/org.spearce.jgit/src/org/spearce/jgit/lib/RefRename.java\nindex c89459b..0718620 100644\n--- a/org.spearce.jgit/src/org/spearce/jgit/lib/RefRename.java\n+++ b/org.spearce.jgit/src/org/spearce/jgit/lib/RefRename.java\n@@ -136,9 +136,13 @@ public Result rename() throws IOException {\n \t\t\t} else {\n \t\t\t\tdb.fireRefsMaybeChanged();\n \t\t\t}\n-\t\t\tRefLogWriter.append(this, \"Branch: renamed \"\n+\t\t\tRefLogWriter.append(this, newToUpdate.getName(), \"Branch: renamed \"\n \t\t\t\t\t+ db.shortenRefName(oldFromDelete.getName()) + \" to \"\n \t\t\t\t\t+ db.shortenRefName(newToUpdate.getName()));\n+\t\t\tif (renameHEADtoo)\n+\t\t\t\tRefLogWriter.append(this, Constants.HEAD, \"Branch: renamed \"\n+\t\t\t\t\t\t+ db.shortenRefName(oldFromDelete.getName()) + \" to \"\n+\t\t\t\t\t\t+ db.shortenRefName(newToUpdate.getName()));\n \t\t\treturn renameResult = Result.RENAMED;\n \t\t} catch (RuntimeException e) {\n \t\t\tthrow e;\ndiff --git a/org.spearce.jgit/src/org/spearce/jgit/lib/RefUpdate.java b/org.spearce.jgit/src/org/spearce/jgit/lib/RefUpdate.java\nindex f8ecc3c..69399ec 100644\n--- a/org.spearce.jgit/src/org/spearce/jgit/lib/RefUpdate.java\n+++ b/org.spearce.jgit/src/org/spearce/jgit/lib/RefUpdate.java\n@@ -182,13 +182,22 @@ public Repository getRepository() {\n \t/**\n \t * Get the name of the ref this update will operate on.\n \t * \n-\t * @return name of this ref.\n+\t * @return name of underlying ref.\n \t */\n \tpublic String getName() {\n \t\treturn ref.getName();\n \t}\n \n \t/**\n+\t * Get the requested name of the ref thit update will operate on\n+\t *\n+\t * @return original (requested) name of the underlying ref.\n+\t */\n+\tpublic String getOrigName() {\n+\t\treturn ref.getOrigName();\n+\t}\n+\n+\t/**\n \t * Get the new value the ref will be (or was) updated to.\n \t * \n \t * @return new value. Null if the caller has not configured it.\n-- \n1.6.4.115.gc0eb0\n"}]}