# # # add_dir "mtn_cvs/tests/push_add_drop" # # add_dir "mtn_cvs/tests/push_rename" # # add_dir "mtn_cvs/tests/push_rename_and_change" # # add_file "mtn_cvs/tests/push_add_drop/__driver__.lua" # content [4f268a89b7a657b6a76d288ba4485bfc5dede497] # # add_file "mtn_cvs/tests/push_rename/__driver__.lua" # content [b2234f99bc2001cbae8fc646de1081c51b9ccc77] # # add_file "mtn_cvs/tests/push_rename_and_change/__driver__.lua" # content [661867005fbc145784399d35a34ea59413253a30] # # patch "mtn_cvs/cvs_sync.cc" # from [e856e9eb2b80c0cf071dce43d0b1ccf0fe9fa45d] # to [bdd253603f1f4beb39ddbd60dc81925ea82a6241] # ============================================================ --- mtn_cvs/tests/push_add_drop/__driver__.lua 4f268a89b7a657b6a76d288ba4485bfc5dede497 +++ mtn_cvs/tests/push_add_drop/__driver__.lua 4f268a89b7a657b6a76d288ba4485bfc5dede497 @@ -0,0 +1,42 @@ +-- Test pushing of add and drop to CVS + +include("/common/cvs.lua") +mtn_setup() +cvs_setup() + +-- create a test project + +mkdir("cvstemp") +writefile("cvstemp/A","A\n") +check(indir("cvstemp", cvs("import","-m","initial import", "test", "vendor_tag", "initial_import")), 0, false, false) + +-- get the mtn version +check(mtn_cvs("--branch=testbranch","pull",cvsroot,"test"),0, false,false) +check(mtn("co","--branch=testbranch","testbr"),0, false, false) + +-- change the mtn version +check(indir("testbr", mtn("drop", "A")), 0, false, false) +writefile("testbr/B","B\n") +check(indir("testbr", mtn("add", "B")), 0, false, false) +tsha1 = sha1("testbr/B") + +-- commit the mtn version +check(indir("testbr", mtn("ci", "-m", "A dropped and B added")), 0, false, false) + +-- push the mtn version back to cvs +check(mtn_cvs("--branch=testbranch","push"),0, false,false) + +-- update the cvs working copy and check that the change made it ok +check(cvs("co", "test"), 0, false, false) +check(exists("test/B")) +check(sha1("test/B") == tsha1) +check(not exists("test/A")) + +-- Now, without any CVS changes, check if another pull pulls anything across + +writefile("testbr/B","change\n") +check(indir("testbr", mtn("ci", "-m", "B changed")), 0, false, false) +check(mtn_cvs("--branch=testbranch","pull",cvsroot,"test"),0, false,false) -- should be noop. + + -- if we pulled anything then this will fail with multiple heads +check(mtn("checkout", "--branch=testbranch", "mtcodir"), 0, false, false) ============================================================ --- mtn_cvs/tests/push_rename/__driver__.lua b2234f99bc2001cbae8fc646de1081c51b9ccc77 +++ mtn_cvs/tests/push_rename/__driver__.lua b2234f99bc2001cbae8fc646de1081c51b9ccc77 @@ -0,0 +1,47 @@ +-- test pushing of a rename to CVS + +include("/common/cvs.lua") +mtn_setup() +cvs_setup() + +-- create a test project + +mkdir("cvstemp") +writefile("cvstemp/A","A\n") +check(indir("cvstemp", cvs("import","-m","initial import", "test", "vendor_tag", "initial_import")), 0, false, false) + +-- get the mtn version +check(mtn_cvs("--branch=testbranch", "pull", cvsroot, "test"), 0, false, false) +check(mtn("co","--branch=testbranch","testbr"),0, false, false) + +-- change the mtn working copy +tsha1 = sha1("testbr/A") +check(indir("testbr", mtn("rename", "A", "B")), 0, false, false) + +-- commit the mtn working copy +check(indir("testbr", mtn("ci", "-m", "A renamed to B")), 0, false, false) + +-- push the mtn working copy back to cvs +check(mtn_cvs("--branch=testbranch", "push"), 0, false, false) + +-- update the cvs working copy and check that the change made it ok +check(cvs("co", "test"), 0, false, false) +check(exists("test/B")) +check(not exists("test/A")) +check(sha1("test/B") == tsha1) + +-- make some further changes on the cvs side and check that they're ok +writefile("test/B","Changed in CVS\n") +tsha2 = sha1("test/B") +check(indir("test", cvs("ci", "-m", "a log message")), 0, false, false) +check(mtn_cvs("--branch=testbranch", "pull", cvsroot, "test"), 0, false, false) +check(indir("testbr", mtn("up")),0, false, false) +check(sha1("testbr/B") == tsha2) + +-- and now check that further changes on the mtn side make it over ok +writefile("testbr/B","Yet another change\n") +tsha3 = sha1("testbr/B") +check(indir("testbr", mtn("ci", "-m", "a change in mtn")), 0, false, false) +check(mtn_cvs("--branch=testbranch", "push"), 0, false, false) +check(indir("test", cvs("up")), 0, false, false) +check(sha1("test/B") == tsha3) ============================================================ --- mtn_cvs/tests/push_rename_and_change/__driver__.lua 661867005fbc145784399d35a34ea59413253a30 +++ mtn_cvs/tests/push_rename_and_change/__driver__.lua 661867005fbc145784399d35a34ea59413253a30 @@ -0,0 +1,48 @@ +-- test pushing of a rename to CVS + +include("/common/cvs.lua") +mtn_setup() +cvs_setup() + +-- create a test project + +mkdir("cvstemp") +writefile("cvstemp/A","A\n") +check(indir("cvstemp", cvs("import","-m","initial import", "test", "vendor_tag", "initial_import")), 0, false, false) + +-- get the mtn version +check(mtn_cvs("--branch=testbranch", "pull", cvsroot, "test"), 0, false, false) +check(mtn("co","--branch=testbranch","testbr"),0, false, false) + +-- change the mtn working copy +writefile("testbr/A","Changed A\n") +tsha1 = sha1("testbr/A") +check(indir("testbr", mtn("rename", "A", "B")), 0, false, false) + +-- commit the mtn working copy +check(indir("testbr", mtn("ci", "-m", "A renamed to B")), 0, false, false) + +-- push the mtn working copy back to cvs +check(mtn_cvs("--branch=testbranch", "push"), 0, false, true) + +-- update the cvs working copy and check that the change made it ok +check(cvs("co", "test"), 0, false, false) +check(exists("test/B")) +check(not exists("test/A")) +check(sha1("test/B") == tsha1) + +-- make some further changes on the cvs side and check that they're ok +writefile("test/B","Changed in CVS\n") +tsha2 = sha1("test/B") +check(indir("test", cvs("ci", "-m", "a log message")), 0, false, false) +check(mtn_cvs("--branch=testbranch", "pull", cvsroot, "test"), 0, false, false) +check(indir("testbr", mtn("up")),0, false, false) +check(sha1("testbr/B") == tsha2) + +-- and now check that further changes on the mtn side make it over ok +writefile("testbr/B","Yet another change\n") +tsha3 = sha1("testbr/B") +check(indir("testbr", mtn("ci", "-m", "a change in mtn")), 0, false, false) +check(mtn_cvs("--branch=testbranch", "push"), 0, false, false) +check(indir("test", cvs("up")), 0, false, false) +check(sha1("test/B") == tsha3) ============================================================ --- mtn_cvs/cvs_sync.cc e856e9eb2b80c0cf071dce43d0b1ccf0fe9fa45d +++ mtn_cvs/cvs_sync.cc bdd253603f1f4beb39ddbd60dc81925ea82a6241 @@ -925,6 +925,7 @@ std::set::iterator cvs_reposit } boost::shared_ptr cs=j->second; cvs_manifest parent_manifest=get_files(*parent); + std::map renamed_ids; for (path_set::const_iterator i=cs->nodes_deleted.begin(); i!=cs->nodes_deleted.end(); ++i) @@ -956,7 +957,14 @@ std::set::iterator cvs_reposit a=commit_arg(); // add a.file=file_path(i->second).as_internal(); I(!old->second->sha1sum.inner()().empty()); - a.new_content=app.get_file(old->second->sha1sum).inner()(); + std::map >::const_iterator change_ent = + cs->deltas_applied.find(i->second); + if (change_ent != cs->deltas_applied.end()) + // the file content is going to change - handle that little detail now... + renamed_ids[i->second] = change_ent->second.second; + else + renamed_ids[i->second] = old->second->sha1sum; + a.new_content=app.get_file(renamed_ids[i->second]).inner()(); commits.push_back(a); L(FL("rename to %s %d\n") % a.file % a.new_content.size()); } @@ -991,6 +999,8 @@ std::set::iterator cvs_reposit i=cs->deltas_applied.begin(); i!=cs->deltas_applied.end(); ++i) { + if (renamed_ids.find(i->first) != renamed_ids.end()) + continue; // a renamed file that's already been added with the correct contents commit_arg a; a.file=file_path(i->first).as_internal(); // if (a.file==".mtn-sync-"+app.opts.domain()) continue; @@ -1044,8 +1054,14 @@ std::set::iterator cvs_reposit } else // newly added? { std::map::const_iterator myadd=cs->files_added.find(sp); - I(myadd!=cs->files_added.end()); - fs.sha1sum=myadd->second; + if (myadd!=cs->files_added.end()) + { fs.sha1sum=myadd->second; + } + else // renamed? + { std::map::const_iterator myrename=renamed_ids.find(sp); + I(myrename!=renamed_ids.end()); + fs.sha1sum=myrename->second; + } } std::pair::iterator,bool> newelem= files[i->first].known_states.insert(fs);