private static void ValidateExistingChangeForEdit(ItemChange existingChange) { if ((existingChange.ChangeType & ItemChangeType.Delete) != 0) { throw new ApplicationException("Cannot edit a deleted item"); } }
public void DownloadCommitWithAddedBinaryItem() { var push = CreatePushRequest("b6f447775f71a092854a2555eea084bd6d19958e"); var fakeDownloadRequest = new Fakes.StubIDownloadRequest() { DownloadChangesInCommitAsyncStringGuidCancellationToken = (commitId, repositoryId, token) => { var changes = new ItemChange[] { new ItemChange(ItemChangeType.Add, new Item("/favicon.ico")) }; return Task.FromResult(changes.AsEnumerable()); }, DownloadItemAndContentInCommitAsyncItemChangeStringGuidCancellationToken = (itemChange, commitId, repositoryId, token) => { itemChange.Item.ContentMetadata = CreateBinaryContentMetadataTestData(); itemChange.NewContent = CreateBinaryContentTestData(); return Task.FromResult(0); } }; var repo = new SourceRepository(fakeDownloadRequest); repo.DownloadChangesAsync(push, "/", CancellationToken.None).Wait(); var change = push.Commits.Single().Changes.Single(); Assert.AreEqual(ItemChangeType.Add, change.ChangeType); Assert.AreEqual("/favicon.ico", change.Item.Path); Assert.IsTrue(change.Item.ContentMetadata.IsBinary); Assert.AreEqual("image/x-icon", change.Item.ContentMetadata.ContentType); Assert.IsNotNull(change.NewContent); Assert.AreEqual(ItemContentType.Base64Encoded, change.NewContent.ContentType); Assert.AreEqual(12, change.NewContent.Content.Length); }
public void PushItemChange() { var item = new Item("/test/test.txt") { ContentMetadata = new FileContentMetadata("text/plain", Encoding.UTF8) }; var itemChange = new ItemChange(ItemChangeType.Add, item) { NewContent = new ItemContent(ItemContentType.RawText, "Testing") }; var itemChanges = new ItemChange[] { itemChange }; IEnumerable<ItemChange> itemChangesAdded = null; bool saveChangesCalled = false; var fakeContext = new Fakes.StubIDestinationContext() { AddItemChangesIEnumerableOfItemChange = (changes) => { itemChangesAdded = changes; }, SaveChangesAsyncCancellationToken = (token) => { saveChangesCalled = true; return Task.FromResult(0); } }; var repo = new DestinationRepository(fakeContext); repo.PushItemChangesAsync(itemChanges, "/").Wait(); Assert.IsNotNull(itemChangesAdded); Assert.AreEqual("test/test.txt", itemChangesAdded.Single().Item.Path); Assert.AreSame(itemChange.Item.ContentMetadata, itemChangesAdded.Single().Item.ContentMetadata); Assert.AreSame(itemChange.NewContent, itemChangesAdded.Single().NewContent); Assert.IsTrue(saveChangesCalled); }
private static void ValidateExistingChangeForAdd(ItemChange existingItem) { if ((existingItem.ChangeType & ItemChangeType.Delete) == 0) { throw new ApplicationException("Cannot add item on an existing item"); } }
private static ItemChange EditExistingChange(ItemChange newChange, ItemChange existingChange) { ValidateExistingChangeForEdit(existingChange); var editedExistingItem = new ItemChange(existingChange.ChangeType, newChange.Item) { NewContent = newChange.NewContent }; return editedExistingItem; }
private void AddChange(ItemChange change) { if (_items.ContainsKey(change.Item.Path)) { ValidateExistingChangeForAdd(_items[change.Item.Path]); _items[change.Item.Path] = change; } else { _items.Add(change.Item.Path, change); } }
public void GetBinaryItemAndBlob() { var repo = CreateDownloadRequest(); var change = new ItemChange(ItemChangeType.Add, new Item("/favicon.ico")); repo.DownloadItemAndContentInCommitAsync( change, "b6f447775f71a092854a2555eea084bd6d19958e", Guid.Parse("0ad49569-db8b-4a8a-b5cc-f7ff009949c8"), CancellationToken.None ).Wait(); Assert.IsNotNull(change.Item.ContentMetadata); Assert.AreEqual("image/x-icon", change.Item.ContentMetadata.ContentType); Assert.IsTrue(change.Item.ContentMetadata.IsBinary); Assert.IsNotNull(change.NewContent); Assert.AreEqual(ItemContentType.Base64Encoded, change.NewContent.ContentType); Assert.AreEqual(1536, change.NewContent.Content.Length); }
public async Task DownloadItemAndContentInCommitAsync(ItemChange change, string commitId, Guid repositoryId, CancellationToken token) { CreateHttpClient(); var item = await _httpClient.GetItemAsync( repositoryId, change.Item.Path, includeContentMetadata: true, versionDescriptor: new Microsoft.TeamFoundation.SourceControl.WebApi.GitVersionDescriptor() { VersionType = Microsoft.TeamFoundation.SourceControl.WebApi.GitVersionType.Commit, Version = commitId }, cancellationToken: token ); change.Item.ContentMetadata = item.ContentMetadata.ToSync(); if (!item.IsFolder) { var content = await _httpClient.GetBlobContentAsync(repositoryId, item.ObjectId, cancellationToken: token); await change.SetNewContentAsync(content, token); } }
private static bool IsItemAdded(ItemChange existingChange) { return (existingChange.ChangeType & (ItemChangeType.Add | ItemChangeType.Rename)) != 0; }
public void DownloadNoChangesInRoot() { var push = CreatePushRequest("1b1859c414e800d24036b9ee547d1530431ae055"); var fakeDownloadRequest = new Fakes.StubIDownloadRequest() { DownloadChangesInCommitAsyncStringGuidCancellationToken = (commit, repositoryId, token) => { var changes = new ItemChange[] { new ItemChange(ItemChangeType.Edit, new Item("/index.html")), new ItemChange(ItemChangeType.Add, new Item("/index2.html")) }; return Task.FromResult(changes.AsEnumerable()); } }; var repo = new SourceRepository(fakeDownloadRequest); repo.DownloadChangesAsync(push, "/fake/", CancellationToken.None).Wait(); Assert.AreEqual(0, push.Commits.Single().Changes.Count()); }
private void RenameChange(ItemChange change) { AddChange(change); }
public void DownloadCommitWithRenamedTextItem() { var push = CreatePushRequest("de3e7a550c40fe75085d11e81d5770bc5b0dd33c"); var fakeDownloadRequest = new Fakes.StubIDownloadRequest() { DownloadChangesInCommitAsyncStringGuidCancellationToken = (commitId, repositoryId, token) => { var changes = new ItemChange[] { new ItemChange(ItemChangeType.Rename, new Item("/index.html")), new ItemChange(ItemChangeType.Delete | ItemChangeType.SourceRename, new Item("/index2.html")) }; return Task.FromResult(changes.AsEnumerable()); }, DownloadItemAndContentInCommitAsyncItemChangeStringGuidCancellationToken = (itemChange, commitId, repositoryId, token) => { if (itemChange.Item.Path == "/index.html") { itemChange.Item.ContentMetadata = CreateTextContentMetadataTestData(); itemChange.NewContent = CreateTextContentTestData(); } return Task.FromResult(0); } }; var repo = new SourceRepository(fakeDownloadRequest); repo.DownloadChangesAsync(push, "/", CancellationToken.None).Wait(); var index2Item = push.Commits.Single().Changes.Single(c => c.Item.Path == "/index2.html"); Assert.AreEqual(ItemChangeType.Delete | ItemChangeType.SourceRename, index2Item.ChangeType); var indexItem = push.Commits.Single().Changes.Single(c => c.Item.Path == "/index.html"); Assert.AreEqual(ItemChangeType.Rename, indexItem.ChangeType); Assert.IsNotNull(indexItem.Item.ContentMetadata); Assert.IsFalse(indexItem.Item.ContentMetadata.IsBinary); Assert.AreEqual("text/html", indexItem.Item.ContentMetadata.ContentType); Assert.IsNotNull(indexItem.NewContent); Assert.AreEqual(ItemContentType.RawText, indexItem.NewContent.ContentType); Assert.AreEqual("Testing", indexItem.NewContent.Content); }
public void GetTextItemAndBlob() { var repo = CreateDownloadRequest(); var change = new ItemChange(ItemChangeType.Add, new Item("/index.html")); repo.DownloadItemAndContentInCommitAsync( change, "5597f65ce55386a771e4bf6fa190b5a26c0f5ce5", Guid.Parse("0ad49569-db8b-4a8a-b5cc-f7ff009949c8"), CancellationToken.None ).Wait(); Assert.IsNotNull(change.Item.ContentMetadata); Assert.AreEqual("text/html", change.Item.ContentMetadata.ContentType); Assert.AreEqual(65001, change.Item.ContentMetadata.Encoding.CodePage); Assert.IsFalse(change.Item.ContentMetadata.IsBinary); Assert.IsNotNull(change.NewContent); Assert.AreEqual(ItemContentType.RawText, change.NewContent.ContentType); Assert.AreEqual(119, change.NewContent.Content.Length); }
private void DeleteChange(ItemChange change) { if (_items.ContainsKey(change.Item.Path)) { if (IsItemAdded(_items[change.Item.Path])) { _items.Remove(change.Item.Path); } else { _items[change.Item.Path] = change; } } else { _items.Add(change.Item.Path, change); } }
public void DownloadCommitWithAddedTextItem() { var push = CreatePushRequest("5597f65ce55386a771e4bf6fa190b5a26c0f5ce5"); var fakeDownloadRequest = new Fakes.StubIDownloadRequest() { DownloadChangesInCommitAsyncStringGuidCancellationToken = (commitId, repositoryId, token) => { var changes = new ItemChange[] { new ItemChange(ItemChangeType.Add, new Item("/index.html")) }; return Task.FromResult(changes.AsEnumerable()); }, DownloadItemAndContentInCommitAsyncItemChangeStringGuidCancellationToken = (itemChange, commitId, repositoryId, token) => { itemChange.Item.ContentMetadata = CreateTextContentMetadataTestData(); itemChange.NewContent = CreateTextContentTestData(); return Task.FromResult(0); } }; var repo = new SourceRepository(fakeDownloadRequest); repo.DownloadChangesAsync(push, "/", CancellationToken.None).Wait(); var change = push.Commits.Single().Changes.Single(); Assert.AreEqual(ItemChangeType.Add, change.ChangeType); Assert.AreEqual("/index.html", change.Item.Path); Assert.IsNotNull(change.Item.ContentMetadata); Assert.IsFalse(change.Item.ContentMetadata.IsBinary); Assert.AreEqual("text/html", change.Item.ContentMetadata.ContentType); Assert.IsNotNull(change.NewContent); Assert.AreEqual(ItemContentType.RawText, change.NewContent.ContentType); Assert.AreEqual("Testing", change.NewContent.Content); }
private IItemCommand CreateUploadCommand(ItemChange itemChange) { return new UploadItemCommand(itemChange); }
private IItemCommand CreateDeleteCommand(ItemChange itemChange) { return new DeleteItemCommand(itemChange); }
public UploadItemCommand(ItemChange itemChange) { _itemChange = itemChange; }
public DeleteItemCommand(ItemChange itemChange) { _itemChange = itemChange; }
public void GetSubfolder() { var repo = CreateDownloadRequest(); var change = new ItemChange(ItemChangeType.Add, new Item("/subfolder")); repo.DownloadItemAndContentInCommitAsync( change, "1f8734c1b02957390f27e79638b2bd96374b00a2", Guid.Parse("0ad49569-db8b-4a8a-b5cc-f7ff009949c8"), CancellationToken.None ).Wait(); Assert.IsNotNull(change.Item.ContentMetadata); Assert.IsNull(change.NewContent); }
private void EditChange(ItemChange change) { if (_items.ContainsKey(change.Item.Path)) { _items[change.Item.Path] = EditExistingChange(change, _items[change.Item.Path]); } else { _items.Add(change.Item.Path, change); } }
public void GetTextItemAndBlobWhenCanceled() { var repo = CreateDownloadRequest(); var change = new ItemChange(ItemChangeType.Add, new Item("/index.html")); var task = repo.DownloadItemAndContentInCommitAsync( change, "5597f65ce55386a771e4bf6fa190b5a26c0f5ce5", Guid.Parse("0ad49569-db8b-4a8a-b5cc-f7ff009949c8"), new CancellationToken(true)); try { task.Wait(); } catch (AggregateException e) { throw e.InnerException; } }
private void ProcessChange(ItemChange change) { Debug.WriteLine("{0} {1}", change.ChangeType.ToString(), change.Item.Path); if ((change.ChangeType & ItemChangeType.Add) != 0) { AddChange(change); } else if ((change.ChangeType & ItemChangeType.Delete) != 0) { DeleteChange(change); } else if ((change.ChangeType & ItemChangeType.Edit) != 0) { EditChange(change); } else if ((change.ChangeType & ItemChangeType.Rename) != 0) { RenameChange(change); } else { // Ignore all other types } }
private static bool ChangeTypeHasContent(ItemChange change) { return (change.ChangeType & (ItemChangeType.Edit | ItemChangeType.Add | ItemChangeType.Rename)) != 0; }
public void DownloadCommitWithChanges() { var commitIdRequest = "1b1859c414e800d24036b9ee547d1530431ae055"; var pushRequest = CreatePushRequest(commitIdRequest); var fakeChanges = new ItemChange[] { new ItemChange(ItemChangeType.None, new Item("/index.html")) }; var fakeDownloadRequest = new Fakes.StubIDownloadRequest() { DownloadChangesInCommitAsyncStringGuidCancellationToken = (commitId, repositoryId, token) => { Assert.AreEqual(commitIdRequest, commitId); return Task.FromResult(fakeChanges.AsEnumerable()); } }; var repo = new SourceRepository(fakeDownloadRequest); repo.DownloadChangesAsync(pushRequest, "/", CancellationToken.None).Wait(); Assert.IsTrue(fakeChanges.SequenceEqual(pushRequest.Commits.Single().Changes)); }