use of com.google.api.services.clouddebugger.v2.model.SourceContext in project google-cloud-intellij by GoogleCloudPlatform.
the class ProjectRepositoryValidator method checkSyncStashState.
/**
* Compares the current source tree with the state described by the Cloud Debugger api. Only local
* and cloud repo Git repositories are supported.
*/
@NotNull
@Transient
public SyncResult checkSyncStashState() {
if (processState.getProject() == null) {
return new SyncResult(/*isInvalid*/
true, /*needsStash*/
false, /*needsSync*/
false, /*target SHA*/
null, /*target repo*/
null, /* cloud repo */
false, /* repoType */
null);
}
GitRepositoryManager manager = GitUtil.getRepositoryManager(processState.getProject());
List<GitRepository> repositories = manager.getRepositories();
CloudRepoSourceContext cloudRepo = null;
GerritSourceContext gerritRepo = null;
GitSourceContext otherGitRepo = null;
String repoType = null;
boolean foundDebuggee = false;
if (getCloudDebuggerClient() != null && !com.google.common.base.Strings.isNullOrEmpty(processState.getProjectNumber())) {
ListDebuggeesResponse debuggees;
try {
debuggees = getCloudDebuggerClient().debuggees().list().setProject(processState.getProjectNumber()).setClientVersion(ServiceManager.getService(PluginInfoService.class).getClientVersionForCloudDebugger()).execute();
for (Debuggee debuggee : debuggees.getDebuggees()) {
if (processState.getDebuggeeId() != null && processState.getDebuggeeId().equals(debuggee.getId())) {
// implicit assumption this doesn't happen more than once
foundDebuggee = true;
List<SourceContext> contexts = debuggee.getSourceContexts();
if (contexts != null) {
for (SourceContext sourceContext : contexts) {
cloudRepo = sourceContext.getCloudRepo();
gerritRepo = sourceContext.getGerrit();
otherGitRepo = sourceContext.getGit();
if (cloudRepo != null) {
// shouldn't be more than one repo but if there is, we'll prefer cloud repos
break;
} else if (sourceContext.getCloudWorkspace() != null) {
repoType = GctBundle.getString("clouddebug.workspace");
}
}
}
}
}
} catch (IOException ex) {
LOG.warn("Error detecting server side source context", ex);
}
}
if (!foundDebuggee) {
return new SyncResult(/*isinvalid*/
true, /*needsstash*/
false, /*needssync*/
false, /*target SHA*/
null, /*target repo*/
null, /* hasCloudRepository */
false, /* repoType */
GctBundle.getString("clouddebug.unknown.repository.type"));
}
GitRepository targetLocalRepo = null;
String revisionId = null;
// shouldn't be more than one repo but if there is, we pick cloud repos
if (cloudRepo != null) {
revisionId = cloudRepo.getRevisionId();
repoType = GctBundle.getString("clouddebug.cloud.repository");
} else if (gerritRepo != null) {
revisionId = gerritRepo.getRevisionId();
repoType = GctBundle.getString("clouddebug.gerrit");
} else if (otherGitRepo != null) {
revisionId = otherGitRepo.getRevisionId();
repoType = GctBundle.getString("clouddebug.nongoogle.git");
}
if (revisionId != null) {
for (GitRepository repository : repositories) {
try {
GitChangeUtils.resolveReference(processState.getProject(), repository.getRoot(), revisionId);
targetLocalRepo = repository;
break;
} catch (VcsException ex) {
LOG.warn("cloud revision not found in local repo. continuing search...");
}
}
}
boolean needsStash = false;
boolean needsSync = false;
String syncSha = null;
if (targetLocalRepo != null) {
// check for local changes.
try {
if (GitUtil.hasLocalChanges(true, processState.getProject(), targetLocalRepo.getRoot()) || GitUtil.hasLocalChanges(false, processState.getProject(), targetLocalRepo.getRoot())) {
needsStash = true;
}
if (!Strings.isNullOrEmpty(targetLocalRepo.getCurrentRevision()) && !Strings.isNullOrEmpty(revisionId) && targetLocalRepo.getCurrentRevision() != null && !targetLocalRepo.getCurrentRevision().equals(revisionId)) {
syncSha = revisionId;
needsSync = true;
}
} catch (VcsException vcsException) {
LOG.error("Error detecting local changes during attach", vcsException);
}
}
boolean hasRemoteRepository = cloudRepo != null || gerritRepo != null || otherGitRepo != null;
return new SyncResult(/*isinvalid*/
false, needsStash, needsSync, syncSha, targetLocalRepo, hasRemoteRepository, repoType);
}
Aggregations