diff options
author | Shawn O. Pearce | 2010-08-23 22:53:11 +0000 |
---|---|---|
committer | Shawn O. Pearce | 2010-08-23 22:53:11 +0000 |
commit | a5c18fcfc7929f91c6aa4a4314d28d0f924aad46 (patch) | |
tree | bfc1fe50dd5e445b3d33d8d4a1cf4fc5136a3fac /org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/Push.java | |
parent | 32466c33bae19aff03b95a02e0b7e72d4e2f11b8 (diff) | |
download | jgit-a5c18fcfc7929f91c6aa4a4314d28d0f924aad46.tar.gz jgit-a5c18fcfc7929f91c6aa4a4314d28d0f924aad46.tar.xz jgit-a5c18fcfc7929f91c6aa4a4314d28d0f924aad46.zip |
Fully implement SHA-1 abbreviations
ObjectReader implementations are now responsible for creating the
unique abbreviation of an ObjectId, or for resolving an abbreviation
back to its full form. In this latter case the reader can offer up
multiple candidates to the caller, who may be able to disambiguate
them based on context.
Repository.resolve() doesn't take multiple candidates into account
right now, but it could in the future by looking for a remaining
^0 or ^{commit} suffix and take an expansion if there is only one
commit that matches the input abbreviation. It could also use
the distance from an annotated tag to resolve "tag-NNN-gcommit"
style strings that are often output by `git describe`.
Change-Id: Icd3250adc8177ae05278b858933afdca0cbbdb56
Signed-off-by: Shawn O. Pearce <spearce@spearce.org>
Diffstat (limited to 'org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/Push.java')
-rw-r--r-- | org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/Push.java | 45 |
1 files changed, 31 insertions, 14 deletions
diff --git a/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/Push.java b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/Push.java index 22fd7e38f5..05966416cc 100644 --- a/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/Push.java +++ b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/Push.java @@ -43,14 +43,15 @@ package org.eclipse.jgit.pgm; +import java.io.IOException; import java.text.MessageFormat; import java.util.ArrayList; import java.util.Collection; import java.util.List; -import org.kohsuke.args4j.Argument; -import org.kohsuke.args4j.Option; import org.eclipse.jgit.lib.Constants; +import org.eclipse.jgit.lib.ObjectId; +import org.eclipse.jgit.lib.ObjectReader; import org.eclipse.jgit.lib.Ref; import org.eclipse.jgit.lib.TextProgressMonitor; import org.eclipse.jgit.transport.PushResult; @@ -59,6 +60,8 @@ import org.eclipse.jgit.transport.RemoteRefUpdate; import org.eclipse.jgit.transport.Transport; import org.eclipse.jgit.transport.URIish; import org.eclipse.jgit.transport.RemoteRefUpdate.Status; +import org.kohsuke.args4j.Argument; +import org.kohsuke.args4j.Option; @Command(common = true, usage = "usage_UpdateRemoteRepositoryFromLocalRefs") class Push extends TextBuiltin { @@ -132,11 +135,17 @@ class Push extends TextBuiltin { } finally { transport.close(); } - printPushResult(uri, result); + + ObjectReader reader = db.newObjectReader(); + try { + printPushResult(reader, uri, result); + } finally { + reader.release(); + } } } - private void printPushResult(final URIish uri, + private void printPushResult(final ObjectReader reader, final URIish uri, final PushResult result) { shownURI = false; boolean everythingUpToDate = true; @@ -145,7 +154,7 @@ class Push extends TextBuiltin { for (final RemoteRefUpdate rru : result.getRemoteUpdates()) { if (rru.getStatus() == Status.UP_TO_DATE) { if (verbose) - printRefUpdateResult(uri, result, rru); + printRefUpdateResult(reader, uri, result, rru); } else everythingUpToDate = false; } @@ -153,14 +162,14 @@ class Push extends TextBuiltin { for (final RemoteRefUpdate rru : result.getRemoteUpdates()) { // ...then successful updates... if (rru.getStatus() == Status.OK) - printRefUpdateResult(uri, result, rru); + printRefUpdateResult(reader, uri, result, rru); } for (final RemoteRefUpdate rru : result.getRemoteUpdates()) { // ...finally, others (problematic) if (rru.getStatus() != Status.OK && rru.getStatus() != Status.UP_TO_DATE) - printRefUpdateResult(uri, result, rru); + printRefUpdateResult(reader, uri, result, rru); } AbstractFetchCommand.showRemoteMessages(result.getMessages()); @@ -168,8 +177,8 @@ class Push extends TextBuiltin { out.println(CLIText.get().everythingUpToDate); } - private void printRefUpdateResult(final URIish uri, - final PushResult result, final RemoteRefUpdate rru) { + private void printRefUpdateResult(final ObjectReader reader, + final URIish uri, final PushResult result, final RemoteRefUpdate rru) { if (!shownURI) { shownURI = true; out.println(MessageFormat.format(CLIText.get().pushTo, uri)); @@ -194,10 +203,10 @@ class Push extends TextBuiltin { } else { boolean fastForward = rru.isFastForward(); final char flag = fastForward ? ' ' : '+'; - final String summary = oldRef.getObjectId().abbreviate(db) - .name() + final String summary = safeAbbreviate(reader, oldRef + .getObjectId()) + (fastForward ? ".." : "...") - + rru.getNewObjectId().abbreviate(db).name(); + + safeAbbreviate(reader, rru.getNewObjectId()); final String message = fastForward ? null : CLIText.get().forcedUpdate; printUpdateLine(flag, summary, srcRef, remoteName, message); } @@ -220,8 +229,8 @@ class Push extends TextBuiltin { case REJECTED_REMOTE_CHANGED: final String message = MessageFormat.format( - CLIText.get().remoteRefObjectChangedIsNotExpectedOne - , rru.getExpectedOldObjectId().abbreviate(db).name()); + CLIText.get().remoteRefObjectChangedIsNotExpectedOne, + safeAbbreviate(reader, rru.getExpectedOldObjectId())); printUpdateLine('!', "[rejected]", srcRef, remoteName, message); break; @@ -243,6 +252,14 @@ class Push extends TextBuiltin { } } + private String safeAbbreviate(ObjectReader reader, ObjectId id) { + try { + return reader.abbreviate(id).name(); + } catch (IOException cannotAbbreviate) { + return id.name(); + } + } + private void printUpdateLine(final char flag, final String summary, final String srcRef, final String destRef, final String message) { out.format(" %c %-17s", flag, summary); |