JGit TagCommand [message #1004827] |
Thu, 24 January 2013 00:06  |
Eclipse User |
|
|
|
Hi,
I'm using JGit to build a tailored GUI app. I'm currently experiencing problems with the TagCommand, I use it as follows:
- In my GUI, I have a list of past commits, generated via calling git.log().all().call() which returns a List<RevCommit> collection.
I want to allow the user to tag any one of these prior commits by right-clicking it and entering a tag name.
Once provided a name, I then execute the following JGit code to try apply the requested tag.
Git git = new Git(gitrepo);
org.eclipse.jgit.api.TagCommand tagcmd = git.tag();
tagcmd. setObjectId(revcmt);
tagcmd.setName(strTag);
System.out.println("revid = " + tagcmd.getObjectId().getId().toString());
try
{
Ref ref = tagcmd.call();
System.out.println("refid = " + ref.getObjectId().toString());
} catch (Exception ex)
{
parent.setErrMsg(ex);
return;
}
The only problem here is that when I refresh my list of commits (via git.log().all().call() again), I get the following exception:
SEVERE: null
org.eclipse.jgit.errors.IncorrectObjectTypeException: Object b7607418fae91345b3941532ad3ce2e94907a9d8 is not a commit.
at org.eclipse.jgit.storage.file.WindowCursor.open(WindowCursor.java:130)
at org.eclipse.jgit.revwalk.RevWalk.getCachedBytes(RevWalk.java:861)
at org.eclipse.jgit.revwalk.RevCommit.parseHeaders(RevCommit.java:142)
at org.eclipse.jgit.revwalk.RevWalk.markStart(RevWalk.java:284)
at org.eclipse.jgit.api.LogCommand.add(LogCommand.java:297)
at org.eclipse.jgit.api.LogCommand.add(LogCommand.java:172)
at org.eclipse.jgit.api.LogCommand.all(LogCommand.java:245)
I think the object it is complaining about is the newly created tag, which I called "test1" in this example.
My two debug println's in the above code show the following:
revid = commit a7c533ff99c2b34b42991bccf6b901f4b6b8875a 1357769853 ----sp
refid = AnyObjectId[b7607418fae91345b3941532ad3ce2e94907a9d8]
Ie, "refid" is the id of tag, which equates to the id the exception is complaining about.
I found the tag object within the ".git/" sub-folder of the project in the following location:
.git/refs/tags/test1
Its contents is: b7607418fae91345b3941532ad3ce2e94907a9d8
Hmm, but now, I try something from the command-line as a test:
git tag -d test1 (to remove the tag)
git tag test1 a7c533ff99c2b34b42991bccf6b901f4b6b8875a (ie, make a tag called "test1" on the rev-id I intended it for)
This time, when I edit ".git/refs/tags/test1", it contains: a7c533ff99c2b34b42991bccf6b901f4b6b8875a
Ie:
- When I add a tag via JGit, this ".git/refs/tags/test1" file contains the Id of the tag itself
- When I add a tag via command-line git, this ".git/refs/tags/test1" file contains the Id of the commit that the tag is associated with
Anyone know what's going on here? Is it a bug? Or am I making use of JGit in the wrong way?
|
|
|
Re: JGit TagCommand [message #1005336 is a reply to message #1004827] |
Thu, 24 January 2013 22:24   |
Eclipse User |
|
|
|
Gurce Isikyildiz skrev 2013-01-24 01.06:
> hen I add a tag via JGit, this ".git/refs/tags/test1" file contains the Id of the tag itself
> When I add a tag via command-line git, this ".git/refs/tags/test1" file contains the Id of the commit that the tag is associated with
>
>
> Anyone know what's going on here? Is it a bug? Or am I making use of JGit in the wrong way?
Git creates unannotated tags by default (no tag object), while JGit creates annotated tags (not convinced it should...).
-- robin
|
|
|
Re: JGit TagCommand [message #1005513 is a reply to message #1005336] |
Fri, 25 January 2013 19:44   |
Eclipse User |
|
|
|
Slightly off-topic -- does JGit support the creation of simple tags? If so, does EGit provide a hook to that support? I haven't found it in EGit,
|
|
|
|
Re: JGit TagCommand [message #1005539 is a reply to message #1004827] |
Sat, 26 January 2013 11:23   |
Eclipse User |
|
|
|
Thanks for the explanation Robin. I'm trying to take this on-board, and gathering that the "log().all().call()" isn't working due to these annotated tags.
I tried to avoid the exception above by making the log command only add all "refs/heads" and "refs/remotes" (skipping "refs/tags") with code something like this:
try
{
org.eclipse.jgit.api.LogCommand logcmd = git.log();
Map<String, Ref> mapRefs =repo.getRefDatabase().getRefs("refs/heads");
mapRefs.putAll(repo.getRefDatabase().getRefs("refs/remotes"));
Set<String> names = mapRefs.keySet();
Iterator<String> it = names.iterator();
while (it.hasNext())
{
String name = it.next();
Ref ref = mapRefs.get(name);
logcmd.add(ref.getObjectId());
}
Iterable<RevCommit> iter_gitlog = logcmd.call();
No more exception, nice... But now I'd like to display the tags I find with ListTagCommand within my tree.
Git git = new Git(gitrepo);
ListTagCommand taglistcmd = git.tagList();
lstTags = taglistcmd.call();
for (Ref tag : lstTags)
{
mapObjIdToRefTag.put(tag.getTarget().getObjectId(), tag);
}
As I iterate through my RevCommits, I try and match them against each tag's tag.getTarget().getObjectId(). This technique seems to work for un-annotated tags, but not for these JGit annotated tags (for me).
I did notice there was a mention of tag.getPeeledObjectId() returning the RevCommit that an annotated tag points to, but when I try that on this "test1" tag in my example, it is returning null (tag.isPeeled() is false too).
What's up here? Am I going about this the wrong way?
|
|
|
Re: JGit TagCommand [message #1005592 is a reply to message #1005539] |
Sat, 26 January 2013 21:48   |
Eclipse User |
|
|
|
Gurce Isikyildiz skrev 2013-01-26 12.23:>
> As I iterate through my RevCommits, I try and match them against each tag's tag.getTarget().getObjectId(). This technique seems to work for un-annotated tags, but not for
> these JGit annotated tags (for me).
>
> I did notice there was a mention of tag.getPeeledObjectId() returning the RevCommit that an annotated tag points to, but when I try that on this "test1" tag in my example,
> it is returning null (tag.isPeeled() is false too).
>
> What's up here? Am I going about this the wrong way?
Determining the target is costly, so it's not done by default.
Use the code below peel the tag. After that you can get the peeled object.
ref = repository.peel(ref)
-- robin
|
|
|
|
Powered by
FUDForum. Page generated in 0.04412 seconds