git.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* What's cooking in git.git (Apr 2012, #06; Sun, 15)
@ 2012-04-16  6:44 Junio C Hamano
  2012-04-16  9:07 ` Nelson Benitez Leon
  2012-04-18  7:15 ` Johannes Sixt
  0 siblings, 2 replies; 19+ messages in thread
From: Junio C Hamano @ 2012-04-16  6:44 UTC (permalink / raw)
  To: git

Here are the topics that have been cooking.  Commits prefixed with '-' are
only in 'pu' (proposed updates) while commits prefixed with '+' are in 'next'.

The first batch of topics in this cycle is now in 'master'. Tentatively,
the Release Notes for the next release calls itself 1.7.11, but we may end
up calling it 1.8.0 if we come up with a reasonable implementation of the
"simple" mode of default push semantics.

You can find the changes described here in the integration branches of the
repositories listed at

    http://git-blame.blogspot.com/p/git-public-repositories.html

--------------------------------------------------
[Graduated to "master"]

* da/difftool-test (2012-03-19) 1 commit
  (merged to 'next' on 2012-04-11 at f245c01)
 + t7800: Test difftool passing arguments to diff

Makes sure "difftool" options can be given in any order.

* jc/commit-hook-authorship (2012-03-11) 3 commits
  (merged to 'next' on 2012-04-11 at 15ec4d4)
 + commit: pass author/committer info to hooks
 + t7503: does pre-commit-hook learn authorship?
 + ident.c: add split_ident_line() to parse formatted ident line
 (this branch is tangled with jc/run-hook-env-1.)

Originally merged to 'next' on 2012-03-12

"git commit --author=$name" did not tell the name that was being
recorded in the resulting commit to hooks, even though it does do so
when the end user overrode the authorship via the "GIT_AUTHOR_NAME"
environment variable.

* jc/diff-algo-cleanup (2012-02-19) 2 commits
  (merged to 'next' on 2012-04-11 at f2c6b9a)
 + xdiff: PATIENCE/HISTOGRAM are not independent option bits
 + xdiff: remove XDL_PATCH_* macros

Originally merged to 'next' on 2012-03-15

Resurrects the preparatory clean-up patches from another topic that was
discarded, as this would give a saner foundation to build on diff.algo
configuration option series.

* jh/notes-merge-in-git-dir-worktree (2012-03-15) 4 commits
  (merged to 'next' on 2012-04-11 at 6042ef5)
 + notes-merge: Don't remove .git/NOTES_MERGE_WORKTREE; it may be the user's cwd
 + notes-merge: use opendir/readdir instead of using read_directory()
 + t3310: illustrate failure to "notes merge --commit" inside $GIT_DIR/
 + remove_dir_recursively(): Add flag for skipping removal of toplevel dir
 (this branch is tangled with jc/maint-clean-nested-worktree-in-subdir.)

Originally merged to 'next' on 2012-03-20

Running "notes merge --commit" failed to perform correctly when run
from any directory inside $GIT_DIR/.  When "notes merge" stops with
conflicts, $GIT_DIR/NOTES_MERGE_WORKTREE is the place a user edits
to resolve it.

* jn/diffstat-tests (2012-03-13) 7 commits
  (merged to 'next' on 2012-04-11 at 7365e41)
 + diffstat summary line varies by locale: miscellany
 + test: use numstat instead of diffstat in binary-diff test
 + test: use --numstat instead of --stat in "git stash show" tests
 + test: test cherry-pick functionality and output separately
 + test: modernize funny-names test style
 + test: use numstat instead of diffstat in funny-names test
 + test: use test_i18ncmp when checking --stat output

Originally merged to 'next' on 2012-03-20

Some tests checked the "diff --stat" output when they do not have to,
which unnecessarily made things harder to verify under GETTEXT_POISON.

* nd/stream-more (2012-03-07) 7 commits
  (merged to 'next' on 2012-04-11 at b17684d)
 + update-server-info: respect core.bigfilethreshold
 + fsck: use streaming API for writing lost-found blobs
 + show: use streaming API for showing blobs
 + parse_object: avoid putting whole blob in core
 + cat-file: use streaming API to print blobs
 + Add more large blob test cases
 + streaming: make streaming-write-entry to be more reusable

Originally merged to 'next' on 2012-03-07

Use API to read blob data in smaller chunks in more places to
reduce the memory footprint.  In general, looked fairly good.

* tr/maint-word-diff-regex-sticky (2012-03-14) 3 commits
  (merged to 'next' on 2012-04-11 at 24d14de)
 + diff: tweak a _copy_ of diff_options with word-diff
 + diff: refactor the word-diff setup from builtin_diff_cmd
 + t4034: diff.*.wordregex should not be "sticky" in --word-diff

Originally merged to 'next' on 2012-03-20

The regexp configured with wordregex was incorrectly reused across
files.

* zj/test-cred-helper-nicer-prove (2012-03-15) 2 commits
  (merged to 'next' on 2012-04-11 at 9169614)
 + t0303: resurrect commit message as test documentation
 + t0303: immediately bail out w/o GIT_TEST_CREDENTIAL_HELPER

Originally merged to 'next' on 2012-03-20

Minor improvement to t0303.

--------------------------------------------------
[New Topics]

* cb/cherry-pick-rev-path-confusion (2012-04-15) 1 commit
 - cherry-pick: do not expect file arguments

The command line parser choked "git cherry-pick $name" when $name can be
both revision name and a pathname, even though $name can never be a path
in the context of the command.

The issue the patch addresses is real, but the way it is implemented felt
unnecessarily invasive a bit.  It may be cleaner for this caller to add
the "--" to the end of the argv_array it passes to setup_revisions().

* cb/daemon-test-race-fix (2012-04-15) 1 commit
 - git-daemon wrapper to wait until daemon is ready

Fix race condition between starting and waiting for git-daemon in the
test.

* cb/maint-report-mount-point-correctly-in-setup (2012-04-15) 1 commit
 - properly keep track of current working directory

The filesystem boundary was not correctly reported when .git directory
discovery stopped at a mount point.

* jl/maint-submodule-recurse-fetch (2012-04-14) 1 commit
 - submodules: recursive fetch also checks new tags for submodule commits

Will merge to 'next'.

* jn/fast-import-doc (2012-04-15) 1 commit
 - fast-import doc: cat-blob and ls responses need to be consumed quickly

Will merge to 'next'.

* jn/more-i18ncmp (2012-04-14) 3 commits
 - test: am of empty patch should not succeed
 - test: use test_i18ncmp for "Patch format detection failed" message
 - test: do not rely on US English tracking-info messages

Will merge to 'next'.

* rl/maint-stash-i18n-save-error (2012-04-14) 1 commit
 - stash: use eval_gettextln correctly

Will merge to 'next'.

--------------------------------------------------
[Stalled]

* lp/maint-diff-three-dash-with-graph (2012-03-20) 3 commits
 - t4202: add test for "log --graph --stat -p" separator lines
 - log --graph: fix break in graph lines
 - log --graph --stat: three-dash separator should come after graph lines

With a review from Zbigniew, I have been expecting that this would be
rerolled, but that didn't happen.

Waiting for a reroll.

* cn/apply-fix-ws-can-lengthen-lines (2012-03-11) 1 commit
 . apply: reallocate the postimage buffer when needed

Attempts to address an ancient bug that dates back to the addition
of an oddball "tab-in-indent" whitespace breakage class that wants
to have longer lines than the original when fixing things up; broken
and results in double-frees.

Will discard shortly if nothing happens.

* ss/git-svn-prompt-sans-terminal (2012-01-04) 3 commits
 - fixup! 15eaaf4
 - git-svn, perl/Git.pm: extend Git::prompt helper for querying users
 - perl/Git.pm: "prompt" helper to honor GIT_ASKPASS and SSH_ASKPASS

The bottom one has been replaced with a rewrite based on comments
from Ævar. The second one needs more work, both in perl/Git.pm and
prompt.c, to give precedence to tty over SSH_ASKPASS when terminal
is available.

Will discard shortly if nothing happens.

* jc/split-blob (2012-04-03) 7 commits
 - chunked-object: streaming checkout
 - chunked-object: fallback checkout codepaths
 - bulk-checkin: support chunked-object encoding
 - bulk-checkin: allow the same data to be multiply hashed
 - new representation types in the packstream
 - packfile: use varint functions
 - varint: make it available outside the context of pack
 (this branch is tangled with jc/index-v4.)

Not ready.

I finished the streaming checkout codepath, but as explained in
127b177 (bulk-checkin: support chunked-object encoding, 2011-11-30),
these are still early steps of a long and painful journey. At least
pack-objects and fsck need to learn the new encoding for the series
to be usable locally, and then index-pack/unpack-objects needs to
learn it to be used remotely.

