private void LoadFileHistory() { FileChanges.Visible = true; asyncLoader.Load(() => BuildFilter(FileName), (filter) => { if (filter == null) { return; } FileChanges.FixedFilter = filter; FileChanges.AllowGraphWithFilter = true; FileChanges.Load(); }); }
private void LoadFileHistory() { FileChanges.Visible = true; if (string.IsNullOrEmpty(FileName)) { return; } _asyncLoader.LoadAsync( () => BuildFilter(FileName), filter => { var(revisionFilter, pathFilter) = BuildFilter(FileName); FileChanges.FixedRevisionFilter = revisionFilter; FileChanges.FixedPathFilter = pathFilter; FileChanges.FiltredFileName = FileName; FileChanges.AllowGraphWithFilter = true; FileChanges.Load(); }); }
private void LoadFileHistory() { FileChanges.Visible = true; if (string.IsNullOrEmpty(FileName)) { return; } _asyncLoader.LoadAsync( () => BuildFilter(), filter => { FileChanges.SetFilters(filter); FileChanges.Load(); }); return; (string revision, string path) BuildFilter() { var fileName = FileName; // Replace windows path separator to Linux path separator. // This is needed to keep the file history working when started from file tree in // browse dialog. fileName = fileName.ToPosixPath(); // we will need this later to look up proper casing for the file var fullFilePath = _fullPathResolver.Resolve(fileName); // The section below contains native windows (kernel32) calls // and breaks on Linux. Only use it on Windows. Casing is only // a Windows problem anyway. if (EnvUtils.RunningOnWindows() && File.Exists(fullFilePath)) { // grab the 8.3 file path var shortPath = new StringBuilder(4096); NativeMethods.GetShortPathName(fullFilePath, shortPath, shortPath.Capacity); // use 8.3 file path to get properly cased full file path var longPath = new StringBuilder(4096); NativeMethods.GetLongPathName(shortPath.ToString(), longPath, longPath.Capacity); // remove the working directory and now we have a properly cased file name. fileName = longPath.ToString().Substring(Module.WorkingDir.Length).ToPosixPath(); } if (fileName.StartsWith(Module.WorkingDir, StringComparison.InvariantCultureIgnoreCase)) { fileName = fileName.Substring(Module.WorkingDir.Length); } FileName = fileName; var res = (revision : (string)null, path : $" \"{fileName}\""); if (AppSettings.FollowRenamesInFileHistory && !Directory.Exists(fullFilePath)) { // git log --follow is not working as expected (see http://kerneltrap.org/mailarchive/git/2009/1/30/4856404/thread) // // But we can take a more complicated path to get reasonable results: // 1. use git log --follow to get all previous filenames of the file we are interested in // 2. use git log "list of files names" to get the history graph // // note: This implementation is quite a quick hack (by someone who does not speak C# fluently). // var args = new GitArgumentBuilder("log") { "--format=\"%n\"", "--name-only", "--format", GitCommandHelpers.FindRenamesAndCopiesOpts(), "--", fileName.Quote() }; var listOfFileNames = new StringBuilder(fileName.Quote()); // keep a set of the file names already seen var setOfFileNames = new HashSet <string> { fileName }; var lines = Module.GetGitOutputLines(args, GitModule.LosslessEncoding); foreach (var line in lines.Select(GitModule.ReEncodeFileNameFromLossless)) { if (!string.IsNullOrEmpty(line) && setOfFileNames.Add(line)) { listOfFileNames.Append(" \""); listOfFileNames.Append(line); listOfFileNames.Append('\"'); } } // here we need --name-only to get the previous filenames in the revision graph res.path = listOfFileNames.ToString(); res.revision += " --name-only --parents" + GitCommandHelpers.FindRenamesAndCopiesOpts(); } else if (AppSettings.FollowRenamesInFileHistory) { // history of a directory // --parents doesn't work with --follow enabled, but needed to graph a filtered log res.revision = " " + GitCommandHelpers.FindRenamesOpt() + " --follow --parents"; } else { // rename following disabled res.revision = " --parents"; } if (AppSettings.FullHistoryInFileHistory) { res.revision = string.Concat(" --full-history --simplify-merges ", res.revision); } return(res); } }
private void LoadFileHistory() { FileChanges.Visible = true; if (string.IsNullOrEmpty(FileName)) { return; } _asyncLoader.LoadAsync( () => BuildFilter(), filter => { FileChanges.SetFilters(filter); FileChanges.Load(); }); return; (string revision, string path) BuildFilter() { var fileName = FileName; // Replace windows path separator to Linux path separator. // This is needed to keep the file history working when started from file tree in // browse dialog. FileName = fileName.ToPosixPath(); var res = (revision : (string)null, path : $" \"{fileName}\""); var fullFilePath = _fullPathResolver.Resolve(fileName); if (AppSettings.FollowRenamesInFileHistory && !Directory.Exists(fullFilePath)) { // git log --follow is not working as expected (see http://kerneltrap.org/mailarchive/git/2009/1/30/4856404/thread) // // But we can take a more complicated path to get reasonable results: // 1. use git log --follow to get all previous filenames of the file we are interested in // 2. use git log "list of files names" to get the history graph // // note: This implementation is quite a quick hack (by someone who does not speak C# fluently). // var args = new GitArgumentBuilder("log") { "--format=\"%n\"", "--name-only", "--follow", GitCommandHelpers.FindRenamesAndCopiesOpts(), "--", fileName.Quote() }; var listOfFileNames = new StringBuilder(fileName.Quote()); // keep a set of the file names already seen var setOfFileNames = new HashSet <string> { fileName }; var lines = Module.GitExecutable.GetOutputLines(args, outputEncoding: GitModule.LosslessEncoding); foreach (var line in lines.Select(GitModule.ReEncodeFileNameFromLossless)) { if (!string.IsNullOrEmpty(line) && setOfFileNames.Add(line)) { listOfFileNames.Append(" \""); listOfFileNames.Append(line); listOfFileNames.Append('\"'); } } // here we need --name-only to get the previous filenames in the revision graph res.path = listOfFileNames.ToString(); res.revision += " --name-only --parents" + GitCommandHelpers.FindRenamesAndCopiesOpts(); } else if (AppSettings.FollowRenamesInFileHistory) { // history of a directory // --parents doesn't work with --follow enabled, but needed to graph a filtered log res.revision = " " + GitCommandHelpers.FindRenamesOpt() + " --follow --parents"; } else { // rename following disabled res.revision = " --parents"; } if (AppSettings.FullHistoryInFileHistory) { res.revision = string.Concat(" --full-history ", AppSettings.SimplifyMergesInFileHistory ? "--simplify-merges " : string.Empty, res.revision); } return(res); } }
private void LoadFileHistory(string fileName) { if (string.IsNullOrEmpty(fileName)) { return; } //Replace windows path seperator to linux path seperator. //This is needed to keep the file history working when started from file tree in //browse dialog. fileName = fileName.Replace('\\', '/'); // we will need this later to look up proper casing for the file var fullFilePath = Path.Combine(GitModule.CurrentWorkingDir, fileName); //The section below contains native windows (kernel32) calls //and breaks on Linux. Only use it on Windows. Casing is only //a Windows problem anyway. if (Settings.RunningOnWindows() && File.Exists(fullFilePath)) { // grab the 8.3 file path var shortPath = new StringBuilder(4096); NativeMethods.GetShortPathName(fullFilePath, shortPath, shortPath.Capacity); // use 8.3 file path to get properly cased full file path var longPath = new StringBuilder(4096); NativeMethods.GetLongPathName(shortPath.ToString(), longPath, longPath.Capacity); // remove the working dir and now we have a properly cased file name. fileName = longPath.ToString().Substring(GitModule.CurrentWorkingDir.Length); } if (fileName.StartsWith(GitModule.CurrentWorkingDir, StringComparison.InvariantCultureIgnoreCase)) { fileName = fileName.Substring(GitModule.CurrentWorkingDir.Length); } FileName = fileName; string filter; if (Settings.FollowRenamesInFileHistory && !Directory.Exists(fullFilePath)) { // git log --follow is not working as expected (see http://kerneltrap.org/mailarchive/git/2009/1/30/4856404/thread) // // But we can take a more complicated path to get reasonable results: // 1. use git log --follow to get all previous filenames of the file we are interested in // 2. use git log "list of files names" to get the history graph // // note: This implementation is quite a quick hack (by someone who does not speak C# fluently). // var gitGetGraphCommand = new GitCommandsInstance { StreamOutput = true, CollectOutput = false }; string arg = "log --format=\"%n\" --name-only --follow -- \"" + fileName + "\""; Process p = gitGetGraphCommand.CmdStartProcess(Settings.GitCommand, arg); // the sequence of (quoted) file names - start with the initial filename for the search. var listOfFileNames = new StringBuilder("\"" + fileName + "\""); // keep a set of the file names already seen var setOfFileNames = new HashSet <string> { fileName }; string line; do { line = p.StandardOutput.ReadLine(); if (!string.IsNullOrEmpty(line) && setOfFileNames.Add(line)) { listOfFileNames.Append(" \""); listOfFileNames.Append(line); listOfFileNames.Append('\"'); } } while (line != null); // here we need --name-only to get the previous filenames in the revision graph filter = " -M -C --name-only --parents -- " + listOfFileNames; } else { // --parents doesn't work with --follow enabled, but needed to graph a filtered log filter = " --parents -- \"" + fileName + "\""; } if (Settings.FullHistoryInFileHistory) { filter = string.Concat(" --full-history --simplify-by-decoration ", filter); } syncContext.Post(_ => { FileChanges.FixedFilter = filter; FileChanges.AllowGraphWithFilter = true; FileChanges.Load(); }, null); }