コード例 #1
0
        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); });
        }