void TestIDGeneration() { // Create a Blob: Blob bl = new Blob.Builder( pContents: Encoding.UTF8.GetBytes("Sample README content.") ); Console.WriteLine(bl.ID.ToString()); // Create a Tree: Tree tr = new Tree.Builder( new List <TreeTreeReference>(0), new List <TreeBlobReference> { new TreeBlobReference.Builder("README", bl.ID) } ); Console.WriteLine(tr.ID.ToString()); // Create a Commit: Commit cm = new Commit.Builder( pParents: new List <CommitID>(0), pTreeID: tr.ID, pCommitter: "James Dunne <*****@*****.**>", pDateCommitted: DateTimeOffset.Now, pMessage: "A commit message here." ); Console.WriteLine(cm.ID.ToString()); }
void TestTreeIDEquivalencies() { byte[] tidBuf = new byte[TreeID.ByteArrayLength]; byte[] bidBuf = new byte[BlobID.ByteArrayLength]; // Obviously never generate random fake SHA-1s. This is purely for testing. var rnd = new Random(1011); rnd.NextBytes(tidBuf); rnd.NextBytes(bidBuf); // Create several variants of the same Tree: Tree tr0 = new Tree.Builder( new List <TreeTreeReference> { new TreeTreeReference.Builder("src", new TreeID(tidBuf)), new TreeTreeReference.Builder("Content", new TreeID(tidBuf)), new TreeTreeReference.Builder("Images", new TreeID(tidBuf)), }, new List <TreeBlobReference> { new TreeBlobReference.Builder("main", new BlobID(bidBuf)), new TreeBlobReference.Builder("README", new BlobID(bidBuf)), } ); Console.WriteLine(tr0.ID.ToString()); Tree tr1 = new Tree.Builder( new List <TreeTreeReference> { new TreeTreeReference.Builder("Content", new TreeID(tidBuf)), new TreeTreeReference.Builder("src", new TreeID(tidBuf)), new TreeTreeReference.Builder("Images", new TreeID(tidBuf)), }, new List <TreeBlobReference> { new TreeBlobReference.Builder("README", new BlobID(bidBuf)), new TreeBlobReference.Builder("main", new BlobID(bidBuf)), } ); Console.WriteLine(tr1.ID.ToString()); Tree tr2 = new Tree.Builder( new List <TreeTreeReference> { new TreeTreeReference.Builder("Content", new TreeID(tidBuf)), new TreeTreeReference.Builder("Images", new TreeID(tidBuf)), new TreeTreeReference.Builder("src", new TreeID(tidBuf)), }, new List <TreeBlobReference> { new TreeBlobReference.Builder("README", new BlobID(bidBuf)), new TreeBlobReference.Builder("main", new BlobID(bidBuf)), } ); Console.WriteLine(tr2.ID.ToString()); // Create a different tree: Tree tr3 = new Tree.Builder( new List <TreeTreeReference> { new TreeTreeReference.Builder("src", new TreeID(tidBuf)), new TreeTreeReference.Builder("Images", new TreeID(tidBuf)), new TreeTreeReference.Builder("Content", new TreeID(tidBuf)), }, new List <TreeBlobReference> { // Capitalization of name makes a difference: new TreeBlobReference.Builder("Readme", new BlobID(bidBuf)), new TreeBlobReference.Builder("main", new BlobID(bidBuf)), } ); Console.WriteLine(tr3.ID.ToString()); }
async Task DemonstrateHashing() { var db = getDataContext(); IBlobRepository blrepo = new BlobRepository(db); ITreeRepository trrepo = new TreeRepository(db); ICommitRepository cmrepo = new CommitRepository(db); IRefRepository rfrepo = new RefRepository(db); // Create a sample set of blobs: Blob readmeBlob; ImmutableContainer <BlobID, Blob> blobs = new ImmutableContainer <BlobID, Blob>( bl => bl.ID, readmeBlob = new Blob.Builder(pContents: Encoding.UTF8.GetBytes(@"Hello world")) ); Console.Out.WriteAsync(String.Format("Blob {0} = \"{1}\"" + Environment.NewLine, readmeBlob.ID.ToString(firstLength: 7), Encoding.UTF8.GetString(readmeBlob.Contents))); // Persist them: var persistingBlobs = blrepo.PersistBlobs(blobs); // Create an initial tree: Tree trRoot; ImmutableContainer <TreeID, Tree> trees = new ImmutableContainer <TreeID, Tree>( tr => tr.ID, new Tree[] { trRoot = new Tree.Builder( pTrees: new List <TreeTreeReference>(0), pBlobs: new List <TreeBlobReference> { new TreeBlobReference.Builder(pName: "README", pBlobID: readmeBlob.ID) } ) } ); // Dump the tree: RecursivePrint(trRoot.ID, trees); // Now wait for the blob persistence to complete: await persistingBlobs; // Persist our tree now: var persistTrees = trrepo.PersistTree(trRoot.ID, trees); await persistTrees; // Let's make a commit out of all that: Commit cm1 = new Commit.Builder( pParents: new List <CommitID>(0), pTreeID: trRoot.ID, pCommitter: @"James Dunne <*****@*****.**>", pDateCommitted: DateTimeOffset.Now, pMessage: "Initial commit." ); // Persist that commit: Console.Out.WriteAsync(String.Format("Persisting commit {0}..." + Environment.NewLine, cm1.ID.ToString(firstLength: 7))); await cmrepo.PersistCommit(cm1); // Let's create a ref to point to it: await rfrepo.DestroyRefByName("demo/HEAD"); await rfrepo.PersistRef(new Ref.Builder(pName: "demo/HEAD", pCommitID: cm1.ID)); await Console.Out.WriteAsync(String.Format("Pointed demo/HEAD to commit {0}" + Environment.NewLine, cm1.ID.ToString(firstLength: 7))); // Now let's create a new blob with some revised contents: (adding a period at the end) Blob readmeBlob2; blobs = new ImmutableContainer <BlobID, Blob>( bl => bl.ID, readmeBlob2 = new Blob.Builder(Encoding.UTF8.GetBytes(@"Hello world.")) ); var persistBlobs2 = blrepo.PersistBlobs(blobs); // Make a new tree out of the old tree: Tree.Builder trRoot2b = new Tree.Builder(trRoot); // Point README to the new BlobID: trRoot2b.Blobs[0] = new TreeBlobReference.Builder(trRoot2b.Blobs[0]) { BlobID = readmeBlob2.ID }; // Freeze our Tree.Builder to a Tree: Tree trRoot2; trees = new ImmutableContainer <TreeID, Tree>(tr => tr.ID, trRoot2 = trRoot2b); // Wait for the blobs to persist: await persistBlobs2; // Now persist the new tree: await trrepo.PersistTree(trRoot2.ID, trees); // Load a streamed blob: IStreamedBlob strbl = await blrepo.GetStreamedBlob(readmeBlob.ID); await strbl.ReadStream(blsr => { Console.WriteLine("blob is {0} length", blsr.Length); byte[] dum = new byte[8040]; int count = 8040; try { while ((count = blsr.Read(dum, 0, 8040)) > 0) { for (int i = 0; i < (count / 40) + ((count % 40) > 0 ? 1 : 0); ++i) { Console.WriteLine(dum.ToHexString(i * 40, Math.Min(count - (i * 40), 40))); } } } catch (Exception ex) { Console.Error.WriteLine(ex.ToString()); } }); }
async Task <TreeID> TestPersistTree() { // Create a Blob: Blob bl = new Blob.Builder(Encoding.UTF8.GetBytes("Sample README content.")); ImmutableContainer <BlobID, Blob> blobs = new ImmutableContainer <BlobID, Blob>(b => b.ID, bl); // Create a Tree: Tree trPersists = new Tree.Builder( new List <TreeTreeReference>(0), new List <TreeBlobReference> { new TreeBlobReference.Builder("HelloWorld.cs", bl.ID), new TreeBlobReference.Builder("PersistBlob.cs", bl.ID), new TreeBlobReference.Builder("PersistTree.cs", bl.ID), } ); Tree trSrc = new Tree.Builder( new List <TreeTreeReference> { new TreeTreeReference.Builder("Persists", trPersists.ID), }, new List <TreeBlobReference> { new TreeBlobReference.Builder("blah", bl.ID), } ); Tree trData = new Tree.Builder( new List <TreeTreeReference>(0), new List <TreeBlobReference> { new TreeBlobReference.Builder("myTest.xml", bl.ID), new TreeBlobReference.Builder("myTest2.xml", bl.ID), new TreeBlobReference.Builder("myTest3.xml", bl.ID), } ); Tree trRoot = new Tree.Builder( new List <TreeTreeReference> { new TreeTreeReference.Builder("src", trSrc.ID), new TreeTreeReference.Builder("data", trData.ID), }, new List <TreeBlobReference> { new TreeBlobReference.Builder("README", bl.ID), new TreeBlobReference.Builder("main.xml", bl.ID), new TreeBlobReference.Builder("test.xml", bl.ID), } ); ImmutableContainer <TreeID, Tree> trees = new ImmutableContainer <TreeID, Tree>(tr => tr.ID, trRoot, trSrc, trData, trPersists); var db = getDataContext(); IBlobRepository blrepo = new BlobRepository(db); ITreeRepository trrepo = new TreeRepository(db); // Persist the tree and its blobs: await blrepo.PersistBlobs(blobs); var ptr = await trrepo.PersistTree(trRoot.ID, trees); // Make sure we got back what's expected of the API: Debug.Assert(trRoot.ID == ptr.ID); Console.WriteLine("Root TreeID = {0}", trRoot.ID); return(trRoot.ID); }