diff options
-rw-r--r-- | src/branch/models.rs | 2 | ||||
-rw-r--r-- | src/commit/models.rs | 9 | ||||
-rw-r--r-- | src/git.rs | 18 | ||||
-rw-r--r-- | src/repository/models.rs | 28 |
4 files changed, 37 insertions, 20 deletions
diff --git a/src/branch/models.rs b/src/branch/models.rs index c8a8d65..3d57537 100644 --- a/src/branch/models.rs +++ b/src/branch/models.rs @@ -119,7 +119,7 @@ impl Branch { let statement = client .prepare( - "INSERT INTO repository(id, name, repository_id, head) + "INSERT INTO branch(id, name, repository_id, head) VALUES($1, $2, $3, $4) RETURNING *", ) diff --git a/src/commit/models.rs b/src/commit/models.rs index 2f1536b..b2aa2d2 100644 --- a/src/commit/models.rs +++ b/src/commit/models.rs @@ -108,21 +108,22 @@ impl Commit { None => "NULL".to_string(), }; raw_query += &format!( - "('{}', {}, '{}', '{}', '{}', '{}', '{}', '{}', '{}'),", + "('{}', {}, E'{}', '{}', '{}', E'{}', '{}', E'{}', '{}'),", commit.hash, tree, - commit.text, + commit.text.replace("'", "\\'"), commit.date, commit.author_email, - commit.author_name, + commit.author_name.replace("'", "\\'"), commit.committer_email, - commit.committer_name, + commit.committer_name.replace("'", "\\'"), commit.repository_url )[..] } // Remove the last `,` let _ = raw_query.pop(); + raw_query += " RETURNING *"; // TODO: write query with &commits and parameter. Need to implement // ToSql trait for `Commit` model @@ -103,7 +103,13 @@ fn get_commit(gcommit: &git2::Commit, repo_name: &String) -> Commit { /// Then, open the repository. /// Then, get commits /// Finally, remove the temporary folder -pub fn repo_commits(repo_name: &String) -> Result<Vec<Commit>, Error> { +pub fn repo_commits( + repo_name: &String, + branch: &String, +) -> Result<Vec<Commit>, Error> { + // Remove a possible already cloned repository + let _ = remove_dir_all(get_tmp_dir(&repo_name)); + // Try to clone the repo. If it returns an error, it's useless to go ahead: // raises an error. let repo = match clone_repo(&repo_name) { @@ -113,7 +119,7 @@ pub fn repo_commits(repo_name: &String) -> Result<Vec<Commit>, Error> { } }; - if let Err(e) = get_branch(&repo, "main") { + if let Err(e) = get_branch(&repo, branch) { return Err(e); } @@ -130,13 +136,5 @@ pub fn repo_commits(repo_name: &String) -> Result<Vec<Commit>, Error> { commits.push(get_commit(&hash, &repo_name)); } - if let Err(_) = remove_dir_all(get_tmp_dir(&repo_name)) { - return Err(git2::Error::new( - git2::ErrorCode::GenericError, - git2::ErrorClass::Os, - "Temporary clone not deleted", - )); - } - Ok(commits) } diff --git a/src/repository/models.rs b/src/repository/models.rs index de82d45..16cbb98 100644 --- a/src/repository/models.rs +++ b/src/repository/models.rs @@ -1,3 +1,4 @@ +use crate::branch::models::{Branch, BranchData}; use crate::commit::models::Commit; use crate::db::get_client; use crate::email::models::{Email, EmailData}; @@ -30,6 +31,7 @@ pub struct Repository { #[derive(Serialize, Deserialize)] pub struct RepositoryData { pub url: String, + pub branch: String, } impl Repository { @@ -190,9 +192,13 @@ impl Repository { match repo { Some(repo) => { - let commits = match git::repo_commits(&repo_name) { + let commits = match git::repo_commits(&repo_name, &data.branch) + { Ok(c) => c, Err(e) => { + // It also need to remove the repository from the db + let _ = + Repository::delete(pool.clone(), &repo.id).await; return Err(AppError { message: Some( format!( @@ -203,7 +209,7 @@ impl Repository { ), cause: Some("Repository clone".to_string()), error_type: AppErrorType::GitError, - }) + }); } }; @@ -224,9 +230,21 @@ impl Repository { let commits_result = Commit::create(pool.clone(), commits).await; - if let Err(e) = commits_result { - return Err(e); - } + + match commits_result { + Ok(commits_res_vec) => { + let branch_data = BranchData { + name: data.branch.clone(), + repository_id: repo.id, + head: commits_res_vec[0].hash.clone(), + }; + let _ = + Branch::create(pool.clone(), &branch_data).await; + } + Err(e) => { + return Err(e); + } + }; Ok(repo) } |