Commit graph

521 commits

Author SHA1 Message Date
Paul Mackerras
fced800806 Merge branch 'master' into dev 2009-05-01 09:34:57 +10:00
Paul Mackerras
6f63fc18b6 gitk: Fix compare-commits function when we have local changes
This fixes a bug in the compare-commits function added in commit
010509f2 ("gitk: Add a command to compare two strings of commits")
where gitk would show an error dialog if the comparison of commits
got to a fake commit (one showing local changes).  It extends
getpatchid to handle these fake commits by using [diffcmd] to get
the git diff command variant to use, and also handles the situation
where an error occurs.

Now that we can have the fake commit IDs showing up, which are
00..00 and 00..01, the short ID is ambiguous.  To make sure the links
point to the right commit, this adds a new [appendshortlink] procedure
which takes the full link destination, and uses that rather than
appendwithlinks.

Signed-off-by: Paul Mackerras <paulus@samba.org>
2009-04-21 22:22:31 +10:00
Pat Thoyts
478afad697 gitk: Avoid crash if closed while reading references
As recorded in msysGit issue 125, if the user closes gitk while it
reports itself as still reading references then Tk will crash in the
geometry management code.  This has been fixed for Tk 8.5.7 and above.
This patch avoids the problem by flushing outstanding geometry events
before calling the readrefs procedure.

See also http://code.google.com/p/msysgit/issues/detail?id=125

Signed-off-by: Pat Thoyts <patthoyts@users.sourceforge.net>
Signed-off-by: Paul Mackerras <paulus@samba.org>
2009-04-17 22:52:15 +10:00
Pat Thoyts
b575b2f1f4 gitk: Handle external diff tool with spaces in the path
This fixes the launching of external diff to handle a diff tool
that has spaces in the path.  This ensures a correctly formed
tcl list is passed to the open command with a single pipe character
prefixing the list (as per the tcl manual page for open).

The specific fault observed was that selecting WinMerge as the diff
tool from the default installed location in Program Files failed to
be launched from the context menu.

Signed-off-by: Pat Thoyts <patthoyts@users.sourceforge.net>
Signed-off-by: Paul Mackerras <paulus@samba.org>
2009-04-17 22:47:49 +10:00
Pat Thoyts
c876dbadc2 gitk: Remember and restore the window state with the geometry
This records the window state in ~/.gitk.  On startup, if the gitk
window was previously maximized (zoomed), then we restore that state.

Signed-off-by: Pat Thoyts <patthoyts@users.sourceforge.net>
Signed-off-by: Paul Mackerras <paulus@samba.org>
2009-04-17 22:47:49 +10:00
Michele Ballabio
b6e192dbf7 gitk: Map KP_Divide to focus the search box
Commit 97bed034 changed the behavior of the '/' key on the keyboard,
but the '/' on the keypad was left unused.  They now both do the same
thing.

Signed-off-by: Michele Ballabio <barra_cuda@katamail.com>
Signed-off-by: Paul Mackerras <paulus@samba.org>
2009-04-17 22:47:48 +10:00
Michele Ballabio
b56e0a9afd gitk: Mark some more strings for translation
Signed-off-by: Michele Ballabio <barra_cuda@katamail.com>
Signed-off-by: Paul Mackerras <paulus@samba.org>
2009-04-17 22:47:48 +10:00
Christian Stimming
84b4b832eb gitk: Mark forgotten string for translation
Signed-off-by: Paul Mackerras <paulus@samba.org>
2009-04-17 22:47:48 +10:00
Paul Mackerras
9832e4f29b gitk: Make .gitk a hidden file under windows
This sets the hidden attribute on the ~/.gitk file so it doesn't
appear in the windows user profile.

Signed-off-by: Paul Mackerras <paulus@samba.org>
2009-04-17 22:47:48 +10:00
Paul Mackerras
010509f2de gitk: Add a command to compare two strings of commits
This adds a row context menu command to compare this commit and its
descendants with the marked commit and its descendants.  The results
are shown in the bottom-left pane.  Commits are compared by checking
whether their headlines are the same and their patches have the same
patch ID as generated by git patch-id.

Merges are ignored and skipped over (as long as they have one
descendant).  If two commits have the same patch ID then the process
will continue and compare their descendants, as long as they both have
exactly one descendant.  If either commit has 0 or 2 or more descendants,
the comparison stops there.  There is currently a limit of 100
comparisons.

This can be useful for checking whether one string of commits is just
a rebased version of another string of commits.  Mark the end of one
string (i.e. the oldest commit in the string) and invoke "Compare with
marked commit" on the end of the other string.

As this is implemented, the UI will be unresponsive while the results
are being generated.  This should be fixed.

Signed-off-by: Paul Mackerras <paulus@samba.org>
2009-04-09 22:10:20 +10:00
Paul Mackerras
b9fdba7ff8 gitk: Add a way to mark a commit, plus a "find descendant" command
This adds a context-menu command to put a mark on this commit.  There
is at most one marked commit at any time, and it is indicated by a box
drawn around the headline.  Once a commit is marked, two other
context-menu commands become available: one to select the marked commit,
and another to find the closest common descendant of this commit and
the marked commit.

The "find common descendant" command uses the displayed parent/child
relationships (i.e. the rewritten parent pointers produced by git log),
not the real parent/child relationships.  Currently the UI will be
unresponsive while gitk is working out the nearest common descendant;
this should be improved in future.

Signed-off-by: Paul Mackerras <paulus@samba.org>
2009-04-09 09:34:46 +10:00
Daniel A. Steffen
5fdcbb1390 gitk: Fixes for Mac OS X TkAqua
- middle button is B3 on TkAqua
- add horizontal mousehweel scrolling
- nicer default fonts
- use OSX-specific extdifftool
- remove quit menu item, call doquit on quit event
- move about & preferences menu items into apple menu
- don't set menu font

Signed-off-by: Daniel A. Steffen <das@users.sourceforge.net>
Signed-off-by: Paul Mackerras <paulus@samba.org>
2009-03-23 22:35:38 +11:00
Stephen Boyd
d38d7d4954 gitk: Provide a 32x32 window icon based on the git logo
This simply expands the 16x16 logo image to 32x32 and provides it as
an alternative icon image.

Signed-off-by: Stephen Boyd <bebarino@gmail.com>
Signed-off-by: Paul Mackerras <paulus@samba.org>
2009-03-23 21:53:00 +11:00
Giuseppe Bilotta
37871b735a gitk: Provide a window icon if possible
Try to set up a 16x16 Tk photo image (based on the git logo) and use
it as window icon.  The code is wrapped in a catch because it may fail
in earlier Tcl/Tk 8.4 releases that don't provide 'wm iconphoto'.

Signed-off-by: Giuseppe Bilotta <giuseppe.bilotta@gmail.com>
Signed-off-by: Stephen Boyd <bebarino@gmail.com>
Signed-off-by: Paul Mackerras <paulus@samba.org>
2009-03-23 21:52:59 +11:00
Pat Thoyts
681c3290e3 gitk: Handle blobs containing a DOS end-of-file marker
If a patchset contains an EOF marker (Ctrl-Z) the blob diff terminates
at that point.  This permits gitk to ignore the eof and continue to
display any subsequent blobs and also displays a sensible representation
of the eof char.

Signed-off-by: Pat Thoyts <patthoyts@users.sourceforge.net>
Signed-off-by: Paul Mackerras <paulus@samba.org>
2009-03-23 21:52:57 +11:00
Paul Mackerras
52b8ea934e gitk: Fix possible infinite loop and display corruption
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: Paul Mackerras <paulus@samba.org>
2009-03-02 09:38:17 +11:00
Johannes Sixt
e4df519f05 gitk: Force the focus to the main window on Windows
On msysGit, the focus is first on the (Tk) console.  This console is then
hidden, but keeps the focus.  Work around that by forcing the focus onto
the gitk window.

This fixes msysGit issue 14.  Diagnosed and originally fixed by
Johannes Schindelin.

Signed-off-by: Johannes Sixt <j6t@kdbg.org>
Signed-off-by: Paul Mackerras <paulus@samba.org>
2008-12-22 10:16:18 +11:00
Kevin Ballard
61f57cb07d gitk: Allow unbalanced quotes/braces in commit headers
When parsing commits, gitk treats the headers of the commit as tcl
lists.  This causes errors if the header contains an unbalanced quote
or open brace.  Splitting the line on spaces allows us to treat it as
a set of words instead of as a tcl list, which prevents errors.

Signed-off-by: Kevin Ballard <kevin@sb.org>
Signed-off-by: Paul Mackerras <paulus@samba.org>
2008-12-22 10:16:18 +11:00
Christian Stimming
968b016a4a gitk: Mark forgotten strings (header sentence parts in color chooser) for translation
Signed-off-by: Paul Mackerras <paulus@samba.org>
2008-12-22 10:16:18 +11:00
Johannes Sixt
da12e59dd6 gitk: Ensure that "Reset branch" menu entry is enabled
Consider this sequence of events:

1. Detach HEAD and fire up gitk
2. Call the context menu on some commit. Notice that the last menu entry
   says "Detached HEAD: can't reset" and it is disabled.
3. Now checkout some regular branch (e.g. 'master') using the context menu.
4. Call the context menu again on some commit.

Previously, at this point the last menu entry said "Reset master branch
to here", but it was still disabled. With this fix it is now enabled again.

