diff --git a/README.md b/README.md index 718bc0a..cfc1625 100644 --- a/README.md +++ b/README.md @@ -21,7 +21,6 @@ Are you _**also**_ frustrated from moving your hands away from the keyboard to v ## Features -- [x] GitHub & BitBucket - [x] View Branches, Commits & Issues - [x] Custom Suffix - [x] Custom Remote diff --git a/docs/images/help.png b/docs/images/help.png index 8975026..e1da055 100644 Binary files a/docs/images/help.png and b/docs/images/help.png differ diff --git a/src/bin/git-view.rs b/src/bin/git-view.rs index 0997052..1330713 100644 --- a/src/bin/git-view.rs +++ b/src/bin/git-view.rs @@ -1,6 +1,6 @@ use std::panic::set_hook; -use clap::{command, crate_authors, crate_version, Arg, Command, ErrorKind}; +use clap::{command, crate_description, crate_authors, crate_version, Arg, Command, ErrorKind}; use git_view::Git; use git_view::GitView; @@ -16,14 +16,7 @@ fn main() { let matches = Command::new("git-view") .version(crate_version!()) .author(crate_authors!()) - .about( - "A git sub-command to view your git repository in the browser. - -This currently supports the following URLs: - - github.com - - bitbucket.org -", - ) + .about(crate_description!()) .arg( Arg::new("remote") .long_help("The remote to view git repository on\n[default: default remote]") diff --git a/src/git.rs b/src/git.rs index c96f4c9..83d4e7d 100644 --- a/src/git.rs +++ b/src/git.rs @@ -1,4 +1,3 @@ -use core::fmt; use std::{ borrow::Cow, process::{Command, Output}, @@ -14,16 +13,10 @@ pub(crate) enum Local<'a> { NotBranch, } -#[derive(Debug)] -pub(crate) enum Domain { - GitHub, - BitBucket, -} - #[derive(Debug)] pub(crate) struct Url { pub(crate) protocol: String, - pub(crate) domain: Domain, + pub(crate) domain: String, pub(crate) path: String, } @@ -163,36 +156,11 @@ fn trim(bytes: &[u8]) -> Result { } impl Url { - pub(crate) fn new(protocol: &str, domain: Domain, path: &str) -> Self { + pub(crate) fn new(protocol: &str, domain: &str, path: &str) -> Self { Self { protocol: protocol.into(), - domain, + domain: domain.into(), path: path.into(), } } } - -impl Domain { - pub(crate) fn from_str(s: &str) -> Self { - if s == "bitbucket.org" { - Domain::BitBucket - } else { - Domain::GitHub - } - } -} - -impl PartialEq for Domain { - fn eq(&self, other: &Self) -> bool { - self.to_string() == other.to_string() - } -} - -impl fmt::Display for Domain { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - match self { - Domain::GitHub => write!(f, "github.com"), - Domain::BitBucket => write!(f, "bitbucket.org"), - } - } -} diff --git a/src/lib.rs b/src/lib.rs index 3a99247..9b91e5a 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -4,7 +4,7 @@ mod git; use std::borrow::Cow; use error::{AppError, ErrorType}; -use git::{Domain, GitOutput, GitTrait, Local, Url}; +use git::{GitOutput, GitTrait, Local, Url}; pub use git::Git; @@ -184,7 +184,7 @@ impl<'a> GitView<'a> { match url::Url::parse(git_url) { Ok(url) => Ok(Url::new( url.scheme(), - Domain::from_str(url.host_str().map_or_else(|| "github.com", |host| host)), + url.host_str().map_or_else(|| "github.com", |host| host), url.path() .trim_start_matches('/') .trim_end_matches('/') @@ -205,7 +205,7 @@ impl<'a> GitView<'a> { None => domain, }; - Ok(Url::new(protocol, Domain::from_str(split_domain), path)) + Ok(Url::new(protocol, split_domain, path)) } None => Err(AppError::new( ErrorType::InvalidGitUrl, @@ -239,17 +239,10 @@ impl<'a> GitView<'a> { } // Handle issue flag and no flags - let branch_ref = match &url.domain { - Domain::GitHub => { - if self.is_issue { - format!("/issues/{}", capture_digits(remote_ref)) - } else { - format!("/tree/{}", escape_ascii_chars(remote_ref)) - } - } - Domain::BitBucket => { - format!("/src/{}", remote_ref) - } + let branch_ref = if self.is_issue { + format!("/issues/{}", capture_digits(remote_ref)) + } else { + format!("/tree/{}", escape_ascii_chars(remote_ref)) }; if remote_ref != "master" && remote_ref != "main" { @@ -725,7 +718,7 @@ mod lib_tests { let url = handler.parse_git_url(git_url)?; assert_eq!(url.protocol, "https"); - assert_eq!(url.domain.to_string(), "github.com"); + assert_eq!(url.domain, "github.com"); assert_eq!(url.path, "sgoudham/git-view"); Ok(()) @@ -740,7 +733,7 @@ mod lib_tests { let url = handler.parse_git_url(git_url)?; assert_eq!(url.protocol, "https"); - assert_eq!(url.domain.to_string(), "github.com"); + assert_eq!(url.domain, "github.com"); assert_eq!(url.path, "sgoudham/git-view"); Ok(()) @@ -763,7 +756,7 @@ mod lib_tests { mod generate_final_url { use crate::{ - git::{Domain, GitOutput, MockGitTrait, Url}, + git::{GitOutput, MockGitTrait, Url}, GitView, }; use test_case::test_case; @@ -771,7 +764,7 @@ mod lib_tests { #[test] fn is_latest_commit() { let handler = GitView::builder().with_commit("current").build(); - let url = Url::new("https", Domain::GitHub, "sgoudham/git-view"); + let url = Url::new("https", "github.com", "sgoudham/git-view"); let expected_final_url = "https://github.com/sgoudham/git-view/tree/commit_hash"; let mut mock = MockGitTrait::default(); @@ -789,7 +782,7 @@ mod lib_tests { let handler = GitView::builder() .with_commit("8s2jl250as7f234jasfjj") .build(); - let url = Url::new("https", Domain::GitHub, "sgoudham/git-view"); + let url = Url::new("https", "github.com", "sgoudham/git-view"); let expected_final_url = "https://github.com/sgoudham/git-view/tree/8s2jl250as7f234jasfjj"; let mock = MockGitTrait::default(); @@ -800,37 +793,11 @@ mod lib_tests { assert_eq!(actual_final_url.unwrap(), expected_final_url); } - #[test] - fn is_bitbucket() { - let handler = GitView::default(); - let url = Url::new("https", Domain::BitBucket, "sgoudham/git-view"); - let expected_final_url = "https://bitbucket.org/sgoudham/git-view/src/dev"; - let mock = MockGitTrait::default(); - - let actual_final_url = handler.generate_final_url("dev", &url, &mock); - - assert!(actual_final_url.is_ok()); - assert_eq!(actual_final_url.unwrap(), expected_final_url); - } - - #[test] - fn is_github() { - let handler = GitView::default(); - let url = Url::new("https", Domain::GitHub, "sgoudham/git-view"); - let expected_final_url = "https://github.com/sgoudham/git-view/tree/dev"; - let mock = MockGitTrait::default(); - - let actual_final_url = handler.generate_final_url("dev", &url, &mock); - - assert!(actual_final_url.is_ok()); - assert_eq!(actual_final_url.unwrap(), expected_final_url); - } - #[test_case("main" ; "main")] #[test_case("master" ; "master")] fn is_master_or_main(branch: &str) { let handler = GitView::default(); - let url = Url::new("https", Domain::GitHub, "sgoudham/git-view"); + let url = Url::new("https", "github.com", "sgoudham/git-view"); let expected_final_url = "https://github.com/sgoudham/git-view"; let mock = MockGitTrait::default(); @@ -843,7 +810,7 @@ mod lib_tests { #[test] fn is_user_issue() { let handler = GitView::builder().with_issue(true).build(); - let url = Url::new("https", Domain::GitHub, "sgoudham/git-view"); + let url = Url::new("https", "github.com", "sgoudham/git-view"); let expected_final_url = "https://github.com/sgoudham/git-view/issues/1234"; let mock = MockGitTrait::default(); @@ -856,7 +823,7 @@ mod lib_tests { #[test] fn is_normal_branch() { let handler = GitView::builder().with_issue(false).build(); - let url = Url::new("https", Domain::GitHub, "sgoudham/git-view"); + let url = Url::new("https", "github.com", "sgoudham/git-view"); let expected_final_url = "https://github.com/sgoudham/git-view/tree/%23test%23"; let mock = MockGitTrait::default(); @@ -870,7 +837,7 @@ mod lib_tests { #[test_case("dev", "https://github.com/sgoudham/git-view/tree/dev/releases" ; "with_branch_dev")] fn with_suffix(remote_ref: &str, expected_final_url: &str) { let handler = GitView::builder().with_suffix("/releases").build(); - let url = Url::new("https", Domain::GitHub, "sgoudham/git-view"); + let url = Url::new("https", "github.com", "sgoudham/git-view"); let mock = MockGitTrait::default(); let actual_final_url = handler.generate_final_url(remote_ref, &url, &mock);