Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(346)

Side by Side Diff: delta_diff_generator.cc

Issue 6528006: AU: tolerate files that are symlinks in src image, yet not in new image. (Closed) Base URL: http://git.chromium.org/git/update_engine.git@master
Patch Set: fix cleanup Created 9 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « no previous file | delta_performer_unittest.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2010 The Chromium OS Authors. All rights reserved. 1 // Copyright (c) 2010 The Chromium OS Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "update_engine/delta_diff_generator.h" 5 #include "update_engine/delta_diff_generator.h"
6 6
7 #include <errno.h> 7 #include <errno.h>
8 #include <fcntl.h> 8 #include <fcntl.h>
9 #include <inttypes.h> 9 #include <inttypes.h>
10 #include <sys/stat.h> 10 #include <sys/stat.h>
(...skipping 123 matching lines...) Expand 10 before | Expand all | Expand 10 after
134 // For each regular file within new_root, creates a node in the graph, 134 // For each regular file within new_root, creates a node in the graph,
135 // determines the best way to compress it (REPLACE, REPLACE_BZ, COPY, BSDIFF), 135 // determines the best way to compress it (REPLACE, REPLACE_BZ, COPY, BSDIFF),
136 // and writes any necessary data to the end of data_fd. 136 // and writes any necessary data to the end of data_fd.
137 bool DeltaReadFiles(Graph* graph, 137 bool DeltaReadFiles(Graph* graph,
138 vector<Block>* blocks, 138 vector<Block>* blocks,
139 const string& old_root, 139 const string& old_root,
140 const string& new_root, 140 const string& new_root,
141 int data_fd, 141 int data_fd,
142 off_t* data_file_size) { 142 off_t* data_file_size) {
143 set<ino_t> visited_inodes; 143 set<ino_t> visited_inodes;
144 set<ino_t> visited_src_inodes;
144 for (FilesystemIterator fs_iter(new_root, 145 for (FilesystemIterator fs_iter(new_root,
145 utils::SetWithValue<string>("/lost+found")); 146 utils::SetWithValue<string>("/lost+found"));
146 !fs_iter.IsEnd(); fs_iter.Increment()) { 147 !fs_iter.IsEnd(); fs_iter.Increment()) {
147 if (!S_ISREG(fs_iter.GetStat().st_mode)) 148 if (!S_ISREG(fs_iter.GetStat().st_mode))
148 continue; 149 continue;
149 150
150 // Make sure we visit each inode only once. 151 // Make sure we visit each inode only once.
151 if (utils::SetContainsKey(visited_inodes, fs_iter.GetStat().st_ino)) 152 if (utils::SetContainsKey(visited_inodes, fs_iter.GetStat().st_ino))
152 continue; 153 continue;
153 visited_inodes.insert(fs_iter.GetStat().st_ino); 154 visited_inodes.insert(fs_iter.GetStat().st_ino);
154 if (fs_iter.GetStat().st_size == 0) 155 if (fs_iter.GetStat().st_size == 0)
155 continue; 156 continue;
156 157
157 LOG(INFO) << "Encoding file " << fs_iter.GetPartialPath(); 158 LOG(INFO) << "Encoding file " << fs_iter.GetPartialPath();
158 159
160 bool should_diff_from_source = true;
161 string src_path = old_root + fs_iter.GetPartialPath();
162 if (utils::FileExists(src_path.c_str())) {
163 struct stat src_stbuf;
164 TEST_AND_RETURN_FALSE_ERRNO(0 == stat(src_path.c_str(), &src_stbuf));
165 should_diff_from_source = !utils::SetContainsKey(visited_src_inodes,
petkov 2011/02/15 06:01:38 Add a comment what this is trying to catch and wha
166 src_stbuf.st_ino);
167 visited_src_inodes.insert(src_stbuf.st_ino);
168 }
169
159 TEST_AND_RETURN_FALSE(DeltaReadFile(graph, 170 TEST_AND_RETURN_FALSE(DeltaReadFile(graph,
160 Vertex::kInvalidIndex, 171 Vertex::kInvalidIndex,
161 blocks, 172 blocks,
162 old_root, 173 (should_diff_from_source ?
174 old_root :
175 "/-!@:&*nonexistent_path"),
petkov 2011/02/15 06:01:38 This feels a bit of a hack. Maybe use an empty str
163 new_root, 176 new_root,
164 fs_iter.GetPartialPath(), 177 fs_iter.GetPartialPath(),
165 data_fd, 178 data_fd,
166 data_file_size)); 179 data_file_size));
167 } 180 }
168 return true; 181 return true;
169 } 182 }
170 183
171 // This class allocates non-existent temp blocks, starting from 184 // This class allocates non-existent temp blocks, starting from
172 // kTempBlockStart. Other code is responsible for converting these 185 // kTempBlockStart. Other code is responsible for converting these
(...skipping 1428 matching lines...) Expand 10 before | Expand all | Expand 10 after
1601 dummy_extent->set_start_block(kSparseHole); 1614 dummy_extent->set_start_block(kSparseHole);
1602 dummy_extent->set_num_blocks((signature_blob_length + kBlockSize - 1) / 1615 dummy_extent->set_num_blocks((signature_blob_length + kBlockSize - 1) /
1603 kBlockSize); 1616 kBlockSize);
1604 } 1617 }
1605 1618
1606 const char* const kBsdiffPath = "bsdiff"; 1619 const char* const kBsdiffPath = "bsdiff";
1607 const char* const kBspatchPath = "bspatch"; 1620 const char* const kBspatchPath = "bspatch";
1608 const char* const kDeltaMagic = "CrAU"; 1621 const char* const kDeltaMagic = "CrAU";
1609 1622
1610 }; // namespace chromeos_update_engine 1623 }; // namespace chromeos_update_engine
OLDNEW
« no previous file with comments | « no previous file | delta_performer_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698