Given that I heard a lot of noise that people want large files, and
that I was asked by somebody at GitTogether'11 privately for an
advice on how to pay developers (not me) to help adding necessary
support, I am somewhat dissapointed that the original patch series
that was sent almost two months ago still remains here without much
comments and updates from the developer community. I even made the
interface to the logic that decides where to split chunks easily
replaceable, and I deliberately made the logic in the original patch
extremely stupid to entice others, especially the "bup" fanboys, to
come up with a better logic, thinking that giving people an easy
target to shoot for, they may be encouraged to help out. The plan is
not working :-(.

--------------------------------------------------
[Cooking]

* nd/columns (2012-04-15) 9 commits
 - tag: add --column
 - column: support piping stdout to external git-column process
 - status: add --column
 - branch: add --column
 - help: reuse print_columns() for help -a
 - column: add dense layout support
 - column: add columnar layout
 - Stop starting pager recursively
 - Add column layout skeleton and git-column

Rerolled.

* nl/http-proxy-more (2012-04-14) 6 commits
 - http: fix proxy authentication
 - http: rename HTTP_REAUTH to HTTP_AUTH_RETRY
 - http: Avoid limit of retrying request only twice
 - http: handle proxy authentication failure (error 407)
 - http: handle proxy proactive authentication
 - http: try http_proxy env var when http.proxy config option is not set

The code to talk to http proxies learn to use the same credential
API used to talk to the final http destinations.  This still needs
to peek into $ENV{HTTPS_PROXY}.

* mb/fetch-call-a-non-branch-a-ref (2012-04-11) 1 commit
 - fetch: Only call a new ref a "branch" if it's under refs/heads/.

* mh/ref-api (2012-04-10) 13 commits
 - do_for_each_ref(): only iterate over the subtree that was requested
 - refs: store references hierarchically
 - sort_ref_dir(): simplify logic
 - refs.c: rename ref_array -> ref_dir
 - struct ref_entry: nest the value part in a union
 - check_refname_component(): return 0 for zero-length components
 - free_ref_entry(): new function
 - names_conflict(): simplify implementation
 - repack_without_ref(): reimplement using do_for_each_ref_in_array()
 - do_for_each_ref_in_arrays(): new function
 - do_for_each_ref_in_array(): new function
 - refs: manage current_ref within do_one_ref()
 - refs.c: reorder definitions more logically

Allows walking only a sub-hierarchy in refs/*.

Will merge to 'next'.

* jc/maint-blame-minimal (2012-04-11) 1 commit
 - blame: accept --need-minimal

"git blame" started missing quite a few changes from the origin since we
stopped using the diff minimalization by default in v1.7.2 era.

Will merge to 'next'.

* jk/repack-no-explode-objects-from-old-pack (2012-04-11) 1 commit
  (merged to 'next' on 2012-04-15 at 7586e50)
 + gc: do not explode objects which will be immediately pruned

* ld/git-p4-tags-and-labels (2012-04-11) 2 commits
  (merged to 'next' on 2012-04-15 at 1b1e9a1)
 + git p4: import/export of labels to/from p4
 + git p4: Fixing script editor checks
 (this branch uses pw/git-p4.)

* lt/octopus-simplify (2012-04-12) 1 commit
 - Make 'git merge' simplify parents earlier

Octopus merge strategy did not reduce heads that are recorded in the final
commit.  This was done off-list.

I think some of the remaining remote_heads that haven't converted to the
new reduced parents need to be carefully looked at.

* nh/empty-rebase (2012-04-11) 3 commits
 - git-cherry-pick: add test to validate new options
 - git-cherry-pick: add --keep-redundant-commits option
 - git-cherry-pick: add allow-empty option

Waiting for a reroll.

* sl/test-wc-l-line-count (2012-04-11) 1 commit
  (merged to 'next' on 2012-04-15 at 40797d9)
 + tests: modernise style: more uses of test_line_count

* zj/upstream-error-message (2012-04-15) 5 commits
 - i18n: mark @{upstream} error messages for translation
 - Be more specific if upstream branch is not tracked
 - Provide better message for barnhc_wiht_tpyo@{u}
 - Provide branch name in error message when using @{u}
 - t1507: add tests to document @{upstream} behaviour

Rerolled.

* fc/completion-tests (2012-04-15) 6 commits
 - completion: fix completion after 'git --option <TAB>'
 - completion: avoid trailing space for --exec-path
 - completion: add missing general options
 - completion: simplify by using $prev
 - completion: simplify __gitcomp_1
 - tests: add initial bash completion tests

* jh/apply-free-patch (2012-04-11) 9 commits
  (merged to 'next' on 2012-04-15 at 8cccf57)
 + apply: document buffer ownership rules across functions
 + apply: tighten constness of line buffer
 + apply: drop unused macro
 + apply: free unused fragments for submodule patch
 + apply: free patch->result
 + apply: release memory for fn_table
 + apply: free patch->{def,old,new}_name fields
 + apply: rename free_patch() to free_patch_list()
 + apply: do not leak patches and fragments

Valgrind reports quite a lot of discarded memory inside apply.

* nd/threaded-index-pack (2012-04-11) 3 commits
 - index-pack: support multithreaded delta resolving
 - index-pack: split second pass obj handling into own function
 - compat/win32/pthread.h: Add an pthread_key_delete() implementation

* bw/submodule-sed-solaris (2012-04-09) 1 commit
  (merged to 'next' on 2012-04-12 at 3bf1d83)
 + Avoid bug in Solaris xpg4/sed as used in submodule

* cb/http-multi-curl-auth (2012-04-14) 4 commits
 - http: use newer curl options for setting credentials
 - http: clean up leak in init_curl_http_auth
 - fix http auth with multiple curl handles
 - http auth fails with multiple curl handles

Fixes http authentication breakage when we keep multiple HTTP requests in
flight using curl-multi.

Will merge to 'next'.

* jk/rebase-i-submodule-conflict-only (2012-04-09) 1 commit
  (merged to 'next' on 2012-04-15 at 94367a8)
 + rebase -i continue: don't skip commits that only change submodules

Giving "--continue" to a conflicted "rebase -i" session skipped a commit
that only results in changes to submodules.

* ms/remote-usage-string (2012-04-09) 1 commit
  (merged to 'next' on 2012-04-15 at 704be8f)
 + remote: update builtin usage

As an independent follow-up, we may want to rethink how the overall usage
string and subcommand usage strings are maintained.

* pw/fast-import-dataref-parsing (2012-04-10) 1 commit
 - fast-import: tighten parsing of datarefs

Will merge to 'next'.

* pw/git-p4 (2012-04-09) 3 commits
  (merged to 'next' on 2012-04-15 at 81ea41a)
 + git p4: use "git p4" directly in tests
 + git p4: update name in script
 + git-p4: move to toplevel
 (this branch is used by ld/git-p4-tags-and-labels.)

* rl/show-empty-prefix (2012-04-10) 1 commit
  (merged to 'next' on 2012-04-15 at b2e5938)
 + rev-parse --show-prefix: add in trailing newline

* tr/xdiff-fast-hash (2012-04-09) 1 commit
 - xdiff: load full words in the inner loop of xdl_hash_record

Will merge to 'next'.

* jc/index-v4 (2012-04-04) 10 commits
 - update-index: upgrade/downgrade on-disk index version
 - read-cache.c: write prefix-compressed names in the index
 - read-cache.c: read prefix-compressed names in index on-disk version v4
 - read-cache.c: move code to copy incore to ondisk cache to a helper function
 - read-cache.c: move code to copy ondisk to incore cache to a helper function
 - read-cache.c: report the header version we do not understand
 - read-cache.c: make create_from_disk() report number of bytes it consumed
 - read-cache.c: allow unaligned mapping of the index file
 - cache.h: hide on-disk index details
 - varint: make it available outside the context of pack
 (this branch is tangled with jc/split-blob.)

Trivially shrinks the on-disk size of the index file to save both I/O and
checksum overhead.  The "v4" format represented here may not be what we
eventually want to have, but the preparatory refactoring steps and the way
how backward compatibility is retained should give plenty to learn to GSoC
student-hopefuls.

Will merge to 'next', if nobody objects.

* jk/add-p-skip-conflicts (2012-04-05) 1 commit
  (merged to 'next' on 2012-04-12 at e65ceb1)
 + add--interactive: ignore unmerged entries in patch mode

Excludes conflicted paths from "add -p" processing, as it is not prepared
to handle them.

* bw/spawn-via-shell-path (2012-04-03) 1 commit
  (merged to 'next' on 2012-04-12 at 0ff833b)
 + Use SHELL_PATH from build system in run_command.c:prepare_shell_cmd

"sh" on the user's PATH may be utterly broken on some systems;
consistently use SHELL_PATH even from inside run-command API.

* jc/commit-unedited-template (2012-04-03) 5 commits
  (merged to 'next' on 2012-04-12 at a2e153b)
 + Documentation/git-commit: rephrase the "initial-ness" of templates
 + git-commit.txt: clarify -t requires editing message
 + commit: rephrase the error when user did not touch templated log message
 + commit: do not trigger bogus "has templated message edited" check
 + t7501: test the right kind of breakage

When "git commit --template F" errors out because the user did not touch
the message, it claimed that it aborts due to "empty message", which was
utterly wrong.

* jc/push-upstream-sanity (2012-04-05) 1 commit
  (merged to 'next' on 2012-04-12 at 288e1ad)
 + push: error out when the "upstream" semantics does not make sense

Fix broken 'push to upstream' implementation.  "git push $there" without
refspec, when the current branch is set to push to a remote different from
$there, used to push to $there using the upstream information to a remote
unreleated to $there.

* jk/http-backend-keep-committer-ident-env (2012-03-30) 1 commit
  (merged to 'next' on 2012-04-12 at b2d0136)
 + http-backend: respect existing GIT_COMMITTER_* variables

The smart-http backend used to always override GIT_COMMITTER_* variables
with REMOTE_USER and REMOTE_ADDR.

* mk/gitweb-diff-hl (2012-04-11) 8 commits
 - gitweb: Refinement highlightning in combined diffs
 - gitweb: Highlight interesting parts of diff
 - gitweb: Push formatting diff lines to print_diff_chunk()
 - gitweb: Use print_diff_chunk() for both side-by-side and inline diffs
 - gitweb: Extract print_sidebyside_diff_lines()
 - gitweb: Pass esc_html_hl_regions() options to esc_html()
 - gitweb: esc_html_hl_regions(): Don't create empty <span> elements
 - gitweb: Use descriptive names in esc_html_hl_regions()

Will merge to 'next'.

* it/fetch-pack-many-refs (2012-04-10) 4 commits
 - remote-curl: main test case for the OS command line overflow
 - fetch-pack: test cases for the new --stdin option
 - remote-curl: send the refs to fetch-pack on stdin
 - fetch-pack: new --stdin option to read refs from stdin

Will merge to 'next'.

* jn/debian-customizes-default-editor (2012-04-10) 2 commits
  (merged to 'next' on 2012-04-15 at 0fc85c3)
 + var doc: advertise current DEFAULT_PAGER and DEFAULT_EDITOR settings
 + var doc: default editor and pager are configurable at build time

* rs/commit-list-sort-in-batch (2012-04-11) 3 commits
  (merged to 'next' on 2012-04-15 at 39fe527)
 + revision: insert unsorted, then sort in prepare_revision_walk()
 + commit: use mergesort() in commit_list_sort_by_date()
 + add mergesort() for linked lists

* hv/submodule-recurse-push (2012-03-30) 3 commits
 - push: teach --recurse-submodules the on-demand option
 - Refactor submodule push check to use string list instead of integer
 - Teach revision walking machinery to walk multiple times sequencially

Will merge to 'next'.

* jk/branch-quiet (2012-03-26) 2 commits
  (merged to 'next' on 2012-04-12 at 7d0a438)
 + teach "git branch" a --quiet option
 + checkout: suppress tracking message with "-q"

Even with "-q"uiet option, "checkout" used to report setting up tracking.
Also "branch" learns "-q"uiet option to squelch informational message.

* jk/run-command-eacces (2012-04-05) 2 commits
  (merged to 'next' on 2012-04-12 at ef3782e)
 + run-command: treat inaccessible directories as ENOENT
 + compat/mingw.[ch]: Change return type of exec functions to int

When PATH contains an unreadable directory, alias expansion code did not
kick in, and failed with an error that said "git-subcmd" was not found.

* jb/am-include (2012-03-28) 1 commit
  (merged to 'next' on 2012-04-12 at ddbf96d)
 + am: support --include option

* jc/am-report-3way (2012-03-28) 1 commit
  (merged to 'next' on 2012-04-12 at cf5d599)
 + am -3: list the paths that needed 3-way fallback

* rs/combine-diff-zero-context-at-the-beginning (2012-03-25) 1 commit
  (merged to 'next' on 2012-04-12 at b4d92e3)
 + combine-diff: fix loop index underflow

Fixes an age old corner case bug in combine diff (only triggered with -U0
and the hunk at the beginning of the file needs to be shown).

* sl/autoconf (2012-03-26) 3 commits
  (merged to 'next' on 2012-04-12 at 68f346d)
 + configure: be more idiomatic
 + configure: avoid some code repetitions thanks to m4_{push,pop}def
 + configure: move definitions of private m4 macros before AC_INIT invocation

Updates our configure.ac to follow a better "autoconf" style.

* wk/gitweb-snapshot-use-if-modified-since (2012-03-30) 3 commits
  (merged to 'next' on 2012-04-12 at 611d318)
 + gitweb: add If-Modified-Since handling to git_snapshot().
 + gitweb: refactor If-Modified-Since handling
 + gitweb: add `status` headers to git_feed() responses.

Makes 'snapshot' request to "gitweb" honor If-Modified-Since: header,
based on the commit date.

* jk/diff-no-rename-empty (2012-03-23) 4 commits
  (merged to 'next' on 2012-04-12 at d1d95c5)
 + merge-recursive: don't detect renames of empty files
 + teach diffcore-rename to optionally ignore empty content
 + make is_empty_blob_sha1 available everywhere
 + drop casts from users EMPTY_TREE_SHA1_BIN

Forbids rename detection logic from matching two empty files as renames
during merge-recursive to prevent mismerges.

* th/difftool-diffall (2012-04-14) 8 commits
 - difftool: print list of valid tools with '--tool-help'
 - difftool: teach difftool to handle directory diffs
 - difftool: eliminate setup_environment function
 - difftool: stop appending '.exe' to git
 - difftool: remove explicit change of PATH
 - difftool: exit(0) when usage is printed
 - difftool: add '--no-gui' option
 - difftool: parse options using Getopt::Long

Rolls the two-directory-diff logic from diffall script (in contrib/) into
"git difftool" framework. 

Still being reworked.

* jc/maint-clean-nested-worktree-in-subdir (2012-03-15) 1 commit
  (merged to 'next' on 2012-04-12 at 280a6e5)
 + clean: preserve nested git worktree in subdirectories

Originally merged to 'next' on 2012-03-20

"git clean -d -f" (not "-d -f -f") is supposed to protect nested working
trees of independent git repositories that exist in the current project
working tree from getting removed, but the protection applied only to such
working trees that are at the top-level of the current project by mistake.

Will merge to 'master'.

* ct/advise-push-default (2012-04-12) 3 commits
  (merged to 'next' on 2012-04-12 at b0613cd)
 + Fix httpd tests that broke when non-ff push advice changed
 + clean up struct ref's nonfastforward field
 + push: Provide situational hints for non-fast-forward errors

Breaks down the cases in which "git push" fails due to non-ff into three
categories, and gives separate advise messages.  This should be a good
change regardless of mm/push-default-switch-warning topic.

* nl/rebase-i-cheat-sheet (2012-03-20) 1 commit
  (merged to 'next' on 2012-04-12 at cd76fcb)
 + rebase -i: remind that the lines are top-to-bottom

Originally merged to 'next' on 2012-03-20

Will merge to 'master'.

* jc/run-hook-env-1 (2012-03-11) 1 commit
 - run_hook(): enhance the interface to pass arbitrary environment

Not urgent.

Updates run_hook() API to be much less specific to "commit".  It would
only be useful if people start doing more interesting things with hooks.

* rs/unpack-trees-leakfix (2012-04-10) 2 commits
  (merged to 'next' on 2012-04-12 at 6958b54)
 + unpack-trees: plug minor memory leak
 + unpack-trees: don't perform any index operation if we're not merging

Originally merged to 'next' on 2012-03-07

Will merge to 'master'.

* mm/push-default-switch-warning (2012-04-15) 2 commits
 - t5570: use explicit push refspec
 - push: start warning upcoming default change for push.default

This resurrects an ancient patch I wrote during a discussion we had in the
1.6.3-1.6.4 era.  This should probably come after ct/advise-push-default
topic and at that point the advise messages need to be rephrased, taking
the future default change into account.

* jc/fmt-merge-msg-people (2012-03-13) 1 commit
  (merged to 'next' on 2012-04-12 at 4c2031c)
 + fmt-merge-msg: show those involved in a merged series

The "fmt-merge-msg" command learns to list the primary contributors
involved in the side topic you are merging.

^ permalink raw reply	[flat|nested] 19+ messages in thread

* Re: What's cooking in git.git (Apr 2012, #06; Sun, 15)
  2012-04-16  9:07 ` Nelson Benitez Leon
@ 2012-04-16  8:20   ` Junio C Hamano
  2012-04-16 11:24     ` Nelson Benitez Leon
  0 siblings, 1 reply; 19+ messages in thread
From: Junio C Hamano @ 2012-04-16  8:20 UTC (permalink / raw)
  To: Nelson Benitez Leon; +Cc: git

Nelson Benitez Leon <nelsonjesus.benitez@seap.minhap.es> writes:

> On 04/16/2012 08:44 AM, Junio C Hamano wrote:
>>
>> * nl/http-proxy-more (2012-04-14) 6 commits
>>  - http: fix proxy authentication
>>  - http: rename HTTP_REAUTH to HTTP_AUTH_RETRY
>>  - http: Avoid limit of retrying request only twice
>>  - http: handle proxy authentication failure (error 407)
>>  - http: handle proxy proactive authentication
>>  - http: try http_proxy env var when http.proxy config option is not set
>> 
>> The code to talk to http proxies learn to use the same credential
>> API used to talk to the final http destinations.  This still needs
>> to peek into $ENV{HTTPS_PROXY}.
>
> Hi Junio, so this needs some more work, but I don't recall the thread 
> about it, could you point it to me or explain me what is still lacking.

I am reasonably sure that all the messages on the thread Peff and I worked
out the fix-up at the tip of the series shown above were Cc'ed to you.

^ permalink raw reply	[flat|nested] 19+ messages in thread

* Re: What's cooking in git.git (Apr 2012, #06; Sun, 15)
  2012-04-16  6:44 What's cooking in git.git (Apr 2012, #06; Sun, 15) Junio C Hamano
@ 2012-04-16  9:07 ` Nelson Benitez Leon
  2012-04-16  8:20   ` Junio C Hamano
  2012-04-18  7:15 ` Johannes Sixt
  1 sibling, 1 reply; 19+ messages in thread
From: Nelson Benitez Leon @ 2012-04-16  9:07 UTC (permalink / raw)
  To: Junio C Hamano; +Cc: git

On 04/16/2012 08:44 AM, Junio C Hamano wrote:
>
> * nl/http-proxy-more (2012-04-14) 6 commits
>  - http: fix proxy authentication
>  - http: rename HTTP_REAUTH to HTTP_AUTH_RETRY
>  - http: Avoid limit of retrying request only twice
>  - http: handle proxy authentication failure (error 407)
>  - http: handle proxy proactive authentication
>  - http: try http_proxy env var when http.proxy config option is not set
> 
> The code to talk to http proxies learn to use the same credential
> API used to talk to the final http destinations.  This still needs
> to peek into $ENV{HTTPS_PROXY}.

Hi Junio, so this needs some more work, but I don't recall the thread 
about it, could you point it to me or explain me what is still lacking.

Regards, 

^ permalink raw reply	[flat|nested] 19+ messages in thread

* Re: What's cooking in git.git (Apr 2012, #06; Sun, 15)
  2012-04-16  8:20   ` Junio C Hamano
@ 2012-04-16 11:24     ` Nelson Benitez Leon
  2012-04-16 15:03       ` Junio C Hamano
  0 siblings, 1 reply; 19+ messages in thread
From: Nelson Benitez Leon @ 2012-04-16 11:24 UTC (permalink / raw)
  To: Junio C Hamano; +Cc: git

On 04/16/2012 10:20 AM, Junio C Hamano wrote:
> Nelson Benitez Leon <nelsonjesus.benitez@seap.minhap.es> writes:
> 
>> On 04/16/2012 08:44 AM, Junio C Hamano wrote:
>>>
>>> * nl/http-proxy-more (2012-04-14) 6 commits
>>>  - http: fix proxy authentication
>>>  - http: rename HTTP_REAUTH to HTTP_AUTH_RETRY
>>>  - http: Avoid limit of retrying request only twice
>>>  - http: handle proxy authentication failure (error 407)
>>>  - http: handle proxy proactive authentication
>>>  - http: try http_proxy env var when http.proxy config option is not set
>>>
>>> The code to talk to http proxies learn to use the same credential
>>> API used to talk to the final http destinations.  This still needs
>>> to peek into $ENV{HTTPS_PROXY}.
>>
>> Hi Junio, so this needs some more work, but I don't recall the thread 
>> about it, could you point it to me or explain me what is still lacking.
> 
> I am reasonably sure that all the messages on the thread Peff and I worked
> out the fix-up at the tip of the series shown above were Cc'ed to you.

Ok, I've been offline for a week, I already found the thread and I'm
going through it.

^ permalink raw reply	[flat|nested] 19+ messages in thread

* Re: What's cooking in git.git (Apr 2012, #06; Sun, 15)
  2012-04-16 11:24     ` Nelson Benitez Leon
@ 2012-04-16 15:03       ` Junio C Hamano
  0 siblings, 0 replies; 19+ messages in thread
From: Junio C Hamano @ 2012-04-16 15:03 UTC (permalink / raw)
  To: Nelson Benitez Leon; +Cc: git

Nelson Benitez Leon <nelsonjesus.benitez@seap.minhap.es> writes:

> Ok, I've been offline for a week, I already found the thread and I'm
> going through it.

Thanks.

^ permalink raw reply	[flat|nested] 19+ messages in thread

* Re: What's cooking in git.git (Apr 2012, #06; Sun, 15)
  2012-04-16  6:44 What's cooking in git.git (Apr 2012, #06; Sun, 15) Junio C Hamano
  2012-04-16  9:07 ` Nelson Benitez Leon
@ 2012-04-18  7:15 ` Johannes Sixt
  2012-04-18 19:53   ` Ramsay Jones
  1 sibling, 1 reply; 19+ messages in thread
From: Johannes Sixt @ 2012-04-18  7:15 UTC (permalink / raw)
  To: Nguyễn Thái Ngọc Duy; +Cc: Junio C Hamano, Git Mailing List

Am 4/16/2012 8:44, schrieb Junio C Hamano:
> * nd/threaded-index-pack (2012-04-11) 3 commits
>  - index-pack: support multithreaded delta resolving
>  - index-pack: split second pass obj handling into own function
>  - compat/win32/pthread.h: Add an pthread_key_delete() implementation

With this series, t9300.92 (fast-import, Q: verify pack) consistently
fails for me on Windows.

I'll have to see when I can dig deeper into this topic...

-- Hannes

^ permalink raw reply	[flat|nested] 19+ messages in thread

* Re: What's cooking in git.git (Apr 2012, #06; Sun, 15)
  2012-04-18  7:15 ` Johannes Sixt
@ 2012-04-18 19:53   ` Ramsay Jones
  2012-04-19  6:16     ` Johannes Sixt
  0 siblings, 1 reply; 19+ messages in thread
From: Ramsay Jones @ 2012-04-18 19:53 UTC (permalink / raw)
  To: Johannes Sixt
  Cc: Nguyễn Thái Ngọc Duy, Junio C Hamano, Git Mailing List

Johannes Sixt wrote:
> Am 4/16/2012 8:44, schrieb Junio C Hamano:
>> * nd/threaded-index-pack (2012-04-11) 3 commits
>>  - index-pack: support multithreaded delta resolving
>>  - index-pack: split second pass obj handling into own function
>>  - compat/win32/pthread.h: Add an pthread_key_delete() implementation
> 
> With this series, t9300.92 (fast-import, Q: verify pack) consistently
> fails for me on Windows.
> 
> I'll have to see when I can dig deeper into this topic...

Hmm, this works just fine for me.

[I know that doesn't help you much :(, but it at least provides another
data-point.]

With the exception of t9300.62 (a fix for which I have already sent to
the list), all of the following tests pass:

    t/t5300-pack-object.sh
    t/t5301-sliding-window.sh
    t/t5302-pack-index.sh
    t/t5303-pack-corruption-resilience.sh
    t/t5510-fetch.sh
    t/t6050-replace.sh
    t/t7700-repack.sh
    t/t7701-repack-unpack-unreachable.sh
    t/t9300-fast-import.sh

Just to be clear, I have to apply a patch (given below) to pu in order to
do any meaningful testing. This patch is the one I had ready to send to the
list to fix the SHELL_PATH breakage, but you beat me to the punch! :-P
(Also, your commit message was *much* better than mine!)

[my MinGW was installed from msysGit-fullinstall-1.7.4-preview20110204.exe
on Windows XP SP3]

ATB,
Ramsay Jones

--- >8 ---
diff --git a/run-command.c b/run-command.c
index 5be1b4b..53a081b 100644
--- a/run-command.c
+++ b/run-command.c
@@ -4,7 +4,10 @@
 #include "sigchain.h"
 #include "argv-array.h"
 
-#ifndef SHELL_PATH
+#if defined(WIN32)
+# undef SHELL_PATH
+# define SHELL_PATH "sh"
+#elif !defined(SHELL_PATH)
 # define SHELL_PATH "/bin/sh"
 #endif
 
--- 8< ---

^ permalink raw reply related	[flat|nested] 19+ messages in thread

* Re: What's cooking in git.git (Apr 2012, #06; Sun, 15)
  2012-04-18 19:53   ` Ramsay Jones
@ 2012-04-19  6:16     ` Johannes Sixt
  2012-04-19  6:45       ` Johannes Sixt
  0 siblings, 1 reply; 19+ messages in thread
From: Johannes Sixt @ 2012-04-19  6:16 UTC (permalink / raw)
  To: Ramsay Jones, Nguyễn Thái Ngọc Duy
  Cc: Junio C Hamano, Git Mailing List

Am 4/18/2012 21:53, schrieb Ramsay Jones:
> Johannes Sixt wrote:
>> Am 4/16/2012 8:44, schrieb Junio C Hamano:
>>> * nd/threaded-index-pack (2012-04-11) 3 commits
>>>  - index-pack: support multithreaded delta resolving
>>>  - index-pack: split second pass obj handling into own function
>>>  - compat/win32/pthread.h: Add an pthread_key_delete() implementation
>>
>> With this series, t9300.92 (fast-import, Q: verify pack) consistently
>> fails for me on Windows.
>>
>> I'll have to see when I can dig deeper into this topic...
> 
> Hmm, this works just fine for me.

It's a Heisenbug. I see different failure modes:

error: inflate: data stream error (incorrect header check)
fatal: serious inflate inconsistency

fatal: premature end of pack file, 79 bytes missing

fatal: premature end of pack file, 72 bytes missing

(and I even saw successful runs). It's always the same pack,
pack-54fa663f5ec35*.pack. But running index-pack --verify manually does
not fail. The packs look good because the installed index-pack (which was
built without this topic) does not report an error, either.

Any clues?

-- Hannes

^ permalink raw reply	[flat|nested] 19+ messages in thread

* Re: What's cooking in git.git (Apr 2012, #06; Sun, 15)
  2012-04-19  6:16     ` Johannes Sixt
@ 2012-04-19  6:45       ` Johannes Sixt
  2012-04-19  7:02         ` Nguyen Thai Ngoc Duy
  2012-04-19  9:36         ` Nguyen Thai Ngoc Duy
  0 siblings, 2 replies; 19+ messages in thread
From: Johannes Sixt @ 2012-04-19  6:45 UTC (permalink / raw)
  To: Nguyễn Thái Ngọc Duy
  Cc: Johannes Sixt, Ramsay Jones, Junio C Hamano, Git Mailing List

Am 4/19/2012 8:16, schrieb Johannes Sixt:
> Am 4/18/2012 21:53, schrieb Ramsay Jones:
>> Johannes Sixt wrote:
>>> Am 4/16/2012 8:44, schrieb Junio C Hamano:
>>>> * nd/threaded-index-pack (2012-04-11) 3 commits
>>>>  - index-pack: support multithreaded delta resolving
>>>>  - index-pack: split second pass obj handling into own function
>>>>  - compat/win32/pthread.h: Add an pthread_key_delete() implementation
>>>
>>> With this series, t9300.92 (fast-import, Q: verify pack) consistently
>>> fails for me on Windows.
>>>
>>> I'll have to see when I can dig deeper into this topic...
>>
>> Hmm, this works just fine for me.
> 
> It's a Heisenbug. I see different failure modes:
> 
> error: inflate: data stream error (incorrect header check)
> fatal: serious inflate inconsistency
> 
> fatal: premature end of pack file, 79 bytes missing
> 
> fatal: premature end of pack file, 72 bytes missing
> 
> (and I even saw successful runs). It's always the same pack,
> pack-54fa663f5ec35*.pack. But running index-pack --verify manually does
> not fail. The packs look good because the installed index-pack (which was
> built without this topic) does not report an error, either.

Here's one backtrace:

#0  error (err=0x55f6e6 "inflate: %s (%s)") at usage.c:122
#1  0x004ba96d in git_inflate (strm=0x12afdb8, flush=0) at zlib.c:144
#2  0x00434823 in get_data_from_pack (obj=0xd82608)
    at builtin/index-pack.c:486
#3  0x00434f6e in resolve_delta (delta_obj=0xd82608, base=0xd891e0,
    result=0x12b01f0) at builtin/index-pack.c:687
#4  0x0043528a in find_unresolved_deltas_1 (base=0xd891e0, prev_base=0x0)
    at builtin/index-pack.c:743
#5  0x004352ee in find_unresolved_deltas (base=0xd891e0)
    at builtin/index-pack.c:759
#6  0x004353cd in second_pass (obj=0xd81bc0) at builtin/index-pack.c:798
#7  0x004354c4 in threaded_second_pass (arg=0xd811e8)
    at builtin/index-pack.c:821
#8  0x00505200 in win32_start_routine (arg=0xd811e8)
    at compat/win32/pthread.c:20
#9  ...

I don't see any mutual exclusion happening in this chain. Perhaps it is
not needed, provided that the pread() call in get_data_from_pack is
atomic. But our git_pread() from compat/pread.c, which we use on Windows,
is not atomic.

:-(

I don't think that it is possible to make git_pread() atomic because it
would have to be protected against all file accesses that can modify the
file position.

Is get_data_from_pack() the only function that accesses the pack data?
Then we could add some mutual exclusion there.

-- Hannes

^ permalink raw reply	[flat|nested] 19+ messages in thread

* Re: What's cooking in git.git (Apr 2012, #06; Sun, 15)
  2012-04-19  6:45       ` Johannes Sixt
@ 2012-04-19  7:02         ` Nguyen Thai Ngoc Duy
  2012-04-19  9:36         ` Nguyen Thai Ngoc Duy
  1 sibling, 0 replies; 19+ messages in thread
From: Nguyen Thai Ngoc Duy @ 2012-04-19  7:02 UTC (permalink / raw)
  To: Johannes Sixt; +Cc: Ramsay Jones, Junio C Hamano, Git Mailing List

Hi,

I've been busy and have not had time to look into this yet...

2012/4/19 Johannes Sixt <j.sixt@viscovery.net>:
> I don't see any mutual exclusion happening in this chain. Perhaps it is
> not needed, provided that the pread() call in get_data_from_pack is
> atomic. But our git_pread() from compat/pread.c, which we use on Windows,
> is not atomic.
>
> :-(
>
> I don't think that it is possible to make git_pread() atomic because it
> would have to be protected against all file accesses that can modify the
> file position.
>
> Is get_data_from_pack() the only function that accesses the pack data?
> Then we could add some mutual exclusion there.

I believe so. And index-pack only accesses the pack via pread, no other means.
-- 
Duy

^ permalink raw reply	[flat|nested] 19+ messages in thread

* Re: What's cooking in git.git (Apr 2012, #06; Sun, 15)
  2012-04-19  6:45       ` Johannes Sixt
  2012-04-19  7:02         ` Nguyen Thai Ngoc Duy
@ 2012-04-19  9:36         ` Nguyen Thai Ngoc Duy
  2012-04-19 12:58           ` Erik Faye-Lund
  1 sibling, 1 reply; 19+ messages in thread
From: Nguyen Thai Ngoc Duy @ 2012-04-19  9:36 UTC (permalink / raw)
  To: Johannes Sixt; +Cc: Ramsay Jones, Junio C Hamano, Git Mailing List

On Thu, Apr 19, 2012 at 08:45:52AM +0200, Johannes Sixt wrote:
> I don't see any mutual exclusion happening in this chain. Perhaps it is
> not needed, provided that the pread() call in get_data_from_pack is
> atomic. But our git_pread() from compat/pread.c, which we use on Windows,
> is not atomic.

OK assume it's Windows' pread thread-safe problem (it does look like
so given how pread.c implements it), maybe this patch will help:

-- 8< --
diff --git a/builtin/index-pack.c b/builtin/index-pack.c
index 847dbb3..5d539cd 100644
--- a/builtin/index-pack.c
+++ b/builtin/index-pack.c
@@ -102,6 +102,10 @@ static pthread_mutex_t work_mutex;
 #define work_lock()		lock_mutex(&work_mutex)
 #define work_unlock()		unlock_mutex(&work_mutex)
 
+#ifdef WIN32
+static pthread_mutex_t pread_mutex;
+#endif
+
 static pthread_key_t key;
 
 static inline void lock_mutex(pthread_mutex_t *mutex)
@@ -124,6 +128,9 @@ static void init_thread(void)
 	init_recursive_mutex(&read_mutex);
 	pthread_mutex_init(&counter_mutex, NULL);
 	pthread_mutex_init(&work_mutex, NULL);
+#ifdef WIN32
+	pthread_mutex_init(&pread_mutex, NULL);
+#endif
 	pthread_key_create(&key, NULL);
 	thread_data = xcalloc(nr_threads, sizeof(*thread_data));
 	threads_active = 1;
@@ -137,6 +144,9 @@ static void cleanup_thread(void)
 	pthread_mutex_destroy(&read_mutex);
 	pthread_mutex_destroy(&counter_mutex);
 	pthread_mutex_destroy(&work_mutex);
+#ifdef WIN32
+	pthread_mutex_destroy(&pread_mutex);
+#endif
 	pthread_key_delete(key);
 	free(thread_data);
 }
@@ -456,6 +466,20 @@ static void *unpack_raw_entry(struct object_entry *obj, union delta_base *delta_
 	return data;
 }
 
+#ifdef WIN32
+/* pread is reimplemented in compat/pread.c and is not thread-safe */
+static ssize_t pread_threadsafe(int fd, void *buf, size_t count, off_t from)
+{
+	ssize_t n;
+	lock_mutex(&pread_mutex);
+	n = pread(fd, buf, count, from);
+	unlock_mutex(&pread_mutex);
+	return n;
+}
+#else
+#define pread_threadsafe(fd,buf,count,from) pread(fd, buf, count, from)
+#endif
+
 static void *get_data_from_pack(struct object_entry *obj)
 {
 	off_t from = obj[0].idx.offset + obj[0].hdr_size;
@@ -474,7 +498,7 @@ static void *get_data_from_pack(struct object_entry *obj)
 
 	do {
 		ssize_t n = (len < 64*1024) ? len : 64*1024;
-		n = pread(pack_fd, inbuf, n, from);
+		n = pread_threadsafe(pack_fd, inbuf, n, from);
 		if (n < 0)
 			die_errno("cannot pread pack file");
 		if (!n)
-- 8< --

^ permalink raw reply related	[flat|nested] 19+ messages in thread

* Re: What's cooking in git.git (Apr 2012, #06; Sun, 15)
  2012-04-19  9:36         ` Nguyen Thai Ngoc Duy
@ 2012-04-19 12:58           ` Erik Faye-Lund
  2012-04-19 13:18             ` Nguyen Thai Ngoc Duy
  0 siblings, 1 reply; 19+ messages in thread
From: Erik Faye-Lund @ 2012-04-19 12:58 UTC (permalink / raw)
  To: Nguyen Thai Ngoc Duy
  Cc: Johannes Sixt, Ramsay Jones, Junio C Hamano, Git Mailing List

On Thu, Apr 19, 2012 at 11:36 AM, Nguyen Thai Ngoc Duy
<pclouds@gmail.com> wrote:
> On Thu, Apr 19, 2012 at 08:45:52AM +0200, Johannes Sixt wrote:
>> I don't see any mutual exclusion happening in this chain. Perhaps it is
>> not needed, provided that the pread() call in get_data_from_pack is
>> atomic. But our git_pread() from compat/pread.c, which we use on Windows,
>> is not atomic.
>
> OK assume it's Windows' pread thread-safe problem (it does look like
> so given how pread.c implements it), maybe this patch will help:
>
> -- 8< --
> diff --git a/builtin/index-pack.c b/builtin/index-pack.c
> index 847dbb3..5d539cd 100644
> --- a/builtin/index-pack.c
> +++ b/builtin/index-pack.c
> @@ -102,6 +102,10 @@ static pthread_mutex_t work_mutex;
>  #define work_lock()            lock_mutex(&work_mutex)
>  #define work_unlock()          unlock_mutex(&work_mutex)
>
> +#ifdef WIN32
> +static pthread_mutex_t pread_mutex;
> +#endif
> +
>  static pthread_key_t key;
>
>  static inline void lock_mutex(pthread_mutex_t *mutex)
> @@ -124,6 +128,9 @@ static void init_thread(void)
>        init_recursive_mutex(&read_mutex);
>        pthread_mutex_init(&counter_mutex, NULL);
>        pthread_mutex_init(&work_mutex, NULL);
> +#ifdef WIN32
> +       pthread_mutex_init(&pread_mutex, NULL);
> +#endif
>        pthread_key_create(&key, NULL);
>        thread_data = xcalloc(nr_threads, sizeof(*thread_data));
>        threads_active = 1;
> @@ -137,6 +144,9 @@ static void cleanup_thread(void)
>        pthread_mutex_destroy(&read_mutex);
>        pthread_mutex_destroy(&counter_mutex);
>        pthread_mutex_destroy(&work_mutex);
> +#ifdef WIN32
> +       pthread_mutex_destroy(&pread_mutex);
> +#endif
>        pthread_key_delete(key);
>        free(thread_data);
>  }
> @@ -456,6 +466,20 @@ static void *unpack_raw_entry(struct object_entry *obj, union delta_base *delta_
>        return data;
>  }
>
> +#ifdef WIN32
> +/* pread is reimplemented in compat/pread.c and is not thread-safe */
> +static ssize_t pread_threadsafe(int fd, void *buf, size_t count, off_t from)
> +{
> +       ssize_t n;
> +       lock_mutex(&pread_mutex);
> +       n = pread(fd, buf, count, from);
> +       unlock_mutex(&pread_mutex);
> +       return n;
> +}
> +#else
> +#define pread_threadsafe(fd,buf,count,from) pread(fd, buf, count, from)
> +#endif
> +
>  static void *get_data_from_pack(struct object_entry *obj)
>  {
>        off_t from = obj[0].idx.offset + obj[0].hdr_size;
> @@ -474,7 +498,7 @@ static void *get_data_from_pack(struct object_entry *obj)
>
>        do {
>                ssize_t n = (len < 64*1024) ? len : 64*1024;
> -               n = pread(pack_fd, inbuf, n, from);
> +               n = pread_threadsafe(pack_fd, inbuf, n, from);
>                if (n < 0)
>                        die_errno("cannot pread pack file");
>                if (!n)
> -- 8< --

This approach has the problem that file-operations apart from pread
might (at least in theory) modify the position. To prevent that, we'd
either need to use the same locking-mechanism as the CRT use, or use
ReadFile with an OVERLAPPED struct, which allows us specify the offset
explicitly. The latter seems better to me, and should look something
like this (note: untested):

diff --git a/Makefile b/Makefile
index 2626216..31a5621 100644
--- a/Makefile
+++ b/Makefile
@@ -1153,7 +1153,6 @@ endif
 ifeq ($(uname_S),Windows)
 	GIT_VERSION := $(GIT_VERSION).MSVC
 	pathsep = ;
-	NO_PREAD = YesPlease
 	NEEDS_CRYPTO_WITH_SSL = YesPlease
 	NO_LIBGEN_H = YesPlease
 	NO_SYS_POLL_H = YesPlease
@@ -1250,7 +1249,6 @@ ifeq ($(uname_S),Minix)
 endif
 ifneq (,$(findstring MINGW,$(uname_S)))
 	pathsep = ;
-	NO_PREAD = YesPlease
 	NEEDS_CRYPTO_WITH_SSL = YesPlease
 	NO_LIBGEN_H = YesPlease
 	NO_SYS_POLL_H = YesPlease
diff --git a/compat/mingw.c b/compat/mingw.c
index 309fa1d..63783db 100644
--- a/compat/mingw.c
+++ b/compat/mingw.c
@@ -617,6 +617,28 @@ static inline void time_t_to_filetime(time_t t,
FILETIME *ft)
 	ft->dwHighDateTime = winTime >> 32;
 }

+ssize_t mingw_pread(int fd, void *buf, size_t size, off_t offset)
+{
+	OVERLAPPED overlapped = { 0 };
+	DWORD ret;
+
+	HANDLE fh = (HANDLE)_get_osfhandle(fd);
+	if (fh == INVALID_HANDLE_VALUE) {
+		errno = EBADF;
+		return -1;
+	}
+
+	overlapped.Offset = (DWORD)offset;
+	overlapped.OffsetHigh = (DWORD)(offset >> 32);
+
+	if (!ReadFile(fh, buf, size, &ret, &overlapped)) {
+		errno = err_win_to_posix(GetLastError());
+		return -1;
+	}
+
+	return ret;
+}
+
 int mingw_utime (const char *file_name, const struct utimbuf *times)
 {
 	FILETIME mft, aft;
diff --git a/compat/mingw.h b/compat/mingw.h
index c7b2cec..da47302 100644
--- a/compat/mingw.h
+++ b/compat/mingw.h
@@ -285,6 +285,9 @@ int mingw_fstat(int fd, struct stat *buf);
 #define _stati64(x,y) mingw_stat(x,y)
 #endif

+ssize_t mingw_pread(int fd, void *buf, size_t count, off_t offset);
+#define pread mingw_pread
+
 int mingw_utime(const char *file_name, const struct utimbuf *times);
 #define utime mingw_utime

^ permalink raw reply related	[flat|nested] 19+ messages in thread

* Re: What's cooking in git.git (Apr 2012, #06; Sun, 15)
  2012-04-19 12:58           ` Erik Faye-Lund
@ 2012-04-19 13:18             ` Nguyen Thai Ngoc Duy
  2012-04-19 13:31               ` Erik Faye-Lund
  0 siblings, 1 reply; 19+ messages in thread
From: Nguyen Thai Ngoc Duy @ 2012-04-19 13:18 UTC (permalink / raw)
  To: kusmabite; +Cc: Johannes Sixt, Ramsay Jones, Junio C Hamano, Git Mailing List

On Thu, Apr 19, 2012 at 7:58 PM, Erik Faye-Lund <kusmabite@gmail.com> wrote:
> This approach has the problem that file-operations apart from pread
> might (at least in theory) modify the position. To prevent that, we'd
> either need to use the same locking-mechanism as the CRT use, or use
> ReadFile with an OVERLAPPED struct, which allows us specify the offset
> explicitly. The latter seems better to me, and should look something
> like this (note: untested):

Yeah. I read about ReadFile [1] but dismissed it when I got to async
i/o mode. Reading again, sync i/o ReadFile with OVERLAPPED struct
should work fine. It's not clear though if file offset is changed
(pread man page says it does not change).

Also this approach deals with Windows only. There's still another
NO_PREAD user, HP-UX something, and NO_PREAD comment mentions cygwin
before v1.5.22. I personally don't care, just wanted to point out.

[1] http://msdn.microsoft.com/en-us/library/windows/desktop/aa365467(v=vs.85).aspx

> diff --git a/Makefile b/Makefile
> index 2626216..31a5621 100644
> --- a/Makefile
> +++ b/Makefile
> @@ -1153,7 +1153,6 @@ endif
>  ifeq ($(uname_S),Windows)
>        GIT_VERSION := $(GIT_VERSION).MSVC
>        pathsep = ;
> -       NO_PREAD = YesPlease
>        NEEDS_CRYPTO_WITH_SSL = YesPlease
>        NO_LIBGEN_H = YesPlease
>        NO_SYS_POLL_H = YesPlease
> @@ -1250,7 +1249,6 @@ ifeq ($(uname_S),Minix)
>  endif
>  ifneq (,$(findstring MINGW,$(uname_S)))
>        pathsep = ;
> -       NO_PREAD = YesPlease
>        NEEDS_CRYPTO_WITH_SSL = YesPlease
>        NO_LIBGEN_H = YesPlease
>        NO_SYS_POLL_H = YesPlease
> diff --git a/compat/mingw.c b/compat/mingw.c
> index 309fa1d..63783db 100644
> --- a/compat/mingw.c
> +++ b/compat/mingw.c
> @@ -617,6 +617,28 @@ static inline void time_t_to_filetime(time_t t,
> FILETIME *ft)
>        ft->dwHighDateTime = winTime >> 32;
>  }
>
> +ssize_t mingw_pread(int fd, void *buf, size_t size, off_t offset)
> +{
> +       OVERLAPPED overlapped = { 0 };
> +       DWORD ret;
> +
> +       HANDLE fh = (HANDLE)_get_osfhandle(fd);
> +       if (fh == INVALID_HANDLE_VALUE) {
> +               errno = EBADF;
> +               return -1;
> +       }
> +
> +       overlapped.Offset = (DWORD)offset;
> +       overlapped.OffsetHigh = (DWORD)(offset >> 32);
> +
> +       if (!ReadFile(fh, buf, size, &ret, &overlapped)) {
> +               errno = err_win_to_posix(GetLastError());
> +               return -1;
> +       }
> +
> +       return ret;
> +}
> +
>  int mingw_utime (const char *file_name, const struct utimbuf *times)
>  {
>        FILETIME mft, aft;
> diff --git a/compat/mingw.h b/compat/mingw.h
> index c7b2cec..da47302 100644
> --- a/compat/mingw.h
> +++ b/compat/mingw.h
> @@ -285,6 +285,9 @@ int mingw_fstat(int fd, struct stat *buf);
>  #define _stati64(x,y) mingw_stat(x,y)
>  #endif
>
> +ssize_t mingw_pread(int fd, void *buf, size_t count, off_t offset);
> +#define pread mingw_pread
> +
>  int mingw_utime(const char *file_name, const struct utimbuf *times);
>  #define utime mingw_utime



-- 
Duy

^ permalink raw reply	[flat|nested] 19+ messages in thread

* Re: What's cooking in git.git (Apr 2012, #06; Sun, 15)
  2012-04-19 13:18             ` Nguyen Thai Ngoc Duy
@ 2012-04-19 13:31               ` Erik Faye-Lund
  2012-04-19 13:38                 ` Nguyen Thai Ngoc Duy
  2012-04-19 13:48                 ` Johannes Sixt
  0 siblings, 2 replies; 19+ messages in thread
From: Erik Faye-Lund @ 2012-04-19 13:31 UTC (permalink / raw)
  To: Nguyen Thai Ngoc Duy
  Cc: Johannes Sixt, Ramsay Jones, Junio C Hamano, Git Mailing List

On Thu, Apr 19, 2012 at 3:18 PM, Nguyen Thai Ngoc Duy <pclouds@gmail.com> wrote:
> On Thu, Apr 19, 2012 at 7:58 PM, Erik Faye-Lund <kusmabite@gmail.com> wrote:
>> This approach has the problem that file-operations apart from pread
>> might (at least in theory) modify the position. To prevent that, we'd
>> either need to use the same locking-mechanism as the CRT use, or use
>> ReadFile with an OVERLAPPED struct, which allows us specify the offset
>> explicitly. The latter seems better to me, and should look something
>> like this (note: untested):
>
> Yeah. I read about ReadFile [1] but dismissed it when I got to async
> i/o mode. Reading again, sync i/o ReadFile with OVERLAPPED struct
> should work fine. It's not clear though if file offset is changed
> (pread man page says it does not change).
>

A quick test shows that it does not:
---8<---
$ cat test.c
#include <stdio.h>
#include <windows.h>
#include <errno.h>
#include <fcntl.h>

ssize_t mingw_pread(int fd, void *buf, size_t size, off_t offset)
{
       OVERLAPPED overlapped = { 0 };
       DWORD ret;

       HANDLE fh = (HANDLE)_get_osfhandle(fd);
       if (fh == INVALID_HANDLE_VALUE) {
               errno = EBADF;
               return -1;
       }

       overlapped.Offset = (DWORD)offset;
       overlapped.OffsetHigh = (DWORD)(offset >> 32);

       if (!ReadFile(fh, buf, size, &ret, &overlapped)) {
               /* errno = err_win_to_posix(GetLastError()); */
               return -1;
       }

       return ret;
}

int main(int argc, const char *argv[])
{
        int i, fd = open(__FILE__, O_RDONLY);
        for (i = 0; i < 2; ++i) {
                char buf[11] = {0};
                mingw_pread(fd, buf, 10, 0);
                printf("buf = '%10s'\n", buf);
        }
        return 0;
}

$ gcc test.c -o test.exe && ./test.exe
test.c: In function 'mingw_pread':
test.c:18: warning: right shift count >= width of type
buf = '#include <'
buf = '#include <'
---8<---

So this looks fine to me.

> Also this approach deals with Windows only. There's still another
> NO_PREAD user, HP-UX something, and NO_PREAD comment mentions cygwin
> before v1.5.22. I personally don't care, just wanted to point out.

Yeah. Other platforms are still an issue. You didn't address those
either in your patch, even though it would be possible to modify it to
deal with them by checking the NO_PREAD and NO_PTHREADS defines.

But they would still have the problem with the file-pointer racing for
non-pread operations. Perhaps simply disabling threading is the better
choice for these?

^ permalink raw reply	[flat|nested] 19+ messages in thread

* Re: What's cooking in git.git (Apr 2012, #06; Sun, 15)
  2012-04-19 13:31               ` Erik Faye-Lund
@ 2012-04-19 13:38                 ` Nguyen Thai Ngoc Duy
  2012-04-19 13:48                 ` Johannes Sixt
  1 sibling, 0 replies; 19+ messages in thread
From: Nguyen Thai Ngoc Duy @ 2012-04-19 13:38 UTC (permalink / raw)
  To: kusmabite; +Cc: Johannes Sixt, Ramsay Jones, Junio C Hamano, Git Mailing List

On Thu, Apr 19, 2012 at 8:31 PM, Erik Faye-Lund <kusmabite@gmail.com> wrote:
> On Thu, Apr 19, 2012 at 3:18 PM, Nguyen Thai Ngoc Duy <pclouds@gmail.com> wrote:
>> On Thu, Apr 19, 2012 at 7:58 PM, Erik Faye-Lund <kusmabite@gmail.com> wrote:
>>> This approach has the problem that file-operations apart from pread
>>> might (at least in theory) modify the position. To prevent that, we'd
>>> either need to use the same locking-mechanism as the CRT use, or use
>>> ReadFile with an OVERLAPPED struct, which allows us specify the offset
>>> explicitly. The latter seems better to me, and should look something
>>> like this (note: untested):
>>
>> Yeah. I read about ReadFile [1] but dismissed it when I got to async
>> i/o mode. Reading again, sync i/o ReadFile with OVERLAPPED struct
>> should work fine. It's not clear though if file offset is changed
>> (pread man page says it does not change).
>>
>
> A quick test shows that it does not:
> ...
>
> So this looks fine to me.

Great. We now wait for good news from Johannes then.

>> Also this approach deals with Windows only. There's still another
>> NO_PREAD user, HP-UX something, and NO_PREAD comment mentions cygwin
>> before v1.5.22. I personally don't care, just wanted to point out.
>
> Yeah. Other platforms are still an issue. You didn't address those
> either in your patch,

No I didn't. Your patch made me see that.

> even though it would be possible to modify it to
> deal with them by checking the NO_PREAD and NO_PTHREADS defines.
>
> But they would still have the problem with the file-pointer racing for
> non-pread operations. Perhaps simply disabling threading is the better
> choice for these?

That sounds like a safe choice. I'll make a patch to do that.
-- 
Duy

^ permalink raw reply	[flat|nested] 19+ messages in thread

* Re: What's cooking in git.git (Apr 2012, #06; Sun, 15)
  2012-04-19 13:31               ` Erik Faye-Lund
  2012-04-19 13:38                 ` Nguyen Thai Ngoc Duy
@ 2012-04-19 13:48                 ` Johannes Sixt
  2012-04-19 13:52                   ` Erik Faye-Lund
  1 sibling, 1 reply; 19+ messages in thread
From: Johannes Sixt @ 2012-04-19 13:48 UTC (permalink / raw)
  To: kusmabite
  Cc: Nguyen Thai Ngoc Duy, Ramsay Jones, Junio C Hamano, Git Mailing List

Am 4/19/2012 15:31, schrieb Erik Faye-Lund:
> int main(int argc, const char *argv[])
> {
>         int i, fd = open(__FILE__, O_RDONLY);
>         for (i = 0; i < 2; ++i) {
>                 char buf[11] = {0};
>                 mingw_pread(fd, buf, 10, 0);
>                 printf("buf = '%10s'\n", buf);
>         }
>         return 0;
> }

The test is flawed. It shows only that pread can read twice the same file
location. But it must not update the file pointer, whereas the
documentation of ReadFile says (quoting the paragraph that is relevant for
us):

  If hFile is not opened with FILE_FLAG_OVERLAPPED and lpOverlapped is
  not NULL, the read operation starts at the offset that is specified in
  the OVERLAPPED structure. ReadFile does not return until the read
  operation is complete, and then the system updates the file pointer.

Hence, your mingw_pread() looks like a workable solution for our purposes,
but is still not a 100% correct emulation of pread(). (Testing all this
will have to wait for another 18 hours or so.)

> Yeah. Other platforms are still an issue. You didn't address those
> either in your patch, even though it would be possible to modify it to
> deal with them by checking the NO_PREAD and NO_PTHREADS defines.
> 
> But they would still have the problem with the file-pointer racing for
> non-pread operations. Perhaps simply disabling threading is the better
> choice for these?

I think it is better to keep threading on in general, but only disable it
for index-pack. Why should existing users take a performance hit?

-- Hannes

^ permalink raw reply	[flat|nested] 19+ messages in thread

* Re: What's cooking in git.git (Apr 2012, #06; Sun, 15)
  2012-04-19 13:48                 ` Johannes Sixt
@ 2012-04-19 13:52                   ` Erik Faye-Lund
  2012-04-21  3:00                     ` Nguyen Thai Ngoc Duy
  0 siblings, 1 reply; 19+ messages in thread
From: Erik Faye-Lund @ 2012-04-19 13:52 UTC (permalink / raw)
  To: Johannes Sixt
  Cc: Nguyen Thai Ngoc Duy, Ramsay Jones, Junio C Hamano, Git Mailing List

On Thu, Apr 19, 2012 at 3:48 PM, Johannes Sixt <j.sixt@viscovery.net> wrote:
> Am 4/19/2012 15:31, schrieb Erik Faye-Lund:
>> int main(int argc, const char *argv[])
>> {
>>         int i, fd = open(__FILE__, O_RDONLY);
>>         for (i = 0; i < 2; ++i) {
>>                 char buf[11] = {0};
>>                 mingw_pread(fd, buf, 10, 0);
>>                 printf("buf = '%10s'\n", buf);
>>         }
>>         return 0;
>> }
>
> The test is flawed. It shows only that pread can read twice the same file
> location.

Oh, you are of course right. *slaps forehead*

> But it must not update the file pointer, whereas the
> documentation of ReadFile says (quoting the paragraph that is relevant for
> us):
>
>  If hFile is not opened with FILE_FLAG_OVERLAPPED and lpOverlapped is
>  not NULL, the read operation starts at the offset that is specified in
>  the OVERLAPPED structure. ReadFile does not return until the read
>  operation is complete, and then the system updates the file pointer.

Indeed. Correcting the test to first do pread and then read reveals
that the file pointer does indeed get updated. Grrr...

> Hence, your mingw_pread() looks like a workable solution for our purposes,
> but is still not a 100% correct emulation of pread(). (Testing all this
> will have to wait for another 18 hours or so.)
>

I don't know our use-cases, but I'd be a lot happier if I could find a
safe way to have it not update the file-pointer. Just reading it and
setting it back again would be racy.

>> Yeah. Other platforms are still an issue. You didn't address those
>> either in your patch, even though it would be possible to modify it to
>> deal with them by checking the NO_PREAD and NO_PTHREADS defines.
>>
>> But they would still have the problem with the file-pointer racing for
>> non-pread operations. Perhaps simply disabling threading is the better
>> choice for these?
>
> I think it is better to keep threading on in general, but only disable it
> for index-pack. Why should existing users take a performance hit?
>

Good point.

^ permalink raw reply	[flat|nested] 19+ messages in thread

* Re: What's cooking in git.git (Apr 2012, #06; Sun, 15)
  2012-04-19 13:52                   ` Erik Faye-Lund
@ 2012-04-21  3:00                     ` Nguyen Thai Ngoc Duy
  2012-04-21  5:46                       ` Nguyen Thai Ngoc Duy
  0 siblings, 1 reply; 19+ messages in thread
From: Nguyen Thai Ngoc Duy @ 2012-04-21  3:00 UTC (permalink / raw)
  To: Erik Faye-Lund
  Cc: Johannes Sixt, Ramsay Jones, Junio C Hamano, Git Mailing List

On Thu, Apr 19, 2012 at 03:52:44PM +0200, Erik Faye-Lund wrote:
> On Thu, Apr 19, 2012 at 3:48 PM, Johannes Sixt <j.sixt@viscovery.net> wrote:
> > Am 4/19/2012 15:31, schrieb Erik Faye-Lund:
> >> int main(int argc, const char *argv[])
> >> {
> >>         int i, fd = open(__FILE__, O_RDONLY);
> >>         for (i = 0; i < 2; ++i) {
> >>                 char buf[11] = {0};
> >>                 mingw_pread(fd, buf, 10, 0);
> >>                 printf("buf = '%10s'\n", buf);
> >>         }
> >>         return 0;
> >> }
> >
> > The test is flawed. It shows only that pread can read twice the same file
> > location.
> 
> Oh, you are of course right. *slaps forehead*
> 
> > But it must not update the file pointer, whereas the
> > documentation of ReadFile says (quoting the paragraph that is relevant for
> > us):
> >
> >  If hFile is not opened with FILE_FLAG_OVERLAPPED and lpOverlapped is
> >  not NULL, the read operation starts at the offset that is specified in
> >  the OVERLAPPED structure. ReadFile does not return until the read
> >  operation is complete, and then the system updates the file pointer.
> 
> Indeed. Correcting the test to first do pread and then read reveals
> that the file pointer does indeed get updated. Grrr...
> 
> > Hence, your mingw_pread() looks like a workable solution for our purposes,
> > but is still not a 100% correct emulation of pread(). (Testing all this
> > will have to wait for another 18 hours or so.)
> >
> 
> I don't know our use-cases, but I'd be a lot happier if I could find a
> safe way to have it not update the file-pointer. Just reading it and
> setting it back again would be racy.

Replace pread() in index-pack to pread_weak() because we know we don't
care about file offset in index-pack. Define pread_weak as pread
normally. Windows port can provide its own pread_weak version, which
can freely move file offset.
-- 
Duy

^ permalink raw reply	[flat|nested] 19+ messages in thread

* Re: What's cooking in git.git (Apr 2012, #06; Sun, 15)
  2012-04-21  3:00                     ` Nguyen Thai Ngoc Duy
@ 2012-04-21  5:46                       ` Nguyen Thai Ngoc Duy
  0 siblings, 0 replies; 19+ messages in thread
From: Nguyen Thai Ngoc Duy @ 2012-04-21  5:46 UTC (permalink / raw)
  To: Erik Faye-Lund
  Cc: Johannes Sixt, Ramsay Jones, Junio C Hamano, Git Mailing List

On Sat, Apr 21, 2012 at 10:00:18AM +0700, Nguyen Thai Ngoc Duy wrote:
> > I don't know our use-cases, but I'd be a lot happier if I could find a
> > safe way to have it not update the file-pointer. Just reading it and
> > setting it back again would be racy.
> 
> Replace pread() in index-pack to pread_weak() because we know we don't
> care about file offset in index-pack. Define pread_weak as pread
> normally. Windows port can provide its own pread_weak version, which
> can freely move file offset.

Or we could avoid sharing pack_fd file handle, making pread's
thread-safety irrelevant. This does not give any performance
improvements on linux (I guess linux vfs does not hold per-file
locks), so I'm not interested. If you guys want multithread index-pack
on Windows, go for it.

-- 8< --
diff --git a/builtin/index-pack.c b/builtin/index-pack.c
index c1c3c81..051325a 100644
--- a/builtin/index-pack.c
+++ b/builtin/index-pack.c
@@ -50,6 +50,7 @@ struct thread_local {
 #endif
 	struct base_data *base_cache;
 	size_t base_cache_used;
+	int pack_fd;
 };
 
 /*
@@ -89,7 +90,8 @@ static off_t consumed_bytes;
 static unsigned deepest_delta;
 static git_SHA_CTX input_ctx;
 static uint32_t input_crc32;
-static int input_fd, output_fd, pack_fd;
+static const char *curr_pack;
+static int input_fd, output_fd;
 
 #ifndef NO_PTHREADS
 
@@ -126,16 +128,23 @@ static inline void unlock_mutex(pthread_mutex_t *mutex)
  */
 static void init_thread(void)
 {
+	int i;
 	init_recursive_mutex(&read_mutex);
 	pthread_mutex_init(&counter_mutex, NULL);
 	pthread_mutex_init(&work_mutex, NULL);
 	pthread_key_create(&key, NULL);
 	thread_data = xcalloc(nr_threads, sizeof(*thread_data));
+	for (i = 0; i < nr_threads; i++) {
+		thread_data[i].pack_fd = open(curr_pack, O_RDONLY);
+		if (thread_data[i].pack_fd == -1)
+			die_errno("unable to open %s", curr_pack);
+	}
 	threads_active = 1;
 }
 
 static void cleanup_thread(void)
 {
+	int i;
 	if (!threads_active)
 		return;
 	threads_active = 0;
@@ -143,6 +152,8 @@ static void cleanup_thread(void)
 	pthread_mutex_destroy(&counter_mutex);
 	pthread_mutex_destroy(&work_mutex);
 	pthread_key_delete(key);
+	for (i = 0; i < nr_threads; i++)
+		close(thread_data[i].pack_fd);
 	free(thread_data);
 }
 
@@ -267,13 +278,13 @@ static const char *open_pack_file(const char *pack_name)
 			output_fd = open(pack_name, O_CREAT|O_EXCL|O_RDWR, 0600);
 		if (output_fd < 0)
 			die_errno("unable to create '%s'", pack_name);
-		pack_fd = output_fd;
+		nothread_data.pack_fd = output_fd;
 	} else {
 		input_fd = open(pack_name, O_RDONLY);
 		if (input_fd < 0)
 			die_errno("cannot open packfile '%s'", pack_name);
 		output_fd = -1;
-		pack_fd = input_fd;
+		nothread_data.pack_fd = input_fd;
 	}
 	git_SHA1_Init(&input_ctx);
 	return pack_name;
@@ -479,7 +490,7 @@ static void *get_data_from_pack(struct object_entry *obj)
 
 	do {
 		ssize_t n = (len < 64*1024) ? len : 64*1024;
-		n = pread(pack_fd, inbuf, n, from);
+		n = pread(get_thread_data()->pack_fd, inbuf, n, from);
 		if (n < 0)
 			die_errno("cannot pread pack file");
 		if (!n)
@@ -1237,7 +1248,7 @@ static void show_pack_info(int stat_only)
 int cmd_index_pack(int argc, const char **argv, const char *prefix)
 {
 	int i, fix_thin_pack = 0, verify = 0, stat_only = 0, stat = 0;
-	const char *curr_pack, *curr_index;
+	const char *curr_index;
 	const char *index_name = NULL, *pack_name = NULL;
 	const char *keep_name = NULL, *keep_msg = NULL;
 	char *index_name_buf = NULL, *keep_name_buf = NULL;
-- 8< --
-- 
Duy

^ permalink raw reply related	[flat|nested] 19+ messages in thread

end of thread, other threads:[~2012-04-21  5:50 UTC | newest]

Thread overview: 19+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2012-04-16  6:44 What's cooking in git.git (Apr 2012, #06; Sun, 15) Junio C Hamano
2012-04-16  9:07 ` Nelson Benitez Leon
2012-04-16  8:20   ` Junio C Hamano
2012-04-16 11:24     ` Nelson Benitez Leon
2012-04-16 15:03       ` Junio C Hamano
2012-04-18  7:15 ` Johannes Sixt
2012-04-18 19:53   ` Ramsay Jones
2012-04-19  6:16     ` Johannes Sixt
2012-04-19  6:45       ` Johannes Sixt
2012-04-19  7:02         ` Nguyen Thai Ngoc Duy
2012-04-19  9:36         ` Nguyen Thai Ngoc Duy
2012-04-19 12:58           ` Erik Faye-Lund
2012-04-19 13:18             ` Nguyen Thai Ngoc Duy
2012-04-19 13:31               ` Erik Faye-Lund
2012-04-19 13:38                 ` Nguyen Thai Ngoc Duy
2012-04-19 13:48                 ` Johannes Sixt
2012-04-19 13:52                   ` Erik Faye-Lund
2012-04-21  3:00                     ` Nguyen Thai Ngoc Duy
2012-04-21  5:46                       ` Nguyen Thai Ngoc Duy

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).