# # # patch "rcs_file.cc" # from [df3fc933b68fc60501edb4bc76fa431669011121] # to [0d29b362288072acc737a1ea3974e54882632ec8] # # patch "rcs_file.hh" # from [dfd4c64783f0426d377025faae5b7c4cefc9dfcf] # to [51b3a9e18609803ee1f320b2b0a64cd410165b3e] # # patch "rcs_import.cc" # from [ca287622dcc8d568469a6d51eeef726c306f5418] # to [b0beccbf2228cea26b3658bf8a1b48356bbc7938] # # patch "sanity.cc" # from [f7e9a567f668e95c093bdb425d226301f8b891ff] # to [ff6b340ff09e78f6a4fcde572bd951aef2a9d44b] # # patch "tests/importing_cvs_metadata/__driver__.lua" # from [11962fc3ec3b1cb712f7c17633e288659e51f1ca] # to [b545efab0aa93478188f140e4dfd8d4c57176afc] # # patch "tests/importing_cvs_metadata/expected_log_output" # from [2a3629825db9242abe52c0107f5269d34c125494] # to [89dd0ddb64b1fc4e8ef01cacdfcc12e559be79aa] # # patch "tests/importing_cvs_missing_delta_1/__driver__.lua" # from [cb41bdb66707e38dcb11b2d0d79d04a1a5ac826c] # to [96fc93112609cd7fe922f560d6c6fa9d89043262] # # patch "tests/importing_cvs_missing_delta_2/__driver__.lua" # from [e75fa1b96db712decda40e9d8641f108e8b82a3d] # to [40d6a1a99ac7f8e62848b21e1d2e7894b5dc8bb0] # ============================================================ --- rcs_file.cc df3fc933b68fc60501edb4bc76fa431669011121 +++ rcs_file.cc 0d29b362288072acc737a1ea3974e54882632ec8 @@ -495,8 +495,12 @@ parse_rcs_file(string const & filename, ifstream ifs(filename.c_str()); ifs.unsetf(ios_base::skipws); #endif + + P(F("parsing RCS file %s") % filename); + r.filename = filename; parser p(ifs, r); p.parse_file(); + P(F("parsed RCS file %s") % filename); } ============================================================ --- rcs_file.hh dfd4c64783f0426d377025faae5b7c4cefc9dfcf +++ rcs_file.hh 51b3a9e18609803ee1f320b2b0a64cd410165b3e @@ -41,6 +41,7 @@ struct rcs_file struct rcs_file { + std::string filename; rcs_admin admin; std::map > deltas; std::map > deltatexts; ============================================================ --- rcs_import.cc ca287622dcc8d568469a6d51eeef726c306f5418 +++ rcs_import.cc b0beccbf2228cea26b3658bf8a1b48356bbc7938 @@ -1114,10 +1114,7 @@ construct_version(vector< piece > const I(r.deltas.find(dest_version) != r.deltas.end()); shared_ptr delta = r.deltas.find(dest_version)->second; - E(r.deltatexts.find(dest_version) != r.deltatexts.end(), - origin::external_repo, - F("delta for revision %s is missing") % dest_version); - + I(r.deltatexts.find(dest_version) != r.deltatexts.end()); shared_ptr deltatext = r.deltatexts.find(dest_version)->second; @@ -1593,7 +1590,7 @@ process_rcs_branch(lua_hooks & lua, data vector< piece > const & begin_lines, file_data const & begin_data, file_id const & begin_id, - rcs_file const & r, + rcs_file & r, bool reverse_import, ticker & n_rev, ticker & n_sym, bool dryrun) @@ -1800,10 +1797,15 @@ process_rcs_branch(lua_hooks & lua, data L(FL("following private branch RCS %s") % (*i)); } - // Only construct the version if the delta exists. We - // have possbily added invalid deltas in - // index_branchpoint_symbols(). - if (r.deltas.find(*i) != r.deltas.end()) + if (r.deltas.find(*i) == r.deltas.end()) + W(F("delta for RCS version %s is missing from file %s, " + "skipping it.") + % *i % r.filename); + else if (r.deltatexts.find(*i) == r.deltatexts.end()) + W(F("delta text for RCS version %s is missing from file %s, " + "skipping it.") + % *i % r.filename); + else { construct_version(*curr_lines, *i, branch_lines, r); insert_into_db(db, curr_data, curr_id, @@ -1895,12 +1897,31 @@ process_rcs_branch(lua_hooks & lua, data { L(FL("following RCS edge %s -> %s") % curr_version % next_version); - construct_version(*curr_lines, next_version, *next_lines, r); - L(FL("constructed RCS version %s, inserting into database") % - next_version); + if (r.deltas.find(next_version) == r.deltas.end()) + W(F("delta for RCS version %s is missing from file %s, " + "skipping it.") + % next_version % r.filename); + else if (r.deltatexts.find(next_version) == r.deltatexts.end()) + { + W(F("delta text for RCS version %s is missing from file %s, " + "skipping it.") + % next_version % r.filename); - insert_into_db(db, curr_data, curr_id, - *next_lines, next_data, next_id, dryrun); + // also remove the delta, so our we have a deltatext for every + // delta in the map. + r.deltas.find(curr_version)->second->next = + r.deltas.find(next_version)->second->next; + r.deltas.erase(r.deltas.find(next_version)); + } + else + { + construct_version(*curr_lines, next_version, *next_lines, r); + L(FL("constructed RCS version %s, inserting into database") % + next_version); + + insert_into_db(db, curr_data, curr_id, + *next_lines, next_data, next_id, dryrun); + } } if (!r.deltas.find(curr_version)->second->next.empty()) @@ -1976,9 +1997,7 @@ import_rcs_file_with_cvs(lua_hooks & lua ticker & n_rev, ticker & n_sym, bool dryrun) { rcs_file r; - L(FL("parsing RCS file %s") % filename); parse_rcs_file(filename, r); - L(FL("parsed RCS file %s OK") % filename); { vector< piece > head_lines; @@ -2027,10 +2046,8 @@ test_parse_rcs_file(project_t & project, I(! filename.empty()); assert_path_is_file(filename); - P(F("parsing RCS file %s") % filename); rcs_file r; parse_rcs_file(filename.as_external(), r); - P(F("parsed RCS file %s OK") % filename); } @@ -2168,11 +2185,14 @@ void cvs_history::index_branchpoint_symb map< string, shared_ptr >::const_iterator di = r.deltas.find(branchpoint_version); - // the delta must exist - E(di != r.deltas.end(), origin::user, - F("delta for a branchpoint is missing (%s)") - % branchpoint_version); - + // if the delta doesn't exist, we emit a warning and skip the + // branch for this file. + if (di == r.deltas.end()) + W(F("delta for RCS version %s referenced from branch %s " + "is missing from file %s.") + % branchpoint_version % r.filename % sym); + else + { shared_ptr curr_delta = di->second; if (curr_delta->branches.find(first_entry_version) == @@ -2185,6 +2205,7 @@ void cvs_history::index_branchpoint_symb r.vendor_branches.end()) r.vendor_branches.insert(first_entry_version); } + } } } } @@ -5513,7 +5534,7 @@ blob_consumer::operator()(cvs_blob_index new_rid, branch_name(bn, origin::external_repo), utf8(changelog, origin::external_repo), - date_t(commit_time), + date_t(commit_time * 1000), author); // add the RCS information ============================================================ --- sanity.cc f7e9a567f668e95c093bdb425d226301f8b891ff +++ sanity.cc ff6b340ff09e78f6a4fcde572bd951aef2a9d44b @@ -355,6 +355,7 @@ sanity::generic_failure(char const * exp { case origin::database: case origin::internal: + case origin::external_repo: throw unrecoverable_failure(caused_by, message); default: throw recoverable_failure(caused_by, message); ============================================================ --- tests/importing_cvs_metadata/__driver__.lua 11962fc3ec3b1cb712f7c17633e288659e51f1ca +++ tests/importing_cvs_metadata/__driver__.lua b545efab0aa93478188f140e4dfd8d4c57176afc @@ -2,7 +2,7 @@ expected_file_hash = "774be3106edbb6d80b -- through correctly. expected_file_hash = "774be3106edbb6d80be36dbb548d62401dcfa0fe" -expected_rev_hash = "f31b5f6dfeddd51ebf19cd44c4176c68bff51709" +expected_rev_hash = "91deafa3d9c8295ebaab4733bdc0c54a2df65ee5" mtn_setup() check(get("cvs-repository")) ============================================================ --- tests/importing_cvs_metadata/expected_log_output 2a3629825db9242abe52c0107f5269d34c125494 +++ tests/importing_cvs_metadata/expected_log_output 89dd0ddb64b1fc4e8ef01cacdfcc12e559be79aa @@ -1,5 +1,5 @@ ----------------------------------------------------------------- -Revision: f31b5f6dfeddd51ebf19cd44c4176c68bff51709 +Revision: 91deafa3d9c8295ebaab4733bdc0c54a2df65ee5 Ancestor: Author: luigi Date: 2009-09-11T16:37:48 @@ -9,6 +9,8 @@ Added directories: test.txt Added directories: . +Modified attrs: + . ChangeLog: ============================================================ --- tests/importing_cvs_missing_delta_1/__driver__.lua cb41bdb66707e38dcb11b2d0d79d04a1a5ac826c +++ tests/importing_cvs_missing_delta_1/__driver__.lua 96fc93112609cd7fe922f560d6c6fa9d89043262 @@ -6,8 +6,6 @@ check(get("cvs-repository")) check(get("cvs-repository")) -check(mtn("--branch=test", "cvs_import", "cvs-repository"), 1, false, true) -check(samelines("stderr", { - "mtn: parsing rcs files", - "mtn: error: delta for a branchpoint is missing (1.1.2.1)" -})) +check(mtn("--branch=test", "cvs_import", "cvs-repository"), 0, false, true) +check(qgrep("delta for RCS version 1.1.2.1 is missing from file fileA,v", "stderr")) + ============================================================ --- tests/importing_cvs_missing_delta_2/__driver__.lua e75fa1b96db712decda40e9d8641f108e8b82a3d +++ tests/importing_cvs_missing_delta_2/__driver__.lua 40d6a1a99ac7f8e62848b21e1d2e7894b5dc8bb0 @@ -7,9 +7,6 @@ check(get("cvs-repository")) check(get("cvs-repository")) -- try an import... -check(mtn("--ticker", "none", "--branch=testbranch", "cvs_import", "cvs-repository/test"), 1, false, true) -check(samelines("stderr", { - "mtn: parsing rcs files", - "mtn: error: delta for revision 1.3 is missing" -})) +check(mtn("--ticker", "none", "--branch=testbranch", "cvs_import", "cvs-repository/test"), 0, false, true) +check(qgrep("delta text for RCS version 1.3 is missing from file foo,v", "stderr"))