{"thread":{"id":"13617","subject":"Naughty, Evil git-gui patches","startedAt":"2008-05-22T16:32:10Z","lastAt":"2008-05-26T02:14:13Z","messageCount":4,"participants":["Barry Roberts","Shawn O. Pearce"],"isPatch":false,"patchVersion":null,"patchTotal":null},"messages":[{"id":"77479","messageId":"4835A00A.5050207@robertsr.us","threadId":"13617","inReplyTo":null,"subject":"Naughty, Evil git-gui patches","fromName":"Barry Roberts","fromEmail":"blr@robertsr.us","sentAt":"2008-05-22T16:32:10Z","receivedAt":"2008-05-22T16:32:10Z","isPatch":false,"sender":{"key":"blr@robertsr.us","avatar":null},"body":"I have no hope of these patches being accepted, this is just for \ndiscussion (and maybe education) purposes, so I attached them all here \ninstead of sending individual messages and having to put the disclaimer \non all of them.\n\nThe combination of compulsive command-line aversion among Windows users \nand git-gui not being oriented toward CVS-like usage almost killed our \ncvs->git transition.  These patches are emergency measures to appease \npoint-and-clickers transitioning from CVS, but  written by someone who \ndoesn't know TCL (or even git).  Written isn't even the appropriate \nword, most are cut&paste from existing git-gui code.\n\nDisclaimers and excuses:\n 0001 - All the CVS transition docs talk about pull, but not having it \nin the gui means it doesn't really exist for some users\n\n0002 - I have read the reasons for having merge in the gui be more \nstrict than 'git merge' from the command line, but 'cvs update' never \ngave a clean way to back out, so nobody here expects that anyway.\n\n0003 -  Yeah, I want to list the stashes and select from available \nstashes to apply.  But this does the 80% of what we need (reducing \ncommand line usage), and my tcl sk1llz aren't that l33t.\n\n0004 - This is just a concession to (I think) Tortoise.  Just before you \ncommit, you notice that you left in a debug message.  This gives us an \neasy way to fix by diff before commit'ing.  This requires setting \nGIT_EXTERNAL_DIFF, or it's not very interesting.\n\nMy intention in sending these is to hopefully generate some discussion \non how something like these changes can be done properly, with the \nexception of patch 0002, which I fully intend to maintain as a local patch.\n\nOur developers are happy with git now.  Speed, topic branches, speed, \neasy merges from release branches, speed, and my bastard git-gui have \nwon over the developers I work with AFAIK.  Thanks for a great suite of \ntools.\n\nBarry Roberts\n\n\n\n>From 1829aa454f8aad89fca460b0f3f86ecda6ca8556 Mon Sep 17 00:00:00 2001\nFrom: Barry Roberts <blr@robertsr.us>\nDate: Tue, 6 May 2008 11:31:52 -0600\nSubject: [PATCH] Add a simple \"git pull\" to the menu.\n\n---\n git-gui/git-gui.sh        |    3 +++\n git-gui/lib/transport.tcl |    9 +++++++++\n 2 files changed, 12 insertions(+), 0 deletions(-)\n\ndiff --git a/git-gui/git-gui.sh b/git-gui/git-gui.sh\nindex 7c25bb9..49c8580 100755\n--- a/git-gui/git-gui.sh\n+++ b/git-gui/git-gui.sh\n@@ -2110,6 +2110,9 @@ if {[is_enabled transport]} {\n \t.mbar.remote add command \\\n \t\t-label [mc \"Delete...\"] \\\n \t\t-command remote_branch_delete::dialog\n+        .mbar.remote add command \\\n+\t    -label [mc \"Pull...\"] \\\n+\t    -command do_pull\n }\n \n if {[is_MacOSX]} {\ndiff --git a/git-gui/lib/transport.tcl b/git-gui/lib/transport.tcl\nindex 8e6a9d0..30f1015 100644\n--- a/git-gui/lib/transport.tcl\n+++ b/git-gui/lib/transport.tcl\n@@ -182,3 +182,12 @@ proc do_push_anywhere {} {\n \twm title $w [append \"[appname] ([reponame]): \" [mc \"Push\"]]\n \ttkwait window $w\n }\n+\n+proc do_pull {} {\n+\tset w [console::new \\\n+\t\t[mc \"pull \"] \\\n+\t\t[mc \"Pulling changes from default\"]]\n+\tset cmd [list git pull]\n+\tlappend cmd -v\n+\tconsole::exec $w $cmd\n+}\n-- \n1.5.5.1.116.ge4b9c\n\n\n\n>From 5bad6baa742fb719ada8c0bdcee959d36f2914f2 Mon Sep 17 00:00:00 2001\nFrom: Barry Roberts <blr@robertsr.us>\nDate: Tue, 6 May 2008 14:46:35 -0600\nSubject: [PATCH] Removed strictness of merge\n\nStarted on stash, but that's a bigger project.\n---\n git-gui/git-gui.sh    |   13 +++++++++++++\n git-gui/lib/merge.tcl |   10 ----------\n git-gui/lib/stash.tcl |    6 ++++++\n 3 files changed, 19 insertions(+), 10 deletions(-)\n create mode 100644 git-gui/lib/stash.tcl\n\ndiff --git a/git-gui/git-gui.sh b/git-gui/git-gui.sh\nindex 49c8580..63c9e09 100755\n--- a/git-gui/git-gui.sh\n+++ b/git-gui/git-gui.sh\n@@ -874,6 +874,7 @@ if {$subcommand eq {gui} && [llength $argv] > 0} {\n enable_option multicommit\n enable_option branch\n enable_option transport\n+disable_option stash\n disable_option bare\n \n switch -- $subcommand {\n@@ -2137,6 +2138,18 @@ if {[is_MacOSX]} {\n \t\t-command do_options\n }\n \n+# -- Stash Menu\n+#\n+\n+if {[is_enabled stash]} {\n+\t.mbar add cascade -label [mc Stash] -menu .mbar.stash\n+\tmenu .mbar.stash\n+\n+\t.mbar.stash add command \\\n+\t\t-label [mc \"List\"] \\\n+\t\t-command do_stash_list\n+}\n+\n # -- Help Menu\n #\n .mbar add cascade -label [mc Help] -menu .mbar.help\ndiff --git a/git-gui/lib/merge.tcl b/git-gui/lib/merge.tcl\nindex cc26b07..d4c44c2 100644\n--- a/git-gui/lib/merge.tcl\n+++ b/git-gui/lib/merge.tcl\n@@ -50,16 +50,6 @@ You must resolve them, stage the file, and commit to complete the current merge.\n \t\t\tunlock_index\n \t\t\treturn 0\n \t\t}\n-\t\t?? {\n-\t\t\terror_popup [mc \"You are in the middle of a change.\n-\n-File %s is modified.\n-\n-You should complete the current commit before starting a merge.  Doing so will help you abort a failed merge, should the need arise.\n-\" [short_path $path]]\n-\t\t\tunlock_index\n-\t\t\treturn 0\n-\t\t}\n \t\t}\n \t}\n \ndiff --git a/git-gui/lib/stash.tcl b/git-gui/lib/stash.tcl\nnew file mode 100644\nindex 0000000..4ff2d20\n--- /dev/null\n+++ b/git-gui/lib/stash.tcl\n@@ -0,0 +1,6 @@\n+# git stash support\n+#\n+\n+proc do_stash_list {} {\n+\terror_popup [mc \"do_stash_list called.\"]\n+}\n\\ No newline at end of file\n-- \n1.5.5.1.116.ge4b9c\n\n\n\n>From ae77b093e71335d2c2941677e5c366dc31732773 Mon Sep 17 00:00:00 2001\nFrom: Barry Roberts <blr@robertsr.us>\nDate: Wed, 7 May 2008 09:20:50 -0600\nSubject: [PATCH] Added VERY simple stash\n\nDon't forget to manually re-scan after saving or applyling\n---\n git-gui/git-gui.sh    |   11 ++++++++++-\n git-gui/lib/stash.tcl |   36 ++++++++++++++++++++++++++++++++++--\n 2 files changed, 44 insertions(+), 3 deletions(-)\n\ndiff --git a/git-gui/git-gui.sh b/git-gui/git-gui.sh\nindex 63c9e09..0b201ec 100755\n--- a/git-gui/git-gui.sh\n+++ b/git-gui/git-gui.sh\n@@ -874,7 +874,7 @@ if {$subcommand eq {gui} && [llength $argv] > 0} {\n enable_option multicommit\n enable_option branch\n enable_option transport\n-disable_option stash\n+enable_option stash\n disable_option bare\n \n switch -- $subcommand {\n@@ -2148,6 +2148,15 @@ if {[is_enabled stash]} {\n \t.mbar.stash add command \\\n \t\t-label [mc \"List\"] \\\n \t\t-command do_stash_list\n+\t.mbar.stash add command \\\n+\t\t-label [mc \"Apply\"] \\\n+\t\t-command do_stash_apply\n+\t.mbar.stash add command \\\n+\t\t-label [mc \"Save\"] \\\n+\t\t-command do_stash_save\n+\t.mbar.stash add command \\\n+\t\t-label [mc \"Drop\"] \\\n+\t\t-command do_stash_drop\n }\n \n # -- Help Menu\ndiff --git a/git-gui/lib/stash.tcl b/git-gui/lib/stash.tcl\nindex 4ff2d20..c2e40db 100644\n--- a/git-gui/lib/stash.tcl\n+++ b/git-gui/lib/stash.tcl\n@@ -2,5 +2,37 @@\n #\n \n proc do_stash_list {} {\n-\terror_popup [mc \"do_stash_list called.\"]\n-}\n\\ No newline at end of file\n+\tset w [console::new \\\n+\t\t[mc \"stash\"] \\\n+\t\t[mc \"Listing stashes\"]]\n+\tset cmd [list git stash list]\n+\tlappend cmd -v\n+\tconsole::exec $w $cmd\n+}\n+\n+proc do_stash_apply { } {\n+\tset w [console::new \\\n+\t\t[mc \"stash\"] \\\n+\t\t[mc \"Applying stash\"]]\n+\tset cmd [list git stash apply]\n+\tlappend cmd -v\n+\tconsole::exec $w $cmd\n+\t\n+}\n+\n+proc do_stash_save { } {\n+\tset w [console::new \\\n+\t\t[mc \"stash\"] \\\n+\t\t[mc \"Saving stash\"]]\n+\tset cmd [list git stash save]\n+\tlappend cmd -v\n+\tconsole::exec $w $cmd\n+}\n+\n+proc do_stash_drop { } {\n+\tset w [console::new \\\n+\t\t[mc \"stash\"] \\\n+\t\t[mc \"Dropping stash\"]]\n+\tset cmd [list git stash drop]\n+\tconsole::exec $w $cmd\n+}\n-- \n1.5.5.1.116.ge4b9c\n\n\n\n>From 53d911208cb867eab4a2a6d71bfa3d95bc9f2671 Mon Sep 17 00:00:00 2001\nFrom: Barry Roberts <blr@robertsr.us>\nDate: Thu, 8 May 2008 11:37:53 -0600\nSubject: [PATCH] Added cheap call to git-diff for ext diff\n\n---\n git-gui/git-gui.sh    |    3 +++\n git-gui/lib/index.tcl |   14 ++++++++++++++\n 2 files changed, 17 insertions(+), 0 deletions(-)\n\ndiff --git a/git-gui/git-gui.sh b/git-gui/git-gui.sh\nindex 0b201ec..3b77e68 100755\n--- a/git-gui/git-gui.sh\n+++ b/git-gui/git-gui.sh\n@@ -2061,6 +2061,9 @@ if {[is_enabled multicommit] || [is_enabled singlecommit]} {\n \tlappend disable_on_lock \\\n \t\t[list .mbar.commit entryconf [.mbar.commit index last] -state]\n \n+\t.mbar.commit add command -label [mc \"External Diff\"] \\\n+\t\t-command do_ext_diff_selection\n+\n \t.mbar.commit add separator\n \n \t.mbar.commit add command -label [mc \"Show Less Context\"] \\\ndiff --git a/git-gui/lib/index.tcl b/git-gui/lib/index.tcl\nindex 3c1fce7..1e08664 100644\n--- a/git-gui/lib/index.tcl\n+++ b/git-gui/lib/index.tcl\n@@ -435,3 +435,17 @@ proc do_select_commit_type {} {\n \t\t}\n \t}\n }\n+\n+proc do_ext_diff_selection { } {\n+\tglobal current_diff_path selected_paths\n+\n+\tif {[array size selected_paths] > 0} {\n+\t\terror_popup [mc \"Please select one file at a time for diffs\"]\n+\t} elseif {$current_diff_path ne {}} {\n+\t\tset w [console::new \\\n+\t\t\t\t   [mc \"diff\"] \\\n+\t\t\t\t   [mc \"Differencing\"]]\n+\t\tset cmd [list git diff $current_diff_path]\n+\t\tconsole::exec $w $cmd\n+\t}\n+}\n\\ No newline at end of file\n-- \n1.5.5.1.116.ge4b9c\n\n"},{"id":"77511","messageId":"20080522232417.GS29038@spearce.org","threadId":"13617","inReplyTo":"4835A00A.5050207@robertsr.us","subject":"Re: Naughty, Evil git-gui patches","fromName":"Shawn O. Pearce","fromEmail":"spearce@spearce.org","sentAt":"2008-05-22T23:24:17Z","receivedAt":"2008-05-22T23:24:17Z","isPatch":false,"sender":{"key":"spearce@spearce.org","avatar":"https://avatars.githubusercontent.com/u/34844?v=4"},"body":"Barry Roberts <blr@robertsr.us> wrote:\n> The combination of compulsive command-line aversion among Windows users \n> and git-gui not being oriented toward CVS-like usage almost killed our \n> cvs->git transition.  These patches are emergency measures to appease \n> point-and-clickers transitioning from CVS, but  written by someone who \n> doesn't know TCL (or even git).  Written isn't even the appropriate \n> word, most are cut&paste from existing git-gui code.\n\nHah!  Do you know why git-gui came along?  Because it was written as\nan emergency measure to allow a transition from no version control\nat all to git at my day-job.  :-)\n\n> Disclaimers and excuses:\n> 0001 - All the CVS transition docs talk about pull, but not having it \n> in the gui means it doesn't really exist for some users\n\nYea, that has been a glaring difference between git-gui and command\nline for a long time.  There is also the inability to add a remote,\nor to do \"git pull git://some/where for-linus\" or some such one\nshot pull.\n\n> 0002 - I have read the reasons for having merge in the gui be more \n> strict than 'git merge' from the command line, but 'cvs update' never \n> gave a clean way to back out, so nobody here expects that anyway.\n\nMaybe its just the way my brain works these days with git, but I\nhave never found the refusal to merge with a dirty working directory\nto be a limitation.  I usually either don't have a dirty working\ndirectory, or I stash into a temporary branch and switch back to\ndo the merge, then rebase or cherry-pick.  Yea, that does mean I\nfall back to the command line in such cases.  Git Gui only users\ndon't have that option.\n\nOnce you get used to the idea of being able to recover your old\nstate after a merge has started (or even finished!) though the\nidea of a dirty merge just sends chills down my spine.  Its a\nreally bad idea.  IMHO its like holding a loaded gun to your foot\nand pulling the trigger every time you do a merge.  After a while\nyou run out of toes and have lost something you cared about.\n\nOf course there is the school of thought that users should be\ngiven that gun, with extra shells to boot.  I'd rather refuse to\ndo a dirty merge and let the user work with stashes in Git Gui.\nThen the dirty merge error dialog can offer an option to stash\n(and try to apply after merge) the dirty changes.  I think that\nis the direction you were starting to go here.\n \n> 0003 -  Yeah, I want to list the stashes and select from available \n> stashes to apply.  But this does the 80% of what we need (reducing \n> command line usage), and my tcl sk1llz aren't that l33t.\n\nThey are apparently l33t enough to come up with this set of changes.\nWhich is pretty good if you ask me.\n\nBuilding a good looking list of stashes would probably require using\nseveral columns of text widgets with a single scrollbar.  This is\nhow the blame viewer and gitk are put together.  Its ugly as s**t.\n \n> 0004 - This is just a concession to (I think) Tortoise.  Just before you \n> commit, you notice that you left in a debug message.  This gives us an \n> easy way to fix by diff before commit'ing.  This requires setting \n> GIT_EXTERNAL_DIFF, or it's not very interesting.\n\nI'm not sure I understand this.  Are you trying to get a diff for\nthe entire working directory against the staged files in the index?\nAs opposed to looking at each file individually?  What is your\nexternal diff program able to show that git-gui's internal diff\nviewer does not?\n\nI'm not objecting to supporting GIT_EXTERNAL_DIFF, I just want to\nbetter understand what you are trying to accomplish here so we can\nmake sure its the _right_ support.\n \n> My intention in sending these is to hopefully generate some discussion \n> on how something like these changes can be done properly, with the \n> exception of patch 0002, which I fully intend to maintain as a local patch.\n\nI definately see some value in your bastard patches and would like to\nwork with you to get them into a shape that we can include them.  :-)\n\n-- \nShawn.\n"},{"id":"77523","messageId":"1211521917.832.45.camel@gdub.robertsr.us","threadId":"13617","inReplyTo":"20080522232417.GS29038@spearce.org","subject":"Re: Naughty, Evil git-gui patches","fromName":"Barry Roberts","fromEmail":"blr@robertsr.us","sentAt":"2008-05-23T05:51:57Z","receivedAt":"2008-05-23T05:51:57Z","isPatch":false,"sender":{"key":"blr@robertsr.us","avatar":null},"body":"\nOn Thu, 2008-05-22 at 19:24 -0400, Shawn O. Pearce wrote:\n> Hah!  Do you know why git-gui came along?  Because it was written as\n> an emergency measure to allow a transition from no version control\n> at all to git at my day-job.  :-)\n\nNecessity, invention.\n\n> > 0002 - I have read the reasons for having merge in the gui be more \n> > strict than 'git merge' from the command line, but 'cvs update' never \n> > gave a clean way to back out, so nobody here expects that anyway.\n> \n> Maybe its just the way my brain works these days with git, but I\n> have never found the refusal to merge with a dirty working directory\n> to be a limitation.  I usually either don't have a dirty working\n> directory, or I stash into a temporary branch and switch back to\n> do the merge, then rebase or cherry-pick.  Yea, that does mean I\n> fall back to the command line in such cases.  Git Gui only users\n> don't have that option.\n> \n> Once you get used to the idea of being able to recover your old\n> state after a merge has started (or even finished!) though the\n> idea of a dirty merge just sends chills down my spine.  Its a\n> really bad idea.  IMHO its like holding a loaded gun to your foot\n> and pulling the trigger every time you do a merge.  After a while\n> you run out of toes and have lost something you cared about.\n\nI agree.  I regard this one as transitional.  People used to thinking in\nCVS have a hard time letting go.  My plan for this was to maintain a\nlocal patch until the developers I work with are properly trained, and\nthen drop it.  But, it's Free Software, so if other folks have the same\npain, it's in the mail archive now.\n\n> > 0003 -  Yeah, I want to list the stashes and select from available \n> > stashes to apply.  But this does the 80% of what we need (reducing \n> > command line usage), and my tcl sk1llz aren't that l33t.\n> \n> Building a good looking list of stashes would probably require using\n> several columns of text widgets with a single scrollbar.  This is\n> how the blame viewer and gitk are put together.  Its ugly as s**t.\n\nWhen I get time, I still plan to look at it.  But if my Windows using\ncolleagues don't complain, it may not happen.\n\nA simpler option I considered  is just a simple numeric text field in\nthe stash commands that are allowed to specify a stash (show, apply,\ndrop, pop).  Choosing any of these would just open a dialog with a list\nof stashes and a text field that defaults to 0.  That text field value\ngets put into the stash@{$number}.  Is that too lame to bother\nimplementing?  Clearly a list to choose from is more standard UI design,\nI just don't know if it justifies the cost for me.\n\n>  \n> > 0004 - This is just a concession to (I think) Tortoise.  Just before you \n> > commit, you notice that you left in a debug message.  This gives us an \n> > easy way to fix by diff before commit'ing.  This requires setting \n> > GIT_EXTERNAL_DIFF, or it's not very interesting.\n> \n> I'm not sure I understand this.  Are you trying to get a diff for\n> the entire working directory against the staged files in the index?\n> As opposed to looking at each file individually?  What is your\n> external diff program able to show that git-gui's internal diff\n> viewer does not?\n\nThe intent is to edit one file at time to clean up before committing.\nThe external diff doesn't show anything different, it just lets you\nedit.  I use emacs/ediff, win users use winmerge or kdiff3.  So it's\npoorly named, but that was the git feature I used. The Tortoise (or\nmaybe WinCVS) scenario that I'm trying to enable is this:\n\nAs I'm staging files for commit, I notice I left in a debug message or\ntest code that shouldn't be committed, and I want to get rid of in the\nfile in the working directory.  With that file selected in the \"Unstaged\nChanges\" box, I select \"External Diff\" from \"Commit\" menu (at least\nthat's where it is now).  For me that opens an ediff with my modified\nfile and the previous version so I can easily remove things I don't want\nto commit.  Save, exit, Rescan (necessary?), stage, commit.\n\nAnother option I considered was adding to the context menu in the diff\nbox to revert a hunk in the file.  But sometimes the changes aren't\nexactly hunks and you want an editor to, say, just change one line in a\nhunk.\n\nWhat I don't like about my patch now is that it is synchronous.  git-gui\nis locked up waiting for the ediff/winmerge/kdiff3 window to close.\nPlus, then I have to click OK to close the console window.  Hmm. Maybe I\nshould look at how you launch gitk.  That seems more appropriate here.\n\n\n> I'm not objecting to supporting GIT_EXTERNAL_DIFF, I just want to\n> better understand what you are trying to accomplish here so we can\n> make sure its the _right_ support.\n\nI'm positive there's room for improvement.\n \n\n> I definately see some value in your bastard patches and would like to\n> work with you to get them into a shape that we can include them.  :-)\n\nFor now, I think the external diff and pull functions would be the\neasiest to clean up.  My stash menu is ugly, and if git-gui's merge is\nforever safer than cmd line git-merge, that's fine with me.  I would be\ninterested in your opinion on that prioritization.\n\nNow I get to go play with git and figure out how to disentangle the\nmixed stash and merge stuff in patch #2.  That'll be fun.\n\nThanks,\nBarry\n"},{"id":"77731","messageId":"20080526021413.GB29038@spearce.org","threadId":"13617","inReplyTo":"1211521917.832.45.camel@gdub.robertsr.us","subject":"Re: Naughty, Evil git-gui patches","fromName":"Shawn O. Pearce","fromEmail":"spearce@spearce.org","sentAt":"2008-05-26T02:14:13Z","receivedAt":"2008-05-26T02:14:13Z","isPatch":false,"sender":{"key":"spearce@spearce.org","avatar":"https://avatars.githubusercontent.com/u/34844?v=4"},"body":"Barry Roberts <blr@robertsr.us> wrote:\n> On Thu, 2008-05-22 at 19:24 -0400, Shawn O. Pearce wrote:\n> > \n> > Building a good looking list of stashes would probably require using\n> > several columns of text widgets with a single scrollbar.  This is\n> > how the blame viewer and gitk are put together.  Its ugly as s**t.\n> \n> A simpler option I considered  is just a simple numeric text field in\n> the stash commands that are allowed to specify a stash (show, apply,\n> drop, pop).  Choosing any of these would just open a dialog with a list\n> of stashes and a text field that defaults to 0.  That text field value\n> gets put into the stash@{$number}.  Is that too lame to bother\n> implementing?  Clearly a list to choose from is more standard UI design,\n> I just don't know if it justifies the cost for me.\n\nGood point.  A text field would at least let you select a stash,\nbut I'm not sure there is much of a point without also having a\nway to view the stash's diff.  But that could also just be a text\nfield to enter a stash.  ;-)\n \n> > > 0004 - This is just a concession to (I think) Tortoise.  Just before you \n> > > commit, you notice that you left in a debug message.  This gives us an \n> > > easy way to fix by diff before commit'ing.  This requires setting \n> > > GIT_EXTERNAL_DIFF, or it's not very interesting.\n\nOK.  Your (clipped) explanation makes sense.  I'm not sure\nGIT_EXTERNAL_DIFF is the best way to select that program; perhaps\nit should be a git-gui specific setting in ~/.gitconfig or something.\n \n> What I don't like about my patch now is that it is synchronous.  git-gui\n> is locked up waiting for the ediff/winmerge/kdiff3 window to close.\n> Plus, then I have to click OK to close the console window.  Hmm. Maybe I\n> should look at how you launch gitk.  That seems more appropriate here.\n\nI think the procedure is called do_gitk, but it invokes another Tcl/Tk\nprocess with the path of gitk.  The trick to making it run asynchronous\nis to append \"&\" to the end of the argument list when you call exec:\n\n\texec [list $env(GIT_EXTERNAL_DIFF) $file &]\n\n> > I definately see some value in your bastard patches and would like to\n> > work with you to get them into a shape that we can include them.  :-)\n> \n> For now, I think the external diff and pull functions would be the\n> easiest to clean up.  My stash menu is ugly, and if git-gui's merge is\n> forever safer than cmd line git-merge, that's fine with me.  I would be\n> interested in your opinion on that prioritization.\n\nBoth are useful.  Whatever order you want to work on them in.\nI think you are right that the diff and pull work is smaller and\neasier to clean up.\n\n-- \nShawn.\n"}]}