// Path: src/main/java/uk/ac/ic/wlgitbridge/data/filestore/GitDirectoryContents.java
// public class GitDirectoryContents {
// 
//     private final List<RawFile> files;
//     private final File gitDirectory;
//     private final String userName;
//     private final String userEmail;
//     private final String commitMessage;
//     private final Date when;
// 
//     public GitDirectoryContents(
//             List<RawFile> files,
//             File rootGitDirectory,
//             String projectName,
//             String userName,
//             String userEmail,
//             String commitMessage,
//             Date when
//     ) {
//         this.files = files;
//         this.gitDirectory = new File(rootGitDirectory, projectName);
//         this.userName = userName;
//         this.userEmail = userEmail;
//         this.commitMessage = commitMessage;
//         this.when = when;
//     }
// 
//     public GitDirectoryContents(
//             List<RawFile> files,
//             File rootGitDirectory,
//             String projectName,
//             Snapshot snapshot
//     ) {
//         this(
//                 files,
//                 rootGitDirectory,
//                 projectName,
//                 snapshot.getUserName(),
//                 snapshot.getUserEmail(),
//                 snapshot.getComment(),
//                 snapshot.getCreatedAt()
//         );
//     }
// 
//     public void write() throws IOException {
//         Util.deleteInDirectoryApartFrom(gitDirectory, ".git");
//         for (RawFile fileNode : files) {
//             fileNode.writeToDisk(gitDirectory);
//         }
//     }
// 
//     public File getDirectory() {
//         return gitDirectory;
//     }
// 
//     public String getUserName() {
//         return userName;
//     }
// 
//     public String getUserEmail() {
//         return userEmail;
//     }
// 
//     public String getCommitMessage() {
//         return commitMessage;
//     }
// 
//     public Date getWhen() {
//         return when;
//     }
// 
// }
// 
// Path: src/main/java/uk/ac/ic/wlgitbridge/util/Log.java
// public class Log {
// 
//     private static Logger logger = LoggerFactory.getLogger(GitBridgeApp.class);
// 
//     public static void trace(String msg) {
//         logger.trace(msg);
//     }
// 
//     public static void trace(String msg, Throwable t) {
//         logger.trace(msg, t);
//     }
// 
//     public static void debug(String msg) {
//         logger.debug(msg);
//     }
// 
//     public static void debug(String msg, Throwable t) {
//         logger.debug(msg, t);
//     }
// 
//     public static void info(String msg) {
//         logger.info(msg);
//     }
// 
//     public static void info(String format, Object arg) {
//         logger.info(format, arg);
//     }
// 
//     public static void info(String format, Object arg1, Object arg2) {
//         logger.info(format, arg1, arg2);
//     }
// 
//     public static void info(String format, Object... args) {
//         logger.info(format, args);
//     }
// 
//     public static void info(String msg, Throwable t) {
//         logger.info(msg, t);
//     }
// 
//     public static void warn(String msg) {
//         logger.warn(msg);
//     }
// 
//     public static void warn(String msg, Object arg) {
//         logger.warn(msg, arg);
//     }
// 
//     public static void warn(String msg, Object arg1, Object arg2) {
//         logger.warn(msg, arg1, arg2);
//     }
// 
//     public static void warn(String msg, Object... args) {
//         logger.warn(msg, args);
//     }
// 
//     public static void warn(String msg, Throwable t) {
//         logger.warn(msg, t);
//     }
// 
//     public static void error(String msg) {
//         logger.error(msg);
//     }
// 
//     public static void error(String msg, Object... args) {
//         logger.error(msg, args);
//     }
// 
//     public static void error(String msg, Throwable t) {
//         logger.error(msg, t);
//     }
// 
// }


