Merge pull request #659 from dotnet/fix658 · dotnet/Nerdbank.GitVersioning@5496648 (original) (raw)

`@@ -169,22 +169,27 @@ bool TryCalculateHeight(GitCommit commit)

`

169

169

``

170

170

`if (pathFilters is not null)

`

171

171

`{

`

172

``

`-

var relevantCommit = true;

`

173

``

-

174

``

`-

foreach (var parentId in commit.Parents)

`

``

172

`+

// If the diff between this commit and any of its parents

`

``

173

`+

// touches a path that we care about, bump the height.

`

``

174

`+

bool relevantCommit = false, anyParents = false;

`

``

175

`+

foreach (GitObjectId parentId in commit.Parents)

`

175

176

`{

`

176

``

`-

var parent = repository.GetCommit(parentId);

`

177

``

`-

relevantCommit = IsRelevantCommit(repository, commit, parent, pathFilters);

`

178

``

-

179

``

`-

// If the diff between this commit and any of its parents

`

180

``

`-

// does not touch a path that we care about, don't bump the

`

181

``

`-

// height.

`

182

``

`-

if (!relevantCommit)

`

``

177

`+

anyParents = true;

`

``

178

`+

GitCommit parent = repository.GetCommit(parentId);

`

``

179

`+

if (IsRelevantCommit(repository, commit, parent, pathFilters))

`

183

180

`{

`

``

181

`+

// No need to scan further, as a positive match will never turn negative.

`

``

182

`+

relevantCommit = true;

`

184

183

`break;

`

185

184

`}

`

186

185

`}

`

187

186

``

``

187

`+

if (!anyParents)

`

``

188

`+

{

`

``

189

`+

// A no-parent commit is relevant if it introduces anything in the filtered path.

`

``

190

`+

relevantCommit = IsRelevantCommit(repository, commit, parent: default(GitCommit), pathFilters);

`

``

191

`+

}

`

``

192

+

188

193

`if (!relevantCommit)

`

189

194

`{

`

190

195

`height = 0;

`

`@@ -214,12 +219,12 @@ private static bool IsRelevantCommit(GitRepository repository, GitCommit commit,

`

214

219

`return IsRelevantCommit(

`

215

220

`repository,

`

216

221

`repository.GetTree(commit.Tree),

`

217

``

`-

repository.GetTree(parent.Tree),

`

``

222

`+

parent != default ? repository.GetTree(parent.Tree) : null,

`

218

223

`relativePath: string.Empty,

`

219

224

`filters);

`

220

225

`}

`

221

226

``

222

``

`-

private static bool IsRelevantCommit(GitRepository repository, GitTree tree, GitTree parent, string relativePath, IReadOnlyList filters)

`

``

227

`+

private static bool IsRelevantCommit(GitRepository repository, GitTree tree, GitTree? parent, string relativePath, IReadOnlyList filters)

`

223

228

`{

`

224

229

`// Walk over all child nodes in the current tree. If a child node was found in the parent,

`

225

230

`// remove it, so that after the iteration the parent contains all nodes which have been

`

`@@ -231,8 +236,9 @@ private static bool IsRelevantCommit(GitRepository repository, GitTree tree, Git

`

231

236

``

232

237

`// If the entry is not present in the parent commit, it was added;

`

233

238

`// if the Sha does not match, it was modified.

`

234

``

`-

if (!parent.Children.TryGetValue(child.Key, out parentEntry)

`

235

``

`-

|| parentEntry.Sha != child.Value.Sha)

`

``

239

`+

if (parent is null ||

`

``

240

`+

!parent.Children.TryGetValue(child.Key, out parentEntry) ||

`

``

241

`+

parentEntry.Sha != child.Value.Sha)

`

236

242

`{

`

237

243

`// Determine whether the change was relevant.

`

238

244

`var fullPath = $"{relativePath}{entry.Name}";

`

`@@ -264,23 +270,27 @@ private static bool IsRelevantCommit(GitRepository repository, GitTree tree, Git

`

264

270

``

265

271

`if (parentEntry is not null)

`

266

272

`{

`

``

273

`+

Assumes.NotNull(parent);

`

267

274

`parent.Children.Remove(child.Key);

`

268

275

`}

`

269

276

`}

`

270

277

``

271

278

`// Inspect removed entries (i.e. present in parent but not in the current tree)

`

272

``

`-

foreach (var child in parent.Children)

`

``

279

`+

if (parent is not null)

`

273

280

`{

`

274

``

`-

// Determine whether the change was relevant.

`

275

``

`-

var fullPath = Path.Combine(relativePath, child.Key);

`

``

281

`+

foreach (var child in parent.Children)

`

``

282

`+

{

`

``

283

`+

// Determine whether the change was relevant.

`

``

284

`+

var fullPath = Path.Combine(relativePath, child.Key);

`

276

285

``

277

``

`-

bool isRelevant =

`

278

``

`-

filters.Any(f => f.Includes(fullPath, repository.IgnoreCase))

`

279

``

`-

&& !filters.Any(f => f.Excludes(fullPath, repository.IgnoreCase));

`

``

286

`+

bool isRelevant =

`

``

287

`+

filters.Any(f => f.Includes(fullPath, repository.IgnoreCase))

`

``

288

`+

&& !filters.Any(f => f.Excludes(fullPath, repository.IgnoreCase));

`

280

289

``

281

``

`-

if (isRelevant)

`

282

``

`-

{

`

283

``

`-

return true;

`

``

290

`+

if (isRelevant)

`

``

291

`+

{

`

``

292

`+

return true;

`

``

293

`+

}

`

284

294

`}

`

285

295

`}

`

286

296

``