@@ -21,34 +21,20 @@ public ProjectDiffExecutor(ProjectDiffExecutorOptions options, ILoggerFactory? l
2121 }
2222
2323 public async Task < ProjectDiffResult > GetProjectDiff (
24- string repositoryPath ,
25- IEntrypointProvider entrypointProvider ,
24+ Repository repository ,
25+ IProjectGraphEntryPointProvider projectGraphEntryPointProvider ,
2626 string baseCommitRef = "HEAD" ,
2727 string ? headCommitRef = null ,
2828 CancellationToken cancellationToken = default
2929 )
3030 {
31- _logger . LogDebug ( "Discovering repository from path '{Path}'" , repositoryPath ) ;
32- var repoPath = Repository . Discover ( repositoryPath ) ;
33- if ( repoPath is null )
31+ if ( repository . Info . IsShallow )
3432 {
35- _logger . LogError ( "Could not find a Git repository for path '{Path}'" , repositoryPath ) ;
36- return new ProjectDiffResult
37- {
38- Status = ProjectDiffExecutionStatus . RepositoryNotFound
39- } ;
40- }
41-
42- _logger . LogDebug ( "Found repository at '{RepoPath}'" , repoPath ) ;
43-
44- using var repo = new Repository ( repoPath ) ;
45- if ( repo . Info . IsShallow )
46- {
47- _logger . LogWarning ( "Repository at is shallow, some operations may not work as expected" ) ;
33+ _logger . LogWarning ( "Repository is shallow, some operations may not work as expected" ) ;
4834 }
4935
5036 _logger . LogDebug ( "Looking up base commit '{BaseCommitRef}'" , baseCommitRef ) ;
51- var baseCommit = repo . Lookup < Commit > ( baseCommitRef ) ;
37+ var baseCommit = repository . Lookup < Commit > ( baseCommitRef ) ;
5238 if ( baseCommit is null )
5339 {
5440 _logger . LogError ( "Base commit '{BaseCommitRef}' not found in repository" , baseCommitRef ) ;
@@ -62,7 +48,7 @@ public async Task<ProjectDiffResult> GetProjectDiff(
6248 if ( headCommitRef is not null )
6349 {
6450 _logger . LogDebug ( "Looking up head commit '{HeadCommitRef}'" , headCommitRef ) ;
65- headCommit = repo . Lookup < Commit > ( headCommitRef ) ;
51+ headCommit = repository . Lookup < Commit > ( headCommitRef ) ;
6652
6753 if ( headCommit is null )
6854 {
@@ -86,13 +72,14 @@ public async Task<ProjectDiffResult> GetProjectDiff(
8672 baseCommitRef ,
8773 headCommitRef
8874 ) ;
89- var mergeBaseCommit = repo . ObjectDatabase . FindMergeBase ( baseCommit , headCommit ?? repo . Head . Tip ) ;
75+ var head = headCommit ?? repository . Head . Tip ;
76+ var mergeBaseCommit = repository . ObjectDatabase . FindMergeBase ( baseCommit , head ) ;
9077 if ( mergeBaseCommit is null )
9178 {
9279 _logger . LogError (
9380 "Could not find merge base between base commit '{BaseCommitRef}' and head commit '{HeadCommitRef}'" ,
9481 baseCommitRef ,
95- headCommitRef
82+ head . Sha
9683 ) ;
9784 return new ProjectDiffResult
9885 {
@@ -113,11 +100,10 @@ public async Task<ProjectDiffResult> GetProjectDiff(
113100 baseCommitRef ,
114101 headCommitRef ?? "working directory"
115102 ) ;
116- var changedFiles = GetGitModifiedFiles ( repo , baseCommit , headCommit )
103+ var changedFiles = GetGitModifiedFiles ( repository , baseCommit , headCommit )
117104 . Where ( ShouldIncludeFile )
118105 . ToList ( ) ;
119106
120-
121107 if ( changedFiles . Count == 0 )
122108 {
123109 _logger . LogInformation (
@@ -133,7 +119,6 @@ public async Task<ProjectDiffResult> GetProjectDiff(
133119 } ;
134120 }
135121
136-
137122 _logger . LogInformation ( "Found {NumChangedFiles} changed files" , changedFiles . Count ) ;
138123 if ( _logger . IsEnabled ( LogLevel . Debug ) )
139124 {
@@ -142,56 +127,32 @@ public async Task<ProjectDiffResult> GetProjectDiff(
142127
143128 var projectGraphFactory = new ProjectGraphFactory ( _loggerFactory ) ;
144129
145- var baseGraph = await projectGraphFactory . BuildForGitTree (
146- repo ,
147- baseCommit . Tree ,
148- entrypointProvider ,
149- cancellationToken
150- ) ;
151- _logger . LogInformation (
152- "Base project graph built with {NumProjects} projects" ,
153- baseGraph . ProjectNodes . Count
154- ) ;
155-
156- ProjectGraph headGraph ;
157- if ( headCommit is null )
130+ BuildGraph baseBuildGraph ;
131+ using ( _logger . BeginScope ( "Building base graph" ) )
158132 {
159- headGraph = await projectGraphFactory . BuildForWorkingDirectory (
160- repo ,
161- entrypointProvider ,
133+ baseBuildGraph = await CreateBuildGraph (
134+ repository ,
135+ projectGraphFactory ,
136+ projectGraphEntryPointProvider ,
137+ baseCommit ,
162138 cancellationToken
163139 ) ;
164140 }
165- else
141+
142+ BuildGraph headBuildGraph ;
143+ using ( _logger . BeginScope ( "Building head graph" ) )
166144 {
167- headGraph = await projectGraphFactory . BuildForGitTree (
168- repo ,
169- headCommit . Tree ,
170- entrypointProvider ,
145+ headBuildGraph = await CreateBuildGraph (
146+ repository ,
147+ projectGraphFactory ,
148+ projectGraphEntryPointProvider ,
149+ headCommit ,
171150 cancellationToken
172151 ) ;
173152 }
174153
175- _logger . LogInformation (
176- "Head project graph built with {NumProjects} projects" ,
177- headGraph . ProjectNodes . Count
178- ) ;
179-
180-
181- var headBuildGraph = BuildGraphFactory . CreateForProjectGraph (
182- headGraph ,
183- repo ,
184- _options . IgnoreChangedFiles
185- ) ;
186- var baseBuildGraph = BuildGraphFactory . CreateForProjectGraph (
187- baseGraph ,
188- repo ,
189- _options . IgnoreChangedFiles
190- ) ;
191154
192- var projects = BuildGraphDiff . Diff ( baseBuildGraph , headBuildGraph , changedFiles , _loggerFactory )
193- . OrderBy ( it => it . ReferencedProjects . Count )
194- . ThenBy ( it => it . Name ) ;
155+ var projects = BuildGraphDiff . Diff ( baseBuildGraph , headBuildGraph , changedFiles , _loggerFactory ) ;
195156 return new ProjectDiffResult
196157 {
197158 Status = ProjectDiffExecutionStatus . Success ,
@@ -203,6 +164,38 @@ bool ShouldIncludeFile(string file) =>
203164 _options . IgnoreChangedFiles . Length == 0 || _options . IgnoreChangedFiles . All ( it => it . FullName != file ) ;
204165 }
205166
167+ private async Task < BuildGraph > CreateBuildGraph (
168+ Repository repository ,
169+ ProjectGraphFactory projectGraphFactory ,
170+ IProjectGraphEntryPointProvider projectGraphEntryPointProvider ,
171+ Commit ? headCommit ,
172+ CancellationToken cancellationToken
173+ )
174+ {
175+ ProjectGraph projectGraph ;
176+ if ( headCommit is null )
177+ {
178+ projectGraph = await projectGraphFactory . BuildForWorkingDirectory (
179+ projectGraphEntryPointProvider ,
180+ cancellationToken
181+ ) ;
182+ }
183+ else
184+ {
185+ projectGraph = await projectGraphFactory . BuildForGitTree (
186+ repository ,
187+ headCommit . Tree ,
188+ projectGraphEntryPointProvider ,
189+ cancellationToken
190+ ) ;
191+ }
192+
193+ return BuildGraphFactory . CreateForProjectGraph (
194+ projectGraph ,
195+ repository ,
196+ _options . IgnoreChangedFiles
197+ ) ;
198+ }
206199
207200 private static IEnumerable < string > GetGitModifiedFiles (
208201 Repository repository ,
0 commit comments