private CloneVerb.Result HydrateRootGitAttributes(GVFSGitObjects gitObjects, GitRepo repo, string branch) { List <DiffTreeResult> rootEntries = new List <DiffTreeResult>(); GitProcess git = new GitProcess(this.enlistment); GitProcess.Result result = git.LsTree( GVFSConstants.DotGit.HeadName, line => rootEntries.Add(DiffTreeResult.ParseFromLsTreeLine(line, repoRoot: string.Empty)), recursive: false); if (result.HasErrors) { return(new CloneVerb.Result("Error returned from ls-tree to find " + GVFSConstants.SpecialGitFiles.GitAttributes + " file: " + result.Errors)); } DiffTreeResult gitAttributes = rootEntries.FirstOrDefault(entry => entry.TargetFilename.Equals(GVFSConstants.SpecialGitFiles.GitAttributes)); if (gitAttributes == null) { return(new CloneVerb.Result("This branch does not contain a " + GVFSConstants.SpecialGitFiles.GitAttributes + " file in the root folder. This file is required by GVFS clone")); } if (!repo.ObjectExists(gitAttributes.TargetSha)) { if (gitObjects.TryDownloadAndSaveObject(gitAttributes.TargetSha) != GitObjects.DownloadAndSaveObjectResult.Success) { return(new CloneVerb.Result("Could not download " + GVFSConstants.SpecialGitFiles.GitAttributes + " file")); } } return(new CloneVerb.Result(true)); }
protected bool TryDownloadRootGitAttributes(GVFSEnlistment enlistment, GVFSGitObjects gitObjects, GitRepo repo, out string error) { List <DiffTreeResult> rootEntries = new List <DiffTreeResult>(); GitProcess git = new GitProcess(enlistment); GitProcess.Result result = git.LsTree( GVFSConstants.DotGit.HeadName, line => rootEntries.Add(DiffTreeResult.ParseFromLsTreeLine(line, repoRoot: string.Empty)), recursive: false); if (result.ExitCodeIsFailure) { error = "Error returned from ls-tree to find " + GVFSConstants.SpecialGitFiles.GitAttributes + " file: " + result.Errors; return(false); } DiffTreeResult gitAttributes = rootEntries.FirstOrDefault(entry => entry.TargetPath.Equals(GVFSConstants.SpecialGitFiles.GitAttributes)); if (gitAttributes == null) { error = "This branch does not contain a " + GVFSConstants.SpecialGitFiles.GitAttributes + " file in the root folder. This file is required by GVFS clone"; return(false); } if (!repo.ObjectExists(gitAttributes.TargetSha)) { if (gitObjects.TryDownloadAndSaveObject(gitAttributes.TargetSha, GVFSGitObjects.RequestSource.GVFSVerb) != GitObjects.DownloadAndSaveObjectResult.Success) { error = "Could not download " + GVFSConstants.SpecialGitFiles.GitAttributes + " file"; return(false); } } error = null; return(true); }