{"thread":{"id":"9758","subject":"[StGit PATCH] Fix \"stg resolved\" to work with new conflict representation","startedAt":"2007-09-03T00:04:05Z","lastAt":"2007-09-03T00:04:05Z","messageCount":1,"participants":["Karl Hasselström"],"isPatch":true,"patchVersion":1,"patchTotal":null},"messages":[{"id":"52281","messageId":"20070903000044.24008.89472.stgit@yoghurt","threadId":"9758","inReplyTo":null,"subject":"[StGit PATCH] Fix \"stg resolved\" to work with new conflict representation","fromName":"Karl Hasselström","fromEmail":"kha@treskal.com","sentAt":"2007-09-03T00:04:05Z","receivedAt":"2007-09-03T00:04:05Z","isPatch":true,"sender":{"key":"kha@treskal.com","avatar":"https://gravatar.com/avatar/f0120c734b5279b345075a28521e1ac66acb20c9913ffe9bf6ae97e53f7f3f13?d=mp&s=160"},"body":"The actual resolving is done by calling the same subroutine as \"git\nadd\".\n\nInstead of using existing *.{ancestor,current,patches} files, the\ninteractive merge has to create them from the index contents, and\ndelete them afterwards.\n\nSigned-off-by: Karl Hasselström <kha@treskal.com>\n\n---\n\nThis goes on top of David's conflict series.\n\n stgit/commands/common.py   |   16 ++-----\n stgit/commands/resolved.py |   19 ++------\n stgit/gitmergeonefile.py   |   99 ++++++++++++++++++++++++--------------------\n 3 files changed, 62 insertions(+), 72 deletions(-)\n\n\ndiff --git a/stgit/commands/common.py b/stgit/commands/common.py\nindex ad94caf..f31c09b 100644\n--- a/stgit/commands/common.py\n+++ b/stgit/commands/common.py\n@@ -137,18 +137,10 @@ def print_crt_patch(branch = None):\n \n def resolved(filename, reset = None):\n     if reset:\n-        reset_file = filename + file_extensions()[reset]\n-        if os.path.isfile(reset_file):\n-            if os.path.isfile(filename):\n-                os.remove(filename)\n-            os.rename(reset_file, filename)\n-\n-    git.update_cache([filename], force = True)\n-\n-    for ext in file_extensions().values():\n-        fn = filename + ext\n-        if os.path.isfile(fn):\n-            os.remove(fn)\n+        stage = {'ancestor': 1, 'current': 2, 'patched': 3}[reset]\n+        Run('git-checkout-index', '--no-create', '--stage=%d' % stage, '--',\n+            filename).no_output()\n+    git.add([filename])\n \n def resolved_all(reset = None):\n     conflicts = git.get_conflicts()\ndiff --git a/stgit/commands/resolved.py b/stgit/commands/resolved.py\nindex 1130641..de38737 100644\n--- a/stgit/commands/resolved.py\n+++ b/stgit/commands/resolved.py\n@@ -73,18 +73,7 @@ def func(parser, options, args):\n                 raise CmdException, 'No conflicts for \"%s\"' % filename\n \n     # resolved\n-    try:\n-        for filename in files:\n-            if options.interactive:\n-                interactive_merge(filename)\n-            resolved(filename, options.reset)\n-            del conflicts[conflicts.index(filename)]\n-    finally:\n-        # save or remove the conflicts file. Needs a finally clause to\n-        # ensure that already solved conflicts are marked\n-        if conflicts == []:\n-            os.remove(os.path.join(basedir.get(), 'conflicts'))\n-        else:\n-            f = file(os.path.join(basedir.get(), 'conflicts'), 'w+')\n-            f.writelines([line + '\\n' for line in conflicts])\n-            f.close()\n+    for filename in files:\n+        if options.interactive:\n+            interactive_merge(filename)\n+        resolved(filename, options.reset)\ndiff --git a/stgit/gitmergeonefile.py b/stgit/gitmergeonefile.py\nindex 2aa5ef8..e9bdebb 100644\n--- a/stgit/gitmergeonefile.py\n+++ b/stgit/gitmergeonefile.py\n@@ -96,51 +96,60 @@ def __conflict(path):\n \n \n def interactive_merge(filename):\n-    \"\"\"Run the interactive merger on the given file. Note that the\n-    index should not have any conflicts.\n-    \"\"\"\n-    extensions = file_extensions()\n-\n-    ancestor = filename + extensions['ancestor']\n-    current = filename + extensions['current']\n-    patched = filename + extensions['patched']\n-\n-    if os.path.isfile(ancestor):\n-        three_way = True\n-        files_dict = {'branch1': current,\n-                      'ancestor': ancestor,\n-                      'branch2': patched,\n-                      'output': filename}\n-        imerger = config.get('stgit.i3merge')\n-    else:\n-        three_way = False\n-        files_dict = {'branch1': current,\n-                      'branch2': patched,\n-                      'output': filename}\n-        imerger = config.get('stgit.i2merge')\n-\n-    if not imerger:\n-        raise GitMergeException, 'No interactive merge command configured'\n-\n-    # check whether we have all the files for the merge\n-    for fn in [filename, current, patched]:\n-        if not os.path.isfile(fn):\n-            raise GitMergeException, \\\n-                  'Cannot run the interactive merge: \"%s\" missing' % fn\n-\n-    mtime = os.path.getmtime(filename)\n-\n-    out.info('Trying the interactive %s merge'\n-             % (three_way and 'three-way' or 'two-way'))\n-\n-    err = os.system(imerger % files_dict)\n-    if err != 0:\n-        raise GitMergeException, 'The interactive merge failed: %d' % err\n-    if not os.path.isfile(filename):\n-        raise GitMergeException, 'The \"%s\" file is missing' % filename\n-    if mtime == os.path.getmtime(filename):\n-        raise GitMergeException, 'The \"%s\" file was not modified' % filename\n-\n+    \"\"\"Run the interactive merger on the given file.\"\"\"\n+    try:\n+        extensions = file_extensions()\n+        line = MRun('git-checkout-index', '--stage=all', '--', filename\n+                    ).output_one_line()\n+        stages, path = line.split('\\t')\n+        stages = dict(zip(['ancestor', 'current', 'patched'],\n+                          stages.split(' ')))\n+        for stage, fn in stages.iteritems():\n+            if stages[stage] == '.':\n+                stages[stage] = None\n+            else:\n+                newname = filename + extensions[stage]\n+                if not os.path.exists(newname):\n+                    os.rename(stages[stage], newname)\n+                    stages[stage] = newname\n+\n+        # Check whether we have all the files for the merge.\n+        if not (stages['current'] and stages['patched']):\n+            raise GitMergeException('Cannot run the interactive merge')\n+\n+        if stages['ancestor']:\n+            three_way = True\n+            files_dict = {'branch1': stages['current'],\n+                          'ancestor': stages['ancestor'],\n+                          'branch2': stages['patched'],\n+                          'output': filename}\n+            imerger = config.get('stgit.i3merge')\n+        else:\n+            three_way = False\n+            files_dict = {'branch1': stages['current'],\n+                          'branch2': stages['patched'],\n+                          'output': filename}\n+            imerger = config.get('stgit.i2merge')\n+\n+        if not imerger:\n+            raise GitMergeException, 'No interactive merge command configured'\n+\n+        mtime = os.path.getmtime(filename)\n+\n+        out.start('Trying the interactive %s merge'\n+                  % (three_way and 'three-way' or 'two-way'))\n+        err = os.system(imerger % files_dict)\n+        out.done()\n+        if err != 0:\n+            raise GitMergeException, 'The interactive merge failed'\n+        if not os.path.isfile(filename):\n+            raise GitMergeException, 'The \"%s\" file is missing' % filename\n+        if mtime == os.path.getmtime(filename):\n+            raise GitMergeException, 'The \"%s\" file was not modified' % filename\n+    finally:\n+        for fn in stages.itervalues():\n+            if os.path.isfile(fn):\n+                os.remove(fn)\n \n #\n # Main algorithm\n"}]}