public void Rename(SourceItemChange change, bool updatingForwardInTime)
        {
            ItemMetaData oldItem = sourceControlProvider.GetPreviousVersionOfItems(new SourceItem[] { change.Item }, change.Item.RemoteChangesetId)[0];

            string itemOldName;
            string itemNewName;

            if (updatingForwardInTime)
            {
                itemOldName = oldItem.Name;
                itemNewName = change.Item.RemoteName;
                ProcessDeletedItem(itemOldName, change);
                ProcessAddedOrUpdatedItem(itemNewName, change, false, false);
            }
            else
            {
                itemOldName = change.Item.RemoteName;
                itemNewName = oldItem.Name;
                ProcessAddedOrUpdatedItem(itemNewName, change, false, false);
                ProcessDeletedItem(itemOldName, change);
            }
            if (change.Item.ItemType == ItemType.Folder)
            {
                renamedItemsToBeCheckedForDeletedChildren.Add(itemNewName);
            }
        }
 private void SetAdditionForPropertyChangeOnly(ItemMetaData item, bool propertyChange)
 {
     if (item == null)
     {
         return;
     }
     if (propertyChange == false)
     {
         additionForPropertyChangeOnly[item] = propertyChange;
     }
     else
     {
         if (additionForPropertyChangeOnly.ContainsKey(item) == false)
         {
             additionForPropertyChangeOnly[item] = propertyChange;
         }
     }
 }
示例#3
0
        private ItemMetaData FindItemOrCreateItem(FolderMetaData root, string pathRoot, string path, int targetVersion, Recursion recursion)
        {
            FolderMetaData folder = root;

            string[]     parts    = path.Split('/');
            string       itemName = pathRoot;
            ItemMetaData item     = null;

            for (int i = 0; i < parts.Length; i++)
            {
                if (itemName != "" && !itemName.EndsWith("/"))
                {
                    itemName += "/" + parts[i];
                }
                else
                {
                    itemName += parts[i];
                }

                item = folder.FindItem(itemName);
                bool lastNamePart = i == parts.Length - 1;
                if (item == null)
                {
                    if (lastNamePart)
                    {
                        item = sourceControlProvider.GetItems(targetVersion, itemName, recursion);
                    }
                    else
                    {
                        FolderMetaData subFolder =
                            (FolderMetaData)sourceControlProvider.GetItems(targetVersion, itemName, recursion);
                        item = subFolder;
                    }
                    item = item ?? new MissingItemMetaData(itemName, targetVersion, false);
                    folder.Items.Add(item);
                }
                if (lastNamePart == false)
                {
                    folder = (FolderMetaData)item;
                }
            }
            return(item);
        }
