forked from kemitix/git-next
refactor(git): more use of derive_more
This commit is contained in:
parent
ac3e1be261
commit
c374076323
9 changed files with 26 additions and 105 deletions
|
@ -61,7 +61,11 @@ ulid = "1.1"
|
||||||
warp = "0.3"
|
warp = "0.3"
|
||||||
|
|
||||||
# error handling
|
# error handling
|
||||||
derive_more = { version = "1.0.0-beta.6", features = ["from", "display"] }
|
derive_more = { version = "1.0.0-beta.6", features = [
|
||||||
|
"from",
|
||||||
|
"display",
|
||||||
|
"deref",
|
||||||
|
] }
|
||||||
terrors = "0.3"
|
terrors = "0.3"
|
||||||
|
|
||||||
# file watcher
|
# file watcher
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
#[derive(Clone, Debug, PartialEq, Eq)]
|
#[derive(Clone, Debug, PartialEq, Eq, derive_more::Display)]
|
||||||
|
#[display("{}", sha)]
|
||||||
pub struct Commit {
|
pub struct Commit {
|
||||||
sha: Sha,
|
sha: Sha,
|
||||||
message: Message,
|
message: Message,
|
||||||
|
@ -17,34 +18,19 @@ impl Commit {
|
||||||
&self.message
|
&self.message
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
impl std::fmt::Display for Commit {
|
|
||||||
fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
|
|
||||||
write!(f, "{}", self.sha)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#[derive(Clone, Debug, PartialEq, Eq)]
|
#[derive(Clone, Debug, PartialEq, Eq, derive_more::Display)]
|
||||||
pub struct Sha(String);
|
pub struct Sha(String);
|
||||||
impl Sha {
|
impl Sha {
|
||||||
pub const fn new(value: String) -> Self {
|
pub const fn new(value: String) -> Self {
|
||||||
Self(value)
|
Self(value)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
impl std::fmt::Display for Sha {
|
|
||||||
fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
|
|
||||||
write!(f, "{}", self.0)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#[derive(Clone, Debug, PartialEq, Eq)]
|
#[derive(Clone, Debug, PartialEq, Eq, derive_more::Display)]
|
||||||
pub struct Message(String);
|
pub struct Message(String);
|
||||||
impl Message {
|
impl Message {
|
||||||
pub const fn new(value: String) -> Self {
|
pub const fn new(value: String) -> Self {
|
||||||
Self(value)
|
Self(value)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
impl std::fmt::Display for Message {
|
|
||||||
fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
|
|
||||||
write!(f, "{}", self.0)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
#[derive(Copy, Clone, Default, Debug, PartialEq, Eq, PartialOrd, Ord)]
|
#[derive(Copy, Clone, Default, Debug, PartialEq, Eq, PartialOrd, Ord, derive_more::Display)]
|
||||||
pub struct Generation(u32);
|
pub struct Generation(u32);
|
||||||
impl Generation {
|
impl Generation {
|
||||||
pub fn new() -> Self {
|
pub fn new() -> Self {
|
||||||
|
@ -8,8 +8,3 @@ impl Generation {
|
||||||
self.0 += 1
|
self.0 += 1
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
impl std::fmt::Display for Generation {
|
|
||||||
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
|
|
||||||
write!(f, "{}", self.0)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
|
@ -1,5 +1,3 @@
|
||||||
use git_next_config::BranchName;
|
|
||||||
|
|
||||||
use crate::Commit;
|
use crate::Commit;
|
||||||
|
|
||||||
#[derive(Clone, Debug, Hash, PartialEq, Eq, derive_more::Display)]
|
#[derive(Clone, Debug, Hash, PartialEq, Eq, derive_more::Display)]
|
||||||
|
@ -9,8 +7,3 @@ impl From<Commit> for GitRef {
|
||||||
Self(value.sha().to_string())
|
Self(value.sha().to_string())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
impl From<BranchName> for GitRef {
|
|
||||||
fn from(value: BranchName) -> Self {
|
|
||||||
Self(value.to_string())
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
use git_next_config::{Hostname, RepoPath};
|
use git_next_config::{Hostname, RepoPath};
|
||||||
|
|
||||||
#[derive(Clone, Debug, PartialEq, Eq)]
|
#[derive(Clone, Debug, PartialEq, Eq, derive_more::Display)]
|
||||||
|
#[display("{}:{}", host, repo_path)]
|
||||||
pub struct GitRemote {
|
pub struct GitRemote {
|
||||||
host: Hostname,
|
host: Hostname,
|
||||||
repo_path: RepoPath,
|
repo_path: RepoPath,
|
||||||
|
@ -16,8 +17,3 @@ impl GitRemote {
|
||||||
&self.repo_path
|
&self.repo_path
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
impl std::fmt::Display for GitRemote {
|
|
||||||
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
|
|
||||||
write!(f, "{}:{}", self.host, self.repo_path)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
|
@ -6,7 +6,10 @@ use git_next_config::{
|
||||||
use super::{Generation, GitRemote};
|
use super::{Generation, GitRemote};
|
||||||
|
|
||||||
/// The derived information about a repo, used to interact with it
|
/// The derived information about a repo, used to interact with it
|
||||||
#[derive(Clone, Debug)]
|
#[derive(Clone, Debug, derive_more::Display)]
|
||||||
|
#[display("gen-{}:{}:{}/{}:{}@{}/{}@{}", generation, forge.forge_type,
|
||||||
|
forge.forge_name, repo_alias, forge.user, forge.hostname, repo_path,
|
||||||
|
branch)]
|
||||||
pub struct RepoDetails {
|
pub struct RepoDetails {
|
||||||
pub generation: Generation,
|
pub generation: Generation,
|
||||||
pub repo_alias: RepoAlias,
|
pub repo_alias: RepoAlias,
|
||||||
|
@ -57,19 +60,3 @@ impl RepoDetails {
|
||||||
GitRemote::new(self.forge.hostname.clone(), self.repo_path.clone())
|
GitRemote::new(self.forge.hostname.clone(), self.repo_path.clone())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
impl std::fmt::Display for RepoDetails {
|
|
||||||
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
|
|
||||||
write!(
|
|
||||||
f,
|
|
||||||
"gen-{}:{}:{}/{}:{}@{}/{}@{}",
|
|
||||||
self.generation,
|
|
||||||
self.forge.forge_type,
|
|
||||||
self.forge.forge_name,
|
|
||||||
self.repo_alias,
|
|
||||||
self.forge.user,
|
|
||||||
self.forge.hostname,
|
|
||||||
self.repo_path,
|
|
||||||
self.branch,
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
|
@ -3,7 +3,7 @@ use std::{ops::Deref as _, path::PathBuf, sync::atomic::AtomicBool};
|
||||||
|
|
||||||
use super::RepoDetails;
|
use super::RepoDetails;
|
||||||
|
|
||||||
#[derive(Debug, Clone, derive_more::From)]
|
#[derive(Debug, Clone, derive_more::From, derive_more::Deref)]
|
||||||
pub struct Repository(gix::ThreadSafeRepository);
|
pub struct Repository(gix::ThreadSafeRepository);
|
||||||
impl Repository {
|
impl Repository {
|
||||||
pub fn open(gitdir: impl Into<PathBuf>) -> Result<Self, Error> {
|
pub fn open(gitdir: impl Into<PathBuf>) -> Result<Self, Error> {
|
||||||
|
@ -19,15 +19,8 @@ impl Repository {
|
||||||
Ok(repository.into_sync().into())
|
Ok(repository.into_sync().into())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
impl std::ops::Deref for Repository {
|
|
||||||
type Target = gix::ThreadSafeRepository;
|
|
||||||
|
|
||||||
fn deref(&self) -> &Self::Target {
|
#[derive(Debug, derive_more::Display)]
|
||||||
&self.0
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#[derive(Debug)]
|
|
||||||
pub enum Error {
|
pub enum Error {
|
||||||
InvalidGitDir(git_next_config::GitDir),
|
InvalidGitDir(git_next_config::GitDir),
|
||||||
Io(std::io::Error),
|
Io(std::io::Error),
|
||||||
|
@ -39,20 +32,6 @@ pub enum Error {
|
||||||
GixFetch(Box<gix::clone::fetch::Error>),
|
GixFetch(Box<gix::clone::fetch::Error>),
|
||||||
}
|
}
|
||||||
impl std::error::Error for Error {}
|
impl std::error::Error for Error {}
|
||||||
impl std::fmt::Display for Error {
|
|
||||||
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
|
|
||||||
match self {
|
|
||||||
Self::InvalidGitDir(gitdir) => write!(f, "Invalid Git dir: {:?}", gitdir),
|
|
||||||
Self::Io(err) => write!(f, "IO error: {:?}", err),
|
|
||||||
Self::Wait(err) => write!(f, "Waiting for command: {:?}", err),
|
|
||||||
Self::Spawn(err) => write!(f, "Spawning comming: {:?}", err),
|
|
||||||
Self::Validation(err) => write!(f, "Validation: {}", err),
|
|
||||||
Self::GixClone(err) => write!(f, "Clone: {:?}", err),
|
|
||||||
Self::GixOpen(err) => write!(f, "Open: {:?}", err),
|
|
||||||
Self::GixFetch(err) => write!(f, "Fetch: {:?}", err),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
impl From<gix::clone::Error> for Error {
|
impl From<gix::clone::Error> for Error {
|
||||||
fn from(value: gix::clone::Error) -> Self {
|
fn from(value: gix::clone::Error) -> Self {
|
||||||
Self::GixClone(Box::new(value))
|
Self::GixClone(Box::new(value))
|
||||||
|
|
|
@ -59,22 +59,22 @@ pub fn reset(
|
||||||
}
|
}
|
||||||
Err(err) => {
|
Err(err) => {
|
||||||
warn!(?err, ?git_dir, "Failed (wait)");
|
warn!(?err, ?git_dir, "Failed (wait)");
|
||||||
Err(BranchResetError::Push)
|
Err(Error::Push)
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
Err(err) => {
|
Err(err) => {
|
||||||
warn!(?err, ?git_dir, "Failed (spawn)");
|
warn!(?err, ?git_dir, "Failed (spawn)");
|
||||||
Err(BranchResetError::Push)
|
Err(Error::Push)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug, derive_more::From, derive_more::Display)]
|
#[derive(Debug, derive_more::From, derive_more::Display)]
|
||||||
pub enum BranchResetError {
|
pub enum Error {
|
||||||
Open(Box<gix::open::Error>),
|
Open(Box<gix::open::Error>),
|
||||||
Fetch(super::fetch::Error),
|
Fetch(super::fetch::Error),
|
||||||
Push,
|
Push,
|
||||||
}
|
}
|
||||||
impl std::error::Error for BranchResetError {}
|
impl std::error::Error for Error {}
|
||||||
|
|
||||||
pub type Result = core::result::Result<(), BranchResetError>;
|
pub type Result = core::result::Result<(), Error>;
|
||||||
|
|
|
@ -53,41 +53,22 @@ pub fn find_default_remote(
|
||||||
}
|
}
|
||||||
|
|
||||||
type Result<T> = core::result::Result<T, Error>;
|
type Result<T> = core::result::Result<T, Error>;
|
||||||
#[derive(Debug)]
|
#[derive(Debug, derive_more::Display)]
|
||||||
pub enum Error {
|
pub enum Error {
|
||||||
NoDefaultPushRemote,
|
NoDefaultPushRemote,
|
||||||
NoUrlForDefaultPushRemote,
|
NoUrlForDefaultPushRemote,
|
||||||
NoHostnameForDefaultPushRemote,
|
NoHostnameForDefaultPushRemote,
|
||||||
UnableToOpenRepo(String),
|
UnableToOpenRepo(String),
|
||||||
Io(std::io::Error),
|
Io(std::io::Error),
|
||||||
|
#[display("MismatchDefaultPushRemote(found: {found}, expected: {expected})")]
|
||||||
MismatchDefaultPushRemote {
|
MismatchDefaultPushRemote {
|
||||||
found: GitRemote,
|
found: GitRemote,
|
||||||
expected: GitRemote,
|
expected: GitRemote,
|
||||||
},
|
},
|
||||||
|
#[display("MismatchDefaultFetchRemote(found: {found}, expected: {expected})")]
|
||||||
MismatchDefaultFetchRemote {
|
MismatchDefaultFetchRemote {
|
||||||
found: GitRemote,
|
found: GitRemote,
|
||||||
expected: GitRemote,
|
expected: GitRemote,
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
impl std::error::Error for Error {}
|
impl std::error::Error for Error {}
|
||||||
impl std::fmt::Display for Error {
|
|
||||||
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
|
|
||||||
match self {
|
|
||||||
Self::NoDefaultPushRemote => write!(f, "There is no default push remote"),
|
|
||||||
Self::NoUrlForDefaultPushRemote => write!(f, "The default push remote has no url"),
|
|
||||||
Self::NoHostnameForDefaultPushRemote => {
|
|
||||||
write!(f, "The default push remote has no hostname")
|
|
||||||
}
|
|
||||||
Self::UnableToOpenRepo(err) => write!(f, "Unable to open the git dir: {err}"),
|
|
||||||
Self::Io(err) => write!(f, "IO Error: {err:?}"),
|
|
||||||
Self::MismatchDefaultPushRemote { found, expected } => write!(
|
|
||||||
f,
|
|
||||||
"The default push remote doesn't match: {found}, expected: {expected}"
|
|
||||||
),
|
|
||||||
Self::MismatchDefaultFetchRemote { found, expected } => write!(
|
|
||||||
f,
|
|
||||||
"The default fetch remote doesn't match: {found}, expected: {expected}"
|
|
||||||
),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
Loading…
Reference in a new issue