1. 02 3月, 2009 1 次提交
    • P
      gitk: Fix possible infinite loop and display corruption · 52b8ea93
      Paul Mackerras 提交于
      This fixes an issue reported by Johannes Sixt on the git mailing list:
      
      > This recipe sends gitk into an endless loop. In git.git do:
      >
      > cd t
      > # remove chmod a+x A near the end of the file
      > sed -i 's/chmod/: chmod/' t3400-rebase.sh
      > sh t3400-rebase.sh --debug
      > cd trash\ directory.t3400-rebase/
      > gitk master modechange modechange@{1}
      >
      >
      > I briefly see the history chart, but the dot that should be modechange@{1}
      > is missing. One automatically selected commit is shown in the diff section
      > below. But then the commit list is cleared and gitk goes into an infinite
      > loop.
      >
      > Things work alright if either modechange@{1} is dropped, or the 'chmod'
      > line is left unchanged, which is a bit strange.
      >
      > This is with git version 1.6.1.2.390.gba743
      
      There were actually two problems.  This recipe created a situation where
      git log would output a child commit after its parent.  This meant that
      we called fix_reversal which called splitvarc, which should call modify_arc
      to note the fact that it has modified the arc that it has just split.  It
      wasn't, which meant that displayorder and other variables got into an
      inconsistent state (a commit appearing twice in displayorder).
      
      This then meant that the targetrow/targetid logic in drawvisible thought
      it need to redraw each time.  That, together with the fact that drawvisible
      called drawcommits which called drawvisible if a redraw was needed, led
      to the infinite loop.
      
      In fact drawvisible is now the only caller of drawcommits.  Thus, the
      start and end row arguments to drawcommits always encompass the whole
      visible area, so drawcommits doesn't need to call drawvisible to redraw;
      it just needs to clear the screen and draw what it's been asked to.
      
      This fixes these two problems by adding a call to modify_arc in
      splitvarc and by taking out the call to drawvisible in drawcommits.
      It also removes an unrelated left-over debugging puts in external_blame.
      Signed-off-by: NPaul Mackerras <paulus@samba.org>
      52b8ea93
  2. 22 12月, 2008 7 次提交
  3. 06 12月, 2008 1 次提交
    • P
      gitk: Fix bugs in blaming code · 9712b81a
      Paul Mackerras 提交于
      The "show origin of this line" function wasn't working when gitk was
      run in a subdirectory, since it passed the path relative to the
      top-level directory to git blame.  This fixes it by passing the
      absolute path to the file instead of the relative path.
      
      The same problem occurs when running git gui blame, except that
      git gui blame appears not to be able to accept an absolute path to the
      file, so we make a relative path using a new [make_relative] function.
      
      Finally, this fixes a bug in [show_line_source] where we weren't
      setting id, resulting in an error when trying to find the origin of
      a line in the fake commit for local changes not checked in, when its
      parent was a real commit (i.e. there were no changes checked in).
      Signed-off-by: NPaul Mackerras <paulus@samba.org>
      9712b81a
  4. 02 12月, 2008 5 次提交
  5. 18 11月, 2008 4 次提交
    • P
      gitk: Fix context menu items for generating diffs when in tree mode · e1160138
      Paul Mackerras 提交于
      Currently, if you invoke the "diff this -> selected" or "diff selected
      -> this" and gitk is in "Tree" mode rather than "Patch" mode, the
      diff display pane will just show the header but not the actual diff,
      unless gitk has done the diff before and thus has the list of files
      that differ.  This was because the logic in gettreediffline that
      checked whether we had moved on to doing something else checked the
      mode (Tree or Patch) before checking whether the ids we're diffing
      had changed.
      
      This fixes it.  The new logic in gettreediffline is slightly hacky
      and relies on the fact that the Tree/Patch mode only applies when
      we're looking at a single commit, not at the diff between two commits.
      Signed-off-by: NPaul Mackerras <paulus@samba.org>
      e1160138
    • A
      gitk: Avoid handling the Return key twice in Add Branch · 68149a71
      Alexander Gavrilov 提交于
      This reverts commit 63767d5f.
      
      A similar change was made as part of commit 76f15947, that added
      bindings to all dialogs, and this duplication causes mkbrgo to be
      called twice, the second time after the window has been destroyed.
      As a result, an error window appears when the code tries to access
      widgets.
      Signed-off-by: NAlexander Gavrilov <angavrilov@gmail.com>
      Signed-off-by: NPaul Mackerras <paulus@samba.org>
      68149a71
    • P
      gitk: Show local changes properly when we have a path limit · cdc8429c
      Paul Mackerras 提交于
      Since gitk looks for the HEAD commit to attach the fake commits for
      local changes to, we can miss out on seeing the fake commits if we
      have a path limit and the HEAD commit doesn't alter any of the files
      in the path limit.
      
      This fixes it by running
      
      	git rev-list -1 $head -- $paths
      
      if we have a path limit, and taking the result of that as the commit
      to attach the fake commits to.  This means that we can be attaching
      the fake commits to a different commit in each view, so we use a new
      $viewmainhead($view) for that.
      
      This also fixes a buglet where updatecommits would only fix up the
      fake commits if the HEAD changed since the last call to updatecommits,
      whereas it should fix them up if the HEAD has changed since this view
      was last created or updated.
      Signed-off-by: NPaul Mackerras <paulus@samba.org>
      cdc8429c
    • P
      gitk: Fix switch statement in parseviewargs · 29582284
      Paul Mackerras 提交于
      In Tcl, a comment in a switch command where a pattern would be expected
      doesn't do what one would expect, so this moves the comments inside the
      actions.  Doing that shows up an extra "-" which this also removes.
      
      With this, --merge is now handled properly.
      Signed-off-by: NPaul Mackerras <paulus@samba.org>
      29582284
  6. 15 11月, 2008 1 次提交
  7. 13 11月, 2008 4 次提交
    • P
      gitk: Fix linehtag undefined error with file highlighting · d98d50e2
      Paul Mackerras 提交于
      Occasionally gitk will throw a Tcl error complaining that linehtag(n)
      is undefined when.  It happens when the commit list is still growing
      (e.g. when updating the commit list) and gitk is set to highlight
      commits that affect certain file(s).  What happens is that the changes
      to the commit list set need_redisplay to indicate that the display
      needs to be redrawn.  That causes the next call to drawcommits to call
      clear_display, which unsets iddrawn and thus ensures that readfhighlight
      won't call bolden on any rows that have moved.  However, it is possible
      for readfhighlight to be called after the commit list has changed but
      before drawcommits has run, meaning that readfhighlight will potentially
      think that rows have been drawn when they haven't, because of the
      change in the id -> row mapping (and the fact that iddrawn is indexed
      by id but line[hnd]tag are indexed by row number).
      
      This fixes it (and also optimizes things a little) by making bolden
      and bolden_name check need_redisplay before doing anything.  If
      need_redisplay is set, then there is no point doing anything because
      the whole display is about to get cleared and redrawn, and it avoids
      looking up line[hn]tag using stale row numbers.
      Signed-off-by: NPaul Mackerras <paulus@samba.org>
      d98d50e2
    • A
      gitk: Fix commit encoding support · 590915da
      Alexander Gavrilov 提交于
      This commit fixes two problems with commit encodings:
      
      1) git-log actually uses i18n.logoutputencoding to generate
         its output, and falls back to i18n.commitencoding only
         when that option is not set.  Thus, gitk should use its
         value to read the results, if available.
      
      2) The readcommit function did not process encodings at all.
         This led to randomly appearing misconverted commits if
         the commit encoding differed from the current locale.
      
      Now commit messages should be displayed correctly, except
      when logoutputencoding is set to an encoding that cannot
      represent charecters in the message.  For example, it is
      impossible to convert Japanese characters from Shift-JIS
      to CP-1251 (although the reverse conversion works).
      
      The reason for using git log to read the commit and then getting
      Tcl to convert its output is that is essentially what happens in
      the normal path through getcommitlines, hence there is less chance
      for unintended differences in how commits are processed in
      getcommitlines and do_readcommit.
      Signed-off-by: NAlexander Gavrilov <angavrilov@gmail.com>
      Signed-off-by: NPaul Mackerras <paulus@samba.org>
      590915da
    • A
      gitk: Fix transient windows on Win32 and MacOS · e7d64008
      Alexander Gavrilov 提交于
      Transient windows cause problems on these platforms:
      
      - On Win32 the windows appear in the top left corner
        of the screen. In order to fix it, this patch causes
        them to be explicitly centered on their parents by
        an idle handler.
      
      - On MacOS with Tk 8.4 they appear without a title bar.
        Since it is clearly unacceptable, this patch disables
        transient on that platform.
      Signed-off-by: NAlexander Gavrilov <angavrilov@gmail.com>
      Signed-off-by: NPaul Mackerras <paulus@samba.org>
      e7d64008
    • A
      gitk: Add accelerators to frequently used menu commands · cea07cf8
      Alexander Gavrilov 提交于
      This commit documents keyboard accelerators used for menu
      commands in the menu, as it is usually done, and adds some
      more, e.g. F4 to invoke Edit View (or New View if the current
      view is the un-editable "All files" view).
      
      The changes include a workaround for handling Shift-F4 on
      systems where XKB binds special XF86_Switch_VT_* symbols
      to Ctrl-Alt-F* combinations.  Tk often receives these codes
      when Shift-F* is pressed, so it is necessary to bind the
      relevant actions to them as well.
      Signed-off-by: NAlexander Gavrilov <angavrilov@gmail.com>
      Signed-off-by: NPaul Mackerras <paulus@samba.org>
      cea07cf8
  8. 09 11月, 2008 1 次提交
  9. 08 11月, 2008 2 次提交
    • A
      gitk: Implement a user-friendly Edit View dialog · 218a900b
      Alexander Gavrilov 提交于
      Originally gitk required the user to specify all limiting
      options manually in the same field with the list of commits.
      It is rather unfriendly for new users, who may not know
      which options can be used, or, indeed, that it is possible
      to specify them at all.
      
      This commit modifies the dialog to present the most useful
      options as individual fields.  Note that options that may
      be useful to an extent, but produce a severely broken view,
      are deliberately not included.
      
      It is still possible to specify options in the commit list
      field, but when the dialog is reopened, they will be extracted
      into their own separate fields.
      Signed-off-by: NAlexander Gavrilov <angavrilov@gmail.com>
      Signed-off-by: NPaul Mackerras <paulus@samba.org>
      218a900b
    • P
      gitk: Improve cherry-pick error handling · 887a791f
      Paul Mackerras 提交于
      This adds to the regexps that are used to work out what sort of error
      we encountered in trying to do a cherry-pick so that it recognizes
      some additional common error messages.  It adds a confirmation dialog
      when the error is a merge conflict so the user can choose whether or
      not to run git citool.  Finally, it arranges to update the display
      after a cherry-pick failed so that any local changes made by the
      cherry-pick become visible.
      Signed-off-by: NPaul Mackerras <paulus@samba.org>
      887a791f
  10. 07 11月, 2008 3 次提交
  11. 04 11月, 2008 2 次提交
    • P
      gitk: Cope with unmerged files in local changes · 48a81b7c
      Paul Mackerras 提交于
      This modifies gettreediffline so that it when we get both a "U" line
      and an "M" line for the same file in the output from git diff-files
      or git diff-index --cached (used when the user clicks on a fake commit)
      we don't add the same filename to the treediff list twice.
      
      This also makes getblobdiffline recognize the "* Unmerged path ..."
      lines we get when we ask for the actual diffs, and makes a tiny
      optimization in makediffhdr.
      Signed-off-by: NPaul Mackerras <paulus@samba.org>
      48a81b7c
    • P
      gitk: Make "show origin of this line" work on fake commits · fc4977e1
      Paul Mackerras 提交于
      This makes the "Show origin of this line" menu item work correctly
      on the fake commits that gitk shows for local uncommitted changes.
      With the fake commit for changes that aren't checked in to the index,
      we can actually get a 3-way diff shown, which means we might have to
      blame either the parent or the commit being merged in (which we get
      from .git/MERGE_HEAD).
      
      If the parent is the fake commit which shows the changes that have
      been checked in to the index, then we need to get the SHA1 of the blob
      for the version of the file that is in the index, then use git cat-file
      blob to get the contents of the blob, and give that to git blame with --contents - so that git blame will do the blame on the index version
      of the file.  In that case, we might get the all-zeroes SHA1 back from
      git blame, meaning that the line is new in the index version of the
      file, so then we have to use $nullid2 (the pseudo-SHA1 of the fake
      commit for the checked-in changes).
      Signed-off-by: NPaul Mackerras <paulus@samba.org>
      fc4977e1
  12. 02 11月, 2008 1 次提交
    • P
      gitk: Unify handling of merge diffs with normal 2-way diffs · 8b07dca1
      Paul Mackerras 提交于
      This adds code to getblobdiffline to make it able to recognize and
      display merge diffs (i.e. N-way diffs for N >= 3) as well as normal
      two-way diffs.  This means that it can also correctly display the
      3-way diff of the local changes when the git repository is in the
      middle of a merge with conflicts.
      
      This also removes getmergediffline and changes mergediff to invoke
      getblobdiffline rather than getmergediffline.
      Signed-off-by: NPaul Mackerras <paulus@samba.org>
      8b07dca1
  13. 27 10月, 2008 3 次提交
    • P
      gitk: Make the background color of marked lines configurable · e3e901be
      Paul Mackerras 提交于
      This makes it possible for the user to configure the background color
      of lines that are "marked".  At the moment only the "show the origin
      of this line" function marks lines.  This also makes the user's choice
      persistent by saving it in ~/.gitk.
      Signed-off-by: NPaul Mackerras <paulus@samba.org>
      e3e901be
    • P
      gitk: Add a menu item to show where a given line comes from · 8a897742
      Paul Mackerras 提交于
      This adds a menu item to the pop-up menu for the diff display window
      which makes gitk find which commit added the line (via git blame)
      and show that commit, with the line highlighted with a light-blue
      background.
      Signed-off-by: NPaul Mackerras <paulus@samba.org>
      8a897742
    • P
      gitk: Fix some off-by-one errors in computing which line to blame · 190ec52c
      Paul Mackerras 提交于
      When walking back from the line where a right-click happened to the
      previous hunk separator line to calculate the line number to work on,
      we were counting every line including the one clicked on.  That isn't
      right; if the user clicked on the line immediately after the hunk
      separator then the correct line number would be the one from the
      hunk separator.  Therefore this looks at the clicked-on line to work
      out which parent to blame (or whether to blame the current commit),
      and then looks only at the preceding lines to work out the offset from
      the line number in the hunk separator.
      
      This also fixes an off-by-one error when we are showing files rather
      than diffs.  In this case diff_menu_filebase is the line number of
      the banner showing the file name, so the first line of the file is
      at line $diff_menu_filebase + 1.
      
      This also simplifies the code in find_hunk_blamespec a bit and arranges
      that we don't pop up the context menu if the user clicks on a file
      separator line or a hunk separator line.
      Signed-off-by: NPaul Mackerras <paulus@samba.org>
      190ec52c
  14. 26 10月, 2008 1 次提交
  15. 21 10月, 2008 3 次提交
    • A
      gitk: Fix file list context menu for merge commits · 2df6442f
      Alexander Gavrilov 提交于
      Currently it displays an ugly error box, because the treediffs array
      is not filled for such commits.  This fixes it by making
      getmergediffline add the filenames it sees to the treediffs array
      like gettreediffline does.
      Signed-off-by: NAlexander Gavrilov <angavrilov@gmail.com>
      Signed-off-by: NPaul Mackerras <paulus@samba.org>
      2df6442f
    • A
      gitk: Allow forcing branch creation if it already exists · bee866fa
      Alexander Gavrilov 提交于
      If gitk knows that the branch the user tries to create exists,
      it should ask whether it should overwrite it.  This way the user
      can either decide to choose a new name, or move the head while
      preserving the reflog.
      Signed-off-by: NAlexander Gavrilov <angavrilov@gmail.com>
      Signed-off-by: NPaul Mackerras <paulus@samba.org>
      bee866fa
    • P
      gitk: Turn short SHA1 names into links too · d375ef9b
      Paul Mackerras 提交于
      This changes the link detection logic to accept strings of between 6
      and 40 hex characters as a possible SHA1 ID of another commit, rather
      than insisting on seeing the full 40 hex characters.
      
      To make the logic that turns a possible link into an actual link work
      with abbreviated IDs, this changes the way the commitinterest array is
      used, and puts the code that deals with it in a pair of new functions.
      The commitinterest array is now indexed by just the first 4 characters
      of the interesting SHA1 ID, and each element is a list of id + command
      pairs.  This also pulls out the logic for expanding an abbreviated
      SHA1 to the list of matching full IDs into its own function (the way
      it is done is still the same slow way it was done before, which should
      be improved some day).
      
      This also fixes the bug where clicking on a link would take you to the
      wrong commit if the line number of the target had changed since the
      link was made.
      
      This is based on a patch by Linus Torvalds, but totally rewritten by me.
      Signed-off-by: NPaul Mackerras <paulus@samba.org>
      d375ef9b
  16. 18 10月, 2008 1 次提交
    • P
      gitk: Regenerate .po files · 79056034
      Paul Mackerras 提交于
      This is the result of running make update-po and removing or fixing
      the strings that were fuzzily matched.  The ones that were fixed were
      the ones where the only change was "git rev-list" to "git log", and
      the "about gitk" message where the copyright year got updated.
      
      To get xgettext to see the menu labels as needing translation, it
      was necessary for arrange for them to be preceded by "mc".  This
      therefore changes makemenu to ignore the first element in each
      menu item so that it can be "mc" in the makemenu call.
      Signed-off-by: NPaul Mackerras <paulus@samba.org>
      79056034