{"thread":{"id":"31969","subject":"What's cooking in git.git (Oct 2012, #09; Mon, 29)","startedAt":"2012-10-29T10:21:14Z","lastAt":"2012-11-13T18:47:48Z","messageCount":10,"participants":["Jeff King","Ramsay Jones","Chris Rorvick"],"isPatch":false,"patchVersion":null,"patchTotal":null},"messages":[{"id":"202110","messageId":"20121029102114.GA14497@sigill.intra.peff.net","threadId":"31969","inReplyTo":null,"subject":"What's cooking in git.git (Oct 2012, #09; Mon, 29)","fromName":"Jeff King","fromEmail":"peff@peff.net","sentAt":"2012-10-29T10:21:14Z","receivedAt":"2012-10-29T10:21:14Z","isPatch":false,"sender":{"key":"peff@peff.net","avatar":"https://avatars.githubusercontent.com/u/45925?v=4"},"body":"What's cooking in git.git (Oct 2012, #09; Mon, 29)\n--------------------------------------------------\n\nHere are the topics that have been cooking.  Commits prefixed with\n'-' are only in 'pu' (proposed updates) while commits prefixed with\n'+' are in 'next'.\n\nThe second batch of topics has graduated to master. Most of the new\ntopics have been minor bugfixes or documentation updates, so I've merged\na lot of those to master.\n\nYou can find the changes described here in the integration branches of\nmy repository at:\n\n  git://github.com/peff/git.git\n\nUntil Junio returns, kernel.org and the other \"usual\" places will not be\nupdated.\n\n--------------------------------------------------\n[New Topics]\n\n* fc/completion-test-simplification (2012-10-29) 2 commits\n - completion: simplify __gitcomp test helper\n - completion: refactor __gitcomp related tests\n\n Clean up completion tests.\n\n Will merge to 'next'.\n\n\n* fc/remote-testgit-feature-done (2012-10-29) 1 commit\n - remote-testgit: properly check for errors\n\n\n* jk/maint-diff-grep-textconv (2012-10-28) 1 commit\n - diff_grep: use textconv buffers for add/deleted files\n (this branch is used by jk/pickaxe-textconv.)\n\n Fixes inconsistent use of textconv with \"git log -G\".\n\n Will merge to 'next'.\n\n\n* jk/pickaxe-textconv (2012-10-28) 2 commits\n - pickaxe: use textconv for -S counting\n - pickaxe: hoist empty needle check\n (this branch uses jk/maint-diff-grep-textconv.)\n\n Use textconv filters when searching with \"log -S\".\n\n Waiting for a sanity check and review from Junio.\n\n\n* km/maint-doc-git-reset (2012-10-29) 1 commit\n  (merged to 'next' on 2012-10-29 at cdb4e8f)\n + doc: git-reset: make \"<mode>\" optional\n\n Will merge to 'master' in the third batch.\n\n\n* mh/maint-parse-dirstat-fix (2012-10-29) 1 commit\n - parse_dirstat_params(): use string_list to split comma-separated string\n\n Cleans up some code and avoids a potential bug.\n\n Will merge to 'next'.\n\n\n* nd/builtin-to-libgit (2012-10-29) 7 commits\n - fetch-pack: move core code to libgit.a\n - fetch-pack: remove global (static) configuration variable \"args\"\n - send-pack: move core code to libgit.a\n - Move setup_diff_pager to libgit.a\n - Move print_commit_list to libgit.a\n - Move estimate_bisect_steps to libgit.a\n - Move try_merge_command and checkout_fast_forward to libgit.a\n\n Code cleanups so that libgit.a does not depend on anything in the\n builtin/ directory.\n\n Some of the code movement is pretty big, but there doesn't seem to be\n any conflicts with topics in flight.\n\n Will merge to 'next'.\n\n\n* ph/maint-submodule-status-fix (2012-10-29) 2 commits\n - submodule status: remove unused orig_* variables\n - t7407: Fix recursive submodule test\n\n Cleans up some leftover bits from an earlier submodule change.\n\n Will merge to 'next'.\n\n\n* pp/maint-doc-pager-config (2012-10-29) 1 commit\n  (merged to 'next' on 2012-10-29 at 434fbd0)\n + Documentation: improve the example of overriding LESS via core.pager\n\n Will merge to 'master' in the third batch.\n\n\n* rf/maint-mailmap-off-by-one (2012-10-28) 1 commit\n  (merged to 'next' on 2012-10-29 at 8c2214b)\n + mailmap: avoid out-of-bounds memory access\n\n Will merge to 'master' in the third batch.\n\n\n* sz/maint-submodule-reference-arg (2012-10-26) 1 commit\n  (merged to 'next' on 2012-10-29 at 1aab03c)\n + submodule add: fix handling of --reference=<repo> option\n\n Will merge to 'master' in the third batch.\n\n\n* tb/maint-t9200-case-insensitive (2012-10-28) 1 commit\n  (merged to 'next' on 2012-10-29 at 62af90c)\n + Fix t9200 on case insensitive file systems\n\n Will merge to 'master' in the third batch.\n\n\n* tj/maint-doc-commit-sign (2012-10-29) 1 commit\n  (merged to 'next' on 2012-10-29 at 44c61a0)\n + Add -S, --gpg-sign option to manpage of \"git commit\"\n\n Will merge to 'master' in the third batch.\n\n\n--------------------------------------------------\n[Graduated to \"master\"]\n\n* jc/grep-pcre-loose-ends (2012-10-09) 7 commits\n  (merged to 'next' on 2012-10-25 at 2ea9b27)\n + log: honor grep.* configuration\n + log --grep: accept --basic-regexp and --perl-regexp\n + log --grep: use the same helper to set -E/-F options as \"git grep\"\n + revisions: initialize revs->grep_filter using grep_init()\n + grep: move pattern-type bits support to top-level grep.[ch]\n + grep: move the configuration parsing logic to grep.[ch]\n + builtin/grep.c: make configuration callback more reusable\n\n \"git log -F -E --grep='<ere>'\" failed to use the given <ere>\n pattern as extended regular expression, and instead looked for the\n string literally.  The early part of this series is a fix for it.\n\n Will merge to 'master' in the second batch after 1.8.0 ships.\n\n\n* jk/maint-http-init-not-in-result-handler (2012-10-12) 2 commits\n  (merged to 'next' on 2012-10-25 at 59d3687)\n + http: do not set up curl auth after a 401\n + remote-curl: do not call run_slot repeatedly\n\n Further clean-up to the http codepath that picks up results after\n cURL library is done with one request slot.\n\n Will merge to 'master' in the second batch after 1.8.0 ships.\n\n\n* jk/sh-setup-in-filter-branch (2012-10-18) 2 commits\n  (merged to 'next' on 2012-10-25 at 3879f0e)\n + filter-branch: use git-sh-setup's ident parsing functions\n + git-sh-setup: refactor ident-parsing functions\n\n Will merge to 'master' in the second batch after 1.8.0 ships.\n\n\n* jl/submodule-add-by-name (2012-09-30) 2 commits\n  (merged to 'next' on 2012-10-25 at a322082)\n + submodule add: Fail when .git/modules/<name> already exists unless forced\n + Teach \"git submodule add\" the --name option\n\n If you remove a submodule, in order to keep the repository so that\n \"git checkout\" to an older commit in the superproject history can\n resurrect the submodule, the real repository will stay in $GIT_DIR\n of the superproject.  A later \"git submodule add $path\" to add a\n different submodule at the same path will fail.  Diagnose this case\n a bit better, and if the user really wants to add an unrelated\n submodule at the same path, give the \"--name\" option to give it a\n place in $GIT_DIR of the superproject that does not conflict with\n the original submodule.\n\n Will merge to 'master' in the second batch after 1.8.0 ships.\n\n\n* jl/submodule-rm (2012-09-29) 1 commit\n  (merged to 'next' on 2012-10-25 at 0fb5876)\n + submodule: teach rm to remove submodules unless they contain a git directory\n\n \"git rm submodule\" cannot blindly remove a submodule directory as\n its working tree may have local changes, and worse yet, it may even\n have its repository embedded in it.  Teach it some special cases\n where it is safe to remove a submodule, specifically, when there is\n no local changes in the submodule working tree, and its repository\n is not embedded in its working tree but is elsewhere and uses the\n gitfile mechanism to point at it.\n\n Will merge to 'master' in the second batch after 1.8.0 ships.\n\n\n* nd/grep-true-path (2012-10-12) 1 commit\n  (merged to 'next' on 2012-10-25 at 1c7d320)\n + grep: stop looking at random places for .gitattributes\n\n \"git grep -e pattern <tree>\" asked the attribute system to read\n \"<tree>:.gitattributes\" file in the working tree, which was\n nonsense.\n\n Will merge to 'master' in the second batch after 1.8.0 ships.\n\n\n* nd/status-long (2012-10-18) 1 commit\n  (merged to 'next' on 2012-10-25 at ff1b3a0)\n + status: add --long output format option\n\n Allow an earlier \"--short\" option on the command line to be\n countermanded with the \"--long\" option for \"git status\" and \"git\n commit\".\n\n Will merge to 'master' in the second batch after 1.8.0 ships.\n\n\n* rs/branch-del-symref (2012-10-18) 5 commits\n  (merged to 'next' on 2012-10-25 at c2cd358)\n + branch: show targets of deleted symrefs, not sha1s\n + branch: skip commit checks when deleting symref branches\n + branch: delete symref branch, not its target\n + branch: factor out delete_branch_config()\n + branch: factor out check_branch_commit()\n (this branch is used by jh/update-ref-d-through-symref.)\n\n A symbolic ref refs/heads/SYM was not correctly removed with\n \"git branch -d SYM\"; the command removed the ref pointed by\n SYM instead.\n\n Will merge to 'master' in the second batch after 1.8.0 ships.\n\n--------------------------------------------------\n[Stalled]\n\n* rc/maint-complete-git-p4 (2012-09-24) 1 commit\n  (merged to 'next' on 2012-10-29 at af52cef)\n + Teach git-completion about git p4\n\n Comment from Pete will need to be addressed in a follow-up patch.\n\n\n* as/test-tweaks (2012-09-20) 7 commits\n - tests: paint unexpectedly fixed known breakages in bold red\n - tests: test the test framework more thoroughly\n - [SQUASH] t/t0000-basic.sh: quoting of TEST_DIRECTORY is screwed up\n - tests: refactor mechanics of testing in a sub test-lib\n - tests: paint skipped tests in bold blue\n - tests: test number comes first in 'not ok $count - $message'\n - tests: paint known breakages in bold yellow\n\n Various minor tweaks to the test framework to paint its output\n lines in colors that match what they mean better.\n\n Has the \"is this really blue?\" issue Peff raised resolved???\n\n\n* jc/maint-name-rev (2012-09-17) 7 commits\n - describe --contains: use \"name-rev --algorithm=weight\"\n - name-rev --algorithm=weight: tests and documentation\n - name-rev --algorithm=weight: cache the computed weight in notes\n - name-rev --algorithm=weight: trivial optimization\n - name-rev: --algorithm option\n - name_rev: clarify the logic to assign a new tip-name to a commit\n - name-rev: lose unnecessary typedef\n\n \"git name-rev\" names the given revision based on a ref that can be\n reached in the smallest number of steps from the rev, but that is\n not useful when the caller wants to know which tag is the oldest one\n that contains the rev.  This teaches a new mode to the command that\n uses the oldest ref among those which contain the rev.\n\n I am not sure if this is worth it; for one thing, even with the help\n from notes-cache, it seems to make the \"describe --contains\" even\n slower. Also the command will be unusably slow for a user who does\n not have a write access (hence unable to create or update the\n notes-cache).\n\n Stalled mostly due to lack of responses.\n\n\n* jc/xprm-generation (2012-09-14) 1 commit\n - test-generation: compute generation numbers and clock skews\n\n A toy to analyze how bad the clock skews are in histories of real\n world projects.\n\n Stalled mostly due to lack of responses.\n\n\n* jc/blame-no-follow (2012-09-21) 2 commits\n - blame: pay attention to --no-follow\n - diff: accept --no-follow option\n\n Teaches \"--no-follow\" option to \"git blame\" to disable its\n whole-file rename detection.\n\n Stalled mostly due to lack of responses.\n\n\n* jc/doc-default-format (2012-10-07) 2 commits\n - [SQAUSH] allow \"cd Doc* && make DEFAULT_DOC_TARGET=...\"\n - Allow generating a non-default set of documentation\n\n Need to address the installation half if this is to be any useful.\n\n\n* mk/maint-graph-infinity-loop (2012-09-25) 1 commit\n - graph.c: infinite loop in git whatchanged --graph -m\n\n The --graph code fell into infinite loop when asked to do what the\n code did not expect ;-)\n\n Anybody who worked on \"--graph\" wants to comment?\n Stalled mostly due to lack of responses.\n\n\n* jc/add-delete-default (2012-08-13) 1 commit\n - git add: notice removal of tracked paths by default\n\n \"git add dir/\" updated modified files and added new files, but does\n not notice removed files, which may be \"Huh?\" to some users.  They\n can of course use \"git add -A dir/\", but why should they?\n\n Resurrected from graveyard, as I thought it was a worthwhile thing\n to do in the longer term.\n\n Waiting for comments.\n\n\n* mb/remote-default-nn-origin (2012-07-11) 6 commits\n - Teach get_default_remote to respect remote.default.\n - Test that plain \"git fetch\" uses remote.default when on a detached HEAD.\n - Teach clone to set remote.default.\n - Teach \"git remote\" about remote.default.\n - Teach remote.c about the remote.default configuration setting.\n - Rename remote.c's default_remote_name static variables.\n\n When the user does not specify what remote to interact with, we\n often attempt to use 'origin'.  This can now be customized via a\n configuration variable.\n\n Expecting a reroll.\n\n \"The first remote becomes the default\" bit is better done as a\n separate step.\n\n--------------------------------------------------\n[Cooking]\n\n* mh/ceiling (2012-10-29) 8 commits\n - string_list_longest_prefix(): remove function\n - setup_git_directory_gently_1(): resolve symlinks in ceiling paths\n - longest_ancestor_length(): require prefix list entries to be normalized\n - longest_ancestor_length(): take a string_list argument for prefixes\n - longest_ancestor_length(): use string_list_split()\n - Introduce new function real_path_if_valid()\n - real_path_internal(): add comment explaining use of cwd\n - Introduce new static function real_path_internal()\n\n Elements of GIT_CEILING_DIRECTORIES list may not match the real\n pathname we obtain from getcwd(), leading the GIT_DIR discovery\n logic to escape the ceilings the user thought to have specified.\n\n\n* mo/cvs-server-cleanup (2012-10-26) 11 commits\n  (merged to 'next' on 2012-10-29 at 4e70622)\n + Use character class for sed expression instead of \\s\n  (merged to 'next' on 2012-10-25 at c70881d)\n + cvsserver status: provide real sticky info\n + cvsserver: cvs add: do not expand directory arguments\n + cvsserver: use whole CVS rev number in-process; don't strip \"1.\" prefix\n + cvsserver: split up long lines in req_{status,diff,log}\n + cvsserver: clean up client request handler map comments\n + cvsserver: remove unused functions _headrev and gethistory\n + cvsserver update: comment about how we shouldn't remove a user-modified file\n + cvsserver: add comments about database schema/usage\n + cvsserver: removed unused sha1Or-k mode from kopts_from_path\n + cvsserver t9400: add basic 'cvs log' test\n (this branch is tangled with mo/cvs-server-updates.)\n\n Cleanups to prepare for mo/cvs-server-updates.\n\n Will merge to 'master' in the fourth batch.\n\n\n* mo/cvs-server-updates (2012-10-16) 20 commits\n - cvsserver Documentation: new cvs ... -r support\n - cvsserver: add t9402 to test branch and tag refs\n - cvsserver: support -r and sticky tags for most operations\n - cvsserver: Add version awareness to argsfromdir\n - cvsserver: generalize getmeta() to recognize commit refs\n - cvsserver: implement req_Sticky and related utilities\n - cvsserver: add misc commit lookup, file meta data, and file listing functions\n - cvsserver: define a tag name character escape mechanism\n - cvsserver: cleanup extra slashes in filename arguments\n - cvsserver: factor out git-log parsing logic\n  (merged to 'next' on 2012-10-25 at c70881d)\n + cvsserver status: provide real sticky info\n + cvsserver: cvs add: do not expand directory arguments\n + cvsserver: use whole CVS rev number in-process; don't strip \"1.\" prefix\n + cvsserver: split up long lines in req_{status,diff,log}\n + cvsserver: clean up client request handler map comments\n + cvsserver: remove unused functions _headrev and gethistory\n + cvsserver update: comment about how we shouldn't remove a user-modified file\n + cvsserver: add comments about database schema/usage\n + cvsserver: removed unused sha1Or-k mode from kopts_from_path\n + cvsserver t9400: add basic 'cvs log' test\n (this branch is tangled with mo/cvs-server-cleanup.)\n\n Needs review by folks interested in cvsserver.\n\n\n* ta/doc-cleanup (2012-10-25) 6 commits\n - Documentation: build html for all files in technical and howto\n - Documentation/howto: convert plain text files to asciidoc\n - Documentation/technical: convert plain text files to asciidoc\n - Change headline of technical/send-pack-pipeline.txt to not confuse its content with content from git-send-pack.txt\n - Shorten two over-long lines in git-bisect-lk2009.txt by abbreviating some sha1\n - Split over-long synopsis in git-fetch-pack.txt into several lines\n\n Misapplication of a patch fixed; the ones near the tip needs to\n update the links to point at the html files, though.\n\n Needs follow-up on Junio's comment above.\n\n\n* lt/diff-stat-show-0-lines (2012-10-17) 1 commit\n - Fix \"git diff --stat\" for interesting - but empty - file changes\n\n We failed to mention a file without any content change but whose\n permission bit was modified, or (worse yet) a new file without any\n content in the \"git diff --stat\" output.\n\n Needs some test updates.\n\n\n* jc/prettier-pretty-note (2012-10-26) 11 commits\n - Doc User-Manual: Patch cover letter, three dashes, and --notes\n - Doc format-patch: clarify --notes use case\n - Doc notes: Include the format-patch --notes option\n - Doc SubmittingPatches: Mention --notes option after \"cover letter\"\n - Documentation: decribe format-patch --notes\n - format-patch --notes: show notes after three-dashes\n - format-patch: append --signature after notes\n - pretty_print_commit(): do not append notes message\n - pretty: prepare notes message at a centralized place\n - format_note(): simplify API\n - pretty: remove reencode_commit_message()\n\n Now that Philip has submitted some documentation updates, this is\n looking more ready.\n\n Will merge to 'next'.\n\n\n* sz/maint-curl-multi-timeout (2012-10-19) 1 commit\n - Fix potential hang in https handshake\n\n Sometimes curl_multi_timeout() function suggested a wrong timeout\n value when there is no file descriptors to wait on and the http\n transport ended up sleeping for minutes in select(2) system call.\n Detect this and reduce the wait timeout in such a case.\n\n Will merge to 'next'.\n\n\n* jc/same-encoding (2012-10-18) 1 commit\n - reencode_string(): introduce and use same_encoding()\n\n Various codepaths checked if two encoding names are the same using\n ad-hoc code and some of them ended up asking iconv() to convert\n between \"utf8\" and \"UTF-8\".  The former is not a valid way to spell\n the encoding name, but often people use it by mistake, and we\n equated them in some but not all codepaths. Introduce a new helper\n function to make these codepaths consistent.\n\n Will merge to 'next' after fixing up commit message.\n\n\n* nd/tree-walk-enum-cleanup (2012-10-19) 1 commit\n - tree-walk: use enum interesting instead of integer\n\n Will merge to 'next'.\n\n\n* cr/cvsimport-local-zone (2012-10-16) 1 commit\n - git-cvsimport: allow author-specific timezones\n\n Allows \"cvsimport\" to read per-author timezone from the author info\n file.\n\n Will merge to 'next'.\n\n\n* fc/completion-send-email-with-format-patch (2012-10-16) 1 commit\n - completion: add format-patch options to send-email\n\n Will merge to 'next'.\n\n\n* fc/zsh-completion (2012-10-29) 3 commits\n - completion: add new zsh completion\n - completion: add new __gitcompadd helper\n - completion: get rid of empty COMPREPLY assignments\n\n Needs comments from completion folks.\n\n\n* jc/apply-trailing-blank-removal (2012-10-12) 1 commit\n - apply.c:update_pre_post_images(): the preimage can be truncated\n\n Fix to update_pre_post_images() that did not take into account the\n possibility that whitespace fix could shrink the preimage and\n change the number of lines in it.\n\n Extra set of eyeballs appreciated.\n\n\n* jn/warn-on-inaccessible-loosen (2012-10-14) 4 commits\n - config: exit on error accessing any config file\n - doc: advertise GIT_CONFIG_NOSYSTEM\n - config: treat user and xdg config permission problems as errors\n - config, gitignore: failure to access with ENOTDIR is ok\n\n An RFC to deal with a situation where .config/git is a file and we\n notice .config/git/config is not readable due to ENOTDIR, not\n ENOENT; I think a bit more refactored approach to consistently\n address permission errors across config, exclude and attrs is\n desirable.  Don't we also need a check for an opposite situation\n where we open .config/git/config or .gitattributes for reading but\n they turn out to be directories?\n\n\n* rs/lock-correct-ref-during-delete (2012-10-16) 1 commit\n  (merged to 'next' on 2012-10-25 at 9341eea)\n + refs: lock symref that is to be deleted, not its target\n\n When \"update-ref -d --no-deref SYM\" tried to delete a symbolic ref\n SYM, it incorrectly locked the underlying reference pointed by SYM,\n not the symbolic ref itself.\n\n Will merge to 'master' in the fourth batch.\n\n\n* as/check-ignore (2012-10-29) 13 commits\n - Documentation/check-ignore: we show the deciding match, not the first\n - Add git-check-ignore sub-command\n - dir.c: provide free_directory() for reclaiming dir_struct memory\n - pathspec.c: move reusable code from builtin/add.c\n - dir.c: refactor treat_gitlinks()\n - dir.c: keep track of where patterns came from\n - dir.c: refactor is_path_excluded()\n - dir.c: refactor is_excluded()\n - dir.c: refactor is_excluded_from_list()\n - dir.c: rename excluded() to is_excluded()\n - dir.c: rename excluded_from_list() to is_excluded_from_list()\n - dir.c: rename path_excluded() to is_path_excluded()\n - dir.c: rename cryptic 'which' variable to more consistent name\n (this branch uses nd/attr-match-optim-more; is tangled with nd/wildmatch.)\n\n Duy helped to reroll this.\n\n Expecting another re-roll.\n\n\n* js/format-2047 (2012-10-18) 7 commits\n  (merged to 'next' on 2012-10-25 at 76d91fe)\n + format-patch tests: check quoting/encoding in To: and Cc: headers\n + format-patch: fix rfc2047 address encoding with respect to rfc822 specials\n + format-patch: make rfc2047 encoding more strict\n + format-patch: introduce helper function last_line_length()\n + format-patch: do not wrap rfc2047 encoded headers too late\n + format-patch: do not wrap non-rfc2047 headers too early\n + utf8: fix off-by-one wrapping of text\n\n Fixes many rfc2047 quoting issues in the output from format-patch.\n\n Will merge to 'master' in the fourth batch.\n\n\n* km/send-email-compose-encoding (2012-10-25) 5 commits\n  (merged to 'next' on 2012-10-29 at d7d2bb4)\n + git-send-email: add rfc2047 quoting for \"=?\"\n + git-send-email: introduce quote_subject()\n + git-send-email: skip RFC2047 quoting for ASCII subjects\n + git-send-email: use compose-encoding for Subject\n  (merged to 'next' on 2012-10-25 at 5447367)\n + git-send-email: introduce compose-encoding\n\n \"git send-email --compose\" can let the user create a non-ascii\n cover letter message, but there was not a way to mark it with\n appropriate content type before sending it out.\n\n Further updates fix subject quoting.\n\n Will merge to 'master' in the fourth batch.\n\n\n* so/prompt-command (2012-10-17) 4 commits\n  (merged to 'next' on 2012-10-25 at 79565a1)\n + coloured git-prompt: paint detached HEAD marker in red\n + Fix up colored git-prompt\n + show color hints based on state of the git tree\n + Allow __git_ps1 to be used in PROMPT_COMMAND\n\n Updates __git_ps1 so that it can be used as $PROMPT_COMMAND,\n instead of being used for command substitution in $PS1, to embed\n color escape sequences in its output.\n\n Will 'cook' in next.\n\n\n* aw/rebase-am-failure-detection (2012-10-11) 1 commit\n - rebase: Handle cases where format-patch fails\n\n I am unhappy a bit about the possible performance implications of\n having to store the output in a temporary file only for a rare case\n of format-patch aborting.\n\n\n* nd/wildmatch (2012-10-15) 13 commits\n  (merged to 'next' on 2012-10-25 at 510e8df)\n + Support \"**\" wildcard in .gitignore and .gitattributes\n + wildmatch: make /**/ match zero or more directories\n + wildmatch: adjust \"**\" behavior\n + wildmatch: fix case-insensitive matching\n + wildmatch: remove static variable force_lower_case\n + wildmatch: make wildmatch's return value compatible with fnmatch\n + t3070: disable unreliable fnmatch tests\n + Integrate wildmatch to git\n + wildmatch: follow Git's coding convention\n + wildmatch: remove unnecessary functions\n + Import wildmatch from rsync\n + ctype: support iscntrl, ispunct, isxdigit and isprint\n + ctype: make sane_ctype[] const array\n (this branch uses nd/attr-match-optim-more; is tangled with as/check-ignore.)\n\n Allows pathname patterns in .gitignore and .gitattributes files\n with double-asterisks \"foo/**/bar\" to match any number of directory\n hierarchies.\n\n I suspect that this needs to be plugged to pathspec matching code;\n otherwise \"git log -- 'Docum*/**/*.txt'\" would not show the log for\n commits that touch Documentation/git.txt, which would be confusing\n to the users.\n\n Will cook in 'next'.\n\n\n* jk/lua-hackery (2012-10-07) 6 commits\n - pretty: fix up one-off format_commit_message calls\n - Minimum compilation fixup\n - Makefile: make \"lua\" a bit more configurable\n - add a \"lua\" pretty format\n - add basic lua infrastructure\n - pretty: make some commit-parsing helpers more public\n\n Interesting exercise. When we do this for real, we probably would want\n to wrap a commit to make it more like an \"object\" with methods like\n \"parents\", etc.\n\n\n* nd/attr-match-optim-more (2012-10-15) 7 commits\n  (merged to 'next' on 2012-10-25 at 09f70ce)\n + attr: more matching optimizations from .gitignore\n + gitignore: make pattern parsing code a separate function\n + exclude: split pathname matching code into a separate function\n + exclude: fix a bug in prefix compare optimization\n + exclude: split basename matching code into a separate function\n + exclude: stricten a length check in EXC_FLAG_ENDSWITH case\n + Merge commit 'f9f6e2c' into nd/attr-match-optim-more\n (this branch is used by as/check-ignore and nd/wildmatch.)\n\n Start laying the foundation to build the \"wildmatch\" after we can\n agree on its desired semantics.\n\n Will merge to 'master' in the fourth batch.\n\n\n* nd/pretty-placeholder-with-color-option (2012-09-30) 9 commits\n . pretty: support %>> that steal trailing spaces\n . pretty: support truncating in %>, %< and %><\n . pretty: support padding placeholders, %< %> and %><\n . pretty: two phase conversion for non utf-8 commits\n . utf8.c: add utf8_strnwidth() with the ability to skip ansi sequences\n . utf8.c: move display_mode_esc_sequence_len() for use by other functions\n . pretty: support %C(auto[,N]) to turn on coloring on next placeholder(s)\n . pretty: split parsing %C into a separate function\n . pretty: share code between format_decoration and show_decorations\n\n This causes warnings with -Wuninitialized, so I've ejected it from pu\n for the time being.\n\n\n* jc/maint-fetch-tighten-refname-check (2012-10-19) 1 commit\n - get_fetch_map(): tighten checks on dest refs\n\n This was split out from discarded jc/maint-push-refs-all topic.\n\n Will merge to 'next'.\n\n\n* jh/symbolic-ref-d (2012-10-21) 1 commit\n - git symbolic-ref --delete $symref\n\n Add \"symbolic-ref -d SYM\" to delete a symbolic ref SYM.\n\n It is already possible to remove a symbolic ref with \"update-ref -d\n --no-deref\", but it may be a good addition for completeness.\n\n Will merge to 'next'.\n\n\n* jh/update-ref-d-through-symref (2012-10-21) 2 commits\n - Fix failure to delete a packed ref through a symref\n - t1400-update-ref: Add test verifying bug with symrefs in delete_ref()\n\n \"update-ref -d --deref SYM\" to delete a ref through a symbolic ref\n that points to it did not remove it correctly.\n\n\n* gb/maint-doc-svn-log-window-size (2012-10-26) 1 commit\n  (merged to 'next' on 2012-10-29 at ee50b22)\n + Document git-svn fetch --log-window-size parameter\n\n Will merge to 'master' in the third batch.\n\n\n* jk/config-ignore-duplicates (2012-10-29) 9 commits\n  (merged to 'next' on 2012-10-29 at 67fa0a2)\n + builtin/config.c: Fix a sparse warning\n  (merged to 'next' on 2012-10-25 at 233df08)\n + git-config: use git_config_with_options\n + git-config: do not complain about duplicate entries\n + git-config: collect values instead of immediately printing\n + git-config: fix regexp memory leaks on error conditions\n + git-config: remove memory leak of key regexp\n + t1300: test \"git config --get-all\" more thoroughly\n + t1300: remove redundant test\n + t1300: style updates\n\n Drop duplicate detection from git-config; this lets it\n better match the internal config callbacks, which clears up\n some corner cases with includes.\n\n Will cook in 'next'.\n\n\n* mm/maint-doc-remote-tracking (2012-10-25) 1 commit\n  (merged to 'next' on 2012-10-25 at 80f1592)\n + Documentation: remote tracking branch -> remote-tracking branch\n\n We long ago hyphenated \"remote-tracking branch\"; this\n catches some new instances added since then.\n\n Will merge to 'master' in the third batch.\n\n\n* ph/pull-rebase-detached (2012-10-25) 1 commit\n  (merged to 'next' on 2012-10-25 at 73d9d14)\n + git-pull: Avoid merge-base on detached head\n\n Avoids spewing error messages when using \"pull --rebase\" on a\n detached HEAD.\n\n Will merge to 'master' in the third batch.\n\n\n* ph/submodule-sync-recursive (2012-10-29) 2 commits\n - Add tests for submodule sync --recursive\n - Teach --recursive to submodule sync\n\n Adds \"--recursive\" option to submodule sync.\n\n Will merge to 'next'.\n\n\n* po/maint-refs-replace-docs (2012-10-25) 1 commit\n  (merged to 'next' on 2012-10-25 at 3874c9d)\n + Doc repository-layout: Show refs/replace\n\n The refs/replace hierarchy was not mentioned in the\n repository-layout docs.\n\n Will merge to 'master' in the third batch.\n\n\n* sl/maint-configure-messages (2012-10-25) 1 commit\n  (merged to 'next' on 2012-10-25 at e1d7ecd)\n + configure: fix some output message\n\n Minor message fixes for the configure script.\n\n Will merge to 'master' in the third batch.\n"},{"id":"202374","messageId":"5092C234.9000307@ramsay1.demon.co.uk","threadId":"31969","inReplyTo":"20121029102114.GA14497@sigill.intra.peff.net","subject":"Re: What's cooking in git.git (Oct 2012, #09; Mon, 29)","fromName":"Ramsay Jones","fromEmail":"ramsay@ramsay1.demon.co.uk","sentAt":"2012-11-01T18:40:52Z","receivedAt":"2012-11-01T18:40:52Z","isPatch":false,"sender":{"key":"ramsay@ramsayjones.plus.com","avatar":"https://avatars.githubusercontent.com/u/33702710?v=4"},"body":"Jeff King wrote:\n> What's cooking in git.git (Oct 2012, #09; Mon, 29)\n> --------------------------------------------------\n> \n\n[snip]\n\n> * cr/cvsimport-local-zone (2012-10-16) 1 commit\n>  - git-cvsimport: allow author-specific timezones\n> \n>  Allows \"cvsimport\" to read per-author timezone from the author info\n>  file.\n> \n>  Will merge to 'next'.\n\nJust FYI, t9604-cvsimport-timestamps.sh is still failing for me.\n\nI haven't spent too long on this yet, but I had hoped that setting\nTZ would sidestep any DST issues. (I have downloaded new tzdata, but\nhave yet to install - actually I don't really want to!). It is not\nclear from the tzset manpage what happens if you use the DST format\nfor TZ, but you don't provide the start/end date for DST, which is\nwhat this test is doing.\n\nPerhaps the test should use the non-DST format? e.g. \"TZ=CST6 git ...\"\nDoes the test really care about DST? (*if* that is indeed the problem).\n\nAlso: Note that the first test calls git-cvsimport twice, first *with*\nTZ set then again without; I suspect a cut/paste editing error.\n\nI have added the output of \"./t9604-cvsimport-timestamps.sh -v\" below.\n\nATB,\nRamsay Jones\n\n\n\nramsay@ramsay-laptop:$ ./t9604-cvsimport-timestamps.sh -v\nInitialized empty Git repository in /home/ramsay/git/t/trash directory.t9604-cvsimport-timestamps/.git/\nexpecting success: \n\n        TZ=CST6CDT git cvsimport -p\"-x\" -C module-1 module &&\n        git cvsimport -p\"-x\" -C module-1 module &&\n        (\n                cd module-1 &&\n                git log --format=\"%s %ai\"\n        ) >actual-1 &&\n        cat >expect-1 <<-EOF &&\n        Rev 16 2006-10-29 07:00:01 +0000\n        Rev 15 2006-10-29 06:59:59 +0000\n        Rev 14 2006-04-02 08:00:01 +0000\n        Rev 13 2006-04-02 07:59:59 +0000\n        Rev 12 2005-12-01 00:00:00 +0000\n        Rev 11 2005-11-01 00:00:00 +0000\n        Rev 10 2005-10-01 00:00:00 +0000\n        Rev  9 2005-09-01 00:00:00 +0000\n        Rev  8 2005-08-01 00:00:00 +0000\n        Rev  7 2005-07-01 00:00:00 +0000\n        Rev  6 2005-06-01 00:00:00 +0000\n        Rev  5 2005-05-01 00:00:00 +0000\n        Rev  4 2005-04-01 00:00:00 +0000\n        Rev  3 2005-03-01 00:00:00 +0000\n        Rev  2 2005-02-01 00:00:00 +0000\n        Rev  1 2005-01-01 00:00:00 +0000\n        EOF\n        test_cmp actual-1 expect-1\n\nInitialized empty Git repository in /home/ramsay/git/t/trash directory.t9604-cvsimport-timestamps/module-1/.git/\n* UNKNOWN LINE * Branches: \n* UNKNOWN LINE * Branches: \n* UNKNOWN LINE * Branches: \n* UNKNOWN LINE * Branches: \n* UNKNOWN LINE * Branches: \n* UNKNOWN LINE * Branches: \n* UNKNOWN LINE * Branches: \n* UNKNOWN LINE * Branches: \n* UNKNOWN LINE * Branches: \n* UNKNOWN LINE * Branches: \n* UNKNOWN LINE * Branches: \n* UNKNOWN LINE * Branches: \n* UNKNOWN LINE * Branches: \n* UNKNOWN LINE * Branches: \n* UNKNOWN LINE * Branches: \n* UNKNOWN LINE * Branches: \n* UNKNOWN LINE * Branches: \n* UNKNOWN LINE * Branches: \n* UNKNOWN LINE * Branches: \n* UNKNOWN LINE * Branches: \n* UNKNOWN LINE * Branches: \n* UNKNOWN LINE * Branches: \n* UNKNOWN LINE * Branches: \n* UNKNOWN LINE * Branches: \n* UNKNOWN LINE * Branches: \n* UNKNOWN LINE * Branches: \n* UNKNOWN LINE * Branches: \n* UNKNOWN LINE * Branches: \n* UNKNOWN LINE * Branches: \n* UNKNOWN LINE * Branches: \n* UNKNOWN LINE * Branches: \n* UNKNOWN LINE * Branches: \nAlready up-to-date.\n--- actual-1    2012-10-31 21:20:20.000000000 +0000\n+++ expect-1    2012-10-31 21:20:20.000000000 +0000\n@@ -13,4 +13,4 @@\n Rev  4 2005-04-01 00:00:00 +0000\n Rev  3 2005-03-01 00:00:00 +0000\n Rev  2 2005-02-01 00:00:00 +0000\n-Rev  1 2004-12-31 18:00:00 +0000\n+Rev  1 2005-01-01 00:00:00 +0000\nnot ok 1 - check timestamps are UTC (TZ=CST6CDT)\n#\n#\n#               TZ=CST6CDT git cvsimport -p\"-x\" -C module-1 module &&\n#               git cvsimport -p\"-x\" -C module-1 module &&\n#               (\n#                       cd module-1 &&\n#                       git log --format=\"%s %ai\"\n#               ) >actual-1 &&\n#               cat >expect-1 <<-EOF &&\n#               Rev 16 2006-10-29 07:00:01 +0000\n#               Rev 15 2006-10-29 06:59:59 +0000\n#               Rev 14 2006-04-02 08:00:01 +0000\n#               Rev 13 2006-04-02 07:59:59 +0000\n#               Rev 12 2005-12-01 00:00:00 +0000\n#               Rev 11 2005-11-01 00:00:00 +0000\n#               Rev 10 2005-10-01 00:00:00 +0000\n#               Rev  9 2005-09-01 00:00:00 +0000\n#               Rev  8 2005-08-01 00:00:00 +0000\n#               Rev  7 2005-07-01 00:00:00 +0000\n#               Rev  6 2005-06-01 00:00:00 +0000\n#               Rev  5 2005-05-01 00:00:00 +0000\n#               Rev  4 2005-04-01 00:00:00 +0000\n#               Rev  3 2005-03-01 00:00:00 +0000\n#               Rev  2 2005-02-01 00:00:00 +0000\n#               Rev  1 2005-01-01 00:00:00 +0000\n#               EOF\n#               test_cmp actual-1 expect-1\n#\n\nexpecting success: \n\n        cat >cvs-authors <<-EOF &&\n        user1=User One <user1@domain.org>\n        user2=User Two <user2@domain.org> CST6CDT\n        user3=User Three <user3@domain.org> EST5EDT\n        user4=User Four <user4@domain.org> MST7MDT\n        EOF\n        git cvsimport -p\"-x\" -A cvs-authors -C module-2 module &&\n        (\n                cd module-2 &&\n                git log --format=\"%s %ai %an\"\n        ) >actual-2 &&\n        cat >expect-2 <<-EOF &&\n        Rev 16 2006-10-29 01:00:01 -0600 User Two\n        Rev 15 2006-10-29 01:59:59 -0500 User Two\n        Rev 14 2006-04-02 03:00:01 -0500 User Two\n        Rev 13 2006-04-02 01:59:59 -0600 User Two\n        Rev 12 2005-11-30 17:00:00 -0700 User Four\n        Rev 11 2005-10-31 19:00:00 -0500 User Three\n        Rev 10 2005-09-30 19:00:00 -0500 User Two\n        Rev  9 2005-09-01 00:00:00 +0000 User One\n        Rev  8 2005-07-31 18:00:00 -0600 User Four\n        Rev  7 2005-06-30 20:00:00 -0400 User Three\n        Rev  6 2005-05-31 19:00:00 -0500 User Two\n        Rev  5 2005-05-01 00:00:00 +0000 User One\n        Rev  4 2005-03-31 17:00:00 -0700 User Four\n        Rev  3 2005-02-28 19:00:00 -0500 User Three\n        Rev  2 2005-01-31 18:00:00 -0600 User Two\n        Rev  1 2005-01-01 00:00:00 +0000 User One\n        EOF\n        test_cmp actual-2 expect-2\n\nInitialized empty Git repository in /home/ramsay/git/t/trash directory.t9604-cvsimport-timestamps/module-2/.git/\n* UNKNOWN LINE * Branches: \n* UNKNOWN LINE * Branches: \n* UNKNOWN LINE * Branches: \n* UNKNOWN LINE * Branches: \n* UNKNOWN LINE * Branches: \n* UNKNOWN LINE * Branches: \n* UNKNOWN LINE * Branches: \n* UNKNOWN LINE * Branches: \n* UNKNOWN LINE * Branches: \n* UNKNOWN LINE * Branches: \n* UNKNOWN LINE * Branches: \n* UNKNOWN LINE * Branches: \n* UNKNOWN LINE * Branches: \n* UNKNOWN LINE * Branches: \n* UNKNOWN LINE * Branches: \n* UNKNOWN LINE * Branches: \n--- actual-2    2012-10-31 21:20:21.000000000 +0000\n+++ expect-2    2012-10-31 21:20:21.000000000 +0000\n@@ -1,16 +1,16 @@\n Rev 16 2006-10-29 01:00:01 -0600 User Two\n Rev 15 2006-10-29 01:59:59 -0500 User Two\n Rev 14 2006-04-02 03:00:01 -0500 User Two\n-Rev 13 2006-04-02 00:59:59 -0600 User Two\n-Rev 12 2005-11-30 19:00:00 -0700 User Four\n-Rev 11 2005-10-31 18:00:00 -0500 User Three\n-Rev 10 2005-10-01 01:00:00 -0500 User Two\n-Rev  9 2005-08-31 18:00:00 +0000 User One\n-Rev  8 2005-07-31 20:00:00 -0600 User Four\n-Rev  7 2005-06-30 19:00:00 -0400 User Three\n-Rev  6 2005-06-01 01:00:00 -0500 User Two\n-Rev  5 2005-04-30 18:00:00 +0000 User One\n-Rev  4 2005-03-31 19:00:00 -0700 User Four\n-Rev  3 2005-02-28 18:00:00 -0500 User Three\n-Rev  2 2005-02-01 00:00:00 -0600 User Two\n+Rev 13 2006-04-02 01:59:59 -0600 User Two\n+Rev 12 2005-11-30 17:00:00 -0700 User Four\n+Rev 11 2005-10-31 19:00:00 -0500 User Three\n+Rev 10 2005-09-30 19:00:00 -0500 User Two\n+Rev  9 2005-09-01 00:00:00 +0000 User One\n+Rev  8 2005-07-31 18:00:00 -0600 User Four\n+Rev  7 2005-06-30 20:00:00 -0400 User Three\n+Rev  6 2005-05-31 19:00:00 -0500 User Two\n+Rev  5 2005-05-01 00:00:00 +0000 User One\n+Rev  4 2005-03-31 17:00:00 -0700 User Four\n+Rev  3 2005-02-28 19:00:00 -0500 User Three\n+Rev  2 2005-01-31 18:00:00 -0600 User Two\n Rev  1 2005-01-01 00:00:00 +0000 User One\nnot ok 2 - check timestamps with author-specific timezones\n#\n#\n#               cat >cvs-authors <<-EOF &&\n#               user1=User One <user1@domain.org>\n#               user2=User Two <user2@domain.org> CST6CDT\n#               user3=User Three <user3@domain.org> EST5EDT\n#               user4=User Four <user4@domain.org> MST7MDT\n#               EOF\n#               git cvsimport -p\"-x\" -A cvs-authors -C module-2 module &&\n#               (\n#                       cd module-2 &&\n#                       git log --format=\"%s %ai %an\"\n#               ) >actual-2 &&\n#               cat >expect-2 <<-EOF &&\n#               Rev 16 2006-10-29 01:00:01 -0600 User Two\n#               Rev 15 2006-10-29 01:59:59 -0500 User Two\n#               Rev 14 2006-04-02 03:00:01 -0500 User Two\n#               Rev 13 2006-04-02 01:59:59 -0600 User Two\n#               Rev 12 2005-11-30 17:00:00 -0700 User Four\n#               Rev 11 2005-10-31 19:00:00 -0500 User Three\n#               Rev 10 2005-09-30 19:00:00 -0500 User Two\n#               Rev  9 2005-09-01 00:00:00 +0000 User One\n#               Rev  8 2005-07-31 18:00:00 -0600 User Four\n#               Rev  7 2005-06-30 20:00:00 -0400 User Three\n#               Rev  6 2005-05-31 19:00:00 -0500 User Two\n#               Rev  5 2005-05-01 00:00:00 +0000 User One\n#               Rev  4 2005-03-31 17:00:00 -0700 User Four\n#               Rev  3 2005-02-28 19:00:00 -0500 User Three\n#               Rev  2 2005-01-31 18:00:00 -0600 User Two\n#               Rev  1 2005-01-01 00:00:00 +0000 User One\n#               EOF\n#               test_cmp actual-2 expect-2\n#\n\n# failed 2 among 2 test(s)\n1..2\nramsay@ramsay-laptop:$\n"},{"id":"202384","messageId":"CAEUsAPb7hUViLn7V7v65r6mOqRHr+180ynRX8K9t3nuJVyePfg@mail.gmail.com","threadId":"31969","inReplyTo":"5092C234.9000307@ramsay1.demon.co.uk","subject":"Re: What's cooking in git.git (Oct 2012, #09; Mon, 29)","fromName":"Chris Rorvick","fromEmail":"chris@rorvick.com","sentAt":"2012-11-02T01:12:20Z","receivedAt":"2012-11-02T01:12:20Z","isPatch":false,"sender":{"key":"chris@rorvick.com","avatar":"https://avatars.githubusercontent.com/u/824726?v=4"},"body":"On Thu, Nov 1, 2012 at 1:40 PM, Ramsay Jones <ramsay@ramsay1.demon.co.uk> wrote:\n> Jeff King wrote:\n>> What's cooking in git.git (Oct 2012, #09; Mon, 29)\n>> --------------------------------------------------\n>>\n>\n> [snip]\n>\n>> * cr/cvsimport-local-zone (2012-10-16) 1 commit\n>>  - git-cvsimport: allow author-specific timezones\n>>\n>>  Allows \"cvsimport\" to read per-author timezone from the author info\n>>  file.\n>>\n>>  Will merge to 'next'.\n>\n> Just FYI, t9604-cvsimport-timestamps.sh is still failing for me.\n>\n> I haven't spent too long on this yet, but I had hoped that setting\n> TZ would sidestep any DST issues. (I have downloaded new tzdata, but\n> have yet to install - actually I don't really want to!). It is not\n> clear from the tzset manpage what happens if you use the DST format\n> for TZ, but you don't provide the start/end date for DST, which is\n> what this test is doing.\n>\n> Perhaps the test should use the non-DST format? e.g. \"TZ=CST6 git ...\"\n> Does the test really care about DST? (*if* that is indeed the problem).\n\nIt actually looks like your TZ database is fine and the problem is\nwith the conversion to a struct tm.  In each case, the time is\nlocalized to the previous TZ value while the offset for the current TZ\nvalue.  For example, look at the first commit in the first test.  It\nconverted the timestamp to 18:00 (CST6) while all the rest came\nthrough as expected.    I suspect the previous version of cvsimport\nwould exhibit similar behavior with the first imported commit.  What\nis your platform?\n\n> Also: Note that the first test calls git-cvsimport twice, first *with*\n> TZ set then again without; I suspect a cut/paste editing error.\n\nOops.  The second invocation should have no effect on the repo so the\nunit test is still valid, but that was a mistake for sure.  Thanks.\n\nChris\n"},{"id":"202404","messageId":"20121102094259.GA28414@sigill.intra.peff.net","threadId":"31969","inReplyTo":"CAEUsAPb7hUViLn7V7v65r6mOqRHr+180ynRX8K9t3nuJVyePfg@mail.gmail.com","subject":"Re: What's cooking in git.git (Oct 2012, #09; Mon, 29)","fromName":"Jeff King","fromEmail":"peff@peff.net","sentAt":"2012-11-02T09:43:00Z","receivedAt":"2012-11-02T09:43:00Z","isPatch":false,"sender":{"key":"peff@peff.net","avatar":"https://avatars.githubusercontent.com/u/45925?v=4"},"body":"On Thu, Nov 01, 2012 at 08:12:20PM -0500, Chris Rorvick wrote:\n\n> > Just FYI, t9604-cvsimport-timestamps.sh is still failing for me.\n> >\n> > I haven't spent too long on this yet, but I had hoped that setting\n> > TZ would sidestep any DST issues. (I have downloaded new tzdata, but\n> > have yet to install - actually I don't really want to!). It is not\n> > clear from the tzset manpage what happens if you use the DST format\n> > for TZ, but you don't provide the start/end date for DST, which is\n> > what this test is doing.\n> >\n> > Perhaps the test should use the non-DST format? e.g. \"TZ=CST6 git ...\"\n> > Does the test really care about DST? (*if* that is indeed the problem).\n> \n> It actually looks like your TZ database is fine and the problem is\n> with the conversion to a struct tm.  In each case, the time is\n> localized to the previous TZ value while the offset for the current TZ\n> value.  For example, look at the first commit in the first test.  It\n> converted the timestamp to 18:00 (CST6) while all the rest came\n> through as expected.    I suspect the previous version of cvsimport\n> would exhibit similar behavior with the first imported commit.  What\n> is your platform?\n\nYeah, I think that is it. IIRC, Ramsay is on cygwin, and I noticed this\nin perl 5.16's POSIX.xs:\n\n  #ifdef WIN32\n\n  /*\n   * (1) The CRT maintains its own copy of the environment, separate from\n   * the Win32API copy.\n   *\n   * (2) CRT getenv() retrieves from this copy. CRT putenv() updates this\n   * copy, and then calls SetEnvironmentVariableA() to update the Win32API\n   * copy.\n   *\n   * (3) win32_getenv() and win32_putenv() call GetEnvironmentVariableA() and\n   * SetEnvironmentVariableA() directly, bypassing the CRT copy of the\n   * environment.\n   *\n   * (4) The CRT strftime() \"%Z\" implementation calls __tzset(). That\n   * calls CRT tzset(), but only the first time it is called, and in turn\n   * that uses CRT getenv(\"TZ\") to retrieve the timezone info from the CRT\n   * local copy of the environment and hence gets the original setting as\n   * perl never updates the CRT copy when assigning to $ENV{TZ}.\n   *\n   * Therefore, we need to retrieve the value of $ENV{TZ} and call CRT\n   * putenv() to update the CRT copy of the environment (if it is different)\n   * whenever we're about to call tzset().\n   [...]\n\nI wonder if Ramsay has an older perl that does not do this special\nhackery right. I'll see if I can dig up where it first appeared.\n\n-Peff\n"},{"id":"202405","messageId":"20121102095632.GA30221@sigill.intra.peff.net","threadId":"31969","inReplyTo":"20121102094259.GA28414@sigill.intra.peff.net","subject":"Re: What's cooking in git.git (Oct 2012, #09; Mon, 29)","fromName":"Jeff King","fromEmail":"peff@peff.net","sentAt":"2012-11-02T09:56:32Z","receivedAt":"2012-11-02T09:56:32Z","isPatch":false,"sender":{"key":"peff@peff.net","avatar":"https://avatars.githubusercontent.com/u/45925?v=4"},"body":"On Fri, Nov 02, 2012 at 05:43:00AM -0400, Jeff King wrote:\n\n> Yeah, I think that is it. IIRC, Ramsay is on cygwin, and I noticed this\n> in perl 5.16's POSIX.xs:\n>\n> [...]\n>    * (4) The CRT strftime() \"%Z\" implementation calls __tzset(). That\n>    * calls CRT tzset(), but only the first time it is called, and in turn\n>    * that uses CRT getenv(\"TZ\") to retrieve the timezone info from the CRT\n>    * local copy of the environment and hence gets the original setting as\n>    * perl never updates the CRT copy when assigning to $ENV{TZ}.\n> [...]\n> I wonder if Ramsay has an older perl that does not do this special\n> hackery right. I'll see if I can dig up where it first appeared.\n\nIt looks like that code went into perl 5.11.\n\nI wonder, even with this fix, though, if we need to be calling tzset to\nreliably update from the environment. It sounds like it _should_ happen\nautomatically, except that if the CRT is calling the internal tzset, it\nwould not do the perl \"grab from $ENV\" magic. Calling tzset would make\nsure the internal TZ is up to date.\n\nRamsay, what happens with this patch on top?\n\ndiff --git a/git-cvsimport.perl b/git-cvsimport.perl\nindex ceb119d..4c44050 100755\n--- a/git-cvsimport.perl\n+++ b/git-cvsimport.perl\n@@ -24,11 +24,12 @@ use File::Basename qw(basename dirname);\n use Time::Local;\n use IO::Socket;\n use IO::Pipe;\n-use POSIX qw(strftime dup2 ENOENT);\n+use POSIX qw(strftime tzset dup2 ENOENT);\n use IPC::Open2;\n \n $SIG{'PIPE'}=\"IGNORE\";\n $ENV{'TZ'}=\"UTC\";\n+tzset();\n \n our ($opt_h,$opt_o,$opt_v,$opt_k,$opt_u,$opt_d,$opt_p,$opt_C,$opt_z,$opt_i,$opt_P, $opt_s,$opt_m,@opt_M,$opt_A,$opt_S,$opt_L, $opt_a, $opt_r, $opt_R);\n my (%conv_author_name, %conv_author_email, %conv_author_tz);\n@@ -855,8 +856,10 @@ sub commit {\n \t}\n \n \t$ENV{'TZ'}=$author_tz;\n+\ttzset();\n \tmy $commit_date = strftime(\"%s %z\", localtime($date));\n \t$ENV{'TZ'}=\"UTC\";\n+\ttzset();\n \t$ENV{GIT_AUTHOR_NAME} = $author_name;\n \t$ENV{GIT_AUTHOR_EMAIL} = $author_email;\n \t$ENV{GIT_AUTHOR_DATE} = $commit_date;\n"},{"id":"202459","messageId":"50943C1A.4090706@ramsay1.demon.co.uk","threadId":"31969","inReplyTo":"20121102095632.GA30221@sigill.intra.peff.net","subject":"Re: What's cooking in git.git (Oct 2012, #09; Mon, 29)","fromName":"Ramsay Jones","fromEmail":"ramsay@ramsay1.demon.co.uk","sentAt":"2012-11-02T21:33:14Z","receivedAt":"2012-11-02T21:33:14Z","isPatch":false,"sender":{"key":"ramsay@ramsayjones.plus.com","avatar":"https://avatars.githubusercontent.com/u/33702710?v=4"},"body":"Jeff King wrote:\n> On Fri, Nov 02, 2012 at 05:43:00AM -0400, Jeff King wrote:\n> \n>> Yeah, I think that is it. IIRC, Ramsay is on cygwin, and I noticed this\n>> in perl 5.16's POSIX.xs:\n>>\n>> [...]\n>>    * (4) The CRT strftime() \"%Z\" implementation calls __tzset(). That\n>>    * calls CRT tzset(), but only the first time it is called, and in turn\n>>    * that uses CRT getenv(\"TZ\") to retrieve the timezone info from the CRT\n>>    * local copy of the environment and hence gets the original setting as\n>>    * perl never updates the CRT copy when assigning to $ENV{TZ}.\n>> [...]\n>> I wonder if Ramsay has an older perl that does not do this special\n>> hackery right. I'll see if I can dig up where it first appeared.\n\nHmm, sorry for not specifying this upfront, but this failure is on Linux. ;-)\n(Linux is my main platform, but I like to keep cygwin working because it has\nkept me sane on Windows ever since (about) 1995 ...)\n\"Stranger in a strange land\" ;-)\n\nThis test is skipped on cygwin because I don't have cvs (or cvsps) installed\non cygwin. (I have cvs-1.11.1p1.tar.gz and cvsps-2.2b1.tar.gz lying around\non cygwin, so I could probably build them from source and do some testing if\nyou would like me too. Just let me know.)\n\nThis test is skipped on MinGW because cvsps is not installed. (I have just\ntried building cvsps, but there are compilation errors ...).\n\nI'm using perl v5.8.8 on Linux.\n\n> It looks like that code went into perl 5.11.\n> \n> I wonder, even with this fix, though, if we need to be calling tzset to\n> reliably update from the environment. It sounds like it _should_ happen\n> automatically, except that if the CRT is calling the internal tzset, it\n> would not do the perl \"grab from $ENV\" magic. Calling tzset would make\n> sure the internal TZ is up to date.\n> \n> Ramsay, what happens with this patch on top?\n\nThis patch fixes the test for me.\n\nThanks!\n\nATB,\nRamsay Jones\n\n> diff --git a/git-cvsimport.perl b/git-cvsimport.perl\n> index ceb119d..4c44050 100755\n> --- a/git-cvsimport.perl\n> +++ b/git-cvsimport.perl\n> @@ -24,11 +24,12 @@ use File::Basename qw(basename dirname);\n>  use Time::Local;\n>  use IO::Socket;\n>  use IO::Pipe;\n> -use POSIX qw(strftime dup2 ENOENT);\n> +use POSIX qw(strftime tzset dup2 ENOENT);\n>  use IPC::Open2;\n>  \n>  $SIG{'PIPE'}=\"IGNORE\";\n>  $ENV{'TZ'}=\"UTC\";\n> +tzset();\n>  \n>  our ($opt_h,$opt_o,$opt_v,$opt_k,$opt_u,$opt_d,$opt_p,$opt_C,$opt_z,$opt_i,$opt_P, $opt_s,$opt_m,@opt_M,$opt_A,$opt_S,$opt_L, $opt_a, $opt_r, $opt_R);\n>  my (%conv_author_name, %conv_author_email, %conv_author_tz);\n> @@ -855,8 +856,10 @@ sub commit {\n>  \t}\n>  \n>  \t$ENV{'TZ'}=$author_tz;\n> +\ttzset();\n>  \tmy $commit_date = strftime(\"%s %z\", localtime($date));\n>  \t$ENV{'TZ'}=\"UTC\";\n> +\ttzset();\n>  \t$ENV{GIT_AUTHOR_NAME} = $author_name;\n>  \t$ENV{GIT_AUTHOR_EMAIL} = $author_email;\n>  \t$ENV{GIT_AUTHOR_DATE} = $commit_date;\n> .\n> \n"},{"id":"202511","messageId":"20121104122926.GD336@sigill.intra.peff.net","threadId":"31969","inReplyTo":"50943C1A.4090706@ramsay1.demon.co.uk","subject":"Re: What's cooking in git.git (Oct 2012, #09; Mon, 29)","fromName":"Jeff King","fromEmail":"peff@peff.net","sentAt":"2012-11-04T12:29:26Z","receivedAt":"2012-11-04T12:29:26Z","isPatch":false,"sender":{"key":"peff@peff.net","avatar":"https://avatars.githubusercontent.com/u/45925?v=4"},"body":"On Fri, Nov 02, 2012 at 09:33:14PM +0000, Ramsay Jones wrote:\n\n> >> I wonder if Ramsay has an older perl that does not do this special\n> >> hackery right. I'll see if I can dig up where it first appeared.\n> \n> Hmm, sorry for not specifying this upfront, but this failure is on Linux. ;-)\n\nAh, that's helpful to know.\n\n> (Linux is my main platform, but I like to keep cygwin working because it has\n> kept me sane on Windows ever since (about) 1995 ...)\n> \"Stranger in a strange land\" ;-)\n\nI used a different trick around the same time to keep me sane from\nWindows, but I think it involved \"dd\" and \"/dev/zero\"...\n\n> I'm using perl v5.8.8 on Linux.\n\nYeah, that is the problem. Calling localtime_r repeatedly while changing\nthe timezone does not work on some platforms:\n\n  https://rt.perl.org/rt3/Public/Bug/Display.html?id=26136\n\nThe fix (to call tzset each time) went into perl 5.10.0.\n\n> > Ramsay, what happens with this patch on top?\n> \n> This patch fixes the test for me.\n\nGreat. I was guessing blindly when I wrote it, but having seen the perl\nbug above, it all makes sense.\n\nWe should probably wrap it. I'm planning to queue this on top of Chris's\npatch:\n\n-- >8 --\nSubject: [PATCH] cvsimport: work around perl tzset issue\n\nOn many platforms, the first invocation of localtime_r will\ncheck $TZ in the environment, but subsequent invocations\nwill use a cache value. That means that setting $ENV{TZ} in\nthe middle of the program may or may not have an effect on\nlater calls to localtime.  Perl 5.10.0 and later handles\nthis automatically for us, but we try to remain portable\nback to 5.8. Work around it by calling tzset ourselves.\n\nSigned-off-by: Jeff King <peff@peff.net>\n---\n git-cvsimport.perl | 17 +++++++++++++----\n 1 file changed, 13 insertions(+), 4 deletions(-)\n\ndiff --git a/git-cvsimport.perl b/git-cvsimport.perl\nindex ceb119d..0a31ebd 100755\n--- a/git-cvsimport.perl\n+++ b/git-cvsimport.perl\n@@ -24,11 +24,11 @@ use File::Basename qw(basename dirname);\n use Time::Local;\n use IO::Socket;\n use IO::Pipe;\n-use POSIX qw(strftime dup2 ENOENT);\n+use POSIX qw(strftime tzset dup2 ENOENT);\n use IPC::Open2;\n \n $SIG{'PIPE'}=\"IGNORE\";\n-$ENV{'TZ'}=\"UTC\";\n+set_timezone('UTC');\n \n our ($opt_h,$opt_o,$opt_v,$opt_k,$opt_u,$opt_d,$opt_p,$opt_C,$opt_z,$opt_i,$opt_P, $opt_s,$opt_m,@opt_M,$opt_A,$opt_S,$opt_L, $opt_a, $opt_r, $opt_R);\n my (%conv_author_name, %conv_author_email, %conv_author_tz);\n@@ -99,6 +99,15 @@ sub write_author_info($) {\n \tclose ($f);\n }\n \n+# Versions of perl before 5.10.0 may not automatically check $TZ each\n+# time localtime is run (most platforms will do so only the first time).\n+# We can work around this by using tzset() to update the internal\n+# variable whenever we change the environment.\n+sub set_timezone {\n+\t$ENV{TZ} = shift;\n+\ttzset();\n+}\n+\n # convert getopts specs for use by git config\n my %longmap = (\n \t'A:' => 'authors-file',\n@@ -854,9 +863,9 @@ sub commit {\n \t\t}\n \t}\n \n-\t$ENV{'TZ'}=$author_tz;\n+\tset_timezone($author_tz);\n \tmy $commit_date = strftime(\"%s %z\", localtime($date));\n-\t$ENV{'TZ'}=\"UTC\";\n+\tset_timezone('UTC');\n \t$ENV{GIT_AUTHOR_NAME} = $author_name;\n \t$ENV{GIT_AUTHOR_EMAIL} = $author_email;\n \t$ENV{GIT_AUTHOR_DATE} = $commit_date;\n-- \n1.8.0.207.gdf2154c\n"},{"id":"202766","messageId":"509E9E02.3000500@ramsay1.demon.co.uk","threadId":"31969","inReplyTo":"20121104122926.GD336@sigill.intra.peff.net","subject":"Re: What's cooking in git.git (Oct 2012, #09; Mon, 29)","fromName":"Ramsay Jones","fromEmail":"ramsay@ramsay1.demon.co.uk","sentAt":"2012-11-10T18:33:38Z","receivedAt":"2012-11-10T18:33:38Z","isPatch":false,"sender":{"key":"ramsay@ramsayjones.plus.com","avatar":"https://avatars.githubusercontent.com/u/33702710?v=4"},"body":"Jeff King wrote:\n> On Fri, Nov 02, 2012 at 09:33:14PM +0000, Ramsay Jones wrote:\n> \n>> (Linux is my main platform, but I like to keep cygwin working because it has\n>> kept me sane on Windows ever since (about) 1995 ...)\n>> \"Stranger in a strange land\" ;-)\n> \n> I used a different trick around the same time to keep me sane from\n> Windows, but I think it involved \"dd\" and \"/dev/zero\"...\n\n;-) That's a solution I would have been keen to try, but my employer\nat the time would not have liked that idea ...\n\n>>\n>> This patch fixes the test for me.\n> \n> Great. I was guessing blindly when I wrote it, but having seen the perl\n> bug above, it all makes sense.\n> \n> We should probably wrap it. I'm planning to queue this on top of Chris's\n> patch:\n\nUnfortunately, I haven't had time yet to test this patch. (Early this week, I\nwent into hospital for a \"minor\" surgical procedure - I have not yet fully\nrecovered). The patch looks good and I don't anticipate any problems. I will\nhopefully test it soon (I see it's in pu now) and let you know.\n\n[snip patch]\n\nATB,\nRamsay Jones\n"},{"id":"202901","messageId":"20121111174136.GC13188@sigill.intra.peff.net","threadId":"31969","inReplyTo":"509E9E02.3000500@ramsay1.demon.co.uk","subject":"Re: What's cooking in git.git (Oct 2012, #09; Mon, 29)","fromName":"Jeff King","fromEmail":"peff@peff.net","sentAt":"2012-11-11T17:41:36Z","receivedAt":"2012-11-11T17:41:36Z","isPatch":false,"sender":{"key":"peff@peff.net","avatar":"https://avatars.githubusercontent.com/u/45925?v=4"},"body":"On Sat, Nov 10, 2012 at 06:33:38PM +0000, Ramsay Jones wrote:\n\n> > We should probably wrap it. I'm planning to queue this on top of Chris's\n> > patch:\n> \n> Unfortunately, I haven't had time yet to test this patch. (Early this week, I\n> went into hospital for a \"minor\" surgical procedure - I have not yet fully\n> recovered). The patch looks good and I don't anticipate any problems. I will\n> hopefully test it soon (I see it's in pu now) and let you know.\n\nThanks. I merged it to \"next\" on Friday, so we will see if anybody\nscreams. But please take your time and recover. Git will wait. :)\n\n-Peff\n"},{"id":"203130","messageId":"50A295D4.1080609@ramsay1.demon.co.uk","threadId":"31969","inReplyTo":"20121111174136.GC13188@sigill.intra.peff.net","subject":"Re: What's cooking in git.git (Oct 2012, #09; Mon, 29)","fromName":"Ramsay Jones","fromEmail":"ramsay@ramsay1.demon.co.uk","sentAt":"2012-11-13T18:47:48Z","receivedAt":"2012-11-13T18:47:48Z","isPatch":false,"sender":{"key":"ramsay@ramsayjones.plus.com","avatar":"https://avatars.githubusercontent.com/u/33702710?v=4"},"body":"Jeff King wrote:\n> On Sat, Nov 10, 2012 at 06:33:38PM +0000, Ramsay Jones wrote:\n> \n>>> We should probably wrap it. I'm planning to queue this on top of Chris's\n>>> patch:\n>>\n>> Unfortunately, I haven't had time yet to test this patch. (Early this week, I\n>> went into hospital for a \"minor\" surgical procedure - I have not yet fully\n>> recovered). The patch looks good and I don't anticipate any problems. I will\n>> hopefully test it soon (I see it's in pu now) and let you know.\n> \n> Thanks. I merged it to \"next\" on Friday, so we will see if anybody\n> screams. But please take your time and recover. Git will wait. :)\n\nI have tested this patch and, as expected, it fixes things up for me.\n(To be more precise: the current next branch works, but if I revert\ncommit c2b3af05, then t9604-cvsimport-timestamps.sh fails in the\nsame way as before!)\n\nThanks!\n\nATB,\nRamsay Jones\n"}]}