From 5b13adcea97c19750ebfd5be226c48bb646708cf Mon Sep 17 00:00:00 2001 From: Robin Rosenberg Date: Mon, 28 Dec 2009 16:49:50 +0100 Subject: Add support for creating detached heads An extra flag when creating a RefUpdate object allows the caller to destroy the symref and replace it with an object ref, a.k.a. detached HEAD. Change-Id: Ia88d48eab1eb4861ebfa39e3be9258c3824a19db Signed-off-by: Robin Rosenberg Signed-off-by: Shawn O. Pearce --- .../src/org/eclipse/jgit/lib/RefDatabase.java | 20 ++++++++++++++++++++ .../src/org/eclipse/jgit/lib/Repository.java | 18 ++++++++++++++++++ 2 files changed, 38 insertions(+) (limited to 'org.eclipse.jgit/src') diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/lib/RefDatabase.java b/org.eclipse.jgit/src/org/eclipse/jgit/lib/RefDatabase.java index 67358c8084..fb6a27db30 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/lib/RefDatabase.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/lib/RefDatabase.java @@ -137,10 +137,30 @@ class RefDatabase { * to the base ref, as the symbolic ref could not be read. */ RefUpdate newUpdate(final String name) throws IOException { + return newUpdate(name, false); + } + + /** + * Create a command to update, create or delete a ref in this repository. + * + * @param name + * name of the ref the caller wants to modify. + * @param detach + * true to detach the ref, i.e. replace symref with object ref + * @return an update command. The caller must finish populating this command + * and then invoke one of the update methods to actually make a + * change. + * @throws IOException + * a symbolic ref was passed in and could not be resolved back + * to the base ref, as the symbolic ref could not be read. + */ + RefUpdate newUpdate(final String name, boolean detach) throws IOException { refreshPackedRefs(); Ref r = readRefBasic(name, 0); if (r == null) r = new Ref(Ref.Storage.NEW, name, null); + else if (detach) + r = new Ref(Ref.Storage.NEW, name, r.getObjectId()); return new RefUpdate(this, r, fileForRef(r.getName())); } diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/lib/Repository.java b/org.eclipse.jgit/src/org/eclipse/jgit/lib/Repository.java index 5b8b34fa6a..f576b057ca 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/lib/Repository.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/lib/Repository.java @@ -501,6 +501,24 @@ public class Repository { return refs.newUpdate(ref); } + /** + * Create a command to update, create or delete a ref in this repository. + * + * @param ref + * name of the ref the caller wants to modify. + * @param detach + * true to create a detached head + * @return an update command. The caller must finish populating this command + * and then invoke one of the update methods to actually make a + * change. + * @throws IOException + * a symbolic ref was passed in and could not be resolved back + * to the base ref, as the symbolic ref could not be read. + */ + public RefUpdate updateRef(final String ref, final boolean detach) throws IOException { + return refs.newUpdate(ref, detach); + } + /** * Create a command to rename a ref in this repository * -- cgit v1.2.3