} // GetFileStatus /// <summary> /// Create a VersionInfo from a LocalStatus /// </summary> private VersionInfo CreateNode(LocalStatus status, Repository repo) { VersionStatus rs = VersionStatus.Unversioned; Revision rr = null; VersionStatus vstatus = ConvertStatus(status.Status); // System.Console.WriteLine ("Converted {0} to {1} for {2}", status.Status, vstatus, status.Filename); VersionInfo ret = new VersionInfo(status.Filename, Path.GetFullPath(status.Filename), Directory.Exists(status.Filename), vstatus, new BazaarRevision(repo, status.Revision), rs, rr); return(ret); } // CreateNode
/// <summary> /// Create a VersionInfo from a LocalStatus /// </summary> private VersionInfo CreateNode(LocalStatus status, Repository repo) { VersionStatus rs = VersionStatus.Unversioned; Revision rr = null; VersionStatus vstatus = ConvertStatus (status.Status); // System.Console.WriteLine ("Converted {0} to {1} for {2}", status.Status, vstatus, status.Filename); VersionInfo ret = new VersionInfo (status.Filename, Path.GetFullPath (status.Filename), Directory.Exists (status.Filename), vstatus, new BazaarRevision (repo, status.Revision), rs, rr); return ret; }
public override System.Collections.Generic.IList<LocalStatus> Status(string path, BazaarRevision revision) { StringBuilder command = new StringBuilder(); List<LocalStatus> statuses = new List<LocalStatus>(); LocalStatus mystatus = null; string rev = string.Empty; bool modified = false; IntPtr tuple = IntPtr.Zero, listlen = IntPtr.Zero; path = NormalizePath(Path.GetFullPath(path).Replace("{", "{{").Replace("}", "}}"));// escape for string.format command.AppendFormat("tree,relpath = workingtree.WorkingTree.open_containing(path=ur\"{0}\")\n", path); if (null == revision || BazaarRevision.HEAD == revision.Rev || BazaarRevision.NONE == revision.Rev) { command.AppendFormat("rev = tree.basis_tree()\n"); command.AppendFormat("totree = tree\n"); rev = BazaarRevision.HEAD; } else { command.AppendFormat("revspec = revisionspec.RevisionSpec.from_string(spec=\"{0}\")\n", ((BazaarRevision)revision.GetPrevious()).Rev); command.AppendFormat("rev = tree.branch.repository.revision_tree(revision_id=revspec.in_history(branch=tree.branch).rev_id)\n"); command.AppendFormat("revspec = revisionspec.RevisionSpec.from_string(spec=\"{0}\")\n", revision.Rev); command.AppendFormat("totree = tree.branch.repository.revision_tree(revision_id=revspec.in_history(branch=tree.branch).rev_id)\n"); rev = revision.Rev; } command.AppendFormat("status = totree.changes_from(other=rev, specific_files=[relpath])\n"); lock (lockme) { run(null, command.ToString()); string[] types = new string[]{ "added", "removed", "modified", "unversioned" }; string filename; foreach (string modtype in types) { try { listlen = run(new List<string>{ "mylen" }, "mylist = status.{0}\nmylen = len(mylist)\n", modtype)[0]; int listlength = PyInt_AsLong(listlen); for (int i = 0; i < listlength; ++i) { tuple = run(new List<string>{ "astatus" }, "astatus = tree.abspath(filename=mylist[{0}][0])", i)[0]; filename = StringFromPython(tuple); if (Platform.IsWindows) { filename = filename.Replace("/", "\\"); } LocalStatus status = new LocalStatus(rev, filename, longStatuses[modtype]); if (path.Equals(filename, StringComparison.Ordinal)) { mystatus = status; } if (filename.StartsWith(path, StringComparison.Ordinal)) { modified = (!"unversioned".Equals(modtype, StringComparison.Ordinal)); statuses.Add(status); } }// get each file status } finally { Py_DecRef(listlen); } } command = new StringBuilder(); command.Append("myconflicts = \"\"\n"); command.Append("for conflict in totree.conflicts():\n"); command.Append(" myconflicts = myconflicts + totree.abspath (filename=conflict.path) + \"|\"\n"); string conflicts = StringFromPython(run(new List<string>{ "myconflicts" }, command.ToString())[0]); foreach (string conflict in conflicts.Split ('|')) { if (!string.IsNullOrEmpty(conflict)) { bool matched = false; if (path.Equals(conflict, StringComparison.Ordinal)) { if (null == mystatus) { statuses.Insert(0, mystatus = new LocalStatus(rev, path, ItemStatus.Conflicted)); } else { mystatus.Status = ItemStatus.Conflicted; } } else if (Path.GetFullPath(conflict).StartsWith(path, StringComparison.Ordinal)) { foreach (LocalStatus status in statuses) { if (conflict.EndsWith(status.Filename, StringComparison.Ordinal)) { status.Status = ItemStatus.Conflicted; matched = true; break; } }// Check existing statuses if (!matched) { statuses.Add(new LocalStatus(rev, conflict, ItemStatus.Conflicted)); }// Add new status if not found }// Child file is conflicted }// If conflict is valid path }// Check each conflict }// lock if (null == mystatus) { statuses.Insert(0, new LocalStatus("-1", path, modified ? ItemStatus.Modified : ItemStatus.Unchanged)); }// path isn't in modified list return statuses; }