Commit Graph

386 Commits

Author SHA1 Message Date
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