Go to file
Karsten Blees eac14f8909 Win32: Thread-safe windows console output
Winansi.c has many static variables that are accessed and modified from
the [v][f]printf / fputs functions overridden in the file. This may cause
multi threaded git commands that print to the console to produce corrupted
output or even crash.

Additionally, winansi.c doesn't override all functions that can be used to
print to the console (e.g. fwrite, write, fputc are missing), so that ANSI
escapes don't work properly for some git commands (e.g. git-grep).

Instead of doing ANSI emulation in just a few wrapped functions on top of
the IO API, let's plug into the IO system and take advantage of the thread
safety inherent to the IO system.

Redirect stdout and stderr to a pipe if they point to the console. A
background thread reads from the pipe, handles ANSI escape sequences and
UTF-8 to UTF-16 conversion, then writes to the console.

The pipe-based stdout and stderr replacements must be set to unbuffered, as
MSVCRT doesn't support line buffering and fully buffered streams are
inappropriate for console output.

Due to the byte-oriented pipe, ANSI escape sequences and multi-byte UTF-8
sequences can no longer be expected to arrive in one piece. Replace the
string-based ansi_emulate() with a simple stateful parser (this also fixes
colored diff hunk headers, which were broken as of commit 2efcc977).

Override isatty to return true for the pipes redirecting to the console.

Exec/spawn obtain the original console handle to pass to the next process
via winansi_get_osfhandle().

All other overrides are gone, the default stdio implementations work as
expected with the piped stdout/stderr descriptors.

Global variables are either initialized on startup (single threaded) or
exclusively modified by the background thread. Threads communicate through
the pipe, no further synchronization is necessary.

The background thread is terminated by disonnecting the pipe after flushing
the stdio and pipe buffers. This doesn't work for anonymous pipes (created
via CreatePipe), as DisconnectNamedPipe only works on the read end, which
discards remaining data. Thus we have to setup the pipe manually, with the
write end beeing the server (opened with CreateNamedPipe) and the read end
the client (opened with CreateFile).

