Finally! The Cloning is usable!!!

This commit is contained in:
Zeapo 2014-07-27 00:38:10 +01:00
parent 1c4defa4c9
commit 784a474efb

View file

@ -28,6 +28,9 @@ import org.eclipse.jgit.api.Git;
import org.apache.commons.io.FileUtils;
import org.eclipse.jgit.api.errors.InvalidRemoteException;
import org.eclipse.jgit.api.errors.JGitInternalException;
import org.eclipse.jgit.api.errors.TransportException;
import org.eclipse.jgit.errors.NotSupportedException;
import org.eclipse.jgit.transport.JschConfigSessionFactory;
import org.eclipse.jgit.transport.OpenSshConfig;
import org.eclipse.jgit.transport.SshSessionFactory;
@ -36,7 +39,12 @@ import org.eclipse.jgit.util.FS;
import java.io.File;
import java.io.IOException;
import java.net.InetAddress;
import java.net.URI;
import java.net.URL;
import java.net.UnknownHostException;
// TODO move the messages to strings.xml
public class GitClone extends Activity {
@ -48,6 +56,7 @@ public class GitClone extends Activity {
private File localDir;
private String hostname;
private String username;
@Override
protected void onCreate(Bundle savedInstanceState) {
@ -68,6 +77,20 @@ public class GitClone extends Activity {
@Override
public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l) {
protocol = ((Spinner)findViewById(R.id.clone_protocol)).getSelectedItem().toString();
if (protocol.equals("ssh://")) {
((EditText)findViewById(R.id.clone_uri)).setHint("user@hostname:path");
} else {
((EditText)findViewById(R.id.clone_uri)).setHint("hostname/path");
new AlertDialog.Builder(activity).
setMessage("You are about to use a read-only repository, you will not be able to push to it").
setCancelable(true).
setPositiveButton("OK", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
}
}).show();
}
}
@Override
@ -132,7 +155,7 @@ public class GitClone extends Activity {
}
/* The clone process has to be on a different thread than the main one */
private class CloneTask extends AsyncTask<CloneCommand, Integer, Long> {
private class CloneTask extends AsyncTask<CloneCommand, Integer, Integer> {
private ProgressDialog dialog;
public CloneTask(Activity activity) {
@ -146,11 +169,34 @@ public class GitClone extends Activity {
this.dialog.show();
}
protected void onPostExecute(Long result) {
if (result < 0) {
protected void onPostExecute(Integer result) {
switch (result) {
case -1:
new AlertDialog.Builder(activity).
setTitle("Invalid remote repository path").
setMessage("Please check that the repository path is correct.\nDid you forget to specify the path after the hostname?").
setTitle("Please check that the repository path is correct.").
setMessage("Did you forget to specify the path after the hostname?").
setPositiveButton("OK", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
}
}).show();
break;
case -2:
new AlertDialog.Builder(activity).
setTitle("Communication error").
setMessage("JGit said that the server didn't like our request. Either an authentication issue or the host is not reachable. Check the debug messages.").
setPositiveButton("OK", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
}
}).show();
break;
case -99:
new AlertDialog.Builder(activity).
setTitle("JGit raised an internal exception").
setMessage("OUPS, JGit didn't like what you did... Check that you provided it with a correct URI. Check also debug messages.").
setPositiveButton("OK", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
@ -162,14 +208,18 @@ public class GitClone extends Activity {
}
protected Long doInBackground(CloneCommand... cmd) {
protected Integer doInBackground(CloneCommand... cmd) {
int count = cmd.length;
long totalSize = 0;
Integer totalSize = 0;
for (int i = 0; i < count; i++) {
try {
cmd[i].call();
} catch (JGitInternalException e) {
return -99;
} catch (InvalidRemoteException e) {
return new Long(-1);
return -1;
} catch (TransportException e) {
return -2;
} catch (Exception e) {
e.printStackTrace();
}
@ -205,7 +255,26 @@ public class GitClone extends Activity {
// now cheat a little and prepend the real protocol
// jGit does not accept a ssh:// but requires https://
if (!protocol.equals("ssh://")) hostname = protocol + hostname;
if (!protocol.equals("ssh://")) {
hostname = protocol + hostname;
} else {
// did he forget the username?
if (!hostname.matches("^.+@.+")) {
new AlertDialog.Builder(this).
setMessage("Did you forget to specify a username?").
setPositiveButton("Oups...", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
}
}).
show();
return;
}
username = hostname.split("@")[0];
}
if (localDir.exists()) {
new AlertDialog.Builder(this).
@ -256,33 +325,22 @@ public class GitClone extends Activity {
if (connectionMode.equalsIgnoreCase("ssh-key")) {
} else {
// Set an EditText view to get user input
final LinearLayout layout = new LinearLayout(activity);
layout.setOrientation(LinearLayout.VERTICAL);
final EditText username = new EditText(activity);
username.setHint("Username");
username.setWidth(LinearLayout.LayoutParams.MATCH_PARENT);
final EditText password = new EditText(activity);
password.setHint("Password");
password.setWidth(LinearLayout.LayoutParams.MATCH_PARENT);
password.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD);
layout.addView(username);
layout.addView(password);
new AlertDialog.Builder(activity)
.setTitle("Authenticate")
.setMessage("Please provide your usename and password for this repository")
.setView(layout)
.setMessage("Please provide the password for this repository")
.setView(password)
.setPositiveButton("OK", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int whichButton) {
SshSessionFactory.setInstance(new GitConfigSessionFactory());
CloneCommand cmd = Git.cloneRepository().
setCredentialsProvider(new UsernamePasswordCredentialsProvider("git", "nicomint")).
setCredentialsProvider(new UsernamePasswordCredentialsProvider(username, password.getText().toString())).
setCloneAllBranches(true).
setDirectory(localDir).
setURI(hostname);