1. 16 7月, 2007 1 次提交
  2. 12 7月, 2007 3 次提交
    • S
      git-gui: Change prior tree SHA-1 verification to use git_read · b215883d
      Shawn O. Pearce 提交于
      This cat-file was done on maint, where we did not have git_read
      available to us.  But here on master we do, so we should make
      use of it.
      Signed-off-by: NShawn O. Pearce <spearce@spearce.org>
      b215883d
    • S
      Merge branch 'maint' · f31b6ff7
      Shawn O. Pearce 提交于
      * maint:
        git-gui: Work around bad interaction between Tcl and cmd.exe on ^{tree}
      f31b6ff7
    • S
      git-gui: Work around bad interaction between Tcl and cmd.exe on ^{tree} · 20f1a10b
      Shawn O. Pearce 提交于
      From Johannes Sixt <J.Sixt@eudaptics.com>:
      > It seems that MSYS's wish does some quoting for Bourne shells,
      > in particular, escape the first '{' of the "^{tree}" suffix, but
      > then it uses cmd.exe to run "git rev-parse". However, cmd.exe does
      > not remove the backslash, so that the resulting rev expression
      > ends up in git's guts as unrecognizable garbage: rev-parse fails,
      > and git-gui hickups in a way that it must be restarted.
      
      Johannes originally submitted a patch to this section of commit.tcl
      to use `git rev-parse $PARENT:`, but not all versions of Git will
      accept that format.  So I'm just taking the really simple approach
      here of scanning the first line of the commit to grab its tree.
      About the same cost, but works everywhere.
      Signed-off-by: NShawn O. Pearce <spearce@spearce.org>
      20f1a10b
  3. 10 7月, 2007 6 次提交
  4. 09 7月, 2007 30 次提交
    • S
      git-gui: Improve the Windows and Mac OS X shortcut creators · 7eafa2f1
      Shawn O. Pearce 提交于
      We now embed any GIT_* and SSH_* environment variables as well as
      the path to the git wrapper executable into the Mac OS X .app file.
      This should allow us to restore the environment properly when
      we restart.
      
      We also try to use proper Bourne shell single quoting when we can,
      as this avoids any sort of problems that might occur due to a path
      containing shell metacharacters.
      Signed-off-by: NShawn O. Pearce <spearce@spearce.org>
      7eafa2f1
    • S
      git-gui: Teach console widget to use git_read · 74c4763c
      Shawn O. Pearce 提交于
      Now that we are pretty strict about setting up own absolute paths to
      any git helper (saving a marginal runtime cost to resolve the tool)
      we can do the same in our console widget by making sure all console
      execs go through git_read if they are a git subcommand, and if not
      make sure they at least try to use the Tcl 2>@1 IO redirection if
      possible, as it should be faster than |& cat.
      Signed-off-by: NShawn O. Pearce <spearce@spearce.org>
      74c4763c
    • S
      git-gui: Perform our own magic shbang detection on Windows · c136f2b8
      Shawn O. Pearce 提交于
      If we cannot locate a .exe for a git tool that we want to run than
      it may just be a Bourne shell script as these are popular in Git.
      In such a case the first line of the file will say "#!/bin/sh" so
      a UNIX kernel knows what program to start to parse and run that.
      But Windows doesn't support shbang lines, and neither does the Tcl
      that comes with Cygwin.
      
      We can pass control off to the git wrapper as that is a real Cygwin
      program and can therefore start the Bourne shell script, but that is
      at least two fork+exec calls to get the program running.  One to do
      the fork+exec of the git wrapper and another to start the Bourne shell
      script.  If the program is run multiple times it is rather expensive
      as the magic shbang detection won't be cached across executions.
      
      On MinGW/MSYS we don't have the luxury of such magic detection.  The
      MSYS team has taught some of this magic to the git wrapper, but again
      its slower than it needs to be as the git wrapper must still go and
      run the Bourne shell after it is called.
      
      We now attempt to guess the shbang line on Windows by reading the
      first line of the file and building our own command line path from
      it.  Currently we support Bourne shell (sh), Perl and Python.  That
      is the entire set of shbang lines that appear in git.git today.
      Signed-off-by: NShawn O. Pearce <spearce@spearce.org>
      c136f2b8
    • S
      git-gui: Treat `git version` as `git --version` · 70a7595c
      Shawn O. Pearce 提交于
      We know that the version subcommand of git is special.  It does not
      currently have an executable link installed into $gitexecdir and we
      therefore would never match it with one of our file exists tests.
      So we forward any invocations to it directly to the git wrapper, as
      it is a builtin within that executable.
      Signed-off-by: NShawn O. Pearce <spearce@spearce.org>
      70a7595c
    • S
      git-gui: Assume unfound commands are known by git wrapper · c6729890
      Shawn O. Pearce 提交于
      If we cannot locate a command in $gitexecdir on our own then it may
      just be because we are supposed to run it by `git $name` rather than
      by `git-$name`.  Many commands are now builtins, more are likely to
      go in that direction, and we may see the hardlinks in $gitexecdir go
      away in future versions of git.
      Signed-off-by: NShawn O. Pearce <spearce@spearce.org>
      c6729890
    • S
      git-gui: Correct gitk installation location · 02efd48f
      Shawn O. Pearce 提交于
      The master Makefile in git.git installs gitk into bindir, not
      gitexecdir, which means gitk is located as a sibling of the git
      wrapper and not as though it were a git helper tool.
      
      We can also avoid some Tcl concat operations by letting eval do
      all of the heavy lifting; we have two proper Tcl lists ($cmd and
      $revs) that we are joining together and $revs is currently never
      an empty list.
      Signed-off-by: NShawn O. Pearce <spearce@spearce.org>
      02efd48f
    • S
      git-gui: Always use absolute path to all git executables · 0b812616
      Shawn O. Pearce 提交于
      Rather than making the C library search for git every time we want
      to execute it we now search for the main git wrapper at startup, do
      symlink resolution, and then always use the absolute path that we
      found to execute the binary later on.  This should save us some
      cycles, especially on stat challenged systems like Cygwin/Win32.
      
      While I was working on this change I also converted all of our
      existing pipes ([open "| git ..."]) to use two new pipe wrapper
      functions.  These functions take additional options like --nice
      and --stderr which instructs Tcl to take special action, like
      running the underlying git program through `nice` (if available)
      or redirect stderr to stdout for capture in Tcl.
      Signed-off-by: NShawn O. Pearce <spearce@spearce.org>
      0b812616
    • S
      git-gui: Show a progress meter for checking out files · b7922306
      Shawn O. Pearce 提交于
      Sometimes switching between branches can take more than a second or
      two, in which case `git checkout` would normally have shown a small
      progress meter to the user on the terminal to let them know that we
      are in fact working, and give them a reasonable idea of when we may
      finish.
      
      We now do obtain that progress meter from read-tree -v and include
      it in our main window's status bar.  This allows users to see how
      many files we have checked out, how many remain, and what percentage
      of the operation is completed.  It should help to keep users from
      getting bored during a large checkout operation.
      Signed-off-by: NShawn O. Pearce <spearce@spearce.org>
      b7922306
    • S
      git-gui: Change the main window progress bar to use status_bar · 51530d17
      Shawn O. Pearce 提交于
      Now that we have a fancy status bar mega-widget we can reuse that
      within our main window.  This opens the door for implementating
      future improvements like a progress bar.
      Signed-off-by: NShawn O. Pearce <spearce@spearce.org>
      51530d17
    • S
      git-gui: Extract blame viewer status bar into mega-widget · b29bd5ca
      Shawn O. Pearce 提交于
      Our blame viewer has had a very fancy progress bar at the bottom of
      the window that shows the current status of the blame engine, which
      includes the number of lines completed as both a text and a graphical
      meter.  I want to reuse this meter system in other places, such as
      during a branch switch where read-tree -v can give us a progress
      meter for any long-running operation.
      
      This change extracts the code and refactors it as a widget that we
      can take advantage of in locations other than in the blame viewer.
      Signed-off-by: NShawn O. Pearce <spearce@spearce.org>
      b29bd5ca
    • S
      git-gui: Allow double-click in checkout dialog to start checkout · 827c7119
      Shawn O. Pearce 提交于
      If the user double clicks a branch in the checkout dialog then they
      probably want to start the checkout process on that branch.  I found
      myself doing this without realizing it, and of course it did nothing
      as there was no action bound to the listbox's Double-Button-1 event
      handler.  Since I did it without thinking, others will probably also
      try, and expect the same behavior.
      Signed-off-by: NShawn O. Pearce <spearce@spearce.org>
      827c7119
    • S
      git-gui: Default selection to first matching ref · 84d3d7b8
      Shawn O. Pearce 提交于
      If we have specifications listed in our revision picker mega-widget
      then we should default the selection within that widget to the first
      ref available.  This way the user does not need to use the spacebar
      to activate the selection of a ref within the box; instead they can
      navigate up/down with the arrow keys and be done with it.
      Signed-off-by: NShawn O. Pearce <spearce@spearce.org>
      84d3d7b8
    • S
      git-gui: Unabbreviate commit SHA-1s prior to display · 02087abc
      Shawn O. Pearce 提交于
      If the end-user feeds us an abbreviated SHA-1 on the command line for
      `git gui browser` or `git gui blame` we now unabbreviate the value
      through `git rev-parse` so that the title section of the blame or
      browser window shows the user the complete SHA-1 as Git determined
      it to be.
      
      If the abbreviated value was ambiguous we now complain with the
      standard error message(s) as reported by git-rev-parse --verify,
      so that the user can understand what might be wrong and correct
      their command line.
      Signed-off-by: NShawn O. Pearce <spearce@spearce.org>
      02087abc
    • S
      git-gui: Refactor branch switch to support detached head · d41b43eb
      Shawn O. Pearce 提交于
      This is a major rewrite of the way we perform switching between
      branches and the subsequent update of the working directory.  Like
      core Git we now use a single code path to perform all changes: our
      new checkout_op class.  We also use it for branch creation/update
      as it integrates the tracking branch fetch process along with a
      very basic merge (fast-forward and reset only currently).
      
      Because some users have literally hundreds of local branches we
      use the standard revision picker (with its branch filtering tool)
      to select the local branch, rather than keeping all of the local
      branches in the Branch menu.  The branch menu listing out all of
      the available branches is simply not sane for those types of huge
      repositories.
      
      Users can now checkout a detached head by ticking off the option
      in the checkout dialog.  This option is off by default for the
      obvious reason, but it can be easily enabled for any local branch
      by simply checking it.  We also detach the head if any non local
      branch was selected, or if a revision expression was entered.
      Signed-off-by: NShawn O. Pearce <spearce@spearce.org>
      d41b43eb
    • S
      git-gui: Refactor our ui_status_value update technique · 699d5601
      Shawn O. Pearce 提交于
      I'm really starting to dislike global variables.  The ui_status_value
      global varible is just one of those that seems to appear in a lot of
      code and in many cases we didn't even declare it "global" within the
      proc that updates it so we haven't always been getting all of the
      updates we expected to see.
      
      This change introduces two new global procs:
      
        ui_status $msg;   # Sets the status bar to show $msg.
        ui_ready;         # Changes the status bar to show "Ready."
      
      The second (special) form is used because we often update the area
      with this message once we are done processing a block of work and
      want the user to know we have completed it.
      
      I'm not fixing the cases that appear in lib/branch.tcl right now
      as I'm actually in the middle of a huge refactoring of that code
      to support making a detached HEAD checkout.
      Signed-off-by: NShawn O. Pearce <spearce@spearce.org>
      699d5601
    • S
      git-gui: Better handling of detached HEAD · 311e02a4
      Shawn O. Pearce 提交于
      If the current branch is not a symbolic-ref that points to a
      name in the refs/heads/ namespace we now just assume that the
      head is a detached head.  In this case we return the special
      branch name of HEAD rather than empty string, as HEAD is a
      valid revision specification and the empty string is not.
      
      I have also slightly improved the current-branch function by
      using string functions to parse the symbolic-ref data.  This
      should be slightly faster than using a regsub.  I think the
      code is clearer too.
      Signed-off-by: NShawn O. Pearce <spearce@spearce.org>
      311e02a4
    • S
      git-gui: Automatically refresh tracking branches when needed · ba1964be
      Shawn O. Pearce 提交于
      If the user is creating a new local branch and has selected to use
      a tracking branch as the starting revision they probably want to
      make sure they are using the absolute latest version available of
      that branch.
      
      We now offer a checkbox "Fetch Tracking Branch" (on by default)
      that instructs git-gui to run git-fetch on just that one branch
      before resolving the branch name into a commit SHA-1 and making
      (or updating) the local branch.
      Signed-off-by: NShawn O. Pearce <spearce@spearce.org>
      ba1964be
    • S
      git-gui: Option to default new branches to match tracking branches · 7cf04426
      Shawn O. Pearce 提交于
      In some workflows users will want to almost always just create a new
      local branch that matches a remote branch.  In this type of workflow
      it is handy to have the new branch dialog default to "Match Tracking
      Branch" and "Starting Revision"-Tracking Branch", with the focus in
      the branch filter field.  This can save users working on this type
      of workflow at least two mouse clicks every time they create a new
      local branch or switch to one with a fast-forward.
      Signed-off-by: NShawn O. Pearce <spearce@spearce.org>
      7cf04426
    • S
      git-gui: Sort tags descending by tagger date · 560eddc0
      Shawn O. Pearce 提交于
      When trying to create a branch from a tag most people are looking
      for a recent tag, not one that is ancient history.  Rather than
      sorting tags by their string we now sort them by taggerdate, as
      this places the recent tags at the top of the list and the very
      old ones at the end.  Tag date works nicely as an approximation
      of the actual history order of commits.
      Signed-off-by: NShawn O. Pearce <spearce@spearce.org>
      560eddc0
    • S
      git-gui: Enhance choose_rev to handle hundreds of branches · 7618e6b1
      Shawn O. Pearce 提交于
      One of my production repositories has hundreds of remote tracking
      branches.  Trying to navigate these through a popup menu is just
      not possible.  The list is far larger than the screen and it does
      not scroll fast enough to efficiently select a branch name when
      trying to create a branch or delete a branch.
      
      This is major rewrite of the revision chooser mega-widget.  We
      now use a single listbox for all three major types of named refs
      (heads, tracking branches, tags) and a radio button group to pick
      which of those namespaces should be shown in the listbox.  A filter
      field is shown to the right allowing the end-user to key in a glob
      specification to filter the list they are viewing.  The filter is
      always taken as substring, so we assume * both starts and ends the
      pattern the user wanted but otherwise treat it as a glob pattern.
      
      This new picker works out really nicely.  What used to take me at
      least a minute to find and select a branch now takes mere seconds.
      Signed-off-by: NShawn O. Pearce <spearce@spearce.org>
      7618e6b1
    • S
      git-gui: Fast-forward existing branch in branch create dialog · 774173aa
      Shawn O. Pearce 提交于
      If the user elects to create a local branch that has the same name
      as an existing branch and we can fast-forward the local branch to
      the selected revision we might as well do the fast-forward for the
      user, rather than making them first switch to the branch then merge
      the selected revision into it.  After all, its really just a fast
      forward.  No history is lost.  The resulting branch checkout may
      also be faster if the branch we are switching from is closer to
      the new revision.
      
      Likewise we also now allow the user to reset the local branch if
      it already exists but would not fast-forward.  However before we
      do the actual reset we tell the user what commits they are going to
      lose by showing the oneline subject and abbreviated sha1, and we also
      let them inspect the range of commits in gitk.
      Signed-off-by: NShawn O. Pearce <spearce@spearce.org>
      774173aa
    • S
      git-gui: Allow users to match remote branch names locally · dd87efc8
      Shawn O. Pearce 提交于
      Some workflows have users create a local branch that matches a remote
      branch they have fetched from another repository.  If the user wants
      to push their changes back to that remote repository then they probably
      want to use the same branch name locally so that git-gui's push dialog
      can setup the push refspec automatically.
      
      To prevent typos with the local branch name we now offer an option to
      use the remote tracking branch name as the new local branch name.
      Signed-off-by: NShawn O. Pearce <spearce@spearce.org>
      dd87efc8
    • S
      git-gui: Maintain remote and source ref for tracking branches · 79a060e4
      Shawn O. Pearce 提交于
      In the next change I want to let the user create their local branch
      name to match the remote branch name, so that the existing push
      dialog can push the branch back up to the remote repository without
      needing to do any sort of remapping.  To do that we need to know
      exactly what branch name the remote system is using.
      
      So all_tracking_branches returns a list of specifications, where
      each specification is itself a list of:
      
        - local ref name (destination we fetch into)
        - remote name (repository we fetch from)
        - remote ref name (source ref we fetch from)
      Signed-off-by: NShawn O. Pearce <spearce@spearce.org>
      79a060e4
    • S
      git-gui: Optimize for newstyle refs/remotes layout · 6f2a3fc8
      Shawn O. Pearce 提交于
      Most people using Git 1.5.x and later are using the newer style
      of remotes layout where all of their tracking branches are in
      refs/remotes and refs/heads contains only the user's own local
      branches.
      
      In such a situation we can avoid calling is_tracking_branch
      for each head we are considering because we know that all of
      the heads must be local branches if no fetch option or Pull:
      line maps a branch into that namespace.
      
      If however any remote maps a remote branch into a local
      tracking branch that resides in refs/heads we do exactly
      what we did before, which requires scanning through all
      fetch lines in case any patterns are matched.
      
      I also switched some regexp/regsub calls to string match
      as this can be a faster operation for prefix matching.
      Signed-off-by: NShawn O. Pearce <spearce@spearce.org>
      6f2a3fc8
    • S
      git-gui: Refactor the delete branch dialog to use class system · 3206c63d
      Shawn O. Pearce 提交于
      A simple refactoring of the delete branch dialog to allow use of
      the class construct to better organize the code and to reuse the
      revision selection code of our new choose_rev mega-widget.
      Signed-off-by: NShawn O. Pearce <spearce@spearce.org>
      3206c63d
    • S
      git-gui: Abstract the revision picker into a mega widget · b1fa2bff
      Shawn O. Pearce 提交于
      This rather large change pulls the "Starting Revision" part of the
      new branch dialog into a mega widget that we can use anytime we
      need to select a commit SHA-1.  To make use of the mega widget I
      have also refactored the branch dialog to use the class system,
      much like the delete remote branch dialog already does.
      Signed-off-by: NShawn O. Pearce <spearce@spearce.org>
      b1fa2bff
    • S
      git-gui: Teach class system to support [$this cmd] syntax · 6233ab17
      Shawn O. Pearce 提交于
      Its handy to be able to ask an object to do something for you by
      handing it a subcommand.  For example if we want to get the value
      of an object's private field the object could expose a method that
      would return that value.  Application level code can then invoke
      "$inst get" to perform the method call.
      
      Tk uses this pattern for all of its widgets, so we'd certainly
      like to use it for our own mega-widgets that we might develop.
      Up until now we haven't needed such functionality, but I'm working
      on a new revision picker mega-widget that would benefit from it.
      
      To make this work we have to change the definition of $this to
      actually be a procedure within the namespace.  By making $this a
      procedure any caller that has $this can call subcommands by passing
      them as the first argument to $this.  That subcommand then needs
      to call the proper subroutine.
      
      Placing the dispatch procedure into the object's variable namespace
      ensures that it will always be deleted when the object is deleted.
      Signed-off-by: NShawn O. Pearce <spearce@spearce.org>
      6233ab17
    • S
      Merge branch 'maint' · 4ca13125
      Shawn O. Pearce 提交于
      * maint:
        git-gui: Skip nicknames when selecting author initials
      4ca13125
    • S
      git-gui: Skip nicknames when selecting author initials · 88dce86f
      Shawn O. Pearce 提交于
      Our blame viewer only grabbed the first initial of the git.git
      author string "Simon 'corecode' Schubert".  Here the problem was we
      looked at Simon, pulled the S into the author initials, then saw
      the single quote as the start of the next name and did not like
      this character as it was not an uppercase letter.
      
      We now skip over single quoted nicknames placed within the author
      name field and grab the initials following it.  So the above name
      will get the initials SS, rather than just S.
      Signed-off-by: NShawn O. Pearce <spearce@spearce.org>
      88dce86f
    • J
      git-gui: use "blame -w -C -C" for "where did it come from, originally?" · a8405667
      Junio C Hamano 提交于
      The blame window shows "who wrote the piece originally" and "who
      moved it there" in two columns.  In order to identify the former
      more correctly, it helps to use the new -w option.
      
      [sp: Minor change to only enable -w if underlying git >= 1.5.3]
      Signed-off-by: NJunio C Hamano <gitster@pobox.com>
      Signed-off-by: NShawn O. Pearce <spearce@spearce.org>
      a8405667