git/list[1] front-page[2] threads[3] people[4] search[5] about
 

Re: [JGIT PATCH 1/4] Ensured that RefUpdate cannot delete current branch

From
Shawn O. Pearce <spearce@spearce.org>
Date
Aug 22, 2008, 23:22 UTC
Message-ID
<20080822232226.GP3483@spearce.org>
In-Reply-To
<1219445147-6801-2-git-send-email-charleso@charleso.org>
Charles O'Farrell <charleso@charleso.org> wrote:
> If attempted it will return a REJECTED_CURRENT_BRANCH Result.
Show 10 quoted lines
> @@ -323,6 +330,9 @@ public Result update(final RevWalk walk) throws IOException {
>  	 * @throws IOException
>  	 */
>  	public Result delete() throws IOException {
> +		if (name.substring(Constants.R_HEADS.length()).equals(
> +				db.getRepository().getBranch()))
> +			return Result.REJECTED_CURRENT_BRANCH;
>  		try {
>  			return updateImpl(new RevWalk(db.getRepository()),
>  					new DeleteStore());

I'm squashing this into the patch, as I think its a safer (and faster) way to evaluate what the current branch is. We have a cache in RefDatabase showing the current value of HEAD. We also don't look at .git/head-name, which happens during a bisection.

But I also don't think we want to mess around with this test if we are dealing with refs/remotes or refs/tags. Really it is only refs/heads/ that should typically appear in HEAD, so we only need to guard against that case. If the user knows enough to make HEAD point at something else, maybe they will also know enough to not delete the damn thing out from under themselves. If we did fix it to test for all refs, its just a matter of removing the first if.

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 aa2cecb..77dada0 100644
--- a/org.spearce.jgit/src/org/spearce/jgit/lib/RefUpdate.java
+++ b/org.spearce.jgit/src/org/spearce/jgit/lib/RefUpdate.java
@@ -330,9 +330,12 @@ public Result update(final RevWalk walk) throws IOException {
 	 * @throws IOException
 	 */
 	public Result delete() throws IOException {
-		if (name.substring(Constants.R_HEADS.length()).equals(
-				db.getRepository().getBranch()))
-			return Result.REJECTED_CURRENT_BRANCH;
+		if (name.startsWith(Constants.R_HEADS)) {
+			final Ref head = db.readRef(Constants.HEAD);
+			if (head != null && name.equals(head.getName()))
+				return Result.REJECTED_CURRENT_BRANCH;
+		}
+
 		try {
 			return updateImpl(new RevWalk(db.getRepository()),
 					new DeleteStore());
-- 
Shawn.
Previous: Shawn O. Pearce
Message 9 of 9 in “Branch deletion testing and bug fixes”
  1. 0/4 Branch deletion testing and bug fixesCharles O'Farrell, Aug 22, 2008
  2. 1/4 Ensured that RefUpdate cannot delete current branchCharles O'Farrell, Aug 22, 2008
  3. 2/4 Fixed bug where RefUpdate didn't delete identical HEAD branchCharles O'Farrell, Aug 22, 2008
  4. 3/4 Added test for RefUpdate branch deletionCharles O'Farrell, Aug 22, 2008
  5. 4/4 Added extra javadoc for delete to significant RefUpdate resultsCharles O'Farrell, Aug 22, 2008
  6. Shawn O. PearceAug 22, 2008
  7. Robin RosenbergAug 22, 2008
  8. Shawn O. PearceAug 22, 2008
  9. Shawn O. PearceAug 22, 2008

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.