1
0
mirror of https://github.com/git/git.git synced 2025-03-16 04:55:09 +00:00
Jeff King 479b0ae81c diff: refactor tempfile cleanup handling
There are two pieces of code that create tempfiles for diff:
run_external_diff and run_textconv. The former cleans up its
tempfiles in the face of premature death (i.e., by die() or
by signal), but the latter does not. After this patch, they
will both use the same cleanup routines.

To make clear what the change is, let me first explain what
happens now:

  - run_external_diff uses a static global array of 2
    diff_tempfile structs (since it knows it will always
    need exactly 2 tempfiles). It calls prepare_temp_file
    (which doesn't know anything about the global array) on
    each of the structs, creating the tempfiles that need to
    be cleaned up. It then registers atexit and signal
    handlers to look through the global array and remove the
    tempfiles. If it succeeds, it calls the handler manually
    (which marks the tempfile structs as unused).

  - textconv has its own tempfile struct, which it allocates
    using prepare_temp_file and cleans up manually. No
    signal or atexit handlers.

The new code moves the installation of cleanup handlers into
the prepare_temp_file function. Which means that that
function now has to understand that there is static tempfile
storage. So what happens now is:

  - run_external_diff calls prepare_temp_file
  - prepare_temp_file calls claim_diff_tempfile, which
    allocates an unused slot from our global array
  - prepare_temp_file installs (if they have not already
    been installed) atexit and signal handlers for cleanup
  - prepare_temp_file sets up the tempfile as usual
  - prepare_temp_file returns a pointer to the allocated
    tempfile

The advantage being that run_external_diff no longer has to
care about setting up cleanup handlers. Now by virtue of
calling prepare_temp_file, run_textconv gets the same
benefit, as will any future users of prepare_temp_file.

There are also a few side benefits to the specific
implementation:

  - we now install cleanup handlers _before_ allocating the
    tempfile, closing a race which could leave temp cruft

  - when allocating a slot in the global array, we will now
    detect a situation where the old slots were not properly
    vacated (i.e., somebody forgot to call remove upon
    leaving the function). In the old code, such a situation
    would silently overwrite the tempfile names, meaning we
    would forget to clean them up. The new code dies with a
    bug warning.

  - we make sure only to install the signal handler once.
    This isn't a big deal, since we are just overwriting the
    old handler, but will become an issue when a later patch
    converts the code to use sigchain

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2009-01-21 22:46:52 -08:00
2009-01-21 22:46:52 -08:00
2008-12-17 21:56:48 -08:00
2009-01-07 00:09:33 -08:00
2008-12-03 21:29:03 -08:00
2008-07-19 11:25:51 -07:00
2008-06-30 22:45:50 -07:00
2008-07-19 11:17:43 -07:00
2008-10-26 16:21:08 -07:00
2007-05-30 15:03:50 -07:00
2008-10-21 17:58:11 -07:00
2007-06-07 00:04:01 -07:00
2008-08-28 20:50:10 -07:00
2008-09-10 15:00:17 -07:00
2008-12-07 15:13:02 -08:00
2008-12-11 00:36:31 -08:00
2008-11-12 22:00:43 -08:00
2008-08-03 14:14:10 -07:00
2008-10-08 08:05:43 -07:00
2008-11-08 21:33:55 -08:00
2008-12-07 15:13:02 -08:00
2008-09-15 23:11:35 -07:00
2008-09-25 09:39:24 -07:00
2008-12-11 00:36:31 -08:00
2008-12-02 15:29:12 -08:00
2008-12-02 15:29:12 -08:00
2009-01-05 13:01:01 -08:00
2008-10-10 08:39:20 -07:00
2008-10-10 08:39:20 -07:00
2008-08-28 21:49:51 -07:00
2009-01-05 13:01:01 -08:00
2007-06-07 00:04:01 -07:00
2008-11-02 16:36:40 -08:00
2008-11-14 19:11:49 -08:00
2008-11-11 14:49:50 -08:00
2008-02-25 23:57:35 -08:00
2008-08-05 21:21:08 -07:00
2008-07-13 14:12:48 -07:00
2009-01-01 05:48:40 -08:00
2008-12-03 14:27:17 -08:00
2008-07-13 14:12:48 -07:00
2008-12-17 20:15:17 -08:00
2009-01-05 13:01:01 -08:00
2008-09-25 08:00:28 -07:00
2009-01-05 13:01:01 -08:00
2008-09-07 23:52:16 -07:00
2008-12-07 15:13:02 -08:00
2008-11-23 19:23:34 -08:00
2008-07-21 19:11:50 -07:00
2008-07-21 19:11:50 -07:00
2008-10-25 12:09:31 -07:00
2008-09-10 15:00:17 -07:00
2008-12-15 23:06:13 -08:00
2008-07-21 19:11:50 -07:00
2008-11-11 14:49:50 -08:00
2008-11-12 22:26:24 -08:00
2008-07-21 19:11:50 -07:00
2008-11-14 22:12:38 -08:00
2007-11-09 21:14:10 -08:00
2008-07-21 19:11:50 -07:00
2008-07-21 19:11:50 -07:00
2008-07-21 19:11:50 -07:00
2008-03-02 15:11:07 -08:00
2007-05-01 02:59:08 -07:00
2008-10-21 17:58:01 -07:00
2008-10-09 11:26:17 -07:00
2008-09-29 07:30:16 -07:00
2008-07-30 11:42:01 -07:00

////////////////////////////////////////////////////////////////

	GIT - the stupid content tracker

////////////////////////////////////////////////////////////////

"git" can mean anything, depending on your mood.

 - random three-letter combination that is pronounceable, and not
   actually used by any common UNIX command.  The fact that it is a
   mispronunciation of "get" may or may not be relevant.
 - stupid. contemptible and despicable. simple. Take your pick from the
   dictionary of slang.
 - "global information tracker": you're in a good mood, and it actually
   works for you. Angels sing, and a light suddenly fills the room.
 - "goddamn idiotic truckload of sh*t": when it breaks

Git is a fast, scalable, distributed revision control system with an
unusually rich command set that provides both high-level operations
and full access to internals.

Git is an Open Source project covered by the GNU General Public License.
It was originally written by Linus Torvalds with help of a group of
hackers around the net. It is currently maintained by Junio C Hamano.

Please read the file INSTALL for installation instructions.
See Documentation/gittutorial.txt to get started, then see
Documentation/everyday.txt for a useful minimum set of commands,
and "man git-commandname" for documentation of each command.
CVS users may also want to read Documentation/cvs-migration.txt.

Many Git online resources are accessible from http://git.or.cz/
including full documentation and Git related tools.

The user discussion and development of Git take place on the Git
mailing list -- everyone is welcome to post bug reports, feature
requests, comments and patches to git@vger.kernel.org. To subscribe
to the list, send an email with just "subscribe git" in the body to
majordomo@vger.kernel.org. The mailing list archives are available at
http://marc.theaimsgroup.com/?l=git and other archival sites.

The messages titled "A note from the maintainer", "What's in
git.git (stable)" and "What's cooking in git.git (topics)" and
the discussion following them on the mailing list give a good
reference for project status, development direction and
remaining tasks.
Description
Git Source Code Mirror - This is a publish-only repository but pull requests can be turned into patches to the mailing list via GitGitGadget (https://gitgitgadget.github.io/). Please follow Documentation/SubmittingPatches procedure for any of your improvements.
Readme 661 MiB
Languages
C 50.1%
Shell 38.4%
Perl 5.1%
Tcl 3.3%
Python 0.8%
Other 2%