Limitations: doesn't track reopened or duped file descriptors, i.e.:
- fdopen(1/2) returns fully buffered streams
- dup(1/2), dup2(1/2) returns normal pipe descriptors (i.e. isatty() =
  false, winansi_get_osfhandle won't return the original console handle)

Currently, only the git-format-patch command uses xfdopen(xdup(1)) (see
"realstdout" in builtin/log.c), but works well with these limitations.

Many thanks to Atsushi Nakagawa <atnak@chejz.com> for suggesting and
reviewing the thread-exit-mechanism.

Signed-off-by: Karsten Blees <blees@dcon.de>
Signed-off-by: Stepan Kasal <kasal@ucw.cz>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2014-06-10 13:32:59 -07:00
Documentation Git 1.9.3 2014-05-09 10:59:07 -07:00
block-sha1
builtin Merge branch 'jl/nor-or-nand-and' into maint 2014-04-09 12:03:26 -07:00
compat Win32: Thread-safe windows console output 2014-06-10 13:32:59 -07:00
contrib Merge branch 'rh/prompt-pcmode-avoid-eval-on-refname' into maint 2014-05-08 10:01:18 -07:00
git-gui git-gui 0.19.0 2014-01-21 13:16:17 -08:00
gitk-git Merge git://ozlabs.org/~paulus/gitk 2014-01-23 08:50:50 -08:00
gitweb comments: fix misuses of "nor" 2014-03-31 15:29:27 -07:00
mergetools
perl code and test: fix misuses of "nor" 2014-03-31 15:29:33 -07:00
po i18n: proposed command missing leading dash 2014-03-05 22:10:24 +08:00
ppc
t Merge branch 'rh/prompt-pcmode-avoid-eval-on-refname' into maint 2014-05-08 10:01:18 -07:00
templates
vcs-svn
xdiff
.gitattributes
.gitignore
.mailmap
COPYING
GIT-VERSION-GEN Git 1.9.3 2014-05-09 10:59:07 -07:00
INSTALL
LGPL-2.1
Makefile Merge branch 'jl/nor-or-nand-and' into maint 2014-04-09 12:03:26 -07:00
README
RelNotes Start preparing for 1.9.3 2014-05-08 10:05:22 -07:00
abspath.c Merge branch 'ap/path-max' 2014-01-10 10:32:18 -08:00
aclocal.m4
advice.c
advice.h
alias.c
alloc.c
archive-tar.c
archive-zip.c
archive.c
archive.h
argv-array.c
argv-array.h
attr.c
attr.h
base85.c
bisect.c
bisect.h
blob.c
blob.h
branch.c
branch.h
builtin.h builtin/help.c: speed up is_git_command() by checking for builtin commands first 2014-01-06 11:26:31 -08:00
bulk-checkin.c
bulk-checkin.h
bundle.c
bundle.h
cache-tree.c
cache-tree.h
cache.h Windows: allow using UNC path for git repository 2014-06-10 13:30:04 -07:00
check-builtins.sh
check-racy.c
check_bindir
color.c
color.h
column.c comments: fix misuses of "nor" 2014-03-31 15:29:27 -07:00
column.h
combine-diff.c
command-list.txt
commit-slab.h
commit.c Merge branch 'vm/octopus-merge-bases-simplify' 2014-01-10 10:33:45 -08:00
commit.h Merge branch 'bp/commit-p-editor' into maint 2014-04-08 12:07:06 -07:00
config.c Merge branch 'jk/config-path-include-fix' into maint 2014-03-18 14:00:15 -07:00
config.mak.in
config.mak.uname Merge branch 'jk/commit-dates-parsing-fix' into maint 2014-04-09 11:59:38 -07:00
configure.ac
connect.c Merge branch 'nd/shallow-clone' 2014-01-17 12:21:20 -08:00
connect.h
connected.c Merge branch 'nd/shallow-clone' 2014-01-17 12:21:20 -08:00
connected.h
convert.c
convert.h
copy.c
credential-cache--daemon.c
credential-cache.c
credential-store.c
credential.c
credential.h
csum-file.c Merge branch 'jk/sha1write-void' 2014-01-10 10:33:09 -08:00
csum-file.h Merge branch 'jk/sha1write-void' 2014-01-10 10:33:09 -08:00
ctype.c
daemon.c Merge branch 'nd/daemon-informative-errors-typofix' 2014-01-10 10:32:59 -08:00
date.c Merge branch 'jk/commit-dates-parsing-fix' into maint 2014-03-18 14:04:01 -07:00
decorate.c
decorate.h
delta.h comments: fix misuses of "nor" 2014-03-31 15:29:27 -07:00
diff-delta.c
diff-lib.c pathspec: convert some match_pathspec_depth() to ce_path_match() 2014-02-24 14:36:52 -08:00
diff-no-index.c Merge branch 'jc/fix-diff-no-index-diff-opt-parse' into maint 2014-04-09 11:59:16 -07:00
diff.c comments: fix misuses of "nor" 2014-03-31 15:29:27 -07:00
diff.h Merge branch 'tg/diff-no-index-refactor' 2013-12-27 14:58:17 -08:00
diffcore-break.c
diffcore-delta.c
diffcore-order.c Merge branch 'sb/diff-orderfile-config' 2014-01-10 10:32:42 -08:00
diffcore-pickaxe.c
diffcore-rename.c
diffcore.h Merge branch 'nd/diff-quiet-stat-dirty' into maint 2014-03-18 13:59:56 -07:00
dir.c pathspec: pass directory indicator to match_pathspec_item() 2014-02-24 14:37:19 -08:00
dir.h pathspec: pass directory indicator to match_pathspec_item() 2014-02-24 14:37:19 -08:00
editor.c
entry.c Merge branch 'mh/remove-subtree-long-pathname-fix' into maint 2014-04-03 13:39:05 -07:00
environment.c Merge branch 'nd/shallow-clone' 2014-01-17 12:21:20 -08:00
exec_cmd.c
exec_cmd.h
fast-import.c
fetch-pack.c Merge branch 'jk/shallow-update-fix' into maint 2014-04-03 13:39:03 -07:00
fetch-pack.h Merge branch 'nd/shallow-clone' 2014-01-17 12:21:20 -08:00
fmt-merge-msg.h
fsck.c date: check date overflow against time_t 2014-02-24 10:12:58 -08:00
fsck.h
generate-cmdlist.sh
gettext.c
gettext.h
git-add--interactive.perl code and test: fix misuses of "nor" 2014-03-31 15:29:33 -07:00
git-am.sh comments: fix misuses of "nor" 2014-03-31 15:29:27 -07:00
git-archimport.perl
git-bisect.sh
git-compat-util.h Windows: allow using UNC path for git repository 2014-06-10 13:30:04 -07:00
git-cvsexportcommit.perl
git-cvsimport.perl
git-cvsserver.perl
git-difftool--helper.sh
git-difftool.perl difftool: support repositories with .git-files 2014-02-24 09:53:57 -08:00
git-filter-branch.sh
git-instaweb.sh
git-merge-octopus.sh
git-merge-one-file.sh
git-merge-resolve.sh
git-mergetool--lib.sh
git-mergetool.sh
git-p4.py Merge branch 'cl/p4-use-diff-tree' into maint 2014-05-08 10:01:32 -07:00
git-parse-remote.sh
git-pull.sh Merge branch 'jk/pull-rebase-using-fork-point' 2014-01-17 12:04:29 -08:00
git-quiltimport.sh
git-rebase--am.sh rebase: avoid non-function use of "return" on FreeBSD 2014-04-17 10:13:29 -07:00
git-rebase--interactive.sh rebase: avoid non-function use of "return" on FreeBSD 2014-04-17 10:13:29 -07:00
git-rebase--merge.sh rebase: avoid non-function use of "return" on FreeBSD 2014-04-17 10:13:29 -07:00
git-rebase.sh Revert "rebase: fix run_specific_rebase's use of "return" on FreeBSD" 2014-04-17 10:15:27 -07:00
git-relink.perl
git-remote-testgit.sh
git-request-pull.sh
git-send-email.perl Merge branch 'rk/send-email-ssl-cert' into maint 2014-02-13 13:38:19 -08:00
git-sh-i18n.sh
git-sh-setup.sh Merge branch 'jn/pager-lv-default-env' 2014-01-13 11:33:35 -08:00
git-stash.sh Merge branch 'jc/stash-pop-not-popped' into maint 2014-04-03 13:39:03 -07:00
git-submodule.sh Merge branch 'fp/submodule-checkout-mode' 2014-01-17 12:21:20 -08:00
git-svn.perl
git-web--browse.sh
git.c Merge branch 'nd/shallow-clone' 2014-01-17 12:21:20 -08:00
git.rc Makefile: Fix compilation of Windows resource file 2014-01-23 10:00:28 -08:00
git.spec.in
gpg-interface.c
gpg-interface.h
graph.c
graph.h
grep.c
grep.h
hash.c
hash.h
help.c
help.h
hex.c
http-backend.c
http-fetch.c
http-push.c
http-walker.c
http.c Merge branch 'cc/starts-n-ends-with' 2013-12-17 12:02:44 -08:00
http.h comments: fix misuses of "nor" 2014-03-31 15:29:27 -07:00
ident.c
imap-send.c
kwset.c
kwset.h
levenshtein.c
levenshtein.h
line-log.c
line-log.h
line-range.c
line-range.h
list-objects.c Merge branch 'jk/mark-edges-uninteresting' 2014-01-27 10:45:08 -08:00
list-objects.h
ll-merge.c
ll-merge.h
lockfile.c
log-tree.c Merge branch 'bc/log-decoration' 2014-01-10 10:32:39 -08:00
log-tree.h
mailmap.c
mailmap.h
match-trees.c
merge-blobs.c
merge-blobs.h
merge-recursive.c Merge branch 'bk/refresh-missing-ok-in-merge-recursive' into maint 2014-03-18 14:02:38 -07:00
merge-recursive.h
merge.c
mergesort.c
mergesort.h
name-hash.c
notes-cache.c
notes-cache.h
notes-merge.c
notes-merge.h
notes-utils.c Merge branch 'cc/starts-n-ends-with' 2013-12-17 12:02:44 -08:00
notes-utils.h
notes.c
notes.h
object.c
object.h
pack-check.c
pack-revindex.c
pack-revindex.h
pack-write.c Merge branch 'jk/sha1write-void' 2014-01-10 10:33:09 -08:00
pack.h
pager.c Merge branch 'jn/pager-lv-default-env' 2014-01-13 11:33:35 -08:00
parse-options-cb.c
parse-options.c
parse-options.h
patch-delta.c
patch-ids.c
patch-ids.h
path.c Windows: allow using UNC path for git repository 2014-06-10 13:30:04 -07:00
pathspec.c pathspec: convert some match_pathspec_depth() to ce_path_match() 2014-02-24 14:36:52 -08:00
pathspec.h
pkt-line.c
pkt-line.h comments: fix misuses of "nor" 2014-03-31 15:29:27 -07:00
preload-index.c pathspec: convert some match_pathspec_depth() to ce_path_match() 2014-02-24 14:36:52 -08:00
pretty.c Merge branch 'jk/commit-dates-parsing-fix' into maint 2014-03-18 14:04:01 -07:00
prio-queue.c
prio-queue.h
progress.c
progress.h
prompt.c Revert "prompt: clean up strbuf usage" 2014-01-02 10:21:40 -08:00
prompt.h
quote.c
quote.h
reachable.c
reachable.h
read-cache.c Merge branch 'bk/refresh-missing-ok-in-merge-recursive' into maint 2014-03-18 14:02:38 -07:00
reflog-walk.c
reflog-walk.h
refs.c Merge branch 'mh/safe-create-leading-directories' 2014-01-27 10:45:33 -08:00
refs.h
remote-curl.c Merge branch 'nd/shallow-clone' 2014-01-17 12:21:20 -08:00
remote-testsvn.c
remote.c Merge branch 'jl/nor-or-nand-and' into maint 2014-04-09 12:03:26 -07:00
remote.h Merge branch 'nd/shallow-clone' 2014-01-17 12:21:20 -08:00
replace_object.c
rerere.c pathspec: pass directory indicator to match_pathspec_item() 2014-02-24 14:37:19 -08:00
rerere.h
resolve-undo.c pathspec: convert some match_pathspec_depth() to ce_path_match() 2014-02-24 14:36:52 -08:00
resolve-undo.h
revision.c pathspec: convert some match_pathspec_depth() to ce_path_match() 2014-02-24 14:36:52 -08:00
revision.h
run-command.c commit: fix patch hunk editing with "commit -p -m" 2014-03-18 11:25:12 -07:00
run-command.h run-command: mark run_hook_with_custom_index as deprecated 2014-03-18 11:26:12 -07:00
send-pack.c Merge branch 'nd/shallow-clone' 2014-01-17 12:21:20 -08:00
send-pack.h
sequencer.c
sequencer.h
server-info.c
setup.c
sh-i18n--envsubst.c
sha1-array.c
sha1-array.h
sha1-lookup.c
sha1-lookup.h
sha1_file.c code and test: fix misuses of "nor" 2014-03-31 15:29:33 -07:00
sha1_name.c Merge branch 'jk/interpret-branch-name-fix' 2014-01-27 10:44:21 -08:00
shallow.c shallow: verify shallow file after taking lock 2014-03-17 15:03:32 -07:00
shell.c
shortlog.h
show-index.c
sideband.c
sideband.h
sigchain.c
sigchain.h
strbuf.c
strbuf.h
streaming.c Merge branch 'ef/mingw-write' 2014-01-27 10:44:59 -08:00
streaming.h
string-list.c
string-list.h
submodule.c
submodule.h
symlinks.c
tag.c
tag.h
tar.h
test-chmtime.c comments: fix misuses of "nor" 2014-03-31 15:29:27 -07:00
test-ctype.c
test-date.c
test-delta.c
test-dump-cache-tree.c
test-genrandom.c
test-index-version.c
test-line-buffer.c
test-match-trees.c
test-mergesort.c
test-mktemp.c
test-parse-options.c
test-path-utils.c
test-prio-queue.c
test-read-cache.c
test-regex.c
test-revision-walking.c
test-run-command.c
test-scrap-cache-tree.c
test-sha1.c
test-sha1.sh
test-sigchain.c
test-string-list.c
test-subprocess.c
test-svn-fe.c
test-urlmatch-normalization.c
test-wildmatch.c
thread-utils.c
thread-utils.h
trace.c
transport-helper.c Merge branch 'ef/mingw-write' 2014-01-27 10:44:59 -08:00
transport.c Merge branch 'nd/shallow-clone' 2014-01-17 12:21:20 -08:00
transport.h
tree-diff.c
tree-walk.c Merge branch 'as/tree-walk-fix-aggressive-short-cut' into maint 2014-02-13 13:37:53 -08:00
tree-walk.h
tree.c
tree.h
unimplemented.sh
unix-socket.c
unix-socket.h
unpack-trees.c Merge branch 'jk/two-way-merge-corner-case-fix' into maint 2013-12-17 11:32:17 -08:00
unpack-trees.h
upload-pack.c shallow: automatically clean up shallow tempfiles 2014-02-27 12:07:13 -08:00
url.c
url.h
urlmatch.c
urlmatch.h
usage.c
userdiff.c userdiff: update Ada patterns 2014-02-05 10:45:51 -08:00
userdiff.h
utf8.c utf8.c: partially update to version 6.3 2014-04-09 10:14:05 -07:00
utf8.h
varint.c
varint.h
version.c
version.h
walker.c
walker.h
wildmatch.c
wildmatch.h
wrap-for-bin.sh
wrapper.c
write_or_die.c
ws.c
wt-status.c Merge branch 'mm/status-porcelain-format-i18n-fix' into maint 2014-04-08 12:07:06 -07:00
wt-status.h status: disable translation when --porcelain is used 2014-03-26 12:56:30 -07:00
xdiff-interface.c
xdiff-interface.h
zlib.c

README

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

	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 version 2 (some parts of it are under different licenses,
compatible with the GPLv2). It was originally written by Linus
Torvalds with help of a group of hackers around the net.

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
Documentation/git-commandname.txt for documentation of each command.
If git has been correctly installed, then the tutorial can also be
read with "man gittutorial" or "git help tutorial", and the
documentation of each command with "man git-commandname" or "git help
commandname".

CVS users may also want to read Documentation/gitcvs-migration.txt
("man gitcvs-migration" or "git help cvs-migration" if git is
installed).

Many Git online resources are accessible from http://git-scm.com/
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 (read
Documentation/SubmittingPatches for instructions on patch submission).
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://news.gmane.org/gmane.comp.version-control.git/,
http://marc.info/?l=git and other archival sites.

The maintainer frequently sends the "What's cooking" reports that
list the current status of various development topics to the mailing
list.  The discussion following them give a good reference for
project status, development direction and remaining tasks.