예제 #1
0
        static public void ShowChangeset(VersionControlServer vcs,
                                         ChangesetVersionSpec versionSpec,
                                         bool brief, DiffOptions diffOpts)
        {
            int       changesetId = versionSpec.ChangesetId;
            Changeset changeset   = vcs.GetChangeset(changesetId, true, true);

            // fetch all items in one fell swoop
            List <int> ids = new List <int>();

            foreach (Change change in changeset.Changes)
            {
                ids.Add(change.Item.ItemId);
            }

            // find items in prior changeset
            Item[] items = vcs.GetItems(ids.ToArray(), changesetId - 1, true);
            SortedList <int, Item> itemList = new SortedList <int, Item>();

            foreach (Item item in items)
            {
                // itemId of 0 means a null item, IOW file was added in this changeset
                // and missing in prior changeset
                if (item.ItemId == 0)
                {
                    continue;
                }
                itemList.Add(item.ItemId, item);
            }

            foreach (Change change in changeset.Changes)
            {
                // skip folders
                if (change.Item.ItemType == ItemType.Folder)
                {
                    continue;
                }
                string p = change.Item.ServerItem.Substring(2);

                if (brief)
                {
                    Console.WriteLine(p);
                    continue;
                }

                IDiffItem a = new DiffItemNull();
                IDiffItem b = new DiffItemNull();

                string tnameA = null;
                string tnameB = null;

                if (((change.ChangeType & ChangeType.Add) != ChangeType.Add) &&
                    (itemList.ContainsKey(change.Item.ItemId)))
                {
                    Item itemA = itemList[change.Item.ItemId];

                    tnameA = Path.GetTempFileName();
                    itemA.DownloadFile(tnameA);

                    a = new DiffItemLocalFile(tnameA, itemA.Encoding,
                                              changeset.CreationDate, true);
                }

                if ((change.ChangeType & ChangeType.Delete) != ChangeType.Delete)
                {
                    tnameB = Path.GetTempFileName();
                    change.Item.DownloadFile(tnameB);

                    b = new DiffItemLocalFile(tnameB, change.Item.Encoding,
                                              changeset.CreationDate, true);
                }

                diffOpts.TargetLabel = versionSpec.DisplayString;
                Difference.DiffFiles(vcs, a, b, diffOpts, p, true);

                if (!String.IsNullOrEmpty(tnameA))
                {
                    File.Delete(tnameA);
                }

                if (!String.IsNullOrEmpty(tnameB))
                {
                    File.Delete(tnameB);
                }
            }
        }
예제 #2
0
        public static void ShowChangeset(VersionControlServer vcs, 
																		 ChangesetVersionSpec versionSpec, 
																		 bool brief, DiffOptions diffOpts)
        {
            int changesetId = versionSpec.ChangesetId;
            Changeset changeset = vcs.GetChangeset(changesetId, true, true);

            // fetch all items in one fell swoop
            List<int> ids = new List<int>();
            foreach (Change change in changeset.Changes)
                ids.Add(change.Item.ItemId);

            // find items in prior changeset
            Item[] items = vcs.GetItems(ids.ToArray(), changesetId-1, true);
            SortedList<int, Item> itemList = new SortedList<int, Item>();
            foreach (Item item in items)
                {
                    // itemId of 0 means a null item, IOW file was added in this changeset
                    // and missing in prior changeset
                    if (item.ItemId == 0) continue;
                    itemList.Add(item.ItemId, item);
                }

            foreach (Change change in changeset.Changes)
                {
                    // skip folders
                    if (change.Item.ItemType == ItemType.Folder) continue;
                    string p = change.Item.ServerItem.Substring(2);

                    if (brief)
                        {
                            Console.WriteLine(p);
                            continue;
                        }

                    IDiffItem a = new DiffItemNull();
                    IDiffItem b = new DiffItemNull();

                    string tnameA = null;
                    string tnameB = null;

                    if (((change.ChangeType & ChangeType.Add) != ChangeType.Add) &&
                            (itemList.ContainsKey(change.Item.ItemId)))
                        {
                            Item itemA = itemList[change.Item.ItemId];

                            tnameA = Path.GetTempFileName();
                            itemA.DownloadFile(tnameA);

                            a = new DiffItemLocalFile(tnameA, itemA.Encoding,
                                                                                changeset.CreationDate, true);
                        }

                    if ((change.ChangeType & ChangeType.Delete) != ChangeType.Delete)
                        {
                            tnameB = Path.GetTempFileName();
                            change.Item.DownloadFile(tnameB);

                            b = new DiffItemLocalFile(tnameB, change.Item.Encoding,
                                                                                changeset.CreationDate, true);
                        }

                    diffOpts.TargetLabel = versionSpec.DisplayString;
                    Difference.DiffFiles(vcs, a, b, diffOpts, p, true);

                    if (!String.IsNullOrEmpty(tnameA))
                        File.Delete(tnameA);

                    if (!String.IsNullOrEmpty(tnameB))
                        File.Delete(tnameB);
                }
        }