LibGit2Sharp equivalente para git describe –contains

¿Sabes cuál es la forma razonable de encontrar la label más cercana que contiene cierta confirmación?

git describe --contains my-commit-hash 

funciona bien, pero no veo una manera de hacer lo mismo con LibGit2Sharp

Estaba tratando de hacer algo como

 foreach (var childCommit in GetChildrenOrSelf(commit)) { var tag = repo.Tags[childCommit]; if (tag != null) return tag; } 

Pero no pude encontrar una manera fácil de implementar GetChildrenOrSelf

De acuerdo con esto ¿Cómo encontrar todas las confirmaciones que tienen un padre particular? – no es una tarea simple.

¿Puedes aconsejar algo?

Git describe es un trabajo en progreso en libgit2. Puede suscribirse a emitir libgit2 / libgit2 # 1066 para recibir notifications sobre su progreso futuro.

Aunque es solo un primer paso para lograr su objective, puede get ayuda del método repo.Refs.ReachableFrom() . Recupera todas las Reference que pueden alcanzar un set de Commit particulares.

Las testings dan un primer comienzo que describe cómo aprovechar este método. Uno de ellos incluso destaca cómo solo recuperar tags.

 var result = repo.Refs.ReachableFrom( repo.Refs.Where(r => r.IsTag()), new[] { repo.Lookup<Commit>(myCommitHash) }); 

Ahora, para determinar la label "más cercana", debe encontrar, entre esas tags, la que está separada por el menor número de confirmaciones de su compromiso objective. El siguiente método debería hacer eso:

 private Reference Closest(IRepository repo, IEnumerable<Reference> result, Commit commit) { int max = int.MaxValue; Reference cl = null; var f = new CommitFilter { Until = commit.Id }; foreach (var reference in result) { f.Since = reference; var c = repo.Commits.QueryBy(f).Count(); if (c >= max) { continue; } max = c; cl = reference; } return cl; } 

Nota 1: Dependiendo de su esquema de nomenclatura de tags, puede omitir esta última fase (al seleccionar la label más antigua sin realizar ningún recuento, por ejemplo: v0.17 tiene grandes posibilidades de estar "más cerca" de la confirmación que v0.21 )

Nota 2: Este método no es el más efectivo, ya que realizará una gran cantidad de revueltas. Sin embargo, debería ayudarlo hasta que git-describe se implemente de forma nativa en libgit2.