Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorShawn O. Pearce2010-08-23 22:53:11 +0000
committerShawn O. Pearce2010-08-23 22:53:11 +0000
commita5c18fcfc7929f91c6aa4a4314d28d0f924aad46 (patch)
treebfc1fe50dd5e445b3d33d8d4a1cf4fc5136a3fac /org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/Push.java
parent32466c33bae19aff03b95a02e0b7e72d4e2f11b8 (diff)
downloadjgit-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.java45
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);

Back to the top