public void Clone(string fullRepositoryName) { if (IsInitialized && fullRepositoryName != this.FullRepositoryName) { throw new InvalidOperationException($"The repository at '{Directory.PhysicalPath}' is already initialized for repository {this.FullRepositoryName}"); } else if (!IsInitialized && Directory.HasContents) { throw new InvalidOperationException($"The target directory '{Directory.PhysicalPath}' is not empty"); } this.FullRepositoryName = fullRepositoryName; RepositoryFileReference[] treeFiles = null; if (IsInitialized) { UI.PrintLine($"Respository {fullRepositoryName} already initialized, continuing the clone process\r\n"); treeFiles = ParseTreeFile(); } else { UI.PrintLine("Getting repository information..."); var branchCount = Api.GetBranchCount(); if (branchCount == 0) { throw new InvalidOperationException($"The repository {fullRepositoryName} is empty, please use 'link' instead of 'clone'"); } LocalBranchName = Api.GetRepositoryInfo().DefaultBranch; LocalCommitSha = Api.GetBranchCommitSha(LocalBranchName); treeFiles = GetRemoteFileReferences(); UpdateStateFile(); UpdateTreeFile(treeFiles); } UI.PrintLine($"Getting files for branch {LocalBranchName}"); foreach (var file in treeFiles) { if (Directory.FileExists(file.Path) && Directory.GetFileSize(file.Path) == file.Size) { UI.PrintLine($" {file.Path} - already exists, skipping"); } else { UI.PrintLine($" {file.Path} ..."); var fileContents = Api.GetBlob(file.BlobSha); Directory.CreateFile(fileContents, file.Path); } } DoForAllLocalFiles(file => { Directory.SetUnmodified(file); }); }
private static bool MoveDirectoryUpUntilRepositoryRoot(FilesystemDirectory directory) { while (true) { if (directory.FileExists(stateFilePath)) { return(true); } if (!directory.MoveOneDirectoryUp()) { return(false); } } }