@@ -31,45 +31,75 @@ defmodule NervesHubWebCore.Firmwares.DeltaUpdater.Default do
31
31
)
32
32
33
33
output_filename = uuid <> ".fw"
34
- output = Path . join ( work_dir , output_filename ) |> Path . expand ( )
34
+ output_path = Path . join ( work_dir , output_filename ) |> Path . expand ( )
35
+
36
+ do_delta_file ( source_path , target_path , output_path , work_dir )
37
+ end
38
+
39
+ @ impl NervesHubWebCore.Firmwares.DeltaUpdater
40
+ def cleanup_firmware_delta_files ( firmware_delta_path ) do
41
+ firmware_delta_path
42
+ |> Path . dirname ( )
43
+ |> File . rm_rf! ( )
44
+
45
+ :ok
46
+ end
47
+
48
+ @ impl NervesHubWebCore.Firmwares.DeltaUpdater
49
+ def delta_updatable? ( file_path ) do
50
+ { meta , 0 } = System . cmd ( "unzip" , [ "-qqp" , file_path , "meta.conf" ] )
51
+
52
+ ( meta =~ "delta-source-raw-offset" && meta =~ "delta-source-raw-count" ) or
53
+ ( meta =~ "delta-source-fat-offset" && meta =~ "delta-source-fat-path" )
54
+ end
55
+
56
+ defp do_delta_file ( source_path , target_path , output_path , work_dir ) do
57
+ File . mkdir_p ( work_dir )
35
58
36
59
source_work_dir = Path . join ( work_dir , "source" )
37
60
target_work_dir = Path . join ( work_dir , "target" )
38
61
output_work_dir = Path . join ( work_dir , "output" )
39
62
40
63
File . mkdir_p ( source_work_dir )
41
64
File . mkdir_p ( target_work_dir )
42
- File . mkdir_p ( Path . join ( output_work_dir , "data" ) )
65
+ File . mkdir_p ( output_work_dir )
43
66
44
67
{ _ , 0 } = System . cmd ( "unzip" , [ "-qq" , source_path , "-d" , source_work_dir ] )
45
68
{ _ , 0 } = System . cmd ( "unzip" , [ "-qq" , target_path , "-d" , target_work_dir ] )
46
69
47
- source_rootfs = Path . join ( [ source_work_dir , "data" , "rootfs.img" ] )
48
- target_rootfs = Path . join ( [ target_work_dir , "data" , "rootfs.img" ] )
49
- out_rootfs = Path . join ( [ output_work_dir , "data" , "rootfs.img" ] )
50
-
51
- { _ , 0 } =
52
- System . cmd ( "xdelta3" , [ "-A" , "-S" , "-f" , "-s" , source_rootfs , target_rootfs , out_rootfs ] )
70
+ for path <- Path . wildcard ( target_work_dir <> "/**" ) do
71
+ path = Regex . replace ( ~r / ^ #{ target_work_dir } \/ / , path , "" )
72
+ unless File . dir? ( Path . join ( target_work_dir , path ) ) do
73
+ :ok = handle_content ( path , source_work_dir , target_work_dir , output_work_dir )
74
+ end
75
+ end
53
76
54
- File . mkdir_p! ( Path . dirname ( output ) )
55
- File . cp! ( target_path , output )
77
+ { _ , 0 } = System . cmd ( "zip" , [ "-r" , "-qq" , output_path , "." ] , cd: output_work_dir )
78
+ output_path
79
+ end
56
80
57
- { _ , 0 } = System . cmd ( "zip" , [ "-qq" , output , "data/rootfs.img" ] , cd: output_work_dir )
58
- output
81
+ defp handle_content ( "meta." <> _ = path , _source_dir , target_dir , out_dir ) do
82
+ do_copy ( Path . join ( target_dir , path ) , Path . join ( out_dir , path ) )
59
83
end
60
84
61
- @ impl NervesHubWebCore.Firmwares.DeltaUpdater
62
- def cleanup_firmware_delta_files ( firmware_delta_path ) do
63
- firmware_delta_path
64
- |> Path . dirname ( )
65
- |> File . rm_rf! ( )
85
+ defp handle_content ( path , source_dir , target_dir , out_dir ) do
86
+ do_delta ( Path . join ( source_dir , path ) , Path . join ( target_dir , path ) , Path . join ( out_dir , path ) )
87
+ end
66
88
67
- :ok
89
+ defp do_copy ( source , target ) do
90
+ target |> Path . dirname ( ) |> File . mkdir_p! ( )
91
+ File . cp ( source , target )
68
92
end
69
93
70
- @ impl NervesHubWebCore.Firmwares.DeltaUpdater
71
- def delta_updatable? ( file_path ) do
72
- { meta , 0 } = System . cmd ( "unzip" , [ "-qqp" , file_path , "meta.conf" ] )
73
- meta =~ "delta-source-raw-offset" && meta =~ "delta-source-raw-count"
94
+ defp do_delta ( source , target , out ) do
95
+ out |> Path . dirname ( ) |> File . mkdir_p! ( )
96
+
97
+ with { _ , 0 } <-
98
+ System . cmd ( "xdelta3" , [ "-A" , "-S" , "-f" , "-s" , source , target , out ] ) do
99
+ :ok
100
+ else
101
+ { _ , code } ->
102
+ { :error , code }
103
+ end
74
104
end
75
105
end
0 commit comments