[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