-
Notifications
You must be signed in to change notification settings - Fork 239
An easy way to upload the same filename to GitHub #582
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Merged
Merged
Changes from all commits
Commits
Show all changes
4 commits
Select commit
Hold shift + click to select a range
931a6b9
New GitHubUtils class to interact with GitHub API
miltonials bc01335
methods to get a unique name for a file in a GitHub repository
miltonials 56718f0
Using unique name for the file on commit
miltonials 3995d95
Manually performed translations are deleted
miltonials File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,17 @@ | ||
package net.osmtracker.util; | ||
|
||
/** | ||
* A generic callback interface used for asynchronous operations. | ||
* Implementations of this interface should define how to handle the result | ||
* of an asynchronous task. | ||
*/ | ||
public interface Callback { | ||
/** | ||
* Called when the asynchronous operation is completed. | ||
* Implementations should handle the provided result accordingly. | ||
* | ||
* @param result The result of the operation, which may be {@code null} if an error occurs. | ||
* @return A string value that may be used by the calling function, if applicable. | ||
*/ | ||
String onResult(String result); | ||
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,125 @@ | ||
package net.osmtracker.util; | ||
|
||
import android.os.AsyncTask; | ||
|
||
import org.json.JSONException; | ||
import org.json.JSONObject; | ||
|
||
import java.io.BufferedReader; | ||
import java.io.IOException; | ||
import java.io.InputStreamReader; | ||
import java.net.HttpURLConnection; | ||
import java.net.URL; | ||
|
||
/** | ||
* Utility class for interacting with the GitHub API. | ||
* Provides methods to retrieve file information and manage file uploads. | ||
* | ||
* <p>This class includes methods to: | ||
* <ul> | ||
* <li>Generate a unique filename within a GitHub repository.</li> | ||
* <li>Retrieve the SHA hash of a file stored in a GitHub repository.</li> | ||
* </ul> | ||
* </p> | ||
* | ||
* <p>It requires a valid GitHub authentication token for API requests.</p> | ||
*/ | ||
public class GitHubUtils { | ||
/** | ||
* Retrieves the SHA hash of a file in a GitHub repository. | ||
* If the file does not exist, it returns {@code null}. | ||
* | ||
* @param repoOwner The owner of the repository (user or organization). | ||
* @param repoName The name of the GitHub repository. | ||
* @param repoFilePath The file path in the repository. | ||
* @param token The GitHub authentication token with appropriate permissions. | ||
* @return The SHA hash of the file if it exists, or {@code null} if the file is not found. | ||
* @throws IOException If an I/O error occurs while making the request. | ||
* @throws JSONException If an error occurs while parsing the JSON response. | ||
*/ | ||
public static void getFileSHAAsync(String repoOwner, String repoName, String repoFilePath, String token, Callback callback) { | ||
new AsyncTask<Void, Void, String>() { | ||
@Override | ||
protected String doInBackground(Void... voids) { | ||
try { | ||
String apiUrl = "https://api.github.com/repos/" + repoOwner + "/" + repoName + "/contents/" + repoFilePath; | ||
System.out.println("Fetching SHA: " + apiUrl); | ||
HttpURLConnection connection = (HttpURLConnection) new URL(apiUrl).openConnection(); | ||
connection.setRequestMethod("GET"); | ||
connection.setRequestProperty("Authorization", "Bearer " + token); | ||
connection.setRequestProperty("Accept", "application/vnd.github.v3+json"); | ||
|
||
if (connection.getResponseCode() == 200) { | ||
BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream())); | ||
StringBuilder response = new StringBuilder(); | ||
String line; | ||
while ((line = reader.readLine()) != null) { | ||
response.append(line); | ||
} | ||
reader.close(); | ||
JSONObject jsonResponse = new JSONObject(response.toString()); | ||
return jsonResponse.getString("sha"); | ||
} | ||
} catch (Exception e) { | ||
e.printStackTrace(); | ||
} | ||
return null; | ||
} | ||
|
||
@Override | ||
protected void onPostExecute(String sha) { | ||
callback.onResult(sha); // Return result via callback | ||
} | ||
}.execute(); | ||
} | ||
|
||
/** | ||
* Asynchronously generates a unique filename in a GitHub repository. | ||
* If the file already exists, a number is appended before the extension. | ||
* | ||
* @param repoOwner The owner of the repository. | ||
* @param repoName The name of the GitHub repository. | ||
* @param repoFilePath The initial file path in the repository. | ||
* @param token The GitHub authentication token. | ||
* @param callback Callback to return the generated filename. | ||
*/ | ||
public static void getGHFilenameAsync(String repoOwner, String repoName, final String repoFilePath, String token, Callback callback) { | ||
String filename = repoFilePath.substring(0, repoFilePath.lastIndexOf(".")); | ||
String extension = repoFilePath.substring(repoFilePath.lastIndexOf(".")); | ||
checkFileExists(repoOwner, repoName, filename, extension, 0, token, callback); | ||
} | ||
|
||
/** | ||
* Recursively checks if a file exists and generates a unique filename. | ||
* | ||
* @param repoOwner The owner of the repository. | ||
* @param repoName The GitHub repository name. | ||
* @param filename The base filename (without extension). | ||
* @param extension The file extension. | ||
* @param count The current attempt number for uniqueness. | ||
* @param token The GitHub authentication token. | ||
* @param callback Callback to return the final unique filename. | ||
*/ | ||
private static void checkFileExists(String repoOwner, String repoName, String filename, String extension, int count, String token, Callback callback) { | ||
String newFilename;// (count == 0) ? filename + extension : filename + "(" + count + ")" + extension; | ||
if (count == 0) { | ||
newFilename = filename + extension; | ||
} else { | ||
newFilename = filename + "(" + count + ")" + extension; | ||
} | ||
|
||
getFileSHAAsync(repoOwner, repoName, newFilename, token, new Callback() { | ||
@Override | ||
public String onResult(String sha) { | ||
if (sha == null) { | ||
// File does not exist, return the new unique filename | ||
callback.onResult(newFilename); | ||
} else { | ||
// File exists, recursively try with the next count | ||
checkFileExists(repoOwner, repoName, filename, extension, count + 1, token, callback); | ||
} | ||
return null; | ||
} | ||
}); | ||
} | ||
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Uh oh!
There was an error while loading. Please reload this page.