2017-08-30 4 views
1

J'ai trouvé similaire question et de base sur elle, mais j'ai l'erreur Cannot invoke method getAuthorIdent() on null object. J'essaie d'obtenir la dernière validation, vérifiez si elle est égale à badAuthor. Pourquoi il ne peut pas être null? Et si la déclaration fonctionne comme je le veux?Jgit Auteur dernier commit

def authorEqual() { 

def badAuthor = 'John' 
Git git = Git.open(new File(".git")) 
RevCommit lastCommit = null --> ERROR FROM HERE 
List<Ref> branches = new Git(git.repository).branchList().setListMode(ListMode.ALL).call(); 
    try { 
     RevWalk walk = new RevWalk(git.repository) 
     for(Ref branch : branches){ 
      RevCommit commit = walk.parseCommit(branch.getObjectId()); 
      PersonIdent aAuthor = commit.getAuthorIdent() 
      if(commit.getAuthorIdent().getWhen().compareTo(
     -----------^ <-- HERE ERROR 
       lastCommit.getAuthorIdent().getWhen().equals(badAuthor)) > 0) 

       lastCommit = commit; 
       println commit 
+0

Je pense que vous n'avez pas défini lastCommit avant de l'utiliser. – dynamo

+0

'RevCommit lastCommit = null' -> Exemple de la question liée –

+0

vous devriez vérifier si lastCommit est null. De toute façon, si vous vouliez trouver des commits faits par un mauvais acteur, pourquoi avez-vous besoin du dernier commit – dynamo

Répondre

2

Tenir compte de la manière Groovy trouver la dernière validation:

RevCommit lastCommit = branches.collect { branch -> revWalk.parseCommit(branch.objectId) } 
     .sort { commit -> commit.authorIdent.when } 
     .reverse() 
     .first() 

Ce qu'il fait, il recueille toutes dernières commits de branches, puis les trie par date pour descendant et obtient le plus récent. Après la dernière validation, vous pouvez facilement vérifier qui en était l'auteur et exécuter toute logique supplémentaire. Ci-dessous vous pouvez trouver l'exemple de script Groovy:

import org.eclipse.jgit.api.Git 
import org.eclipse.jgit.api.ListBranchCommand 
import org.eclipse.jgit.lib.Ref 
import org.eclipse.jgit.revwalk.RevCommit 
import org.eclipse.jgit.revwalk.RevWalk 

@Grab(group='org.eclipse.jgit', module='org.eclipse.jgit', version='4.8.0.201706111038-r') 

Git git = Git.open(new File(".")) 
List<Ref> branches = git.branchList().setListMode(ListBranchCommand.ListMode.ALL).call() 
RevWalk revWalk = new RevWalk(git.repository) 
String excludeAuthorsCommit = 'Joe Doe' 

RevCommit lastCommit = branches.collect { branch -> revWalk.parseCommit(branch.objectId) } 
     .sort { commit -> commit.authorIdent.when } 
     .reverse() 
     .first() 

println "${lastCommit.authorIdent.when}: ${lastCommit.shortMessage} (${lastCommit.authorIdent.name})" 

if (lastCommit.authorIdent.name == excludeAuthorsCommit) { 
    // Do what you want 
} 

Je l'ai testé dans le projet avec 5 branches. Il est retourné récemment commit de test branche que j'ai fait quelques minutes auparavant. J'espère que ça aide.

+0

Cool, c'est tout. Merci ! Dans si l'instruction 'git.rm()' supprimera ce dernier fichier de cet auteur? –

+0

N ° 'git.rm()' renvoie ['RmCommand'] (http://download.eclipse.org/jgit/docs/jgit-2.3.1.201302201838-r/apidocs/org/eclipse/jgit/api/RmCommand .html) et vous devez définir les modèles de fichiers que vous souhaitez supprimer du référentiel. Mais vous avez 'RevCommit' et vous pouvez en extraire l'arborescence, parcourir les fichiers et les ajouter à' RmCommand'. –

+0

Vous avez raison, mais je thnik le plus simple sera d'utiliser 'ResetCommand' –

1

Vous pouvez écrire comme suit pour trouver le mauvais auteur.

def badAuthor = 'John' 
Git git = Git.open(new File(".git")) 
List<Ref> branches = new Git(git.repository).branchList().setListMode(ListMode.ALL).call(); 
    try { 
     RevWalk walk = new RevWalk(git.repository) 
     for(Ref branch in branches){ 

      RevCommit commit = walk.parseCommit(branch.getObjectId()); 

      PersonIdent aAuthor = commit.getAuthorIdent() 

      if(commit.getAuthorIdent().getWhen.equals(badAuthor))  
       println commit 
+0

Il vérifie tous les commits? J'ai besoin de vérifier le dernier, puis si ce sera égal, supprimez-le, cela peut-il être fait? –

+0

voulez-vous dire le dernier commit sur chaque branche ou le dernier commit sur une branche spécifique? – dynamo

+0

sur chaque branche –