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

Re: [JGIT] help needed to create a siimple commit

From
Yann Simon <yann.simon.fr@gmail.com>
Date
Feb 4, 2009, 16:10 UTC
Message-ID
<551f769b0902040810o6b45008fgcc1ef70108b3d90@mail.gmail.com>
In-Reply-To
<20090203155107.GU26880@spearce.org>
2009/2/3 Shawn O. Pearce <spearce@spearce.org>:
Show 25 quoted lines
> You are missing the final step of updating the HEAD ref with the
> commit.  Calling commit() on the Commit object only writes it to
> the object database, this is similar to git-commit-tree.
>
> Try adding on the end:
>
>        RefUpdate ru = db.updateRef(Constants.HEAD);
>        ru.setRefLogMessage("commit");
>        ru.setNewObjectId(c1.getCommitId());
>        assertSame(RefUpdate.Result.NEW, ru.update());
>
> If your commit had parents, you might want to do instead:
>
>        ru.setExpectedOldObjectId(oldHEAD);
>        assertSame(RefUpdate.Result.FAST_FORWARD, ru.update());
>
> where oldHEAD is the value of HEAD you read and used as the first
> parent of the commit.  This ensures that the update method fails
> if someone else has updated HEAD since you last read it.
>
> The update method returns a number of different states, usually we
> check its result with a switch statement as a number of states are
> sometimes permissible in a context.  Sometimes though, you know it
> has to be exactly one state, and everything else is a failure.
>
I updated my simple test like this:
package org.spearce.jgit.lib;

import java.io.File; import java.io.IOException;

public class CommitTest extends RepositoryTestCase {
	public void testASimpleCommit() throws IOException {
		
		recursiveDelete(trash_git, false, null, true);
		db = new Repository(trash_git);
		db.create();
		GitIndex index = new GitIndex(db);
		index.filemode = Boolean.TRUE;
		
		commitIndex(index, "commit 1");
		File file1 = writeTrashFile("file1", "file1");
		index.add(trash, file1);
		
		commitIndex(index, "commit 2");
	}
	
	private void commitIndex(GitIndex index, String commitMessage) throws
IOException {
		index.write();
		ObjectId objectId = index.writeTree();
		Tree tree = db.mapTree(objectId);
		final Commit commit = new Commit(db);
		commit.setAuthor(new PersonIdent(jauthor, 1154236443000L, -4 * 60));
		commit.setCommitter(new PersonIdent(jcommitter, 1154236443000L, -4 * 60));
		commit.setMessage(commitMessage);
		commit.setTree(tree);
		assertEquals(tree.getTreeId(), commit.getTreeId());
		commit.commit();
		
		ObjectWriter writer = new ObjectWriter(db);
		commit.setCommitId(writer.writeCommit(commit));
		Ref oldHEAD = db.getAllRefs().get(Constants.HEAD);
		final RefUpdate ru = db.updateRef(Constants.HEAD);
		ru.setNewObjectId(commit.getCommitId());
		ru.setRefLogMessage(commitMessage, false);
		if (oldHEAD != null) {
			// commit has parents
			ru.setExpectedOldObjectId(oldHEAD.getObjectId());
			assertSame(RefUpdate.Result.FAST_FORWARD, ru.update());
		} else {
			// commit has no parents
			assertSame(RefUpdate.Result.NEW, ru.update());
		}
		
	}
}

The first commit "with an empty workspace" is ok. I can see the commit in the log. The second commit fails, with ru.update() = REJECTED.

I tried different combination, without success.
If someone could tell me, what I am doing wrong...
Yann
Previous: Shawn O. PearceNext: Shawn O. Pearce
Message 3 of 4 in “[JGIT] help needed to create a siimple commit”
  1. Yann SimonFeb 3, 2009
  2. Shawn O. PearceFeb 3, 2009
  3. Yann SimonFeb 4, 2009
  4. Shawn O. PearceFeb 4, 2009

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.