Signed-off-by: Johannes Sixt <j6t@kdbg.org>
Signed-off-by: Paul Mackerras <paulus@samba.org>
2008-12-22 10:16:17 +11:00
Johannes Sixt
adcbec13b9 gitk: Use check-buttons' -text property instead of separate labels
Previously the check-buttons' labels in the Preferences were separate
widgets.  This had the disadvantage that in order to toggle the
check-button with the mouse the check-box had to be clicked.  With
this change the check-box can also be toggled by clicking the label.

Signed-off-by: Johannes Sixt <j6t@kdbg.org>
Signed-off-by: Paul Mackerras <paulus@samba.org>
2008-12-22 10:16:17 +11:00
Giuseppe Bilotta
97bed03448 gitk: Map / to focus the search box
The / key is often used to initiate searches (less, vim, some web
browsers).  This changes the binding for the / (slash) key from 'find
next' to 'focus the search box' to follow this convention.

Signed-off-by: Giuseppe Bilotta <giuseppe.bilotta@gmail.com>
Signed-off-by: Paul Mackerras <paulus@samba.org>
2008-12-22 10:16:17 +11:00
Paul Mackerras
9712b81a76 gitk: Fix bugs in blaming code
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: Paul Mackerras <paulus@samba.org>
2008-12-06 21:44:05 +11:00
Alexander Gavrilov
7fb0abb195 gitk: Add a menu option to start git gui
Git gui already has menu commands to start gitk, and this makes the
relation symmetric.

[paulus@samba.org - changed "Git Gui" in the menu item to "git gui"]

Signed-off-by: Alexander Gavrilov <angavrilov@gmail.com>
Signed-off-by: Paul Mackerras <paulus@samba.org>
2008-12-02 09:43:12 +11:00
Alexander Gavrilov
f3413079d6 gitk: Make line origin search update the busy status
Currently the 'show origin of this line' feature does not update the
status field of the gitk window, so it is not evident that any
processing is going on.  It may seem at first that clicking the item
had no effect.

This commit adds calls to set and clear the busy status with an
appropriate title, similar to other search commands.

