void GetDirectoryVersionInfoCore (NGit.Repository repository, GitRevision rev, FilePath [] localPaths, HashSet<FilePath> existingFiles, HashSet<FilePath> nonVersionedMissingFiles, List<VersionInfo> versions) { var status = new FilteredStatus (repository, repository.ToGitPath (localPaths)).Call (); HashSet<string> added = new HashSet<string> (); Action<IEnumerable<string>, VersionStatus> AddFiles = delegate(IEnumerable<string> files, VersionStatus fstatus) { foreach (string file in files) { if (!added.Add (file)) continue; FilePath statFile = repository.FromGitPath (file); existingFiles.Remove (statFile.CanonicalPath); nonVersionedMissingFiles.Remove (statFile.CanonicalPath); versions.Add (new VersionInfo (statFile, "", false, fstatus, rev, VersionStatus.Versioned, null)); } }; AddFiles (status.GetAdded (), VersionStatus.Versioned | VersionStatus.ScheduledAdd); AddFiles (status.GetChanged (), VersionStatus.Versioned | VersionStatus.Modified); AddFiles (status.GetModified (), VersionStatus.Versioned | VersionStatus.Modified); AddFiles (status.GetRemoved (), VersionStatus.Versioned | VersionStatus.ScheduledDelete); AddFiles (status.GetMissing (), VersionStatus.Versioned | VersionStatus.ScheduledDelete); AddFiles (status.GetConflicting (), VersionStatus.Versioned | VersionStatus.Conflicted); AddFiles (status.GetUntracked (), VersionStatus.Unversioned); }
VersionInfo[] GetDirectoryVersionInfo (FilePath localDirectory, IEnumerable<FilePath> localFileNames, bool getRemoteStatus, bool recursive) { List<VersionInfo> versions = new List<VersionInfo> (); HashSet<FilePath> existingFiles = new HashSet<FilePath> (); HashSet<FilePath> nonVersionedMissingFiles = new HashSet<FilePath> (); if (localFileNames != null) { var localFiles = new List<FilePath> (); var arev = new GitRevision (this, ""); foreach (var p in localFileNames) { if (Directory.Exists (p)) { if (recursive) versions.AddRange (GetDirectoryVersionInfo (p, getRemoteStatus, true)); else versions.Add (new VersionInfo (p, "", true, VersionStatus.Versioned, arev, VersionStatus.Versioned, null)); } else { localFiles.Add (p); if (File.Exists (p)) existingFiles.Add (p.CanonicalPath); else nonVersionedMissingFiles.Add (p.CanonicalPath); } } // No files to check, we are done if (localFiles.Count == 0) return versions.ToArray (); localFileNames = localFiles; } else { CollectFiles (existingFiles, localDirectory, recursive); } GitRevision rev; var headCommit = GetHeadCommit (); if (headCommit != null) rev = new GitRevision (this, headCommit.Id.Name); else rev = null; IEnumerable<string> paths; if (localFileNames == null) { if (recursive) paths = new [] { (string) localDirectory }; else paths = Directory.GetFiles (localDirectory); } else { paths = localFileNames.Select (f => (string)f); } paths = paths.Select (f => ToGitPath (f)); var status = new FilteredStatus (repo, paths).Call (); HashSet<string> added = new HashSet<string> (); Action<IEnumerable<string>, VersionStatus> AddFiles = delegate(IEnumerable<string> files, VersionStatus fstatus) { foreach (string file in files) { if (!added.Add (file)) continue; FilePath statFile = FromGitPath (file); existingFiles.Remove (statFile.CanonicalPath); nonVersionedMissingFiles.Remove (statFile.CanonicalPath); versions.Add (new VersionInfo (statFile, "", false, fstatus, rev, VersionStatus.Versioned, null)); } }; AddFiles (status.GetAdded (), VersionStatus.Versioned | VersionStatus.ScheduledAdd); AddFiles (status.GetChanged (), VersionStatus.Versioned | VersionStatus.Modified); AddFiles (status.GetModified (), VersionStatus.Versioned | VersionStatus.Modified); AddFiles (status.GetRemoved (), VersionStatus.Versioned | VersionStatus.ScheduledDelete); AddFiles (status.GetMissing (), VersionStatus.Versioned | VersionStatus.ScheduledDelete); AddFiles (status.GetConflicting (), VersionStatus.Versioned | VersionStatus.Conflicted); AddFiles (status.GetUntracked (), VersionStatus.Unversioned); // Existing files for which git did not report an status are supposed to be tracked foreach (FilePath file in existingFiles) { VersionInfo vi = new VersionInfo (file, "", false, VersionStatus.Versioned, rev, VersionStatus.Versioned, null); versions.Add (vi); } // Non existing files for which git did not report an status are unversioned foreach (FilePath file in nonVersionedMissingFiles) versions.Add (VersionInfo.CreateUnversioned (file, false)); return versions.ToArray (); }