History

feat!: remove `gix remote --url` in favor of determining the intention similar to `git fetch` (#450)

Sebastian Thiel committed 4 years ago

Commit 92bbe331 parent 8c7351c4 files · +22 −35Browse files

Unified · Split

4 files
  1. gitoxide-core/src/repository/fetch.rs +1 −3
  2. gitoxide-core/src/repository/remote.rs +17 −16
  3. src/plumbing/main.rs +2 −6
  4. src/plumbing/options/mod.rs +2 −10
gitoxide-core/src/repository/fetch.rs+1−3
@@ -6,7 +6,6 @@ pub struct Options { · 5 unmodified lines
66 pub format: OutputFormat,
77 pub dry_run: bool,
88 pub remote: Option<String>,
9− pub url: Option<git::Url>,
109 /// If non-empty, override all ref-specs otherwise configured in the remote
1110 pub ref_specs: Vec<BString>,
1211 }
@@ -27,11 +26,10 @@ pub(crate) mod function { · 14 unmodified lines
2726 format,
2827 dry_run,
2928 remote,
30− url,
3129 ref_specs,
3230 }: Options,
3331 ) -> anyhow::Result<()> {
34− let _remote = crate::repository::remote::by_name_or_url(&repo, remote.as_deref(), url)?;
32+ let _remote = crate::repository::remote::by_name_or_url(&repo, remote.as_deref())?;
3533 todo!()
3634 }
3735 }
gitoxide-core/src/repository/remote.rs+17−16
@@ -21,10 +21,9 @@ mod refs_impl { · 20 unmodified lines
2121 Tracking { ref_specs: Vec<BString> },
2222 }
2323
24− pub struct Context {
24+ pub struct Options {
2525 pub format: OutputFormat,
26− pub name: Option<String>,
27− pub url: Option<git_repository::Url>,
26+ pub name_or_url: Option<String>,
2827 pub handshake_info: bool,
2928 }
3029
@@ -38,15 +37,14 @@ mod refs_impl { · 7 unmodified lines
3837 mut progress: impl git::Progress,
3938 mut out: impl std::io::Write,
4039 err: impl std::io::Write,
41− refs::Context {
40+ refs::Options {
4241 format,
43− name,
44− url,
42+ name_or_url,
4543 handshake_info,
46− }: refs::Context,
44+ }: refs::Options,
4745 ) -> anyhow::Result<()> {
4846 use anyhow::Context;
49− let mut remote = by_name_or_url(&repo, name.as_deref(), url)?;
47+ let mut remote = by_name_or_url(&repo, name_or_url.as_deref())?;
5048 if let refs::Kind::Tracking { ref_specs, .. } = &kind {
5149 if format != OutputFormat::Human {
5250 bail!("JSON output isn't yet supported for listing ref-mappings.");
@@ -255,17 +253,20 @@ use git_repository as git; · 202 unmodified lines
255253
256254 pub(crate) fn by_name_or_url<'repo>(
257255 repo: &'repo git::Repository,
258− name: Option<&str>,
259− url: Option<git::Url>,
256+ name_or_url: Option<&str>,
260257 ) -> anyhow::Result<git::Remote<'repo>> {
261− use anyhow::{bail, Context};
262− Ok(match (name, url) {
263− (Some(name), None) => repo.find_remote(&name)?,
264− (None, None) => repo
258+ use anyhow::Context;
259+ Ok(match name_or_url {
260+ Some(name) => {
261+ if name.contains('/') {
262+ repo.remote_at(git::url::parse(name.into())?)?
263+ } else {
264+ repo.find_remote(&name)?
265+ }
266+ }
267+ None => repo
265268 .head()?
266269 .into_remote(git::remote::Direction::Fetch)
267270 .context("Cannot find a remote for unborn branch")??,
268− (None, Some(url)) => repo.remote_at(url)?,
269− (Some(_), Some(_)) => bail!("Must not set both the remote name and the url - they are mutually exclusive"),
270271 })
271272 }
src/plumbing/main.rs+2−6
@@ -118,14 +118,12 @@ pub fn main() -> Result<()> { · 117 unmodified lines
118118 dry_run,
119119 remote,
120120 ref_spec,
121− url,
122121 }) => {
123122 let opts = core::repository::fetch::Options {
124123 format,
125124 dry_run,
126125 remote,
127126 ref_specs: ref_spec,
128− url,
129127 };
130128 prepare_and_run(
131129 "fetch",
@@ -150,7 +148,6 @@ pub fn main() -> Result<()> { · 18 unmodified lines
150148 #[cfg_attr(feature = "small", allow(unused_variables))]
151149 Subcommands::Remote(remote::Platform {
152150 name,
153− url,
154151 cmd,
155152 handshake_info,
156153 }) => match cmd {
@@ -162,9 +159,8 @@ pub fn main() -> Result<()> { · 5 unmodified lines
162159 core::repository::remote::refs::Kind::Tracking { ref_specs: ref_spec }
163160 }
164161 };
165− let context = core::repository::remote::refs::Context {
166− name,
167− url,
162+ let context = core::repository::remote::refs::Options {
163+ name_or_url: name,
168164 format,
169165 handshake_info,
170166 };
src/plumbing/options/mod.rs+2−10
@@ -123,16 +123,12 @@ pub mod fetch { · 122 unmodified lines
123123 #[clap(long, short = 'n')]
124124 pub dry_run: bool,
125125
126− /// The name of the remote to connect to.
126+ /// The name of the remote to connect to, or the url of the remote to connect to directly.
127127 ///
128128 /// If unset, the current branch will determine the remote.
129129 #[clap(long, short = 'r')]
130130 pub remote: Option<String>,
131131
132− /// Connect directly to the given URL, forgoing any configuration from the repository.
133− #[clap(long, short = 'u', conflicts_with("remote"), parse(try_from_os_str = std::convert::TryFrom::try_from))]
134− pub url: Option<git::Url>,
135−
136132 /// Override the built-in and configured ref-specs with one or more of the given ones.
137133 #[clap(parse(try_from_os_str = git::env::os_str_to_bstring))]
138134 pub ref_spec: Vec<git_repository::bstr::BString>,
@@ -144,16 +140,12 @@ pub mod remote { · 5 unmodified lines
144140
145141 #[derive(Debug, clap::Parser)]
146142 pub struct Platform {
147− /// The name of the remote to connect to.
143+ /// The name of the remote to connect to, or the URL of the remote to connect to directly.
148144 ///
149145 /// If unset, the current branch will determine the remote.
150146 #[clap(long, short = 'n')]
151147 pub name: Option<String>,
152148
153− /// Connect directly to the given URL, forgoing any configuration from the repository.
154− #[clap(long, short = 'u', conflicts_with("name"), parse(try_from_os_str = std::convert::TryFrom::try_from))]
155− pub url: Option<git::Url>,
156−
157149 /// Output additional typically information provided by the server as part of the connection handshake.
158150 #[clap(long)]
159151 pub handshake_info: bool,