package jetbrains.mps.vcs.platform.mergedriver;
/*Generated by MPS */
import com.intellij.openapi.project.Project;
import org.jetbrains.annotations.NotNull;
import jetbrains.mps.vcs.platform.util.PluginUtil;
import com.intellij.openapi.vcs.VcsRoot;
import jetbrains.mps.internal.collections.runtime.Sequence;
import java.util.List;
import jetbrains.mps.internal.collections.runtime.ISelector;
import jetbrains.mps.internal.collections.runtime.ListSequence;
import jetbrains.mps.internal.collections.runtime.IWhereFilter;
import com.intellij.openapi.vcs.ProjectLevelVcsManager;
import com.intellij.openapi.ui.Messages;
import jetbrains.mps.util.NameUtil;
import com.intellij.openapi.vfs.VirtualFile;
import jetbrains.mps.smodel.ModelAccess;
import jetbrains.mps.util.Computable;
import jetbrains.mps.util.StringsIO;
import jetbrains.mps.vcs.core.mergedriver.FileType;
import java.io.IOException;
import com.intellij.openapi.vcs.AbstractVcs;
/*package*/ class GitRepositoriesInstaller extends AbstractInstaller {
private static final String ATTRIBUTES_FILE = ".gitattributes";
public GitRepositoriesInstaller(Project project) {
super(project);
}
@NotNull
@Override
protected AbstractInstaller.State install(final boolean dryRun) {
if (!(PluginUtil.isGitPluginEnabled())) {
return AbstractInstaller.State.NOT_ENABLED;
}
Iterable<VcsRoot> gitRoots = getGitRoots();
if (Sequence.fromIterable(gitRoots).isEmpty()) {
return AbstractInstaller.State.INSTALLED;
} else {
List<AbstractInstaller.State> states = Sequence.fromIterable(gitRoots).select(new ISelector<VcsRoot, AbstractInstaller.State>() {
public AbstractInstaller.State select(VcsRoot r) {
return installForRootInWrite(r.getPath(), dryRun);
}
}).toListSequence();
if (ListSequence.fromList(states).all(new IWhereFilter<AbstractInstaller.State>() {
public boolean accept(AbstractInstaller.State s) {
return s == AbstractInstaller.State.INSTALLED;
}
})) {
return AbstractInstaller.State.INSTALLED;
} else if (ListSequence.fromList(states).any(new IWhereFilter<AbstractInstaller.State>() {
public boolean accept(AbstractInstaller.State s) {
return s == AbstractInstaller.State.OUTDATED;
}
})) {
if (dryRun) {
return AbstractInstaller.State.OUTDATED;
}
} else {
if (dryRun) {
return AbstractInstaller.State.NOT_INSTALLED;
}
}
return installForRoots(gitRoots);
}
}
private int getRootsToInstall() {
return Sequence.fromIterable(getGitRoots()).select(new ISelector<VcsRoot, AbstractInstaller.State>() {
public AbstractInstaller.State select(VcsRoot r) {
return installForRootInWrite(r.getPath(), true);
}
}).where(new IWhereFilter<AbstractInstaller.State>() {
public boolean accept(AbstractInstaller.State st) {
return st == AbstractInstaller.State.NOT_INSTALLED || st == AbstractInstaller.State.OUTDATED;
}
}).count();
}
private Iterable<VcsRoot> getGitRoots() {
VcsRoot[] allRoots = myProject.getComponent(ProjectLevelVcsManager.class).getAllVcsRoots();
return Sequence.fromIterable(Sequence.fromArray(allRoots)).where(new IWhereFilter<VcsRoot>() {
public boolean accept(VcsRoot root) {
return "Git".equals(check_mnsjzr_a0a0a0a0b0e(root.getVcs()));
}
});
}
private AbstractInstaller.State installForRoots(Iterable<VcsRoot> roots) {
int updated = 0;
int failed = 0;
for (VcsRoot root : Sequence.fromIterable(roots)) {
if (installForRootInWrite(root.getPath(), false) == AbstractInstaller.State.INSTALLED) {
updated++;
} else {
failed++;
}
}
if (updated != 0) {
Messages.showInfoMessage(myProject, "Successfully updated attributes for " + NameUtil.formatNumericalString(updated, "Git root"), "Attributes");
}
if (failed == 0) {
return AbstractInstaller.State.INSTALLED;
} else {
return AbstractInstaller.State.NOT_INSTALLED;
}
}
@Override
public String getActionTitle() {
return "Git file attributes for " + NameUtil.formatNumericalString(getRootsToInstall(), "repository") + " (.gitattributes)";
}
@Override
public String getAffectedVcsName() {
return "Git";
}
@NotNull
private static AbstractInstaller.State installForRootInWrite(final VirtualFile vcsRootPath, final boolean dryRun) {
if (dryRun) {
return installForRoot(vcsRootPath, dryRun);
} else {
return ModelAccess.instance().runWriteAction(new Computable<AbstractInstaller.State>() {
public AbstractInstaller.State compute() {
return installForRoot(vcsRootPath, dryRun);
}
});
}
}
@NotNull
private static AbstractInstaller.State installForRoot(VirtualFile vcsRootPath, boolean dryRun) {
VirtualFile attributesFile = vcsRootPath.findChild(ATTRIBUTES_FILE);
if (attributesFile != null && attributesFile.isDirectory()) {
return AbstractInstaller.State.NOT_INSTALLED;
}
try {
if (attributesFile == null || !(attributesFile.exists())) {
if (dryRun) {
return AbstractInstaller.State.NOT_INSTALLED;
}
attributesFile = vcsRootPath.createChildData(GitRepositoriesInstaller.class, ATTRIBUTES_FILE);
}
final List<String> lines = StringsIO.readLines(attributesFile.getInputStream());
if (Sequence.fromIterable(Sequence.fromArray(FileType.BY_NAME)).all(new IWhereFilter<FileType>() {
public boolean accept(final FileType fname) {
return ListSequence.fromList(lines).any(new IWhereFilter<String>() {
public boolean accept(String line) {
return line.matches("\\s*" + fname.getSuffix().replace(".", "\\.") + "\\s.*merge=mps\\s*");
}
});
}
}) && Sequence.fromIterable(Sequence.fromArray(FileType.BY_EXT)).all(new IWhereFilter<FileType>() {
public boolean accept(final FileType ext) {
return ListSequence.fromList(lines).any(new IWhereFilter<String>() {
public boolean accept(String line) {
return line.matches("\\s*\\*\\." + ext.getSuffix() + "\\s.*merge=mps\\s*");
}
});
}
})) {
return AbstractInstaller.State.INSTALLED;
}
for (FileType fname : FileType.BY_NAME) {
boolean addNew = true;
for (int i = 0; i < ListSequence.fromList(lines).count(); i++) {
if (ListSequence.fromList(lines).getElement(i).matches("\\s*" + fname.getSuffix() + "\\s.*")) {
if (ListSequence.fromList(lines).getElement(i).contains("merge=mps")) {
if (dryRun) {
return AbstractInstaller.State.OUTDATED;
}
} else {
ListSequence.fromList(lines).setElement(i, ListSequence.fromList(lines).getElement(i) + " merge=mps");
}
addNew = false;
}
}
if (addNew) {
ListSequence.fromList(lines).addElement(fname.getSuffix() + " text merge=mps");
}
}
for (FileType ext : FileType.BY_EXT) {
boolean addNew = true;
for (int i = 0; i < ListSequence.fromList(lines).count(); i++) {
if (ListSequence.fromList(lines).getElement(i).matches("\\s*\\*\\." + ext.getSuffix() + "\\s.*")) {
if (ListSequence.fromList(lines).getElement(i).contains("merge=mps")) {
if (dryRun) {
return AbstractInstaller.State.OUTDATED;
}
} else {
ListSequence.fromList(lines).setElement(i, ListSequence.fromList(lines).getElement(i) + " merge=mps");
}
addNew = false;
}
}
if (addNew) {
ListSequence.fromList(lines).addElement("*." + ext.getSuffix() + " text merge=mps");
}
}
if (dryRun) {
return AbstractInstaller.State.NOT_INSTALLED;
}
StringsIO.writeLines(attributesFile.getOutputStream(GitRepositoriesInstaller.class), lines);
return AbstractInstaller.State.INSTALLED;
} catch (IOException e) {
return AbstractInstaller.State.NOT_INSTALLED;
}
}
private static String check_mnsjzr_a0a0a0a0b0e(AbstractVcs checkedDotOperand) {
if (null != checkedDotOperand) {
return checkedDotOperand.getName();
}
return null;
}
}