Handle errors when a branch is not found. * Catch all Exception, not just IOException. * Log an error message when a branch is not found in repository. Change-Id: Ic4e71525d9fa22a424ecfddc0515deaff8b52878
diff --git a/src/main/java/com/googlesource/gerrit/plugins/findowners/OwnersDb.java b/src/main/java/com/googlesource/gerrit/plugins/findowners/OwnersDb.java index f13c3cf..381430d 100644 --- a/src/main/java/com/googlesource/gerrit/plugins/findowners/OwnersDb.java +++ b/src/main/java/com/googlesource/gerrit/plugins/findowners/OwnersDb.java
@@ -21,7 +21,6 @@ import com.google.gerrit.reviewdb.client.Project; import com.google.gerrit.server.account.AccountCache; import com.google.gerrit.server.account.Accounts; -import java.io.IOException; import java.nio.file.FileSystem; import java.nio.file.FileSystems; import java.nio.file.PathMatcher; @@ -33,6 +32,7 @@ import java.util.List; import java.util.Map; import java.util.Set; +import org.eclipse.jgit.lib.ObjectId; import org.eclipse.jgit.lib.ObjectReader; import org.eclipse.jgit.lib.Repository; import org.eclipse.jgit.revwalk.RevTree; @@ -74,31 +74,35 @@ this.key = key; preferredEmails.put("*", "*"); String ownersFileName = Config.getOwnersFileName(project); - for (String fileName : files) { - // Find OWNERS in fileName's directory and parent directories. - // Stop looking for a parent directory if OWNERS has "set noparent". - fileName = Util.normalizedFilePath(fileName); - String dir = Util.normalizedDirPath(fileName); // e.g. dir = ./d1/d2 - while (!readDirs.contains(dir)) { - readDirs.add(dir); - String filePath = (dir + "/" + ownersFileName).substring(2); // remove "./" - String content = getRepositoryFile(repository, branch, filePath); - if (content != null && !content.equals("")) { - addFile(dir + "/", dir + "/" + ownersFileName, content.split("\\R+")); + // Some hacked CL could have a target branch that is not created yet. + ObjectId id = getBranchId(repository, branch); + revision = ""; + if (id != null) { + for (String fileName : files) { + // Find OWNERS in fileName's directory and parent directories. + // Stop looking for a parent directory if OWNERS has "set noparent". + fileName = Util.normalizedFilePath(fileName); + String dir = Util.normalizedDirPath(fileName); // e.g. dir = ./d1/d2 + while (!readDirs.contains(dir)) { + readDirs.add(dir); + String filePath = (dir + "/" + ownersFileName).substring(2); // remove "./" + String content = getRepositoryFile(repository, id, filePath); + if (content != null && !content.equals("")) { + addFile(dir + "/", dir + "/" + ownersFileName, content.split("\\R+")); + } + if (stopLooking.contains(dir + "/") || !dir.contains("/")) { + break; // stop looking through parent directory + } + dir = Util.getDirName(dir); // go up one level } - if (stopLooking.contains(dir + "/") || !dir.contains("/")) { - break; // stop looking through parent directory - } - dir = Util.getDirName(dir); // go up one level + } + try { + revision = repository.getRef(branch).getObjectId().getName(); + } catch (Exception e) { + log.error("Fail to get branch revision", e); } } countNumOwners(files); - try { - revision = repository.getRef(branch).getObjectId().getName(); - } catch (IOException e) { - log.error("Fail to get branch revision", e); - revision = ""; - } } int getNumOwners() { @@ -282,16 +286,30 @@ return file2Owners; } + /** Returns ObjectId of the given branch, or null. */ + private static ObjectId getBranchId(Repository repo, String branch) { + try { + ObjectId id = repo.resolve(branch); + if (id == null) { + log.error("cannot find branch " + branch); + } + return id; + } catch (Exception e) { + log.error("cannot find branch " + branch, e); + } + return null; + } + /** Returns file content or empty string; uses Repository. */ - static String getRepositoryFile(Repository repo, String branch, String file) { + private static String getRepositoryFile(Repository repo, ObjectId id, String file) { try (RevWalk revWalk = new RevWalk(repo)) { - RevTree tree = revWalk.parseCommit(repo.resolve(branch)).getTree(); + RevTree tree = revWalk.parseCommit(id).getTree(); ObjectReader reader = revWalk.getObjectReader(); TreeWalk treeWalk = TreeWalk.forPath(reader, file, tree); if (treeWalk != null) { return new String(reader.open(treeWalk.getObjectId(0)).getBytes(), UTF_8); } - } catch (IOException e) { + } catch (Exception e) { log.error("get file " + file, e); } return "";