diff options
author | Matthias Sohn <matthias.sohn@sap.com> | 2014-12-04 01:43:23 +0100 |
---|---|---|
committer | Matthias Sohn <matthias.sohn@sap.com> | 2014-12-22 15:43:44 +0100 |
commit | 563c1ad514ada9af13f2a1955a10000137804527 (patch) | |
tree | 3101a99a74e82aebb3b79bcfd008564180f2b5d2 /org.eclipse.jgit.pgm | |
parent | 79201ac95ef4cc313f45e4d8125759a2c7021ad0 (diff) | |
download | jgit-563c1ad514ada9af13f2a1955a10000137804527.tar.gz jgit-563c1ad514ada9af13f2a1955a10000137804527.zip |
[pgm] Implement clone using CloneCommand
Change-Id: I56699b7bf9a71f673cb308d3015f51de5b06c1d9
Signed-off-by: Matthias Sohn <matthias.sohn@sap.com>
Diffstat (limited to 'org.eclipse.jgit.pgm')
3 files changed, 33 insertions, 120 deletions
diff --git a/org.eclipse.jgit.pgm/resources/org/eclipse/jgit/pgm/internal/CLIText.properties b/org.eclipse.jgit.pgm/resources/org/eclipse/jgit/pgm/internal/CLIText.properties index 7ed77ee04a..c0ecc8391c 100644 --- a/org.eclipse.jgit.pgm/resources/org/eclipse/jgit/pgm/internal/CLIText.properties +++ b/org.eclipse.jgit.pgm/resources/org/eclipse/jgit/pgm/internal/CLIText.properties @@ -43,6 +43,8 @@ changesNotStagedForCommit=Changes not staged for commit: changesToBeCommitted=Changes to be committed: checkoutConflict=error: Your local changes to the following files would be overwritten by checkout: checkoutConflictPathLine=\t{0} +clonedEmptyRepository=warning: You appear to have cloned an empty repository. +cloningInto=Cloning into ''{0}''... commitLabel=commit configFileNotFound=configuration file {0} not found conflictingUsageOf_git_dir_andArguments=conflicting usage of --git-dir and arguments diff --git a/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/Clone.java b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/Clone.java index d9a877cd67..88ea1202d7 100644 --- a/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/Clone.java +++ b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/Clone.java @@ -44,30 +44,15 @@ package org.eclipse.jgit.pgm; import java.io.File; -import java.io.IOException; -import java.net.URISyntaxException; import java.text.MessageFormat; -import org.eclipse.jgit.dircache.DirCache; -import org.eclipse.jgit.dircache.DirCacheCheckout; -import org.eclipse.jgit.errors.IncorrectObjectTypeException; -import org.eclipse.jgit.errors.MissingObjectException; +import org.eclipse.jgit.api.CloneCommand; +import org.eclipse.jgit.api.Git; +import org.eclipse.jgit.api.errors.InvalidRemoteException; import org.eclipse.jgit.lib.Constants; -import org.eclipse.jgit.lib.Ref; -import org.eclipse.jgit.lib.RefUpdate; -import org.eclipse.jgit.lib.Repository; -import org.eclipse.jgit.lib.StoredConfig; -import org.eclipse.jgit.lib.TextProgressMonitor; import org.eclipse.jgit.pgm.internal.CLIText; -import org.eclipse.jgit.revwalk.RevCommit; -import org.eclipse.jgit.revwalk.RevWalk; -import org.eclipse.jgit.storage.file.FileRepositoryBuilder; -import org.eclipse.jgit.transport.FetchResult; -import org.eclipse.jgit.transport.RefSpec; -import org.eclipse.jgit.transport.RemoteConfig; -import org.eclipse.jgit.transport.TagOpt; -import org.eclipse.jgit.transport.Transport; import org.eclipse.jgit.transport.URIish; +import org.eclipse.jgit.util.SystemReader; import org.kohsuke.args4j.Argument; import org.kohsuke.args4j.Option; @@ -88,8 +73,6 @@ class Clone extends AbstractFetchCommand { @Argument(index = 1, metaVar = "metaVar_directory") private String localName; - private Repository dst; - @Override protected final boolean requiresRepository() { return false; @@ -101,116 +84,42 @@ class Clone extends AbstractFetchCommand { throw die(CLIText.get().conflictingUsageOf_git_dir_andArguments); final URIish uri = new URIish(sourceUri); + File localNameF; if (localName == null) { try { localName = uri.getHumanishName(); + localNameF = new File(SystemReader.getInstance().getProperty( + Constants.OS_USER_DIR), localName); } catch (IllegalArgumentException e) { - throw die(MessageFormat.format(CLIText.get().cannotGuessLocalNameFrom, sourceUri)); - } - } - if (gitdir == null) - gitdir = new File(localName, Constants.DOT_GIT).getAbsolutePath(); - - dst = new FileRepositoryBuilder().setGitDir(new File(gitdir)).build(); - dst.create(); - final StoredConfig dstcfg = dst.getConfig(); - dstcfg.setBoolean("core", null, "bare", false); //$NON-NLS-1$ //$NON-NLS-2$ - dstcfg.save(); - db = dst; - - outw.print(MessageFormat.format( - CLIText.get().initializedEmptyGitRepositoryIn, gitdir)); - outw.println(); - outw.flush(); - - saveRemote(uri); - final FetchResult r = runFetch(); - - if (!noCheckout) { - final Ref checkoutRef; - if (branch == null) - checkoutRef = guessHEAD(r); - else { - checkoutRef = r.getAdvertisedRef(Constants.R_HEADS + branch); - if (checkoutRef == null) - throw die(MessageFormat.format( - CLIText.get().noSuchRemoteRef, branch)); + throw die(MessageFormat.format( + CLIText.get().cannotGuessLocalNameFrom, sourceUri)); } - doCheckout(checkoutRef); - } - } + } else + localNameF = new File(localName); - private void saveRemote(final URIish uri) throws URISyntaxException, - IOException { - final StoredConfig dstcfg = dst.getConfig(); - final RemoteConfig rc = new RemoteConfig(dstcfg, remoteName); - rc.addURI(uri); - rc.addFetchRefSpec(new RefSpec().setForceUpdate(true) - .setSourceDestination(Constants.R_HEADS + "*", //$NON-NLS-1$ - Constants.R_REMOTES + remoteName + "/*")); //$NON-NLS-1$ - rc.update(dstcfg); - dstcfg.save(); - } - - private FetchResult runFetch() throws URISyntaxException, IOException { - final Transport tn = Transport.open(db, remoteName); - final FetchResult r; - try { - tn.setTagOpt(TagOpt.FETCH_TAGS); - r = tn.fetch(new TextProgressMonitor(), null); - } finally { - tn.close(); - } - showFetchResult(r); - return r; - } - - private static Ref guessHEAD(final FetchResult result) { - final Ref idHEAD = result.getAdvertisedRef(Constants.HEAD); - Ref head = null; - for (final Ref r : result.getAdvertisedRefs()) { - final String n = r.getName(); - if (!n.startsWith(Constants.R_HEADS)) - continue; - if (idHEAD == null || head != null) - continue; - if (r.getObjectId().equals(idHEAD.getObjectId())) - head = r; - } - if (idHEAD != null && head == null) - head = idHEAD; - return head; - } - - private void doCheckout(final Ref branch) throws IOException { if (branch == null) - throw die(CLIText.get().cannotChekoutNoHeadsAdvertisedByRemote); - if (!Constants.HEAD.equals(branch.getName())) { - RefUpdate u = db.updateRef(Constants.HEAD); - u.disableRefLog(); - u.link(branch.getName()); - } - - final RevCommit commit = parseCommit(branch); - final RefUpdate u = db.updateRef(Constants.HEAD); - u.setNewObjectId(commit); - u.forceUpdate(); + branch = Constants.HEAD; - DirCache dc = db.lockDirCache(); - DirCacheCheckout co = new DirCacheCheckout(db, dc, commit.getTree()); - co.checkout(); - } + CloneCommand command = Git.cloneRepository(); + command.setURI(sourceUri).setRemote(remoteName) + .setNoCheckout(noCheckout).setBranch(branch); - private RevCommit parseCommit(final Ref branch) - throws MissingObjectException, IncorrectObjectTypeException, - IOException { - final RevWalk rw = new RevWalk(db); - final RevCommit commit; + command.setGitDir(gitdir == null ? null : new File(gitdir)); + command.setDirectory(localNameF); + outw.println(MessageFormat.format(CLIText.get().cloningInto, localName)); try { - commit = rw.parseCommit(branch.getObjectId()); + db = command.call().getRepository(); + if (db.resolve(Constants.HEAD) == null) + outw.println(CLIText.get().clonedEmptyRepository); + } catch (InvalidRemoteException e) { + throw die(MessageFormat.format(CLIText.get().doesNotExist, + sourceUri)); } finally { - rw.release(); + if (db != null) + db.close(); } - return commit; + + outw.println(); + outw.flush(); } } diff --git a/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/internal/CLIText.java b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/internal/CLIText.java index c42e5fb59d..e7d995e6ae 100644 --- a/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/internal/CLIText.java +++ b/org.eclipse.jgit.pgm/src/org/eclipse/jgit/pgm/internal/CLIText.java @@ -109,6 +109,8 @@ public class CLIText extends TranslationBundle { /***/ public String changesToBeCommitted; /***/ public String checkoutConflict; /***/ public String checkoutConflictPathLine; + /***/ public String clonedEmptyRepository; + /***/ public String cloningInto; /***/ public String commitLabel; /***/ public String conflictingUsageOf_git_dir_andArguments; /***/ public String couldNotCreateBranch; |