let yum_rpm_resolve_dependencies_and_download names =
(* Liberate this data from python. *)
+ let tmpfile = tmpdir // "names.tmp" in
let py = sprintf "
import yum
import yum.misc
yb = yum.YumBase ()
yb.preconf.debuglevel = %d
yb.preconf.errorlevel = %d
+if %s:
+ yb.preconf.fn = %S
yb.setCacheDir ()
# Look up the base packages from the command line.
deps = dict ()
-pkgs = yb.pkgSack.returnPackages (patterns=sys.argv[2:])
+pkgs = yb.pkgSack.returnPackages (patterns=sys.argv[1:])
for pkg in pkgs:
deps[pkg] = False
deps[pkg] = yum.misc.unique (deps[pkg])
# Write it to a file because yum spews garbage on stdout.
-f = open (sys.argv[1], \"w\")
+f = open (%S, \"w\")
for pkg in deps.keys ():
f.write (\"%%s %%s %%s %%s %%s\\n\" %%
(pkg.name, pkg.epoch, pkg.version, pkg.release, pkg.arch))
f.close ()
-" (if verbose then 1 else 0) (if verbose then 1 else 0) in
- let tmpfile = tmpdir // "names.tmp" in
- run_python py (tmpfile :: names);
+"
+ (if verbose then 1 else 0)
+ (if verbose then 1 else 0)
+ (match yum_config with None -> "False" | Some _ -> "True")
+ (match yum_config with None -> "" | Some filename -> filename)
+ tmpfile in
+ run_python py names;
let chan = open_in tmpfile in
let lines = input_all_lines chan in
close_in chan;
exit 1
);
- let cmd = sprintf "yumdownloader%s --destdir %s %s"
+ let cmd = sprintf "yumdownloader%s%s --destdir %s %s"
(if verbose then "" else " --quiet")
+ (match yum_config with None -> ""
+ | Some filename -> sprintf " -c %s" filename)
(Filename.quote tmpdir)
(String.concat " " (List.map Filename.quote pkgnames)) in
run_command cmd;
let rec yum_rpm_list_files pkg =
(* Run rpm -qlp with some extra magic. *)
let cmd =
- sprintf "rpm -q --qf '[%%{FILENAMES} %%{FILEFLAGS:fflags} %%{FILEMODES}\\n]' -p %s"
+ sprintf "rpm -q --qf '[%%{FILENAMES} %%{FILEFLAGS:fflags} %%{FILEMODES} %%{FILESIZES}\\n]' -p %s"
pkg in
let lines = run_command_get_lines cmd in
filter_map (
fun line ->
match string_split " " line with
- | [filename; flags; mode] ->
+ | [filename; flags; mode; size] ->
let test_flag = String.contains flags in
let mode = int_of_string mode in
+ let size = int_of_string size in
if test_flag 'd' then None (* ignore documentation *)
else
Some (filename, {
ft_dir = mode land 0o40000 <> 0;
ft_ghost = test_flag 'g'; ft_config = test_flag 'c';
- ft_mode = mode;
+ ft_mode = mode; ft_size = size;
})
| _ ->
eprintf "febootstrap: bad output from rpm command: '%s'" line;
let dirs =
List.map (fun name ->
name, { ft_dir = true; ft_ghost = false;
- ft_config = false; ft_mode = 0o40755 }) dirs in
+ ft_config = false; ft_mode = 0o40755;
+ ft_size = 0 }) dirs in
let devs = [ "/dev/null"; "/dev/full"; "/dev/zero"; "/dev/random";
"/dev/urandom"; "/dev/tty"; "/dev/console";
"/dev/ptmx"; "/dev/stdin"; "/dev/stdout"; "/dev/stderr" ] in
let devs =
List.map (fun name ->
name, { ft_dir = false; ft_ghost = false;
- ft_config = false; ft_mode = 0o644 }) devs in
+ ft_config = false; ft_mode = 0o644;
+ ft_size = 0 }) devs in
dirs @ devs @ files
) else files in