All Downloads are FREE. Search and download functionalities are using the official Maven repository.

prerna.util.git.GitCreator Maven / Gradle / Ivy

The newest version!
package prerna.util.git;

import java.io.File;
import java.io.FileFilter;
import java.io.IOException;
import java.util.List;
import java.util.Vector;

import org.apache.commons.io.filefilter.WildcardFileFilter;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.codehaus.plexus.util.FileUtils;
import org.kohsuke.github.GitHub;

import prerna.util.AssetUtility;
import prerna.util.Constants;

public class GitCreator {
	
	private static final Logger classLogger = LogManager.getLogger(GitCreator.class);

	/**
	 * This class is not intended to be extended or used outside of its static method
	 */
	private GitCreator() {

	}

	/**
	 * Push an  to Git
	 * @param databaseId
	 * @param databaseName
	 * @param remoteDatabaseName
	 * @param username
	 * @param password
	 */
	public static void makeRemoteFromDatabase(String databaseId, String databaseName, String remoteDatabaseName, String username, String password, boolean syncDatabase, String token) {
		// first, need to login
		GitHub git = null;
		if (!token.isEmpty()) {
			git = GitUtils.login(token);
		} else {
			git = GitUtils.login(username, password);
		}

		// need to get the database folder
		String dbFolder = AssetUtility.getProjectBaseFolder(databaseName, databaseId);;

		// the remote location
		// is of the form account_name/repo_name
		// so we want to split this out
		String repoName = "";
		if(remoteDatabaseName.contains("/")) {
			String[] remoteLocationSplit = remoteDatabaseName.split("/");
			String accountName = remoteLocationSplit[0];
			repoName = remoteLocationSplit[1];
		} else {
			repoName = remoteDatabaseName;
		}
		
		// now, we need to check and see if this folder is also a git
		boolean isGit = GitUtils.isGit(dbFolder);
		if(!isGit) {
			GitRepoUtils.makeLocalDatabaseGitVersionFolder(dbFolder);
		}

		String versionFolder = AssetUtility.getProjectVersionFolder(databaseName, databaseId);;
		File versionDir = new File(versionFolder);
		if(!versionDir.exists()) {
			versionDir.mkdirs();
		}
		// write a random file so we can add/commit
		GitUtils.semossInit(versionFolder);
		
		// if we are going to sync the databases
		// we will add them in a separate add statement
		// or, if we have any, we delete them
		if(syncDatabase) {
			// these may have been removed from git before
			// so we need to remove the ignore file to properly add
			GitUtils.removeAllIgnore(versionFolder);
			pushFilesToVersionFolder(dbFolder, versionFolder);
			GitPushUtils.addSpecificFiles(versionFolder, getDatabaseFiles(versionFolder, true));
		} else {
			// if the files are present, we want to remove them so they dont get pushed
			// to this new repository
			GitDestroyer.removeSpecificFiles(versionFolder, false, getDatabaseFiles(versionFolder, false));
		}
		GitPushUtils.addAllFiles(versionFolder, false);
		GitPushUtils.commitAddedFiles(versionFolder);

		// now that our local is all good
		// we need to push this to the remote instance
		// make the remote on git
		GitRepoUtils.makeRemoteRepository(git, username, repoName);

		// now set the remote to the local
		GitRepoUtils.addRemote(versionFolder, username, repoName);

		if (!token.isEmpty()) {
			// now fetch it
			// this will shift us from our local to the master
			GitRepoUtils.fetchRemote(versionFolder, repoName, token);
			// now push our local to the remote repo
			GitPushUtils.push(versionFolder, repoName, "master", token);
		} else {
			// now fetch it
			// this will shift us from our local to the master
			GitRepoUtils.fetchRemote(versionFolder, repoName, username, password);

			// now push our local to the remote repo
			GitPushUtils.push(versionFolder, repoName, "master", username, password);
		}

	}
	
	private static void pushFilesToVersionFolder(String appFolder, String gitFolder) {
		File versionDir = new File(gitFolder);
		File appDir = new File(appFolder);

		File[] filesToMove = getDatabaseFiles(appFolder, false);
		int numFiles = filesToMove.length;
		for(int i = 0; i < numFiles; i++) {
			try {
				FileUtils.copyFileToDirectory(filesToMove[i], versionDir);
			} catch (IOException e) {
				classLogger.error(Constants.STACKTRACE, e);
			}
		}
		
		// push the data folder if it exists
		pushDataFolder(appFolder, gitFolder);

		// we also need to move the smss file
		File smssFile = getSmssFile(appDir);
		try {
			FileUtils.copyFileToDirectory(smssFile, versionDir);
		} catch (IOException e) {
			classLogger.error(Constants.STACKTRACE, e);
		}
	}
	
	/**
	 * 
	 * @param databaseFolder
	 * @param gitFolder
	 */
	private static void pushDataFolder(String databaseFolder, String gitFolder) {
		String dataFile = databaseFolder + "/data";
		File dataDir = new File(dataFile);
		if(dataDir.exists()) {
			String gitDataFolder = gitFolder + "/data";
			File gitDataDir = new File(gitDataFolder);
			gitDataDir.mkdir();
			
			List grabItems = new Vector();
			grabItems.add("*.csv");
			grabItems.add("*.tsv");
			FileFilter fileFilter = fileFilter = new WildcardFileFilter(grabItems);
			File[] filesToMove = dataDir.listFiles(fileFilter);
			
			int numFiles = filesToMove.length;
			for(int i = 0; i < numFiles; i++) {
				try {
					FileUtils.copyFileToDirectory(filesToMove[i], gitDataDir);
				} catch (IOException e) {
					classLogger.error(Constants.STACKTRACE, e);
				}
			}
		}
	}
	
	private static File[] getDatabaseFiles(String folder, boolean includeSmss) {
		File appDir = new File(folder);
		// we need to push the db/owl/jnl into this folder
		List grabItems = new Vector();
		grabItems.add("*.db");
		grabItems.add("*.jnl");
		grabItems.add("*.OWL");
		grabItems.add("*.csv");
		grabItems.add("*.tsv");
		if(includeSmss) {
			grabItems.add("*.smss");
		}
		FileFilter fileFilter = new WildcardFileFilter(grabItems);
		File[] filesToMove = appDir.listFiles(fileFilter);
		return filesToMove;
	}
	
	private static File getSmssFile(File databaseDir) {
		String smssLocation = databaseDir.getParent() + "/" + databaseDir.getName() + ".smss";
		File smssFile = new File(smssLocation);
		return smssFile;
	}
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy