it compiles
This commit is contained in:
		
							parent
							
								
									b1dd07aed1
								
							
						
					
					
						commit
						4dc14db293
					
				
					 12 changed files with 115 additions and 13 deletions
				
			
		|  | @ -5,7 +5,9 @@ authors = ["Vladan Popovic <vladanovic@gmail.com>"] | |||
| edition = "2018" | ||||
| 
 | ||||
| [dependencies] | ||||
| axum = "0.6.18" | ||||
| chrono = { version = "*" } | ||||
| tokio = { version = "1.28.1", features = ["tokio-macros"] } | ||||
| 
 | ||||
| [dependencies.git2] | ||||
| version = "*" | ||||
|  |  | |||
|  | @ -1,4 +1,4 @@ | |||
| use crate::errors::SocialError; | ||||
| use crate::git::error::SocialError; | ||||
| use crate::git::repo::SocialRepo; | ||||
| use crate::git::{SocialBlame, SocialBlameHunk}; | ||||
| use git2::{Blame, BlameHunk, BlameOptions}; | ||||
|  |  | |||
|  | @ -1,4 +1,4 @@ | |||
| use crate::errors::SocialError; | ||||
| use crate::git::error::SocialError; | ||||
| use crate::git::repo::SocialRepo; | ||||
| use crate::git::SocialDiff; | ||||
| use git2::{Diff, DiffOptions}; | ||||
|  |  | |||
|  | @ -1,4 +1,4 @@ | |||
| use crate::errors::SocialError; | ||||
| use crate::git::error::SocialError; | ||||
| use crate::git::repo::SocialRepo; | ||||
| use crate::git::SocialCommit; | ||||
| 
 | ||||
|  | @ -63,13 +63,13 @@ impl Log for SocialRepo { | |||
|             .take(1) | ||||
|             .next() | ||||
|             .map(|r| { | ||||
|                 r.map_err(|_| SocialError { | ||||
|                     message: "Invalid commit reference!".to_string(), | ||||
|                 r.map_err(|err| SocialError { | ||||
|                     message: format!("Invalid commit! {}", err) | ||||
|                 }) | ||||
|                 .map(|c| c.into()) | ||||
|             }) | ||||
|             .ok_or(SocialError { | ||||
|                 message: "Repo doesn't contain any commits!".to_owned(), | ||||
|                 message: format!("Repo doesn't contain any commits!") | ||||
|             })? | ||||
|     } | ||||
| } | ||||
|  |  | |||
|  | @ -1,5 +1,6 @@ | |||
| pub(crate) mod blame; | ||||
| pub(crate) mod diff; | ||||
| pub(crate) mod error; | ||||
| pub(crate) mod log; | ||||
| pub(crate) mod references; | ||||
| pub(crate) mod repo; | ||||
|  |  | |||
							
								
								
									
										67
									
								
								src/git/reference.rs
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										67
									
								
								src/git/reference.rs
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,67 @@ | |||
| use crate::git::log::into_social_commit; | ||||
| use crate::git::repository::SocialRepo; | ||||
| use crate::git::Error; | ||||
| use git2::{Branch, BranchType, Commit}; | ||||
| use shared::{SocialBranch, SocialCommit, SocialTag}; | ||||
| 
 | ||||
| fn into_social_branch(b: Branch<'_>) -> SocialBranch { | ||||
|     SocialBranch { | ||||
|         name: b.name().unwrap_or(Some("")).unwrap_or("").to_owned(), | ||||
|         head: SocialCommit::default(), | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| fn into_social_tag(name: Option<&str>) -> SocialTag { | ||||
|     SocialTag { | ||||
|         name: name.unwrap_or("").to_owned(), | ||||
|         head: SocialCommit::default(), | ||||
|         annotation: None, | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| pub trait Refs { | ||||
|     fn branches(&self) -> Result<Vec<SocialBranch>, Error>; | ||||
|     fn tags(&self) -> Result<Vec<SocialTag>, Error>; | ||||
| } | ||||
| 
 | ||||
| impl Refs for SocialRepo { | ||||
|     fn branches(&self) -> Result<Vec<SocialBranch>, Error> { | ||||
|         let all_branches = self.repo.branches(Some(BranchType::Local))?; | ||||
|         let mut resulting_brances: Vec<SocialBranch> = vec![]; | ||||
| 
 | ||||
|         for r in all_branches { | ||||
|             r.map(|(branch, _)| { | ||||
|                 let mut sb = into_social_branch(branch); | ||||
|                 self.repo | ||||
|                     .revparse_single(&sb.name) | ||||
|                     .map(|obj| { | ||||
|                         obj.peel_to_commit() | ||||
|                             .map(|c: Commit| { | ||||
|                                 sb.head = into_social_commit(c); | ||||
|                                 resulting_brances.push(sb); | ||||
|                             }) | ||||
|                             .unwrap_or(()); | ||||
|                     }) | ||||
|                     .unwrap_or(()); | ||||
|             }) | ||||
|             .unwrap_or(()); | ||||
|         } | ||||
|         Ok(resulting_brances) | ||||
|     } | ||||
| 
 | ||||
|     fn tags(&self) -> Result<Vec<SocialTag>, Error> { | ||||
|         let tagnames = self.repo.tag_names(None)?; | ||||
|         let mut result: Vec<SocialTag> = vec![]; | ||||
| 
 | ||||
|         for t in tagnames.into_iter() { | ||||
|             let mut st = into_social_tag(t); | ||||
|             let _ = self.repo.revparse_single(&st.name).map(|obj| { | ||||
|                 obj.peel_to_commit().map(|c: Commit| { | ||||
|                     st.head = into_social_commit(c); | ||||
|                     result.push(st); | ||||
|                 }) | ||||
|             }); | ||||
|         } | ||||
|         Ok(result) | ||||
|     } | ||||
| } | ||||
|  | @ -1,4 +1,4 @@ | |||
| use crate::errors::SocialError; | ||||
| use crate::git::error::SocialError; | ||||
| use crate::git::repo::SocialRepo; | ||||
| use crate::git::{SocialBranch, SocialCommit, SocialTag}; | ||||
| use git2::{Branch, BranchType, Commit}; | ||||
|  |  | |||
|  | @ -1,4 +1,4 @@ | |||
| use crate::errors::SocialError; | ||||
| use crate::git::error::SocialError; | ||||
| use git2::{Error as GitError, Repository, Tree}; | ||||
| use std::{fs::read_to_string, path::Path}; | ||||
| 
 | ||||
|  | @ -22,6 +22,7 @@ impl<'repo> SocialRepo { | |||
|             .and_then(|obj| obj.peel_to_tree()) | ||||
|     } | ||||
| 
 | ||||
|     #[allow(dead_code)] | ||||
|     pub fn get_description(&self) -> String { | ||||
|         // The description is in a file named "description",
 | ||||
|         // in the .git directory, or the root directory if bare.
 | ||||
|  |  | |||
							
								
								
									
										34
									
								
								src/git/repository.rs
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										34
									
								
								src/git/repository.rs
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,34 @@ | |||
| use crate::errors::SocialError; | ||||
| use git2::{Error as GitError, Repository, Tree}; | ||||
| use std::{fs::read_to_string, path::Path}; | ||||
| 
 | ||||
| pub struct SocialRepo { | ||||
|     pub repo: Repository, | ||||
| } | ||||
| 
 | ||||
| unsafe impl Send for SocialRepo {} | ||||
| unsafe impl Sync for SocialRepo {} | ||||
| 
 | ||||
| impl SocialRepo { | ||||
|     pub fn new(path: &str) -> Result<Self, SocialError> { | ||||
|         Repository::open(path) | ||||
|             .map(|repo| Self { repo }) | ||||
|             .map_err(|_| { | ||||
|                 let err = "fatal: not a git repository"; | ||||
|                 SocialError::from(err) | ||||
|             }) | ||||
|     } | ||||
| 
 | ||||
|     pub fn get_tree(&self, rev: &str) -> Result<Tree, GitError> { | ||||
|         self.repo | ||||
|             .revparse_single(rev) | ||||
|             .and_then(|obj| obj.peel_to_tree()) | ||||
|     } | ||||
| 
 | ||||
|     pub fn get_description(&self) -> String { | ||||
|         // The description is in a file named "description",
 | ||||
|         // in the .git directory, or the root directory if bare.
 | ||||
|         let git_path = self.repo.path().join(Path::new("description")); | ||||
|         read_to_string(git_path).unwrap_or("".to_string()) | ||||
|     } | ||||
| } | ||||
|  | @ -1,4 +1,4 @@ | |||
| use crate::errors::SocialError; | ||||
| use crate::git::error::SocialError; | ||||
| use crate::git::repo::SocialRepo; | ||||
| use crate::git::{SocialFileContent, SocialTreeEntry}; | ||||
| use git2::{Blob, Error as GitError, Object, ObjectType, TreeEntry}; | ||||
|  | @ -65,9 +65,7 @@ impl LsTree for SocialRepo { | |||
|                             }) | ||||
|                             .and_then(|blob: &Blob| { | ||||
|                                 String::from_utf8(blob.content().to_vec()).map_err(|_| { | ||||
|                                     GitError::from_str( | ||||
|                                         format!("Cannot read file {}", path.display()).as_ref(), | ||||
|                                     ) | ||||
|                                     GitError::from_str(format!("Cannot read file {}", path.display()).as_ref()) | ||||
|                                 }) | ||||
|                             }) | ||||
|                             .map(|content| SocialFileContent { | ||||
|  |  | |||
|  | @ -1,4 +1,3 @@ | |||
| mod errors; | ||||
| mod git; | ||||
| 
 | ||||
| use git::repo::SocialRepo; | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue