[Libguestfs] [Bug 1046905] New: RFE: add argument to virt-sysprep to disable individual default operations

Pino Toscano ptoscano at redhat.com
Mon Jan 13 13:38:30 UTC 2014


On Friday 10 January 2014 10:09:19 Richard W.M. Jones wrote:
> On Thu, Jan 09, 2014 at 03:45:54PM +0000, Richard W.M. Jones wrote:
> > On Thu, Jan 09, 2014 at 04:21:10PM +0100, Pino Toscano wrote:
> > > +  and set_operations op_string =
> > > +    let currentopset =
> > > +      match (!operations) with
> > 
> > No need for parentheses around !operations.

Fixed.

> > > +        let n = ref op_name in
> > > +        let remove = string_prefix op_name "-" in
> > > +        if remove then
> > > +          n := String.sub op_name 1 (String.length op_name - 1);
> > > +        match !n with
> > 
> > This can be written a bit more naturally as ...
> > 
> >   let n, remove =
> >     if string_prefix op_name "-" then
> >       String.sub op_name 1 (String.length op_name-1), true
> >     else
> >       op_name, false in
> >   match n with
> >   ...

This is nice even without the way below.

> An even more natural way to write this is:

Maybe for skilled OCaml programmers ;) not (yet) for me.

>   let op =
>     if string_prefix op_name "-" then
>       `Remove (String.sub op_name 1 (String.length op_name-1))
>     else
>       `Add op_name
>    match op with
> 
>    | `Add "" | `Remove "" -> (* error *)
>    | `Add "defaults" -> Sysprep_operation.add_defaults_to_set opset
>    | `Remove "defaults" -> Sysprep_operation.remove_defaults_from_set
>    | opset etc
> 
> The type of op will be [ `Add of string | `Remove of string ].
> Actually you never need to write that type out, as OCaml will infer it
> (and check it).  It will only appear in error messages if you get the
> code wrong.

Interesting way, made use of it, thanks.

> > +          let f = if remove then
> > Sysprep_operation.remove_defaults_from_set else
> > Sysprep_operation.add_defaults_to_set in
> > +          f opset
> 
> You can actually write:
> 
>   (if remove then Sysprep_operation.remove_defaults_from_set
>    else Sysprep_operation.add_defaults_to_set) opset
> 
> I don't know which way you think is clearer, but I would avoid the >80
> character lines.

Yes, I knew about that, just thought it was clearer to split the actual 
call on an own line, making the argument a bit less "hidden" by the 
whole instruction.

> > +    "--operations", Arg.String set_operations, " " ^
> > s_"Enable/disable specific operations";
> 
> I'd also add an alias "--operation" (it would just do the same thing).

Added.

> > +let add_list_to_opset l s =
> > +  List.fold_left (
> > +    fun acc elem ->
> > +      OperationSet.add elem acc
> > +  ) s l
> > +
> > +let remove_list_from_opset l set =
> > +  OperationSet.fold (
> > +    fun elem opset ->
> > +      if List.exists (
> > +        fun li ->
> > +          li.name = elem.name
> > +      ) l then
> > +        opset
> > +      else
> > +        OperationSet.add elem opset
> > +  ) set empty_set
> 
> OCaml Set has subset, intersection, difference operations if you need
> them.  See /usr/lib64/ocaml/set.mli

True; I went with manual folding to avoid build new temporary sets when 
needed, but I guess doing this could be more natural.

-- 
Pino Toscano




More information about the Libguestfs mailing list