[
Date Prev][
Date Next][
Thread Prev][
Thread Next][
Date Index][
Thread Index]
[
List Home]
Re: [jgit-dev] question about commits/trees/parents
|
On 05/03/2012 02:03 PM, Markus Duft wrote:
> On 05/03/2012 02:00 PM, Markus Duft wrote:
>> Hi!
>>
>> I'm writing a short peace of code, that should give me the size of all files touched in the last commit. for this reason i'm using a treewalk with an ANY_DIFF filter (is this the right approach?) and intend to pass the trees of the current and the parent RevCommit.
>>
>> walk.setFilter(TreeFilter.ANY_DIFF);
>> walk.reset(commit.getParent(0).getTree(), commit.getTree());
>>
>> now, in this case i have these evaluations when hitting the reset() line:
>>
>> commit = commit 4e408bb4f8e84240c19ddfe4ea2d97fdc6996856 1336045390 -----p
>> commit.getParent(0) = commit 6c88f48e66c953e0c50167378377e8e3273d2ffe 0 ------
>
> oh, and i forgot:
>
> new RevWalk(repo).parseCommit(commit.getParent(0).getId())
>
> gives a "valid" looking result:
>
> commit 1b6c2d82292ddd3d55747146ebe5d82e47d3f3a4 1336044951 -----p
and again - sorry, the SHA-1 here is wrong - of course its the same as commit.getParent(0).getId() :) damn copy-paste :D
Regards,
Markus
>
> Regards,
> Markus
>
>>
>> calling any getter on the parent (like getTree()) yields null or NPE... what am i doing wrong? i'm using plain jgit as library in a plain java application. the whole code looks like this:
>>
>> /**
>> * Investigates files changed by the commit referenced by the patchset of the given event, and
>> * returns a map of paths to file sizes for files that are too large.
>> */
>> public Map<String, Long> getInvalidSizedFiles(GerritBaseChangeEvent e) {
>> try {
>> RevCommit commit = getCommit(e);
>> if (commit == null) {
>> throw new IllegalStateException("cannot find commit for event " + e);
>> }
>>
>> if (commit.getParentCount() != 1) {
>> throw new IllegalStateException("commit " + commit + " has not exactly one parent!");
>> }
>>
>> // since the actual commit is added as second tree, from now on, index '1' refers to the
>> // actual commit.
>> TreeWalk walk = new TreeWalk(repo);
>> walk.setFilter(TreeFilter.ANY_DIFF);
>> walk.reset(commit.getParent(0).getTree(), commit.getTree());
>> walk.setRecursive(true);
>>
>> ObjectReader reader = walk.getObjectReader();
>>
>> Map<String, Long> result = new TreeMap<String, Long>();
>>
>> try {
>> while (walk.next()) {
>> String path = walk.getPathString();
>>
>> FileMode newMode = walk.getFileMode(1);
>> if (newMode.equals(FileMode.TYPE_FILE)) {
>> long size = reader.getObjectSize(walk.getObjectId(1), Constants.OBJ_BLOB);
>>
>> if (size > config.getValidationFszWarn()
>> || size > config.getValidationFszError()) {
>> result.put(path, size);
>> }
>> }
>> }
>> } finally {
>> reader.release();
>> }
>>
>> return result;
>> } catch (Exception ex) {
>> log.error("failed to get file sizes for " + e, ex);
>> return Collections.emptyMap();
>> }
>> }
>>
>> /**
>> * Searches for the commit object associated with the given Gerrit event. If no commit can be
>> * found, <code>null</code> is returned.
>> */
>> public RevCommit getCommit(GerritBaseChangeEvent e) {
>> GerritPatchset p = e.getPatchset();
>>
>> if (p == null) {
>> return null;
>> }
>>
>> String rev = p.getRevision();
>> try {
>> RevWalk walk = new RevWalk(repo);
>> return walk.parseCommit(getOidForRev(rev));
>> } catch (Exception ex) {
>> log.error("cannot find commit with id " + rev, ex);
>> return null;
>> }
>> }
>>
>>
>> /**
>> * Returns the {@link ObjectId} for the given RevString, which may be any valid GIT revision ID.
>> * If the given revision is not found in the repository, <code>null</code> is returned.
>> *
>> * @param rev
>> * the revision to resolve
>> * @return the {@link ObjectId} or <code>null</code> if not found.
>> */
>> public ObjectId getOidForRev(String rev) {
>> try {
>> return repo.resolve(rev);
>> } catch (Exception e) {
>> log.error("cannot resolve rev " + rev, e);
>> }
>>
>> return null;
>> }
>>
>> Thanks for helping in advance :)
>>
>> Regards,
>> Markus
>> _______________________________________________
>> jgit-dev mailing list
>> jgit-dev@xxxxxxxxxxx
>> https://dev.eclipse.org/mailman/listinfo/jgit-dev
> _______________________________________________
> jgit-dev mailing list
> jgit-dev@xxxxxxxxxxx
> https://dev.eclipse.org/mailman/listinfo/jgit-dev