From 23bb3576abaf03847ffff1fad97e5d4c1de5663c Mon Sep 17 00:00:00 2001 From: nulltoken Date: Sat, 14 May 2011 19:09:59 +0200 Subject: [PATCH 01/36] Update libgit2 binaries to f02f4b5 Fix implementation to cope with improved reference resolving. --- Lib/git2.dll | Bin 137728 -> 149504 bytes LibGit2Sharp/Reference.cs | 12 +++++++++++- libgit2 | 2 +- 3 files changed, 12 insertions(+), 2 deletions(-) diff --git a/Lib/git2.dll b/Lib/git2.dll index 969786a29610cf2d9c1c55d220f48665bcf30b34..3b2f252ea0937f4964be959df5a939f34905448e 100644 GIT binary patch delta 46266 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 delta 38035 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 z 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 diff --git a/LibGit2Sharp/Reference.cs b/LibGit2Sharp/Reference.cs index d37cb9444..ec71e7e7a 100644 --- a/LibGit2Sharp/Reference.cs +++ b/LibGit2Sharp/Reference.cs @@ -18,6 +18,7 @@ public abstract class Reference : IEquatable /// public string CanonicalName { get; protected set; } + //TODO: Cries for refactoring. internal static T BuildFromPtr(IntPtr ptr, Repository repo) where T : class { if (ptr == IntPtr.Zero) @@ -35,7 +36,16 @@ internal static T BuildFromPtr(IntPtr ptr, Repository repo) where T : class case GitReferenceType.Symbolic: IntPtr resolveRef; var targetName = NativeMethods.git_reference_target(ptr); - NativeMethods.git_reference_resolve(out resolveRef, ptr); + int res = NativeMethods.git_reference_resolve(out resolveRef, ptr); + + if (res == (int) GitErrorCode.GIT_ENOTFOUND) + { + reference = new SymbolicReference { CanonicalName = name, Target = null, TargetIdentifier = targetName }; + break; + } + + Ensure.Success(res); + var targetRef = BuildFromPtr(resolveRef, repo); reference = new SymbolicReference { CanonicalName = name, Target = targetRef, TargetIdentifier = targetName}; break; diff --git a/libgit2 b/libgit2 index 2571cc3cf..f02f4b536 160000 --- a/libgit2 +++ b/libgit2 @@ -1 +1 @@ -Subproject commit 2571cc3cff67fe958727496bb1d660e5810bd8e1 +Subproject commit f02f4b536cfb5170a8ddc6d0e3b47631defd55ef From a6abf7d883d4f4c4c79dc0aee61ed5778f57c2ed Mon Sep 17 00:00:00 2001 From: nulltoken Date: Sat, 14 May 2011 23:17:39 +0200 Subject: [PATCH 02/36] Improve error handling mechanism Removed SetLastError decorator from bound methods as libigit2 doesn't rely on this mechanism (and probably won't, as there's no POSIX equivalent) --- LibGit2Sharp/Core/Ensure.cs | 7 +- LibGit2Sharp/Core/GitErrorCode.cs | 20 ++++++ LibGit2Sharp/Core/NativeMethods.cs | 108 +++++++++++++++-------------- 3 files changed, 80 insertions(+), 55 deletions(-) diff --git a/LibGit2Sharp/Core/Ensure.cs b/LibGit2Sharp/Core/Ensure.cs index 88eb96908..4cbc60991 100644 --- a/LibGit2Sharp/Core/Ensure.cs +++ b/LibGit2Sharp/Core/Ensure.cs @@ -42,14 +42,15 @@ public static void ArgumentNotNullOrEmptyString(string argumentValue, string arg /// The result. public static void Success(int result) { - if (result == 0) + if (result == (int) GitErrorCode.GIT_SUCCESS) { return; } + string errorMessage = NativeMethods.git_lasterror(); + throw new ApplicationException( - String.Format(CultureInfo.InvariantCulture, "There was an error in libgit2, but error handling sucks right now, so I can't tell you what it was. Error code = {0} ({1})", Enum.GetName(typeof(GitErrorCode), result) -, result)); + String.Format(CultureInfo.InvariantCulture, "An error was raised by libgit2. Error code = {0} ({1}).{2}{3}", Enum.GetName(typeof(GitErrorCode), result), result, Environment.NewLine, errorMessage)); } /// diff --git a/LibGit2Sharp/Core/GitErrorCode.cs b/LibGit2Sharp/Core/GitErrorCode.cs index fe268e157..ef015a32b 100644 --- a/LibGit2Sharp/Core/GitErrorCode.cs +++ b/LibGit2Sharp/Core/GitErrorCode.cs @@ -129,5 +129,25 @@ internal enum GitErrorCode /// A reference with this name already exists /// GIT_EEXISTS = (GIT_ERROR - 23), + + /// + /// The given integer literal is too large to be parsed + /// + GIT_EOVERFLOW = (GIT_ERROR - 24), + + /// + /// The given literal is not a valid number + /// + GIT_ENOTNUM = (GIT_ERROR - 25), + + /// + /// Streaming error + /// + GIT_ESTREAM = (GIT_ERROR - 26), + + /// + /// invalid arguments to function + /// + GIT_EINVALIDARGS = (GIT_ERROR - 27), } } \ No newline at end of file diff --git a/LibGit2Sharp/Core/NativeMethods.cs b/LibGit2Sharp/Core/NativeMethods.cs index 61d8cd7bc..2d84aae47 100644 --- a/LibGit2Sharp/Core/NativeMethods.cs +++ b/LibGit2Sharp/Core/NativeMethods.cs @@ -7,26 +7,26 @@ internal class NativeMethods { private const string libgit2 = "git2.dll"; - [DllImport(libgit2, SetLastError = true)] + [DllImport(libgit2)] public static extern IntPtr git_blob_rawcontent(IntPtr blob); - [DllImport(libgit2, SetLastError = true)] + [DllImport(libgit2)] public static extern int git_blob_rawsize(IntPtr blob); - [DllImport(libgit2, SetLastError = true)] + [DllImport(libgit2)] public static extern IntPtr git_commit_author(IntPtr commit); - [DllImport(libgit2, SetLastError = true)] + [DllImport(libgit2)] public static extern IntPtr git_commit_committer(IntPtr commit); - [DllImport(libgit2, SetLastError = true)] + [DllImport(libgit2)] public static extern int git_commit_create_o(out GitOid oid, RepositorySafeHandle repo, string updateRef, IntPtr author, IntPtr committer, string message, IntPtr tree, int parentCount, IntPtr parents); - [DllImport(libgit2, SetLastError = true)] + [DllImport(libgit2)] [return: MarshalAs(UnmanagedType.AnsiBStr)] public static extern string git_commit_message(IntPtr commit); - [DllImport(libgit2, SetLastError = true)] + [DllImport(libgit2)] [return: MarshalAs(UnmanagedType.AnsiBStr)] public static extern string git_commit_message_short(IntPtr commit); @@ -36,70 +36,74 @@ internal class NativeMethods [DllImport(libgit2)] public static extern uint git_commit_parentcount(IntPtr commit); - [DllImport(libgit2, SetLastError = true)] + [DllImport(libgit2)] public static extern int git_commit_tree(out IntPtr tree, IntPtr commit); - [DllImport(libgit2, SetLastError = true)] + [DllImport(libgit2)] public static extern IntPtr git_commit_tree_oid(IntPtr commit); - [DllImport(libgit2, SetLastError = true)] + [DllImport(libgit2)] public static extern int git_index_add(IndexSafeHandle index, string path, int stage = 0); - [DllImport(libgit2, SetLastError = true)] + [DllImport(libgit2)] public static extern uint git_index_entrycount(IndexSafeHandle index); - [DllImport(libgit2, SetLastError = true)] + [DllImport(libgit2)] public static extern int git_index_find(IndexSafeHandle index, string path); - [DllImport(libgit2, SetLastError = true)] + [DllImport(libgit2)] public static extern void git_index_free(IntPtr index); - [DllImport(libgit2, SetLastError = true)] + [DllImport(libgit2)] public static extern IntPtr git_index_get(IndexSafeHandle index, int n); - [DllImport(libgit2, SetLastError = true)] + [DllImport(libgit2)] public static extern int git_index_open_inrepo(out IndexSafeHandle index, RepositorySafeHandle repo); + + [DllImport(libgit2)] + [return: MarshalAs(UnmanagedType.AnsiBStr)] + public static extern string git_lasterror(); - [DllImport(libgit2, SetLastError = true)] + [DllImport(libgit2)] public static extern void git_object_close(IntPtr obj); - [DllImport(libgit2, SetLastError = true)] + [DllImport(libgit2)] public static extern IntPtr git_object_id(IntPtr obj); - [DllImport(libgit2, SetLastError = true)] + [DllImport(libgit2)] public static extern int git_object_lookup(out IntPtr obj, RepositorySafeHandle repo, ref GitOid id, GitObjectType type); - [DllImport(libgit2, SetLastError = true)] + [DllImport(libgit2)] public static extern GitObjectType git_object_type(IntPtr obj); - [DllImport(libgit2, SetLastError = true)] + [DllImport(libgit2)] public static extern bool git_odb_exists(IntPtr db, ref GitOid id); - [DllImport(libgit2, SetLastError = true)] + [DllImport(libgit2)] public static extern void git_odb_object_close(IntPtr obj); - [DllImport(libgit2, SetLastError = true)] + [DllImport(libgit2)] public static extern int git_oid_cmp(ref GitOid a, ref GitOid b); - [DllImport(libgit2, SetLastError = true)] + [DllImport(libgit2)] public static extern void git_oid_fmt(byte[] str, ref GitOid oid); - [DllImport(libgit2, SetLastError = true)] + [DllImport(libgit2)] public static extern int git_oid_mkstr(out GitOid oid, string str); - [DllImport(libgit2, SetLastError = true)] + [DllImport(libgit2)] public static extern int git_reference_create_oid(out IntPtr reference, RepositorySafeHandle repo, string name, ref GitOid oid); - [DllImport(libgit2, SetLastError = true)] + [DllImport(libgit2)] public static extern int git_reference_create_oid_f(out IntPtr reference, RepositorySafeHandle repo, string name, ref GitOid oid); - [DllImport(libgit2, SetLastError = true)] + [DllImport(libgit2)] public static extern int git_reference_create_symbolic(out IntPtr reference, RepositorySafeHandle repo, string name, string target); - [DllImport(libgit2, SetLastError = true)] + [DllImport(libgit2)] public static extern int git_reference_create_symbolic_f(out IntPtr reference, RepositorySafeHandle repo, string name, string target); - [DllImport(libgit2, SetLastError = true)] + [DllImport(libgit2)] public static extern int git_reference_delete(IntPtr reference); [DllImport(libgit2)] @@ -121,10 +125,10 @@ internal class NativeMethods [DllImport(libgit2)] public static extern int git_reference_resolve(out IntPtr resolvedReference, IntPtr reference); - [DllImport(libgit2, SetLastError = true)] + [DllImport(libgit2)] public static extern int git_reference_set_oid(IntPtr reference, ref GitOid id); - [DllImport(libgit2, SetLastError = true)] + [DllImport(libgit2)] public static extern int git_reference_set_target(IntPtr reference, string target); [DllImport(libgit2)] @@ -134,19 +138,19 @@ internal class NativeMethods [DllImport(libgit2)] public static extern GitReferenceType git_reference_type(IntPtr reference); - [DllImport(libgit2, SetLastError = true)] + [DllImport(libgit2)] public static extern IntPtr git_repository_database(RepositorySafeHandle repository); - [DllImport(libgit2, SetLastError = true)] + [DllImport(libgit2)] public static extern void git_repository_free(IntPtr repository); - [DllImport(libgit2, SetLastError = true)] + [DllImport(libgit2)] public static extern int git_repository_init(out RepositorySafeHandle repository, string path, bool isBare); - [DllImport(libgit2, SetLastError = true)] + [DllImport(libgit2)] public static extern bool git_repository_is_empty(RepositorySafeHandle repo); - [DllImport(libgit2, SetLastError = true)] + [DllImport(libgit2)] public static extern int git_repository_open(out RepositorySafeHandle repository, string path); [DllImport(libgit2)] @@ -175,55 +179,55 @@ internal class NativeMethods [DllImport(libgit2)] public static extern void git_revwalk_sorting(IntPtr walk, GitSortOptions sort); - [DllImport(libgit2, SetLastError = true)] + [DllImport(libgit2)] public static extern void git_signature_free(IntPtr signature); - [DllImport(libgit2, SetLastError = true)] + [DllImport(libgit2)] public static extern IntPtr git_signature_new(string name, string email, long time, int offset); - [DllImport(libgit2, SetLastError = true)] + [DllImport(libgit2)] public static extern int git_tag_create(out GitOid oid, RepositorySafeHandle repo, string name, ref GitOid target, GitObjectType type, GitSignature signature, string message); - [DllImport(libgit2, SetLastError = true)] + [DllImport(libgit2)] public static extern int git_tag_create_f(out GitOid oid, RepositorySafeHandle repo, string name, ref GitOid target, GitObjectType type, GitSignature signature, string message); - [DllImport(libgit2, SetLastError = true)] + [DllImport(libgit2)] public static extern int git_tag_delete(RepositorySafeHandle repo, string tagName); - [DllImport(libgit2, SetLastError = true)] + [DllImport(libgit2)] [return: MarshalAs(UnmanagedType.AnsiBStr)] public static extern string git_tag_message(IntPtr tag); - [DllImport(libgit2, SetLastError = true)] + [DllImport(libgit2)] [return: MarshalAs(UnmanagedType.AnsiBStr)] public static extern string git_tag_name(IntPtr tag); - [DllImport(libgit2, SetLastError = true)] + [DllImport(libgit2)] public static extern IntPtr git_tag_tagger(IntPtr tag); - [DllImport(libgit2, SetLastError = true)] + [DllImport(libgit2)] public static extern IntPtr git_tag_target_oid(IntPtr tag); - [DllImport(libgit2, SetLastError = true)] + [DllImport(libgit2)] public static extern int git_tree_entry_2object(out IntPtr obj, RepositorySafeHandle repo, IntPtr entry); - [DllImport(libgit2, SetLastError = true)] + [DllImport(libgit2)] public static extern int git_tree_entry_attributes(IntPtr entry); - [DllImport(libgit2, SetLastError = true)] + [DllImport(libgit2)] public static extern IntPtr git_tree_entry_byindex(IntPtr tree, int idx); - [DllImport(libgit2, SetLastError = true)] + [DllImport(libgit2)] public static extern IntPtr git_tree_entry_byname(IntPtr tree, string filename); - [DllImport(libgit2, SetLastError = true)] + [DllImport(libgit2)] public static extern IntPtr git_tree_entry_id(IntPtr tree); - [DllImport(libgit2, SetLastError = true)] + [DllImport(libgit2)] [return: MarshalAs(UnmanagedType.AnsiBStr)] public static extern string git_tree_entry_name(IntPtr entry); - [DllImport(libgit2, SetLastError = true)] + [DllImport(libgit2)] public static extern int git_tree_entrycount(IntPtr tree); } } \ No newline at end of file From a375658e36a8b519facb53383de4628d49894f5d Mon Sep 17 00:00:00 2001 From: nulltoken Date: Sun, 15 May 2011 14:35:29 +0200 Subject: [PATCH 03/36] Reduce public API exposure --- LibGit2Sharp/Index.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/LibGit2Sharp/Index.cs b/LibGit2Sharp/Index.cs index a0d6a56eb..6e5c85ffb 100644 --- a/LibGit2Sharp/Index.cs +++ b/LibGit2Sharp/Index.cs @@ -11,7 +11,7 @@ public class Index : IEnumerable, IDisposable private readonly IndexSafeHandle handle; private readonly Repository repo; - public Index(Repository repo) + internal Index(Repository repo) { this.repo = repo; var res = NativeMethods.git_index_open_inrepo(out handle, repo.Handle); From 3db11df298f7cc1767fe177364eab6806e3233b8 Mon Sep 17 00:00:00 2001 From: nulltoken Date: Sun, 15 May 2011 14:37:33 +0200 Subject: [PATCH 04/36] Refactor SelfCleaningDirectory and TemporaryCloneOfTestRepo test helpers --- LibGit2Sharp.Tests/IndexFixture.cs | 8 +++----- LibGit2Sharp.Tests/RepositoryFixture.cs | 14 ++++++------- LibGit2Sharp.Tests/TagFixture.cs | 14 ++++++------- .../TestHelpers/SelfCleaningDirectory.cs | 20 +++++++++++-------- .../TestHelpers/TemporaryCloneOfTestRepo.cs | 13 +++--------- 5 files changed, 30 insertions(+), 39 deletions(-) diff --git a/LibGit2Sharp.Tests/IndexFixture.cs b/LibGit2Sharp.Tests/IndexFixture.cs index cec992763..ed8cfa480 100644 --- a/LibGit2Sharp.Tests/IndexFixture.cs +++ b/LibGit2Sharp.Tests/IndexFixture.cs @@ -139,16 +139,14 @@ public void CanStageANewFileWithAFullPath() [Test] public void StagingANewFileWithAFullPathWhichEscapesOutOfTheWorkingDirThrows() { - string tempPath = new DirectoryInfo("./temp").FullName; - - using (new SelfCleaningDirectory(tempPath)) + using (var scd = new SelfCleaningDirectory()) using (var path = new TemporaryCloneOfTestRepo(Constants.TestRepoWithWorkingDirPath)) using (var repo = new Repository(path.RepositoryPath)) { - Directory.CreateDirectory(tempPath); + var di = Directory.CreateDirectory(scd.DirectoryPath); const string filename = "unit_test.txt"; - string fullPath = Path.Combine(tempPath, filename); + string fullPath = Path.Combine(di.FullName, filename); File.WriteAllText(fullPath, "some contents"); Assert.Throws(() => repo.Index.Stage(fullPath)); diff --git a/LibGit2Sharp.Tests/RepositoryFixture.cs b/LibGit2Sharp.Tests/RepositoryFixture.cs index d88334736..497e370ca 100644 --- a/LibGit2Sharp.Tests/RepositoryFixture.cs +++ b/LibGit2Sharp.Tests/RepositoryFixture.cs @@ -8,17 +8,15 @@ namespace LibGit2Sharp.Tests [TestFixture] public class RepositoryFixture { - private const string newRepoPath = "new_repo"; - private const string commitSha = "8496071c1b46c854b31185ea97743be6a8774479"; private const string notFoundSha = "deadbeefdeadbeefdeadbeefdeadbeefdeadbeef"; [Test] public void CanCreateBareRepo() { - using (new SelfCleaningDirectory(newRepoPath)) + using (var scd = new SelfCleaningDirectory()) { - var dir = Repository.Init(newRepoPath, true); + var dir = Repository.Init(scd.DirectoryPath, true); Path.IsPathRooted(dir).ShouldBeTrue(); Directory.Exists(dir).ShouldBeTrue(); @@ -35,9 +33,9 @@ public void CanCreateBareRepo() [Test] public void CanCreateStandardRepo() { - using (new SelfCleaningDirectory(newRepoPath)) + using (var scd = new SelfCleaningDirectory()) { - var dir = Repository.Init(newRepoPath); + var dir = Repository.Init(scd.DirectoryPath); Path.IsPathRooted(dir).ShouldBeTrue(); Directory.Exists(dir).ShouldBeTrue(); @@ -238,9 +236,9 @@ public void CheckingForObjectExistenceWithBadParamsThrows() [Test] public void CheckForDetachedHeadOnNewRepo() { - using (new SelfCleaningDirectory(newRepoPath)) + using (var scd = new SelfCleaningDirectory()) { - var dir = Repository.Init(newRepoPath, true); + var dir = Repository.Init(scd.DirectoryPath, true); Path.IsPathRooted(dir).ShouldBeTrue(); Directory.Exists(dir).ShouldBeTrue(); diff --git a/LibGit2Sharp.Tests/TagFixture.cs b/LibGit2Sharp.Tests/TagFixture.cs index 4d121b901..d84258570 100644 --- a/LibGit2Sharp.Tests/TagFixture.cs +++ b/LibGit2Sharp.Tests/TagFixture.cs @@ -10,8 +10,6 @@ namespace LibGit2Sharp.Tests [TestFixture] public class TagFixture { - private const string newRepoPath = "new_repo"; - private readonly List expectedTags = new List {"test", "e90810b", "lw"}; private static readonly Signature signatureTim = new Signature("Tim Clem", "timothy.clem@gmail.com", DateTimeOffset.UtcNow); @@ -159,9 +157,9 @@ public void CreatingAnAnnotatedTagIsDeterministic() [Description("Ported from cgit (https://github.com/git/git/blob/1c08bf50cfcf924094eca56c2486a90e2bf1e6e2/t/t7004-tag.sh#L32)")] public void CreatingATagInAEmptyRepositoryThrows() { - using (new SelfCleaningDirectory(newRepoPath)) + using (var scd = new SelfCleaningDirectory()) { - var dir = Repository.Init(newRepoPath); + var dir = Repository.Init(scd.DirectoryPath); using (var repo = new Repository(dir)) { @@ -174,9 +172,9 @@ public void CreatingATagInAEmptyRepositoryThrows() [Description("Ported from cgit (https://github.com/git/git/blob/1c08bf50cfcf924094eca56c2486a90e2bf1e6e2/t/t7004-tag.sh#L37)")] public void CreatingATagForHeadInAEmptyRepositoryThrows() { - using (new SelfCleaningDirectory(newRepoPath)) + using (var scd = new SelfCleaningDirectory()) { - var dir = Repository.Init(newRepoPath); + var dir = Repository.Init(scd.DirectoryPath); using (var repo = new Repository(dir)) { @@ -520,9 +518,9 @@ public void CanListTags() [Description("Ported from cgit (https://github.com/git/git/blob/1c08bf50cfcf924094eca56c2486a90e2bf1e6e2/t/t7004-tag.sh#L24)")] public void CanListAllTagsInAEmptyRepository() { - using (new SelfCleaningDirectory(newRepoPath)) + using (var scd = new SelfCleaningDirectory()) { - var dir = Repository.Init(newRepoPath); + var dir = Repository.Init(scd.DirectoryPath); using (var repo = new Repository(dir)) { diff --git a/LibGit2Sharp.Tests/TestHelpers/SelfCleaningDirectory.cs b/LibGit2Sharp.Tests/TestHelpers/SelfCleaningDirectory.cs index 62f1cb1f0..26f7cf99a 100644 --- a/LibGit2Sharp.Tests/TestHelpers/SelfCleaningDirectory.cs +++ b/LibGit2Sharp.Tests/TestHelpers/SelfCleaningDirectory.cs @@ -5,7 +5,9 @@ namespace LibGit2Sharp.Tests.TestHelpers { public class SelfCleaningDirectory : IDisposable { - private readonly string path; + public SelfCleaningDirectory() : this(BuildTempPath()) + { + } public SelfCleaningDirectory(string path) { @@ -14,26 +16,28 @@ public SelfCleaningDirectory(string path) throw new InvalidOperationException("Directory '{0}' already exists."); } - this.path = path; + DirectoryPath = path; } - protected string DirectoryPath - { - get { return path; } - } + public string DirectoryPath { get; private set; } #region IDisposable Members public void Dispose() { - if (!Directory.Exists(path)) + if (!Directory.Exists(DirectoryPath)) { throw new InvalidOperationException("Directory '{0}' doesn't exist any longer."); } - DirectoryHelper.DeleteDirectory(path); + DirectoryHelper.DeleteDirectory(DirectoryPath); } #endregion + + protected static string BuildTempPath() + { + return Path.Combine(Constants.TemporaryReposPath, Guid.NewGuid().ToString().Substring(0, 8)); + } } } \ No newline at end of file diff --git a/LibGit2Sharp.Tests/TestHelpers/TemporaryCloneOfTestRepo.cs b/LibGit2Sharp.Tests/TestHelpers/TemporaryCloneOfTestRepo.cs index 4b61460bd..9725b7e65 100644 --- a/LibGit2Sharp.Tests/TestHelpers/TemporaryCloneOfTestRepo.cs +++ b/LibGit2Sharp.Tests/TestHelpers/TemporaryCloneOfTestRepo.cs @@ -1,14 +1,12 @@ -using System; -using System.IO; +using System.IO; namespace LibGit2Sharp.Tests.TestHelpers { public class TemporaryCloneOfTestRepo : SelfCleaningDirectory { - public TemporaryCloneOfTestRepo(string path = Constants.TestRepoPath) - : base(BuildTempPath()) + public TemporaryCloneOfTestRepo(string sourceDirectoryPath = Constants.TestRepoPath) { - var source = new DirectoryInfo(path); + var source = new DirectoryInfo(sourceDirectoryPath); var tempRepository = new DirectoryInfo(Path.Combine(DirectoryPath, source.Name)); RepositoryPath = tempRepository.FullName; @@ -16,10 +14,5 @@ public TemporaryCloneOfTestRepo(string path = Constants.TestRepoPath) } public string RepositoryPath { get; private set; } - - private static string BuildTempPath() - { - return Path.Combine(Constants.TemporaryReposPath, Guid.NewGuid().ToString().Substring(0, 8)); - } } } \ No newline at end of file From ec2924874bd03868db870075eb91d1a3f2141b1b Mon Sep 17 00:00:00 2001 From: nulltoken Date: Sun, 15 May 2011 14:37:53 +0200 Subject: [PATCH 05/36] Update backlog --- backlog.md | 4 ---- 1 file changed, 4 deletions(-) diff --git a/backlog.md b/backlog.md index a0e159518..bf2a58466 100644 --- a/backlog.md +++ b/backlog.md @@ -2,18 +2,14 @@ ### LibGit2Sharp - - Add a Path property to SelfCleaningDirectory - - Set up a Assembly versioning strategy - Add branch renaming (public Branch Move(string oldName, string newName, bool allowOverwrite = false)) - Turn duplicated strings "refs/xxx" into properties of a generic Constants helper type - Refactor the error handling (OutputResult -> Exceptions) - Launch Code Analysis (Issues related to interop and marshaling will be worked on once we're able to succesffully exchange non ascii encoded data with libgit2) - - When properly exported use git_strerror() to feed raised exceptions with a meaningful message. - Remove usage of ApplicationException - https://bugzilla.novell.com/show_bug.cgi?id=566247 prevents MonoDevelop users from benefiting from optional parameters while still target at 3.5 - https://bugzilla.novell.com/show_bug.cgi?id=324680 generates false-positive warnings regarding xml documentation when LibGit2Sharp is built with xbuild - The freeing of a newly created signature pointer doesn't "feel" to be done at the right place. - - Should we throw when trying to delete a reference which can not be found? - Favor overloads over optional parameters (http://msdn.microsoft.com/en-us/library/ms182135.aspx) - Ensure that types that are not supposed to be built by the Consumer do not expose a constructor. - Escape as early as possible from a method. Fight against the arrowhead effect (cf. http://elegantcode.com/2009/08/14/observations-on-the-if-statement/) From 9202e915f5cc6a974de25fffc6bd3629567bbe99 Mon Sep 17 00:00:00 2001 From: nulltoken Date: Sun, 15 May 2011 21:39:10 +0200 Subject: [PATCH 06/36] Fix some issues pinpointed by Code Analysis --- LibGit2Sharp.Tests/CommitFixture.cs | 4 ++-- LibGit2Sharp/Core/NativeMethods.cs | 10 ++++++--- LibGit2Sharp/Core/UnSafeNativeMethods.cs | 2 ++ LibGit2Sharp/CustomDictionary.xml | 27 ++++++++++++++++++++++++ LibGit2Sharp/GitSortOptions.cs | 2 +- LibGit2Sharp/Index.cs | 5 +++-- LibGit2Sharp/LibGit2Sharp.csproj | 1 + LibGit2Sharp/TagCollection.cs | 10 ++++----- 8 files changed, 48 insertions(+), 13 deletions(-) create mode 100644 LibGit2Sharp/CustomDictionary.xml diff --git a/LibGit2Sharp.Tests/CommitFixture.cs b/LibGit2Sharp.Tests/CommitFixture.cs index c1cb68f9b..c37f2c30f 100644 --- a/LibGit2Sharp.Tests/CommitFixture.cs +++ b/LibGit2Sharp.Tests/CommitFixture.cs @@ -74,7 +74,7 @@ public void CanEnumerateCommitsWithReverseTopoSorting() { using (var repo = new Repository(Constants.TestRepoPath)) { - var commits = repo.Commits.StartingAt("a4a7dce85cf63874e984719f4fdd239f5145052f").SortBy(GitSortOptions.Topo | GitSortOptions.Reverse).ToList(); + var commits = repo.Commits.StartingAt("a4a7dce85cf63874e984719f4fdd239f5145052f").SortBy(GitSortOptions.Topological | GitSortOptions.Reverse).ToList(); foreach (var commit in commits) { commit.ShouldNotBeNull(); @@ -108,7 +108,7 @@ public void CanEnumerateCommitsWithTopoSorting() { using (var repo = new Repository(Constants.TestRepoPath)) { - var commits = repo.Commits.StartingAt("a4a7dce85cf63874e984719f4fdd239f5145052f").SortBy(GitSortOptions.Topo).ToList(); + var commits = repo.Commits.StartingAt("a4a7dce85cf63874e984719f4fdd239f5145052f").SortBy(GitSortOptions.Topological).ToList(); foreach (var commit in commits) { commit.ShouldNotBeNull(); diff --git a/LibGit2Sharp/Core/NativeMethods.cs b/LibGit2Sharp/Core/NativeMethods.cs index 2d84aae47..9c5f129e1 100644 --- a/LibGit2Sharp/Core/NativeMethods.cs +++ b/LibGit2Sharp/Core/NativeMethods.cs @@ -5,8 +5,10 @@ namespace LibGit2Sharp.Core { internal class NativeMethods { - private const string libgit2 = "git2.dll"; - + const string libgit2 = "git2.dll"; + + private NativeMethods() { } + [DllImport(libgit2)] public static extern IntPtr git_blob_rawcontent(IntPtr blob); @@ -77,6 +79,7 @@ internal class NativeMethods public static extern GitObjectType git_object_type(IntPtr obj); [DllImport(libgit2)] + [return: MarshalAs(UnmanagedType.Bool)] public static extern bool git_odb_exists(IntPtr db, ref GitOid id); [DllImport(libgit2)] @@ -145,9 +148,10 @@ internal class NativeMethods public static extern void git_repository_free(IntPtr repository); [DllImport(libgit2)] - public static extern int git_repository_init(out RepositorySafeHandle repository, string path, bool isBare); + public static extern int git_repository_init(out RepositorySafeHandle repository, string path, [MarshalAs(UnmanagedType.Bool)] bool isBare); [DllImport(libgit2)] + [return: MarshalAs(UnmanagedType.Bool)] public static extern bool git_repository_is_empty(RepositorySafeHandle repo); [DllImport(libgit2)] diff --git a/LibGit2Sharp/Core/UnSafeNativeMethods.cs b/LibGit2Sharp/Core/UnSafeNativeMethods.cs index 90fa10cc0..22c9ccf5a 100644 --- a/LibGit2Sharp/Core/UnSafeNativeMethods.cs +++ b/LibGit2Sharp/Core/UnSafeNativeMethods.cs @@ -7,6 +7,8 @@ internal unsafe class UnSafeNativeMethods { private const string libgit2 = "git2.dll"; + private UnSafeNativeMethods() { } + [DllImport(libgit2)] public static extern int git_reference_listall(git_strarray* array, RepositorySafeHandle repo, GitReferenceType flags); diff --git a/LibGit2Sharp/CustomDictionary.xml b/LibGit2Sharp/CustomDictionary.xml new file mode 100644 index 000000000..2def1ba88 --- /dev/null +++ b/LibGit2Sharp/CustomDictionary.xml @@ -0,0 +1,27 @@ + + + + + + + git + sha + unstage + unstaged + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/LibGit2Sharp/GitSortOptions.cs b/LibGit2Sharp/GitSortOptions.cs index e6e0d2ce4..3bf38841b 100644 --- a/LibGit2Sharp/GitSortOptions.cs +++ b/LibGit2Sharp/GitSortOptions.cs @@ -6,7 +6,7 @@ namespace LibGit2Sharp public enum GitSortOptions { None = 0, - Topo = (1 << 0), + Topological = (1 << 0), Time = (1 << 1), Reverse = (1 << 2) } diff --git a/LibGit2Sharp/Index.cs b/LibGit2Sharp/Index.cs index 6e5c85ffb..bf84882e1 100644 --- a/LibGit2Sharp/Index.cs +++ b/LibGit2Sharp/Index.cs @@ -1,6 +1,7 @@ using System; using System.Collections; using System.Collections.Generic; +using System.Globalization; using System.IO; using LibGit2Sharp.Core; @@ -125,9 +126,9 @@ private string BuildRelativePathFrom(string path) //TODO: To be removed when l var normalizedPath = new DirectoryInfo(path).FullName; - if (!normalizedPath.StartsWith(repo.Info.WorkingDirectory)) + if (!normalizedPath.StartsWith(repo.Info.WorkingDirectory, StringComparison.Ordinal)) { - throw new ArgumentException(string.Format("Unable to stage file '{0}'. This file is not located under the working directory of the repository ('{1}').", normalizedPath, repo.Info.WorkingDirectory)); + throw new ArgumentException(string.Format(CultureInfo.InvariantCulture, "Unable to stage file '{0}'. This file is not located under the working directory of the repository ('{1}').", normalizedPath, repo.Info.WorkingDirectory)); } return normalizedPath.Substring(repo.Info.WorkingDirectory.Length); diff --git a/LibGit2Sharp/LibGit2Sharp.csproj b/LibGit2Sharp/LibGit2Sharp.csproj index 7ff8e63c8..099248edc 100644 --- a/LibGit2Sharp/LibGit2Sharp.csproj +++ b/LibGit2Sharp/LibGit2Sharp.csproj @@ -98,6 +98,7 @@ git2.dll PreserveNewest + diff --git a/LibGit2Sharp/TagCollection.cs b/LibGit2Sharp/TagCollection.cs index f8693b539..0baeec647 100644 --- a/LibGit2Sharp/TagCollection.cs +++ b/LibGit2Sharp/TagCollection.cs @@ -13,7 +13,7 @@ namespace LibGit2Sharp public class TagCollection : IEnumerable { private readonly Repository repo; - private static readonly string RefsTagsPrefix = "refs/tags/"; + private const string refsTagsPrefix = "refs/tags/"; /// /// Initializes a new instance of the class. @@ -142,24 +142,24 @@ private static string NormalizeToCanonicalName(string name) { Ensure.ArgumentNotNullOrEmptyString(name, "name"); - if (name.StartsWith(RefsTagsPrefix, StringComparison.Ordinal)) + if (name.StartsWith(refsTagsPrefix, StringComparison.Ordinal)) { return name; } - return string.Concat(RefsTagsPrefix, name); + return string.Concat(refsTagsPrefix, name); } private static string UnCanonicalizeName(string name) { Ensure.ArgumentNotNullOrEmptyString(name, "name"); - if (!name.StartsWith(RefsTagsPrefix, StringComparison.Ordinal)) + if (!name.StartsWith(refsTagsPrefix, StringComparison.Ordinal)) { return name; } - return name.Substring(RefsTagsPrefix.Length); + return name.Substring(refsTagsPrefix.Length); } } } \ No newline at end of file From 02f414c97bde3d9563fcb381816f58b6793a3ed0 Mon Sep 17 00:00:00 2001 From: nulltoken Date: Mon, 16 May 2011 21:35:37 +0200 Subject: [PATCH 07/36] Improve documentation and tests related to initialization and opening of a git repositories Credit goes to @yysun for having spotted these misleading areas --- LibGit2Sharp.Tests/RepositoryFixture.cs | 2 ++ .../TestHelpers/SelfCleaningDirectory.cs | 3 +++ LibGit2Sharp/Index.cs | 2 +- LibGit2Sharp/Repository.cs | 12 ++++-------- 4 files changed, 10 insertions(+), 9 deletions(-) diff --git a/LibGit2Sharp.Tests/RepositoryFixture.cs b/LibGit2Sharp.Tests/RepositoryFixture.cs index 497e370ca..f69f99465 100644 --- a/LibGit2Sharp.Tests/RepositoryFixture.cs +++ b/LibGit2Sharp.Tests/RepositoryFixture.cs @@ -23,6 +23,7 @@ public void CanCreateBareRepo() using (var repo = new Repository(dir)) { repo.Info.WorkingDirectory.ShouldBeNull(); + repo.Info.Path.ShouldEqual(scd.RootedDirectoryPath + @"\"); repo.Info.IsBare.ShouldBeTrue(); AssertInitializedRepository(repo); @@ -42,6 +43,7 @@ public void CanCreateStandardRepo() using (var repo = new Repository(dir)) { repo.Info.WorkingDirectory.ShouldNotBeNull(); + repo.Info.Path.ShouldEqual(Path.Combine(scd.RootedDirectoryPath, ".git" + @"\")); repo.Info.IsBare.ShouldBeFalse(); AssertInitializedRepository(repo); diff --git a/LibGit2Sharp.Tests/TestHelpers/SelfCleaningDirectory.cs b/LibGit2Sharp.Tests/TestHelpers/SelfCleaningDirectory.cs index 26f7cf99a..c6576923c 100644 --- a/LibGit2Sharp.Tests/TestHelpers/SelfCleaningDirectory.cs +++ b/LibGit2Sharp.Tests/TestHelpers/SelfCleaningDirectory.cs @@ -17,9 +17,12 @@ public SelfCleaningDirectory(string path) } DirectoryPath = path; + RootedDirectoryPath = Path.GetFullPath(path); } + public string DirectoryPath { get; private set; } + public string RootedDirectoryPath { get; private set; } #region IDisposable Members diff --git a/LibGit2Sharp/Index.cs b/LibGit2Sharp/Index.cs index bf84882e1..cf1c811b0 100644 --- a/LibGit2Sharp/Index.cs +++ b/LibGit2Sharp/Index.cs @@ -124,7 +124,7 @@ private string BuildRelativePathFrom(string path) //TODO: To be removed when l return path; } - var normalizedPath = new DirectoryInfo(path).FullName; + var normalizedPath = Path.GetFullPath(path); if (!normalizedPath.StartsWith(repo.Info.WorkingDirectory, StringComparison.Ordinal)) { diff --git a/LibGit2Sharp/Repository.cs b/LibGit2Sharp/Repository.cs index c5bcf3c96..d4f68fd21 100644 --- a/LibGit2Sharp/Repository.cs +++ b/LibGit2Sharp/Repository.cs @@ -17,11 +17,7 @@ public class Repository : IDisposable /// /// Initializes a new instance of the class. - /// - /// Exceptions: - /// ArgumentException - /// ArgumentNullException - /// TODO: ApplicationException is thrown for all git errors right now + /// For a standard repository, should point to the ".git" folder. For a bare repository, should directly point to the repository folder. /// /// The path to the git repository to open. public Repository(string path) @@ -155,10 +151,10 @@ public bool HasObject(string sha) } /// - /// Init a repo at the specified path + /// Init a repo at the specified . /// - /// The path. - /// + /// The path to the working folder when initializing a standard ".git" repository. Otherwise, when initializing a bare repository, the path to the expected location of this later. + /// true to initialize a bare repository. False otherwise, to initialize a standard ".git" repository. /// Path the git repository. public static string Init(string path, bool bare = false) { From b81a2d135faffd0f7a34664ddd630fa838d3cbb8 Mon Sep 17 00:00:00 2001 From: nulltoken Date: Tue, 17 May 2011 16:54:15 +0200 Subject: [PATCH 08/36] Add UnknownSha to test helper Constants --- LibGit2Sharp.Tests/Constants.cs | 1 + LibGit2Sharp.Tests/RepositoryFixture.cs | 7 +++---- LibGit2Sharp.Tests/TagFixture.cs | 5 ++--- 3 files changed, 6 insertions(+), 7 deletions(-) diff --git a/LibGit2Sharp.Tests/Constants.cs b/LibGit2Sharp.Tests/Constants.cs index c05e3e384..757b1a667 100644 --- a/LibGit2Sharp.Tests/Constants.cs +++ b/LibGit2Sharp.Tests/Constants.cs @@ -5,5 +5,6 @@ public static class Constants public const string TestRepoPath = "./Resources/testrepo.git"; public const string TestRepoWithWorkingDirPath = "./Resources/testrepo_wd/.git"; public const string TemporaryReposPath = "TestRepos"; + public const string UnknownSha = "deadbeefdeadbeefdeadbeefdeadbeefdeadbeef"; } } \ No newline at end of file diff --git a/LibGit2Sharp.Tests/RepositoryFixture.cs b/LibGit2Sharp.Tests/RepositoryFixture.cs index f69f99465..9a3c91dd3 100644 --- a/LibGit2Sharp.Tests/RepositoryFixture.cs +++ b/LibGit2Sharp.Tests/RepositoryFixture.cs @@ -9,7 +9,6 @@ namespace LibGit2Sharp.Tests public class RepositoryFixture { private const string commitSha = "8496071c1b46c854b31185ea97743be6a8774479"; - private const string notFoundSha = "deadbeefdeadbeefdeadbeefdeadbeefdeadbeef"; [Test] public void CanCreateBareRepo() @@ -137,8 +136,8 @@ public void LookupObjectByWrongShaReturnsNull() { using (var repo = new Repository(Constants.TestRepoPath)) { - repo.Lookup(notFoundSha).ShouldBeNull(); - repo.Lookup(notFoundSha).ShouldBeNull(); + repo.Lookup(Constants.UnknownSha).ShouldBeNull(); + repo.Lookup(Constants.UnknownSha).ShouldBeNull(); } } @@ -159,7 +158,7 @@ public void LookupObjectByUnknownReferenceNameReturnsNull() using (var repo = new Repository(Constants.TestRepoPath)) { repo.Lookup("refs/heads/chopped/off").ShouldBeNull(); - repo.Lookup(notFoundSha).ShouldBeNull(); + repo.Lookup(Constants.UnknownSha).ShouldBeNull(); } } diff --git a/LibGit2Sharp.Tests/TagFixture.cs b/LibGit2Sharp.Tests/TagFixture.cs index d84258570..4299556d5 100644 --- a/LibGit2Sharp.Tests/TagFixture.cs +++ b/LibGit2Sharp.Tests/TagFixture.cs @@ -17,7 +17,6 @@ public class TagFixture private const string tagTestSha = "b25fa35b38051e4ae45d4222e795f9df2e43f1d1"; private const string commitE90810BSha = "e90810b8df3e80c413d903f631643c716887138d"; private const string tagE90810BSha = "7b4384978d2493e851f9cca7858815fac9b10980"; - const string invalidTargetId = "deadbeef1b46c854b31185ea97743be6a8774479"; [Test] public void CanCreateALightWeightTagFromSha() @@ -201,7 +200,7 @@ public void CreatingATagForAnUnknowObjectIdShouldFail() using (var path = new TemporaryCloneOfTestRepo()) using (var repo = new Repository(path.RepositoryPath)) { - Assert.Throws(() => repo.ApplyTag("mytagnorev", invalidTargetId)); + Assert.Throws(() => repo.ApplyTag("mytagnorev", Constants.UnknownSha)); } } @@ -397,7 +396,7 @@ public void CreateTagWithNotExistingTargetThrows() { using (var repo = new Repository(Constants.TestRepoPath)) { - Assert.Throws(() => repo.Tags.Create("test_tag", invalidTargetId, signatureTim, "message")); + Assert.Throws(() => repo.Tags.Create("test_tag", Constants.UnknownSha, signatureTim, "message")); } } From 6cdd3014a17a292a26ba19f2b3536e4a1492387e Mon Sep 17 00:00:00 2001 From: nulltoken Date: Tue, 17 May 2011 17:03:54 +0200 Subject: [PATCH 09/36] Fix default CommitCollection sorting behavior According to git log man page, by default, the commits are ordered in reverse chronological order. --- LibGit2Sharp/CommitCollection.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/LibGit2Sharp/CommitCollection.cs b/LibGit2Sharp/CommitCollection.cs index 15c0fa0f7..24e07022e 100644 --- a/LibGit2Sharp/CommitCollection.cs +++ b/LibGit2Sharp/CommitCollection.cs @@ -12,7 +12,7 @@ public class CommitCollection : IEnumerable { private readonly Repository repo; private string pushedSha; - private GitSortOptions sortOptions = GitSortOptions.None; + private GitSortOptions sortOptions = GitSortOptions.Time; /// /// Initializes a new instance of the class. From 3e2535d2a34d4256426c33480a98172cc6380963 Mon Sep 17 00:00:00 2001 From: nulltoken Date: Tue, 17 May 2011 17:18:54 +0200 Subject: [PATCH 10/36] Update backlog --- backlog.md | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/backlog.md b/backlog.md index bf2a58466..8a82dfc8d 100644 --- a/backlog.md +++ b/backlog.md @@ -2,6 +2,14 @@ ### LibGit2Sharp + - Build a LibGit2Sharp.Sample NuGet package + - Publish source and PDBs at symbolsource.org (cf. http://blog.davidebbo.com/2011/04/easy-way-to-publish-nuget-packages-with.html and http://nuget.codeplex.com/discussions/257709) + - Bind git_revwalk_hide() as CommitCollection.Until() + - Throw when revwalker is being passed an unknown object + - Change CommitCollection.StartingAt(string sha) into CommitCollection.StartingAt(string referenceNameOrsha) + - Fix FluentInterface .StartingAt() and .Until() in order to prevent .StartIngAt().StartingAt(), .Until().Until() and .Until().StartingAt() + - Push StartingAt() overloads into extension methods + - Add to Epoch a DateTimeOffset extension method ToRelativeFormat() in order to show dates relative to the current time, e.g. "2 hours ago". (cf. https://github.com/git/git/blob/master/date.c#L89) - Add branch renaming (public Branch Move(string oldName, string newName, bool allowOverwrite = false)) - Turn duplicated strings "refs/xxx" into properties of a generic Constants helper type - Refactor the error handling (OutputResult -> Exceptions) @@ -14,6 +22,11 @@ - Ensure that types that are not supposed to be built by the Consumer do not expose a constructor. - Escape as early as possible from a method. Fight against the arrowhead effect (cf. http://elegantcode.com/2009/08/14/observations-on-the-if-statement/) +### Wiki + + - How to integrate LibGit2Sharp in an application? + - How do I do 'git xxx' with LibGit2Sharp? (cf. https://github.com/libgit2/libgit2sharp/wiki/What's-the-equivalent-to-'git-xxx'%3F) + ### Tests - Add tests ensuring the behavior of indexers when being passed unknown sha and refs From 2a529521cad768dedb88f358d5ad59d6ac03eeaa Mon Sep 17 00:00:00 2001 From: nulltoken Date: Wed, 18 May 2011 22:12:41 +0200 Subject: [PATCH 11/36] Add a corrupted branch to the test repository The branch "deadbeef" points to a object which doesn't exist in the repository. --- Resources/testrepo.git/refs/heads/deadbeef | 1 + 1 file changed, 1 insertion(+) create mode 100644 Resources/testrepo.git/refs/heads/deadbeef diff --git a/Resources/testrepo.git/refs/heads/deadbeef b/Resources/testrepo.git/refs/heads/deadbeef new file mode 100644 index 000000000..aa3a3b099 --- /dev/null +++ b/Resources/testrepo.git/refs/heads/deadbeef @@ -0,0 +1 @@ +deadbeefdeadbeefdeadbeefdeadbeefdeadbeef From 1047733668f011a3dc89f6e675e9d2ced40bf083 Mon Sep 17 00:00:00 2001 From: nulltoken Date: Wed, 18 May 2011 22:19:22 +0200 Subject: [PATCH 12/36] Fix creation of reference to prevent it from choking on corrupted ones --- LibGit2Sharp.Tests/BranchFixture.cs | 4 ++-- LibGit2Sharp.Tests/ReferenceFixture.cs | 5 +++-- LibGit2Sharp/Reference.cs | 14 ++++++++------ 3 files changed, 13 insertions(+), 10 deletions(-) diff --git a/LibGit2Sharp.Tests/BranchFixture.cs b/LibGit2Sharp.Tests/BranchFixture.cs index ea4daae66..45c5636a3 100644 --- a/LibGit2Sharp.Tests/BranchFixture.cs +++ b/LibGit2Sharp.Tests/BranchFixture.cs @@ -9,7 +9,7 @@ namespace LibGit2Sharp.Tests [TestFixture] public class BranchFixture { - private readonly List expectedBranches = new List {"packed-test", "packed", "br2", "master", "test"}; + private readonly List expectedBranches = new List {"packed-test", "packed", "br2", "master", "test", "deadbeef"}; [Test] public void CanCheckoutAnExistingBranch() @@ -76,7 +76,7 @@ public void CanListAllBranches() Assert.Contains(r.Name, expectedBranches); } - repo.Branches.Count().ShouldEqual(5); + repo.Branches.Count().ShouldEqual(6); } } diff --git a/LibGit2Sharp.Tests/ReferenceFixture.cs b/LibGit2Sharp.Tests/ReferenceFixture.cs index ab13754d0..62db480fc 100644 --- a/LibGit2Sharp.Tests/ReferenceFixture.cs +++ b/LibGit2Sharp.Tests/ReferenceFixture.cs @@ -9,7 +9,8 @@ namespace LibGit2Sharp.Tests [TestFixture] public class ReferenceFixture { - private readonly List expectedRefs = new List {"refs/heads/packed-test", "refs/heads/packed", "refs/heads/br2", "refs/heads/master", "refs/heads/test", "refs/tags/test", "refs/tags/e90810b", "refs/tags/lw"}; + private readonly List expectedRefs = new List { "refs/heads/packed-test", "refs/heads/packed", "refs/heads/br2", "refs/heads/master", "refs/heads/test", + "refs/heads/deadbeef", "refs/tags/test", "refs/tags/e90810b", "refs/tags/lw" }; [Test] public void CanCreateADirectReference() @@ -211,7 +212,7 @@ public void CanListAllReferences() Assert.Contains(r.CanonicalName, expectedRefs); } - repo.Refs.Count().ShouldEqual(8); + repo.Refs.Count().ShouldEqual(9); } } diff --git a/LibGit2Sharp/Reference.cs b/LibGit2Sharp/Reference.cs index ec71e7e7a..442f5367d 100644 --- a/LibGit2Sharp/Reference.cs +++ b/LibGit2Sharp/Reference.cs @@ -18,7 +18,7 @@ public abstract class Reference : IEquatable /// public string CanonicalName { get; protected set; } - //TODO: Cries for refactoring. + //TODO: Cries for refactoring... really! internal static T BuildFromPtr(IntPtr ptr, Repository repo) where T : class { if (ptr == IntPtr.Zero) @@ -30,33 +30,35 @@ internal static T BuildFromPtr(IntPtr ptr, Repository repo) where T : class var type = NativeMethods.git_reference_type(ptr); Reference reference; + string targetIdentifier; switch (type) { case GitReferenceType.Symbolic: IntPtr resolveRef; - var targetName = NativeMethods.git_reference_target(ptr); + targetIdentifier = NativeMethods.git_reference_target(ptr); int res = NativeMethods.git_reference_resolve(out resolveRef, ptr); if (res == (int) GitErrorCode.GIT_ENOTFOUND) { - reference = new SymbolicReference { CanonicalName = name, Target = null, TargetIdentifier = targetName }; + reference = new SymbolicReference { CanonicalName = name, Target = null, TargetIdentifier = targetIdentifier }; break; } Ensure.Success(res); var targetRef = BuildFromPtr(resolveRef, repo); - reference = new SymbolicReference { CanonicalName = name, Target = targetRef, TargetIdentifier = targetName}; + reference = new SymbolicReference { CanonicalName = name, Target = targetRef, TargetIdentifier = targetIdentifier}; break; case GitReferenceType.Oid: var oidPtr = NativeMethods.git_reference_oid(ptr); var oid = (GitOid)Marshal.PtrToStructure(oidPtr, typeof(GitOid)); var targetId = new ObjectId(oid); + targetIdentifier = targetId.Sha; var target = repo.Lookup(targetId); - reference = new DirectReference { CanonicalName = name, Target = target, TargetIdentifier = targetId.Sha}; + reference = new DirectReference { CanonicalName = name, Target = target, TargetIdentifier = targetIdentifier}; break; default: @@ -68,7 +70,7 @@ internal static T BuildFromPtr(IntPtr ptr, Repository repo) where T : class return reference as T; } - GitObject targetGitObject = repo.Lookup(reference.ResolveToDirectReference().Target.Id); + GitObject targetGitObject = repo.Lookup(targetIdentifier); if (Equals(typeof(T), typeof(Tag))) { From 5ea4866a1ffdf491bba09925366cc95a95bd2266 Mon Sep 17 00:00:00 2001 From: nulltoken Date: Thu, 19 May 2011 11:25:06 +0200 Subject: [PATCH 13/36] Add some documentation --- LibGit2Sharp/GitSortOptions.cs | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/LibGit2Sharp/GitSortOptions.cs b/LibGit2Sharp/GitSortOptions.cs index 3bf38841b..0330db99c 100644 --- a/LibGit2Sharp/GitSortOptions.cs +++ b/LibGit2Sharp/GitSortOptions.cs @@ -5,9 +5,32 @@ namespace LibGit2Sharp [Flags] public enum GitSortOptions { + /// + /// Sort the repository contents in no particular ordering; + /// this sorting is arbitrary, implementation-specific + /// and subject to change at any time. + /// None = 0, + + /// + /// Sort the repository contents in topological order + /// (parents before children); this sorting mode + /// can be combined with time sorting. + /// Topological = (1 << 0), + + /// + /// Sort the repository contents by commit time; + /// this sorting mode can be combined with + /// topological sorting. + /// Time = (1 << 1), + + /// + /// Iterate through the repository contents in reverse + /// order; this sorting mode can be combined with + /// any of the above. + /// Reverse = (1 << 2) } } \ No newline at end of file From 6b8b8a25d9b096d1a3e4fa3e58261a37d9a8bbbb Mon Sep 17 00:00:00 2001 From: nulltoken Date: Thu, 19 May 2011 11:53:48 +0200 Subject: [PATCH 14/36] Refactor SafeHandles --- LibGit2Sharp/Core/IndexSafeHandle.cs | 17 ++--------------- LibGit2Sharp/Core/RepositorySafeHandle.cs | 16 ++-------------- LibGit2Sharp/Core/SafeHandleBase.cs | 20 ++++++++++++++++++++ LibGit2Sharp/LibGit2Sharp.csproj | 1 + 4 files changed, 25 insertions(+), 29 deletions(-) create mode 100644 LibGit2Sharp/Core/SafeHandleBase.cs diff --git a/LibGit2Sharp/Core/IndexSafeHandle.cs b/LibGit2Sharp/Core/IndexSafeHandle.cs index 08a67e0e0..a8daa12a9 100644 --- a/LibGit2Sharp/Core/IndexSafeHandle.cs +++ b/LibGit2Sharp/Core/IndexSafeHandle.cs @@ -1,20 +1,7 @@ -using System; -using System.Runtime.InteropServices; - -namespace LibGit2Sharp.Core +namespace LibGit2Sharp.Core { - internal class IndexSafeHandle : SafeHandle + internal class IndexSafeHandle : SafeHandleBase { - public IndexSafeHandle() - : base(IntPtr.Zero, true) - { - } - - public override bool IsInvalid - { - get { return (handle == IntPtr.Zero); } - } - protected override bool ReleaseHandle() { NativeMethods.git_index_free(handle); diff --git a/LibGit2Sharp/Core/RepositorySafeHandle.cs b/LibGit2Sharp/Core/RepositorySafeHandle.cs index a251181b8..be4709b98 100644 --- a/LibGit2Sharp/Core/RepositorySafeHandle.cs +++ b/LibGit2Sharp/Core/RepositorySafeHandle.cs @@ -1,19 +1,7 @@ -using System; -using System.Runtime.InteropServices; - -namespace LibGit2Sharp.Core +namespace LibGit2Sharp.Core { - internal class RepositorySafeHandle : SafeHandle + internal class RepositorySafeHandle : SafeHandleBase { - public RepositorySafeHandle() : base(IntPtr.Zero, true) - { - } - - public override bool IsInvalid - { - get { return (handle == IntPtr.Zero); } - } - protected override bool ReleaseHandle() { NativeMethods.git_repository_free(handle); diff --git a/LibGit2Sharp/Core/SafeHandleBase.cs b/LibGit2Sharp/Core/SafeHandleBase.cs new file mode 100644 index 000000000..7ba4bc4fb --- /dev/null +++ b/LibGit2Sharp/Core/SafeHandleBase.cs @@ -0,0 +1,20 @@ +using System; +using System.Runtime.InteropServices; + +namespace LibGit2Sharp.Core +{ + internal abstract class SafeHandleBase : SafeHandle + { + protected SafeHandleBase() + : base(IntPtr.Zero, true) + { + } + + public override bool IsInvalid + { + get { return (handle == IntPtr.Zero); } + } + + protected abstract override bool ReleaseHandle(); + } +} \ No newline at end of file diff --git a/LibGit2Sharp/LibGit2Sharp.csproj b/LibGit2Sharp/LibGit2Sharp.csproj index 099248edc..d81fb4d76 100644 --- a/LibGit2Sharp/LibGit2Sharp.csproj +++ b/LibGit2Sharp/LibGit2Sharp.csproj @@ -62,6 +62,7 @@ Code + From 4e90db86beeeee4b4c8b1653e8a90685e9144b20 Mon Sep 17 00:00:00 2001 From: nulltoken Date: Thu, 19 May 2011 11:57:22 +0200 Subject: [PATCH 15/36] Add RevWalkerSafeHandle to ensure proper release of non managed resources --- LibGit2Sharp/CommitCollection.cs | 42 +++++++----------------- LibGit2Sharp/Core/NativeMethods.cs | 10 +++--- LibGit2Sharp/Core/RevWalkerSafeHandle.cs | 11 +++++++ LibGit2Sharp/LibGit2Sharp.csproj | 3 ++ 4 files changed, 30 insertions(+), 36 deletions(-) create mode 100644 LibGit2Sharp/Core/RevWalkerSafeHandle.cs diff --git a/LibGit2Sharp/CommitCollection.cs b/LibGit2Sharp/CommitCollection.cs index 24e07022e..480b78152 100644 --- a/LibGit2Sharp/CommitCollection.cs +++ b/LibGit2Sharp/CommitCollection.cs @@ -60,8 +60,8 @@ public IEnumerator GetEnumerator() if (string.IsNullOrEmpty(pushedSha)) { throw new NotImplementedException(); - } - + } + var enumerator = new CommitEnumerator(repo); enumerator.Sort(sortOptions); enumerator.Push(pushedSha); @@ -131,14 +131,13 @@ private class CommitEnumerator : IEnumerator { private readonly bool forCountOnly; private readonly Repository repo; - private readonly IntPtr walker = IntPtr.Zero; //TODO: Convert to SafeHandle? - private bool disposed; + private readonly RevWalkerSafeHandle handle; public CommitEnumerator(Repository repo, bool forCountOnly = false) { this.repo = repo; this.forCountOnly = forCountOnly; - int res = NativeMethods.git_revwalk_new(out walker, repo.Handle); + int res = NativeMethods.git_revwalk_new(out handle, repo.Handle); Ensure.Success(res); } @@ -160,7 +159,7 @@ object IEnumerator.Current public bool MoveNext() { GitOid oid; - var res = NativeMethods.git_revwalk_next(out oid, walker); + var res = NativeMethods.git_revwalk_next(out oid, handle); if (res == (int)GitErrorCode.GIT_EREVWALKOVER) return false; if (!forCountOnly) @@ -172,51 +171,32 @@ public bool MoveNext() public void Reset() { - NativeMethods.git_revwalk_reset(walker); + NativeMethods.git_revwalk_reset(handle); } #endregion private void Dispose(bool disposing) { - // Check to see if Dispose has already been called. - if (!disposed) + if (handle == null || handle.IsInvalid) { - // If disposing equals true, dispose all managed - // and unmanaged resources. - if (disposing) - { - // Dispose managed resources. - } - - // Call the appropriate methods to clean up - // unmanaged resources here. - NativeMethods.git_revwalk_free(walker); - - // Note disposing has been done. - disposed = true; + return; } - } - ~CommitEnumerator() - { - // Do not re-create Dispose clean-up code here. - // Calling Dispose(false) is optimal in terms of - // readability and maintainability. - Dispose(false); + handle.Dispose(); } public void Push(string sha) { var id = new ObjectId(sha); var oid = id.Oid; - int res = NativeMethods.git_revwalk_push(walker, ref oid); + int res = NativeMethods.git_revwalk_push(handle, ref oid); Ensure.Success(res); } public void Sort(GitSortOptions options) { - NativeMethods.git_revwalk_sorting(walker, options); + NativeMethods.git_revwalk_sorting(handle, options); } } diff --git a/LibGit2Sharp/Core/NativeMethods.cs b/LibGit2Sharp/Core/NativeMethods.cs index 9c5f129e1..5ac4ff051 100644 --- a/LibGit2Sharp/Core/NativeMethods.cs +++ b/LibGit2Sharp/Core/NativeMethods.cs @@ -169,19 +169,19 @@ private NativeMethods() { } public static extern void git_revwalk_free(IntPtr walker); [DllImport(libgit2)] - public static extern int git_revwalk_new(out IntPtr walker, RepositorySafeHandle repo); + public static extern int git_revwalk_new(out RevWalkerSafeHandle walker, RepositorySafeHandle repo); [DllImport(libgit2)] - public static extern int git_revwalk_next(out GitOid oid, IntPtr walker); + public static extern int git_revwalk_next(out GitOid oid, RevWalkerSafeHandle walker); [DllImport(libgit2)] - public static extern int git_revwalk_push(IntPtr walker, ref GitOid oid); + public static extern int git_revwalk_push(RevWalkerSafeHandle walker, ref GitOid oid); [DllImport(libgit2)] - public static extern void git_revwalk_reset(IntPtr walker); + public static extern void git_revwalk_reset(RevWalkerSafeHandle walker); [DllImport(libgit2)] - public static extern void git_revwalk_sorting(IntPtr walk, GitSortOptions sort); + public static extern void git_revwalk_sorting(RevWalkerSafeHandle walk, GitSortOptions sort); [DllImport(libgit2)] public static extern void git_signature_free(IntPtr signature); diff --git a/LibGit2Sharp/Core/RevWalkerSafeHandle.cs b/LibGit2Sharp/Core/RevWalkerSafeHandle.cs new file mode 100644 index 000000000..d4adc77ce --- /dev/null +++ b/LibGit2Sharp/Core/RevWalkerSafeHandle.cs @@ -0,0 +1,11 @@ +namespace LibGit2Sharp.Core +{ + internal class RevWalkerSafeHandle : SafeHandleBase + { + protected override bool ReleaseHandle() + { + NativeMethods.git_revwalk_free(handle); + return true; + } + } +} \ No newline at end of file diff --git a/LibGit2Sharp/LibGit2Sharp.csproj b/LibGit2Sharp/LibGit2Sharp.csproj index d81fb4d76..86a5f7efe 100644 --- a/LibGit2Sharp/LibGit2Sharp.csproj +++ b/LibGit2Sharp/LibGit2Sharp.csproj @@ -62,6 +62,9 @@ Code + + Code + From 548b8d9c45063ac197047a68abedd8c88039f970 Mon Sep 17 00:00:00 2001 From: nulltoken Date: Thu, 19 May 2011 14:39:11 +0200 Subject: [PATCH 16/36] Unify the behavior of CommitEnumerator --- LibGit2Sharp/CommitCollection.cs | 41 ++++++++++++++++++++++---------- 1 file changed, 28 insertions(+), 13 deletions(-) diff --git a/LibGit2Sharp/CommitCollection.cs b/LibGit2Sharp/CommitCollection.cs index 480b78152..7c74da7c7 100644 --- a/LibGit2Sharp/CommitCollection.cs +++ b/LibGit2Sharp/CommitCollection.cs @@ -1,6 +1,7 @@ using System; using System.Collections; using System.Collections.Generic; +using System.IO; using LibGit2Sharp.Core; namespace LibGit2Sharp @@ -39,7 +40,7 @@ public int Count get { var count = 0; - using (var enumerator = new CommitEnumerator(repo, true)) + using (var enumerator = new CommitEnumerator(repo)) { enumerator.Sort(sortOptions); enumerator.Push(pushedSha); @@ -129,26 +130,30 @@ public CommitCollection StartingAt(string sha) private class CommitEnumerator : IEnumerator { - private readonly bool forCountOnly; private readonly Repository repo; private readonly RevWalkerSafeHandle handle; + private ObjectId currentOid; - public CommitEnumerator(Repository repo, bool forCountOnly = false) + public CommitEnumerator(Repository repo) { this.repo = repo; - this.forCountOnly = forCountOnly; int res = NativeMethods.git_revwalk_new(out handle, repo.Handle); Ensure.Success(res); } #region IEnumerator Members - public Commit Current { get; private set; } - - public void Dispose() + public Commit Current { - Dispose(true); - GC.SuppressFinalize(this); + get + { + if (currentOid == null) + { + throw new InvalidOperationException(); + } + + return repo.Lookup(currentOid); + } } object IEnumerator.Current @@ -160,12 +165,16 @@ public bool MoveNext() { GitOid oid; var res = NativeMethods.git_revwalk_next(out oid, handle); - if (res == (int)GitErrorCode.GIT_EREVWALKOVER) return false; - - if (!forCountOnly) + + if (res == (int)GitErrorCode.GIT_EREVWALKOVER) { - Current = repo.Lookup(new ObjectId(oid)); + return false; } + + Ensure.Success(res); + + currentOid = new ObjectId(oid); + return true; } @@ -176,6 +185,12 @@ public void Reset() #endregion + public void Dispose() + { + Dispose(true); + GC.SuppressFinalize(this); + } + private void Dispose(bool disposing) { if (handle == null || handle.IsInvalid) From 4322bd76853054cd60601629ac239654ae89c220 Mon Sep 17 00:00:00 2001 From: nulltoken Date: Thu, 19 May 2011 17:05:37 +0200 Subject: [PATCH 17/36] Enforce CommitEnumerator immutability --- LibGit2Sharp/CommitCollection.cs | 22 +++++++++------------- 1 file changed, 9 insertions(+), 13 deletions(-) diff --git a/LibGit2Sharp/CommitCollection.cs b/LibGit2Sharp/CommitCollection.cs index 7c74da7c7..85bdad14f 100644 --- a/LibGit2Sharp/CommitCollection.cs +++ b/LibGit2Sharp/CommitCollection.cs @@ -1,7 +1,6 @@ using System; using System.Collections; using System.Collections.Generic; -using System.IO; using LibGit2Sharp.Core; namespace LibGit2Sharp @@ -40,10 +39,8 @@ public int Count get { var count = 0; - using (var enumerator = new CommitEnumerator(repo)) + using (var enumerator = new CommitEnumerator(repo, new ObjectId(pushedSha), sortOptions)) { - enumerator.Sort(sortOptions); - enumerator.Push(pushedSha); while (enumerator.MoveNext()) count++; } return count; @@ -63,10 +60,7 @@ public IEnumerator GetEnumerator() throw new NotImplementedException(); } - var enumerator = new CommitEnumerator(repo); - enumerator.Sort(sortOptions); - enumerator.Push(pushedSha); - return enumerator; + return new CommitEnumerator(repo, new ObjectId(pushedSha), sortOptions); } /// @@ -134,11 +128,14 @@ private class CommitEnumerator : IEnumerator private readonly RevWalkerSafeHandle handle; private ObjectId currentOid; - public CommitEnumerator(Repository repo) + public CommitEnumerator(Repository repo, ObjectId pushedOid, GitSortOptions sortingStrategy) { this.repo = repo; int res = NativeMethods.git_revwalk_new(out handle, repo.Handle); Ensure.Success(res); + + Sort(sortingStrategy); + Push(pushedOid); } #region IEnumerator Members @@ -201,15 +198,14 @@ private void Dispose(bool disposing) handle.Dispose(); } - public void Push(string sha) + private void Push(ObjectId pushedOid) { - var id = new ObjectId(sha); - var oid = id.Oid; + var oid = pushedOid.Oid; int res = NativeMethods.git_revwalk_push(handle, ref oid); Ensure.Success(res); } - public void Sort(GitSortOptions options) + private void Sort(GitSortOptions options) { NativeMethods.git_revwalk_sorting(handle, options); } From 65de100acff6a2b2d2556258cc12d02e0f3fbd14 Mon Sep 17 00:00:00 2001 From: nulltoken Date: Thu, 19 May 2011 17:20:02 +0200 Subject: [PATCH 18/36] Fix Repository.Info.IsEmpty --- LibGit2Sharp/RepositoryInformation.cs | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/LibGit2Sharp/RepositoryInformation.cs b/LibGit2Sharp/RepositoryInformation.cs index de070a971..975880705 100644 --- a/LibGit2Sharp/RepositoryInformation.cs +++ b/LibGit2Sharp/RepositoryInformation.cs @@ -15,7 +15,6 @@ internal RepositoryInformation(Repository repo, string posixPath, string posixWo Path = PosixPathHelper.ToNative(posixPath); IsBare = isBare; WorkingDirectory = PosixPathHelper.ToNative(posixWorkingDirectoryPath); - IsEmpty = NativeMethods.git_repository_is_empty(repo.Handle); } /// @@ -42,7 +41,10 @@ internal RepositoryInformation(Repository repo, string posixPath, string posixWo /// /// true if this repository is empty; otherwise, false. /// - public bool IsEmpty { get; private set; } + public bool IsEmpty + { + get { return NativeMethods.git_repository_is_empty(repo.Handle); } + } /// /// Indicates whether the Head points to an arbitrary commit instead of the tip of a local banch. From cf9dbed776f4f2a7bd2af346fbf3b5b2229058c9 Mon Sep 17 00:00:00 2001 From: nulltoken Date: Thu, 19 May 2011 18:18:02 +0200 Subject: [PATCH 19/36] Convert CommitCollection.StartingAt() overloads as extension methods --- LibGit2Sharp/CommitCollection.cs | 61 ++++++++++------------ LibGit2Sharp/CommitCollectionExtensions.cs | 33 ++++++++++++ LibGit2Sharp/LibGit2Sharp.csproj | 1 + 3 files changed, 62 insertions(+), 33 deletions(-) create mode 100644 LibGit2Sharp/CommitCollectionExtensions.cs diff --git a/LibGit2Sharp/CommitCollection.cs b/LibGit2Sharp/CommitCollection.cs index 85bdad14f..ee92f7073 100644 --- a/LibGit2Sharp/CommitCollection.cs +++ b/LibGit2Sharp/CommitCollection.cs @@ -12,15 +12,26 @@ public class CommitCollection : IEnumerable { private readonly Repository repo; private string pushedSha; - private GitSortOptions sortOptions = GitSortOptions.Time; + private readonly GitSortOptions sortOptions; + + /// + /// Initializes a new instance of the class. + /// The commits will be enumerated according in reverse chronological order. + /// + /// The repository. + internal CommitCollection(Repository repo) : this (repo, GitSortOptions.Time) + { + } /// /// Initializes a new instance of the class. /// - /// The repo. - internal CommitCollection(Repository repo) + /// The repository. + /// The sorting strategy which should be applied when enumerating the commits. + internal CommitCollection(Repository repo, GitSortOptions sortingStrategy) { this.repo = repo; + sortOptions = sortingStrategy; } /// @@ -32,7 +43,7 @@ public Commit this[string sha] } /// - /// Gets the Count of commits (This is a fast count that does not hydrate real commit objects) + /// Gets the count of commits (This is a fast count that does not hydrate real commit objects) /// public int Count { @@ -47,6 +58,14 @@ public int Count } } + /// + /// Gets the current sorting strategy applied when enumerating the collection + /// + public GitSortOptions SortedBy + { + get { return sortOptions; } + } + #region IEnumerable Members /// @@ -75,37 +94,13 @@ IEnumerator IEnumerable.GetEnumerator() #endregion /// - /// Sorts with the specified options. - /// - /// The options. - /// - public CommitCollection SortBy(GitSortOptions options) - { - return new CommitCollection(repo) { sortOptions = options, pushedSha = pushedSha }; - } - - /// - /// Starts enumeratoring the at the specified branch. - /// - /// The branch. - /// - public CommitCollection StartingAt(Branch branch) - { - Ensure.ArgumentNotNull(branch, "branch"); - - return new CommitCollection(repo) { sortOptions = sortOptions, pushedSha = branch.Tip.Sha }; - } - - /// - /// Starts enumeratoring the at the specified reference. + /// Sorts according to the specified strategy. /// - /// The reference. + /// The sorting strategy to be applied when enumerating the commits. /// - public CommitCollection StartingAt(Reference reference) + public CommitCollection SortBy(GitSortOptions sortingStrategy) { - Ensure.ArgumentNotNull(reference, "reference"); - - return new CommitCollection(repo) { sortOptions = sortOptions, pushedSha = reference.ResolveToDirectReference().Target.Sha }; + return new CommitCollection(repo, sortingStrategy) { pushedSha = pushedSha }; } /// @@ -117,7 +112,7 @@ public CommitCollection StartingAt(string sha) { Ensure.ArgumentNotNullOrEmptyString(sha, "sha"); - return new CommitCollection(repo) { sortOptions = sortOptions, pushedSha = sha }; + return new CommitCollection(repo, sortOptions) { pushedSha = sha }; } #region Nested type: CommitEnumerator diff --git a/LibGit2Sharp/CommitCollectionExtensions.cs b/LibGit2Sharp/CommitCollectionExtensions.cs new file mode 100644 index 000000000..7771af39b --- /dev/null +++ b/LibGit2Sharp/CommitCollectionExtensions.cs @@ -0,0 +1,33 @@ +using LibGit2Sharp.Core; + +namespace LibGit2Sharp +{ + public static class CommitCollectionExtensions + { + /// + /// Starts enumerating the at the specified branch. + /// + /// The commit collection to enumerate. + /// The branch. + /// + public static CommitCollection StartingAt(this CommitCollection commitCollection, Branch branch) + { + Ensure.ArgumentNotNull(branch, "branch"); + + return commitCollection.StartingAt(branch.Tip.Sha); + } + + /// + /// Starts enumerating the at the specified reference. + /// + /// The commit collection to enumerate. + /// The reference. + /// + public static CommitCollection StartingAt(this CommitCollection commitCollection, Reference reference) + { + Ensure.ArgumentNotNull(reference, "reference"); + + return commitCollection.StartingAt(reference.ResolveToDirectReference().Target.Sha); + } + } +} diff --git a/LibGit2Sharp/LibGit2Sharp.csproj b/LibGit2Sharp/LibGit2Sharp.csproj index 86a5f7efe..4579d277f 100644 --- a/LibGit2Sharp/LibGit2Sharp.csproj +++ b/LibGit2Sharp/LibGit2Sharp.csproj @@ -47,6 +47,7 @@ + From 8720df7b9ac3abd546308c6d8674aaafa406a180 Mon Sep 17 00:00:00 2001 From: nulltoken Date: Thu, 19 May 2011 18:18:46 +0200 Subject: [PATCH 20/36] Enforce CommitCollection test coverage --- LibGit2Sharp.Tests/CommitFixture.cs | 36 +++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/LibGit2Sharp.Tests/CommitFixture.cs b/LibGit2Sharp.Tests/CommitFixture.cs index c37f2c30f..5a4d57ede 100644 --- a/LibGit2Sharp.Tests/CommitFixture.cs +++ b/LibGit2Sharp.Tests/CommitFixture.cs @@ -22,6 +22,21 @@ public void CanCountCommits() } } + [Test] + public void CanCorrectlyCountCommitsWhenSwitchingToAnotherBranch() + { + using (var repo = new Repository(Constants.TestRepoPath)) + { + repo.Branches.Checkout("test"); + repo.Commits.Count.ShouldEqual(2); + repo.Commits.First().Id.Sha.ShouldEqual("e90810b8df3e80c413d903f631643c716887138d"); + + repo.Branches.Checkout("master"); + repo.Commits.Count.ShouldEqual(7); + repo.Commits.First().Id.Sha.ShouldEqual("4c062a6361ae6959e06292c1fa5e2822d9c96345"); + } + } + [Test] public void CanEnumerateCommits() { @@ -37,6 +52,15 @@ public void CanEnumerateCommits() count.ShouldEqual(7); } + [Test] + public void DefaultOrderingWhenEnumeratingCommitsIsTimeBased() + { + using (var repo = new Repository(Constants.TestRepoPath)) + { + repo.Commits.SortedBy.ShouldEqual(GitSortOptions.Time); + } + } + [Test] public void CanEnumerateCommitsFromSha() { @@ -52,6 +76,18 @@ public void CanEnumerateCommitsFromSha() count.ShouldEqual(6); } + [Test] + [Ignore("Not implemented yet.")] + public void BuildingACommitCollectionFromUnknownShaOrInvalidReferenceThrows() + { + using (var repo = new Repository(Constants.TestRepoPath)) + { + Assert.Throws(() => repo.Commits.StartingAt(Constants.UnknownSha)); + Assert.Throws(() => repo.Commits.StartingAt("refs/heads/deadbeef")); + Assert.Throws(() => repo.Commits.StartingAt(repo.Branches["deadbeef"])); + } + } + [Test] public void CanEnumerateCommitsWithReverseTimeSorting() { From 2785f5364abed63397fcc9e7ba84781a84cd543d Mon Sep 17 00:00:00 2001 From: nulltoken Date: Thu, 19 May 2011 22:41:10 +0200 Subject: [PATCH 21/36] Ensure a CommitCollection can not be built from an unknown sha or a corrupted reference --- LibGit2Sharp.Tests/CommitFixture.cs | 8 +++---- LibGit2Sharp/CommitCollection.cs | 25 ++++++++++++++-------- LibGit2Sharp/CommitCollectionExtensions.cs | 14 +++++++++--- LibGit2Sharp/Repository.cs | 2 +- backlog.md | 3 --- 5 files changed, 32 insertions(+), 20 deletions(-) diff --git a/LibGit2Sharp.Tests/CommitFixture.cs b/LibGit2Sharp.Tests/CommitFixture.cs index 5a4d57ede..e3effe9fc 100644 --- a/LibGit2Sharp.Tests/CommitFixture.cs +++ b/LibGit2Sharp.Tests/CommitFixture.cs @@ -77,14 +77,14 @@ public void CanEnumerateCommitsFromSha() } [Test] - [Ignore("Not implemented yet.")] public void BuildingACommitCollectionFromUnknownShaOrInvalidReferenceThrows() { using (var repo = new Repository(Constants.TestRepoPath)) { - Assert.Throws(() => repo.Commits.StartingAt(Constants.UnknownSha)); - Assert.Throws(() => repo.Commits.StartingAt("refs/heads/deadbeef")); - Assert.Throws(() => repo.Commits.StartingAt(repo.Branches["deadbeef"])); + Assert.Throws(() => repo.Commits.StartingAt(Constants.UnknownSha)); + Assert.Throws(() => repo.Commits.StartingAt("refs/heads/deadbeef")); + Assert.Throws(() => repo.Commits.StartingAt(repo.Branches["deadbeef"])); + Assert.Throws(() => repo.Commits.StartingAt(repo.Refs["refs/heads/deadbeef"])); } } diff --git a/LibGit2Sharp/CommitCollection.cs b/LibGit2Sharp/CommitCollection.cs index ee92f7073..7be815047 100644 --- a/LibGit2Sharp/CommitCollection.cs +++ b/LibGit2Sharp/CommitCollection.cs @@ -11,7 +11,7 @@ namespace LibGit2Sharp public class CommitCollection : IEnumerable { private readonly Repository repo; - private string pushedSha; + private ObjectId pushedObjectId; private readonly GitSortOptions sortOptions; /// @@ -50,7 +50,7 @@ public int Count get { var count = 0; - using (var enumerator = new CommitEnumerator(repo, new ObjectId(pushedSha), sortOptions)) + using (var enumerator = new CommitEnumerator(repo, pushedObjectId, sortOptions)) { while (enumerator.MoveNext()) count++; } @@ -74,12 +74,12 @@ public GitSortOptions SortedBy /// An object that can be used to iterate through the collection. public IEnumerator GetEnumerator() { - if (string.IsNullOrEmpty(pushedSha)) + if (pushedObjectId == null) { throw new NotImplementedException(); } - return new CommitEnumerator(repo, new ObjectId(pushedSha), sortOptions); + return new CommitEnumerator(repo, pushedObjectId, sortOptions); } /// @@ -100,19 +100,26 @@ IEnumerator IEnumerable.GetEnumerator() /// public CommitCollection SortBy(GitSortOptions sortingStrategy) { - return new CommitCollection(repo, sortingStrategy) { pushedSha = pushedSha }; + return new CommitCollection(repo, sortingStrategy) { pushedObjectId = pushedObjectId }; } /// /// Starts enumeratoring the at the specified sha. /// - /// The sha. + /// The sha or reference canonical name to use. /// - public CommitCollection StartingAt(string sha) + public CommitCollection StartingAt(string shaOrReferenceName) { - Ensure.ArgumentNotNullOrEmptyString(sha, "sha"); + Ensure.ArgumentNotNullOrEmptyString(shaOrReferenceName, "shaOrReferenceName"); - return new CommitCollection(repo, sortOptions) { pushedSha = sha }; + GitObject gitObj = repo.Lookup(shaOrReferenceName); + + if (gitObj == null) // TODO: Should we check the type? Git-log allows TagAnnotation oid as parameter. But what about Blobs and Trees? + { + throw new ArgumentException(string.Format("No valid object identified as '{0}' has been found in the repository.", shaOrReferenceName), "shaOrReferenceName"); + } + + return new CommitCollection(repo, sortOptions) { pushedObjectId = gitObj.Id }; } #region Nested type: CommitEnumerator diff --git a/LibGit2Sharp/CommitCollectionExtensions.cs b/LibGit2Sharp/CommitCollectionExtensions.cs index 7771af39b..cde489a61 100644 --- a/LibGit2Sharp/CommitCollectionExtensions.cs +++ b/LibGit2Sharp/CommitCollectionExtensions.cs @@ -1,4 +1,5 @@ -using LibGit2Sharp.Core; +using System; +using LibGit2Sharp.Core; namespace LibGit2Sharp { @@ -14,7 +15,14 @@ public static CommitCollection StartingAt(this CommitCollection commitCollection { Ensure.ArgumentNotNull(branch, "branch"); - return commitCollection.StartingAt(branch.Tip.Sha); + Commit commit = branch.Tip; + + if (commit == null) + { + throw new ArgumentException(string.Format("No valid object identified as '{0}' has been found in the repository.", branch.CanonicalName), "branch"); + } + + return commitCollection.StartingAt(commit.Sha); } /// @@ -27,7 +35,7 @@ public static CommitCollection StartingAt(this CommitCollection commitCollection { Ensure.ArgumentNotNull(reference, "reference"); - return commitCollection.StartingAt(reference.ResolveToDirectReference().Target.Sha); + return commitCollection.StartingAt(reference.ResolveToDirectReference().CanonicalName); } } } diff --git a/LibGit2Sharp/Repository.cs b/LibGit2Sharp/Repository.cs index d4f68fd21..f1671e6f2 100644 --- a/LibGit2Sharp/Repository.cs +++ b/LibGit2Sharp/Repository.cs @@ -214,7 +214,7 @@ public GitObject Lookup(string shaOrReferenceName, GitObjectType type = GitObjec return null; } - return Lookup(reference.ResolveToDirectReference().Target.Id, type); + return Lookup(reference.ResolveToDirectReference().TargetIdentifier, type); } private static bool IsReferencePeelable(Reference reference) diff --git a/backlog.md b/backlog.md index 8a82dfc8d..2f6074ce8 100644 --- a/backlog.md +++ b/backlog.md @@ -5,10 +5,7 @@ - Build a LibGit2Sharp.Sample NuGet package - Publish source and PDBs at symbolsource.org (cf. http://blog.davidebbo.com/2011/04/easy-way-to-publish-nuget-packages-with.html and http://nuget.codeplex.com/discussions/257709) - Bind git_revwalk_hide() as CommitCollection.Until() - - Throw when revwalker is being passed an unknown object - - Change CommitCollection.StartingAt(string sha) into CommitCollection.StartingAt(string referenceNameOrsha) - Fix FluentInterface .StartingAt() and .Until() in order to prevent .StartIngAt().StartingAt(), .Until().Until() and .Until().StartingAt() - - Push StartingAt() overloads into extension methods - Add to Epoch a DateTimeOffset extension method ToRelativeFormat() in order to show dates relative to the current time, e.g. "2 hours ago". (cf. https://github.com/git/git/blob/master/date.c#L89) - Add branch renaming (public Branch Move(string oldName, string newName, bool allowOverwrite = false)) - Turn duplicated strings "refs/xxx" into properties of a generic Constants helper type From 7508573882292d31c8cfc6f7e7effe64f7cb7004 Mon Sep 17 00:00:00 2001 From: nulltoken Date: Fri, 20 May 2011 15:26:46 +0200 Subject: [PATCH 22/36] Fix some issues pinpointed by Code Analysis --- LibGit2Sharp/CommitCollection.cs | 3 ++- LibGit2Sharp/CommitCollectionExtensions.cs | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/LibGit2Sharp/CommitCollection.cs b/LibGit2Sharp/CommitCollection.cs index 7be815047..e59337d3e 100644 --- a/LibGit2Sharp/CommitCollection.cs +++ b/LibGit2Sharp/CommitCollection.cs @@ -1,6 +1,7 @@ using System; using System.Collections; using System.Collections.Generic; +using System.Globalization; using LibGit2Sharp.Core; namespace LibGit2Sharp @@ -116,7 +117,7 @@ public CommitCollection StartingAt(string shaOrReferenceName) if (gitObj == null) // TODO: Should we check the type? Git-log allows TagAnnotation oid as parameter. But what about Blobs and Trees? { - throw new ArgumentException(string.Format("No valid object identified as '{0}' has been found in the repository.", shaOrReferenceName), "shaOrReferenceName"); + throw new ArgumentException(string.Format(CultureInfo.InvariantCulture, "No valid object identified as '{0}' has been found in the repository.", shaOrReferenceName), "shaOrReferenceName"); } return new CommitCollection(repo, sortOptions) { pushedObjectId = gitObj.Id }; diff --git a/LibGit2Sharp/CommitCollectionExtensions.cs b/LibGit2Sharp/CommitCollectionExtensions.cs index cde489a61..c0e5a6db8 100644 --- a/LibGit2Sharp/CommitCollectionExtensions.cs +++ b/LibGit2Sharp/CommitCollectionExtensions.cs @@ -1,4 +1,5 @@ using System; +using System.Globalization; using LibGit2Sharp.Core; namespace LibGit2Sharp @@ -19,7 +20,7 @@ public static CommitCollection StartingAt(this CommitCollection commitCollection if (commit == null) { - throw new ArgumentException(string.Format("No valid object identified as '{0}' has been found in the repository.", branch.CanonicalName), "branch"); + throw new ArgumentException(string.Format(CultureInfo.InvariantCulture, "No valid object identified as '{0}' has been found in the repository.", branch.CanonicalName), "branch"); } return commitCollection.StartingAt(commit.Sha); From 2a18c09b41dd594fecf23ff5aad42cdc8fce75cf Mon Sep 17 00:00:00 2001 From: nulltoken Date: Fri, 20 May 2011 17:08:43 +0200 Subject: [PATCH 23/36] Turn NativeMethods and UnSafeNativeMethods types into static ones --- LibGit2Sharp/Core/NativeMethods.cs | 4 +--- LibGit2Sharp/Core/UnSafeNativeMethods.cs | 4 +--- 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/LibGit2Sharp/Core/NativeMethods.cs b/LibGit2Sharp/Core/NativeMethods.cs index 5ac4ff051..4344ec974 100644 --- a/LibGit2Sharp/Core/NativeMethods.cs +++ b/LibGit2Sharp/Core/NativeMethods.cs @@ -3,12 +3,10 @@ namespace LibGit2Sharp.Core { - internal class NativeMethods + internal static class NativeMethods { const string libgit2 = "git2.dll"; - private NativeMethods() { } - [DllImport(libgit2)] public static extern IntPtr git_blob_rawcontent(IntPtr blob); diff --git a/LibGit2Sharp/Core/UnSafeNativeMethods.cs b/LibGit2Sharp/Core/UnSafeNativeMethods.cs index 22c9ccf5a..c6d6c79de 100644 --- a/LibGit2Sharp/Core/UnSafeNativeMethods.cs +++ b/LibGit2Sharp/Core/UnSafeNativeMethods.cs @@ -3,12 +3,10 @@ namespace LibGit2Sharp.Core { - internal unsafe class UnSafeNativeMethods + internal static unsafe class UnSafeNativeMethods { private const string libgit2 = "git2.dll"; - private UnSafeNativeMethods() { } - [DllImport(libgit2)] public static extern int git_reference_listall(git_strarray* array, RepositorySafeHandle repo, GitReferenceType flags); From 49410b0afecfdd963175c75104787b26f3cda59a Mon Sep 17 00:00:00 2001 From: nulltoken Date: Fri, 20 May 2011 21:36:00 +0200 Subject: [PATCH 24/36] Fix an IIS related interop issue Credit goes to @yysun for having spotted this. Special thanks to @tclem for his wizardry. --- LibGit2Sharp/Commit.cs | 4 ++-- LibGit2Sharp/Core/Ensure.cs | 2 +- LibGit2Sharp/Core/IntPtrExtensions.cs | 13 ++++++++++++ LibGit2Sharp/Core/NativeMethods.cs | 30 +++++++++------------------ LibGit2Sharp/LibGit2Sharp.csproj | 1 + LibGit2Sharp/Reference.cs | 6 +++--- LibGit2Sharp/Repository.cs | 6 +++--- LibGit2Sharp/TagAnnotation.cs | 4 ++-- LibGit2Sharp/TreeEntry.cs | 2 +- 9 files changed, 36 insertions(+), 32 deletions(-) create mode 100644 LibGit2Sharp/Core/IntPtrExtensions.cs diff --git a/LibGit2Sharp/Commit.cs b/LibGit2Sharp/Commit.cs index a67ff6efa..b9368ec69 100644 --- a/LibGit2Sharp/Commit.cs +++ b/LibGit2Sharp/Commit.cs @@ -89,8 +89,8 @@ internal static Commit BuildFromPtr(IntPtr obj, ObjectId id, Repository repo) return new Commit(id, treeId, repo) { - Message = NativeMethods.git_commit_message(obj), - MessageShort = NativeMethods.git_commit_message_short(obj), + Message = NativeMethods.git_commit_message(obj).MarshallAsString(), + MessageShort = NativeMethods.git_commit_message_short(obj).MarshallAsString(), Author = new Signature(NativeMethods.git_commit_author(obj)), Committer = new Signature(NativeMethods.git_commit_committer(obj)), }; diff --git a/LibGit2Sharp/Core/Ensure.cs b/LibGit2Sharp/Core/Ensure.cs index 4cbc60991..e0813fd4b 100644 --- a/LibGit2Sharp/Core/Ensure.cs +++ b/LibGit2Sharp/Core/Ensure.cs @@ -47,7 +47,7 @@ public static void Success(int result) return; } - string errorMessage = NativeMethods.git_lasterror(); + string errorMessage = NativeMethods.git_lasterror().MarshallAsString(); throw new ApplicationException( String.Format(CultureInfo.InvariantCulture, "An error was raised by libgit2. Error code = {0} ({1}).{2}{3}", Enum.GetName(typeof(GitErrorCode), result), result, Environment.NewLine, errorMessage)); diff --git a/LibGit2Sharp/Core/IntPtrExtensions.cs b/LibGit2Sharp/Core/IntPtrExtensions.cs new file mode 100644 index 000000000..b6378b071 --- /dev/null +++ b/LibGit2Sharp/Core/IntPtrExtensions.cs @@ -0,0 +1,13 @@ +using System; +using System.Runtime.InteropServices; + +namespace LibGit2Sharp.Core +{ + internal static class IntPtrExtensions + { + public static string MarshallAsString(this IntPtr intPtr) + { + return Marshal.PtrToStringAnsi(intPtr); + } + } +} \ No newline at end of file diff --git a/LibGit2Sharp/Core/NativeMethods.cs b/LibGit2Sharp/Core/NativeMethods.cs index 4344ec974..c51e2d465 100644 --- a/LibGit2Sharp/Core/NativeMethods.cs +++ b/LibGit2Sharp/Core/NativeMethods.cs @@ -23,12 +23,10 @@ internal static class NativeMethods public static extern int git_commit_create_o(out GitOid oid, RepositorySafeHandle repo, string updateRef, IntPtr author, IntPtr committer, string message, IntPtr tree, int parentCount, IntPtr parents); [DllImport(libgit2)] - [return: MarshalAs(UnmanagedType.AnsiBStr)] - public static extern string git_commit_message(IntPtr commit); + public static extern IntPtr git_commit_message(IntPtr commit); [DllImport(libgit2)] - [return: MarshalAs(UnmanagedType.AnsiBStr)] - public static extern string git_commit_message_short(IntPtr commit); + public static extern IntPtr git_commit_message_short(IntPtr commit); [DllImport(libgit2)] public static extern int git_commit_parent(out IntPtr parentCommit, IntPtr commit, uint n); @@ -61,8 +59,7 @@ internal static class NativeMethods public static extern int git_index_open_inrepo(out IndexSafeHandle index, RepositorySafeHandle repo); [DllImport(libgit2)] - [return: MarshalAs(UnmanagedType.AnsiBStr)] - public static extern string git_lasterror(); + public static extern IntPtr git_lasterror(); [DllImport(libgit2)] public static extern void git_object_close(IntPtr obj); @@ -111,8 +108,7 @@ internal static class NativeMethods public static extern int git_reference_lookup(out IntPtr reference, RepositorySafeHandle repo, string name); [DllImport(libgit2)] - [return: MarshalAs(UnmanagedType.AnsiBStr)] - public static extern string git_reference_name(IntPtr reference); + public static extern IntPtr git_reference_name(IntPtr reference); [DllImport(libgit2)] public static extern IntPtr git_reference_oid(IntPtr reference); @@ -133,8 +129,7 @@ internal static class NativeMethods public static extern int git_reference_set_target(IntPtr reference, string target); [DllImport(libgit2)] - [return: MarshalAs(UnmanagedType.AnsiBStr)] - public static extern string git_reference_target(IntPtr reference); + public static extern IntPtr git_reference_target(IntPtr reference); [DllImport(libgit2)] public static extern GitReferenceType git_reference_type(IntPtr reference); @@ -156,12 +151,10 @@ internal static class NativeMethods public static extern int git_repository_open(out RepositorySafeHandle repository, string path); [DllImport(libgit2)] - [return: MarshalAs(UnmanagedType.AnsiBStr)] - public static extern string git_repository_path(RepositorySafeHandle repository); + public static extern IntPtr git_repository_path(RepositorySafeHandle repository); [DllImport(libgit2)] - [return: MarshalAs(UnmanagedType.AnsiBStr)] - public static extern string git_repository_workdir(RepositorySafeHandle repository); + public static extern IntPtr git_repository_workdir(RepositorySafeHandle repository); [DllImport(libgit2)] public static extern void git_revwalk_free(IntPtr walker); @@ -197,12 +190,10 @@ internal static class NativeMethods public static extern int git_tag_delete(RepositorySafeHandle repo, string tagName); [DllImport(libgit2)] - [return: MarshalAs(UnmanagedType.AnsiBStr)] - public static extern string git_tag_message(IntPtr tag); + public static extern IntPtr git_tag_message(IntPtr tag); [DllImport(libgit2)] - [return: MarshalAs(UnmanagedType.AnsiBStr)] - public static extern string git_tag_name(IntPtr tag); + public static extern IntPtr git_tag_name(IntPtr tag); [DllImport(libgit2)] public static extern IntPtr git_tag_tagger(IntPtr tag); @@ -226,8 +217,7 @@ internal static class NativeMethods public static extern IntPtr git_tree_entry_id(IntPtr tree); [DllImport(libgit2)] - [return: MarshalAs(UnmanagedType.AnsiBStr)] - public static extern string git_tree_entry_name(IntPtr entry); + public static extern IntPtr git_tree_entry_name(IntPtr entry); [DllImport(libgit2)] public static extern int git_tree_entrycount(IntPtr tree); diff --git a/LibGit2Sharp/LibGit2Sharp.csproj b/LibGit2Sharp/LibGit2Sharp.csproj index 4579d277f..a98f3d749 100644 --- a/LibGit2Sharp/LibGit2Sharp.csproj +++ b/LibGit2Sharp/LibGit2Sharp.csproj @@ -58,6 +58,7 @@ + diff --git a/LibGit2Sharp/Reference.cs b/LibGit2Sharp/Reference.cs index 442f5367d..fd73026a3 100644 --- a/LibGit2Sharp/Reference.cs +++ b/LibGit2Sharp/Reference.cs @@ -26,8 +26,8 @@ internal static T BuildFromPtr(IntPtr ptr, Repository repo) where T : class return default(T); } - var name = NativeMethods.git_reference_name(ptr); - var type = NativeMethods.git_reference_type(ptr); + string name = NativeMethods.git_reference_name(ptr).MarshallAsString(); + GitReferenceType type = NativeMethods.git_reference_type(ptr); Reference reference; string targetIdentifier; @@ -36,7 +36,7 @@ internal static T BuildFromPtr(IntPtr ptr, Repository repo) where T : class { case GitReferenceType.Symbolic: IntPtr resolveRef; - targetIdentifier = NativeMethods.git_reference_target(ptr); + targetIdentifier = NativeMethods.git_reference_target(ptr).MarshallAsString(); int res = NativeMethods.git_reference_resolve(out resolveRef, ptr); if (res == (int) GitErrorCode.GIT_ENOTFOUND) diff --git a/LibGit2Sharp/Repository.cs b/LibGit2Sharp/Repository.cs index f1671e6f2..34131982d 100644 --- a/LibGit2Sharp/Repository.cs +++ b/LibGit2Sharp/Repository.cs @@ -27,8 +27,8 @@ public Repository(string path) var res = NativeMethods.git_repository_open(out handle, PosixPathHelper.ToPosix(path)); Ensure.Success(res); - string normalizedPath = NativeMethods.git_repository_path(handle); - string normalizedWorkDir = NativeMethods.git_repository_workdir(handle); + string normalizedPath = NativeMethods.git_repository_path(handle).MarshallAsString(); + string normalizedWorkDir = NativeMethods.git_repository_workdir(handle).MarshallAsString(); Info = new RepositoryInformation(this, normalizedPath, normalizedWorkDir, normalizedWorkDir == null); @@ -164,7 +164,7 @@ public static string Init(string path, bool bare = false) var res = NativeMethods.git_repository_init(out repo, PosixPathHelper.ToPosix(path), bare); Ensure.Success(res); - string normalizedPath = NativeMethods.git_repository_path(repo); + string normalizedPath = NativeMethods.git_repository_path(repo).MarshallAsString(); repo.Dispose(); return PosixPathHelper.ToNative(normalizedPath); diff --git a/LibGit2Sharp/TagAnnotation.cs b/LibGit2Sharp/TagAnnotation.cs index 005e7ccde..47280e3c0 100644 --- a/LibGit2Sharp/TagAnnotation.cs +++ b/LibGit2Sharp/TagAnnotation.cs @@ -41,8 +41,8 @@ internal static TagAnnotation BuildFromPtr(IntPtr obj, ObjectId id) return new TagAnnotation(id) { - Message = NativeMethods.git_tag_message(obj), - Name = NativeMethods.git_tag_name(obj), + Message = NativeMethods.git_tag_message(obj).MarshallAsString(), + Name = NativeMethods.git_tag_name(obj).MarshallAsString(), Tagger = new Signature(NativeMethods.git_tag_tagger(obj)), TargetId = new ObjectId(oid) }; diff --git a/LibGit2Sharp/TreeEntry.cs b/LibGit2Sharp/TreeEntry.cs index 72f42baaf..20eea0d67 100755 --- a/LibGit2Sharp/TreeEntry.cs +++ b/LibGit2Sharp/TreeEntry.cs @@ -22,7 +22,7 @@ public TreeEntry(IntPtr obj, ObjectId parentTreeId, Repository repo) targetOid = new ObjectId((GitOid)Marshal.PtrToStructure(gitTreeEntryId, typeof(GitOid))); Attributes = NativeMethods.git_tree_entry_attributes(obj); - Name = NativeMethods.git_tree_entry_name(obj); + Name = NativeMethods.git_tree_entry_name(obj).MarshallAsString(); } public int Attributes { get; private set; } From b283190928f8faf98ea1476acaf052ae9ea0ffc5 Mon Sep 17 00:00:00 2001 From: nulltoken Date: Sat, 21 May 2011 13:39:09 +0200 Subject: [PATCH 25/36] Minor ObjectId refactoring --- LibGit2Sharp/ObjectId.cs | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/LibGit2Sharp/ObjectId.cs b/LibGit2Sharp/ObjectId.cs index d576a769a..a1368098a 100644 --- a/LibGit2Sharp/ObjectId.cs +++ b/LibGit2Sharp/ObjectId.cs @@ -31,13 +31,10 @@ internal ObjectId(GitOid oid) /// Initializes a new instance of the class. /// /// The byte array. - public ObjectId(byte[] rawId) + public ObjectId(byte[] rawId) : this(new GitOid{Id = rawId} ) { Ensure.ArgumentNotNull(rawId, "rawId"); Ensure.ArgumentConformsTo(rawId, b => b.Length == rawSize, "rawId"); - - oid = new GitOid { Id = rawId }; - Sha = Stringify(oid); } /// @@ -110,7 +107,7 @@ private static string Stringify(GitOid oid) { var hex = new byte[hexSize]; NativeMethods.git_oid_fmt(hex, ref oid); - return Encoding.UTF8.GetString(hex); + return Encoding.ASCII.GetString(hex); } /// From 4b46919bf55e60becbca4e23efc2ce6f943b1926 Mon Sep 17 00:00:00 2001 From: nulltoken Date: Sat, 21 May 2011 13:40:57 +0200 Subject: [PATCH 26/36] Improve performance of resolving of direct references --- LibGit2Sharp/DirectReference.cs | 29 ++++++++++++++++++++++++----- LibGit2Sharp/Reference.cs | 8 +++----- LibGit2Sharp/SymbolicReference.cs | 5 ----- 3 files changed, 27 insertions(+), 15 deletions(-) diff --git a/LibGit2Sharp/DirectReference.cs b/LibGit2Sharp/DirectReference.cs index cc79e5d7c..7a3feb9a7 100644 --- a/LibGit2Sharp/DirectReference.cs +++ b/LibGit2Sharp/DirectReference.cs @@ -1,18 +1,37 @@ -namespace LibGit2Sharp +using System; + +namespace LibGit2Sharp { /// /// A DirectReference points directly to a /// public class DirectReference : Reference { + private readonly Func targetResolver; + private bool resolved; + private GitObject target; + + internal DirectReference(Func targetResolver) + { + this.targetResolver = targetResolver; + } + /// /// Gets the target of this /// - public GitObject Target { get; internal set; } - - protected override object ProvideAdditionalEqualityComponent() + public GitObject Target { - return Target; + get + { + if (resolved) + { + return target; + } + + target = targetResolver(); + resolved = true; + return target; + } } /// diff --git a/LibGit2Sharp/Reference.cs b/LibGit2Sharp/Reference.cs index fd73026a3..8aad7494d 100644 --- a/LibGit2Sharp/Reference.cs +++ b/LibGit2Sharp/Reference.cs @@ -11,7 +11,7 @@ namespace LibGit2Sharp public abstract class Reference : IEquatable { private static readonly LambdaEqualityHelper equalityHelper = - new LambdaEqualityHelper(new Func[] { x => x.CanonicalName, x => x.ProvideAdditionalEqualityComponent() }); + new LambdaEqualityHelper(new Func[] { x => x.CanonicalName, x => x.TargetIdentifier }); /// /// Gets the full name of this reference. @@ -57,8 +57,8 @@ internal static T BuildFromPtr(IntPtr ptr, Repository repo) where T : class var targetId = new ObjectId(oid); targetIdentifier = targetId.Sha; - var target = repo.Lookup(targetId); - reference = new DirectReference { CanonicalName = name, Target = target, TargetIdentifier = targetIdentifier}; + var targetResolver = new Func(() => repo.Lookup(targetId)); + reference = new DirectReference(targetResolver) { CanonicalName = name, TargetIdentifier = targetIdentifier}; break; default: @@ -88,8 +88,6 @@ internal static T BuildFromPtr(IntPtr ptr, Repository repo) where T : class Enum.GetName(typeof (GitReferenceType), type))); } - protected abstract object ProvideAdditionalEqualityComponent(); - /// /// Recursively peels the target of the reference until a direct reference is encountered. /// diff --git a/LibGit2Sharp/SymbolicReference.cs b/LibGit2Sharp/SymbolicReference.cs index 0ddc5be67..e1a8290aa 100644 --- a/LibGit2Sharp/SymbolicReference.cs +++ b/LibGit2Sharp/SymbolicReference.cs @@ -10,11 +10,6 @@ public class SymbolicReference : Reference /// public Reference Target { get; internal set; } - protected override object ProvideAdditionalEqualityComponent() - { - return Target; - } - /// /// Recursively peels the target of the reference until a direct reference is encountered. /// From 187b1b369948dda5ed3691dbff25cf0803ece344 Mon Sep 17 00:00:00 2001 From: nulltoken Date: Sat, 21 May 2011 14:21:29 +0200 Subject: [PATCH 27/36] Remove duplicate test --- LibGit2Sharp.Tests/RepositoryFixture.cs | 17 ----------------- 1 file changed, 17 deletions(-) diff --git a/LibGit2Sharp.Tests/RepositoryFixture.cs b/LibGit2Sharp.Tests/RepositoryFixture.cs index 9a3c91dd3..acae761ce 100644 --- a/LibGit2Sharp.Tests/RepositoryFixture.cs +++ b/LibGit2Sharp.Tests/RepositoryFixture.cs @@ -233,22 +233,5 @@ public void CheckingForObjectExistenceWithBadParamsThrows() Assert.Throws(() => repo.HasObject(null)); } } - - [Test] - public void CheckForDetachedHeadOnNewRepo() - { - using (var scd = new SelfCleaningDirectory()) - { - var dir = Repository.Init(scd.DirectoryPath, true); - Path.IsPathRooted(dir).ShouldBeTrue(); - Directory.Exists(dir).ShouldBeTrue(); - - using (var repo = new Repository(dir)) - { - repo.Info.IsEmpty.ShouldBeTrue(); - repo.Info.IsHeadDetached.ShouldBeFalse(); - } - } - } } } \ No newline at end of file From fa2047e783d448346131ae0750b0b31a3390ef81 Mon Sep 17 00:00:00 2001 From: nulltoken Date: Sat, 21 May 2011 15:07:06 +0200 Subject: [PATCH 28/36] Prevent NullReferenceException from being thrown when accessing the CommitCollection of a newly initialized repository Should partially fix issue #30 --- LibGit2Sharp.Tests/RepositoryFixture.cs | 1 + LibGit2Sharp/CommitCollectionExtensions.cs | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/LibGit2Sharp.Tests/RepositoryFixture.cs b/LibGit2Sharp.Tests/RepositoryFixture.cs index acae761ce..9f77ff0a2 100644 --- a/LibGit2Sharp.Tests/RepositoryFixture.cs +++ b/LibGit2Sharp.Tests/RepositoryFixture.cs @@ -57,6 +57,7 @@ private static void AssertInitializedRepository(Repository repo) repo.Info.IsHeadDetached.ShouldBeFalse(); repo.Head.TargetIdentifier.ShouldEqual("refs/heads/master"); repo.Head.ResolveToDirectReference().ShouldBeNull(); + Assert.Throws(() => { var c = repo.Commits; }); } [Test] diff --git a/LibGit2Sharp/CommitCollectionExtensions.cs b/LibGit2Sharp/CommitCollectionExtensions.cs index c0e5a6db8..55ee1efe1 100644 --- a/LibGit2Sharp/CommitCollectionExtensions.cs +++ b/LibGit2Sharp/CommitCollectionExtensions.cs @@ -36,7 +36,7 @@ public static CommitCollection StartingAt(this CommitCollection commitCollection { Ensure.ArgumentNotNull(reference, "reference"); - return commitCollection.StartingAt(reference.ResolveToDirectReference().CanonicalName); + return commitCollection.StartingAt(reference.CanonicalName); } } } From ed87a6b7d49b242d7258629a6316eafac1ad9c8c Mon Sep 17 00:00:00 2001 From: nulltoken Date: Sat, 21 May 2011 15:32:20 +0200 Subject: [PATCH 29/36] Improve the exception thrown when building a CommitCollection from an unknown sha or reference Should partially fix issue #30 --- LibGit2Sharp.Tests/CommitFixture.cs | 8 ++++---- LibGit2Sharp.Tests/RepositoryFixture.cs | 2 +- LibGit2Sharp/CommitCollection.cs | 2 +- LibGit2Sharp/CommitCollectionExtensions.cs | 2 +- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/LibGit2Sharp.Tests/CommitFixture.cs b/LibGit2Sharp.Tests/CommitFixture.cs index e3effe9fc..27e566923 100644 --- a/LibGit2Sharp.Tests/CommitFixture.cs +++ b/LibGit2Sharp.Tests/CommitFixture.cs @@ -81,10 +81,10 @@ public void BuildingACommitCollectionFromUnknownShaOrInvalidReferenceThrows() { using (var repo = new Repository(Constants.TestRepoPath)) { - Assert.Throws(() => repo.Commits.StartingAt(Constants.UnknownSha)); - Assert.Throws(() => repo.Commits.StartingAt("refs/heads/deadbeef")); - Assert.Throws(() => repo.Commits.StartingAt(repo.Branches["deadbeef"])); - Assert.Throws(() => repo.Commits.StartingAt(repo.Refs["refs/heads/deadbeef"])); + Assert.Throws(() => repo.Commits.StartingAt(Constants.UnknownSha)); + Assert.Throws(() => repo.Commits.StartingAt("refs/heads/deadbeef")); + Assert.Throws(() => repo.Commits.StartingAt(repo.Branches["deadbeef"])); + Assert.Throws(() => repo.Commits.StartingAt(repo.Refs["refs/heads/deadbeef"])); } } diff --git a/LibGit2Sharp.Tests/RepositoryFixture.cs b/LibGit2Sharp.Tests/RepositoryFixture.cs index 9f77ff0a2..0b8d342de 100644 --- a/LibGit2Sharp.Tests/RepositoryFixture.cs +++ b/LibGit2Sharp.Tests/RepositoryFixture.cs @@ -57,7 +57,7 @@ private static void AssertInitializedRepository(Repository repo) repo.Info.IsHeadDetached.ShouldBeFalse(); repo.Head.TargetIdentifier.ShouldEqual("refs/heads/master"); repo.Head.ResolveToDirectReference().ShouldBeNull(); - Assert.Throws(() => { var c = repo.Commits; }); + Assert.Throws(() => { var c = repo.Commits; }); } [Test] diff --git a/LibGit2Sharp/CommitCollection.cs b/LibGit2Sharp/CommitCollection.cs index e59337d3e..54030cece 100644 --- a/LibGit2Sharp/CommitCollection.cs +++ b/LibGit2Sharp/CommitCollection.cs @@ -117,7 +117,7 @@ public CommitCollection StartingAt(string shaOrReferenceName) if (gitObj == null) // TODO: Should we check the type? Git-log allows TagAnnotation oid as parameter. But what about Blobs and Trees? { - throw new ArgumentException(string.Format(CultureInfo.InvariantCulture, "No valid object identified as '{0}' has been found in the repository.", shaOrReferenceName), "shaOrReferenceName"); + throw new InvalidOperationException(string.Format(CultureInfo.InvariantCulture, "No valid git object pointed at by '{0}' exists in the repository.", shaOrReferenceName)); } return new CommitCollection(repo, sortOptions) { pushedObjectId = gitObj.Id }; diff --git a/LibGit2Sharp/CommitCollectionExtensions.cs b/LibGit2Sharp/CommitCollectionExtensions.cs index 55ee1efe1..d88c219c8 100644 --- a/LibGit2Sharp/CommitCollectionExtensions.cs +++ b/LibGit2Sharp/CommitCollectionExtensions.cs @@ -20,7 +20,7 @@ public static CommitCollection StartingAt(this CommitCollection commitCollection if (commit == null) { - throw new ArgumentException(string.Format(CultureInfo.InvariantCulture, "No valid object identified as '{0}' has been found in the repository.", branch.CanonicalName), "branch"); + throw new InvalidOperationException(string.Format(CultureInfo.InvariantCulture, "No valid git object pointed at by '{0}' exists in the repository.", branch.CanonicalName)); } return commitCollection.StartingAt(commit.Sha); From 66bc35fa37c0e72a1bf71129dab8d0b299b43b41 Mon Sep 17 00:00:00 2001 From: nulltoken Date: Mon, 23 May 2011 16:57:10 +0200 Subject: [PATCH 30/36] Remove the Count property from the CommitCollection Commit 548b8d9 allows to rely on the Count() Linq extension without any performance penalty. --- LibGit2Sharp.Tests/CommitFixture.cs | 6 +++--- LibGit2Sharp/CommitCollection.cs | 16 ---------------- 2 files changed, 3 insertions(+), 19 deletions(-) diff --git a/LibGit2Sharp.Tests/CommitFixture.cs b/LibGit2Sharp.Tests/CommitFixture.cs index 27e566923..b396c4bec 100644 --- a/LibGit2Sharp.Tests/CommitFixture.cs +++ b/LibGit2Sharp.Tests/CommitFixture.cs @@ -18,7 +18,7 @@ public void CanCountCommits() { using (var repo = new Repository(Constants.TestRepoPath)) { - repo.Commits.Count.ShouldEqual(7); + repo.Commits.Count().ShouldEqual(7); } } @@ -28,11 +28,11 @@ public void CanCorrectlyCountCommitsWhenSwitchingToAnotherBranch() using (var repo = new Repository(Constants.TestRepoPath)) { repo.Branches.Checkout("test"); - repo.Commits.Count.ShouldEqual(2); + repo.Commits.Count().ShouldEqual(2); repo.Commits.First().Id.Sha.ShouldEqual("e90810b8df3e80c413d903f631643c716887138d"); repo.Branches.Checkout("master"); - repo.Commits.Count.ShouldEqual(7); + repo.Commits.Count().ShouldEqual(7); repo.Commits.First().Id.Sha.ShouldEqual("4c062a6361ae6959e06292c1fa5e2822d9c96345"); } } diff --git a/LibGit2Sharp/CommitCollection.cs b/LibGit2Sharp/CommitCollection.cs index 54030cece..c09688657 100644 --- a/LibGit2Sharp/CommitCollection.cs +++ b/LibGit2Sharp/CommitCollection.cs @@ -43,22 +43,6 @@ public Commit this[string sha] get { return repo.Lookup(sha); } } - /// - /// Gets the count of commits (This is a fast count that does not hydrate real commit objects) - /// - public int Count - { - get - { - var count = 0; - using (var enumerator = new CommitEnumerator(repo, pushedObjectId, sortOptions)) - { - while (enumerator.MoveNext()) count++; - } - return count; - } - } - /// /// Gets the current sorting strategy applied when enumerating the collection /// From da2a2c7b76a8dd7f4c660ba0932211d28ad372c7 Mon Sep 17 00:00:00 2001 From: nulltoken Date: Mon, 23 May 2011 21:05:24 +0200 Subject: [PATCH 31/36] Change API to query the history of commits --- LibGit2Sharp.Tests/CommitFixture.cs | 34 ++++++------------ LibGit2Sharp/Branch.cs | 13 +++++-- LibGit2Sharp/CommitCollection.cs | 37 ++++++------------- LibGit2Sharp/CommitCollectionExtensions.cs | 42 ---------------------- LibGit2Sharp/Filter.cs | 34 ++++++++++++++++++ LibGit2Sharp/ICommitCollection.cs | 12 +++++++ LibGit2Sharp/LibGit2Sharp.csproj | 3 +- LibGit2Sharp/Reference.cs | 9 +++++ LibGit2Sharp/Repository.cs | 2 +- 9 files changed, 90 insertions(+), 96 deletions(-) delete mode 100644 LibGit2Sharp/CommitCollectionExtensions.cs create mode 100644 LibGit2Sharp/Filter.cs create mode 100644 LibGit2Sharp/ICommitCollection.cs diff --git a/LibGit2Sharp.Tests/CommitFixture.cs b/LibGit2Sharp.Tests/CommitFixture.cs index b396c4bec..c85888f14 100644 --- a/LibGit2Sharp.Tests/CommitFixture.cs +++ b/LibGit2Sharp.Tests/CommitFixture.cs @@ -67,7 +67,7 @@ public void CanEnumerateCommitsFromSha() int count = 0; using (var repo = new Repository(Constants.TestRepoPath)) { - foreach (var commit in repo.Commits.StartingAt("a4a7dce85cf63874e984719f4fdd239f5145052f")) + foreach (var commit in repo.Commits.QueryBy(new Filter { Since = "a4a7dce85cf63874e984719f4fdd239f5145052f" })) { commit.ShouldNotBeNull(); count++; @@ -81,10 +81,10 @@ public void BuildingACommitCollectionFromUnknownShaOrInvalidReferenceThrows() { using (var repo = new Repository(Constants.TestRepoPath)) { - Assert.Throws(() => repo.Commits.StartingAt(Constants.UnknownSha)); - Assert.Throws(() => repo.Commits.StartingAt("refs/heads/deadbeef")); - Assert.Throws(() => repo.Commits.StartingAt(repo.Branches["deadbeef"])); - Assert.Throws(() => repo.Commits.StartingAt(repo.Refs["refs/heads/deadbeef"])); + Assert.Throws(() => repo.Commits.QueryBy(new Filter { Since = Constants.UnknownSha})); + Assert.Throws(() => repo.Commits.QueryBy(new Filter { Since = "refs/heads/deadbeef"})); + Assert.Throws(() => repo.Commits.QueryBy(new Filter { Since = repo.Branches["deadbeef"]})); + Assert.Throws(() => repo.Commits.QueryBy(new Filter { Since = repo.Refs["refs/heads/deadbeef"] })); } } @@ -95,7 +95,7 @@ public void CanEnumerateCommitsWithReverseTimeSorting() int count = 0; using (var repo = new Repository(Constants.TestRepoPath)) { - foreach (var commit in repo.Commits.StartingAt("a4a7dce85cf63874e984719f4fdd239f5145052f").SortBy(GitSortOptions.Time | GitSortOptions.Reverse)) + foreach (var commit in repo.Commits.QueryBy(new Filter { Since = "a4a7dce85cf63874e984719f4fdd239f5145052f", SortBy = GitSortOptions.Time | GitSortOptions.Reverse })) { commit.ShouldNotBeNull(); commit.Sha.StartsWith(expectedShas[count]); @@ -110,7 +110,7 @@ public void CanEnumerateCommitsWithReverseTopoSorting() { using (var repo = new Repository(Constants.TestRepoPath)) { - var commits = repo.Commits.StartingAt("a4a7dce85cf63874e984719f4fdd239f5145052f").SortBy(GitSortOptions.Topological | GitSortOptions.Reverse).ToList(); + var commits = repo.Commits.QueryBy(new Filter { Since = "a4a7dce85cf63874e984719f4fdd239f5145052f", SortBy = GitSortOptions.Time | GitSortOptions.Reverse }).ToList(); foreach (var commit in commits) { commit.ShouldNotBeNull(); @@ -129,7 +129,7 @@ public void CanEnumerateCommitsWithTimeSorting() int count = 0; using (var repo = new Repository(Constants.TestRepoPath)) { - foreach (var commit in repo.Commits.StartingAt("a4a7dce85cf63874e984719f4fdd239f5145052f").SortBy(GitSortOptions.Time)) + foreach (var commit in repo.Commits.QueryBy(new Filter { Since = "a4a7dce85cf63874e984719f4fdd239f5145052f", SortBy = GitSortOptions.Time })) { commit.ShouldNotBeNull(); commit.Sha.StartsWith(expectedShas[count]); @@ -144,7 +144,7 @@ public void CanEnumerateCommitsWithTopoSorting() { using (var repo = new Repository(Constants.TestRepoPath)) { - var commits = repo.Commits.StartingAt("a4a7dce85cf63874e984719f4fdd239f5145052f").SortBy(GitSortOptions.Topological).ToList(); + var commits = repo.Commits.QueryBy(new Filter { Since = "a4a7dce85cf63874e984719f4fdd239f5145052f", SortBy = GitSortOptions.Topological }).ToList(); foreach (var commit in commits) { commit.ShouldNotBeNull(); @@ -157,18 +157,6 @@ public void CanEnumerateCommitsWithTopoSorting() } } - [Test] - public void CanLookupCommitAlt() - { - using (var repo = new Repository(Constants.TestRepoPath)) - { - var commit = repo.Commits[sha]; - commit.Message.ShouldEqual("testing\n"); - commit.MessageShort.ShouldEqual("testing"); - commit.Sha.ShouldEqual(sha); - } - } - [Test] public void CanLookupCommitGeneric() { @@ -226,7 +214,7 @@ public void PushingEmptyShaThrows() { using (var repo = new Repository(Constants.TestRepoPath)) { - Assert.Throws(() => repo.Commits.StartingAt(string.Empty)); + Assert.Throws(() => repo.Commits.QueryBy(new Filter{Since = string.Empty})); } } @@ -235,7 +223,7 @@ public void PushingNullShaThrows() { using (var repo = new Repository(Constants.TestRepoPath)) { - Assert.Throws(() => repo.Commits.StartingAt((string) null)); + Assert.Throws(() => repo.Commits.QueryBy(new Filter { Since = null })); } } } diff --git a/LibGit2Sharp/Branch.cs b/LibGit2Sharp/Branch.cs index 3918ee6b7..9b0eb9325 100644 --- a/LibGit2Sharp/Branch.cs +++ b/LibGit2Sharp/Branch.cs @@ -70,9 +70,9 @@ public bool IsCurrentRepositoryHead /// /// Gets the commits on this branch. (Starts walking from the References's target). /// - public CommitCollection Commits + public ICommitCollection Commits { - get { return repo.Commits.StartingAt(this); } + get { return repo.Commits.QueryBy(new Filter{Since = this}); } } #region IEquatable Members @@ -149,5 +149,14 @@ private static string ShortenName(string branchName) { return !Equals(left, right); } + + /// + /// Returns the , a representation of the current . + /// + /// The that represents the current . + public override string ToString() + { + return CanonicalName; + } } } \ No newline at end of file diff --git a/LibGit2Sharp/CommitCollection.cs b/LibGit2Sharp/CommitCollection.cs index c09688657..432771547 100644 --- a/LibGit2Sharp/CommitCollection.cs +++ b/LibGit2Sharp/CommitCollection.cs @@ -9,7 +9,7 @@ namespace LibGit2Sharp /// /// A collection of commits in a /// - public class CommitCollection : IEnumerable + public class CommitCollection : ICommitCollection { private readonly Repository repo; private ObjectId pushedObjectId; @@ -35,14 +35,6 @@ internal CommitCollection(Repository repo, GitSortOptions sortingStrategy) sortOptions = sortingStrategy; } - /// - /// Gets the with the specified sha. (This is identical to calling Lookup/(sha) on the repo) - /// - public Commit this[string sha] - { - get { return repo.Lookup(sha); } - } - /// /// Gets the current sorting strategy applied when enumerating the collection /// @@ -79,32 +71,23 @@ IEnumerator IEnumerable.GetEnumerator() #endregion /// - /// Sorts according to the specified strategy. - /// - /// The sorting strategy to be applied when enumerating the commits. - /// - public CommitCollection SortBy(GitSortOptions sortingStrategy) - { - return new CommitCollection(repo, sortingStrategy) { pushedObjectId = pushedObjectId }; - } - - /// - /// Starts enumeratoring the at the specified sha. + /// Returns the list of commits of the repository matching the specified . /// - /// The sha or reference canonical name to use. - /// - public CommitCollection StartingAt(string shaOrReferenceName) + /// The options used to control which commits will be returned. + /// A collection of commits, ready to be enumerated. + public ICommitCollection QueryBy(Filter filter) { - Ensure.ArgumentNotNullOrEmptyString(shaOrReferenceName, "shaOrReferenceName"); + Ensure.ArgumentNotNull(filter, "filter"); + Ensure.ArgumentNotNull(filter.Since, "filter.Since"); - GitObject gitObj = repo.Lookup(shaOrReferenceName); + GitObject gitObj = repo.Lookup(filter.Since.ToString()); if (gitObj == null) // TODO: Should we check the type? Git-log allows TagAnnotation oid as parameter. But what about Blobs and Trees? { - throw new InvalidOperationException(string.Format(CultureInfo.InvariantCulture, "No valid git object pointed at by '{0}' exists in the repository.", shaOrReferenceName)); + throw new InvalidOperationException(string.Format(CultureInfo.InvariantCulture, "No valid git object pointed at by '{0}' exists in the repository.", filter.Since)); } - return new CommitCollection(repo, sortOptions) { pushedObjectId = gitObj.Id }; + return new CommitCollection(repo, filter.SortBy) { pushedObjectId = gitObj.Id }; } #region Nested type: CommitEnumerator diff --git a/LibGit2Sharp/CommitCollectionExtensions.cs b/LibGit2Sharp/CommitCollectionExtensions.cs deleted file mode 100644 index d88c219c8..000000000 --- a/LibGit2Sharp/CommitCollectionExtensions.cs +++ /dev/null @@ -1,42 +0,0 @@ -using System; -using System.Globalization; -using LibGit2Sharp.Core; - -namespace LibGit2Sharp -{ - public static class CommitCollectionExtensions - { - /// - /// Starts enumerating the at the specified branch. - /// - /// The commit collection to enumerate. - /// The branch. - /// - public static CommitCollection StartingAt(this CommitCollection commitCollection, Branch branch) - { - Ensure.ArgumentNotNull(branch, "branch"); - - Commit commit = branch.Tip; - - if (commit == null) - { - throw new InvalidOperationException(string.Format(CultureInfo.InvariantCulture, "No valid git object pointed at by '{0}' exists in the repository.", branch.CanonicalName)); - } - - return commitCollection.StartingAt(commit.Sha); - } - - /// - /// Starts enumerating the at the specified reference. - /// - /// The commit collection to enumerate. - /// The reference. - /// - public static CommitCollection StartingAt(this CommitCollection commitCollection, Reference reference) - { - Ensure.ArgumentNotNull(reference, "reference"); - - return commitCollection.StartingAt(reference.CanonicalName); - } - } -} diff --git a/LibGit2Sharp/Filter.cs b/LibGit2Sharp/Filter.cs new file mode 100644 index 000000000..c1e6c5ecf --- /dev/null +++ b/LibGit2Sharp/Filter.cs @@ -0,0 +1,34 @@ +namespace LibGit2Sharp +{ + /// + /// Options used to filter out the commits of the repository when querying its history. + /// + public class Filter + { + /// + /// Initializes a new instance of . + /// + public Filter() + { + SortBy = GitSortOptions.Time; + Since = "HEAD"; + } + + /// + /// The ordering stragtegy to use. + /// + /// By default, the commits are shown in reverse chronological order. + /// + /// + public GitSortOptions SortBy { get; set; } + + /// + /// The pointer to the commit to consider as a starting point. + /// + /// Can be either a containing the sha or reference canonical name to use, a or a . + /// By default, the will be used as boundary. + /// + /// + public object Since { get; set; } + } +} \ No newline at end of file diff --git a/LibGit2Sharp/ICommitCollection.cs b/LibGit2Sharp/ICommitCollection.cs new file mode 100644 index 000000000..19f8bd7b3 --- /dev/null +++ b/LibGit2Sharp/ICommitCollection.cs @@ -0,0 +1,12 @@ +using System.Collections.Generic; + +namespace LibGit2Sharp +{ + public interface ICommitCollection : IEnumerable + { + /// + /// Gets the current sorting strategy applied when enumerating the collection + /// + GitSortOptions SortedBy { get; } + } +} \ No newline at end of file diff --git a/LibGit2Sharp/LibGit2Sharp.csproj b/LibGit2Sharp/LibGit2Sharp.csproj index a98f3d749..59c8d7a33 100644 --- a/LibGit2Sharp/LibGit2Sharp.csproj +++ b/LibGit2Sharp/LibGit2Sharp.csproj @@ -47,7 +47,6 @@ - @@ -77,10 +76,12 @@ + + diff --git a/LibGit2Sharp/Reference.cs b/LibGit2Sharp/Reference.cs index 8aad7494d..387df15e5 100644 --- a/LibGit2Sharp/Reference.cs +++ b/LibGit2Sharp/Reference.cs @@ -153,5 +153,14 @@ public override int GetHashCode() { return !Equals(left, right); } + + /// + /// Returns the , a representation of the current . + /// + /// The that represents the current . + public override string ToString() + { + return CanonicalName; + } } } \ No newline at end of file diff --git a/LibGit2Sharp/Repository.cs b/LibGit2Sharp/Repository.cs index 34131982d..1f247cfc8 100644 --- a/LibGit2Sharp/Repository.cs +++ b/LibGit2Sharp/Repository.cs @@ -77,7 +77,7 @@ public ReferenceCollection Refs /// public CommitCollection Commits { - get { return commits.StartingAt(Head); } + get { return (CommitCollection)commits.QueryBy(new Filter{Since = Head}); } } /// From 3034aa9bba50d68b21183a2cb812790e99232192 Mon Sep 17 00:00:00 2001 From: nulltoken Date: Tue, 24 May 2011 11:42:33 +0200 Subject: [PATCH 32/36] Allow to query the commit history of an empty repository Fix issue #30. --- LibGit2Sharp.Tests/CommitFixture.cs | 31 +++++-------- LibGit2Sharp.Tests/RepositoryFixture.cs | 7 ++- LibGit2Sharp/CommitCollection.cs | 16 ++++++- LibGit2Sharp/EmptyCommitCollection.cs | 53 ++++++++++++++++++++++ LibGit2Sharp/ICommitCollection.cs | 2 +- LibGit2Sharp/IQueryableCommitCollection.cs | 12 +++++ LibGit2Sharp/LibGit2Sharp.csproj | 2 + LibGit2Sharp/Repository.cs | 8 ++-- 8 files changed, 104 insertions(+), 27 deletions(-) create mode 100644 LibGit2Sharp/EmptyCommitCollection.cs create mode 100644 LibGit2Sharp/IQueryableCommitCollection.cs diff --git a/LibGit2Sharp.Tests/CommitFixture.cs b/LibGit2Sharp.Tests/CommitFixture.cs index c85888f14..4e593d47c 100644 --- a/LibGit2Sharp.Tests/CommitFixture.cs +++ b/LibGit2Sharp.Tests/CommitFixture.cs @@ -77,7 +77,7 @@ public void CanEnumerateCommitsFromSha() } [Test] - public void BuildingACommitCollectionFromUnknownShaOrInvalidReferenceThrows() + public void QueryingTheCommitHistoryWithUnknownShaOrInvalidReferenceThrows() { using (var repo = new Repository(Constants.TestRepoPath)) { @@ -88,6 +88,17 @@ public void BuildingACommitCollectionFromUnknownShaOrInvalidReferenceThrows() } } + [Test] + public void QueryingTheCommitHistoryWithBadParamsThrows() + { + using (var repo = new Repository(Constants.TestRepoPath)) + { + Assert.Throws(() => repo.Commits.QueryBy(new Filter { Since = string.Empty })); + Assert.Throws(() => repo.Commits.QueryBy(new Filter { Since = null })); + Assert.Throws(() => repo.Commits.QueryBy(null)); + } + } + [Test] public void CanEnumerateCommitsWithReverseTimeSorting() { @@ -208,23 +219,5 @@ public void CanReadCommitWithMultipleParents() commit.Parents.Count().ShouldEqual(2); } } - - [Test] - public void PushingEmptyShaThrows() - { - using (var repo = new Repository(Constants.TestRepoPath)) - { - Assert.Throws(() => repo.Commits.QueryBy(new Filter{Since = string.Empty})); - } - } - - [Test] - public void PushingNullShaThrows() - { - using (var repo = new Repository(Constants.TestRepoPath)) - { - Assert.Throws(() => repo.Commits.QueryBy(new Filter { Since = null })); - } - } } } \ No newline at end of file diff --git a/LibGit2Sharp.Tests/RepositoryFixture.cs b/LibGit2Sharp.Tests/RepositoryFixture.cs index 0b8d342de..760b02061 100644 --- a/LibGit2Sharp.Tests/RepositoryFixture.cs +++ b/LibGit2Sharp.Tests/RepositoryFixture.cs @@ -1,5 +1,6 @@ using System; using System.IO; +using System.Linq; using LibGit2Sharp.Tests.TestHelpers; using NUnit.Framework; @@ -57,7 +58,11 @@ private static void AssertInitializedRepository(Repository repo) repo.Info.IsHeadDetached.ShouldBeFalse(); repo.Head.TargetIdentifier.ShouldEqual("refs/heads/master"); repo.Head.ResolveToDirectReference().ShouldBeNull(); - Assert.Throws(() => { var c = repo.Commits; }); + + repo.Commits.Count().ShouldEqual(0); + repo.Commits.QueryBy(new Filter { Since = repo.Head }).Count().ShouldEqual(0); + repo.Commits.QueryBy(new Filter { Since = "HEAD" }).Count().ShouldEqual(0); + repo.Commits.QueryBy(new Filter { Since = "refs/heads/master" }).Count().ShouldEqual(0); } [Test] diff --git a/LibGit2Sharp/CommitCollection.cs b/LibGit2Sharp/CommitCollection.cs index 432771547..3beb3c6ae 100644 --- a/LibGit2Sharp/CommitCollection.cs +++ b/LibGit2Sharp/CommitCollection.cs @@ -9,7 +9,7 @@ namespace LibGit2Sharp /// /// A collection of commits in a /// - public class CommitCollection : ICommitCollection + public class CommitCollection : IQueryableCommitCollection { private readonly Repository repo; private ObjectId pushedObjectId; @@ -80,7 +80,14 @@ public ICommitCollection QueryBy(Filter filter) Ensure.ArgumentNotNull(filter, "filter"); Ensure.ArgumentNotNull(filter.Since, "filter.Since"); - GitObject gitObj = repo.Lookup(filter.Since.ToString()); + string shaOrRefName = filter.Since.ToString(); + + if ((repo.Info.IsEmpty) && PointsAtTheHead(shaOrRefName)) + { + return new EmptyCommitCollection(filter.SortBy); + } + + GitObject gitObj = repo.Lookup(shaOrRefName); if (gitObj == null) // TODO: Should we check the type? Git-log allows TagAnnotation oid as parameter. But what about Blobs and Trees? { @@ -90,6 +97,11 @@ public ICommitCollection QueryBy(Filter filter) return new CommitCollection(repo, filter.SortBy) { pushedObjectId = gitObj.Id }; } + private static bool PointsAtTheHead(string shaOrRefName) + { + return ("HEAD".Equals(shaOrRefName, StringComparison.Ordinal) || "refs/heads/master".Equals(shaOrRefName, StringComparison.Ordinal)); + } + #region Nested type: CommitEnumerator private class CommitEnumerator : IEnumerator diff --git a/LibGit2Sharp/EmptyCommitCollection.cs b/LibGit2Sharp/EmptyCommitCollection.cs new file mode 100644 index 000000000..31d5537b4 --- /dev/null +++ b/LibGit2Sharp/EmptyCommitCollection.cs @@ -0,0 +1,53 @@ +using System.Collections; +using System.Collections.Generic; +using System.Linq; + +namespace LibGit2Sharp +{ + internal class EmptyCommitCollection : IQueryableCommitCollection + { + internal EmptyCommitCollection(GitSortOptions sortedBy) + { + SortedBy = sortedBy; + } + + /// + /// Returns an enumerator that iterates through the collection. + /// + /// + /// A that can be used to iterate through the collection. + /// + /// 1 + public IEnumerator GetEnumerator() + { + return Enumerable.Empty().GetEnumerator(); + } + + /// + /// Returns the list of commits of the repository matching the specified . + /// + /// The options used to control which commits will be returned. + /// A collection of commits, ready to be enumerated. + public ICommitCollection QueryBy(Filter filter) + { + return new EmptyCommitCollection(filter.SortBy); + } + + /// + /// Returns an enumerator that iterates through a collection. + /// + /// + /// An object that can be used to iterate through the collection. + /// + /// 2 + IEnumerator IEnumerable.GetEnumerator() + { + return GetEnumerator(); + } + + /// + /// Gets the current sorting strategy applied when enumerating the collection. + /// + public GitSortOptions SortedBy { get; private set; } + } +} \ No newline at end of file diff --git a/LibGit2Sharp/ICommitCollection.cs b/LibGit2Sharp/ICommitCollection.cs index 19f8bd7b3..2d8633a07 100644 --- a/LibGit2Sharp/ICommitCollection.cs +++ b/LibGit2Sharp/ICommitCollection.cs @@ -5,7 +5,7 @@ namespace LibGit2Sharp public interface ICommitCollection : IEnumerable { /// - /// Gets the current sorting strategy applied when enumerating the collection + /// Gets the current sorting strategy applied when enumerating the collection. /// GitSortOptions SortedBy { get; } } diff --git a/LibGit2Sharp/IQueryableCommitCollection.cs b/LibGit2Sharp/IQueryableCommitCollection.cs new file mode 100644 index 000000000..e4329b285 --- /dev/null +++ b/LibGit2Sharp/IQueryableCommitCollection.cs @@ -0,0 +1,12 @@ +namespace LibGit2Sharp +{ + public interface IQueryableCommitCollection : ICommitCollection + { + /// + /// Returns the list of commits of the repository matching the specified . + /// + /// The options used to control which commits will be returned. + /// A collection of commits, ready to be enumerated. + ICommitCollection QueryBy(Filter filter); + } +} \ No newline at end of file diff --git a/LibGit2Sharp/LibGit2Sharp.csproj b/LibGit2Sharp/LibGit2Sharp.csproj index 59c8d7a33..07eb65fa8 100644 --- a/LibGit2Sharp/LibGit2Sharp.csproj +++ b/LibGit2Sharp/LibGit2Sharp.csproj @@ -71,6 +71,7 @@ + @@ -82,6 +83,7 @@ + diff --git a/LibGit2Sharp/Repository.cs b/LibGit2Sharp/Repository.cs index 1f247cfc8..bd6f88496 100644 --- a/LibGit2Sharp/Repository.cs +++ b/LibGit2Sharp/Repository.cs @@ -49,7 +49,7 @@ internal RepositorySafeHandle Handle /// Shortcut to return the reference to HEAD /// /// - + public Reference Head { get { return Refs["HEAD"]; } @@ -75,9 +75,9 @@ public ReferenceCollection Refs /// Lookup and enumerate commits in the repository. /// Iterating this collection directly starts walking from the HEAD. /// - public CommitCollection Commits + public IQueryableCommitCollection Commits { - get { return (CommitCollection)commits.QueryBy(new Filter{Since = Head}); } + get { return (IQueryableCommitCollection)commits.QueryBy(new Filter { Since = Head }); } } /// @@ -219,7 +219,7 @@ public GitObject Lookup(string shaOrReferenceName, GitObjectType type = GitObjec private static bool IsReferencePeelable(Reference reference) { - return reference != null && ((reference is DirectReference) ||(reference is SymbolicReference && ((SymbolicReference)reference).Target != null)); + return reference != null && ((reference is DirectReference) || (reference is SymbolicReference && ((SymbolicReference)reference).Target != null)); } } } \ No newline at end of file From 1125c041af786ed133b886ba7ffb0a82b63c3203 Mon Sep 17 00:00:00 2001 From: nulltoken Date: Tue, 24 May 2011 15:13:49 +0200 Subject: [PATCH 33/36] Allow to query the commit history by specifying two named commits as boundaries --- LibGit2Sharp.Tests/CommitFixture.cs | 12 ++++++++ LibGit2Sharp/CommitCollection.cs | 48 +++++++++++++++++++++++------ LibGit2Sharp/Core/NativeMethods.cs | 3 ++ LibGit2Sharp/Filter.cs | 9 ++++++ 4 files changed, 62 insertions(+), 10 deletions(-) diff --git a/LibGit2Sharp.Tests/CommitFixture.cs b/LibGit2Sharp.Tests/CommitFixture.cs index 4e593d47c..b275cc275 100644 --- a/LibGit2Sharp.Tests/CommitFixture.cs +++ b/LibGit2Sharp.Tests/CommitFixture.cs @@ -168,6 +168,18 @@ public void CanEnumerateCommitsWithTopoSorting() } } + [Test] + public void CanEnumerateUsingTwoCommitsAsBoundaries() + { + using (var repo = new Repository(Constants.TestRepoPath)) + { + var commits = repo.Commits.QueryBy(new Filter { Since = "refs/heads/br2", Until = "refs/heads/packed-test" }); + + IEnumerable abbrevShas = commits.Select(c => c.Id.Sha.Substring(0, 7)).ToArray(); + CollectionAssert.AreEquivalent(new[] { "a4a7dce", "c47800c", "9fd738e" }, abbrevShas); + } + } + [Test] public void CanLookupCommitGeneric() { diff --git a/LibGit2Sharp/CommitCollection.cs b/LibGit2Sharp/CommitCollection.cs index 3beb3c6ae..35d3be7a4 100644 --- a/LibGit2Sharp/CommitCollection.cs +++ b/LibGit2Sharp/CommitCollection.cs @@ -13,6 +13,7 @@ public class CommitCollection : IQueryableCommitCollection { private readonly Repository repo; private ObjectId pushedObjectId; + private ObjectId hiddenObjectId; private readonly GitSortOptions sortOptions; /// @@ -53,10 +54,10 @@ public IEnumerator GetEnumerator() { if (pushedObjectId == null) { - throw new NotImplementedException(); + throw new InvalidOperationException(); } - return new CommitEnumerator(repo, pushedObjectId, sortOptions); + return new CommitEnumerator(repo, pushedObjectId, hiddenObjectId, sortOptions); } /// @@ -80,21 +81,35 @@ public ICommitCollection QueryBy(Filter filter) Ensure.ArgumentNotNull(filter, "filter"); Ensure.ArgumentNotNull(filter.Since, "filter.Since"); - string shaOrRefName = filter.Since.ToString(); + string sinceIdentifier = filter.Since.ToString(); - if ((repo.Info.IsEmpty) && PointsAtTheHead(shaOrRefName)) + if ((repo.Info.IsEmpty) && PointsAtTheHead(sinceIdentifier)) { return new EmptyCommitCollection(filter.SortBy); - } + } + + ObjectId sinceObjectId = RetrieveCommitId(sinceIdentifier); + ObjectId untilObjectId = null; + + if (filter.Until != null) + { + untilObjectId = RetrieveCommitId(filter.Until.ToString()); + } + + return new CommitCollection(repo, filter.SortBy) { pushedObjectId = sinceObjectId, hiddenObjectId = untilObjectId}; + } - GitObject gitObj = repo.Lookup(shaOrRefName); + private ObjectId RetrieveCommitId(string shaOrReferenceName) + { + GitObject gitObj = repo.Lookup(shaOrReferenceName); - if (gitObj == null) // TODO: Should we check the type? Git-log allows TagAnnotation oid as parameter. But what about Blobs and Trees? + // TODO: Should we check the type? Git-log allows TagAnnotation oid as parameter. But what about Blobs and Trees? + if (gitObj == null) { - throw new InvalidOperationException(string.Format(CultureInfo.InvariantCulture, "No valid git object pointed at by '{0}' exists in the repository.", filter.Since)); + throw new InvalidOperationException(string.Format(CultureInfo.InvariantCulture, "No valid git object pointed at by '{0}' exists in the repository.", shaOrReferenceName)); } - return new CommitCollection(repo, filter.SortBy) { pushedObjectId = gitObj.Id }; + return gitObj.Id; } private static bool PointsAtTheHead(string shaOrRefName) @@ -110,7 +125,7 @@ private class CommitEnumerator : IEnumerator private readonly RevWalkerSafeHandle handle; private ObjectId currentOid; - public CommitEnumerator(Repository repo, ObjectId pushedOid, GitSortOptions sortingStrategy) + public CommitEnumerator(Repository repo, ObjectId pushedOid, ObjectId hiddenOid, GitSortOptions sortingStrategy) { this.repo = repo; int res = NativeMethods.git_revwalk_new(out handle, repo.Handle); @@ -118,6 +133,7 @@ public CommitEnumerator(Repository repo, ObjectId pushedOid, GitSortOptions sort Sort(sortingStrategy); Push(pushedOid); + Hide(hiddenOid); } #region IEnumerator Members @@ -187,6 +203,18 @@ private void Push(ObjectId pushedOid) Ensure.Success(res); } + private void Hide(ObjectId hiddenOid) + { + if (hiddenOid == null) + { + return; + } + + var oid = hiddenOid.Oid; + int res = NativeMethods.git_revwalk_hide(handle, ref oid); + Ensure.Success(res); + } + private void Sort(GitSortOptions options) { NativeMethods.git_revwalk_sorting(handle, options); diff --git a/LibGit2Sharp/Core/NativeMethods.cs b/LibGit2Sharp/Core/NativeMethods.cs index c51e2d465..794406c95 100644 --- a/LibGit2Sharp/Core/NativeMethods.cs +++ b/LibGit2Sharp/Core/NativeMethods.cs @@ -159,6 +159,9 @@ internal static class NativeMethods [DllImport(libgit2)] public static extern void git_revwalk_free(IntPtr walker); + [DllImport(libgit2)] + public static extern int git_revwalk_hide(RevWalkerSafeHandle walker, ref GitOid oid); + [DllImport(libgit2)] public static extern int git_revwalk_new(out RevWalkerSafeHandle walker, RepositorySafeHandle repo); diff --git a/LibGit2Sharp/Filter.cs b/LibGit2Sharp/Filter.cs index c1e6c5ecf..5985ddf30 100644 --- a/LibGit2Sharp/Filter.cs +++ b/LibGit2Sharp/Filter.cs @@ -30,5 +30,14 @@ public Filter() /// /// public object Since { get; set; } + + + /// + /// The pointer to the commit which will be excluded (along with its ancestors) from the enumeration. + /// + /// Can be either a containing the sha or reference canonical name to use, a or a . + /// + /// + public object Until { get; set; } } } \ No newline at end of file From 8fb8bfb5833ad02f419bf451430e6a9c26453572 Mon Sep 17 00:00:00 2001 From: nulltoken Date: Tue, 24 May 2011 17:17:17 +0200 Subject: [PATCH 34/36] Update backlog --- backlog.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/backlog.md b/backlog.md index 2f6074ce8..40f9479dd 100644 --- a/backlog.md +++ b/backlog.md @@ -4,8 +4,6 @@ - Build a LibGit2Sharp.Sample NuGet package - Publish source and PDBs at symbolsource.org (cf. http://blog.davidebbo.com/2011/04/easy-way-to-publish-nuget-packages-with.html and http://nuget.codeplex.com/discussions/257709) - - Bind git_revwalk_hide() as CommitCollection.Until() - - Fix FluentInterface .StartingAt() and .Until() in order to prevent .StartIngAt().StartingAt(), .Until().Until() and .Until().StartingAt() - Add to Epoch a DateTimeOffset extension method ToRelativeFormat() in order to show dates relative to the current time, e.g. "2 hours ago". (cf. https://github.com/git/git/blob/master/date.c#L89) - Add branch renaming (public Branch Move(string oldName, string newName, bool allowOverwrite = false)) - Turn duplicated strings "refs/xxx" into properties of a generic Constants helper type From c8ccded4ee47d8f055ef17c2f80b001424cca03a Mon Sep 17 00:00:00 2001 From: nulltoken Date: Tue, 24 May 2011 19:58:13 +0200 Subject: [PATCH 35/36] Update libgit2 binaries to 4191d52 --- Lib/git2-0.dll | Bin 0 -> 138752 bytes Lib/git2.dll | Bin 149504 -> 0 bytes LibGit2Sharp/Core/GitErrorCode.cs | 62 +++++++++++------------ LibGit2Sharp/Core/NativeMethods.cs | 2 +- LibGit2Sharp/Core/UnSafeNativeMethods.cs | 2 +- LibGit2Sharp/LibGit2Sharp.csproj | 8 +-- libgit2 | 2 +- 7 files changed, 39 insertions(+), 37 deletions(-) create mode 100644 Lib/git2-0.dll delete mode 100644 Lib/git2.dll diff --git a/Lib/git2-0.dll b/Lib/git2-0.dll new file mode 100644 index 0000000000000000000000000000000000000000..82a3754bfa1612ad4d3d048750049da122850660 GIT binary patch literal 138752 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

