public GitBasedFileSystemHistory(Repository repository, BranchName branchName) { if (branchName == null) { throw new ArgumentNullException(nameof(branchName)); } if (repository == null) { throw new ArgumentNullException(nameof(repository)); } m_Repository = repository; var branch = repository.GetBranch(branchName); m_BranchName = BranchName.Parse(branch.FriendlyName); m_Snapshots = new Lazy<IDictionary<string, GitBasedFileSystemSnapshot>>(LoadSnapshots); }
public static GitBasedMultiFileSystemSnapshot Create(Repository repository, BranchName branchName, IHistoryService historyService) { var directoryCreator = new LocalItemCreator(); var branch = repository.GetBranch(branchName); string commitId; using (var workingRepository = new TemporaryWorkingDirectory(repository.Info.Path, branch.FriendlyName)) { var snapshotDirectory = new Directory(null, s_SnapshotDirectoryName); foreach (var fileSystemHistory in historyService.Items) { var fileName = fileSystemHistory.Name + s_FileNameSuffix; var content = fileSystemHistory.LatestFileSystemSnapshot?.Id ?? ""; snapshotDirectory.Add(d => new TextFile(d, fileName, content)); } var snapshotDirectoryPath = Path.Combine(workingRepository.Location, s_SnapshotDirectoryName); directoryCreator.CreateDirectoryInPlace(snapshotDirectory, snapshotDirectoryPath, true); if (workingRepository.HasChanges) { try { commitId = workingRepository.Commit("Created multi-filesystem snapshot"); workingRepository.Push(); } catch (EmptyCommitException) { // no changes after all (HasChanges does not seem to be a 100% accurate) commitId = repository.GetBranch(branchName).Tip.Sha; } } else { commitId = repository.GetBranch(branchName).Tip.Sha; } } var commit = repository.Lookup<Commit>(commitId); return IsSnapshot(commit) ? new GitBasedMultiFileSystemSnapshot(commit, historyService) : null; }