[darcs-users] Can't get hunk editing to do what I want

John Horigan john at glyphic.com
Tue Feb 9 06:09:50 UTC 2010


I made to changes to my code that are next to each other and part of the same patch, but should be distinct:

    void
    ASTparameterList::entropy(Modification& mod) const
    {
        for (unsigned i = 0; i < mParameters.size(); ++i)
            mod.mRand48Seed ^= mParameters[i].mMod.modData.mRand48Seed;
    }
    
    ASTparameterList::~ASTparameterList()
    {
        for (std::vector<ASTparameter>::iterator it = mParameters.begin();
             it != mParameters.end(); ++it)
        {
            delete (*it).mExpression;
            for (ASTexpArray::iterator it2 = (*it).mMod.modExp.begin(); it2 != (*it).mMod.modExp.end(); ++it2)
                delete (*it2);
            (*it).mMod.modExp.clear();
        }
    }

became

    void
    ASTparameterList::entropy(Modification& mod) const
    {
        for (ASTparameters::const_iterator it = mParameters.begin(); 
             it != mParameters.end(); ++it)
        {
            mod.mRand48Seed ^= (*it).mMod.modData.mRand48Seed;
        }
    }
    
    ASTparameter::~ASTparameter()
    {
        delete mExpression;
    }
    

So I changed the loop in the entropy method and replaced the ASTparameterList destructor with an ASTparameter destructor. Darcs mixes together all of these changes into three hunks:

hunk ./src-common/astreplacement.cpp 124
-        for (unsigned i = 0; i < mParameters.size(); ++i)
-            mod.mRand48Seed ^= mParameters[i].mMod.modData.mRand48Seed;
-    }
-    $
-    ASTparameterList::~ASTparameterList()
-    {
-        for (std::vector<ASTparameter>::iterator it = mParameters.begin();
+        for (ASTparameters::const_iterator it = mParameters.begin(); $
Shall I record this change? (8/495)  [ynWesfvplxdaqjk], or ? for help: y
hunk ./src-common/astreplacement.cpp 127
-            delete (*it).mExpression;
-            for (ASTexpArray::iterator it2 = (*it).mMod.modExp.begin(); it2 != (*it).mMod.modExp.end(); ++it2)
-                delete (*it2);
-            (*it).mMod.modExp.clear();
+            mod.mRand48Seed ^= (*it).mMod.modData.mRand48Seed;
Shall I record this change? (9/495)  [ynWesfvplxdaqjk], or ? for help: y
hunk ./src-common/astreplacement.cpp 131
+    ASTparameter::~ASTparameter()
+    {
+        delete mExpression;
+    }
+    $
Shall I record this change? (10/495)  [ynWesfvplxdaqjk], or ? for help: y

Which is a mess. The hunks I would like to record are:

-        for (unsigned i = 0; i < mParameters.size(); ++i)
-            mod.mRand48Seed ^= mParameters[i].mMod.modData.mRand48Seed;
+        for (ASTparameters::const_iterator it = mParameters.begin(); 
+             it != mParameters.end(); ++it)
+        {
+            mod.mRand48Seed ^= (*it).mMod.modData.mRand48Seed;
+        }

and

-    ASTparameterList::~ASTparameterList()
-    {
-        for (std::vector<ASTparameter>::iterator it = mParameters.begin();
-             it != mParameters.end(); ++it)
-        {
-            delete (*it).mExpression;
-            for (ASTexpArray::iterator it2 = (*it).mMod.modExp.begin(); it2 != (*it).mMod.modExp.end(); ++it2)
-                delete (*it2);
-            (*it).mMod.modExp.clear();
-        }
+    ASTparameter::~ASTparameter()
+    {
+        delete mExpression;

I tried various things with the hunk editor to get darcs to reduce the scope of the first hunk but to no avail. This isn't a case of splitting an add or a delete. Darcs sees the lines 

             it != mParameters.end(); ++it)
        {

in pristine and working and came up with hunks that preserved those lines. This is pretty cool behavior, but it does not really represent the change that I made. I want darcs to rethink the hunk based on a smaller piece of the pristine file.  In the end, I changed the name of the loop variable so that the spurious common lines between pristine and working went away. Am I expecting too much from hunk editing? Is there some way to get darcs to ignore spurious common lines between pristine and working?

-- john



More information about the darcs-users mailing list