gn8dlTeUr-MJ_iVLCUs9o<9I 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

0=4x_fWk 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 literal 0 HcmV?d00001 diff --git a/Lib/git2.dll b/Lib/git2.dll deleted file mode 100644 index 3b2f252ea0937f4964be959df5a939f34905448e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 149504 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 /// Input was not a properly formatted Git object id. ///

- GIT_ENOTOID = (GIT_ERROR - 1), + GIT_ENOTOID = -2, /// /// Input does not exist in the scope searched. /// - GIT_ENOTFOUND = (GIT_ERROR - 2), + GIT_ENOTFOUND = -3, /// /// Not enough space available. /// - GIT_ENOMEM = (GIT_ERROR - 3), + GIT_ENOMEM = -4, /// /// Consult the OS error information. /// - GIT_EOSERR = (GIT_ERROR - 4), + GIT_EOSERR = -5, /// /// The specified object is of invalid type /// - GIT_EOBJTYPE = (GIT_ERROR - 5), - - /// - /// The specified object has its data corrupted - /// - GIT_EOBJCORRUPTED = (GIT_ERROR - 6), + GIT_EOBJTYPE = -6, /// /// The specified repository is invalid /// - GIT_ENOTAREPO = (GIT_ERROR - 7), + GIT_ENOTAREPO = -7, /// /// The object type is invalid or doesn't match /// - GIT_EINVALIDTYPE = (GIT_ERROR - 8), + GIT_EINVALIDTYPE = -8, /// /// The object cannot be written that because it's missing internal data /// - GIT_EMISSINGOBJDATA = (GIT_ERROR - 9), + GIT_EMISSINGOBJDATA = -9, /// /// The packfile for the ODB is corrupted /// - GIT_EPACKCORRUPTED = (GIT_ERROR - 10), + GIT_EPACKCORRUPTED = -10, /// /// Failed to adquire or release a file lock /// - GIT_EFLOCKFAIL = (GIT_ERROR - 11), + GIT_EFLOCKFAIL = -11, /// /// The Z library failed to inflate/deflate an object's data /// - GIT_EZLIB = (GIT_ERROR - 12), + GIT_EZLIB = -12, /// /// The queried object is currently busy /// - GIT_EBUSY = (GIT_ERROR - 13), + GIT_EBUSY = -13, /// /// The index file is not backed up by an existing repository /// - GIT_EBAREINDEX = (GIT_ERROR - 14), + GIT_EBAREINDEX = -14, /// /// The name of the reference is not valid /// - GIT_EINVALIDREFNAME = (GIT_ERROR - 15), + GIT_EINVALIDREFNAME = -15, /// /// The specified reference has its data corrupted /// - GIT_EREFCORRUPTED = (GIT_ERROR - 16), + GIT_EREFCORRUPTED = -16, /// /// The specified symbolic reference is too deeply nested /// - GIT_ETOONESTEDSYMREF = (GIT_ERROR - 17), + GIT_ETOONESTEDSYMREF = -17, /// /// The pack-refs file is either corrupted of its format is not currently supported /// - GIT_EPACKEDREFSCORRUPTED = (GIT_ERROR - 18), + GIT_EPACKEDREFSCORRUPTED = -18, /// /// The path is invalid /// - GIT_EINVALIDPATH = (GIT_ERROR - 19), + GIT_EINVALIDPATH = -19, /// /// The revision walker is empty; there are no more commits left to iterate /// - GIT_EREVWALKOVER = (GIT_ERROR - 20), + GIT_EREVWALKOVER = -20, /// /// The state of the reference is not valid /// - GIT_EINVALIDREFSTATE = (GIT_ERROR - 21), + GIT_EINVALIDREFSTATE = -21, /// /// This feature has not been implemented yet /// - GIT_ENOTIMPLEMENTED = (GIT_ERROR - 22), + GIT_ENOTIMPLEMENTED = -22, /// /// A reference with this name already exists /// - GIT_EEXISTS = (GIT_ERROR - 23), + GIT_EEXISTS = -23, /// /// The given integer literal is too large to be parsed /// - GIT_EOVERFLOW = (GIT_ERROR - 24), + GIT_EOVERFLOW = -24, /// /// The given literal is not a valid number /// - GIT_ENOTNUM = (GIT_ERROR - 25), + GIT_ENOTNUM = -25, /// /// Streaming error /// - GIT_ESTREAM = (GIT_ERROR - 26), + GIT_ESTREAM = -26, /// /// invalid arguments to function /// - GIT_EINVALIDARGS = (GIT_ERROR - 27), + GIT_EINVALIDARGS = -27, + + /// + /// The specified object has its data corrupted + /// + GIT_EOBJCORRUPTED = -28, } } \ No newline at end of file diff --git a/LibGit2Sharp/Core/NativeMethods.cs b/LibGit2Sharp/Core/NativeMethods.cs index 794406c95..7cddc630e 100644 --- a/LibGit2Sharp/Core/NativeMethods.cs +++ b/LibGit2Sharp/Core/NativeMethods.cs @@ -5,7 +5,7 @@ namespace LibGit2Sharp.Core { internal static class NativeMethods { - const string libgit2 = "git2.dll"; + const string libgit2 = "git2-0.dll"; [DllImport(libgit2)] public static extern IntPtr git_blob_rawcontent(IntPtr blob); diff --git a/LibGit2Sharp/Core/UnSafeNativeMethods.cs b/LibGit2Sharp/Core/UnSafeNativeMethods.cs index c6d6c79de..6c5b85753 100644 --- a/LibGit2Sharp/Core/UnSafeNativeMethods.cs +++ b/LibGit2Sharp/Core/UnSafeNativeMethods.cs @@ -5,7 +5,7 @@ namespace LibGit2Sharp.Core { internal static unsafe class UnSafeNativeMethods { - private const string libgit2 = "git2.dll"; + private const string libgit2 = "git2-0.dll"; [DllImport(libgit2)] public static extern int git_reference_listall(git_strarray* array, RepositorySafeHandle repo, GitReferenceType flags); diff --git a/LibGit2Sharp/LibGit2Sharp.csproj b/LibGit2Sharp/LibGit2Sharp.csproj index 07eb65fa8..66db0fbeb 100644 --- a/LibGit2Sharp/LibGit2Sharp.csproj +++ b/LibGit2Sharp/LibGit2Sharp.csproj @@ -103,11 +103,13 @@ - - git2.dll + + + + + git2-0.dll PreserveNewest - diff --git a/libgit2 b/libgit2 index f02f4b536..4191d5292 160000 --- a/libgit2 +++ b/libgit2 @@ -1 +1 @@ -Subproject commit f02f4b536cfb5170a8ddc6d0e3b47631defd55ef +Subproject commit 4191d529245084fa92e869aadda72dd740403d3a From 0e09872063b5238a39f31c322410d12253c96ccb Mon Sep 17 00:00:00 2001 From: nulltoken Date: Tue, 24 May 2011 20:21:33 +0200 Subject: [PATCH 36/36] Release LibGit2Sharp v0.2.0 --- CHANGELOG.md | 9 +++++ CI-build.msbuild | 52 ++++++++++++------------- LibGit2Sharp/Properties/AssemblyInfo.cs | 4 +- nuget.package/LibGit2Sharp.nuspec | 4 +- 4 files changed, 39 insertions(+), 30 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f8766572a..a89ac53a6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,14 @@ # LibGit2Sharp releases +## v0.2.0 + + - [Fix] Fix Repository.Info.IsEmpty + - [Fix] Fix default CommitCollection sorting behavior + - [Fix] Fix creation of reference to prevent it from choking on corrupted ones + - [Fix] Fix interop issue in a IIS hosted application + - [Upd] Update CommitCollection API to query commits + - [Upd] Update libgit2 binaries to 4191d52 + ## v0.1.1 - [Fix] Fix NuGet packaging diff --git a/CI-build.msbuild b/CI-build.msbuild index db091172a..81be16c6d 100644 --- a/CI-build.msbuild +++ b/CI-build.msbuild @@ -1,35 +1,35 @@ - - - - - Release + + - $(MSBuildProjectDirectory)\LibGit2Sharp\obj\ - $(MSBuildProjectDirectory)\LibGit2Sharp.Tests\obj\ - $(MSBuildProjectDirectory)\build\ - - - - - - + + Release - - - - - - - $(MSBuildProjectDirectory)\LibGit2Sharp\obj\ + $(MSBuildProjectDirectory)\LibGit2Sharp.Tests\obj\ + $(MSBuildProjectDirectory)\build\ + + + + + + + + + + + + + + - - - - + + + - + \ No newline at end of file diff --git a/LibGit2Sharp/Properties/AssemblyInfo.cs b/LibGit2Sharp/Properties/AssemblyInfo.cs index 691ebf24d..3ef680950 100644 --- a/LibGit2Sharp/Properties/AssemblyInfo.cs +++ b/LibGit2Sharp/Properties/AssemblyInfo.cs @@ -41,5 +41,5 @@ // by using the '*' as shown below: // [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("0.1.1")] -[assembly: AssemblyFileVersion("0.1.1")] \ No newline at end of file +[assembly: AssemblyVersion("0.2.0")] +[assembly: AssemblyFileVersion("0.2.0")] \ No newline at end of file diff --git a/nuget.package/LibGit2Sharp.nuspec b/nuget.package/LibGit2Sharp.nuspec index 49a6c85cb..1dc2dc502 100644 --- a/nuget.package/LibGit2Sharp.nuspec +++ b/nuget.package/LibGit2Sharp.nuspec @@ -2,7 +2,7 @@ LibGit2Sharp - 0.1.1 + 0.2.0 LibGit2Sharp contributors nulltoken https://github.com/libgit2/libgit2sharp/raw/master/LICENSE.md @@ -15,7 +15,7 @@ - +