diff --git a/sphinx/commands.rst b/sphinx/commands.rst index 81e6492..9b1f026 100644 --- a/sphinx/commands.rst +++ b/sphinx/commands.rst @@ -290,6 +290,8 @@ Where options are: * :code:`--create BOOL` Change project creation status +* :code:`--cross TARGET` Build opam packages for cross-compilation (TARGET=windows|osx) + * :code:`--diff` Print a diff of user-modified files that are being skipped * :code:`--doc BOOL` Whether dependency is only for doc @@ -703,7 +705,7 @@ Update an existing project This command is used to regenerate the files of a project after updating its description. -With argument **--upgrade**, it can also be used to reformat the toml files, from their skeletons. +When generating the files of a project, drom also reformats the toml files, from their skeletons. **USAGE** :: @@ -745,8 +747,6 @@ Where options are: * :code:`--unskip FILE` Remove FILE from skip list -* :code:`--upgrade` Force upgrade of the drom.toml file from the skeleton - * :code:`--virtual` Package is virtual, i.e. no code. Equivalent to **--skeleton virtual**. diff --git a/src/drom_lib/commandDep.ml b/src/drom_lib/commandDep.ml index f77976b..b6252d1 100644 --- a/src/drom_lib/commandDep.ml +++ b/src/drom_lib/commandDep.ml @@ -31,7 +31,6 @@ let print_dep (name, d) = let action ~dep ~package ~tool ~add ~remove ~version ~depname ~deptest ~depdoc ~depopt ~update_args = let p, _inferred_dir = Project.get () in - let upgrade = ref update_args.arg_upgrade in let update package_kind dep_kind deps setdeps = match dep with | None -> @@ -63,7 +62,6 @@ let action ~dep ~package ~tool ~add ~remove ~version ~depname ~deptest ~depdoc dep_pin = None ; (* TODO *) } in - upgrade := true; Printf.eprintf "Adding %s %s dependency %S\n%!" package_kind dep_kind dep; setdeps ((dep, d) :: deps) @@ -74,7 +72,6 @@ let action ~dep ~package ~tool ~add ~remove ~version ~depname ~deptest ~depdoc if remove then begin let deps = List.filter (fun (name, _) -> name <> dep) deps in setdeps deps; - upgrade := true; Printf.eprintf "Removed %s %s dependency %S\n%!" package_kind dep_kind dep end else @@ -86,7 +83,6 @@ let action ~dep ~package ~tool ~add ~remove ~version ~depname ~deptest ~depdoc match version with | None -> d | Some version -> - upgrade := true; { d with depversions = Package.versions_of_string version } @@ -95,7 +91,6 @@ let action ~dep ~package ~tool ~add ~remove ~version ~depname ~deptest ~depdoc match depname with | None -> d | Some depname -> - upgrade := true; { d with depname = ( if depname = dep then @@ -108,28 +103,21 @@ let action ~dep ~package ~tool ~add ~remove ~version ~depname ~deptest ~depdoc match deptest with | None -> d | Some deptest -> - upgrade := true; { d with deptest } in let d = match depdoc with | None -> d | Some depdoc -> - upgrade := true; { d with depdoc } in let d = match depopt with | None -> d | Some depopt -> - upgrade := true; { d with depopt } in - if not !upgrade then begin - print_dep (dep, d); - exit 0 - end; Printf.eprintf "Updating %s %s dependency %S\n%!" package_kind dep_kind dep; (name, d) @@ -167,15 +155,9 @@ let action ~dep ~package ~tool ~add ~remove ~version ~depname ~deptest ~depdoc p.packages end; - if !upgrade then ( - let share = Share.load ~share_args:update_args.arg_share ~p () in - let update_args = { update_args with - arg_upgrade = !upgrade ; - } - in - Update.update_files share ~twice:false ~git:true p ~update_args; - () - ) + let share = Share.load ~share_args:update_args.arg_share ~p () in + Update.update_files share ~twice:false ~git:true p ~update_args; + () let generate_opam_for_cross ~cross ~update_args () = let share_args = update_args.arg_share in diff --git a/src/drom_lib/commandNew.ml b/src/drom_lib/commandNew.ml index 859b29e..38ab8f2 100644 --- a/src/drom_lib/commandNew.ml +++ b/src/drom_lib/commandNew.ml @@ -255,7 +255,6 @@ let cmd = let skeleton = ref None in let dir = ref None in let update_args, update_specs = Update.args ~set_share:true () in - update_args.arg_upgrade <- true; EZCMD.sub cmd_name ~args: ( update_specs diff --git a/src/drom_lib/commandPackage.ml b/src/drom_lib/commandPackage.ml index f2629d7..dbd8fc7 100644 --- a/src/drom_lib/commandPackage.ml +++ b/src/drom_lib/commandPackage.ml @@ -72,12 +72,11 @@ let rename_package hashes package new_name = { package with dir = new_dir; name = new_name } -let upgrade_package package licenses ~upgrade ~kind ~files = +let upgrade_package package licenses ~kind ~files = ( match kind with | None -> () | Some kind -> - package.kind <- kind; - upgrade := true ); + package.kind <- kind ); begin match files with @@ -165,43 +164,39 @@ let action ~edit ~package_name ~kind ~dir ?create ~remove ?rename ~update_args ~ p in let share = Share.load ~share_args ~p () in - let upgrade = - Hashes.with_ctxt ~git:true (fun hashes -> + Hashes.with_ctxt ~git:true (fun hashes -> + if remove then begin + if create <> None then + Error.raise "--remove and --create are incompatible"; - if remove then begin - if create <> None then - Error.raise "--remove and --create are incompatible"; - - if p.package.name = name then Error.raise "Cannot remove main package"; - if List.for_all (fun package -> package.name <> name) p.packages then - Error.raise "No such package to remove"; - p.packages <- - List.filter - (fun package -> - if package.name = name then begin - remove_package hashes package; - false - end else - true ) - p.packages; - true - end else - let upgrade = - match create with - | Some skeleton -> + if p.package.name = name then Error.raise "Cannot remove main package"; + if List.for_all (fun package -> package.name <> name) p.packages then + Error.raise "No such package to remove"; + p.packages <- + List.filter + (fun package -> + if package.name = name then begin + remove_package hashes package; + false + end else + true ) + p.packages + end else + begin match create with + | Some skeleton -> if List.exists (fun package -> package.name = name) p.packages then Error.raise "A package with this name already exists"; let dir = match dir with | None -> - let dir = - if inferred_dir = "" then - "src" - else - inferred_dir - in - dir // name + let dir = + if inferred_dir = "" then + "src" + else + inferred_dir + in + dir // name | Some dir -> dir in let kind = @@ -217,16 +212,15 @@ let action ~edit ~package_name ~kind ~dir ?create ~remove ?rename ~update_args ~ match list with | [] -> package | content :: super -> - let package = iter_skeleton super in - let content = Subst.package - (Subst.state () share package) content in - Package.of_string ~msg:"package.toml template" content + let package = iter_skeleton super in + let content = Subst.package + (Subst.state () share package) content in + Package.of_string ~msg:"package.toml template" content in let skeleton = Skeleton.lookup_package share skeleton in let package = iter_skeleton skeleton.skeleton_toml in - p.packages <- p.packages @ [ package ]; - true - | None -> ( + p.packages <- p.packages @ [ package ] + | None -> ( if List.for_all (fun package -> package.name <> name) p.packages then Error.raise "No such package to modify"; @@ -234,35 +228,31 @@ let action ~edit ~package_name ~kind ~dir ?create ~remove ?rename ~update_args ~ Error.raise "Option --dir is not available for update"; match rename with | Some new_name -> - if p.package.name = name then - Error.raise "Cannot rename main package"; - if - List.exists - (fun package -> package.name = new_name) - p.packages - then - Error.raise - "Cannot rename to an already existing package name"; - p.packages <- - List.map - (fun package -> - if package.name = name then - rename_package hashes package new_name - else - package ) - p.packages; - true - | None -> edit ) - in - let upgrade = ref upgrade in - List.iter - (fun package -> - if package.name = name then - upgrade_package package share ~upgrade ~kind ~files ) - p.packages; - !upgrade ) - in - let update_args = { update_args with arg_upgrade = upgrade } in + if p.package.name = name then + Error.raise "Cannot rename main package"; + if + List.exists + (fun package -> package.name = new_name) + p.packages + then + Error.raise + "Cannot rename to an already existing package name"; + p.packages <- + List.map + (fun package -> + if package.name = name then + rename_package hashes package new_name + else + package ) + p.packages + | None -> ()) + end; + List.iter + (fun package -> + if package.name = name then + upgrade_package package share ~kind ~files ) + p.packages + ); let twice = create <> None in Update.update_files share ~twice ~git:true p ~update_args; () diff --git a/src/drom_lib/commandProject.ml b/src/drom_lib/commandProject.ml index 4a035f7..cb37882 100644 --- a/src/drom_lib/commandProject.ml +++ b/src/drom_lib/commandProject.ml @@ -45,16 +45,6 @@ let action ~skeleton ~edit ~update_args = in (* Used to check that the project exists. *) let _sk : skeleton = Skeleton.lookup_project share skeleton in - let update_args = - { update_args with - arg_upgrade = - ( if p.skeleton <> Some skeleton then begin - p.skeleton <- Some skeleton; - true - end else - update_args.arg_upgrade ) - } - in Update.update_files share ~twice:false ~update_args ~git:true p let cmd = @@ -67,17 +57,13 @@ let cmd = ( update_specs @ [ ( [ "library" ], Arg.Unit - (fun () -> - skeleton := Some "library"; - update_args.arg_upgrade <- true ), + (fun () -> skeleton := Some "library"), EZCMD.info "Project contains only a library. Equivalent to $(b,--skeleton \ library)" ); ( [ "program" ], Arg.Unit - (fun () -> - skeleton := Some "program"; - update_args.arg_upgrade <- true ), + (fun () -> skeleton := Some "program"), EZCMD.info "Project contains a program. Equivalent to $(b,--skeleton \ program). The generated project will be composed of a \ @@ -85,24 +71,16 @@ let cmd = $(b,Main.main) of the library." ); ( [ "virtual" ], Arg.Unit - (fun () -> - skeleton := Some "virtual"; - update_args.arg_upgrade <- true ), + (fun () -> skeleton := Some "virtual"), EZCMD.info "Package is virtual, i.e. no code. Equivalent to $(b,--skeleton \ virtual)." ); ( [ "skeleton" ], Arg.String - (fun s -> - skeleton := Some s; - update_args.arg_upgrade <- true ), + (fun s -> skeleton := Some s), EZCMD.info ~docv:"SKELETON" "Create project using a predefined skeleton or one specified in \ ~/.config/drom/skeletons/" ); - ( [ "upgrade" ], - Arg.Unit (fun () -> update_args.arg_upgrade <- true), - EZCMD.info "Force upgrade of the drom.toml file from the skeleton" - ); ([ "edit" ], Arg.Set edit, EZCMD.info "Edit project description"); ] ) ~doc:"Update an existing project" @@ -113,7 +91,7 @@ let cmd = "This command is used to regenerate the files of a project after \ updating its description."; `P - "With argument $(b,--upgrade), it can also be used to reformat \ + "When generating the files of a project, drom also reformats \ the toml files, from their skeletons." ] ] diff --git a/src/drom_lib/types.ml b/src/drom_lib/types.ml index a61a1ad..41e02ab 100644 --- a/src/drom_lib/types.ml +++ b/src/drom_lib/types.ml @@ -320,8 +320,7 @@ type share_args = { } type update_args = - { mutable arg_upgrade : bool; - mutable arg_force : bool; + { mutable arg_force : bool; mutable arg_diff : bool; mutable arg_skip : (bool * string) list; mutable arg_promote_skip : bool; diff --git a/src/drom_lib/update.ml b/src/drom_lib/update.ml index 3a44824..c6aef96 100644 --- a/src/drom_lib/update.ml +++ b/src/drom_lib/update.ml @@ -19,8 +19,7 @@ open Types exception Skip let default_args ~share_args () = - { arg_upgrade = false; - arg_force = false; + { arg_force = false; arg_diff = false; arg_skip = []; arg_promote_skip = false; @@ -42,15 +41,11 @@ let args ?(set_share=false) () = ); ( [ "skip" ], Arg.String - (fun s -> - args.arg_skip <- (true, s) :: args.arg_skip; - args.arg_upgrade <- true ), + (fun s -> args.arg_skip <- (true, s) :: args.arg_skip), EZCMD.info ~docv:"FILE" "Add $(docv) to skip list" ); ( [ "unskip" ], Arg.String - (fun s -> - args.arg_skip <- (false, s) :: args.arg_skip; - args.arg_upgrade <- true ), + (fun s -> args.arg_skip <- (false, s) :: args.arg_skip), EZCMD.info ~docv:"FILE" "Remove $(docv) from skip list" ); ( [ "diff" ], Arg.Unit (fun () -> args.arg_diff <- true), @@ -110,10 +105,9 @@ let update_files share ?update_args ?(git = false) p = | Some args -> args in let share_args = args.arg_share in - let changed = false in - let p, changed = + let p = match args.arg_skip with - | [] -> (p, changed) + | [] -> p | skip -> let skip = List.fold_left @@ -124,33 +118,32 @@ let update_files share ?update_args ?(git = false) p = EzList.remove elem skips ) p.skip skip in - let p = { p with skip } in - (p, true) + { p with skip } in - let p, changed = + let p = match args.arg_edition with - | None -> (p, changed) - | Some edition -> ({ p with edition }, true) + | None -> p + | Some edition -> { p with edition } in - let p, changed = + let p = match args.arg_min_edition with - | None -> (p, changed) - | Some min_edition -> ({ p with min_edition }, true) + | None -> p + | Some min_edition -> { p with min_edition } in - let p, changed = + let p = match args, p with { arg_share = { arg_share_version = Some "0.8.0"; arg_share_repo = None ; _ } ; _ }, { project_share_version = (None | Some "0.8.0"); project_share_repo = None ; _ } -> - p, changed (* do nothing for compatibility with version = 0.8.0 *) + p (* do nothing for compatibility with version = 0.8.0 *) | _ -> - let p, changed = + let p = match args.arg_share.arg_share_version with - | None -> (p, changed) + | None -> p | Some arg_share_version -> if args.arg_share.arg_share_version <> p.project_share_version then let project_share_repo = match p.project_share_repo with @@ -158,17 +151,17 @@ let update_files share ?update_args ?(git = false) p = | Some project_share_repo -> Some project_share_repo in let project_share_version = Some arg_share_version in - ({ p with project_share_version ; project_share_repo }, true) + { p with project_share_version ; project_share_repo } else - (p, changed) + p in match share_args.arg_share_repo with - | None -> (p, changed) + | None -> p | project_share_repo -> if share_args.arg_share_repo <> p.project_share_repo then - ({ p with project_share_repo }, true) + { p with project_share_repo } else - (p, changed) + p in let can_skip = ref [] in @@ -308,26 +301,20 @@ let update_files share ?update_args ?(git = false) p = let config = Config.get () in - let p, changed = - if args.arg_upgrade then - let p, changed = - match (p.github_organization, config.config_github_organization) with - | None, Some s -> ({ p with github_organization = Some s }, true) - | _ -> (p, changed) - in - let p, changed = - match (p.authors, config.config_author) with - | [], Some s -> ({ p with authors = [ s ] }, true) - | _ -> (p, changed) - in - let p, changed = - match (p.copyright, config.config_copyright) with - | None, Some s -> ({ p with copyright = Some s }, true) - | _ -> (p, changed) - in - (p, changed) - else - (p, changed) + let p = + match (p.github_organization, config.config_github_organization) with + | None, Some s -> { p with github_organization = Some s } + | _ -> p + in + let p = + match (p.authors, config.config_author) with + | [], Some s -> { p with authors = [ s ] } + | _ -> p + in + let p = + match (p.copyright, config.config_copyright) with + | None, Some s -> { p with copyright = Some s } + | _ -> p in List.iter (fun package -> package.project <- p) p.packages; @@ -437,19 +424,13 @@ let update_files share ?update_args ?(git = false) p = drom_ignore; end ; - let upgrade = args.arg_upgrade || changed in - let skip = not (upgrade || not (Sys.file_exists "drom.toml")) in let files = Project.to_files share p in let files = List.map (fun (file, content) -> let content = - if upgrade then begin - write_file ~skip ~force:upgrade hashes file content; - content - end else - try EzFile.read_file file with - | Sys_error _ -> "" + write_file ~skip:false ~force:true hashes file content; + content in (file, content) ) files