From 81537dcae5fd8fb32a4ce88f5d648d4d500ea335 Mon Sep 17 00:00:00 2001 From: Matt Burke Date: Tue, 28 Jul 2009 14:25:41 -0400 Subject: [PATCH] Refactored to make the code better. --- GitTfs/Core/GitRepository.cs | 2 ++ GitTfs/Core/GitTfsRemote.cs | 66 +++++++++++++++++++++--------------- GitTfs/Core/TfsChangeset.cs | 2 +- GitTfs/Core/TfsHelper.cs | 2 +- 4 files changed, 43 insertions(+), 29 deletions(-) diff --git a/GitTfs/Core/GitRepository.cs b/GitTfs/Core/GitRepository.cs index 8e09002d..68940577 100644 --- a/GitTfs/Core/GitRepository.cs +++ b/GitTfs/Core/GitRepository.cs @@ -132,6 +132,8 @@ namespace Sep.Git.Tfs.Core } catch (GitCommandException e) { + Trace.WriteLine("No head named " + head + " was found: " + e); + // There is no head. return null; } } diff --git a/GitTfs/Core/GitTfsRemote.cs b/GitTfs/Core/GitTfsRemote.cs index 59955ff2..d1cdab8b 100644 --- a/GitTfs/Core/GitTfsRemote.cs +++ b/GitTfs/Core/GitTfsRemote.cs @@ -10,9 +10,14 @@ namespace Sep.Git.Tfs.Core { public class GitTfsRemote { + private static readonly Regex isInDotGit = new Regex("(?:^|/)\\.git(?:/|$)"); + private static readonly Regex treeShaRegex = new Regex("^tree (" + GitTfsConstants.Sha1 + ")"); + private readonly Globals globals; private readonly TextWriter stdout; private readonly RemoteOptions remoteOptions; + private long? maxChangesetId; + private string maxCommitHash; public GitTfsRemote(RemoteOptions remoteOptions, Globals globals, ITfsHelper tfsHelper, TextWriter stdout) { @@ -24,18 +29,16 @@ namespace Sep.Git.Tfs.Core public string Id { get; set; } public string TfsRepositoryPath { get; set; } - public string IgnoreRegex { get; set; } + public string IgnoreRegexExpression { get; set; } public IGitRepository Repository { get; set; } public ITfsHelper Tfs { get; set; } - private long? maxChangesetId; public long MaxChangesetId { get { InitHistory(); return maxChangesetId.Value; } set { maxChangesetId = value; } } - private string maxCommitHash; public string MaxCommitHash { get { InitHistory(); return maxCommitHash; } @@ -75,13 +78,21 @@ namespace Sep.Git.Tfs.Core } } - public bool IsIgnored(string path) + public bool ShouldSkip(string path) { - var inDotGit = new Regex("(?:^|/)\\.git(?:/|$)"); - if(inDotGit.IsMatch(path)) return true; - if(IgnoreRegex != null && new Regex(IgnoreRegex).IsMatch(path)) return true; - if(remoteOptions.IgnoreRegex != null && new Regex(remoteOptions.IgnoreRegex).IsMatch(path)) return true; - return false; + return IsInDotGit(path) || + IsIgnored(path, IgnoreRegexExpression) || + IsIgnored(path, remoteOptions.IgnoreRegex); + } + + private bool IsIgnored(string path, string expression) + { + return expression != null && new Regex(expression).IsMatch(path); + } + + private bool IsInDotGit(string path) + { + return isInDotGit.IsMatch(path); } public string GetPathInGitRepo(string tfsPath) @@ -97,7 +108,7 @@ namespace Sep.Git.Tfs.Core { foreach (var changeset in Tfs.GetChangesets(this).OrderBy(cs => cs.Summary.ChangesetId)) { - AssertIndexClean(MaxCommitHash); + AssertTemporaryIndexClean(MaxCommitHash); var log = Apply(MaxCommitHash, changeset); MaxCommitHash = Commit(log); stdout.WriteLine("C" + changeset.Summary.ChangesetId + " = " + MaxCommitHash); @@ -121,33 +132,34 @@ namespace Sep.Git.Tfs.Core } } - private void AssertIndexClean(string treeish) + private void AssertTemporaryIndexClean(string treeish) { if(string.IsNullOrEmpty(treeish)) { if (File.Exists(IndexFile)) File.Delete(IndexFile); return; } - var treeShaRegex = new Regex("^tree (" + GitTfsConstants.Sha1 + ")"); - WithTemporaryIndex(() => + WithTemporaryIndex(() => AssertIndexClean(treeish)); + } + + private void AssertIndexClean(string treeish) + { + if (!File.Exists(IndexFile)) Repository.CommandNoisy("read-tree", treeish); + var currentTree = Repository.CommandOneline("write-tree"); + var expectedCommitInfo = Repository.Command("cat-file", "commit", treeish); + var expectedCommitTree = GitTfsRemote.treeShaRegex.Match(expectedCommitInfo).Groups[1].Value; + if (expectedCommitTree != currentTree) { - if (!File.Exists(IndexFile)) Repository.CommandNoisy("read-tree", treeish); - var currentTree = Repository.CommandOneline("write-tree"); - var expectedCommitInfo = Repository.Command("cat-file", "commit", treeish); - var expectedCommitTree = treeShaRegex.Match(expectedCommitInfo).Groups[1].Value; + Trace.WriteLine("Index mismatch: " + expectedCommitTree + " != " + currentTree); + Trace.WriteLine("rereading " + treeish); + File.Delete(IndexFile); + Repository.CommandNoisy("read-tree", treeish); + currentTree = Repository.CommandOneline("write-tree"); if (expectedCommitTree != currentTree) { - Trace.WriteLine("Index mismatch: " + expectedCommitTree + " != " + currentTree); - Trace.WriteLine("rereading " + treeish); - File.Delete(IndexFile); - Repository.CommandNoisy("read-tree", treeish); - currentTree = Repository.CommandOneline("write-tree"); - if (expectedCommitTree != currentTree) - { - throw new Exception("Unable to create a clean temporary index: trees (" + treeish + ") " + expectedCommitTree + " != " + currentTree); - } + throw new Exception("Unable to create a clean temporary index: trees (" + treeish + ") " + expectedCommitTree + " != " + currentTree); } - }); + } } private LogEntry Apply(string lastCommit, ITfsChangeset changeset) diff --git a/GitTfs/Core/TfsChangeset.cs b/GitTfs/Core/TfsChangeset.cs index c0451e14..90b130f3 100644 --- a/GitTfs/Core/TfsChangeset.cs +++ b/GitTfs/Core/TfsChangeset.cs @@ -23,7 +23,7 @@ namespace Sep.Git.Tfs.Core foreach(var change in changeset.Changes) { var pathInGitRepo = Summary.Remote.GetPathInGitRepo(change.Item.ServerItem); - if(pathInGitRepo == null || Summary.Remote.IsIgnored(pathInGitRepo)) + if(pathInGitRepo == null || Summary.Remote.ShouldSkip(pathInGitRepo)) continue; if (change.ChangeType.IncludesOneOf(ChangeType.Add, ChangeType.Edit, ChangeType.Rename, ChangeType.Undelete, ChangeType.Branch, ChangeType.Merge)) { diff --git a/GitTfs/Core/TfsHelper.cs b/GitTfs/Core/TfsHelper.cs index 084f2962..e1551424 100644 --- a/GitTfs/Core/TfsHelper.cs +++ b/GitTfs/Core/TfsHelper.cs @@ -14,7 +14,7 @@ namespace Sep.Git.Tfs.Core public string TfsClientLibraryVersion { - get { return typeof(TeamFoundationServer).Assembly.GetName().Version.ToString(); } + get { return typeof(TeamFoundationServer).Assembly.GetName().Version.ToString() + " (MS)"; } } public string Url