in src/main/java/com/googlesource/gerrit/plugins/imagare/PostImage.java [146:212]
private String storeImage(ProjectState ps, byte[] content, String fileName)
throws AuthException, IOException, ResourceConflictException, PermissionBackendException,
NoSuchProjectException {
long maxSize = ps.getEffectiveMaxObjectSizeLimit().value;
// maxSize == 0 means that there is no limit
if (maxSize > 0 && content.length > maxSize) {
throw new ResourceConflictException("image too large");
}
String ref = getRef(content, fileName);
try (Repository repo = repoManager.openRepository(ps.getProject().getNameKey())) {
ObjectId commitId = repo.resolve(ref);
if (commitId != null) {
// this image exists already
return getUrl(ps.getProject().getNameKey(), ref, fileName);
}
try (RevWalk rw = new RevWalk(repo);
ObjectInserter oi = repo.newObjectInserter()) {
ObjectId blobId = oi.insert(Constants.OBJ_BLOB, content);
oi.flush();
TreeFormatter tf = new TreeFormatter();
tf.append(fileName, FileMode.REGULAR_FILE, blobId);
ObjectId treeId = tf.insertTo(oi);
oi.flush();
PersonIdent authorIdent =
self.get().newCommitterIdent(myIdent.getWhen(), myIdent.getTimeZone());
CommitBuilder cb = new CommitBuilder();
cb.setTreeId(treeId);
cb.setAuthor(authorIdent);
cb.setCommitter(authorIdent);
cb.setMessage("Image Upload");
commitId = oi.insert(cb);
oi.flush();
try {
createRefControl.checkCreateRef(
self,
repo,
new Branch.NameKey(ps.getProject().getNameKey(), ref),
rw.parseCommit(commitId));
} catch (AuthException e) {
throw new AuthException(
String.format("Project %s doesn't allow image upload.", ps.getProject().getName()));
}
RefUpdate ru = repo.updateRef(ref);
ru.setExpectedOldObjectId(ObjectId.zeroId());
ru.setNewObjectId(commitId);
ru.disableRefLog();
if (ru.update(rw) == RefUpdate.Result.NEW) {
referenceUpdated.fire(ps.getProject().getNameKey(), ru, self.get().state());
} else {
throw new IOException(
String.format(
"Failed to create ref %s in %s: %s",
ref, ps.getProject().getName(), ru.getResult()));
}
return getUrl(ps.getProject().getNameKey(), ref, fileName);
}
}
}