private void GetDiff(IResource repository, FileChange fileChange) { if (fileChange.HasProp(Props.Diff)) { return; } int revision = fileChange.Revision; if (revision == 1) { return; } string repoRoot = repository.GetProp(Props.RepositoryRoot); if (repoRoot == null) { try { repoRoot = GetRunner(repository).GetSvnInfo("Repository Root:"); ClearLastError(repository); } catch (RunnerException ex) { SetLastError(repository, ex); return; } new ResourceProxy(repository).SetPropAsync(Props.RepositoryRoot, repoRoot); } string repoPath = BuildFileName(repository, fileChange); SvnRunner svnRunner = GetRunner(repository); svnRunner.RepositoryUrl = repoRoot; try { string diff = svnRunner.GetDiff(repoPath, revision - 1, revision); fileChange.Diff = diff; fileChange.SaveAsync(); if (diff == "") { CheckBinaryFile(repository, repoRoot, repoPath, fileChange); } ClearLastError(repository); } catch (RunnerException ex) { SetLastError(repository, ex); } }
private void HandleFileChangeChanged(object sender, ResourcePropIndexEventArgs e) { if (!Core.UserInterfaceAP.IsOwnerThread) { Core.UIManager.QueueUIJob(() => HandleFileChangeChanged(sender, e)); return; } FileChange fileChange = (FileChange)_changedFilesList.SelectedItem; if (fileChange != null && fileChange.Resource == e.Resource) { UpdateSelectedChange(); } }
internal override string BuildLinkToFile(IResource repository, FileChange fileChange) { string url = repository.GetProp(Props.RepositoryUrl); if (url.StartsWith("http://")) { if (url.EndsWith("/")) { url = url.Substring(0, url.Length - 1); } return(url + BuildPath(fileChange.AffectsFolder) + "/" + fileChange.Name); } return(null); }
private void UpdateSelectedChange() { FileChange fileChange = (FileChange)_changedFilesList.SelectedItem; if (fileChange != null) { IResource repository = _changeSet.GetProp(Props.ChangeSetRepository); RepositoryType repType = SccPlugin.GetRepositoryType(repository); string diffText = repType.OnFileChangeSelected(repository, fileChange); _lnkFileName.Text = repType.BuildFileName(repository, fileChange); if (_lnkFileName.Links.Count == 1) { _lnkFileName.Links [0].LinkData = fileChange; } _edtDiff.Clear(); string changeType = fileChange.ChangeType; if (changeType == "add") { _edtDiff.Text = "New file"; } else if (changeType == "delete") { _edtDiff.Text = "File deleted"; } else if (fileChange.Binary) { _edtDiff.Text = "Binary file"; } else { string diff = fileChange.Diff; if (String.IsNullOrEmpty(diff)) { _edtDiff.Text = diffText; } else { _edtDiff.Text = FilterWhitespaceOnlyDiffs(diff); ColorizeDiff(); } } } else { ClearSelectedChange(); } }
private static void ProcessFileChanges(IResource repository, ResourceProxy csProxy, XmlElement node, int revision) { foreach (XmlElement pathNode in node.SelectNodes("paths/path")) { string action = pathNode.GetAttribute("action"); string path = pathNode.InnerText; int pos = path.LastIndexOf('/'); string folderName = path.Substring(0, pos); string fileName = path.Substring(pos + 1); IResource folder = FindOrCreateFolder(repository, folderName); csProxy.AddLink(Props.AffectsFolder, folder); FileChange fileChange = FileChange.Create(); fileChange.Name = fileName; fileChange.AffectsFolder = folder; switch (action) { case "A": fileChange.ChangeType = "add"; break; case "D": fileChange.ChangeType = "delete"; break; case "R": fileChange.ChangeType = "replace"; break; default: fileChange.ChangeType = "change"; break; } fileChange.Revision = revision; fileChange.Save(); csProxy.AddLink(Props.Change, fileChange.Resource); } }
private static void SaveChangeSet(IResource repository, IResource changeSet, ChangeSetDetails details) { if (changeSet.HasProp(Props.Change)) { return; } ResourceProxy proxy = new ResourceProxy(changeSet); proxy.BeginUpdate(); SetChangeSetDescription(proxy, details.Description); foreach (var fileChangeData in details.FileChanges) { int pos = fileChangeData.Path.LastIndexOf('/'); string folderName = fileChangeData.Path.Substring(0, pos); string fileName = fileChangeData.Path.Substring(pos + 1); IResource folder = FindOrCreateFolder(repository, folderName); proxy.AddLink(Props.AffectsFolder, folder); var fileChange = FileChange.Create(); fileChange.Name = fileName; fileChange.AffectsFolder = folder; fileChange.ChangeType = fileChangeData.ChangeType; fileChange.Revision = fileChangeData.Revision; fileChange.Diff = fileChangeData.Diff; fileChange.Binary = fileChangeData.Binary; fileChange.Save(); proxy.AddLink(Props.Change, fileChange.Resource); } proxy.EndUpdate(); Core.TextIndexManager.QueryIndexing(proxy.Resource.Id); }
private static void CheckBinaryFile(IResource repository, string repoRoot, string repoPath, FileChange fileChange) { SvnRunner svnRunner = GetRunner(repository); svnRunner.RepositoryUrl = repoRoot; try { string prop = svnRunner.GetProperty(repoPath, "svn:mime-type"); ClearLastError(repository); // see libsvn_subr/validate.c:svn_mime_type_is_binary() in Subversion source code if (!prop.StartsWith("text/") && !prop.StartsWith("image/x-xbitmap") && !prop.StartsWith("image/x-xpixmap")) { fileChange.Binary = true; fileChange.SaveAsync(); } } catch (RunnerException ex) { SetLastError(repository, ex); } }
internal override string BuildFileName(IResource repository, FileChange fileChange) { return(BuildPath(fileChange.AffectsFolder) + "/" + fileChange.Name); }
internal abstract string BuildLinkToFile(IResource repository, FileChange fileChange);
internal abstract string BuildFileName(IResource repository, FileChange fileChange);
/// <summary> /// Called when a file change is selected in the repository. /// </summary> /// <param name="repository">The repository to which the file change belongs.</param> /// <param name="fileChange">The selected file change.</param> /// <returns>The text to display in the diff preview pane.</returns> internal virtual string OnFileChangeSelected(IResource repository, FileChange fileChange) { return(null); }