2017-09-27 4 views
1

J'ai une application qui utilise libgit2sharp pour faire des actions git en coulisses. Lorsqu'un utilisateur effectue une action spécifique, un commit git est déclenché. Il est possible que l'utilisateur clique sur un bouton plusieurs fois rapidement, déclenchant plusieurs validations en même temps. Lorsque cela se produit, quelque temps une de ces erreurs se produit:Une action utilisateur spécifique déclenche une validation git. Comment puis-je empêcher plusieurs actions sur le même répertoire de ne pas verrouiller et de lancer une erreur?

the index is locked; this might be due to a concurrent or crashed process LibGit2Sharp.LockedFileException: failed to create locked file

Quelle est la bonne façon d'éviter cela? Le code qui fait cela ressemble à ceci:

using (Repository repo = new Repository(workingDirectory)) 
{  
      var stat = repo.RetrieveStatus(); 
      if (!stat.IsDirty) 
      { 
       return; 
      } 

      Commands.Stage(repo, "*"); 

      Signature committer = new Signature(email, email, DateTime.UtcNow); 
      repo.Commit("commit!", committer, committer); 
} 

Est-il possible que je peux vérifier si un verrou existe déjà et attendre? Y a-t-il un meilleur modèle?

+1

La manière la plus correcte consiste à séparer la réception et la gestion des événements. Sur un événement n'appelez pas handler - mettez simplement l'événement reçu dans une file d'attente. Séparez les processus (ou threads) de l'événement de la file d'attente un par un. – phd

Répondre

1

Vous avez besoin d'un moyen de limiter les pressions de touches supplémentaires jusqu'à la fin de la première commande. Il y a beaucoup de manières possibles de faire ceci, mais juste le code montré ne donne pas assez d'information pour répondre complètement - le correctif doit être au point que vous appelez cette routine. Décidez si vous voulez ignorer des pressions de touche supplémentaires pendant qu'une commande est en cours ou si vous voulez les mettre en file d'attente (enregistrez-les et exécutez-les dans l'ordre une fois la commande d'origine terminée). Pour des raisons de simplicité, et étant donné que ce sont des presses multiples, je commencerais probablement par ignorer les presses supplémentaires. Une autre option consisterait à désactiver la touche après avoir appuyé sur, jusqu'à ce que la commande soit terminée. Si vous ne parvenez pas à trouver un moyen d'obtenir des commentaires sur la validation de la validation, une méthode hacky pour que les choses fonctionnent temporairement serait simplement de mettre un timer dessus, et d'abandonner plusieurs commandes jusqu'à ce que le timer soit terminé - peut-être 5 secondes ou plus? Mais cela devrait être une solution rapide si vous avez des utilisateurs qui utilisent actuellement le produit, alors que vous trouvez une solution plus permanente.