Skip to content

Commit

Permalink
Merge pull request #1997 from OCamlPro/name-dot-opam
Browse files Browse the repository at this point in the history
Allow <name>.opam in the source of packages
  • Loading branch information
AltGr committed Feb 13, 2015
2 parents a7e79d1 + e15f1a6 commit 7f680b4
Show file tree
Hide file tree
Showing 7 changed files with 68 additions and 31 deletions.
1 change: 1 addition & 0 deletions CHANGES
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@
correct OPAM path
* ~/.opam/config doesn't refer to OPAM's patch-version anymore, to allow
downgrading
* Recognise <name>.opam files and directories when pinning a package to source
* Lots of bug-fixes

1.2.0
Expand Down
18 changes: 15 additions & 3 deletions src/client/opamArg.ml
Original file line number Diff line number Diff line change
Expand Up @@ -1542,7 +1542,18 @@ let pin ?(unpin_only=false) () =
| Some name -> name
| None -> raise Not_found
with e -> OpamMisc.fatal e; raise Not_found
else raise Not_found
else
match
Array.fold_left (fun acc f ->
if OpamMisc.ends_with ~suffix:".opam" f then
if acc = None then
Some (OpamMisc.remove_suffix ~suffix:".opam" f)
else raise Not_found (* multiple .opam files *)
else acc)
None (Sys.readdir (OpamFilename.Dir.to_string path))
with
| Some base -> OpamPackage.Name.of_string base
| None -> raise Not_found
in
let pin global_options kind edit no_act dev_repo print_short command params =
apply_global_options global_options;
Expand Down Expand Up @@ -1686,8 +1697,9 @@ let source =
move_dir
~src:(OpamPath.Switch.build t.root t.switch nv)
~dst:dir;
OpamGlobals.formatted_msg "Successfully extracted to %s\n" (Dir.to_string dir);
if not (exists OP.(dir // "opam") || exists_dir OP.(dir / "opam"))
OpamGlobals.formatted_msg "Successfully extracted to %s\n"
(Dir.to_string dir);
if OpamState.find_opam_file_in_source (OpamPackage.name nv) dir = None
then
OpamFile.OPAM.write OP.(dir // "opam")
(OpamFile.OPAM.with_substs
Expand Down
2 changes: 1 addition & 1 deletion src/client/opamClient.ml
Original file line number Diff line number Diff line change
Expand Up @@ -446,7 +446,7 @@ module API = struct
OpamSystem.internal_error "opam file location for %s not found"
(OpamPackage.to_string nv)
in
if where then OpamGlobals.msg "%s\n" (OpamFilename.prettify (opam_f ()));
if where then OpamGlobals.msg "%s\n" (OpamFilename.to_string (opam_f ()));

(* where does it come from (eg. which repository) *)
let repository =
Expand Down
12 changes: 6 additions & 6 deletions src/client/opamPinCommand.ml
Original file line number Diff line number Diff line change
Expand Up @@ -133,10 +133,8 @@ let edit t name =
match dir with
| Some dir when OpamFilename.exists_dir dir ->
let src_opam =
OpamFilename.OP.(
if OpamFilename.exists_dir (dir / "opam")
then dir / "opam" // "opam"
else dir // "opam")
OpamMisc.Option.default OpamFilename.OP.(dir // "opam")
(OpamState.find_opam_file_in_source name dir)
in
if OpamGlobals.confirm "Save the new opam file back to %S ?"
(OpamFilename.to_string src_opam) then
Expand Down Expand Up @@ -187,14 +185,16 @@ let pin name ?version pin_option =
let no_changes = pin_option = current in
if no_changes then
OpamGlobals.note
"Package %s is already pinned to %s.\n\
"Package %s is already %s-pinned to %s.\n\
This will erase any previous custom definition."
(OpamPackage.Name.to_string name)
(string_of_pin_kind (kind_of_pin_option current))
(string_of_pin_option current)
else
OpamGlobals.note
"%s is already pinned to %s."
"%s is currently %s-pinned to %s."
(OpamPackage.Name.to_string name)
(string_of_pin_kind (kind_of_pin_option current))
(string_of_pin_option current);
if OpamGlobals.confirm "Proceed ?" then
(OpamFilename.remove
Expand Down
59 changes: 39 additions & 20 deletions src/client/opamState.ml
Original file line number Diff line number Diff line change
Expand Up @@ -507,20 +507,33 @@ let remove_metadata t packages =
OpamFilename.remove archive;
) packages

let find_opam_file_in_source name dir =
List.fold_left (function
| None -> fun f -> if OpamFilename.exists f then Some f else None
| some -> fun _ -> some)
None
[ dir / (OpamPackage.Name.to_string name ^ ".opam") // "opam";
dir // (OpamPackage.Name.to_string name ^ ".opam");
dir / "opam" // "opam";
dir // "opam" ]

(* Returns [opam, descr_file, files_dir]. We don't consider [url] since
this is for pinned packages. if [root], don't look for a subdir [opam]
to find [files] and [descr]. *)
let local_opam ?(root=false) ?fixed_version ?copy_invalid_to name dir =
let has_dir d = if OpamFilename.exists_dir d then Some d else None in
let has_file f = if OpamFilename.exists f then Some f else None in
let opam_dir, descr, files_dir =
if root then dir, has_file (dir // "descr"), has_dir (dir / "files") else
match has_dir (dir / "opam") with
| Some dir -> dir, has_file (dir // "descr"), has_dir (dir / "files")
| None -> dir, None, None
let metadir =
if root then dir else
match has_dir (dir / (OpamPackage.Name.to_string name ^ ".opam")) with
| Some d -> d
| None -> dir / "opam"
in
let opam_file =
if root then has_file (dir // "opam")
else find_opam_file_in_source name dir
in
let opam =
match has_file (opam_dir // "opam") with
let opam = match opam_file with
| None -> None
| Some local_opam ->
try
Expand All @@ -536,13 +549,14 @@ let local_opam ?(root=false) ?fixed_version ?copy_invalid_to name dir =
match copy_invalid_to with
| Some dst ->
OpamGlobals.warning
"Errors in opam file from %s source, \
ignored (fix with 'opam pin edit')"
"Errors in opam file from %s source, ignored (fix with 'opam pin \
edit')"
(OpamPackage.Name.to_string name);
OpamFilename.copy ~src:local_opam ~dst; None
| None -> None
in
opam, descr, files_dir
opam, has_file (metadir // "descr"), has_dir (metadir / "files")


let remove_overlay t name =
OpamFilename.rmdir (OpamPath.Switch.Overlay.package t.root t.switch name)
Expand Down Expand Up @@ -2609,11 +2623,12 @@ let update_pinned_package t ?fixed_version name =
name srcdir
in
let user_meta, old_meta, repo_meta =
if OpamFilename.exists (srcdir // "opam") then
(* Single opam file in the project src (ie not a directory):
match find_opam_file_in_source name srcdir with
| Some f when OpamFilename.dirname f = srcdir ->
(* Single opam file directly at the project root:
don't override other files, restrict to 'opam' *)
just_opam user_meta, just_opam old_meta, just_opam repo_meta
else user_meta, old_meta, repo_meta
| _ -> user_meta, old_meta, repo_meta
in
let rec diff a b = match a,b with
| (f1,h1)::r1, (f2,h2)::r2 ->
Expand All @@ -2631,8 +2646,12 @@ let update_pinned_package t ?fixed_version name =
in
let install_meta dir rm_hash hash =
let root =
let d = dir / (OpamPackage.Name.to_string name ^ ".opam") in
if OpamFilename.exists_dir d then d else
let d = dir / "opam" in
if OpamFilename.exists_dir d then d else dir in
if OpamFilename.exists_dir d then d else
dir
in
List.iter (fun (f, _) -> OpamFilename.remove (overlay // f)) rm_hash;
List.iter (fun (f,kind) -> match kind with
| `Opam o ->
Expand All @@ -2652,28 +2671,28 @@ let update_pinned_package t ?fixed_version name =
was_single_opam_file && old_meta = just_opam user_meta
then
(* No manual changes *)
(OpamGlobals.msg "Installing new package description for %s from %s\n"
(OpamGlobals.formatted_msg
"Installing new package description for %s from %s\n"
(OpamPackage.Name.to_string name)
(Filename.concat (string_of_address (OpamFile.URL.url url)) "opam");
(string_of_address (OpamFile.URL.url url));
OpamFilename.remove
(OpamPath.Switch.Overlay.tmp_opam t.root t.switch name);
install_meta srcdir user_meta new_meta)
else if
OpamGlobals.msg
OpamGlobals.formatted_msg
"Conflicting update of the metadata of %s from %s:\n%s"
(OpamPackage.Name.to_string name)
(string_of_address (OpamFile.URL.url url))
(OpamMisc.itemize diff_to_string (diff user_meta new_meta));
OpamGlobals.confirm "\nOverride files in %s\n\
\ (there will be a backup) ?"
OpamGlobals.confirm "\nOverride files in %s (there will be a backup) ?"
(OpamFilename.Dir.to_string overlay)
then (
let bak =
OpamPath.backup_dir t.root / (OpamPackage.Name.to_string name ^ ".bak") in
OpamFilename.mkdir (OpamPath.backup_dir t.root);
OpamFilename.rmdir bak;
OpamFilename.copy_dir ~src:overlay ~dst:bak;
OpamGlobals.msg "User metadata backed up in %s\n"
OpamGlobals.formatted_msg "User metadata backed up in %s\n"
(OpamFilename.Dir.to_string bak);
install_meta srcdir user_meta new_meta;
);
Expand Down
3 changes: 3 additions & 0 deletions src/client/opamState.mli
Original file line number Diff line number Diff line change
Expand Up @@ -349,6 +349,9 @@ val update_pinned_package: state -> ?fixed_version:version -> name -> bool OpamP
(** Check whether a package is a development package *)
val is_dev_package: state -> package -> bool

(** Looks up an 'opam' file for the given named package in a source directory *)
val find_opam_file_in_source: name -> dirname -> filename option

(** {2 Configuration files} *)

(** Return the .config file for the given package *)
Expand Down
4 changes: 3 additions & 1 deletion src/core/opamGlobals.ml
Original file line number Diff line number Diff line change
Expand Up @@ -475,7 +475,9 @@ let confirm ?(default=true) fmt =
Printf.ksprintf (fun s ->
try
if !safe_mode then false else
let prompt () = msg "%s [%s] " s (if default then "Y/n" else "y/N") in
let prompt () =
formatted_msg "%s [%s] " s (if default then "Y/n" else "y/N")
in
if !yes then (prompt (); msg "y\n"; true)
else if !no then (prompt (); msg "n\n"; false)
else if os () = Win32 then
Expand Down

0 comments on commit 7f680b4

Please sign in to comment.