package org.alien4cloud.tosca.editor;
import java.io.IOException;
import java.nio.file.Path;
import java.util.List;
import javax.inject.Inject;
import org.alien4cloud.tosca.catalog.repository.ICsarRepositry;
import org.alien4cloud.tosca.model.Csar;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.stereotype.Component;
import alien4cloud.git.RepositoryManager;
import alien4cloud.git.SimpleGitHistoryEntry;
import alien4cloud.security.model.User;
import alien4cloud.utils.FileUtil;
import lombok.extern.slf4j.Slf4j;
/**
* Manage git repository integration for the editor.
*
* For every archive (bound to a CSAR or to an Application)
*/
@Slf4j
@Component
public class EditorRepositoryService {
@Inject
private ICsarRepositry csarRepositry;
// TODO we need a Git Branch Strategy Handler as well as a Git Multi-directory Handler so we can handle edition of repositories
public Path resolveArtifact(String csarId, String artifactReference) {
// let just split archiveName, archiveVersion, archiveWorkspace
String[] splittedId = csarId.split(":");
return csarRepositry.getExpandedCSAR(splittedId[0], splittedId[1]).resolve(artifactReference);
}
/**
* Update the archive zip from expended content.
*
* @param archiveName The name of the archive to update.
* @param archiveVersion The version of the archive to update.
*/
public void updateArchiveZip(String archiveName, String archiveVersion) {
csarRepositry.updateFromExpanded(archiveName, archiveVersion);
}
/**
* Create a local git repository for the given topology.
*
* @param csar The archive for which to ensure the git repository is initialized.
* @return The path that contains the archive git repository.
* @throws IOException
*/
public Path createGitDirectory(Csar csar) throws IOException {
// FIXME we should use directly the folder from the archive repository
Path archiveGitPath = csarRepositry.getExpandedCSAR(csar.getName(), csar.getVersion());
if (!RepositoryManager.isGitRepository(archiveGitPath)) {
RepositoryManager.create(archiveGitPath, "TOSCA topology created by Alien4Cloud.");
log.debug("Initializing topology local git repository at {}", archiveGitPath.toAbsolutePath());
} else {
log.debug("Topology local git repository already created at {}", archiveGitPath.toAbsolutePath());
}
return archiveGitPath;
}
/**
* Commit the changes to the repository using the given message as commit message.
*
* @param csar The csar under edition for which to commit changes.
* @param message The message to use for the commit.
*/
public void commit(Csar csar, String message) {
Path archiveGitPath = csarRepositry.getExpandedCSAR(csar.getName(), csar.getVersion());
final Authentication auth = SecurityContextHolder.getContext().getAuthentication();
String username = null;
String useremail = null;
User user = auth == null ? null : (User) auth.getPrincipal();
if (user != null) {
username = user.getUsername();
useremail = user.getEmail() == null ? username + "@undefined.org" : user.getEmail();
}
RepositoryManager.commitAll(archiveGitPath, username, useremail, message);
}
/**
* Get the git history for a given archive.
*
* @param csar The archive under edition.
* @param from Start to query from the given history.
* @param count The number of history entries to retrieve.
* @return A list of simplified history entries.
*/
public List<SimpleGitHistoryEntry> getHistory(Csar csar, int from, int count) {
Path archiveGitPath = csarRepositry.getExpandedCSAR(csar.getName(), csar.getVersion());
return RepositoryManager.getHistory(archiveGitPath, from, count);
}
/**
* Set a remote repository.
*
* @param csar The archive for which to set the remote.
* @param remoteName The remote name.
* @param remoteUrl The repository url.
*/
public void setRemote(Csar csar, String remoteName, String remoteUrl) {
Path archiveGitPath = csarRepositry.getExpandedCSAR(csar.getName(), csar.getVersion());
RepositoryManager.setRemote(archiveGitPath, remoteName, remoteUrl);
}
/**
* Get the url of the remote git repository.
*
* @param csar The concerned archive.
* @param remoteName The name of the remote
* @return The url corresponding to the remote name.
*/
public String getRemoteUrl(Csar csar, String remoteName) {
Path archiveGitPath = csarRepositry.getExpandedCSAR(csar.getName(), csar.getVersion());
return RepositoryManager.getRemoteUrl(archiveGitPath, remoteName);
}
/**
* Push modifications to git repository.
*
* @param csar The concerned archive.
* @param username The username of the git repository, null if none.
* @param password The password of the git repository, null if none.
* @param remoteBranch The name of the remote branch to push to.
*/
public void push(Csar csar, String username, String password, String remoteBranch) {
Path archiveGitPath = csarRepositry.getExpandedCSAR(csar.getName(), csar.getVersion());
RepositoryManager.push(archiveGitPath, username, password, remoteBranch);
}
/**
* Pull modifications from the git repository to a temp dir.
*
* @param path the temp path
* @param csar The concerned archive.
* @param username The username of the git repository, null if none.
* @param password The password of the git repository, null if none.
* @param remoteBranch The name of the remote branch to pull from.
*/
public void pull(Path path, Csar csar, String username, String password, String remoteBranch) throws IOException {
Path archiveGitPath = csarRepositry.getExpandedCSAR(csar.getName(), csar.getVersion());
FileUtil.copy(archiveGitPath, path);
RepositoryManager.pull(path, username, password, remoteBranch);
}
public void clean(Csar csar) {
Path archiveGitPath = csarRepositry.getExpandedCSAR(csar.getName(), csar.getVersion());
RepositoryManager.clean(archiveGitPath);
}
}