@@ -645,19 +645,30 @@ fn mk(config: &Config, opts: &MkOptions<'_>) -> CargoResult<()> {
645
645
init_vcs ( path, vcs, config) ?;
646
646
write_ignore_file ( path, & ignore, vcs) ?;
647
647
648
- let ( author_name, email) = discover_author ( path) ?;
649
- let author = match ( cfg. name , cfg. email , author_name, email) {
650
- ( Some ( name) , Some ( email) , _, _)
651
- | ( Some ( name) , None , _, Some ( email) )
652
- | ( None , Some ( email) , name, _)
653
- | ( None , None , name, Some ( email) ) => {
648
+ let ( discovered_name, discovered_email) = discover_author ( path) ;
649
+
650
+ // "Name <email>" or "Name" or "<email>" or None if neither name nor email is obtained
651
+ // cfg takes priority over the discovered ones
652
+ let author_name = cfg. name . or ( discovered_name) ;
653
+ let author_email = cfg. email . or ( discovered_email) ;
654
+
655
+ let author = match ( author_name, author_email) {
656
+ ( Some ( name) , Some ( email) ) => {
654
657
if email. is_empty ( ) {
655
- name
658
+ Some ( name)
656
659
} else {
657
- format ! ( "{} <{}>" , name, email)
660
+ Some ( format ! ( "{} <{}>" , name, email) )
658
661
}
659
662
}
660
- ( Some ( name) , None , _, None ) | ( None , None , name, None ) => name,
663
+ ( Some ( name) , None ) => Some ( name) ,
664
+ ( None , Some ( email) ) => {
665
+ if email. is_empty ( ) {
666
+ None
667
+ } else {
668
+ Some ( format ! ( "<{}>" , email) )
669
+ }
670
+ }
671
+ ( None , None ) => None ,
661
672
} ;
662
673
663
674
let mut cargotoml_path_specifier = String :: new ( ) ;
@@ -706,7 +717,10 @@ edition = {}
706
717
[dependencies]
707
718
{}"# ,
708
719
name,
709
- toml:: Value :: String ( author) ,
720
+ match author {
721
+ Some ( value) => format!( "{}" , toml:: Value :: String ( value) ) ,
722
+ None => format!( "" ) ,
723
+ } ,
710
724
match opts. edition {
711
725
Some ( edition) => toml:: Value :: String ( edition. to_string( ) ) ,
712
726
None => toml:: Value :: String ( "2018" . to_string( ) ) ,
@@ -781,7 +795,7 @@ fn get_environment_variable(variables: &[&str]) -> Option<String> {
781
795
variables. iter ( ) . filter_map ( |var| env:: var ( var) . ok ( ) ) . next ( )
782
796
}
783
797
784
- fn discover_author ( path : & Path ) -> CargoResult < ( String , Option < String > ) > {
798
+ fn discover_author ( path : & Path ) -> ( Option < String > , Option < String > ) {
785
799
let git_config = find_git_config ( path) ;
786
800
let git_config = git_config. as_ref ( ) ;
787
801
@@ -798,15 +812,10 @@ fn discover_author(path: &Path) -> CargoResult<(String, Option<String>)> {
798
812
. or_else ( || get_environment_variable ( & name_variables[ 3 ..] ) ) ;
799
813
800
814
let name = match name {
801
- Some ( name) => name,
802
- None => {
803
- let username_var = if cfg ! ( windows) { "USERNAME" } else { "USER" } ;
804
- anyhow:: bail!(
805
- "could not determine the current user, please set ${}" ,
806
- username_var
807
- )
808
- }
815
+ Some ( namestr) => Some ( namestr. trim ( ) . to_string ( ) ) ,
816
+ None => None ,
809
817
} ;
818
+
810
819
let email_variables = [
811
820
"CARGO_EMAIL" ,
812
821
"GIT_AUTHOR_EMAIL" ,
@@ -817,7 +826,6 @@ fn discover_author(path: &Path) -> CargoResult<(String, Option<String>)> {
817
826
. or_else ( || git_config. and_then ( |g| g. get_string ( "user.email" ) . ok ( ) ) )
818
827
. or_else ( || get_environment_variable ( & email_variables[ 3 ..] ) ) ;
819
828
820
- let name = name. trim ( ) . to_string ( ) ;
821
829
let email = email. map ( |s| {
822
830
let mut s = s. trim ( ) ;
823
831
@@ -830,7 +838,7 @@ fn discover_author(path: &Path) -> CargoResult<(String, Option<String>)> {
830
838
s. to_string ( )
831
839
} ) ;
832
840
833
- Ok ( ( name, email) )
841
+ ( name, email)
834
842
}
835
843
836
844
fn find_git_config ( path : & Path ) -> Option < GitConfig > {
0 commit comments