-
Notifications
You must be signed in to change notification settings - Fork 37
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
READY : (willbe): Add "publish_diff" command and related functions #1230
Merged
Merged
Changes from all commits
Commits
Show all changes
6 commits
Select commit
Hold shift + click to select a range
2edeb1f
Add "publish_diff" command and related functions
Barsik-sus 7cacbb6
Update publish_diff function and improve crate comparison logic
Barsik-sus 20e72be
Sort diffs in package.rs
Barsik-sus 53c5f9f
Capture and handle stderr output in process tools
Barsik-sus f98a985
Merge remote-tracking branch 'upstream/alpha' into willbe_publish_diff
Barsik-sus d243fe1
Add feature to compare local and remote package versions
Barsik-sus File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,38 @@ | ||
/// Internal namespace. | ||
mod private | ||
{ | ||
use crate::*; | ||
|
||
use std::path::PathBuf; | ||
use crates_tools::CrateArchive; | ||
|
||
use _path::AbsolutePath; | ||
use wtools::error::for_app::Result; | ||
use diff::{ DiffReport, crate_diff }; | ||
|
||
/// Return the differences between a local and remote package versions. | ||
#[ cfg_attr( feature = "tracing", tracing::instrument ) ] | ||
pub fn publish_diff( path : PathBuf ) -> Result< DiffReport > | ||
{ | ||
let path = AbsolutePath::try_from( path )?; | ||
let dir = CrateDir::try_from( path )?; | ||
|
||
let package = package::Package::try_from( dir.clone() )?; | ||
let name = &package.name()?; | ||
let version = &package.version()?; | ||
|
||
_ = cargo::pack( cargo::PackOptions::former().path( dir.as_ref() ).dry( false ).form() )?; | ||
let l = CrateArchive::read( packed_crate::local_path( name, version, dir )? )?; | ||
let r = CrateArchive::download_crates_io( name, version ).unwrap(); | ||
|
||
Ok( crate_diff( &l, &r ) ) | ||
} | ||
} | ||
|
||
// | ||
|
||
crate::mod_interface! | ||
{ | ||
/// Publishes the difference between the local and published versions of a package. | ||
orphan use publish_diff; | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,39 @@ | ||
mod private | ||
{ | ||
use crate::*; | ||
|
||
use std::path::PathBuf; | ||
use wca::Args; | ||
|
||
use wtools::error::Result; | ||
|
||
/// Command to display the differences between a local and remote package versions. | ||
/// | ||
/// # Arguments | ||
/// | ||
/// * `args` - Command line arguments. | ||
/// | ||
/// # Returns | ||
/// | ||
/// Returns a `Result` indicating success or failure. | ||
/// | ||
/// # Errors | ||
/// | ||
/// Returns an error if there is an issue with the command. | ||
pub fn publish_diff( args : Args ) -> Result< () > | ||
{ | ||
let path : PathBuf = args.get_owned( 0 ).unwrap_or( std::env::current_dir()? ); | ||
|
||
println!( "{}", action::publish_diff( path )? ); | ||
|
||
Ok( () ) | ||
} | ||
} | ||
|
||
// | ||
|
||
crate::mod_interface! | ||
{ | ||
/// Publishes the difference between the local and published versions of a package. | ||
orphan use publish_diff; | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,113 @@ | ||
mod private | ||
{ | ||
use crate::*; | ||
|
||
use std:: | ||
{ | ||
collections::HashSet, | ||
fmt::Formatter, | ||
path::PathBuf, | ||
}; | ||
use colored::Colorize; | ||
use crates_tools::CrateArchive; | ||
|
||
use wtools::iter::Itertools; | ||
|
||
/// The `Diff` enum is designed to represent differences between two versions | ||
/// of some kind of item identified. | ||
#[ derive( Debug ) ] | ||
pub enum Diff< T > | ||
{ | ||
/// This variant represents items that are identical or same in both versions. | ||
Same( T ), | ||
/// This variant represents items that exists in both versions but have been modified. | ||
Modified( T ), | ||
/// This variant represents items that were added. | ||
Add( T ), | ||
/// This variant represents items that were removed. | ||
Rem( T ), | ||
} | ||
|
||
/// The `DiffReport` struct represents a diff report containing a list of `Diff` objects. | ||
#[ derive( Debug, Default ) ] | ||
pub struct DiffReport( Vec< Diff< PathBuf > > ); | ||
|
||
impl std::fmt::Display for DiffReport | ||
{ | ||
fn fmt( &self, f : &mut Formatter< '_ > ) -> std::fmt::Result | ||
{ | ||
for diff in self.0.iter() | ||
.sorted_by_key( | d | match d { Diff::Modified( df ) | Diff::Same( df ) | Diff::Rem( df ) | Diff::Add( df ) => df } ) | ||
{ | ||
match diff | ||
{ | ||
Diff::Same( t ) => writeln!( f, "{}", t.display() )?, | ||
Diff::Modified( t ) => writeln!( f, "~ {}", t.to_string_lossy().yellow() )?, | ||
Diff::Add( t ) => writeln!( f, "+ {}", t.to_string_lossy().green() )?, | ||
Diff::Rem( t ) => writeln!( f, "- {}", t.to_string_lossy().red() )?, | ||
}; | ||
} | ||
|
||
Ok( () ) | ||
} | ||
} | ||
|
||
/// Compare two crate archives and create a difference report. | ||
/// | ||
/// # Arguments | ||
/// | ||
/// * `left` - A reference to the left crate archive. | ||
/// * `right` - A reference to the right crate archive. | ||
/// | ||
/// # Returns | ||
/// | ||
/// A `DiffReport` struct representing the difference between the two crate archives. | ||
pub fn crate_diff( left : &CrateArchive, right : &CrateArchive ) -> DiffReport | ||
{ | ||
let mut report = DiffReport::default(); | ||
|
||
let local_package_files : HashSet< _ > = left.list().into_iter().collect(); | ||
let remote_package_files : HashSet< _ > = right.list().into_iter().collect(); | ||
|
||
let local_only = local_package_files.difference( &remote_package_files ); | ||
let remote_only = remote_package_files.difference( &local_package_files ); | ||
let both = local_package_files.intersection( &remote_package_files ); | ||
|
||
for &path in local_only | ||
{ | ||
report.0.push( Diff::Add( path.to_path_buf() ) ); | ||
} | ||
|
||
for &path in remote_only | ||
{ | ||
report.0.push( Diff::Rem( path.to_path_buf() ) ); | ||
} | ||
|
||
for &path in both | ||
{ | ||
// unwraps are safe because the paths to the files was compared previously | ||
let local = left.content_bytes( path ).unwrap(); | ||
let remote = right.content_bytes( path ).unwrap(); | ||
|
||
if local == remote | ||
{ | ||
report.0.push( Diff::Same( path.to_path_buf() ) ); | ||
} | ||
else | ||
{ | ||
report.0.push( Diff::Modified( path.to_path_buf() ) ); | ||
} | ||
} | ||
|
||
report | ||
} | ||
} | ||
|
||
// | ||
|
||
crate::mod_interface! | ||
{ | ||
protected use Diff; | ||
protected use DiffReport; | ||
protected use crate_diff; | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
!