import com.google.common.base.Preconditions;
import org.apache.commons.io.IOUtils;
import org.eclipse.jgit.api.Git;
import org.eclipse.jgit.api.ResetCommand;
import org.eclipse.jgit.api.errors.GitAPIException;
import org.eclipse.jgit.lib.PersonIdent;
import org.eclipse.jgit.lib.Repository;
import org.eclipse.jgit.storage.file.FileRepositoryBuilder;
import uk.ac.ic.wlgitbridge.data.filestore.GitDirectoryContents;
import uk.ac.ic.wlgitbridge.data.filestore.RawDirectory;
import uk.ac.ic.wlgitbridge.git.exception.GitUserException;
import uk.ac.ic.wlgitbridge.git.util.RepositoryObjectTreeWalker;
import uk.ac.ic.wlgitbridge.util.Log;
import uk.ac.ic.wlgitbridge.util.Project;
import uk.ac.ic.wlgitbridge.util.Util;
import java.io.File;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.nio.file.FileVisitResult;
import java.nio.file.FileVisitor;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.attribute.BasicFileAttributes;
import java.util.*;
        } catch (GitAPIException e) {
            throw new IOException(e);
        }
    }

    @Override
    public Repository getJGitRepository() {
        return repository.get();
    }

    public File getDotGitDir() {
        return getJGitRepository().getWorkTree();
    }

    private void initRepositoryField(RepoStore repoStore) throws IOException {
        Preconditions.checkNotNull(repoStore);
        Preconditions.checkArgument(Project.isValidProjectName(projectName));
        Preconditions.checkState(!repository.isPresent());
        repository = Optional.of(createJGitRepository(repoStore, projectName));
    }

    private Repository createJGitRepository(
            RepoStore repoStore,
            String projName
    ) throws IOException {
        File repoDir = new File(repoStore.getRootDirectory(), projName);
        return new FileRepositoryBuilder().setWorkTree(repoDir).build();
    }

    private Collection<String> doCommitAndGetMissing(
// Path: src/main/java/uk/ac/ic/wlgitbridge/data/filestore/GitDirectoryContents.java
// public class GitDirectoryContents {
// 
//     private final List<RawFile> files;
//     private final File gitDirectory;
//     private final String userName;
//     private final String userEmail;
//     private final String commitMessage;
//     private final Date when;
// 
//     public GitDirectoryContents(
//             List<RawFile> files,
//             File rootGitDirectory,
//             String projectName,
//             String userName,
//             String userEmail,
//             String commitMessage,
//             Date when
//     ) {
//         this.files = files;
//         this.gitDirectory = new File(rootGitDirectory, projectName);
//         this.userName = userName;
//         this.userEmail = userEmail;
//         this.commitMessage = commitMessage;
//         this.when = when;
//     }
// 
//     public GitDirectoryContents(
//             List<RawFile> files,
//             File rootGitDirectory,
//             String projectName,
//             Snapshot snapshot
//     ) {
//         this(
//                 files,
//                 rootGitDirectory,
//                 projectName,
//                 snapshot.getUserName(),
//                 snapshot.getUserEmail(),
//                 snapshot.getComment(),
//                 snapshot.getCreatedAt()
//         );
//     }
// 
//     public void write() throws IOException {
//         Util.deleteInDirectoryApartFrom(gitDirectory, ".git");
//         for (RawFile fileNode : files) {
//             fileNode.writeToDisk(gitDirectory);
//         }
//     }
// 
//     public File getDirectory() {
//         return gitDirectory;
//     }
// 
//     public String getUserName() {
//         return userName;
//     }
// 
//     public String getUserEmail() {
//         return userEmail;
//     }
// 
//     public String getCommitMessage() {
//         return commitMessage;
//     }
// 
//     public Date getWhen() {
//         return when;
//     }
// 
// }
// 
// Path: src/main/java/uk/ac/ic/wlgitbridge/util/Log.java
// public class Log {
// 
//     private static Logger logger = LoggerFactory.getLogger(GitBridgeApp.class);
// 
//     public static void trace(String msg) {
//         logger.trace(msg);
//     }
// 
//     public static void trace(String msg, Throwable t) {
//         logger.trace(msg, t);
//     }
// 
//     public static void debug(String msg) {
//         logger.debug(msg);
//     }
// 
//     public static void debug(String msg, Throwable t) {
//         logger.debug(msg, t);
//     }
// 
//     public static void info(String msg) {
//         logger.info(msg);
//     }
// 
//     public static void info(String format, Object arg) {
//         logger.info(format, arg);
//     }
// 
//     public static void info(String format, Object arg1, Object arg2) {
//         logger.info(format, arg1, arg2);
//     }
// 
//     public static void info(String format, Object... args) {
//         logger.info(format, args);
//     }
// 
//     public static void info(String msg, Throwable t) {
//         logger.info(msg, t);
//     }
// 
//     public static void warn(String msg) {
//         logger.warn(msg);
//     }
// 
//     public static void warn(String msg, Object arg) {
//         logger.warn(msg, arg);
//     }
// 
//     public static void warn(String msg, Object arg1, Object arg2) {
//         logger.warn(msg, arg1, arg2);
//     }
// 
//     public static void warn(String msg, Object... args) {
//         logger.warn(msg, args);
//     }
// 
//     public static void warn(String msg, Throwable t) {
//         logger.warn(msg, t);
//     }
// 
//     public static void error(String msg) {
//         logger.error(msg);
//     }
// 
//     public static void error(String msg, Object... args) {
//         logger.error(msg, args);
//     }
// 
//     public static void error(String msg, Throwable t) {
//         logger.error(msg, t);
//     }
// 
// }


// Path: src/main/java/uk/ac/ic/wlgitbridge/bridge/repo/GitProjectRepo.java
import com.google.common.base.Preconditions;
import org.apache.commons.io.IOUtils;
import org.eclipse.jgit.api.Git;
import org.eclipse.jgit.api.ResetCommand;
import org.eclipse.jgit.api.errors.GitAPIException;
import org.eclipse.jgit.lib.PersonIdent;
import org.eclipse.jgit.lib.Repository;
import org.eclipse.jgit.storage.file.FileRepositoryBuilder;
import uk.ac.ic.wlgitbridge.data.filestore.GitDirectoryContents;
import uk.ac.ic.wlgitbridge.data.filestore.RawDirectory;
import uk.ac.ic.wlgitbridge.git.exception.GitUserException;
import uk.ac.ic.wlgitbridge.git.util.RepositoryObjectTreeWalker;
import uk.ac.ic.wlgitbridge.util.Log;
import uk.ac.ic.wlgitbridge.util.Project;
import uk.ac.ic.wlgitbridge.util.Util;
import java.io.File;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.nio.file.FileVisitResult;
import java.nio.file.FileVisitor;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.attribute.BasicFileAttributes;
import java.util.*;

        } catch (GitAPIException e) {
            throw new IOException(e);
        }
    }

    @Override
    public Repository getJGitRepository() {
        return repository.get();
    }

    public File getDotGitDir() {
        return getJGitRepository().getWorkTree();
    }

    private void initRepositoryField(RepoStore repoStore) throws IOException {
        Preconditions.checkNotNull(repoStore);
        Preconditions.checkArgument(Project.isValidProjectName(projectName));
        Preconditions.checkState(!repository.isPresent());
        repository = Optional.of(createJGitRepository(repoStore, projectName));
    }

    private Repository createJGitRepository(
            RepoStore repoStore,
            String projName
    ) throws IOException {
        File repoDir = new File(repoStore.getRootDirectory(), projName);
        return new FileRepositoryBuilder().setWorkTree(repoDir).build();
    }

    private Collection<String> doCommitAndGetMissing(
            GitDirectoryContents contents