# # add_file "tests/t_cvspull_committemplate.at" # # patch "cvs_client.cc" # from [9accca77027e573a5eedf0c84db9b1ee22c8d9ae] # to [7e1129f5756ae3f4309b54dbc7674d58f91c31a7] # # patch "cvs_client.hh" # from [86c60057e7f4e7701941f3325443830055c6d26f] # to [a126f6ae155fccaf112c204428d9afc4e1329acc] # # patch "tests/t_cvspull_committemplate.at" # from [] # to [7c73e405066e7832eb9f7b546badf8b0c6840bcd] # # patch "testsuite.at" # from [14b8600c48fdafc19eba6942e2270738b4bd8c71] # to [39bb6aec8093accd6899e52f691e71fc2fef932b] # --- cvs_client.cc +++ cvs_client.cc @@ -508,6 +508,15 @@ result.push_back(std::make_pair("rcs",readline())); return true; } + if (begins_with(x,"Template ",len)) + { result.push_back(std::make_pair("CMD",x.substr(0,len-1))); + result.push_back(std::make_pair("dir",x.substr(len))); + result.push_back(std::make_pair("path",readline())); + std::string length=readline(); + result.push_back(std::make_pair("length",length)); + result.push_back(std::make_pair("data",read_n(atol(length.c_str())))); + return true; + } if (begins_with(x,"Mod-time ",len)) { result.push_back(std::make_pair("CMD",x.substr(0,len-1))); result.push_back(std::make_pair("date",x.substr(len))); @@ -1022,6 +1031,16 @@ L(F("file %s revision %s: %d bytes\n") % file % revision % lresult[6].second.size()); } + else if (lresult[0].second=="Template") + { I(lresult.size()==5); + I(lresult[3].first=="length"); + long len = atol(lresult[3].second.c_str()); + I(len >= 0); + I(lresult[4].second.size() == (size_t) len); + L(F("found commit template %s:\n%s") % lresult[2].second % lresult[4].second); + // FIX actually do something with the template? + result.committemplate = lresult[4].second; + } else if (lresult[0].second=="error") { throw oops("failed to check out "+file); } @@ -1435,7 +1454,9 @@ { I(!lresult.empty()); I(lresult[0].first=="CMD"); if (lresult[0].second=="Set-sticky" - || lresult[0].second=="Clear-template") continue; + || lresult[0].second=="Clear-template" + || lresult[0].second=="Template") continue; + L(F("cvs_client::RequestServerDir lresult[0].second is '%s', not 'Clear-static-directory'") % lresult[0].second); I(lresult[0].second=="Clear-static-directory"); I(lresult.size()==3); if (!last_rcs.empty() && begins_with(lresult[2].second,last_rcs) --- cvs_client.hh +++ cvs_client.hh @@ -46,6 +46,7 @@ std::string mode; bool dead; std::string keyword_substitution; + std::string committemplate; checkout() : mod_time(-1), dead() {} }; --- tests/t_cvspull_committemplate.at +++ tests/t_cvspull_committemplate.at @@ -0,0 +1,77 @@ +# -*- Autoconf -*- + +AT_SETUP([pull of CVS module that has a commit template]) + +MONOTONE_SETUP + +AT_DATA(importme.0, [version 0 of test file +]) + +AT_DATA(importme.1, [version 1 of test file +]) + +AT_DATA(importme.2, [version 2 of test file +]) + +AT_DATA(importme.3, [version 3 of test file +]) + +AT_DATA(committemplate, [This is my commit template +]) +AT_DATA(newrcsinfo, [ALL `pwd`/committemplate +]) + +TSHA0=`SHA1(importme.0)` +TSHA1=`SHA1(importme.1)` +TSHA2=`SHA1(importme.2)` +TSHA3=`SHA1(importme.3)` + +# build the cvs repository + +CVSROOT=`pwd`/cvs-repository +AT_CHECK(cvs -q -d $CVSROOT init) +AT_CHECK(test -e $CVSROOT) +AT_CHECK(test -e $CVSROOT/CVSROOT) +AT_CHECK(test -e $CVSROOT/CVSROOT/history) + +# check out the CVSROOT admin module and edit the rcsinfo file to give ourself a commit template + +AT_CHECK(cvs -d $CVSROOT co CVSROOT, [], [ignore], [ignore]) +AT_CHECK(cp newrcsinfo CVSROOT/rcsinfo) +AT_CHECK(cvs -d $CVSROOT commit -m 'adding commit template entry to rcsinfo' CVSROOT/rcsinfo, [], [ignore], [ignore]) + + +# check out the working copy and make some commits + +AT_CHECK(cvs -d $CVSROOT co ., [], [ignore], [ignore]) +AT_CHECK(mkdir testdir) +AT_CHECK(cp importme.0 testdir/importme) +AT_CHECK(cvs -d $CVSROOT add testdir, [], [ignore], [ignore]) +AT_CHECK(cvs -d $CVSROOT add testdir/importme, [], [ignore], [ignore]) +AT_CHECK(cvs -d $CVSROOT commit -m 'commit 0' testdir/importme, [], [ignore], [ignore]) +AT_CHECK(cp importme.1 testdir/importme) +AT_CHECK(cvs -d $CVSROOT commit -m 'commit 1' testdir/importme, [], [ignore], [ignore]) +AT_CHECK(cp importme.2 testdir/importme) +AT_CHECK(cvs -d $CVSROOT commit -m 'commit 2' testdir/importme, [], [ignore], [ignore]) +AT_CHECK(cp importme.3 testdir/importme) +AT_CHECK(cvs -d $CVSROOT commit -m 'commit 3' testdir/importme, [], [ignore], [ignore]) + +# pull into monotone + +AT_CHECK(MONOTONE --branch=testbranch cvs_pull $CVSROOT testdir, [], [ignore], [ignore]) + + +# check presence of files + +AT_CHECK(MONOTONE cat file $TSHA0, [], [ignore]) +AT_CHECK(MONOTONE cat file $TSHA1, [], [ignore]) +AT_CHECK(MONOTONE cat file $TSHA2, [], [ignore]) +AT_CHECK(MONOTONE cat file $TSHA3, [], [ignore]) + +# also check that history is okay -- has a unique head, and it's the +# right one. + +AT_CHECK(MONOTONE checkout --branch=testbranch mtcodir, [], [ignore], [ignore]) +AT_CHECK(cmp importme.3 mtcodir/importme) + +AT_CLEANUP --- testsuite.at +++ testsuite.at @@ -551,3 +551,4 @@ m4_include(tests/t_netsync_largish_file.at) m4_include(tests/t_update_off_branch.at) m4_include(tests/t_setup_checkout_modify_new_dir.at) +m4_include(tests/t_cvspull_committemplate.at)