1 /*******************************************************************************
2 * Copyright (C) 2010, 2013 Dariusz Luksza <dariusz@luksza.org> and others.
4 * All rights reserved. This program and the accompanying materials
5 * are made available under the terms of the Eclipse Public License 2.0
6 * which accompanies this distribution, and is available at
7 * https://www.eclipse.org/legal/epl-2.0/
9 * SPDX-License-Identifier: EPL-2.0
10 *******************************************************************************/
11 package org
.eclipse
.egit
.ui
.internal
.synchronize
.model
;
14 import java
.io
.IOException
;
15 import java
.util
.ArrayList
;
16 import java
.util
.List
;
20 import org
.eclipse
.compare
.structuremergeviewer
.Differencer
;
21 import org
.eclipse
.core
.resources
.IProject
;
22 import org
.eclipse
.core
.runtime
.IPath
;
23 import org
.eclipse
.core
.runtime
.Path
;
24 import org
.eclipse
.egit
.core
.synchronize
.GitCommitsModelCache
;
25 import org
.eclipse
.egit
.core
.synchronize
.GitCommitsModelCache
.Change
;
26 import org
.eclipse
.egit
.core
.synchronize
.GitCommitsModelCache
.Commit
;
27 import org
.eclipse
.egit
.core
.synchronize
.StagedChangeCache
;
28 import org
.eclipse
.egit
.core
.synchronize
.WorkingTreeChangeCache
;
29 import org
.eclipse
.egit
.core
.synchronize
.dto
.GitSynchronizeData
;
30 import org
.eclipse
.egit
.ui
.Activator
;
31 import org
.eclipse
.jgit
.lib
.ObjectId
;
32 import org
.eclipse
.jgit
.lib
.Repository
;
33 import org
.eclipse
.jgit
.revwalk
.RevCommit
;
34 import org
.eclipse
.jgit
.revwalk
.RevObject
;
35 import org
.eclipse
.jgit
.treewalk
.filter
.TreeFilter
;
38 * Representation of Git repository in Git ChangeSet model.
40 public class GitModelRepository
extends GitModelObjectContainer
implements HasProjects
{
42 private IPath location
;
44 private final GitSynchronizeData gsd
;
46 private GitModelObject
[] children
;
50 * synchronization data
53 public GitModelRepository(GitSynchronizeData gsd
) throws IOException
{
59 public GitModelObject
[] getChildren() {
60 List
<GitModelObjectContainer
> result
= new ArrayList
<>();
61 Repository repo
= gsd
.getRepository();
62 RevCommit srcRevCommit
= gsd
.getSrcRevCommit();
63 RevCommit dstRevCommit
= gsd
.getDstRevCommit();
64 TreeFilter pathFilter
= gsd
.getPathFilter();
65 List
<Commit
> commitCache
;
66 if (srcRevCommit
!= null && dstRevCommit
!= null)
68 commitCache
= GitCommitsModelCache
.build(repo
, srcRevCommit
,
69 dstRevCommit
, pathFilter
);
70 } catch (IOException e
) {
71 Activator
.logError(e
.getMessage(), e
);
76 if (commitCache
!= null && !commitCache
.isEmpty())
77 result
.addAll(getListOfCommit(commitCache
));
79 result
.addAll(getWorkingChanges());
81 children
= result
.toArray(new GitModelObjectContainer
[0]);
87 public String
getName() {
88 return gsd
.getRepository().getWorkTree().toString();
92 public IProject
[] getProjects() {
93 return gsd
.getProjects().toArray(new IProject
[0]);
97 public int repositoryHashCode() {
102 * @return source {@link RevObject}
104 public ObjectId
getSrcRev() {
105 return gsd
.getSrcRevCommit();
109 public IPath
getLocation() {
110 if (location
== null)
111 location
= new Path(gsd
.getRepository().getWorkTree().toString());
117 public int getKind() {
118 return Differencer
.CHANGE
;
122 public void dispose() {
123 disposeOldChildren();
127 public boolean equals(Object obj
) {
131 if (obj
instanceof GitModelRepository
) {
132 File objWorkTree
= ((GitModelRepository
) obj
).gsd
.getRepository()
134 return objWorkTree
.equals(gsd
.getRepository().getWorkTree());
141 public int hashCode() {
142 return gsd
.getRepository().getWorkTree().hashCode();
146 public String
toString() {
147 return "ModelRepository[" + gsd
.getRepository().getWorkTree() + "]"; //$NON-NLS-1$ //$NON-NLS-2$
150 private List
<GitModelObjectContainer
> getListOfCommit(List
<Commit
> commitCache
) {
151 Repository repo
= gsd
.getRepository();
152 Set
<IProject
> projectsSet
= gsd
.getProjects();
153 IProject
[] projects
= projectsSet
.toArray(new IProject
[0]);
154 List
<GitModelObjectContainer
> result
= new ArrayList
<>();
156 for (Commit commit
: commitCache
)
157 result
.add(new GitModelCommit(this, repo
, commit
, projects
));
162 private List
<GitModelObjectContainer
> getWorkingChanges() {
163 List
<GitModelObjectContainer
> result
= new ArrayList
<>();
164 if (gsd
.shouldIncludeLocal()) {
165 Repository repo
= gsd
.getRepository();
166 Map
<String
, Change
> stagedChanges
= StagedChangeCache
.build(repo
);
167 GitModelCache gitCache
= new GitModelCache(this, repo
,
169 int gitCacheLen
= gitCache
.getChildren().length
;
171 Map
<String
, Change
> workingChanges
= WorkingTreeChangeCache
.build(repo
);
172 GitModelWorkingTree gitWorkingTree
= new GitModelWorkingTree(this,
173 repo
, workingChanges
);
174 int gitWorkingTreeLen
= gitWorkingTree
.getChildren().length
;
176 if (gitCacheLen
> 0 || gitWorkingTreeLen
> 0) {
177 result
.add(gitCache
);
178 result
.add(gitWorkingTree
);
188 public Repository
getRepository() {
189 return gsd
.getRepository();
192 private void disposeOldChildren() {
193 if (children
== null)
195 for (GitModelObject child
: children
)