Skip to content

Commit d98f086

Browse files
committed
Optimization of Git status (in Commit dialog)
Speeds up GitClient.getStatus() by deferring expensive evaluation of object Ids, which often compute file content hash, to evaluate them lazily only when needed. On Netbeans repository with a lot of files, this speeds up GitClient.getStatus() execution from 4 seconds to 1 second.
1 parent 2b92f87 commit d98f086

1 file changed

Lines changed: 12 additions & 9 deletions

File tree

ide/libs.git/src/org/netbeans/libs/git/jgit/commands/StatusCommand.java

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
import java.util.List;
3434
import java.util.Map;
3535
import java.util.Set;
36+
import java.util.function.Supplier;
3637
import java.util.logging.Level;
3738
import java.util.logging.Logger;
3839
import org.eclipse.jgit.diff.DiffEntry;
@@ -47,7 +48,9 @@
4748
import org.eclipse.jgit.lib.ObjectReader;
4849
import org.eclipse.jgit.lib.Repository;
4950
import org.eclipse.jgit.revwalk.RevWalk;
50-
import org.eclipse.jgit.treewalk.*;
51+
import org.eclipse.jgit.treewalk.EmptyTreeIterator;
52+
import org.eclipse.jgit.treewalk.FileTreeIterator;
53+
import org.eclipse.jgit.treewalk.TreeWalk;
5154
import org.eclipse.jgit.treewalk.filter.AndTreeFilter;
5255
import org.eclipse.jgit.treewalk.filter.NotTreeFilter;
5356
import org.eclipse.jgit.treewalk.filter.OrTreeFilter;
@@ -189,7 +192,7 @@ protected void run () throws GitException {
189192
Collection<TreeFilter> subTreeFilters = getSubtreeFilters(pathFilters, path);
190193
if (!subTreeFilters.isEmpty()) {
191194
// caller requested a status for a file under an ignored folder
192-
treeWalk.setFilter(AndTreeFilter.create(treeWalk.getFilter(), OrTreeFilter.create(NotTreeFilter.create(PathFilter.create(path)),
195+
treeWalk.setFilter(AndTreeFilter.create(treeWalk.getFilter(), OrTreeFilter.create(NotTreeFilter.create(PathFilter.create(path)),
193196
subTreeFilters.size() > 1 ? OrTreeFilter.create(subTreeFilters) : subTreeFilters.iterator().next())));
194197
treeWalk.enterSubtree();
195198
}
@@ -217,11 +220,11 @@ protected void run () throws GitException {
217220
} else {
218221
statusIndexWC = GitStatus.Status.STATUS_ADDED;
219222
}
220-
} else if (!isExistingSymlink(mIndex, mWorking) && (differ(mIndex, mWorking, checkExecutable)
223+
} else if (!isExistingSymlink(mIndex, mWorking) && (differ(mIndex, mWorking, checkExecutable)
221224
|| (mWorking != 0 && mWorking != FileMode.TREE.getBits() && fti.isModified(indexEntry, true, od)))
222225
|| GitStatus.Status.STATUS_MODIFIED == getGitlinkStatus(
223-
mWorking, treeWalk.getObjectId(T_WORKSPACE),
224-
mIndex, treeWalk.getObjectId(T_INDEX))) {
226+
mWorking, () -> treeWalk.getObjectId(T_WORKSPACE),
227+
mIndex, () -> treeWalk.getObjectId(T_INDEX))) {
225228
statusIndexWC = GitStatus.Status.STATUS_MODIFIED;
226229
} else {
227230
statusIndexWC = GitStatus.Status.STATUS_NORMAL;
@@ -237,8 +240,8 @@ protected void run () throws GitException {
237240
&& (statusIndexWC != GitStatus.Status.STATUS_NORMAL || statusHeadIndex != GitStatus.Status.STATUS_NORMAL)
238241
&& !treeWalk.getObjectId(T_COMMIT).equals(fti.getEntryObjectId())))
239242
|| GitStatus.Status.STATUS_MODIFIED == getGitlinkStatus(
240-
mHead, treeWalk.getObjectId(T_WORKSPACE),
241-
mHead, treeWalk.getObjectId(T_COMMIT))) {
243+
mHead, () -> treeWalk.getObjectId(T_WORKSPACE),
244+
mHead, () -> treeWalk.getObjectId(T_COMMIT))) {
242245
statusHeadWC = GitStatus.Status.STATUS_MODIFIED;
243246
} else {
244247
statusHeadWC = GitStatus.Status.STATUS_NORMAL;
@@ -444,13 +447,13 @@ private void handleSymlink (List<GitStatus> symLinks, String workTreePath) {
444447
}
445448
}
446449

447-
private GitStatus.Status getGitlinkStatus (int mode1, ObjectId id1, int mode2, ObjectId id2) {
450+
private GitStatus.Status getGitlinkStatus (int mode1, Supplier<ObjectId> id1, int mode2, Supplier<ObjectId> id2) {
448451
if (mode1 == FileMode.TYPE_GITLINK || mode2 == FileMode.TYPE_GITLINK) {
449452
if (mode1 == FileMode.TYPE_MISSING) {
450453
return GitStatus.Status.STATUS_REMOVED;
451454
} else if (mode2 == FileMode.TYPE_MISSING) {
452455
return GitStatus.Status.STATUS_ADDED;
453-
} else if (!id1.equals(id2)) {
456+
} else if (!id1.get().equals(id2.get())) {
454457
return GitStatus.Status.STATUS_MODIFIED;
455458
}
456459
}

0 commit comments

Comments
 (0)