Signed-off-by: Alexander Gavrilov <angavrilov@gmail.com>
Signed-off-by: Paul Mackerras <paulus@samba.org>
2008-12-02 09:43:12 +11:00
Paul Mackerras
6e7e87c762 gitk: Fix bug in accessing undefined "notflag" variable
As pointed out by Johannes Sixt and Alexander Gavrilov, commit
2958228430 ("gitk: Fix switch statement
in parseviewargs") exposed a latent bug in that $notflag was never
initialized.  Since it isn't used either, this removes it entirely.

Signed-off-by: Paul Mackerras <paulus@samba.org>
2008-12-02 09:28:06 +11:00
Paul Mackerras
8b39e04f39 gitk: Highlight only when search type is "containing:".
When the search type is "touching paths" or "adding/removing string",
it's not very useful to highlight instances of the search string in
the commit message, headline or author name, so this disables the
highlighting in those cases.

This was suggested by Mark Burton <markb@ordern.com>, but the
implementation is different to his patch, which tested $gdttype at
each place where $markingmatches was tested.

Signed-off-by: Paul Mackerras <paulus@samba.org>
2008-12-02 09:27:30 +11:00
Paul Mackerras
354af6bd69 gitk: Restore scrolling position of diff pane on back/forward in history
This arranges to save the scrolling position of the diff display pane
when we move from displaying one thing to another, and then scroll the
pane to the same position when we go back to the previous thing using
the back or forward buttons.  This works if we have clicked on a commit
and are in patch display mode, or if we have clicked on a line or a tag,
or have done a diff between two commits with the context menu.  It
doesn't currently restore the pane to where it was if is was displaying
a commit in tree display mode.

For future extensibility, addtohistory now takes an extra optional
argument which is a script to invoke when moving from this thing to
another.  The script needs to return a list of pairs of variable name
and value.  If we go back to this thing, the godo procedure will set
the named variables to the values given.  At present that is just used
to store the $ctext scrolling position, but in future we will use it
to store the state of which directories are open in the file list pane.

Signed-off-by: Paul Mackerras <paulus@samba.org>
2008-11-23 13:14:23 +11:00
Paul Mackerras
e11601381e gitk: Fix context menu items for generating diffs when in tree mode
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: Paul Mackerras <paulus@samba.org>
2008-11-18 21:40:32 +11:00
Alexander Gavrilov
68149a7197 gitk: Avoid handling the Return key twice in Add Branch
This reverts commit 63767d5fb8.

A similar change was made as part of commit 76f15947af, 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: Alexander Gavrilov <angavrilov@gmail.com>
Signed-off-by: Paul Mackerras <paulus@samba.org>
2008-11-18 20:35:39 +11:00
Paul Mackerras
cdc8429c94 gitk: Show local changes properly when we have a path limit
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: Paul Mackerras <paulus@samba.org>
2008-11-18 19:54:14 +11:00
Paul Mackerras
2958228430 gitk: Fix switch statement in parseviewargs
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: Paul Mackerras <paulus@samba.org>
2008-11-18 19:44:20 +11:00
Paul Mackerras
28593d3fa0 gitk: Index line[hnd]tag arrays by id rather than row number
This simplifies things a bit and is better because ids are stable
but row numbers aren't.  It also means we can avoid one [rowofcommit]
call.

Signed-off-by: Paul Mackerras <paulus@samba.org>
2008-11-15 16:23:04 +11:00
Paul Mackerras
d98d50e214 gitk: Fix linehtag undefined error with file highlighting
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: Paul Mackerras <paulus@samba.org>
2008-11-13 22:39:00 +11:00
Alexander Gavrilov
590915dab8 gitk: Fix commit encoding support
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: Alexander Gavrilov <angavrilov@gmail.com>
Signed-off-by: Paul Mackerras <paulus@samba.org>
2008-11-13 22:20:25 +11:00
Alexander Gavrilov
e7d640086e gitk: Fix transient windows on Win32 and MacOS
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: Alexander Gavrilov <angavrilov@gmail.com>
Signed-off-by: Paul Mackerras <paulus@samba.org>
2008-11-13 21:40:41 +11:00
Alexander Gavrilov
cea07cf8dc gitk: Add accelerators to frequently used menu commands
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: Alexander Gavrilov <angavrilov@gmail.com>
Signed-off-by: Paul Mackerras <paulus@samba.org>
2008-11-13 21:40:39 +11:00
Paul Mackerras
dbc4941fac Merge branch 'dev' 2008-11-09 22:05:50 +11:00
Alexander Gavrilov
218a900bd8 gitk: Implement a user-friendly Edit View dialog
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: Alexander Gavrilov <angavrilov@gmail.com>
Signed-off-by: Paul Mackerras <paulus@samba.org>
2008-11-08 21:50:55 +11:00
Paul Mackerras
887a791f11 gitk: Improve cherry-pick error handling
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: Paul Mackerras <paulus@samba.org>
2008-11-08 21:37:09 +11:00
Alexander Gavrilov
15e350552d gitk: Make cherry-pick call git-citool on conflicts
Now that git-gui has facilities to help users resolve
conflicts, it makes sense to launch it from other GUI
tools when they happen.

Signed-off-by: Alexander Gavrilov <angavrilov@gmail.com>
Signed-off-by: Paul Mackerras <paulus@samba.org>
2008-11-07 22:53:17 +11:00
Alexander Gavrilov
84a76f18f0 gitk: Make gitk dialog windows transient
Transient windows are always kept above their parent, and don't occupy
any space in the taskbar, which is useful for dialogs.  Also, when
transient is used, it is important to bind windows to the correct
parent.

This commit adds transient annotations to all dialogs, ensures usage
of the correct parent for error and confirmation popups, and, as a
side job, makes gitk preserve the create tag dialog window in case of
errors.

Signed-off-by: Alexander Gavrilov <angavrilov@gmail.com>
Signed-off-by: Paul Mackerras <paulus@samba.org>
2008-11-07 22:53:14 +11:00
Alexander Gavrilov
76f15947af gitk: Add Return and Escape bindings to dialogs
It is often more convenient to dismiss or accept a dialog using the
keyboard, than by clicking buttons on the screen.  This commit adds
key binding to make it possible with gitk's dialogs.

Signed-off-by: Alexander Gavrilov <angavrilov@gmail.com>
Signed-off-by: Paul Mackerras <paulus@samba.org>
2008-11-07 22:53:13 +11:00
Paul Mackerras
48a81b7cda gitk: Cope with unmerged files in local changes
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: Paul Mackerras <paulus@samba.org>
2008-11-04 21:09:00 +11:00
Paul Mackerras
fc4977e1b9 gitk: Make "show origin of this line" work on fake commits
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: Paul Mackerras <paulus@samba.org>
2008-11-04 12:57:44 +11:00
Paul Mackerras
8b07dca18a gitk: Unify handling of merge diffs with normal 2-way diffs
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: Paul Mackerras <paulus@samba.org>
2008-11-02 22:34:47 +11:00
Paul Mackerras
e3e901bece gitk: Make the background color of marked lines configurable
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: Paul Mackerras <paulus@samba.org>
2008-10-27 22:37:21 +11:00
Paul Mackerras
8a8977425e gitk: Add a menu item to show where a given line comes from
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: Paul Mackerras <paulus@samba.org>
2008-10-27 21:36:25 +11:00
Paul Mackerras
190ec52c90 gitk: Fix some off-by-one errors in computing which line to blame
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: Paul Mackerras <paulus@samba.org>
2008-10-27 21:13:37 +11:00
Alexander Gavrilov
7cdc3556d1 gitk: Allow starting gui blame for a specific line
This adds a context menu item to the diff viewer pane that calls git
gui blame, focusing it on the clicked line.  In case of combined
diffs, it also automatically deduces which parent is to be blamed.
Lines added by the diff are blamed on the current commit itself.

The context menu itself is added by this patch.  It would be possible
to add the commands from the flist menu to it.

Signed-off-by: Alexander Gavrilov <angavrilov@gmail.com>
Signed-off-by: Paul Mackerras <paulus@samba.org>
2008-10-26 22:03:40 +11:00
Alexander Gavrilov
2df6442f7d gitk: Fix file list context menu for merge commits
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: Alexander Gavrilov <angavrilov@gmail.com>
Signed-off-by: Paul Mackerras <paulus@samba.org>
2008-10-21 22:37:39 +11:00
Alexander Gavrilov
bee866fa6b gitk: Allow forcing branch creation if it already exists
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: Alexander Gavrilov <angavrilov@gmail.com>
Signed-off-by: Paul Mackerras <paulus@samba.org>
2008-10-21 22:37:36 +11:00
Paul Mackerras
d375ef9b14 gitk: Turn short SHA1 names into links too
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: Paul Mackerras <paulus@samba.org>
2008-10-21 10:18:52 +11:00
Paul Mackerras
79056034be gitk: Regenerate .po files
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: Paul Mackerras <paulus@samba.org>
2008-10-18 22:23:33 +11:00
Paul Mackerras
f2d0bbbd68 gitk: New way of constructing menus that allows for Alt+letter accelerators
This is inspired by patches from Robin Rosenberg but takes a different
approach.  This adds a "makemenu" procedure for constructing menus
that allows the menu layout to be specified in a clear fashion, and
provides one place where the alt+letter accelerators can be detected
and handled.

The alt+letter accelerator is specified by putting an ampersand (&)
before the letter for the accelerator in the menu item name.  (Two
ampersands in succession produce one ampersand in the menu item as
it appears on screen.)  This is handled in makemenu.

We also add an mca procedure which is like mc but also does the
ampersand translation, for use when we want to refer to a menu item
by name.  The mca name and the locations where we use it were
shamelessly stolen from Robin Rosenberg's patch.

This doesn't actually add any alt+letter accelerators yet.

Signed-off-by: Paul Mackerras <paulus@samba.org>
2008-10-17 22:44:42 +11:00
Richard Quirk
63767d5fb8 gitk: Bind Key-Return to create on new branch dialog
The Return key can now be used as well as pressing the Create button
from the dialog box that is shown when selecting "Create new branch".

Signed-off-by: Richard Quirk <richard.quirk@gmail.com>
Signed-off-by: Paul Mackerras <paulus@samba.org>
2008-10-16 10:10:30 +11:00
Paul Mackerras
968ce45c9d gitk: Fix binding for <Return> in sha1 entry field
This adds a break so that gitk doesn't go and execute the global
binding for <Return> (i.e. find next) when the user presses the
return key in the sha1 entry field to indicate that gitk should
jump to the commit identified by what they just put into the
sha1 field.

Signed-off-by: Paul Mackerras <paulus@samba.org>
2008-10-16 09:57:02 +11:00
Paul Mackerras
39ee47ef06 gitk: Clean up file encoding code and add enable/disable option
This adds an option allowing the user to select whether gitk should
look up per-file encoding settings using git check-attr or not.  If
not, gitk uses the global encoding set in the git config (as reported
by git config --get gui.encoding) for all files, or if that is not
set, then the system encoding.

The option is controlled by a checkbox in the Edit->Preferences
window, and defaults to off for now because git check-attr is so
slow.  When the user turns it on we discard any cached diff file
lists in treediffs, because we may not have encodings cached for
the files listed in those lists, meaning that getblobdiffline will
do it for each file, which will be really really slow.

This adjusts the limit of how many paths cache_gitattr passes to each
instance of git check-attr depending on whether we're running under
windows or not.  Passing only 30 doesn't effectively amortize the
startup costs of git check-attr, but it's all we can do under windows
because of the 32k limit on arguments to a command.  Under other OSes
we pass up to 1000.

Similarly we adjust how many lines gettreediffline processes depending
on whether we are doing per-file encodings so that we don't run for
too long.  When we are, 500 seems to be a reasonable limit, leading
to gettreediffline taking about 60-70ms under Linux (almost all of
which is in cache_gitattr, unfortunately).  This means that we can
take out the update call in cache_gitattr.

This adds a simple cache on [tclencoding].  Now that we get repeated
calls to translate the same encoding, this is useful.

This reindents the new code added in the last couple of commits to
conform to the gitk 4-space indent and makes various other improvements:
use regexp in gitattr and cache_gitattr instead of split + join + regsub,
make gui_encoding be the value from [tclencoding] to avoid having to
do [tcl_encoding $gui_encoding] in each call to get_path_encoding,
and print a warning message at startup if $gui_encoding isn't
supported by Tcl.

Signed-off-by: Paul Mackerras <paulus@samba.org>
2008-10-15 22:23:03 +11:00
Alexander Gavrilov
4db09304f9 gitk: Implement batch lookup and caching of encoding attrs
When the diff contains thousands of files, calling git-check-attr once
per file is very slow.  With this patch gitk does attribute lookup in
batches of 30 files while reading the diff file list, which leads to a
very noticeable speedup.

It may be possible to reimplement this even more efficiently, if
git-check-attr is modified to support a --stdin-paths option.
Additionally, it should quote the ':' character in file paths, or
provide a more robust way of column separation.

Signed-off-by: Alexander Gavrilov <angavrilov@gmail.com>
Tested-by: Johannes Sixt <johannes.sixt@telecom.at>
Signed-off-by: Paul Mackerras <paulus@samba.org>
2008-10-14 22:25:54 +11:00
Alexander Gavrilov
09c7029dfa gitk: Enhance file encoding support
This allows the encoding to be specified for file contents and used
when displaying files and diffs in the bottom-left pane.  When
displaying diffs, the encoding for each diff hunk is that for the file
that the diff hunk is from, so it can change through the course of the
diff.

The encoding for file contents is determined as follows:

- File encoding defaults to the system encoding.
- It can be overridden by setting the gui.encoding option.
- Finally, the 'encoding' attribute is checked on
  per-file basis; it has the last word.

Note: Since git-check-attr does not provide support for reading
attributes from trees, attribute lookup is done using files from the
working directory.

This also extends the range of supported encoding names, adding
ShiftJIS and Shift-JIS as aliases for Shift_JIS, and allowing
cp-*, cp_*, ibm-*, ibm_*, jis-* and jis_* as aliases for cp*,
ibm* and jis* respectively.

This also fixes some bugs in handling of non-ASCII filenames.  Core
git apparently supports only locale-encoded filenames, so processing
is done using the system encoding.

Signed-off-by: Alexander Gavrilov <angavrilov@gmail.com>
Tested-by: Johannes Sixt <johannes.sixt@telecom.at>
Signed-off-by: Paul Mackerras <paulus@samba.org>
2008-10-14 22:25:54 +11:00
Christian Stimming
3945d2c052 gitk: Add untranslated error messages to translation
Signed-off-by: Christian Stimming <stimming@tuhh.de>
Signed-off-by: Paul Mackerras <paulus@samba.org>
2008-09-21 18:13:13 -05:00
Alexander Gavrilov
b8a640ee1a gitk: Fix a bug in collapsing deeply nested trees
To reproduce: expand a tree like this, then collapse A:

+A
 +B
   C
   D

The result is:

-A
   C
   D

I.e. sub-nodes expanded from the last sub-node of the item
being collapsed are not removed.

Signed-off-by: Alexander Gavrilov <angavrilov@gmail.com>
Signed-off-by: Paul Mackerras <paulus@samba.org>
2008-09-21 18:13:10 -05:00
Paul Mackerras
d277e89f87 gitk: Use <Button-2> for context menus on OSX
An OSX user has reported that gitk's context menus are not usable
under OSX because it doesn't provide a way to generate <Button-3>
events.  Users can generate <Button-2> events with command+click,
so use that for the context menus instead on OSX.

Signed-off-by: Paul Mackerras <paulus@samba.org>
2008-09-21 18:11:37 -05:00
Alexander Gavrilov
77aa0ae8d3 gitk: Add menu item for calling git gui blame
This adds a new item to the file list popup menu, that calls git gui
blame for the selected file, starting with the first parent of the
current commit.

Signed-off-by: Alexander Gavrilov <angavrilov@gmail.com>
Signed-off-by: Paul Mackerras <paulus@samba.org>
2008-08-26 20:10:10 +10:00
Alexander Gavrilov
39816d60e1 gitk: Add option to specify the default commit on command line
Other GUI tools may need to start gitk and make it automatically
select a certain commit.  This adds a new command-line option
--select-commit=id to make that possible.

Signed-off-by: Alexander Gavrilov <angavrilov@gmail.com>
Signed-off-by: Paul Mackerras <paulus@samba.org>
2008-08-26 20:10:10 +10:00
Alexander Gavrilov
df75e86d73 gitk: Allow safely calling nukefile from a run queue handler
Originally dorunq assumed that the queue entry remained first
in the queue after the script eval, and blindly removed it.
However, if the handler calls nukefile, it may not be the
case anymore, and a random queue entry gets dropped instead.

This makes dorunq remove the entry before calling the
script, and adds a global variable to allow other functions
to determine if they are called from within a dorunq handler.

Signed-off-by: Alexander Gavrilov <angavrilov@gmail.com>
Signed-off-by: Paul Mackerras <paulus@samba.org>
2008-08-11 10:13:50 +10:00
Alexander Gavrilov
835e62aef8 gitk: Fallback to selecting the head commit upon load
Try selecting the head, if the previously selected commit
is not available in the new view.

Signed-off-by: Alexander Gavrilov <angavrilov@gmail.com>
Signed-off-by: Paul Mackerras <paulus@samba.org>
2008-07-31 20:29:44 +10:00
Alexander Gavrilov
567c34e0ed gitk: Fixed automatic row selection during load
- Switching views now actually preserves the selected commit.
- Reloading (also Edit View) preserves the currently selected commit.
- Initial selection does not produce weird scrolling.

Signed-off-by: Alexander Gavrilov <angavrilov@gmail.com>
Signed-off-by: Paul Mackerras <paulus@samba.org>
2008-07-31 20:29:44 +10:00
Alexander Gavrilov
7272131b3e gitk: Fixed broken exception handling in diff
If the tree diff command failed to start for some
random reason, treepending remained set, and thus
no more diffs were shown after that.

Signed-off-by: Alexander Gavrilov <angavrilov@gmail.com>
Signed-off-by: Paul Mackerras <paulus@samba.org>
2008-07-31 20:29:44 +10:00
Alexander Gavrilov
b6326e92ef gitk: On Windows, use a Cygwin-specific flag for kill
MSysGit compiles git binaries as native Windows executables,
so they cannot be killed unless a special flag is specified.

This flag is implemented by the Cygwin version of kill,
which is also included in MSysGit.

Signed-off-by: Alexander Gavrilov <angavrilov@gmail.com>
Signed-off-by: Paul Mackerras <paulus@samba.org>
2008-07-31 20:29:44 +10:00
Alexander Gavrilov
e439e092b8 gitk: Arrange to kill diff-files & diff-index on quit
Local change analysis can take a noticeable amount of time on large
file sets, and produce no output if there are no changes.  Register
the back-ends in commfd, so that they get properly killed on window
close.

Signed-off-by: Alexander Gavrilov <angavrilov@gmail.com>
Signed-off-by: Paul Mackerras <paulus@samba.org>
2008-07-31 20:29:44 +10:00
Alexander Gavrilov
e2f90ee45c gitk: Kill back-end processes on window close
When collecting commits for a rarely changed, or recently
created file or directory, rev-list may work for a noticeable
period of time without producing any output.  Such processes
don't receive SIGPIPE for a while after gitk is closed, thus
becoming runaway CPU hogs.

Signed-off-by: Alexander Gavrilov <angavrilov@gmail.com>
Signed-off-by: Paul Mackerras <paulus@samba.org>
2008-07-31 20:29:44 +10:00
Paul Mackerras
c11ff120f3 gitk: Handle detached heads better
This draws the currently checked-out head with a yellow circle, as
suggested by Linus Torvalds, and fixes various places in the code
where we assumed that the current head always had a branch.  Now we
can display the fake commits for local changes on a detached head.

Signed-off-by: Paul Mackerras <paulus@samba.org>
2008-05-26 10:11:33 +10:00
Paul Mackerras
a977953326 gitk: Fix bug introduced by "gitk: Fix "wrong # coordinates" error on reload"
Commit 94503a66c5 ("gitk: Fix "wrong #
coordinates" error on reload") was correct as far as it went, but
introduced a problem because it didn't also clear out boldrows and
boldnamerows in clear_display.  This resulted in Tcl errors after
scrolling through the graph for a while if some rows were highlighted.
This fixes it.

Signed-off-by: Paul Mackerras <paulus@samba.org>
2008-05-22 21:12:19 +10:00
Paul Mackerras
94b4a69f75 gitk: Fix bug where current row number display stops working
The display of the current row number would stop working if the user
clicked on a line, or if selectedline got unset for any other reason,
because the trace on it got lost when it was unselected.  This fixes
it by changing the places that unset selectedline to set it to the
empty string instead, and the places that tested for it being set or
unset to compare it with the empty string.  Thus it never gets unset
now.  This actually simplified the code in a few places since it can
be compared for equality with a row number now without first testing
if it is set.

Signed-off-by: Paul Mackerras <paulus@samba.org>
2008-05-20 20:51:06 +10:00
Paul Mackerras
94503a66c5 gitk: Fix "wrong # coordinates" error on reload
This fixes the Tk error "wrong # coordinates: expected 0 or 4, got 2"
that sometimes occurred when reloading.  The problem was that we didn't
unset the variables containing the canvas item id numbers for the
displayed rows when we cleared the canvases.  Thus make_secsel would
think it had something to do when it didn't.

Thanks to Michele Ballabio for finding a way to trigger the bug
reliably.

Signed-off-by: Paul Mackerras <paulus@samba.org>
2008-05-19 09:48:45 +10:00
Paul Mackerras
08ba820fd7 gitk: Add a progress bar for checking out a head
Now that git checkout reports progress when checking out files, we
can use that to provide a progress bar in gitk.  We re-use the green
progress bar (formerly used when reading stuff in) for that.

Signed-off-by: Paul Mackerras <paulus@samba.org>
2008-05-12 10:18:38 +10:00
Paul Mackerras
6df7403a98 gitk: Show current row number and total number of rows
This adds a couple of fields in the bar just below the upper panes
that show the row number of the currently selected commit, and how
many rows are displayed in total.  The latter increments as commits
are read in, and thus functions to show that progress is being made.
This therefore also removes the code that showed progress using a
green oscillating bar in the progress bar window (which some people
disliked).

Signed-off-by: Paul Mackerras <paulus@samba.org>
2008-05-11 22:13:02 +10:00
Paul Mackerras
e8a0c69b91 Merge branch 'master' into dev 2008-05-11 10:50:14 +10:00
Thomas Arcila
314f5de1a0 gitk: Allow users to view diffs in external diff viewer
This allows gitk to run an external diff viewer such as meld.

Right-click on a file in the file list view gives "External diff"
popup menu entry, which launches the selected external diff tool.
The menu entry is only active in "Patch" mode, not in "Tree" mode.

The program to run to display the diff is configurable through
Edit/Preference/External diff tool.  The program is run with two
arguments, being the names of files containing the two versions to
diff.  Gitk will create temporary directories called
.gitk-tmp.<pid>/<n> to place these files in, and remove them when
it's finished.

If the file doesn't exist in one or other revision, gitk will supply
/dev/null as the name of the file on that side of the diff.  This may
need to be adjusted for Windows or MacOS.

[paulus@samba.org - cleaned up and rewrote some parts of the patch.]

Signed-off-by: Thomas Arcila <thomas.arcila@gmail.com>
Signed-off-by: Paul Mackerras <paulus@samba.org>
2008-05-11 10:50:05 +10:00
Paul Mackerras
f4c54b3cc4 gitk: Synchronize highlighting in file view for 'f' and 'b' commands
This is based on a patch by Eric Raible <raible@gmail.com>, but does
things a bit more simply.

Previously, 'b', backspace, and delete all did the same thing.
This changes 'b' to perform the inverse of 'f'.  And both of
them now highlight the filename of the currently diff.

This makes it easier to review and navigate the diffs associated
with a particular commit using only f, b, and space because the
filename of the currently display diff will be dynamically
highlighted.

Signed-off-by: Paul Mackerras <paulus@samba.org>
2008-05-10 13:15:36 +10:00
Paul Mackerras
ee66e089c1 gitk: Make updates go faster
This goes back to the method of doing updates where we translate the
revisions we're given to SHA1 ids and then remove the ones we've asked
for before or that we've already come across.  This speeds up updates
enormously in most cases since it means git log doesn't have to traverse
large parts of the tree.  We used to do this, but it had bugs, and commit
468bcaedbb (gitk: Don't filter view
arguments through git rev-parse) went to the slower method to avoid the
bugs.

In order to do this properly, we have to parse the command line and
understand all the flag arguments.  So this adds a parser that checks
all the flag arguments.  If there are any we don't know about, we
disable the optimization and just pass the whole lot to git log
(except for -d/--date-order, which we remove from the list).

With this we can then use git rev-parse on the non-flag arguments to
work out exactly what SHA1 ids are included and excluded in the list,
which then enables us to ask for just the new ones when updating.
One wrinkle is that we have to turn symmetric diff arguments (of the
form a...b) back into symmetric diff form so that --left-right still
works, as git rev parse turns a...b into a b ^merge_base(a,b).

This also updates a couple of copyright notices.

Signed-off-by: Paul Mackerras <paulus@samba.org>
2008-05-09 10:14:07 +10:00
Michele Ballabio
5e3502dabb gitk: Disable "Reset %s branch to here" when on a detached head
When we are on a detached head - since gitk does not display where
we are - reset has no sense, so disable the relevant line on the
context menu, and point out to the user that we are on a detached head.

Otherwise, a reset from gitk when on a detached head returns the
error:

can't read "headids()": no such element in array
can't read "headids()": no such element in array
    while executing
"removehead $headids($name) $name"
    (procedure "movehead" line 4)
    invoked from within
"movehead $newhead $mainhead"
    (procedure "readresetstat" line 20)
    invoked from within
"readresetstat file4"
    ("eval" body line 1)
    invoked from within
"eval $script"
    (procedure "dorunq" line 9)
    invoked from within
"dorunq"
    ("after" script)

[paulus@samba.org: changed menu item to "Detached head: can't reset"]

Signed-off-by: Michele Ballabio <barra_cuda@katamail.com>
Signed-off-by: Paul Mackerras <paulus@samba.org>
2008-05-03 17:57:35 +10:00
Paul Mackerras
f31fa2c086 gitk: Fix handling of tree file list with special chars in names
Alex Riesen pointed out that displaying a commit in 'tree' mode fails
if some files have names with special characters such as '{' or '}' in
them, due to the fact that we treat the line returned from git ls-tree
as a Tcl list at one point.

This fixes it by doing what I originally intended but didn't quite
get right.  We split the line from git ls-tree at the first tab and
treat the part before the tab as a list (which is OK since it doesn't
have special characters in it) and the part after the tab as the
filename.

Signed-off-by: Paul Mackerras <paulus@samba.org>
2008-04-28 09:40:50 +10:00
Paul Mackerras
3ed31a8120 gitk: Reorganize processing of arguments for git log
This moves the scanning of the argument list for each view into a
new function, parseviewargs, which is called from start_rev_list.
This also makes the date mode and the merge mode be per-view rather
than global.  In merge mode, we work out the list of relevant files
in a new function called from start_rev_list, so it will be updated
on File->Reload.  Plus we now do that after running the argscmd, so
if we have one and it generates a -d or --merge option they will be
correctly handled now.

The other thing this does is to make errors detected in start_rev_list
not be fatal.  Now instead of doing exit 1 we just pop up and error
window and put "No commits selected" in the graph pane.

Signed-off-by: Paul Mackerras <paulus@samba.org>
2008-04-26 16:00:00 +10:00
Gerrit Pape
80dd7b4497 gitk: Fix changing colors through Edit->Preferences
With tcl/tk8.5 the lset command seems to behave differently.  When
changing the background color through Edit->Preferences, the changes
are applied, but new dialogs, such as View->New view... barf with

 Error: unknown color name "{#ffffff}"

Additionally when closing gitk, and starting it up again, a bad value
has been saved to ~/.gitk, preventing gitk from running properly; it
fails with

 Error in startup script: unknown color name "{#ffffff}"
 ...

This commit fixes the problem by changing the color dialogs to pass
the empty string {} as the list index to choosecolor.  This causes
the lset and lindex commands used by choosecolor to use and set the
whole variable (bgcolor, fgcolor or selectbgcolor) rather than
treating them as a 1-element list.  Tested with tcl/tk8.4 and 8.5.

Dmitry Potapov reported this problem through
 http://bugs.debian.org/472615

Signed-off-by: Gerrit Pape <pape@smarden.org>
Signed-off-by: Paul Mackerras <paulus@samba.org>
2008-04-06 13:07:27 +10:00
Paul Mackerras
92e22ca0a2 Merge branch 'master' into dev 2008-03-11 22:21:39 +11:00
Paul Mackerras
494d3b8a6c gitk: Avoid Tcl error when switching views
Michele Ballabio <barra_cuda@katamail.com> pointed out that gitk
sometimes throws a Tcl error (can't read "yscreen") when switching
views, and proposed a patch.  This is a different way of fixing it
which is a bit neater.  Basically, in showview we only set yscreen if
the selected commit is on screen to start with, and then we only
scroll the canvas to bring it onscreen if yscreen is set and the
same commit exists in the new view.

Signed-off-by: Paul Mackerras <paulus@samba.org>
2008-03-11 22:11:19 +11:00
David Aguilar
cb8329aa9a [PATCH] gitk: Don't show local changes when we there is no work tree
Launching gitk on a bare repository or a .git directory
would previously show the work tree as having removed all
files.  We now inhibit showing local changes when gitk
is not launched from within a work tree.

Signed-off-by: David Aguilar <davvid@gmail.com>
Signed-off-by: Paul Mackerras <paulus@samba.org>
2008-03-11 20:22:39 +11:00
Pekka Kaitaniemi
8809d691ec [PATCH] gitk: Add horizontal scrollbar to the diff view
Adding horizontal scroll bar makes the scrolling feature more
discoverable to the users.  The horizontal scrollbar is a bit narrower
than vertical ones so we don't make too big impact on available screen
real estate.  The text and scrollbar widget layout is done using grid
geometry manager.

An interesting side effect of Tk scrollbars is that the "elevator"
size changes depending on the visible content. So the horizontal
scrollbar "elevator" changes as the user scrolls the view up and down.

Signed-off-by: Pekka Kaitaniemi <kaitanie@cc.helsinki.fi>
Signed-off-by: Paul Mackerras <paulus@samba.org>
2008-03-10 17:42:26 +11:00
Jeff King
95293b58eb [PATCH] gitk: make autoselect optional
Whenever a commit is selected in the graph pane, its SHA1 is
automatically put into the selection buffer for cut and paste.
However, some users may find this behavior annoying since it can
overwrite something they actually wanted to keep in the buffer.

This makes the behavior optional under the name "Auto-select SHA1",
but continues to default to "on".

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Paul Mackerras <paulus@samba.org>
2008-03-10 17:42:23 +11:00
Michele Ballabio
a3a1f57959 [PATCH] gitk: Mark another string for translation
Signed-off-by: Michele Ballabio <barra_cuda@katamail.com>
Signed-off-by: Paul Mackerras <paulus@samba.org>
2008-03-10 17:40:51 +11:00
Yann Dirson
2d48085661 [PATCH] Add an --argscmd flag to get the list of refs to show
This allows gitk to be used to display a different set of refs each
the display is refreshed.  This is useful when gitk is called from
other porcelain suites, for doing such things as displaying the set of
patches in a patch stack.

The user specifies a command as the argument to the --argscmd option.
The command is run initially and each time the display is refreshed,
and is expected to generate a list of commit IDs, one per line.  Those
commits are appended to the commits passed on the command-line when
constructing the git log command to be executed.

The command is considered to be an attribute of a view, and has its
own field in the saved view, and an edit field in the view editor.

Signed-off-by: Yann Dirson <ydirson@altern.org>
Signed-off-by: Paul Mackerras <paulus@samba.org>
2008-03-10 17:39:46 +11:00
Paul Mackerras
b9bee11526 gitk: Only restore window size from ~/.gitk, not position
This also limits the window size to the screen size.  That is better
than nothing, but it isn't perfect, since ideally we would take into
account window decorations, and things such as gnome panels or the
Mac OS X dock and menu bar, but I don't know how to do that.

On Cygwin this is as good as restoring the whole geometry (size and
position) at working around the Cygwin Tk bugs, according to Mark
Levedahl.

Tested-by: Mark Levedahl <mlevedahl@gmail.com>
Signed-off-by: Paul Mackerras <paulus@samba.org>
2008-03-10 16:50:34 +11:00
Paul Mackerras
c30acc77fe gitk: Fix problem with target row not being in scroll region
Since we limit the rate at which we do updates to the canvas scrolling
regions, it's possible to get into selectline for a row that is
outside the currently-set scrolling region.  When this happens,
selectline can't scroll to show the selected line, and as a
consequence, drawvisible chooses some other bogus row to be the
target row.

This fixes it by calling setcanvscroll from selectline in this case.
We also set selectedline (and currentid) before calling drawvisible
so that drawvisible makes the right choice of target row.

Signed-off-by: Paul Mackerras <paulus@samba.org>
2008-03-07 22:51:55 +11:00
Paul Mackerras
d76afb15ad gitk: Avoid a crash in selectline if commitinfo($id) isn't set
Occasionally I see a crash in selectline with commitinfo($id) not
set.  This makes sure it is set by calling getcommit $id if it isn't.

Signed-off-by: Paul Mackerras <paulus@samba.org>
2008-03-07 21:19:18 +11:00
Paul Mackerras
c9cfdc9601 gitk: Fix some corner cases in computing vrowmod and displayorder
First, insertfakerow and removefakerow weren't updating vrowmod,
and hence displayorder was not getting updated when it needed to,
in the case where the fake row was being inserted into or removed
from the last arc.  The comparison of varctok vs vtokmod was moved
into modify_arc for these cases (and for the call in rewrite_commit)
to avoid duplicating the extra code needed.  Second, the logic in
update_arcrows didn't end up truncating displayorder and unsetting
cached_commitrow if the first modified row was in the last arc.
This fixes these problems.

Signed-off-by: Paul Mackerras <paulus@samba.org>
2008-03-04 21:32:38 +11:00
Paul Mackerras
f9e0b6fb60 gitk: Correct a few strings and comments to say "git log"
... instead of "git rev-list", since we now use git log for
generating the list of commits.

Signed-off-by: Paul Mackerras <paulus@samba.org>
2008-03-04 21:14:17 +11:00
Paul Mackerras
468bcaedbb gitk: Don't filter view arguments through git rev-parse
Previously we passed the arguments indicating what commits the user
wants to view through git rev-parse to get a list of IDs (positive and
negative), then gave that to git log.  This had a couple of problems,
notably that --merge and --left-right didn't get handled properly.

Instead we now just pass the original arguments to git log.  When doing
an update, we append --not followed by the list of commits we have seen
that have no children, since we have got (or will get) their ancestors
from the first git log.  If the first git log isn't finished yet, we
might get some duplicates from the second git log, but that doesn't
cause any problem.

Also get rid of the unused vnextroot variable.

Signed-off-by: Paul Mackerras <paulus@samba.org>
2008-03-03 10:19:35 +11:00
Paul Mackerras
ac1276ab6e gitk: Fix problems with target row stuff
Occasionally the target row stuff would scroll the display to some
uninteresting commit while reading.  There were two problems: one
was that drawvisible would set targetrow even if there was no target
previously and no row selected, and the other was that it was possible
for the target row to get pushed down past numcommits, if drawvisible
was called after rows were added but before layoutmore got run.

The first problem is fixed by just not setting targetrow/id unless
there is a selected row or they were set previously.

The second problem is fixed by updating numcommits immediately new
rows are added.  This leads to a simplification of layoutmore and
chewcommits but also means that some of the things that were done in
layoutmore now need to be done elsewhere, since layoutmore can no
longer use numcommits to know how much it has seen previously.
Hence the changes to getcommits, initlayout and setcanvscroll.

Signed-off-by: Paul Mackerras <paulus@samba.org>
2008-03-03 10:11:08 +11:00
Paul Mackerras
f806f0fba8 gitk: Handle updating with path limiting better
When updating the graph, gitk uses a git log command with commit
limiting in order to get just the new commits.  When path limiting
is also in effect, git log rewrites the parents of the commits it
outputs in order to represent just the subgraph that modifies the
listed paths, but it doesn't rewrite the parents on the boundary
of the graph.  The result is that when updating, git log does not
give gitk the information about where the new commits join in to
the existing graph.

This solves the problem by explicitly rewriting boundary parents
when updating.  If we are updating and are doing path limiting,
then when gitk finds an unlisted commit (one where git log puts a
"-" in front of the commit ID to indicate that it isn't actually
part of the graph), then gitk will execute:

    git rev-list --first-parent --max-count=1 $id -- paths...

which returns the first ancestor that affects the listed paths.
(Currently gitk executes this synchronously; it could do it
asynchronously, which would be more complex but would avoid the
possibility of the UI freezing up if git rev-list takes a long time.)

Then, if the result is a commit that we know about, we rewrite the
parents of the children of the original commit to point to the new
commit.  That is mostly a matter of adjusting the parents and children
arrays and calling fix_reversal to fix up the graph.

Signed-off-by: Paul Mackerras <paulus@samba.org>
2008-02-24 12:16:56 +11:00
Paul Mackerras
841ea82449 gitk: Fix bug where arcs could get lost
Because we weren't fixing up vlastins when moving an arc from one
place to another, it was possible for us later to decide to move
an arc to the wrong place, and end up with an arc disconnected from
the rest of the graph.  This fixes it by updating vlastins when
necessary.

Signed-off-by: Paul Mackerras <paulus@samba.org>
2008-02-18 10:44:33 +11:00
Paul Mackerras
585fb5985d Merge branch 'master' into dev 2008-02-16 22:24:52 +11:00
Paul Mackerras
f1bf4ee6d7 gitk: Cope better with getting commits that we have already seen
This fixes a bug in updating the graph after we have cherry-picked
a commit in gitk and then added some new stuff externally.  First,
we weren't updating viewincl with the new head added by the cherry-
pick.  Secondly, getcommitlines was doing bad things if it saw a
commit that was already in the graph (was already in an arc).  This
fixes both things.  If getcommitlines sees a commit that is already
in the graph, it ignores it unless it was not listed before and is
listed now.  In that case it doesn't assign it a new arc now, and
doesn't re-add the commit to its arc.

Signed-off-by: Paul Mackerras <paulus@samba.org>
2008-02-16 22:22:22 +11:00
Johannes Sixt
6675ea4240 [PATCH] gitk: Heed the lines of context in merge commits
There is an edit box where the number of context lines can be chosen.
But it was only used when regular diffs were displayed, not for
merge commits.   This fixes it.

Signed-off-by: Johannes Sixt <johannes.sixt@telecom.at>
Signed-off-by: Paul Mackerras <paulus@samba.org>
2008-02-14 10:49:44 +11:00
Linus Torvalds
1407ade93c [PATCH] gitk: learn --show-all output
It's really not very easy to visualize the commit walker,
because - on purpose - it obvously doesn't show the
uninteresting commits!

We will soon add a "--show-all" flag to the revision walker,
which will make it show uninteresting commits too, and they'll
have a '^' in front of them.

This is to update 'gitk' to show those negative commits in gray
to futureproof it.

Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Signed-off-by: Paul Mackerras <paulus@samba.org>
2008-02-13 23:08:38 +11:00
Paul Mackerras
b8a938cf78 gitk: Fix cherry-picking to insert a real row not a fake row
The insertrow/removerow functions were really only suitable for
inserting/removing a fake row such as the ones used for showing
the local changes.  When used to insert a real new row from a
cherry-pick, they left things in an inconsistent state which then
caused various strange layout errors.

This renames insertrow/removerow to insertfakerow/removefakerow
and adds a new insertrow that does actually go to all the trouble
of creating a new arc and setting it up.  This is more work but
keeps things consistent.

This also fixes a bug where cherrypick was not setting mainheadid,
and one where selectline wasn't always resulting in targetrow/id
being set to the selected row/id.  Also insert/removefakerow now
adjust numcommits and call setcanvscroll.

Signed-off-by: Paul Mackerras <paulus@samba.org>
2008-02-13 22:12:31 +11:00
Gerrit Pape
48750d6a84 [PATCH] gitk: properly deal with tag names containing / (slash)
When creating a tag through gitk, and the tag name includes a slash (or
slashes), gitk errors out in a popup window.  This patch makes gitk use
'git tag' to create the tag instead of modifying files in refs/tags/,
which fixes the issue; if 'git tag' throws an error, gitk pops up with
the error message.

The problem was reported by Frédéric Brière through
 http://bugs.debian.org/464104

Signed-off-by: Gerrit Pape <pape@smarden.org>
Signed-off-by: Paul Mackerras <paulus@samba.org>
2008-02-12 10:05:59 +11:00
Steffen Prohaska
b9b86007e2 [PATCH] gitk: Add checkbutton to ignore space changes
Ignoring space changes can be helpful.  For example, a commit
claims to only reformat source code and you quickly want to
verify if this claim is true.  Or a commit accidentally changes
code formatting and you want to focus on the real changes.

In such cases a button to toggle of whitespace changes would be
quite handy.  You could quickly toggle between seeing and
ignoring whitespace changes.

This commit adds such a checkbutton right above the diff view.

However, in general it is a good thing to see whitespace changes
and therefore the state of the checkbutton is not saved. For
example, space changes might happen unintentionally.  But they are
real changes yielding different sha1s for the blobs involved.

Signed-off-by: Steffen Prohaska <prohaska@zib.de>
Signed-off-by: Paul Mackerras <paulus@samba.org>
2008-02-12 10:05:58 +11:00
Michele Ballabio
3d2c998e30 [PATCH] gitk: Fix "Key bindings" message
The "Key bindings" message under the "Help" menu was too long
and could not be parsed by the translation engine.

Fix both issues by translating one line at a time.

Signed-off-by: Michele Ballabio <barra_cuda@katamail.com>
Signed-off-by: Paul Mackerras <paulus@samba.org>
2008-02-12 10:05:57 +11:00
Paul Mackerras
5a7f577dce gitk: Fix bug causing Tcl error when no commits are selected
Some of the stuff that commit 31c0eaa8cc
added to drawvisible isn't appropriate to do when we have no commits,
and this was causing a Tcl error if gitk was invoked in such a fashion
that no commits were selected.  This fixes it by bailing out of
drawvisible early if there are no commits displayed.

Bug reported by Johannes Sixt.

Signed-off-by: Paul Mackerras <paulus@samba.org>
2008-01-15 22:45:43 +11:00
Paul Mackerras
e7297a1c5f gitk: Fix bug where editing an existing view would cause an infinite loop
This fixes a bug where changing the commit range or file list for an
existing view and then clicking OK would cause gitk to go into an
infinite loop.  The problem was that newviewok was invoking reloadcommits
via "run reloadcommits", but reloadcommits wasn't explicitly returning
0, and whatever it was returning was causing dorunq to run it over
and over again.  This fixes it by making reloadcommits return 0.

Signed-off-by: Paul Mackerras <paulus@samba.org>
2008-01-15 22:30:40 +11:00
Paul Mackerras
46308ea1da gitk: Select something appropriate on cherry-pick, branch reset and checkout
This makes gitk select the new commit when cherry-picking, and select
the new checked-out head when resetting or checking out a branch.
This feels more natural because the user is usually more interested
in that commit now than whatever was selected before.

Signed-off-by: Paul Mackerras <paulus@samba.org>
2008-01-15 22:16:32 +11:00
Johannes Schindelin
646f3a149d [PATCH] gitk: make Ctrl "+" really increase the font size
Only Ctrl "=" was bound to increase the font size, probably because
English keyboards have the plus on the same key as the equal sign.
However, not the whole world is English, and at least with some
other keyboard layouts, Ctrl "+" did not work as documented.

Noticed by Stephan Hennig.

Signed-off-by: Johannes Schindelin <Johannes.Schindelin@gmx.de>
Signed-off-by: Paul Mackerras <paulus@samba.org>
2008-01-14 08:55:04 +11:00
Paul Mackerras
3e76608d39 gitk: Select head of current branch by default
Instead of selecting the first commit that appears, this makes gitk
select the currently checked out head, if the user hasn't explicitly
selected some other commit by the time it appears.  If the head hasn't
appeared by the time the graph is complete, then we select the first
real commit.

This applies both for graph updates and when the graph is being read
in initially.

Signed-off-by: Paul Mackerras <paulus@samba.org>
2008-01-13 17:26:30 +11:00
Paul Mackerras
17529cf9bc gitk: Fix a bug in make_disporder
The make_disporder function has an optimization where it assumed that
if displayorder was already long enough and the first entry in it for
a particular arc was non-null, then the whole arc was present.  This
turns out not to be true in some circumstances, since we can add a
commit to an arc (which truncates displayorder to the previous end of
that arc), then call make_disporder for later arcs (which will pad
displayorder with null elements), then call make_disporder for the
first arc - which won't update the null elements.

This fixes it by changing the optimization to check the last element
for the arc instead of the first.

Signed-off-by: Paul Mackerras <paulus@samba.org>
2008-01-12 21:46:31 +11:00
Christian Stimming
55e34436e1 gitk: Fix typo in user message.
Signed-off-by: Christian Stimming <stimming@tuhh.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2008-01-11 00:51:13 -08:00
Paul Mackerras
5be25a8f85 gitk: Fix handling of flag arguments
Despite the name, the --revs-only flag to git rev-parse doesn't make
it output only revision IDs.  It makes it output only arguments that
are suitable for giving to git rev-list.  So make start_rev_list and
updatecommits cope with arguments output by git rev-parse that aren't
revision IDs.  This way we won't get an error when an argument such as
"-300" has been given to gitk and the view is updated.

Signed-off-by: Paul Mackerras <paulus@samba.org>
2008-01-10 21:44:39 +11:00
Paul Mackerras
6636b88ea1 Merge branch 'master' into dev 2008-01-09 14:23:30 +11:00
Gerrit Pape
f0c8426819 [PATCH] gitk: use user-configured background in view definition dialog
Have the text fields in the view definition dialog (View->New view...)
use the background color as configured through the preferences, instead
of hard-coded 'white'.

This was suggested by Paul Wise through http://bugs.debian.org/457124

Signed-off-by: Gerrit Pape <pape@smarden.org>
Signed-off-by: Paul Mackerras <paulus@samba.org>
2008-01-09 14:19:47 +11:00
Paul Mackerras
476ca63dbc gitk: Index [fnvr]highlights by id rather than row
This means that we don't have to keep clearing them out whenever we
change the row numbers for some commits.

Signed-off-by: Paul Mackerras <paulus@samba.org>
2008-01-07 22:16:31 +11:00
Paul Mackerras
7e92e257af Merge branch 'master' into dev 2008-01-06 22:19:03 +11:00
Paul Mackerras
b039f0a62d gitk: Restore some widget options whose defaults changed in Tk 8.5
The default options for panedwindows in Tk 8.5 make the sash
virtually invisible -- the handle is not shown and the relief is
flat.  This puts the defaults back to showing the handle and a
raised relief on the sash, as in Tk 8.4.

This uses the option command to do this, and also uses the option
command to set the default font for various UI elements to the
UI font ("uifont").

Signed-off-by: Paul Mackerras <paulus@samba.org>
2008-01-06 15:55:39 +11:00
Paul Mackerras
c8c9f3d9cc gitk: Fix potential bug with fake commit IDs in renumbervarc
When a fake row is added, we add its (fake) ID to the children list
for its (fake) parent.  If renumbervarc were to then renumber the
parent it would incorrectly use the fake child.  This avoids the
problem by adding a last_real_child procedure which won't return
a fake ID, and using it in renumbervarc.  For symmetry this also adds
a first_real_child procedure and uses it in ordertoken.

Signed-off-by: Paul Mackerras <paulus@samba.org>
2008-01-06 13:54:58 +11:00
Paul Mackerras
cd2bcae798 gitk: Fix a couple of bugs in the find function
First, findmore would sometimes get a Tcl error due to relying on
varcorder and vrownum having valid values for the rows being searched,
but they may not be valid unless update_arcrows is called, so this
makes findmore call update_arcrows if necessary.

Secondly, in the "touching paths" and "adding/removing string" modes,
findmore was treating fhighlights($row) == -1 as meaning the row
matches, whereas it only means that we haven't received an answer from
the external git diff-tree process about it yet.  This fixes it.

Signed-off-by: Paul Mackerras <paulus@samba.org>
2008-01-02 21:44:06 +11:00
Paul Mackerras
42a671fc00 gitk: Fix some corner cases in the targetid/targetrow stuff
* Make sure targetrow is never >= numcommits
* Don't try to do anything about the target row if the targetid is
  no longer in the view; it'll just cause Tcl errors
* In insertrow, increment targetrow if we are inserting the fake
  commit at or before the target row
* In removerow, if we are removing the target row, make it the next
  one instead.

Signed-off-by: Paul Mackerras <paulus@samba.org>
2008-01-02 09:59:39 +11:00
Paul Mackerras
31c0eaa8cc gitk: Keep the same commits visible as other commits come in
Since commits come in out of order and get sorted as we see them,
we can have commits coming in and being placed before the commits
that are visible in the graph display pane.  Previously we just
displayed a certain range of row numbers, meaning that when
incoming commits were placed before the displayed range, the
displayed commits were displaced downwards.  This makes it so
that we keep the same set of commits displayed, unless the user
explicitly scrolls the pane, in which case it scrolls as expected.

We do this by having a "target" commit which we try to keep in the
same visible position.  If commits have come in before it we scroll
the canvases by the number of rows that it has moved in the display
order.

This also fixes a bug in rowofcommit where it would test
cached_commitrow before possibly calling update_arcrows, which is
where cached_commitrow gets invalidated if things have changed.
Now we call update_arcrows if necessary first.

Signed-off-by: Paul Mackerras <paulus@samba.org>
2007-12-30 22:41:14 +11:00
Paul Mackerras
eb5f8c9c00 gitk: Don't try to show local changes from a head that isn't shown
When updating the display, if the checked-out head has moved on and
isn't currently shown, and there are local changes, we could try to
insert a fake row with a parent that isn't displayed, leading to a
Tcl error.  This is because we check whether the checked-out head
is displayed before rereading the references (which is when we discover
that the head has moved).  This fixes it.

Signed-off-by: Paul Mackerras <paulus@samba.org>
2007-12-29 21:13:34 +11:00
Paul Mackerras
fc2a256f4a gitk: Fix another collection of bugs
* Fixed a bug that occasionally resulted in Tcl "can't use empty string
  as argument to incr" errors - rowofcommit was sometimes not calling
  update_arcrows when it needed to.

* Fixed a "no such element in array" error when removing a fake row,
  by unsetting currentid and selectedline in removerow if the row we
  are removing is the currently selected row.

* Made the "update commits" function always do "reread references".

* Made dodiffindex et al. remove the fake row(s) if necessary.

* Fixed a bug where clicking on a row in the graph display pane didn't
  account for horizontal scrolling of the pane.

* Started changing things that cached information based on row numbers
  to use commit IDs instead -- this converts the "select line" items
  that are put into the history list to use "select by ID" instead.

* Simplified redrawtags a bit, and fixed a bug where it would use the
  mainfont for working out how far it extends to the right in the graph
  display pane rather than the actual font (which might be bold).

* Fixed a bug where "reread references" wouldn't notice if the currently
  checked-out head had changed.

Signed-off-by: Paul Mackerras <paulus@samba.org>
2007-12-26 23:03:43 +11:00
Paul Mackerras
00abadb9dd Merge branch 'master' into dev 2007-12-20 10:25:50 +11:00
Christian Stimming
eadcac9218 [PATCH] gitk i18n: Recode gitk from latin1 to utf8 so that the (c) copyright character is valid utf8.
When using translations, the target language must be encoded in utf-8
because almost all target languages will contain non-ascii characters.
For that reason, the non-translated strings should be in utf-8 as well
so that there isn't any encoding mixup inside the program.

Signed-off-by: Paul Mackerras <paulus@samba.org>
2007-12-20 10:19:07 +11:00
Christian Stimming
b007ee20dc [PATCH] gitk i18n: More markup -- various options menus
Signed-off-by: Christian Stimming <stimming@tuhh.de>
Signed-off-by: Paul Mackerras <paulus@samba.org>
2007-12-20 10:19:07 +11:00
Christian Stimming
d990cedf9c [PATCH] gitk i18n: Markup several strings for translation
This just marks up plain strings, that aren't used in any unusual way.

Signed-off-by: Christian Stimming <stimming@tuhh.de>
Signed-off-by: Paul Mackerras <paulus@samba.org>
2007-12-20 10:19:07 +11:00
Christian Stimming
663c3aa9c8 [PATCH] gitk i18n: Import msgcat for message string translation; load translation catalogs
By setting the environment variable GITK_MSGSDIR, one can manually set
the directory where the .msg files are located.  This is quite handy
during development with GITK_MSGSDIR=po.

Signed-off-by: Christian Stimming <stimming@tuhh.de>
Signed-off-by: Paul Mackerras <paulus@samba.org>
2007-12-20 10:19:07 +11:00
Paul Mackerras
f3ea5ede23 gitk: Implement date mode in the new framework
This restores date mode, which lists commits by date, as far as possible
given the constraint that parents come after all their children.  To
implement this in the new framework, we (1) only join a new commit onto
an existing arc if the arc is the last arc created, (2) treat arcs as
seeds unless they have a child arc that comes later, and (3) never
decrease the token value for an arc.

This means we get lots of "seeds", which exposed some quadratic behaviour
in adding and removing seeds.  To fix this, we add a vbackptr array, which
points to the arc whose vleftptr entry points to us, and a vlastins array,
which shows where in an arc's vdownptr/vleftptr list we last inserted a
parent, which acts as a hint of a good place to start looking for where to
insert a new child.

This also ensures the children array elements stay in sorted order at all
times.  We weren't resorting the children lists when reassigning tokens
in renumbervarc.  Since the children lists are now always sorted, we don't
have to search through all elements to find the one with the highest token;
we can just use the last element.

Signed-off-by: Paul Mackerras <paulus@samba.org>
2007-12-20 10:03:35 +11:00
Paul Mackerras
24f7a667e6 gitk: More bug fixes and cleanups
* Add/remove fake commits (for local changes) when updating the view
  even if nothing else has changed.
* Get rid of unused getdbg variable.
* Get rid of vseeds and uat.
* Fix bug where removerow would throw a "no such element in array" error.
* Clear out cached highlights when line numbers change.
* Make dodiffindex remove the fake commit rows if they currently exist
  but there are now no local changes.

Signed-off-by: Paul Mackerras <paulus@samba.org>
2007-12-19 09:35:33 +11:00
Paul Mackerras
e5b37ac1ec gitk: Fix more bugs resulting in Tcl "no such element in array" errors
First, update_arcrows was being overly aggressive in trimming
displayorder, resulting in calls to rowofcommit sometimes trimming off
commits that layoutrows had asked for in make_disporder and was relying
on having present.  This adds a vrowmod($view) variable that lets
update_arcrows be more precise in trimming off the invalid bits of
displayorder (and it also simplifies the check in make_disporder).
This modifies modify_arc and its callers so that vrowmod($view) is
updated appropriately.

Secondly, we were sometimes calling idcol with $i==-1, which resulted
in a call to ordertoken with the null string.  This fixes it by
forcing $i to 0 if it is less than zero.

This also fixes a possible infinite recursion with rowofcommit and
update_arcrows calling each other ad infinitum.

Signed-off-by: Paul Mackerras <paulus@samba.org>
2007-12-12 18:13:51 +11:00
Paul Mackerras
0c27886e46 gitk: Fix a couple of bugs
First, if we invalidate the layout for all rows (i.e. from row 0 on),
we were calling undolayout with an empty string as the argument.
Second, the comparison in make_disporder that tests if we need to
call update_arcrows was the wrong way around.

Signed-off-by: Paul Mackerras <paulus@samba.org>
2007-12-11 20:09:53 +11:00
Paul Mackerras
9257d8f761 gitk: Compute row numbers and order tokens lazily
Instead of computing ordertok values and arc row numbers in
getcommitlines, this defers computing them until they are needed.
So getcommitlines no longer calls update_arcrows; instead it gets
called from rowofcommit and make_disporder.  Things that modify arcs
now call modify_arc instead of setting vtokmod/varcmod directly,
and modify_arc does the undolayout that used to be in update_arcrows.

Also, idcol and make_idlist now use a new ordertoken function instead
of the ordertok variable.  ordertoken uses ordertok as a cache, but
can itself compute the ordering tokens from scratch.  This means that
the ordering tokens (and hence the layout of the graph) is once again
determined by the topological ordering we put on the graph, not on the
order in which we see the commits from git log, which improves the
appearance of the graph.

Signed-off-by: Paul Mackerras <paulus@samba.org>
2007-12-11 10:45:38 +11:00
Paul Mackerras
f78e7ab736 gitk: Fix bug in parsing multiple revision arguments
If the user specified multiple revisions arguments on the command
line or for a view, we were passing the whole list of arguments to
git rev-parse as a single argument, and thus git rev-parse didn't
interpret it as revisions.  This fixes it by adding an eval so the
arguments get passed to git rev-parse as separate arguments.

Signed-off-by: Paul Mackerras <paulus@samba.org>
2007-12-07 20:50:09 +11:00
Paul Mackerras
38dfe93916 gitk: Fix bug in assigning row numbers to arcs
We weren't setting vtokmod and varcmod in renumbervarc, so after a
call to renumbervarc we sometimes weren't reassigning row numbers to
all the arcs whose row numbers had changed.  This fixes it.

This also collapses layoutmore and showstuff into one procedure and
gets rid of the phase variable.

Signed-off-by: Paul Mackerras <paulus@samba.org>
2007-12-06 20:50:31 +11:00
Paul Mackerras
7fcc92bff4 gitk: Use git log without --topo-order and reorganize the commits ourselves
This very large patch implements code to organize the commits from
git log into "arcs" (sequences of commits where each pair of adjacent
commits are the only parent and child of each other), and orders the
arcs so as to get a topological ordering of the commits.  This means
we can use git log without --topo-order and display the commits as we
get them, incrementally, which makes the cold-cache start up time much
faster, particularly on unpacked repos.

One beneficial effect of this is that the File->Update menu item now
just adds any new commits to the existing graph instead of rereading
the whole thing from scratch, which is much faster.  (If you do want
to reread the whole graph from scratch you can use File->Reload.)

At an implementation level, this means that the displayorder and
parentlist lists are no longer fully valid at all times, and the
commitrow array has gone.  New procedures commitinview and commitonrow
replace the commitrow array, and make_disporder ensures that
displayorder and parentlist are valid for a range of rows.

The overall time to load the kernel repository has gone up a bit, from
~9 seconds to ~11 seconds on my G5, but I think that is worth it given
that the time to get a window up with commits displayed in it has gone
from ~3 seconds to under 1 second.

Signed-off-by: Paul Mackerras <paulus@samba.org>
2007-12-03 10:33:01 +11:00
Paul Mackerras
7388bcbc54 gitk: Use the UI font for the diff/old version/new version radio buttons
This makes the radio buttons for selecting whether to see the full diff,
the old version or the new version use the same font as the other user
interface elements.

Signed-off-by: Paul Mackerras <paulus@samba.org>
2007-10-27 21:31:07 +10:00
Paul Mackerras
7b3b151528 Merge branch 'dev' 2007-10-27 21:23:20 +10:00
Paul Mackerras
cca5d946d6 gitk: Simplify the code for finding commits
This unifies findmore and findmorerev, and adds the ability to do
a search with or without wrap around from the end of the list of
commits to the beginning (or vice versa for reverse searches).
findnext and findprev are gone, and the buttons and keys for searching
all call dofind now.  dofind doesn't unmark the matches to start with.
Shift-up and shift-down are back by popular request, and the searches
they do don't wrap around.  The other keys that do searches (/, ?,
return, M-f) do wrapping searches except for M-g.

Signed-off-by: Paul Mackerras <paulus@samba.org>
2007-10-27 21:16:56 +10:00
Paul Mackerras
74a40c7110 gitk: Fix a couple more bugs in the path limiting
First, paths ending in a slash were not matching anything.  This fixes
path_filter to handle paths ending in a slash (such entries have to
match a directory, and can't match a file, e.g., foo/bar/ can't match
a plain file called foo/bar).

Secondly, clicking in the file list pane (bottom right) was broken
because $treediffs($ids) contained all the files modified by the
commit, not just those within the file list.  This fixes that too.

Signed-off-by: Paul Mackerras <paulus@samba.org>
2007-10-24 10:16:56 +10:00
Paul Mackerras
3de07118f0 Merge branch 'master' into dev 2007-10-23 22:40:50 +10:00
Paul Mackerras
bd8f677e1c gitk: Fix some bugs with path limiting in the diff display
First, we weren't putting "--" between the ids and the paths in the
git diff-tree/diff-index/diff-files command, so if there was a tag
and a file with the same name, we could get an ambiguity in the
command.  This puts the "--" in to make it clear that the paths are
paths.

Secondly, this implements the path limiting for merge diffs as well
as the normal 2-way diffs.

Signed-off-by: Paul Mackerras <paulus@samba.org>
2007-10-23 22:37:23 +10:00
Paul Mackerras
4570b7e9d7 gitk: Use the status window for other functions
This sets the status window when reading commits, searching through
commits, cherry-picking or checking out a head.

Signed-off-by: Paul Mackerras <paulus@samba.org>
2007-10-23 21:19:06 +10:00
Paul Mackerras
a137a90f49 gitk: Integrate the reset progress bar in the main frame
This makes the reset function use a progress bar in the same location
as the progress bars for reading in commits and for finding commits,
instead of a progress bar in a separate detached window.  The progress
bar for resetting is red.

This also puts "Resetting" in the status window while the reset is in
progress.  The setting of the status window is done through an
extension of the interface used for setting the watch cursor.

Signed-off-by: Paul Mackerras <paulus@samba.org>
2007-10-23 21:12:49 +10:00