示例#4
0
 public ItemMetaData FindItem(string name)
 {
     if (string.Equals(name, this.Name, StringComparison.InvariantCultureIgnoreCase))
     {
         return(this);
     }
     foreach (ItemMetaData item in Items)
     {
         if (string.Equals(item.Name, name, StringComparison.InvariantCultureIgnoreCase))
         {
             return(item);
         }
         FolderMetaData subFolder = item as FolderMetaData;
         if (subFolder != null)
         {
             ItemMetaData result = subFolder.FindItem(name);
             if (result != null)
             {
                 return(result);
             }
         }
     }
     return(null);
 }
        private bool HandleDeleteItem(string remoteName, SourceItemChange change, string folderName, ref FolderMetaData folder, bool isLastNamePart)
        {
            ItemMetaData item = folder.FindItem(folderName);

            if (item is DeleteFolderMetaData || item is DeleteMetaData)
            {
                return(true);
            }

            if (item == null)
            {
                if (isLastNamePart)
                {
                    if (change.Item.ItemType == ItemType.File)
                    {
                        item = new DeleteMetaData();
                    }
                    else
                    {
                        item = new DeleteFolderMetaData();
                    }

                    item.Name         = remoteName;
                    item.ItemRevision = change.Item.RemoteChangesetId;
                }
                else
                {
                    item = sourceControlProvider.GetItemsWithoutProperties(_targetVersion, folderName, Recursion.None);
                    if (item == null)
                    {
                        item              = new DeleteFolderMetaData();
                        item.Name         = folderName;
                        item.ItemRevision = _targetVersion;
                    }
                }
                folder.Items.Add(item);
            }
            else if (isLastNamePart)        // we need to revert the item addition
            {
                if (item.OriginallyDeleted) // convert back into a delete
                {
                    folder.Items.Remove(item);
                    if (change.Item.ItemType == ItemType.File)
                    {
                        item = new DeleteMetaData();
                    }
                    else
                    {
                        item = new DeleteFolderMetaData();
                    }

                    item.Name         = remoteName;
                    item.ItemRevision = change.Item.RemoteChangesetId;
                    folder.Items.Add(item);
                }
                else if (item is StubFolderMetaData)
                {
                    DeleteFolderMetaData removeFolder = new DeleteFolderMetaData();
                    removeFolder.Name         = item.Name;
                    removeFolder.ItemRevision = _targetVersion;
                    folder.Items.Remove(item);
                    folder.Items.Add(removeFolder);
                }
                else if (additionForPropertyChangeOnly.ContainsKey(item) && additionForPropertyChangeOnly[item])
                {
                    ItemMetaData removeFolder = item is FolderMetaData
                                                    ? (ItemMetaData) new DeleteFolderMetaData()
                                                    : new DeleteMetaData();
                    removeFolder.Name         = item.Name;
                    removeFolder.ItemRevision = _targetVersion;
                    folder.Items.Remove(item);
                    folder.Items.Add(removeFolder);
                }
                else if (item is MissingItemMetaData && ((MissingItemMetaData)item).Edit == true)
                {
                    ItemMetaData removeFolder = new DeleteMetaData();
                    removeFolder.Name         = item.Name;
                    removeFolder.ItemRevision = _targetVersion;
                    folder.Items.Remove(item);
                    folder.Items.Add(removeFolder);
                }
                else
                {
                    folder.Items.Remove(item);
                }
            }
            folder = (item as FolderMetaData) ?? folder;
            return(false);
        }
        private void ProcessAddedOrUpdatedItem(string remoteName, SourceItemChange change, bool propertyChange, bool edit)
        {
            bool alreadyInClientCurrentState = IsChangeAlreadyCurrentInClientState(ChangeType.Add,
                                                                                   remoteName,
                                                                                   change.Item.RemoteChangesetId,
                                                                                   clientExistingFiles,
                                                                                   clientMissingFiles);

            if (alreadyInClientCurrentState)
            {
                return;
            }

            if (string.Equals(remoteName, _checkoutRootPath, StringComparison.InvariantCultureIgnoreCase))
            {
                ItemMetaData item = sourceControlProvider.GetItems(_targetVersion, remoteName, Recursion.None);
                if (item != null)
                {
                    _root.Properties = item.Properties;
                }
            }
            else
            {
                FolderMetaData folder   = _root;
                string         itemName = _checkoutRootPath;
                string[]       nameParts;
                if (_checkoutRootPath != "")
                {
                    nameParts = remoteName.Substring(_checkoutRootPath.Length + 1).Split(new char[] { '/' }, StringSplitOptions.RemoveEmptyEntries);
                }
                else
                {
                    nameParts = remoteName.Split('/');
                }

                for (int i = 0; i < nameParts.Length; i++)
                {
                    bool lastNamePart = false;
                    if (i == nameParts.Length - 1)
                    {
                        lastNamePart = true;
                    }

                    if (itemName != "" && !itemName.EndsWith("/"))
                    {
                        itemName += "/" + nameParts[i];
                    }
                    else
                    {
                        itemName += nameParts[i];
                    }

                    ItemMetaData item = folder.FindItem(itemName);
                    if (item == null ||
                        (
                            lastNamePart &&
                            item.Revision < change.Item.RemoteChangesetId &&
                            !(item is DeleteFolderMetaData) &&
                            !(item is DeleteMetaData)
                        )
                        )
                    {
                        if (item != null)
                        {
                            folder.Items.Remove(item);
                        }
                        item = sourceControlProvider.GetItems(_targetVersion, itemName, Recursion.None);
                        if (item == null)
                        {
                            // TFS will report renames even for deleted items,
                            // since TFS reported that this was renamed, but it doesn't exists
                            // in this revision, we know it is a case of renaming a deleted file.
                            // We can safely ignore this and any of its children.
                            if (IsRenameOperation(change))
                            {
                                return;
                            }
                            if (lastNamePart && propertyChange)
                            {
                                return;
                            }
                            item = new MissingItemMetaData(itemName, _targetVersion, edit);
                        }
                        if (!lastNamePart)
                        {
                            StubFolderMetaData stubFolder = new StubFolderMetaData();
                            stubFolder.RealFolder       = (FolderMetaData)item;
                            stubFolder.Name             = item.Name;
                            stubFolder.ItemRevision     = item.ItemRevision;
                            stubFolder.PropertyRevision = item.PropertyRevision;
                            stubFolder.LastModifiedDate = item.LastModifiedDate;
                            stubFolder.Author           = item.Author;
                            item = stubFolder;
                        }
                        folder.Items.Add(item);
                        SetAdditionForPropertyChangeOnly(item, propertyChange);
                    }
                    else if ((item is StubFolderMetaData) && lastNamePart)
                    {
                        folder.Items.Remove(item);
                        folder.Items.Add(((StubFolderMetaData)item).RealFolder);
                    }
                    else if (((item is DeleteFolderMetaData) || (item is DeleteMetaData)) && IsAddOperation(change))
                    {
                        if (!propertyChange)
                        {
                            folder.Items.Remove(item);
                            item = sourceControlProvider.GetItems(change.Item.RemoteChangesetId, itemName, Recursion.None);
                            item.OriginallyDeleted = true;
                            folder.Items.Add(item);
                        }
                    }
                    if (lastNamePart == false)
                    {
                        folder = (FolderMetaData)item;
                    }
                }
            }
        }