From: Robin Rosenberg <robin.rosenberg@dewire.com>
To: spearce@spearce.org
Cc: git@vger.kernel.org, Robin Rosenberg <robin.rosenberg@dewire.com>
Subject: [JGIT PATCH 2/2] Update the reflog for HEAD when the referenced branch is modified
Date: Sun, 16 Aug 2009 23:36:52 +0200 [thread overview]
Message-ID: <1250458612-21095-2-git-send-email-robin.rosenberg@dewire.com> (raw)
In-Reply-To: <1250458612-21095-1-git-send-email-robin.rosenberg@dewire.com>
This omission was mentioned in http://code.google.com/p/egit/issues/detail?id=5
Signed-off-by: Robin Rosenberg <robin.rosenberg@dewire.com>
---
.../tst/org/spearce/jgit/lib/RefUpdateTest.java | 32 ++++++++++++++++++++
.../src/org/spearce/jgit/lib/RefLogWriter.java | 6 ++-
.../src/org/spearce/jgit/lib/RefRename.java | 6 +++-
.../src/org/spearce/jgit/lib/RefUpdate.java | 11 ++++++-
4 files changed, 51 insertions(+), 4 deletions(-)
diff --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
index 655e54e..edccf37 100644
--- a/org.spearce.jgit.test/tst/org/spearce/jgit/lib/RefUpdateTest.java
+++ b/org.spearce.jgit.test/tst/org/spearce/jgit/lib/RefUpdateTest.java
@@ -82,6 +82,15 @@ public void testNoCacheObjectIdSubclass() throws IOException {
assertNotSame(newid, r.getObjectId());
assertSame(ObjectId.class, r.getObjectId().getClass());
assertEquals(newid.copy(), r.getObjectId());
+ List<org.spearce.jgit.lib.ReflogReader.Entry> reverseEntries1 = db.getReflogReader("refs/heads/abc").getReverseEntries();
+ org.spearce.jgit.lib.ReflogReader.Entry entry1 = reverseEntries1.get(0);
+ assertEquals(1, reverseEntries1.size());
+ assertEquals(ObjectId.zeroId(), entry1.getOldId());
+ assertEquals(r.getObjectId(), entry1.getNewId());
+ assertEquals(new PersonIdent(db).toString(), entry1.getWho().toString());
+ assertEquals("", entry1.getComment());
+ List<org.spearce.jgit.lib.ReflogReader.Entry> reverseEntries2 = db.getReflogReader("HEAD").getReverseEntries();
+ assertEquals(0, reverseEntries2.size());
}
public void testNewNamespaceConflictWithLoosePrefixNameExists()
@@ -103,6 +112,8 @@ public void testNewNamespaceConflictWithLoosePrefixNameExists()
ru.setNewObjectId(newid2);
Result update2 = ru2.update();
assertEquals(Result.LOCK_FAILURE, update2);
+ assertEquals(1, db.getReflogReader("refs/heads/z").getReverseEntries().size());
+ assertEquals(0, db.getReflogReader("HEAD").getReverseEntries().size());
}
public void testNewNamespaceConflictWithPackedPrefixNameExists()
@@ -115,6 +126,8 @@ public void testNewNamespaceConflictWithPackedPrefixNameExists()
ru.setNewObjectId(newid);
Result update = ru.update();
assertEquals(Result.LOCK_FAILURE, update);
+ assertNull(db.getReflogReader("refs/heads/master/x"));
+ assertEquals(0, db.getReflogReader("HEAD").getReverseEntries().size());
}
public void testNewNamespaceConflictWithLoosePrefixOfExisting()
@@ -136,6 +149,9 @@ public void testNewNamespaceConflictWithLoosePrefixOfExisting()
ru.setNewObjectId(newid2);
Result update2 = ru2.update();
assertEquals(Result.LOCK_FAILURE, update2);
+ assertEquals(1, db.getReflogReader("refs/heads/z/a").getReverseEntries().size());
+ assertNull(db.getReflogReader("refs/heads/z"));
+ assertEquals(0, db.getReflogReader("HEAD").getReverseEntries().size());
}
public void testNewNamespaceConflictWithPackedPrefixOfExisting()
@@ -148,6 +164,8 @@ public void testNewNamespaceConflictWithPackedPrefixOfExisting()
ru.setNewObjectId(newid);
Result update = ru.update();
assertEquals(Result.LOCK_FAILURE, update);
+ assertNull(db.getReflogReader("refs/heads/prefix"));
+ assertEquals(0, db.getReflogReader("HEAD").getReverseEntries().size());
}
/**
@@ -167,6 +185,8 @@ public void testDeleteHEADreferencedRef() throws IOException {
Result delete = updateRef2.delete();
assertEquals(Result.REJECTED_CURRENT_BRANCH, delete);
assertEquals(pid, db.resolve("refs/heads/master"));
+ assertEquals(1,db.getReflogReader("refs/heads/master").getReverseEntries().size());
+ assertEquals(0,db.getReflogReader("HEAD").getReverseEntries().size());
}
public void testLooseDelete() throws IOException {
@@ -175,11 +195,14 @@ public void testLooseDelete() throws IOException {
ref.update(); // create loose ref
ref = updateRef(newRef); // refresh
delete(ref, Result.NO_CHANGE);
+ assertNull(db.getReflogReader("refs/heads/abc"));
}
public void testDeleteHead() throws IOException {
final RefUpdate ref = updateRef(Constants.HEAD);
delete(ref, Result.REJECTED_CURRENT_BRANCH, true, false);
+ assertEquals(0, db.getReflogReader("refs/heads/master").getReverseEntries().size());
+ assertEquals(0, db.getReflogReader("HEAD").getReverseEntries().size());
}
/**
@@ -498,6 +521,10 @@ public void testRenameBranchAlsoInPack() throws IOException {
assertNull(db.resolve("refs/heads/b"));
assertEquals("Branch: renamed b to new/name", db.getReflogReader(
"new/name").getLastEntry().getComment());
+ assertEquals(3, db.getReflogReader("refs/heads/new/name").getReverseEntries().size());
+ assertEquals("Branch: renamed b to new/name", db.getReflogReader("refs/heads/new/name").getReverseEntries().get(0).getComment());
+ assertEquals(0, db.getReflogReader("HEAD").getReverseEntries().size());
+ // make sure b's log file is gone too.
assertFalse(new File(db.getDirectory(), "logs/refs/heads/b").exists());
// Create new Repository instance, to reread caches and make sure our
@@ -640,6 +667,9 @@ public void testRenameRefNameColission1avoided() throws IOException {
.getReverseEntries().get(1).getComment());
assertEquals("Setup", db.getReflogReader("a/b").getReverseEntries()
.get(2).getComment());
+ // same thing was logged to HEAD
+ assertEquals("Branch: renamed a to a/b", db.getReflogReader("HEAD")
+ .getReverseEntries().get(0).getComment());
}
public void testRenameRefNameColission2avoided() throws IOException {
@@ -673,5 +703,7 @@ public void testRenameRefNameColission2avoided() throws IOException {
.getReverseEntries().get(1).getComment());
assertEquals("Setup", db.getReflogReader("prefix").getReverseEntries()
.get(2).getComment());
+ assertEquals("Branch: renamed prefix/a to prefix", db.getReflogReader(
+ "HEAD").getReverseEntries().get(0).getComment());
}
}
diff --git a/org.spearce.jgit/src/org/spearce/jgit/lib/RefLogWriter.java b/org.spearce.jgit/src/org/spearce/jgit/lib/RefLogWriter.java
index 0864209..4aad809 100644
--- a/org.spearce.jgit/src/org/spearce/jgit/lib/RefLogWriter.java
+++ b/org.spearce.jgit/src/org/spearce/jgit/lib/RefLogWriter.java
@@ -56,13 +56,15 @@ static void append(final RefUpdate u, final String msg) throws IOException {
final PersonIdent ident = u.getRefLogIdent();
appendOneRecord(oldId, newId, ident, msg, db, u.getName());
+ if (!u.getName().equals(u.getOrigName()))
+ appendOneRecord(oldId, newId, ident, msg, db, u.getOrigName());
}
- static void append(RefRename refRename, String msg) throws IOException {
+ static void append(RefRename refRename, String logName, String msg) throws IOException {
final ObjectId id = refRename.getObjectId();
final Repository db = refRename.getRepository();
final PersonIdent ident = refRename.getRefLogIdent();
- appendOneRecord(id, id, ident, msg, db, refRename.getToName());
+ appendOneRecord(id, id, ident, msg, db, logName);
}
static void renameTo(final Repository db, final RefUpdate from,
diff --git a/org.spearce.jgit/src/org/spearce/jgit/lib/RefRename.java b/org.spearce.jgit/src/org/spearce/jgit/lib/RefRename.java
index c89459b..0718620 100644
--- a/org.spearce.jgit/src/org/spearce/jgit/lib/RefRename.java
+++ b/org.spearce.jgit/src/org/spearce/jgit/lib/RefRename.java
@@ -136,9 +136,13 @@ public Result rename() throws IOException {
} else {
db.fireRefsMaybeChanged();
}
- RefLogWriter.append(this, "Branch: renamed "
+ RefLogWriter.append(this, newToUpdate.getName(), "Branch: renamed "
+ db.shortenRefName(oldFromDelete.getName()) + " to "
+ db.shortenRefName(newToUpdate.getName()));
+ if (renameHEADtoo)
+ RefLogWriter.append(this, Constants.HEAD, "Branch: renamed "
+ + db.shortenRefName(oldFromDelete.getName()) + " to "
+ + db.shortenRefName(newToUpdate.getName()));
return renameResult = Result.RENAMED;
} catch (RuntimeException e) {
throw e;
diff --git a/org.spearce.jgit/src/org/spearce/jgit/lib/RefUpdate.java b/org.spearce.jgit/src/org/spearce/jgit/lib/RefUpdate.java
index f8ecc3c..69399ec 100644
--- a/org.spearce.jgit/src/org/spearce/jgit/lib/RefUpdate.java
+++ b/org.spearce.jgit/src/org/spearce/jgit/lib/RefUpdate.java
@@ -182,13 +182,22 @@ public Repository getRepository() {
/**
* Get the name of the ref this update will operate on.
*
- * @return name of this ref.
+ * @return name of underlying ref.
*/
public String getName() {
return ref.getName();
}
/**
+ * Get the requested name of the ref thit update will operate on
+ *
+ * @return original (requested) name of the underlying ref.
+ */
+ public String getOrigName() {
+ return ref.getOrigName();
+ }
+
+ /**
* Get the new value the ref will be (or was) updated to.
*
* @return new value. Null if the caller has not configured it.
--
1.6.4.115.gc0eb0
prev parent reply other threads:[~2009-08-16 21:37 UTC|newest]
Thread overview: 2+ messages / expand[flat|nested] mbox.gz Atom feed top
2009-08-16 21:36 [JGIT PATCH 1/2] Add time and timezone to SystemReader properties Robin Rosenberg
2009-08-16 21:36 ` Robin Rosenberg [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1250458612-21095-2-git-send-email-robin.rosenberg@dewire.com \
--to=robin.rosenberg@dewire.com \
--cc=git@vger.kernel.org \
--cc=spearce@spearce.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox