diff --git a/src/bin/cargo/commands/package.rs b/src/bin/cargo/commands/package.rs index 92383dfb1f9..166fddf3c39 100644 --- a/src/bin/cargo/commands/package.rs +++ b/src/bin/cargo/commands/package.rs @@ -23,7 +23,15 @@ pub fn cli() -> App { )) .arg(opt( "allow-dirty", - "Allow dirty working directories to be packaged", + "Allow dirty working directories to be packaged (deprecated, use include-dirty instead)", + )) + .arg(opt( + "include-dirty", + "Allow dirty files in working directories to be packaged", + )) + .arg(opt( + "include-untracked", + "Allow untracked files in working directories to be packaged", )) .arg_target_triple("Build for the target triple") .arg_target_dir() @@ -42,7 +50,8 @@ pub fn exec(config: &mut Config, args: &ArgMatches<'_>) -> CliResult { verify: !args.is_present("no-verify"), list: args.is_present("list"), check_metadata: !args.is_present("no-metadata"), - allow_dirty: args.is_present("allow-dirty"), + include_dirty: args.is_present("allow-dirty") || args.is_present("include-dirty"), + include_untracked: args.is_present("include-untracked"), targets: args.targets(), jobs: args.jobs()?, cli_features: args.cli_features()?, diff --git a/src/bin/cargo/commands/publish.rs b/src/bin/cargo/commands/publish.rs index 83861e299c1..76f77a1779f 100644 --- a/src/bin/cargo/commands/publish.rs +++ b/src/bin/cargo/commands/publish.rs @@ -14,7 +14,15 @@ pub fn cli() -> App { )) .arg(opt( "allow-dirty", - "Allow dirty working directories to be packaged", + "Allow dirty working directories to be packaged (deprecated, use include-dirty instead)", + )) + .arg(opt( + "include-dirty", + "Allow dirty files in working directories to be packaged", + )) + .arg(opt( + "include-untracked", + "Allow dirty files in working directories to be packaged", )) .arg_target_triple("Build for the target triple") .arg_target_dir() @@ -40,7 +48,8 @@ pub fn exec(config: &mut Config, args: &ArgMatches<'_>) -> CliResult { token: args.value_of("token").map(|s| s.to_string()), index, verify: !args.is_present("no-verify"), - allow_dirty: args.is_present("allow-dirty"), + include_dirty: args.is_present("allow-dirty") || args.is_present("include-dirty"), + include_untracked: args.is_present("include-untracked"), targets: args.targets(), jobs: args.jobs()?, dry_run: args.is_present("dry-run"), diff --git a/src/cargo/ops/cargo_package.rs b/src/cargo/ops/cargo_package.rs index 1056d73fdaa..79fb219daec 100644 --- a/src/cargo/ops/cargo_package.rs +++ b/src/cargo/ops/cargo_package.rs @@ -26,7 +26,8 @@ pub struct PackageOpts<'cfg> { pub config: &'cfg Config, pub list: bool, pub check_metadata: bool, - pub allow_dirty: bool, + pub include_dirty: bool, + pub include_untracked: bool, pub verify: bool, pub jobs: Option, pub targets: Vec, @@ -61,6 +62,24 @@ enum GeneratedFile { VcsInfo(String), } +#[derive(PartialEq, Eq, Debug)] +enum FileState { + Untracked, + Dirty, + SubmoduleDirtyAndUntracked, + Clean, +} + +#[derive(Debug)] +struct RepoState { + /// The ID indicating the current revision of the repo. This may be a hash + /// or other unique identifier for the VCS. + id: String, + /// List of all dirty files found in the repository. Files within a submodule + /// are represented simply by the submodule path. + dirty_files: Vec<(FileState, PathBuf)>, +} + pub fn package(ws: &Workspace<'_>, opts: &PackageOpts<'_>) -> CargoResult> { if ws.root().join("Cargo.lock").exists() { // Make sure the Cargo.lock is up-to-date and valid. @@ -84,17 +103,30 @@ pub fn package(ws: &Workspace<'_>, opts: &PackageOpts<'_>) -> CargoResult