libgit2 / libgit2/libgit2sharp

Index.Remove with directory/pattern does not always work

Ouverte
#1,350 11 commentaires 0 réactions 0 personnes assignées Voir sur GitHub

Personne n'a encore pris cette issue.

Langage dominant
C#
Étoiles
3.5k
Forks
925
Métriques de merge des PR
Aucune PR mergée en 30 j

Description

The problem could be related to the commit operation but I'm not sure. If instead of repo.Index.Remove("*") you pass the filename, it is correctly removed from the Index.

Also if you commit the file using the console git client the * version starts working correctly.

For reproduction please see the following unit test:

using LibGit2Sharp;
using NUnit.Framework;
using System;
using System.IO;
using System.Linq;

namespace Tests
{
    public class LibGitTest
    {
        [Test]
        public void TestRemove()
        {
            var tempPath = Path.Combine(Path.GetTempPath(), "LibGitTest");

            if (Directory.Exists(tempPath))
            {
                DeleteDirectory(tempPath);
            }
            Directory.CreateDirectory(tempPath);

            using (var repo = new Repository(Repository.Init(tempPath)))
            {
                File.WriteAllText(Path.Combine(tempPath, "a.txt"), "some text");

                repo.Stage("*.*");
                var signature = repo.Config.BuildSignature(DateTimeOffset.Now);
                repo.Commit("Initial commit", signature, signature);

                repo.Index.Remove("*");
                // repo.Index.Remove("a.txt"); // uncomment this line to make the test pass

                var status = repo.RetrieveStatus();
                Assert.Contains("a.txt", status.Removed.Select(entry => entry.FilePath).ToArray());
            }
        }

        private static void DeleteDirectory(string tempPath)
        {
            // Some files in the .git folder are readonly, I'm not sure whether that's normal, but we need to reset the flag in order to successfully delete the directory
            Directory.EnumerateFiles(Path.Combine(tempPath), "*", SearchOption.AllDirectories)
                .ForEach(f => File.SetAttributes(f, File.GetAttributes(f) & ~FileAttributes.ReadOnly));

            Directory.Delete(tempPath, recursive: true);
        }
    }
}

Guide de contribution

Ouvrir le guide de contribution

Par où commencer

  1. Lisez l'issue en entier, puis le guide de contribution du projet.
  2. Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
  3. Forkez le dépôt et travaillez sur une branche.
  4. Ouvrez une pull request qui référence le numéro de l'issue.

Piste de recherche

Commencez par exécuter le test unitaire TestRemove et examinez le comportement de repo.Index.Remove("*") par rapport à la suppression directe de "a.txt". Suivez la suppression de l’index et le résultat ultérieur de RetrieveStatus(), notamment pour déterminer si l’opération de commit affecte la correspondance de motifs. C’est terminé lorsque le test existant réussit avec la suppression par caractère générique et que le comportement avec le nom de fichier direct reste correct.

Rédigé par le modèle d'indexation à partir du texte de l'issue.

Évaluation

Stack technique
csharp, git
Domaine
devtools
Type d'issue
Bug
Difficulté
3/5
Temps estimé
1-2 jours
Activité
À l'abandon
Clarté
Clairement spécifiée
Accessibilité débutants
45/100

Recevez les nouvelles issues par e-mail

Un résumé court des issues GitHub adaptées aux débutants.