use of org.eclipse.jgit.api.errors.GitAPIException in project compiler by boalang.
the class GitConnector method getTags.
@Override
public void getTags(final List<String> names, final List<String> commits) {
try {
for (final Ref ref : git.tagList().call()) {
names.add(ref.getName());
commits.add(ref.getObjectId().getName());
}
} catch (final GitAPIException e) {
if (debug)
System.err.println("Git Error reading tags: " + e.getMessage());
}
}
use of org.eclipse.jgit.api.errors.GitAPIException in project searchcode-server by boyter.
the class IndexGitRepoJob method updateGitRepository.
/**
* Update a git repository and return if it has changed and the differences
*/
public RepositoryChanged updateGitRepository(String repoName, String repoRemoteLocation, String repoUserName, String repoPassword, String repoLocations, String branch, boolean useCredentials) {
boolean changed = false;
List<String> changedFiles = new ArrayList<>();
List<String> deletedFiles = new ArrayList<>();
Singleton.getLogger().info("Attempting to pull latest from " + repoRemoteLocation + " for " + repoName);
Repository localRepository = null;
Git git = null;
try {
localRepository = new FileRepository(new File(repoLocations + "/" + repoName + "/.git"));
Ref head = localRepository.getRef("HEAD");
git = new Git(localRepository);
git.reset();
git.clean();
PullCommand pullCmd = git.pull();
if (useCredentials) {
pullCmd.setCredentialsProvider(new UsernamePasswordCredentialsProvider(repoUserName, repoPassword));
}
pullCmd.call();
Ref newHEAD = localRepository.getRef("HEAD");
if (!head.toString().equals(newHEAD.toString())) {
changed = true;
// Get the differences between the the heads which we updated at
// and use these to just update the differences between them
ObjectId oldHead = localRepository.resolve(head.getObjectId().getName() + "^{tree}");
ObjectId newHead = localRepository.resolve(newHEAD.getObjectId().getName() + "^{tree}");
ObjectReader reader = localRepository.newObjectReader();
CanonicalTreeParser oldTreeIter = new CanonicalTreeParser();
oldTreeIter.reset(reader, oldHead);
CanonicalTreeParser newTreeIter = new CanonicalTreeParser();
newTreeIter.reset(reader, newHead);
List<DiffEntry> entries = git.diff().setNewTree(newTreeIter).setOldTree(oldTreeIter).call();
for (DiffEntry entry : entries) {
if ("DELETE".equals(entry.getChangeType().name())) {
deletedFiles.add(FilenameUtils.separatorsToUnix(entry.getOldPath()));
} else {
changedFiles.add(FilenameUtils.separatorsToUnix(entry.getNewPath()));
}
}
}
} catch (IOException | GitAPIException | InvalidPathException ex) {
changed = false;
Singleton.getLogger().warning("ERROR - caught a " + ex.getClass() + " in " + this.getClass() + " updateGitRepository for " + repoName + "\n with message: " + ex.getMessage());
} finally {
Singleton.getHelpers().closeQuietly(localRepository);
Singleton.getHelpers().closeQuietly(git);
}
return new RepositoryChanged(changed, changedFiles, deletedFiles);
}
use of org.eclipse.jgit.api.errors.GitAPIException in project searchcode-server by boyter.
the class IndexGitRepoJob method cloneGitRepository.
/**
* Clones the repository from scratch
*/
public RepositoryChanged cloneGitRepository(String repoName, String repoRemoteLocation, String repoUserName, String repoPassword, String repoLocations, String branch, boolean useCredentials) {
boolean successful = false;
Singleton.getLogger().info("Attempting to clone " + repoRemoteLocation);
Git call = null;
try {
CloneCommand cloneCommand = Git.cloneRepository();
cloneCommand.setURI(repoRemoteLocation);
cloneCommand.setDirectory(new File(repoLocations + "/" + repoName + "/"));
cloneCommand.setCloneAllBranches(true);
cloneCommand.setBranch(branch);
if (useCredentials) {
cloneCommand.setCredentialsProvider(new UsernamePasswordCredentialsProvider(repoUserName, repoPassword));
}
call = cloneCommand.call();
successful = true;
} catch (GitAPIException | InvalidPathException ex) {
successful = false;
Singleton.getLogger().warning("ERROR - caught a " + ex.getClass() + " in " + this.getClass() + " cloneGitRepository for " + repoName + "\n with message: " + ex.getMessage());
} finally {
Singleton.getHelpers().closeQuietly(call);
}
RepositoryChanged repositoryChanged = new RepositoryChanged(successful);
repositoryChanged.setClone(true);
return repositoryChanged;
}
use of org.eclipse.jgit.api.errors.GitAPIException in project searchcode-server by boyter.
the class IndexGitRepoJob method getBlameInfo.
/**
* Uses the inbuilt git
* TODO this method appears to leak memory like crazy... need to investigate
* TODO lots of hairy bits in here need tests to capture issues
*/
public List<CodeOwner> getBlameInfo(int codeLinesSize, String repoName, String repoLocations, String fileName) {
List<CodeOwner> codeOwners = new ArrayList<>(codeLinesSize);
try {
// The / part is required due to centos bug for version 1.1.1
// This appears to be correct
String repoLoc = repoLocations + "/" + repoName + "/.git";
Repository localRepository = new FileRepository(new File(repoLoc));
BlameCommand blamer = new BlameCommand(localRepository);
ObjectId commitID = localRepository.resolve("HEAD");
if (commitID == null) {
Singleton.getLogger().info("getBlameInfo commitID is null for " + repoLoc + " " + fileName);
return codeOwners;
}
BlameResult blame;
// Somewhere in here appears to be wrong...
blamer.setStartCommit(commitID);
blamer.setFilePath(fileName);
blame = blamer.call();
// Hail mary attempt to solve issue on CentOS Attempt to set at all costs
if (blame == null) {
// This one appears to solve the issue so don't remove it
String[] split = fileName.split("/");
blamer.setStartCommit(commitID);
if (split.length != 1) {
blamer.setFilePath(String.join("/", Arrays.asList(split).subList(1, split.length)));
}
blame = blamer.call();
}
if (blame == null) {
String[] split = fileName.split("/");
blamer.setStartCommit(commitID);
if (split.length != 1) {
blamer.setFilePath("/" + String.join("/", Arrays.asList(split).subList(1, split.length)));
}
blame = blamer.call();
}
if (blame == null) {
Singleton.getLogger().info("getBlameInfo blame is null for " + repoLoc + " " + fileName);
}
if (blame != null) {
// Get all the owners their number of commits and most recent commit
HashMap<String, CodeOwner> owners = new HashMap<>();
RevCommit commit;
PersonIdent authorIdent;
try {
for (int i = 0; i < codeLinesSize; i++) {
commit = blame.getSourceCommit(i);
authorIdent = commit.getAuthorIdent();
if (owners.containsKey(authorIdent.getName())) {
CodeOwner codeOwner = owners.get(authorIdent.getName());
codeOwner.incrementLines();
int timestamp = codeOwner.getMostRecentUnixCommitTimestamp();
if (commit.getCommitTime() > timestamp) {
codeOwner.setMostRecentUnixCommitTimestamp(commit.getCommitTime());
}
owners.put(authorIdent.getName(), codeOwner);
} else {
owners.put(authorIdent.getName(), new CodeOwner(authorIdent.getName(), 1, commit.getCommitTime()));
}
}
} catch (IndexOutOfBoundsException ex) {
// Ignore this as its not really a problem or is it?
Singleton.getLogger().info("IndexOutOfBoundsException when trying to get blame for " + repoName + " " + fileName);
}
codeOwners = new ArrayList<>(owners.values());
}
} catch (IOException ex) {
Singleton.getLogger().info("IOException getBlameInfo when trying to get blame for " + repoName + " " + fileName + " " + ex.toString());
} catch (GitAPIException ex) {
Singleton.getLogger().info("GitAPIException getBlameInfo when trying to get blame for " + repoName + " " + fileName + " " + ex.toString());
} catch (IllegalArgumentException ex) {
Singleton.getLogger().info("IllegalArgumentException getBlameInfo when trying to get blame for " + repoName + " " + fileName + " " + ex.toString());
}
// Try to clean up
System.gc();
return codeOwners;
}
Aggregations