List<PushInfo> () { List<PushInfo> allDetails = new ArrayList<>(); for (MyRepoModel<Repository, PushSource, PushTarget> model : getSelectedRepoNode()) { PushTarget target = Objects.requireNonNull(model.getTarget()); PushSpec<PushSource, PushTarget> pushSpec = new PushSpec<>(model.getSource(), target); List<VcsFullCommitDetails> loadedCommits = new ArrayList<>(model.getLoadedCommits()); if (loadedCommits.isEmpty()) { //Note: loadCommits is cancellable - it tracks current thread's progress indicator under the hood! loadedCommits.addAll(loadCommits(model)); } //sort commits in the time-ascending order Collections.reverse(loadedCommits); PushInfoImpl pushInfo = new PushInfoImpl(model.getRepository(), pushSpec, loadedCommits); allDetails.add(pushInfo); } return Collections.unmodifiableList(allDetails); }