1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43 package org.eclipse.jgit.api;
44
45 import java.io.IOException;
46
47 import org.eclipse.jgit.api.errors.GitAPIException;
48 import org.eclipse.jgit.api.errors.JGitInternalException;
49 import org.eclipse.jgit.lib.CommitBuilder;
50 import org.eclipse.jgit.lib.Constants;
51 import org.eclipse.jgit.lib.ObjectId;
52 import org.eclipse.jgit.lib.ObjectInserter;
53 import org.eclipse.jgit.lib.PersonIdent;
54 import org.eclipse.jgit.lib.Ref;
55 import org.eclipse.jgit.lib.RefUpdate;
56 import org.eclipse.jgit.lib.Repository;
57 import org.eclipse.jgit.notes.Note;
58 import org.eclipse.jgit.notes.NoteMap;
59 import org.eclipse.jgit.revwalk.RevCommit;
60 import org.eclipse.jgit.revwalk.RevObject;
61 import org.eclipse.jgit.revwalk.RevWalk;
62
63
64
65
66
67
68
69 public class RemoveNoteCommand extends GitCommand<Note> {
70
71 private RevObject id;
72
73 private String notesRef = Constants.R_NOTES_COMMITS;
74
75
76
77
78 protected RemoveNoteCommand(Repository repo) {
79 super(repo);
80 }
81
82 public Note call() throws GitAPIException {
83 checkCallable();
84 try (RevWalk walk = new RevWalk(repo);
85 ObjectInserter inserter = repo.newObjectInserter()) {
86 NoteMap map = NoteMap.newEmptyMap();
87 RevCommit notesCommit = null;
88 Ref ref = repo.getRef(notesRef);
89
90 if (ref != null) {
91 notesCommit = walk.parseCommit(ref.getObjectId());
92 map = NoteMap.read(walk.getObjectReader(), notesCommit);
93 }
94 map.set(id, null, inserter);
95 commitNoteMap(walk, map, notesCommit, inserter,
96 "Notes removed by 'git notes remove'");
97 return map.getNote(id);
98 } catch (IOException e) {
99 throw new JGitInternalException(e.getMessage(), e);
100 }
101 }
102
103
104
105
106
107
108
109 public RemoveNoteCommand setObjectId(RevObject id) {
110 checkCallable();
111 this.id = id;
112 return this;
113 }
114
115 private void commitNoteMap(RevWalk walk, NoteMap map,
116 RevCommit notesCommit,
117 ObjectInserter inserter,
118 String msg)
119 throws IOException {
120
121 CommitBuilder builder = new CommitBuilder();
122 builder.setTreeId(map.writeTree(inserter));
123 builder.setAuthor(new PersonIdent(repo));
124 builder.setCommitter(builder.getAuthor());
125 builder.setMessage(msg);
126 if (notesCommit != null)
127 builder.setParentIds(notesCommit);
128 ObjectId commit = inserter.insert(builder);
129 inserter.flush();
130 RefUpdate refUpdate = repo.updateRef(notesRef);
131 if (notesCommit != null)
132 refUpdate.setExpectedOldObjectId(notesCommit);
133 else
134 refUpdate.setExpectedOldObjectId(ObjectId.zeroId());
135 refUpdate.setNewObjectId(commit);
136 refUpdate.update(walk);
137 }
138
139
140
141
142
143
144
145
146
147
148 public RemoveNoteCommand setNotesRef(String notesRef) {
149 checkCallable();
150 this.notesRef = notesRef;
151 return this;
152 }
153
154 }