[Libguestfs] [PATCH 2/2] builder: do not parse the same repository file name twice
Richard W.M. Jones
rjones at redhat.com
Thu Mar 20 17:24:24 UTC 2014
On Thu, Mar 20, 2014 at 05:04:25PM +0100, Pino Toscano wrote:
> When parsing the repository configuration files, track the file names
> parsed, and in case of same file name in multiple location consider only
> the one in the directory coming before others in the prioritised list of
> paths.
>
> This way it is possible to "shadow" a configuration file in a system
> path with one with the same name in a local directory, for example.
> ---
> builder/sources.ml | 20 +++++++++++++++-----
> 1 file changed, 15 insertions(+), 5 deletions(-)
>
> diff --git a/builder/sources.ml b/builder/sources.ml
> index 1fee65e..90716bd 100644
> --- a/builder/sources.ml
> +++ b/builder/sources.ml
> @@ -28,6 +28,8 @@ type source = {
> gpgkey : string option;
> }
>
> +module StringSet = Set.Make (String)
> +
> let parse_conf ~prog ~debug file =
> if debug then (
> eprintf (f_"%s: trying to read %s\n") prog file;
> @@ -96,15 +98,23 @@ let read_sources ~prog ~debug =
> | None -> dirs
> | Some dir -> dir :: dirs in
> let dirs = List.map (fun x -> x // "repos.d") dirs in
> - List.fold_right (
> - fun dir acc ->
> + let fnseen = ref StringSet.empty in
> + List.fold_left (
> + fun acc dir ->
> let files =
> try List.filter filter_filenames (Array.to_list (Sys.readdir dir))
> with Sys_error _ -> [] in
> - let files = List.map (fun x -> dir // x) files in
> + let files = List.filter (fun x -> StringSet.mem x !fnseen <> true) files in
> List.fold_left (
> fun acc file ->
> - try merge_sources acc (parse_conf ~prog ~debug file) with
> + try (
> + let s = merge_sources acc (parse_conf ~prog ~debug (dir // file)) in
> + (* Add the current file name to the set only if its parsing
> + * was successful.
> + *)
> + fnseen := StringSet.add file !fnseen;
> + s
> + ) with
> | Unix_error (code, fname, _) ->
> if debug then (
> eprintf (f_"%s: file error: %s: %s\n") prog fname (error_message code)
> @@ -116,4 +126,4 @@ let read_sources ~prog ~debug =
> );
> acc
> ) acc files
> - ) dirs []
> + ) [] dirs
> --
> 1.8.3.1
ACK.
Rich.
--
Richard Jones, Virtualization Group, Red Hat http://people.redhat.com/~rjones
Fedora Windows cross-compiler. Compile Windows programs, test, and
build Windows installers. Over 100 libraries supported.
http://fedoraproject.org/wiki/MinGW
More information about the Libguestfs
mailing list