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; } } }
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); }
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; } } } }