示例#1
0
        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());
        }
示例#2
0
        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());
        }
示例#3
0
        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());
                }
            });
        }
示例#4
0
        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);
        }