mirror of
https://github.com/martinvonz/jj.git
synced 2025-01-31 00:12:06 +00:00
run: Teach run
to resolve revsets and about jobs
.
This also adds `jobs`, the argument reading the thread count to use and `shell_command`. While we're at it, make `execute` a no-op and teach `run` to resolve the passed revsets. I also fixed my misunderstanding of `Clap` which makes `jj run 'echo hello world' -r 'mine() & ~origin@remote' --jobs 4` parse correctly. Also contains a small fix in the `pre-commit` example for it.
This commit is contained in:
parent
17bcac6838
commit
8e4b6dfeaa
1 changed files with 33 additions and 10 deletions
|
@ -12,7 +12,13 @@
|
||||||
// See the License for the specific language governing permissions and
|
// See the License for the specific language governing permissions and
|
||||||
// limitations under the License.
|
// limitations under the License.
|
||||||
|
|
||||||
use crate::cli_util::{user_error, CommandError, CommandHelper, RevisionArg};
|
//! This file contains the internal implementation of `run`.
|
||||||
|
|
||||||
|
use std::num::NonZeroUsize;
|
||||||
|
|
||||||
|
use crate::cli_util::{
|
||||||
|
resolve_multiple_nonempty_revsets, user_error, CommandError, CommandHelper, RevisionArg,
|
||||||
|
};
|
||||||
use crate::ui::Ui;
|
use crate::ui::Ui;
|
||||||
|
|
||||||
/// Run a command across a set of revisions.
|
/// Run a command across a set of revisions.
|
||||||
|
@ -24,24 +30,41 @@ use crate::ui::Ui;
|
||||||
/// # Example
|
/// # Example
|
||||||
///
|
///
|
||||||
/// # Run pre-commit on your local work
|
/// # Run pre-commit on your local work
|
||||||
/// $ jj run 'pre-commit.py .github/pre-commit.yaml' -r (main..@) -j 4
|
/// $ jj run 'pre-commit run .github/pre-commit.yaml' -r (trunk()..@) -j 4
|
||||||
///
|
///
|
||||||
/// This allows pre-commit integration and other funny stuff.
|
/// This allows pre-commit integration and other funny stuff.
|
||||||
#[derive(clap::Args, Clone, Debug)]
|
#[derive(clap::Args, Clone, Debug)]
|
||||||
#[command(verbatim_doc_comment)]
|
#[command(verbatim_doc_comment)]
|
||||||
pub(crate) struct RunArgs {
|
pub struct RunArgs {
|
||||||
/// The command to run across all selected revisions.
|
/// The command to run across all selected revisions.
|
||||||
#[arg(long, short, alias = "x")]
|
shell_command: String,
|
||||||
command: String,
|
|
||||||
/// The revisions to change.
|
/// The revisions to change.
|
||||||
|
/// Multiple revsets are accepted and the work will be done on a
|
||||||
|
/// intersection of them.
|
||||||
#[arg(long, short, default_value = "@")]
|
#[arg(long, short, default_value = "@")]
|
||||||
revisions: Vec<RevisionArg>,
|
revisions: Vec<RevisionArg>,
|
||||||
|
/// A no-op option to match the interface of `git rebase -x`.
|
||||||
|
#[arg(short = 'x', hide = true)]
|
||||||
|
unused_command: bool,
|
||||||
|
/// How many processes should run in parallel, uses by default all cores.
|
||||||
|
#[arg(long, short)]
|
||||||
|
jobs: Option<usize>,
|
||||||
}
|
}
|
||||||
|
|
||||||
pub(crate) fn cmd_run(
|
pub fn cmd_run(ui: &mut Ui, command: &CommandHelper, args: &RunArgs) -> Result<(), CommandError> {
|
||||||
_ui: &mut Ui,
|
let workspace_command = command.workspace_helper(ui)?;
|
||||||
_command: &CommandHelper,
|
let _resolved_commits =
|
||||||
_args: &RunArgs,
|
resolve_multiple_nonempty_revsets(&args.revisions, &workspace_command, ui)?;
|
||||||
) -> Result<(), CommandError> {
|
let _jobs = if let Some(_jobs) = args.jobs {
|
||||||
|
_jobs
|
||||||
|
} else {
|
||||||
|
// Use all available cores
|
||||||
|
|
||||||
|
// SAFETY:
|
||||||
|
// We use a internal constant of 4 threads, if it fails
|
||||||
|
let available = std::thread::available_parallelism()
|
||||||
|
.unwrap_or(unsafe { NonZeroUsize::new_unchecked(4) });
|
||||||
|
available.into()
|
||||||
|
};
|
||||||
Err(user_error("This is a stub, do not use"))
|
Err(user_error("This is a stub, do not use"))
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue