public override int Run(string[] remainingArguments) { Gitlet.Init(new InitOptions { Bare = Bare }); return(0); }
public static string Clone(string remotePath, string targetPath, CloneOptions options = null) { options = options ?? new CloneOptions(); // Abort if a `remotePath` or `targetPath` not passed. if (remotePath == null) { throw new ArgumentNullException("remotePath"); } if (targetPath == null) { throw new ArgumentNullException("targetPath"); } // Abort if `remotePath` does not exist, or is not a Gitlet // repository. !util.remote(remotePath)(files.inRepo)) if (!Directory.Exists(remotePath) || !Util.Remote <bool>(remotePath)(Files.InRepo)) { throw new Exception("repository " + remotePath + " does not exist"); } // Abort if `targetPath` exists and is not empty. targetPath = Files.Absolute(targetPath); var targetDir = new DirectoryInfo(targetPath); if (targetDir.Exists && targetDir.GetFileSystemInfos().Length > 0) { throw new Exception(targetPath + " already exists and is not empty"); } // Otherwise, do the clone. remotePath = Files.Absolute(remotePath); // If `targetPath` doesn't exist, create it. if (!targetDir.Exists) { targetDir.Create(); } Util.Remote <object>(targetPath)(() => { // Initialize the directory as a Gitlet repository. Gitlet.Init(options); // Set up `remotePath` as a remote called "origin". Gitlet.Remote("add", "origin", Files.Relative(Files.CurrentPath, remotePath)); // Get the hash of the commit that master is pointing at on // the remote repository. var remoteHeadHash = Util.Remote <string>(remotePath)(() => Refs.Hash("master")); // If the remote repo has any commits, that hash will exist. // The new repository records the commit that the passed // `branch` is at on the remote. It then sets master on the // new repository to point at that commit. if (remoteHeadHash != null) { Gitlet.Fetch("origin", "master"); Core.Merge.WriteFastForwardMerge(null, remoteHeadHash); } return(null); }); // Report the result of the clone. return("Cloning into " + targetPath); }