diff --git a/src/com/romanenco/gitt/BrowserActivity.java b/src/com/romanenco/gitt/BrowserActivity.java index 43eaa94..622104c 100644 --- a/src/com/romanenco/gitt/BrowserActivity.java +++ b/src/com/romanenco/gitt/BrowserActivity.java @@ -148,7 +148,7 @@ private void updateTitleWithPath() { int index = path.lastIndexOf("/"); if (index == -1) { //reading branch name in main thread... - String branch = GitHelper.currentBranchName(this.getFilesDir() + "/" + current.getFolder()); + String branch = GitHelper.currentBranchName(GitHelper.getBaseRepoDir(this, current.getFolder()) + "/" + current.getFolder()); this.setTitle("(" + branch + ")/."); } else { this.setTitle(".." + path.substring(index)); @@ -171,7 +171,7 @@ protected void onListItemClick(ListView l, View v, int position, long id) { getListView().setAdapter(adapter); } else { Intent next = new Intent(this, CodeViewActivity.class); - File file = new File(this.getFilesDir(), current.getFolder()); + File file = new File(GitHelper.getBaseRepoDir(this, current.getFolder()), current.getFolder()); file = new File(file, path); file = new File(file, adapter.getItem(position)); next.putExtra(CodeViewActivity.FILE_KEY, file); @@ -344,21 +344,23 @@ public FileListAdapter(Context context, Repo repo, String folder) { Log.d(TAG, "Reading: " + folder); this.context = context; browseCache.put(repo.getFolder(), folder); - File repoDir = new File(context.getFilesDir(), repo.getFolder()); + File repoDir = new File(GitHelper.getBaseRepoDir(context, current.getFolder()), repo.getFolder()); File dir = new File(repoDir, folder); - File[] files = dir.listFiles(); - Arrays.sort(files, NameFileComparator.NAME_COMPARATOR); allItems = new ArrayList(); - fileSizes = new HashMap(); - if (!folder.equals(".")) { - allItems.add(new Item("..", true)); - } - for (File f: files) { - if (".git".equals(f.getName())) continue; - boolean isDir = f.isDirectory(); - allItems.add(new Item(f.getName(), isDir)); - if (!isDir) { - fileSizes.put(f.getName(), Utils.formatFileSize(BrowserActivity.this, f.length())); + if (dir.exists()) { // prevent crash if repo folder was deleted + File[] files = dir.listFiles(); + Arrays.sort(files, NameFileComparator.NAME_COMPARATOR); + fileSizes = new HashMap(); + if (!folder.equals(".")) { + allItems.add(new Item("..", true)); + } + for (File f: files) { + if (".git".equals(f.getName())) continue; + boolean isDir = f.isDirectory(); + allItems.add(new Item(f.getName(), isDir)); + if (!isDir) { + fileSizes.put(f.getName(), Utils.formatFileSize(BrowserActivity.this, f.length())); + } } } filteredList = allItems; diff --git a/src/com/romanenco/gitt/CheckoutActivity.java b/src/com/romanenco/gitt/CheckoutActivity.java index 9ad27ea..9dd32a4 100644 --- a/src/com/romanenco/gitt/CheckoutActivity.java +++ b/src/com/romanenco/gitt/CheckoutActivity.java @@ -95,7 +95,7 @@ class RepoBranchesAndTagsAdapter extends BaseAdapter { padding_px = (int) (padding_dp * scale + 0.5f); list = new ArrayList(); - GitHelper.readBranchesAndTags(list, getFilesDir() + "/" + GitHelper.readBranchesAndTags(list, GitHelper.getBaseRepoDir(CheckoutActivity.this, repo.getFolder()) + "/" + repo.getFolder()); } diff --git a/src/com/romanenco/gitt/CloneActivity.java b/src/com/romanenco/gitt/CloneActivity.java index 7e61510..c56f7e1 100644 --- a/src/com/romanenco/gitt/CloneActivity.java +++ b/src/com/romanenco/gitt/CloneActivity.java @@ -188,7 +188,7 @@ private void deleteGitRepo() { dao.open(true); dao.delete(current.getFolder()); try { - GitHelper.deleteRepo(getFilesDir() + "/" + current.getFolder()); + GitHelper.deleteRepo(GitHelper.getBaseRepoDir(this, current.getFolder()) + "/" + current.getFolder()); } catch (IOException e) { } // no need to handle dao.close(); diff --git a/src/com/romanenco/gitt/GitService.java b/src/com/romanenco/gitt/GitService.java index 36f7d3f..92f06a3 100644 --- a/src/com/romanenco/gitt/GitService.java +++ b/src/com/romanenco/gitt/GitService.java @@ -144,7 +144,7 @@ private void clone(Intent intent) { Log.d(TAG, "Starting processing: " + repo.getName()); - String path = this.getFilesDir().getPath() + "/" + repo.getFolder(); + String path = GitHelper.getBaseRepoDir(this, repo.getFolder()).getPath() + "/" + repo.getFolder(); ProgressMonitor pm = new Progress(repo.getFolder()); try { @@ -190,7 +190,7 @@ private void clone(Intent intent) { */ private void delete(Intent intent) { Repo repo = (Repo) intent.getSerializableExtra(REPO); - String path = this.getFilesDir().getPath() + "/" + repo.getFolder(); + String path = GitHelper.getBaseRepoDir(this, repo.getFolder()).getPath() + "/" + repo.getFolder(); try { GitHelper.deleteRepo(path); } catch (IOException e) { @@ -207,7 +207,7 @@ private void delete(Intent intent) { */ private void checkout(Intent intent) { Repo repo = (Repo) intent.getSerializableExtra(REPO); - String path = this.getFilesDir().getPath() + "/" + repo.getFolder(); + String path = GitHelper.getBaseRepoDir(this, repo.getFolder()).getPath() + "/" + repo.getFolder(); String branchOrTag = intent.getStringExtra(SWITCH_TO); try { GitHelper.checkout(path, branchOrTag); @@ -231,7 +231,7 @@ private void checkout(Intent intent) { */ private void pull(Intent intent) { Repo repo = (Repo) intent.getSerializableExtra(REPO); - String path = this.getFilesDir().getPath() + "/" + repo.getFolder(); + String path = GitHelper.getBaseRepoDir(this, repo.getFolder()).getPath() + "/" + repo.getFolder(); ProgressMonitor pm = new Progress(repo.getFolder()); String passwd = intent.getStringExtra(AUTH_PASSWD); diff --git a/src/com/romanenco/gitt/LogViewActivity.java b/src/com/romanenco/gitt/LogViewActivity.java index 1f03140..1ac17a2 100644 --- a/src/com/romanenco/gitt/LogViewActivity.java +++ b/src/com/romanenco/gitt/LogViewActivity.java @@ -59,7 +59,7 @@ protected void onCreate(Bundle savedInstanceState) { textView = (TextView)findViewById(R.id.text_log); textView.setMovementMethod(new ScrollingMovementMethod()); - File repoDir = new File(this.getFilesDir(), current.getFolder()); + File repoDir = new File(GitHelper.getBaseRepoDir(this, current.getFolder()), current.getFolder()); new LogReaderTask().execute(repoDir); } diff --git a/src/com/romanenco/gitt/git/GitHelper.java b/src/com/romanenco/gitt/git/GitHelper.java index afbf9d3..8901488 100644 --- a/src/com/romanenco/gitt/git/GitHelper.java +++ b/src/com/romanenco/gitt/git/GitHelper.java @@ -47,6 +47,8 @@ import org.eclipse.jgit.revwalk.RevCommit; import org.eclipse.jgit.transport.UsernamePasswordCredentialsProvider; +import android.content.Context; +import android.os.Environment; import android.util.Log; import com.romanenco.gitt.GittApp; @@ -313,6 +315,46 @@ public static List readRepoHistory(String repoPath, int maxRecords) { return result; } + /** + * Create base repository directory on SD card + * + * @param Context context + * @return File + */ + public static File getBaseRepoDir(Context context) + { + return getBaseRepoDir(context, ""); + } + + /** + * Create base repository directory on SD card + * + * @param Context context + * @param String repoDir + * @return File + */ + public static File getBaseRepoDir(Context context, String repoDir) + { + if (repoDir != "") { + File internalStorage = new File(context.getFilesDir(), repoDir); + if (internalStorage.exists()) { + return context.getFilesDir(); + } + } + File sdCardRoot = Environment.getExternalStorageDirectory(); + File repoRoot = new File(sdCardRoot + "/gitt"); + try { + if (!repoRoot.exists() || !repoRoot.isDirectory()) { + if (!repoRoot.mkdirs()) { + throw new IOException("Could not create directory for repos."); + } + } + } catch (IOException e) { + Log.e(TAG, "IO", e); + } + return repoRoot; + } + /** * Log entry. *