{"thread":{"id":"11573","subject":"[PATCH] git-remote - Unset remotes.default when deleting the default remote","startedAt":"2008-01-11T03:29:45Z","lastAt":"2008-02-18T19:57:42Z","messageCount":134,"participants":["Mark Levedahl","Junio C Hamano","Johannes Schindelin","Jakub Narebski","Björn Steinbrink","Daniel Barkalow","Steffen Prohaska","Dmitry Potapov","Jeff King","Pierre Habouzit","Lars Hjemli","Johannes Sixt","Marco Costalba","Mike Hommey","Grégoire Barbier","Shawn O. Pearce","Linus Torvalds","Imran M Yousuf"],"isPatch":true,"patchVersion":1,"patchTotal":null},"messages":[{"id":"64976","messageId":"1200022189-2400-1-git-send-email-mlevedahl@gmail.com","threadId":"11573","inReplyTo":null,"subject":"Allowing override of the default \"origin\" nickname","fromName":"Mark Levedahl","fromEmail":"mlevedahl@gmail.com","sentAt":"2008-01-11T03:29:45Z","receivedAt":"2008-01-11T03:29:45Z","isPatch":false,"sender":{"key":"mdl123@verizon.net","avatar":"https://avatars.githubusercontent.com/u/5302462?v=4"},"body":"git's current support for remote nicknames other than\n\"origin\" is restricted to tracking branches where\nbranch.<name>.remote is defined. This does not work on\ndetached heads, and thus does not work for managed\nsubmodules as those are kept on detached heads. When working\nwith submodules, the remote must be called \"origin.\"\n\nAs my project is distributed across multiple domains with\nmany firewalls and airgaps such that no single server is\navailable to all, we really need to use nicknames to refer\nto different servers, and we need that to work well with\nsubmodules.\n\nSo, this patch series:\n1) defines a new \"remotes.default\" config variable per\nrepository to be the default remote used if no\nbranch.<name>.remote is found.\n\n2) teaches clone to set remotes.default according to\nthe user's command (via -o).\n\n3) teaches remote rm to unset remotes.default if deleting\nthat remote.\n\n4) teaches git-submodule to propoagate the parent's default\nbranch to submoules during \"init\", IFF those modules are\ndefined using relative urls. (Modules using absolute urls\nare likely from a different server, so this inheritence is\nnot likely the right thing in that case.)\n\n\nThis is working well for me, allowing\n\n        git clone -o myserver <url> project\n        cd project\n        git submodule init\n        git submoule update\n\nto work as expected, with all submodules pointing to\n\"myserver\" rather than \"origin\" and updating correctly despite\nbeing on detached heads.\n\nMark Levedahl\n"},{"id":"64977","messageId":"1200022189-2400-2-git-send-email-mlevedahl@gmail.com","threadId":"11573","inReplyTo":"1200022189-2400-1-git-send-email-mlevedahl@gmail.com","subject":"[PATCH] Teach remote machinery about remotes.default config variable","fromName":"Mark Levedahl","fromEmail":"mlevedahl@gmail.com","sentAt":"2008-01-11T03:29:46Z","receivedAt":"2008-01-11T03:29:46Z","isPatch":true,"sender":{"key":"mdl123@verizon.net","avatar":"https://avatars.githubusercontent.com/u/5302462?v=4"},"body":"This introduces a new configuration variable, remotes.default, that\ndefines the name of the default remote to be used. Traditionally, this\nis \"origin\", and could be overridden for a given branch. This change\nintroduces a way to redefine the default as desired and have that honored\nregardless of the currently checked out head (e.g., remotes.default is\nused when on a detached head or any other non-tracking branch).\n\nSigned-off-by: Mark Levedahl <mlevedahl@gmail.com>\n---\n Documentation/config.txt |    6 ++++++\n git-parse-remote.sh      |    5 +++--\n remote.c                 |   11 ++++++++++-\n 3 files changed, 19 insertions(+), 3 deletions(-)\n\ndiff --git a/Documentation/config.txt b/Documentation/config.txt\nindex 1b6d6d6..01ce295 100644\n--- a/Documentation/config.txt\n+++ b/Documentation/config.txt\n@@ -800,6 +800,12 @@ remote.<name>.tagopt::\n \tSetting this value to --no-tags disables automatic tag following when fetching\n \tfrom remote <name>\n \n+remotes.default::\n+\tThe name of the remote used by default for fetch / pull. If unset,\n+\torigin is assumed. This value is used whenever the current branch\n+\thas no corresponding branch.<name>.remote, such as when working on\n+\ta detached head.\n+\n remotes.<group>::\n \tThe list of remotes which are fetched by \"git remote update\n \t<group>\".  See linkgit:git-remote[1].\ndiff --git a/git-parse-remote.sh b/git-parse-remote.sh\nindex 695a409..1b235e0 100755\n--- a/git-parse-remote.sh\n+++ b/git-parse-remote.sh\n@@ -56,8 +56,9 @@ get_remote_url () {\n \n get_default_remote () {\n \tcurr_branch=$(git symbolic-ref -q HEAD | sed -e 's|^refs/heads/||')\n-\torigin=$(git config --get \"branch.$curr_branch.remote\")\n-\techo ${origin:-origin}\n+\tgit config --get \"branch.$curr_branch.remote\" ||\n+\tgit config --get \"remotes.default\" ||\n+\techo origin\n }\n \n get_remote_default_refs_for_push () {\ndiff --git a/remote.c b/remote.c\nindex 0e00680..4937237 100644\n--- a/remote.c\n+++ b/remote.c\n@@ -10,6 +10,7 @@ static int allocated_branches;\n \n static struct branch *current_branch;\n static const char *default_remote_name;\n+static const char *remotes_default_name;\n \n #define BUF_SIZE (2048)\n static char buffer[BUF_SIZE];\n@@ -233,6 +234,11 @@ static int handle_config(const char *key, const char *value)\n \t\t\tadd_merge(branch, xstrdup(value));\n \t\treturn 0;\n \t}\n+\tif (!strcmp(key, \"remotes.default\")) {\n+\t\tif (value)\n+\t\t\tremotes_default_name = xstrdup(value);\n+\t\treturn 0;\n+\t}\n \tif (prefixcmp(key,  \"remote.\"))\n \t\treturn 0;\n \tname = key + 7;\n@@ -291,7 +297,6 @@ static void read_config(void)\n \tint flag;\n \tif (default_remote_name) // did this already\n \t\treturn;\n-\tdefault_remote_name = xstrdup(\"origin\");\n \tcurrent_branch = NULL;\n \thead_ref = resolve_ref(\"HEAD\", sha1, 0, &flag);\n \tif (head_ref && (flag & REF_ISSYMREF) &&\n@@ -300,6 +305,10 @@ static void read_config(void)\n \t\t\tmake_branch(head_ref + strlen(\"refs/heads/\"), 0);\n \t}\n \tgit_config(handle_config);\n+\tif (!default_remote_name) {\n+\t\t\tdefault_remote_name = remotes_default_name ?\n+\t\t\t\tremotes_default_name : xstrdup(\"origin\");\n+\t}\n }\n \n struct refspec *parse_ref_spec(int nr_refspec, const char **refspec)\n-- \n1.5.4.rc2.99.g3ef7-dirty\n"},{"id":"64975","messageId":"1200022189-2400-3-git-send-email-mlevedahl@gmail.com","threadId":"11573","inReplyTo":"1200022189-2400-2-git-send-email-mlevedahl@gmail.com","subject":"[PATCH] git-remote - Unset remotes.default when deleting the default remote","fromName":"Mark Levedahl","fromEmail":"mlevedahl@gmail.com","sentAt":"2008-01-11T03:29:47Z","receivedAt":"2008-01-11T03:29:47Z","isPatch":true,"sender":{"key":"mdl123@verizon.net","avatar":"https://avatars.githubusercontent.com/u/5302462?v=4"},"body":"Signed-off-by: Mark Levedahl <mlevedahl@gmail.com>\n---\n git-remote.perl |    5 +++++\n 1 files changed, 5 insertions(+), 0 deletions(-)\n\ndiff --git a/git-remote.perl b/git-remote.perl\nindex d13e4c1..2469b59 100755\n--- a/git-remote.perl\n+++ b/git-remote.perl\n@@ -328,6 +328,11 @@ sub rm_remote {\n \n \t$git->command('config', '--remove-section', \"remote.$name\");\n \n+\tmy $defremote = $git->config(\"remotes.default\");\n+\tif (defined $defremote && $defremote eq $name) {\n+\t       $git->command(\"config\", \"--unset\", \"remotes.default\");\n+\t}\n+\n \teval {\n \t    my @trackers = $git->command('config', '--get-regexp',\n \t\t\t'branch.*.remote', $name);\n-- \n1.5.4.rc2.99.g3ef7-dirty\n"},{"id":"64979","messageId":"1200022189-2400-4-git-send-email-mlevedahl@gmail.com","threadId":"11573","inReplyTo":"1200022189-2400-3-git-send-email-mlevedahl@gmail.com","subject":"[PATCH] git-clone - Set remotes.default config variable","fromName":"Mark Levedahl","fromEmail":"mlevedahl@gmail.com","sentAt":"2008-01-11T03:29:48Z","receivedAt":"2008-01-11T03:29:48Z","isPatch":true,"sender":{"key":"mdl123@verizon.net","avatar":"https://avatars.githubusercontent.com/u/5302462?v=4"},"body":"This records the users choice of default remote name (by default \"origin\")\nas given by the -o option.\n\nSigned-off-by: Mark Levedahl <mlevedahl@gmail.com>\n---\n Documentation/git-clone.txt |    3 ++-\n git-clone.sh                |    1 +\n 2 files changed, 3 insertions(+), 1 deletions(-)\n\ndiff --git a/Documentation/git-clone.txt b/Documentation/git-clone.txt\nindex fdccbd4..7fd3ea1 100644\n--- a/Documentation/git-clone.txt\n+++ b/Documentation/git-clone.txt\n@@ -95,7 +95,8 @@ OPTIONS\n --origin <name>::\n -o <name>::\n \tInstead of using the remote name 'origin' to keep track\n-\tof the upstream repository, use <name> instead.\n+\tof the upstream repository, use <name> instead. The name\n+        is recorded in the  remotes.default config variable.\n \n --upload-pack <upload-pack>::\n -u <upload-pack>::\ndiff --git a/git-clone.sh b/git-clone.sh\nindex b4e858c..efbcee2 100755\n--- a/git-clone.sh\n+++ b/git-clone.sh\n@@ -242,6 +242,7 @@ fi &&\n export GIT_DIR &&\n GIT_CONFIG=\"$GIT_DIR/config\" git-init $quiet ${template+\"$template\"} || usage\n \n+git config remotes.default $origin\n if test -n \"$bare\"\n then\n \tGIT_CONFIG=\"$GIT_DIR/config\" git config core.bare true\n-- \n1.5.4.rc2.99.g3ef7-dirty\n"},{"id":"64978","messageId":"1200022189-2400-5-git-send-email-mlevedahl@gmail.com","threadId":"11573","inReplyTo":"1200022189-2400-4-git-send-email-mlevedahl@gmail.com","subject":"[PATCH] git-submodule - Possibly inherit parent's default remote on init/clone","fromName":"Mark Levedahl","fromEmail":"mlevedahl@gmail.com","sentAt":"2008-01-11T03:29:49Z","receivedAt":"2008-01-11T03:29:49Z","isPatch":true,"sender":{"key":"mdl123@verizon.net","avatar":"https://avatars.githubusercontent.com/u/5302462?v=4"},"body":"For submodules defined relative to their parent, it is likely that the\nparent's defined default remote is correct for the child as well. This\nallows use of remote names other than \"origin\", important as managed\nsubmodules are typically checked out on a detached head and therefore\nsubmodule-update invokes git-fetch using the default remote. Without this\nchange, submodules effectively had to have a default remote of \"origin.\"\n\nSigned-off-by: Mark Levedahl <mlevedahl@gmail.com>\n---\n Documentation/git-submodule.txt |    8 +++++---\n git-submodule.sh                |   15 ++++++++++++---\n 2 files changed, 17 insertions(+), 6 deletions(-)\n\ndiff --git a/Documentation/git-submodule.txt b/Documentation/git-submodule.txt\nindex cffc6d4..440e234 100644\n--- a/Documentation/git-submodule.txt\n+++ b/Documentation/git-submodule.txt\n@@ -36,9 +36,11 @@ status::\n \n init::\n \tInitialize the submodules, i.e. register in .git/config each submodule\n-\tname and url found in .gitmodules. The key used in .git/config is\n-\t`submodule.$name.url`. This command does not alter existing information\n-\tin .git/config.\n+\tname and url found in .gitmodules, along with the default remote origin.\n+\tFor submodules using a relative url, the default remote is inherited\n+\tfrom the parent project, for absolute urls the default \"origin\" is used.\n+\tThe key used in .git/config is submodule.$name.url`. This command does\n+\tnot alter existing information in .git/config.\n \n update::\n \tUpdate the registered submodules, i.e. clone missing submodules and\ndiff --git a/git-submodule.sh b/git-submodule.sh\nindex ad9fe62..30e0270 100755\n--- a/git-submodule.sh\n+++ b/git-submodule.sh\n@@ -7,6 +7,7 @@\n USAGE='[--quiet] [--cached] [add <repo> [-b branch]|status|init|update] [--] [<path>...]'\n OPTIONS_SPEC=\n . git-sh-setup\n+. git-parse-remote\n require_work_tree\n \n add=\n@@ -95,6 +96,7 @@ module_clone()\n {\n \tpath=$1\n \turl=$2\n+\torigin=${3:-origin}\n \n \t# If there already is a directory at the submodule path,\n \t# expect it to be empty (since that is the default checkout\n@@ -110,7 +112,7 @@ module_clone()\n \ttest -e \"$path\" &&\n \tdie \"A file already exist at path '$path'\"\n \n-\tgit-clone -n \"$url\" \"$path\" ||\n+\tgit-clone -n -o \"$origin\" \"$url\" \"$path\" ||\n \tdie \"Clone of '$url' into submodule path '$path' failed\"\n }\n \n@@ -130,9 +132,11 @@ module_add()\n \t\tusage\n \tfi\n \n+\torigin=origin\n \tcase \"$repo\" in\n \t./*|../*)\n \t\t# dereference source url relative to parent's url\n+\t\torigin=$(get_default_remote)\n \t\trealrepo=\"$(resolve_relative_url $repo)\" ;;\n \t*)\n \t\t# Turn the source into an absolute path if\n@@ -157,7 +161,7 @@ module_add()\n \tgit ls-files --error-unmatch \"$path\" > /dev/null 2>&1 &&\n \tdie \"'$path' already exists in the index\"\n \n-\tmodule_clone \"$path\" \"$realrepo\" || exit\n+\tmodule_clone \"$path\" \"$realrepo\" \"$origin\" || exit\n \t(unset GIT_DIR; cd \"$path\" && git checkout -q ${branch:+-b \"$branch\" \"origin/$branch\"}) ||\n \tdie \"Unable to checkout submodule '$path'\"\n \tgit add \"$path\" ||\n@@ -189,12 +193,15 @@ modules_init()\n \t\tdie \"No url found for submodule path '$path' in .gitmodules\"\n \n \t\t# Possibly a url relative to parent\n+\t\torigin=origin\n \t\tcase \"$url\" in\n \t\t./*|../*)\n \t\t\turl=\"$(resolve_relative_url \"$url\")\"\n+\t\t\torigin=$(get_default_remote)\n \t\t\t;;\n \t\tesac\n \n+\t\tgit config submodule.\"$name\".origin \"$origin\" &&\n \t\tgit config submodule.\"$name\".url \"$url\" ||\n \t\tdie \"Failed to register url for submodule path '$path'\"\n \n@@ -222,10 +229,12 @@ modules_update()\n \t\t\tsay \"Submodule path '$path' not initialized\"\n \t\t\tcontinue\n \t\tfi\n+\t\torigin=$(git config submodule.\"$name\".origin)\n+\t\torigin=${origin:-origin}\n \n \t\tif ! test -d \"$path\"/.git\n \t\tthen\n-\t\t\tmodule_clone \"$path\" \"$url\" || exit\n+\t\t\tmodule_clone \"$path\" \"$url\" \"$origin\" || exit\n \t\t\tsubsha1=\n \t\telse\n \t\t\tsubsha1=$(unset GIT_DIR; cd \"$path\" &&\n-- \n1.5.4.rc2.99.g3ef7-dirty\n"},{"id":"64995","messageId":"7v1w8o4ws0.fsf@gitster.siamese.dyndns.org","threadId":"11573","inReplyTo":"1200022189-2400-2-git-send-email-mlevedahl@gmail.com","subject":"Re: [PATCH] Teach remote machinery about remotes.default config variable","fromName":"Junio C Hamano","fromEmail":"gitster@pobox.com","sentAt":"2008-01-11T08:00:15Z","receivedAt":"2008-01-11T08:00:15Z","isPatch":true,"sender":{"key":"gitster@pobox.com","avatar":"https://avatars.githubusercontent.com/u/54884?v=4"},"body":"Mark Levedahl <mlevedahl@gmail.com> writes:\n\n> This introduces a new configuration variable, remotes.default, that\n> defines the name of the default remote to be used.\n\nDoes this mean \"default\" is now a new reserved word that cannot\nbe used as \"git remote update default\"?\n\n> ... Traditionally, this\n> is \"origin\", and could be overridden for a given branch. This change\n> introduces a way to redefine the default as desired and have that honored\n> regardless of the currently checked out head (e.g., remotes.default is\n> used when on a detached head or any other non-tracking branch).\n\nI'd 100% agree that being able to use anything not just\nhardcoded 'origin' is much better than not being able to.  I do\nnot have much against that goal.\n\nHowever, it is a bit hard to judge how much of inconvenience it\nreally is in your real life that the current behaviour does not\nallow you to.\n\nIn your cover letter, you said:\n\n>> As my project is distributed across multiple domains with\n>> many firewalls and airgaps such that no single server is\n>> available to all, we really need to use nicknames to refer\n>> to different servers,...\n\nIf you need to access different repositories on different\nmachines from your submodules, you would of course need to\naccess different domains from your submodule repositories.  But\nthat does not mean each of them cannot be named 'origin'.  That\nname is local to each of the submodule (and the toplevel) and\ncan point at different domains over different transfer channels.\n\n> diff --git a/git-parse-remote.sh b/git-parse-remote.sh\n> index 695a409..1b235e0 100755\n> --- a/git-parse-remote.sh\n> +++ b/git-parse-remote.sh\n> @@ -56,8 +56,9 @@ get_remote_url () {\n>  \n>  get_default_remote () {\n>  \tcurr_branch=$(git symbolic-ref -q HEAD | sed -e 's|^refs/heads/||')\n> -\torigin=$(git config --get \"branch.$curr_branch.remote\")\n> -\techo ${origin:-origin}\n> +\tgit config --get \"branch.$curr_branch.remote\" ||\n> +\tgit config --get \"remotes.default\" ||\n> +\techo origin\n\nThis sequence cascaded with || is much nicer than the original,\neven if it did not change the behaviour.\n\n> @@ -300,6 +305,10 @@ static void read_config(void)\n>  \t\t\tmake_branch(head_ref + strlen(\"refs/heads/\"), 0);\n>  \t}\n>  \tgit_config(handle_config);\n> +\tif (!default_remote_name) {\n> +\t\t\tdefault_remote_name = remotes_default_name ?\n> +\t\t\t\tremotes_default_name : xstrdup(\"origin\");\n> +\t}\n\nIs this a bit too deep indentation?\n"},{"id":"65008","messageId":"Pine.LNX.4.64.0801111301360.14355@wbgn129.biozentrum.uni-wuerzburg.de","threadId":"11573","inReplyTo":"1200022189-2400-1-git-send-email-mlevedahl@gmail.com","subject":"Re: Allowing override of the default \"origin\" nickname","fromName":"Johannes Schindelin","fromEmail":"johannes.schindelin@gmx.de","sentAt":"2008-01-11T12:03:19Z","receivedAt":"2008-01-11T12:03:19Z","isPatch":false,"sender":{"key":"johannes.schindelin@gmx.de","avatar":"https://avatars.githubusercontent.com/u/127790?v=4"},"body":"Hi,\n\nOn Thu, 10 Jan 2008, Mark Levedahl wrote:\n\n> git's current support for remote nicknames other than\n> \"origin\" is restricted to tracking branches where\n> branch.<name>.remote is defined.\n\nIIUC your patch only replaces the term \"origin\" by something \nuser-specifiable.  I fail to see the use of it; care to explain what \nworkflow is easier with your patches than without?\n\nCiao,\nDscho\n"},{"id":"65015","messageId":"30e4a070801110506h19b77488sbfa6ae48701f30f9@mail.gmail.com","threadId":"11573","inReplyTo":"Pine.LNX.4.64.0801111301360.14355@wbgn129.biozentrum.uni-wuerzburg.de","subject":"Re: Allowing override of the default \"origin\" nickname","fromName":"Mark Levedahl","fromEmail":"mlevedahl@gmail.com","sentAt":"2008-01-11T13:06:08Z","receivedAt":"2008-01-11T13:06:08Z","isPatch":false,"sender":{"key":"mdl123@verizon.net","avatar":"https://avatars.githubusercontent.com/u/5302462?v=4"},"body":"On Jan 11, 2008 7:03 AM, Johannes Schindelin <Johannes.Schindelin@gmx.de> wrote:\n> Hi,\n>\n> IIUC your patch only replaces the term \"origin\" by something\n> user-specifiable.  I fail to see the use of it; care to explain what\n> workflow is easier with your patches than without?\n>\n> Ciao,\n> Dscho\n\nConsider a project with several servers, each of which is *supposed*\nis host the same project but due to lags in mirroring across airgaps,\netc., are never quite in sync. Now, we get on a teleconference and\ndiscuss issues, find differences, and everyone reports that \"origin\"\nhas x, but in fact \"origin\" means different servers to almost\neveryone. Also consider that only a small subset of the group really\nunderstands git, most just follow cook-book recipes to get their work\ndone and don't understand what is going on.\n\nThis is my problem: \"origin\" is an abstraction that hides the\ndifferent server names in use and makes communication difficult,\nhaving everyone use nicknames related to their particular upstream\nserver reduces the confusion.\n\nMark\n"},{"id":"65020","messageId":"alpine.LSU.1.00.0801111348230.31053@racer.site","threadId":"11573","inReplyTo":"30e4a070801110506h19b77488sbfa6ae48701f30f9@mail.gmail.com","subject":"Re: Allowing override of the default \"origin\" nickname","fromName":"Johannes Schindelin","fromEmail":"johannes.schindelin@gmx.de","sentAt":"2008-01-11T13:52:00Z","receivedAt":"2008-01-11T13:52:00Z","isPatch":false,"sender":{"key":"johannes.schindelin@gmx.de","avatar":"https://avatars.githubusercontent.com/u/127790?v=4"},"body":"Hi,\n\nOn Fri, 11 Jan 2008, Mark Levedahl wrote:\n\n> On Jan 11, 2008 7:03 AM, Johannes Schindelin <Johannes.Schindelin@gmx.de> wrote:\n>\n> > IIUC your patch only replaces the term \"origin\" by something \n> > user-specifiable.  I fail to see the use of it; care to explain what \n> > workflow is easier with your patches than without?\n> \n> Consider a project with several servers, each of which is *supposed* is \n> host the same project but due to lags in mirroring across airgaps, etc., \n> are never quite in sync. Now, we get on a teleconference and discuss \n> issues, find differences, and everyone reports that \"origin\" has x, but \n> in fact \"origin\" means different servers to almost everyone. Also \n> consider that only a small subset of the group really understands git, \n> most just follow cook-book recipes to get their work done and don't \n> understand what is going on.\n\nOkay, I now understand your intention much better than before.\n\n> This is my problem: \"origin\" is an abstraction that hides the different \n> server names in use and makes communication difficult, having everyone \n> use nicknames related to their particular upstream server reduces the \n> confusion.\n\nUnfortunately, I think this will just lead to even more confusion.  \nBecause those people following recipes without thinking will now use a \nname that does not even say the role, let alone the server.\n\nIOW I think that your patch worsens the situation you describe.\n\nIMHO you should optimise the communication by agreeing on one origin, \nor alternatively not talk about a server at all (which is made easy by the \nglobal uniqueness of commit names; just say \"my tip is ac9b7192\").\n\nCiao,\nDscho\n"},{"id":"65023","messageId":"30e4a070801110653n61a826c0y33ed13f95cddf25d@mail.gmail.com","threadId":"11573","inReplyTo":"alpine.LSU.1.00.0801111348230.31053@racer.site","subject":"Re: Allowing override of the default \"origin\" nickname","fromName":"Mark Levedahl","fromEmail":"mlevedahl@gmail.com","sentAt":"2008-01-11T14:53:56Z","receivedAt":"2008-01-11T14:53:56Z","isPatch":false,"sender":{"key":"mdl123@verizon.net","avatar":"https://avatars.githubusercontent.com/u/5302462?v=4"},"body":"On Jan 11, 2008 8:52 AM, Johannes Schindelin <Johannes.Schindelin@gmx.de> wrote:\n>\n> IMHO you should optimise the communication by agreeing on one origin,\n> or alternatively not talk about a server at all (which is made easy by the\n> global uniqueness of commit names; just say \"my tip is ac9b7192\").\n>\n\nWe *cannot* agree on one definition of \"origin\": there is no single\nserver accessible by all, but use of submodules currently *requires*\nthat each repo's upstream be given the nickname \"origin\". With this\nchange, I can enforce that each server has a unique nickname and that\none unique nickname per server is used across the program. Absent\nthis, I cannot and end up having to have everyone translate \"origin\"\ninto what it means for them.\n\nSHA-1's are absolutely unique, but what do you do when \"origin\" does\nnot have  acdc101? I want to know that server-x@joe.com doesn't have\nit, while server-y@mary.org does. This is the frequent problem in\nconversation, and is the reason we have to be able to talk about the\nparticular upstream server.\n\nThis change does not eliminate the ability to obscure multiple\ndifferent server names using \"origin\" for those who think that is the\nbest way to do things, it just eliminates the requirement for doing\nso.\n\nMark\n"},{"id":"65024","messageId":"alpine.LSU.1.00.0801111501510.31053@racer.site","threadId":"11573","inReplyTo":"30e4a070801110653n61a826c0y33ed13f95cddf25d@mail.gmail.com","subject":"Re: Allowing override of the default \"origin\" nickname","fromName":"Johannes Schindelin","fromEmail":"johannes.schindelin@gmx.de","sentAt":"2008-01-11T15:03:11Z","receivedAt":"2008-01-11T15:03:11Z","isPatch":false,"sender":{"key":"johannes.schindelin@gmx.de","avatar":"https://avatars.githubusercontent.com/u/127790?v=4"},"body":"Hi,\n\nOn Fri, 11 Jan 2008, Mark Levedahl wrote:\n\n> On Jan 11, 2008 8:52 AM, Johannes Schindelin <Johannes.Schindelin@gmx.de> wrote:\n> >\n> > IMHO you should optimise the communication by agreeing on one origin, \n> > or alternatively not talk about a server at all (which is made easy by \n> > the global uniqueness of commit names; just say \"my tip is ac9b7192\").\n> \n> We *cannot* agree on one definition of \"origin\": there is no single \n> server accessible by all, but use of submodules currently *requires* \n> that each repo's upstream be given the nickname \"origin\". With this \n> change, I can enforce that each server has a unique nickname and that \n> one unique nickname per server is used across the program. Absent this, \n> I cannot and end up having to have everyone translate \"origin\" into what \n> it means for them.\n> \n> SHA-1's are absolutely unique, but what do you do when \"origin\" does not \n> have acdc101? I want to know that server-x@joe.com doesn't have it, \n> while server-y@mary.org does. This is the frequent problem in \n> conversation, and is the reason we have to be able to talk about the \n> particular upstream server.\n\nOkay, so with your change the user has to either remember or lookup which \nis the default remote.  Without your change, the user has to either \nremember or lookup where origin points to.\n\nI still think your change does not help.\n\nCiao,\nDscho\n"},{"id":"65025","messageId":"m3odbsmlkr.fsf@roke.D-201","threadId":"11573","inReplyTo":"30e4a070801110653n61a826c0y33ed13f95cddf25d@mail.gmail.com","subject":"Re: Allowing override of the default \"origin\" nickname","fromName":"Jakub Narebski","fromEmail":"jnareb@gmail.com","sentAt":"2008-01-11T15:25:03Z","receivedAt":"2008-01-11T15:25:03Z","isPatch":false,"sender":{"key":"jnareb@gmail.com","avatar":"https://avatars.githubusercontent.com/u/2706?v=4"},"body":"\"Mark Levedahl\" <mlevedahl@gmail.com> writes:\n\n> On Jan 11, 2008 8:52 AM, Johannes Schindelin <Johannes.Schindelin@gmx.de> wrote:\n> >\n> > IMHO you should optimise the communication by agreeing on one origin,\n> > or alternatively not talk about a server at all (which is made easy by the\n> > global uniqueness of commit names; just say \"my tip is ac9b7192\").\n> >\n> \n> We *cannot* agree on one definition of \"origin\": there is no single\n> server accessible by all, but use of submodules currently *requires*\n> that each repo's upstream be given the nickname \"origin\". With this\n> change, I can enforce that each server has a unique nickname and that\n> one unique nickname per server is used across the program. Absent\n> this, I cannot and end up having to have everyone translate \"origin\"\n> into what it means for them.\n> \n> SHA-1's are absolutely unique, but what do you do when \"origin\" does\n> not have  acdc101? I want to know that server-x@joe.com doesn't have\n> it, while server-y@mary.org does. This is the frequent problem in\n> conversation, and is the reason we have to be able to talk about the\n> particular upstream server.\n> \n> This change does not eliminate the ability to obscure multiple\n> different server names using \"origin\" for those who think that is the\n> best way to do things, it just eliminates the requirement for doing\n> so.\n\nDscho, although I can agree that more flexibility is not always a good\nthing, I think that in this situation it is a good thing. I especially\nlike that git-clone remembers what name it used for upstream repository\n(git clone --origin <name>).\n\nMark, if this change is mainly about the fact that git doesn't allow\nto specify default remote to fetch for detached HEAD (and submodules\nuse detached HEAD), why not provide \"branch.HEAD.remote\" etc., which\nwould be used _only_ if we are on detached HEAD (i.e. branch has no\nname).\n\n-- \nJakub Narebski\nPoland\nShadeHawk on #git\n"},{"id":"65031","messageId":"30e4a070801110815q1dee8f0cr7966fc2896e4c790@mail.gmail.com","threadId":"11573","inReplyTo":"m3odbsmlkr.fsf@roke.D-201","subject":"Re: Allowing override of the default \"origin\" nickname","fromName":"Mark Levedahl","fromEmail":"mlevedahl@gmail.com","sentAt":"2008-01-11T16:15:02Z","receivedAt":"2008-01-11T16:15:02Z","isPatch":false,"sender":{"key":"mdl123@verizon.net","avatar":"https://avatars.githubusercontent.com/u/5302462?v=4"},"body":"On Jan 11, 2008 10:25 AM, Jakub Narebski <jnareb@gmail.com> wrote:\n>\n> Mark, if this change is mainly about the fact that git doesn't allow\n> to specify default remote to fetch for detached HEAD (and submodules\n> use detached HEAD), why not provide \"branch.HEAD.remote\" etc., which\n> would be used _only_ if we are on detached HEAD (i.e. branch has no\n> name).\n>\nPractically speaking, this would just change the name of the config\nvariable (from remotes.default to branch.HEAD.remote). However, this\nvalue is used *whenever* the current branch does not have\ncorresponding branch.<name>.remote, and that is not restricted to\ndetached heads, it applies anytime the current HEAD is not a tracking\nbranch. So, I believe remotes.default better reflects this generality\nthan does branch.HEAD.remote.\n\nMark\n"},{"id":"65034","messageId":"30e4a070801110839j6b27e224j9a83fc9975f2e4c6@mail.gmail.com","threadId":"11573","inReplyTo":"alpine.LSU.1.00.0801111501510.31053@racer.site","subject":"Re: Allowing override of the default \"origin\" nickname","fromName":"Mark Levedahl","fromEmail":"mlevedahl@gmail.com","sentAt":"2008-01-11T16:39:48Z","receivedAt":"2008-01-11T16:39:48Z","isPatch":false,"sender":{"key":"mdl123@verizon.net","avatar":"https://avatars.githubusercontent.com/u/5302462?v=4"},"body":"On Jan 11, 2008 10:03 AM, Johannes Schindelin >\n> Okay, so with your change the user has to either remember or lookup which\n> is the default remote.  Without your change, the user has to either\n> remember or lookup where origin points to.\n>\n> I still think your change does not help.\n\nThat's a theoretical argument: my *experience* with trying to make the\ncurrent workflow operate was sufficiently bad and troublesome that it\ncaused me to write code and fix it to enable the new workflow. Also,\nabsent submodules the new workflow is fully supported by\nbranch.<name>.remote: are you advocating the elimination of that\nexisting feature?\n\nMark\n"},{"id":"65035","messageId":"20080111170127.GA23893@atjola.homenet","threadId":"11573","inReplyTo":"30e4a070801110839j6b27e224j9a83fc9975f2e4c6@mail.gmail.com","subject":"Re: Allowing override of the default \"origin\" nickname","fromName":"Björn Steinbrink","fromEmail":"b.steinbrink@gmx.de","sentAt":"2008-01-11T17:01:27Z","receivedAt":"2008-01-11T17:01:27Z","isPatch":false,"sender":{"key":"b.steinbrink@gmx.de","avatar":"https://avatars.githubusercontent.com/u/230962?v=4"},"body":"On 2008.01.11 11:39:48 -0500, Mark Levedahl wrote:\n> On Jan 11, 2008 10:03 AM, Johannes Schindelin >\n> > Okay, so with your change the user has to either remember or lookup which\n> > is the default remote.  Without your change, the user has to either\n> > remember or lookup where origin points to.\n> >\n> > I still think your change does not help.\n> \n> That's a theoretical argument: my *experience* with trying to make the\n> current workflow operate was sufficiently bad and troublesome that it\n> caused me to write code and fix it to enable the new workflow. Also,\n> absent submodules the new workflow is fully supported by\n> branch.<name>.remote: are you advocating the elimination of that\n> existing feature?\n\nAFAICT your main point is that you can do:\ngit config --get remotes.default\n\nand get an unique _symbolic_ name, right? So while you still need to\nlookup the value of remotes.default, you get e.g. \"myremote\" instead of\n\"git://myremote/foo.git\" which you get from \"git remote show origin\". At\nleast that's how I interpreted it. Your argumentation wasn't that clear\non what you actually want to achieve/improve and why just looking up\n\"origin\" isn't enough, IMHO.\n\nA different approach, which feels more in-line with the current state of\nthings, might be to allow remote aliases. \"origin\" would be an alias of\n\"myremote\", and \"git remote show origin\" might say \"origin is an alias\nfor myremote\" followed by the details of \"myremote\". So that would give\nyou the same benefit, but \"origin\" would keep its meaning, and you would\nnot get different behaviour depending on some configuration setting (so\nthe poor folks on #git can just assume that \"origin\" is the default for\neveryone).\n\nAdmittedly, I don't see any use-case for aliases except for that origin\nthing, but maybe someone else does?\n\nBjörn\n"},{"id":"65038","messageId":"m3k5mgmfwq.fsf@roke.D-201","threadId":"11573","inReplyTo":"20080111170127.GA23893@atjola.homenet","subject":"Re: Allowing override of the default \"origin\" nickname","fromName":"Jakub Narebski","fromEmail":"jnareb@gmail.com","sentAt":"2008-01-11T17:27:56Z","receivedAt":"2008-01-11T17:27:56Z","isPatch":false,"sender":{"key":"jnareb@gmail.com","avatar":"https://avatars.githubusercontent.com/u/2706?v=4"},"body":"Björn Steinbrink <B.Steinbrink@gmx.de> writes:\n\n> A different approach, which feels more in-line with the current state of\n> things, might be to allow remote aliases. \"origin\" would be an alias of\n> \"myremote\", and \"git remote show origin\" might say \"origin is an alias\n> for myremote\" followed by the details of \"myremote\". So that would give\n> you the same benefit, but \"origin\" would keep its meaning, and you would\n> not get different behaviour depending on some configuration setting (so\n> the poor folks on #git can just assume that \"origin\" is the default for\n> everyone).\n> \n> Admittedly, I don't see any use-case for aliases except for that origin\n> thing, but maybe someone else does?\n\nAliases for remotes can address current deficiency in git, namely that\nyou cannot have push and pull under the same remote if they use different\nURLs. One could use such alias to have the same name for pull and for push.\n\n-- \nJakub Narebski\nPoland\nShadeHawk on #git\n"},{"id":"65058","messageId":"30e4a070801111252s4e17b9c4m62adeb9032963e66@mail.gmail.com","threadId":"11573","inReplyTo":"7v1w8o4ws0.fsf@gitster.siamese.dyndns.org","subject":"Re: [PATCH] Teach remote machinery about remotes.default config variable","fromName":"Mark Levedahl","fromEmail":"mlevedahl@gmail.com","sentAt":"2008-01-11T20:52:12Z","receivedAt":"2008-01-11T20:52:12Z","isPatch":true,"sender":{"key":"mdl123@verizon.net","avatar":"https://avatars.githubusercontent.com/u/5302462?v=4"},"body":"On Jan 11, 2008 3:00 AM, Junio C Hamano <gitster@pobox.com> wrote:\n>\n> Does this mean \"default\" is now a new reserved word that cannot\n> be used as \"git remote update default\"?\n\noops...git-remote already has a (partially undocumented) use for\nremotes.* as well as remote.*, so I need another variable name,\nprobably core.origin to avoid either defining new namespace or\npolluting one reserved for arbitrary end-user use. Will resend patches\nlater tonight.\n\n>\n> However, it is a bit hard to judge how much of inconvenience it\n> really is in your real life that the current behaviour does not\n> allow you to.\n\nI believe I addressed this in the thread with Dscho.\n\n> >       git_config(handle_config);\n> > +     if (!default_remote_name) {\n> > +                     default_remote_name = remotes_default_name ?\n> > +                             remotes_default_name : xstrdup(\"origin\");\n> > +     }\n>\n> Is this a bit too deep indentation?\n>\n\nwill fix.\n\n\nMark\n"},{"id":"65061","messageId":"alpine.LSU.1.00.0801112111170.31053@racer.site","threadId":"11573","inReplyTo":"30e4a070801110815q1dee8f0cr7966fc2896e4c790@mail.gmail.com","subject":"Re: Allowing override of the default \"origin\" nickname","fromName":"Johannes Schindelin","fromEmail":"johannes.schindelin@gmx.de","sentAt":"2008-01-11T21:12:59Z","receivedAt":"2008-01-11T21:12:59Z","isPatch":false,"sender":{"key":"johannes.schindelin@gmx.de","avatar":"https://avatars.githubusercontent.com/u/127790?v=4"},"body":"Hi,\n\nOn Fri, 11 Jan 2008, Mark Levedahl wrote:\n\n> On Jan 11, 2008 10:25 AM, Jakub Narebski <jnareb@gmail.com> wrote:\n> >\n> > Mark, if this change is mainly about the fact that git doesn't allow \n> > to specify default remote to fetch for detached HEAD (and submodules \n> > use detached HEAD), why not provide \"branch.HEAD.remote\" etc., which \n> > would be used _only_ if we are on detached HEAD (i.e. branch has no \n> > name).\n>\n> Practically speaking, this would just change the name of the config \n> variable (from remotes.default to branch.HEAD.remote). However, this \n> value is used *whenever* the current branch does not have corresponding \n> branch.<name>.remote, and that is not restricted to detached heads, it \n> applies anytime the current HEAD is not a tracking branch. So, I believe \n> remotes.default better reflects this generality than does \n> branch.HEAD.remote.\n\nPractically speaking, I have enough experience to _know_ that your \nsolution will not help very much.  It will just add to confusion.\n\nYou stated quite clearly -- _after_ I asked -- what your problem is, and I \nam quite certain that you _still_ have to look up _something_ (as I \nremarked in the email you responded to).\n\nSo it is still _utterly_ unclear to me how your patch helps anything.\n\nCiao,\nDscho\n"},{"id":"65079","messageId":"alpine.LNX.1.00.0801111752360.13593@iabervon.org","threadId":"11573","inReplyTo":"1200022189-2400-1-git-send-email-mlevedahl@gmail.com","subject":"Re: Allowing override of the default \"origin\" nickname","fromName":"Daniel Barkalow","fromEmail":"barkalow@iabervon.org","sentAt":"2008-01-11T23:11:50Z","receivedAt":"2008-01-11T23:11:50Z","isPatch":false,"sender":{"key":"barkalow@iabervon.org","avatar":"https://avatars.githubusercontent.com/u/55364219?v=4"},"body":"I'm not sure if this is actually relevant to your situation, but I've got \na patch (which I'll probably send post-1.5.4) to allow configuration of \naliases for URLs, such that git will rewrite (for example) \nmaster.kernel.org:/pub/... to git://git.kernel.org/pub/...; if you're \nreading a discussion between kernel.org users on the linux-kernel mailing \nlist and you don't have a kernel.org account, and you want to try things, \nthis patch makes it a lot easier (cut-and-paste the URL you can't actually \nuse, and it uses the variant you prefer without making you deal with it \nfor each URL).\n\nIf, for each person, there's a single best access method to the data, but \nthere's no single access method that works for all of the participants, \nthey could use this patch, and use per-user configuration to replace all \nof the other possible names with the one they have to use.\n\n\t-Daniel\n*This .sig left intentionally blank*\n"},{"id":"65111","messageId":"7v63xzzszp.fsf@gitster.siamese.dyndns.org","threadId":"11573","inReplyTo":"30e4a070801111252s4e17b9c4m62adeb9032963e66@mail.gmail.com","subject":"Re: [PATCH] Teach remote machinery about remotes.default config variable","fromName":"Junio C Hamano","fromEmail":"gitster@pobox.com","sentAt":"2008-01-12T02:18:34Z","receivedAt":"2008-01-12T02:18:34Z","isPatch":true,"sender":{"key":"gitster@pobox.com","avatar":"https://avatars.githubusercontent.com/u/54884?v=4"},"body":"\"Mark Levedahl\" <mlevedahl@gmail.com> writes:\n\n>> However, it is a bit hard to judge how much of inconvenience it\n>> really is in your real life that the current behaviour does not\n>> allow you to.\n>\n> I believe I addressed this in the thread with Dscho.\n\nThanks.\n\nI have to admit that I happen to agree with Dscho.  I do not see\nthis helping to solve communication issues very much.\n"},{"id":"65127","messageId":"478855B5.9070600@gmail.com","threadId":"11573","inReplyTo":"7v63xzzszp.fsf@gitster.siamese.dyndns.org","subject":"Re: [PATCH] Teach remote machinery about remotes.default config variable","fromName":"Mark Levedahl","fromEmail":"mlevedahl@gmail.com","sentAt":"2008-01-12T05:52:53Z","receivedAt":"2008-01-12T05:52:53Z","isPatch":true,"sender":{"key":"mdl123@verizon.net","avatar":"https://avatars.githubusercontent.com/u/5302462?v=4"},"body":"Junio C Hamano wrote:\n> \"Mark Levedahl\" <mlevedahl@gmail.com> writes:\n>   \n> Thanks.\n>\n> I have to admit that I happen to agree with Dscho.  I do not see\n> this helping to solve communication issues very much.\n>   \nJunio,\n\nMy use really is a different use-case than is typical. Origin is a great \nconcept for the common case of projects with a single upstream \nrepository. Except for cloning, you don't have to know or care the name \nof the upstream as you move from project to project, it is just always \n\"origin\" and you use the same remote nickname in each.\n\nThis breaks down in a project like mine where there are multiple servers \nand the differences are important. Content and usage vary server to \nserver, not just connectivity. At this point, hiding the server names is \ncounterproductive. Basically, use of origin is data hiding, and data \nhiding is not good when you actually need the data.\n\nAcross the git project, I believe everyone basically understands origin \nas git.kernel.org/..., and origin is not ambiguous. There is just one \nserver. For my project, there are multiple servers and a number of us \npull from and push to multiple servers with no intent that any one \nserver has everything (This multiplicity is necessary for several \nreasons, and we have various guards in place restrict the content of \ndifferent servers). Thus, there really is no usefully defined *origin*. \nThere just isn't. This is where the disagreements lie.\n\nThe argument against my approach of explicitly naming the server rests \nupon the premise that hiding a half-dozen servers, all different and \nwith those differences being important, under the single universal name \n\"origin\", makes things easier. It doesn't when different servers are \ndifferent. Yes, it is possible to figure out what \"origin\" means at a \ngiven client, and thus understand how to address a given server from \nthat client. That is the essence of the problem. It is clear to address \nserver1 as \"server1\", and server3 as \"server3.\" It is not helpful to \nsometimes refer to server1 as origin, sometimes as server3, and thus \nneed to know the definition of origin to know how to name the server. \nFor the \"normal\" git use-case the specific definition of origin is \nunimportant when you use it and so provides a useful abstraction. That I \nmust know what origin means in order to know what to do indicates the \nabstraction is counter-productive.\n\nUntil we started using sub-modules, we used git clone --origin \n<nickname> and per our standard usage never even had \"origin\" defined. \nWe just agreed on a common set of nicknames for our servers and used \nthose. Not everyone had all the remotes defined, but nickname \"foo\" \nmeant the same thing everywhere it was defined. That worked very well \nfor us.\n\nSo, all I am doing here is trying to extend a basic multi-server \ncapability git already has for a monolithic project into projects using \nsub-modules. This will let us resume working the way we did before and \nstop overloading a single nickname (origin) with multiple meanings.\n\nMark\n"},{"id":"65129","messageId":"1200117273-3524-1-git-send-email-mlevedahl@gmail.com","threadId":"11573","inReplyTo":"7v63xzzszp.fsf@gitster.siamese.dyndns.org","subject":"[PATCH] Teach remote machinery about core.origin config variable","fromName":"Mark Levedahl","fromEmail":"mlevedahl@gmail.com","sentAt":"2008-01-12T05:54:30Z","receivedAt":"2008-01-12T05:54:30Z","isPatch":true,"sender":{"key":"mdl123@verizon.net","avatar":"https://avatars.githubusercontent.com/u/5302462?v=4"},"body":"This introduces a new configuration variable, core.origin, that\ndefines the name of the default remote to be used. Traditionally, this\nis \"origin\", and could be overridden for a given branch. This change\nintroduces a way to redefine the default as desired and have that honored\nregardless of the currently checked out head (e.g., core.origin is\nused when on a detached head or any other non-tracking branch).\n\nSigned-off-by: Mark Levedahl <mlevedahl@gmail.com>\n---\n Documentation/config.txt |    6 ++++++\n git-parse-remote.sh      |    5 +++--\n remote.c                 |   11 ++++++++++-\n 3 files changed, 19 insertions(+), 3 deletions(-)\n\ndiff --git a/Documentation/config.txt b/Documentation/config.txt\nindex 1b6d6d6..a0bdf14 100644\n--- a/Documentation/config.txt\n+++ b/Documentation/config.txt\n@@ -291,6 +291,12 @@ core.editor::\n \t`GIT_EDITOR` environment, `core.editor`, `VISUAL` and\n \t`EDITOR` environment variables and then finally `vi`.\n \n+core.origin::\n+\tThe name of the remote used by default for fetch / pull. If unset,\n+\torigin is assumed. This value is used whenever the current branch\n+\thas no corresponding branch.<name>.remote, such as when working on\n+\ta detached head.\n+\n core.pager::\n \tThe command that git will use to paginate output.  Can be overridden\n \twith the `GIT_PAGER` environment variable.\ndiff --git a/git-parse-remote.sh b/git-parse-remote.sh\nindex 695a409..c7ac7c7 100755\n--- a/git-parse-remote.sh\n+++ b/git-parse-remote.sh\n@@ -56,8 +56,9 @@ get_remote_url () {\n \n get_default_remote () {\n \tcurr_branch=$(git symbolic-ref -q HEAD | sed -e 's|^refs/heads/||')\n-\torigin=$(git config --get \"branch.$curr_branch.remote\")\n-\techo ${origin:-origin}\n+\tgit config --get \"branch.$curr_branch.remote\" ||\n+\tgit config --get \"core.origin\" ||\n+\techo origin\n }\n \n get_remote_default_refs_for_push () {\ndiff --git a/remote.c b/remote.c\nindex 0e00680..302d499 100644\n--- a/remote.c\n+++ b/remote.c\n@@ -10,6 +10,7 @@ static int allocated_branches;\n \n static struct branch *current_branch;\n static const char *default_remote_name;\n+static const char *core_origin;\n \n #define BUF_SIZE (2048)\n static char buffer[BUF_SIZE];\n@@ -233,6 +234,11 @@ static int handle_config(const char *key, const char *value)\n \t\t\tadd_merge(branch, xstrdup(value));\n \t\treturn 0;\n \t}\n+\tif (!strcmp(key, \"core.origin\")) {\n+\t\tif (value)\n+\t\t\tcore_origin = xstrdup(value);\n+\t\treturn 0;\n+\t}\n \tif (prefixcmp(key,  \"remote.\"))\n \t\treturn 0;\n \tname = key + 7;\n@@ -291,7 +297,6 @@ static void read_config(void)\n \tint flag;\n \tif (default_remote_name) // did this already\n \t\treturn;\n-\tdefault_remote_name = xstrdup(\"origin\");\n \tcurrent_branch = NULL;\n \thead_ref = resolve_ref(\"HEAD\", sha1, 0, &flag);\n \tif (head_ref && (flag & REF_ISSYMREF) &&\n@@ -300,6 +305,10 @@ static void read_config(void)\n \t\t\tmake_branch(head_ref + strlen(\"refs/heads/\"), 0);\n \t}\n \tgit_config(handle_config);\n+\tif (!default_remote_name) {\n+\t\tdefault_remote_name = core_origin ?\n+\t\tcore_origin : xstrdup(\"origin\");\n+\t}\n }\n \n struct refspec *parse_ref_spec(int nr_refspec, const char **refspec)\n-- \n1.5.4.rc2.98.g1f3d5\n"},{"id":"65130","messageId":"1200117273-3524-2-git-send-email-mlevedahl@gmail.com","threadId":"11573","inReplyTo":"1200117273-3524-1-git-send-email-mlevedahl@gmail.com","subject":"[PATCH] git-remote - Unset core.origin when deleting the default remote","fromName":"Mark Levedahl","fromEmail":"mlevedahl@gmail.com","sentAt":"2008-01-12T05:54:31Z","receivedAt":"2008-01-12T05:54:31Z","isPatch":true,"sender":{"key":"mdl123@verizon.net","avatar":"https://avatars.githubusercontent.com/u/5302462?v=4"},"body":"Signed-off-by: Mark Levedahl <mlevedahl@gmail.com>\n---\n git-remote.perl |    5 +++++\n 1 files changed, 5 insertions(+), 0 deletions(-)\n\ndiff --git a/git-remote.perl b/git-remote.perl\nindex d13e4c1..75d2371 100755\n--- a/git-remote.perl\n+++ b/git-remote.perl\n@@ -328,6 +328,11 @@ sub rm_remote {\n \n \t$git->command('config', '--remove-section', \"remote.$name\");\n \n+\tmy $defremote = $git->config(\"core.origin\");\n+\tif (defined $defremote && $defremote eq $name) {\n+\t       $git->command(\"config\", \"--unset\", \"core.origin\");\n+\t}\n+\n \teval {\n \t    my @trackers = $git->command('config', '--get-regexp',\n \t\t\t'branch.*.remote', $name);\n-- \n1.5.4.rc2.98.g1f3d5\n"},{"id":"65128","messageId":"1200117273-3524-3-git-send-email-mlevedahl@gmail.com","threadId":"11573","inReplyTo":"1200117273-3524-2-git-send-email-mlevedahl@gmail.com","subject":"[PATCH] git-clone - Set remotes.origin config variable","fromName":"Mark Levedahl","fromEmail":"mlevedahl@gmail.com","sentAt":"2008-01-12T05:54:32Z","receivedAt":"2008-01-12T05:54:32Z","isPatch":true,"sender":{"key":"mdl123@verizon.net","avatar":"https://avatars.githubusercontent.com/u/5302462?v=4"},"body":"This records the users choice of default remote name (by default \"origin\")\nas given by the -o option.\n\nSigned-off-by: Mark Levedahl <mlevedahl@gmail.com>\n---\n Documentation/git-clone.txt |    3 ++-\n git-clone.sh                |    1 +\n 2 files changed, 3 insertions(+), 1 deletions(-)\n\ndiff --git a/Documentation/git-clone.txt b/Documentation/git-clone.txt\nindex fdccbd4..6c15fa4 100644\n--- a/Documentation/git-clone.txt\n+++ b/Documentation/git-clone.txt\n@@ -95,7 +95,8 @@ OPTIONS\n --origin <name>::\n -o <name>::\n \tInstead of using the remote name 'origin' to keep track\n-\tof the upstream repository, use <name> instead.\n+\tof the upstream repository, use <name> instead. The name\n+\tis recorded in the core.origin config variable.\n \n --upload-pack <upload-pack>::\n -u <upload-pack>::\ndiff --git a/git-clone.sh b/git-clone.sh\nindex b4e858c..7208d68 100755\n--- a/git-clone.sh\n+++ b/git-clone.sh\n@@ -242,6 +242,7 @@ fi &&\n export GIT_DIR &&\n GIT_CONFIG=\"$GIT_DIR/config\" git-init $quiet ${template+\"$template\"} || usage\n \n+git config core.origin $origin\n if test -n \"$bare\"\n then\n \tGIT_CONFIG=\"$GIT_DIR/config\" git config core.bare true\n-- \n1.5.4.rc2.98.g1f3d5\n"},{"id":"65131","messageId":"1200117273-3524-4-git-send-email-mlevedahl@gmail.com","threadId":"11573","inReplyTo":"1200117273-3524-3-git-send-email-mlevedahl@gmail.com","subject":"[PATCH] git-submodule - Possibly inherit parent's default remote on init/clone","fromName":"Mark Levedahl","fromEmail":"mlevedahl@gmail.com","sentAt":"2008-01-12T05:54:33Z","receivedAt":"2008-01-12T05:54:33Z","isPatch":true,"sender":{"key":"mdl123@verizon.net","avatar":"https://avatars.githubusercontent.com/u/5302462?v=4"},"body":"For submodules defined relative to their parent, it is likely that the\nparent's defined default remote is correct for the child as well. This\nallows use of remote names other than \"origin\", important as managed\nsubmodules are typically checked out on a detached head and therefore\nsubmodule-update invokes git-fetch using the default remote. Without this\nchange, submodules effectively had to have a default remote of \"origin.\"\n\nSigned-off-by: Mark Levedahl <mlevedahl@gmail.com>\n---\n Documentation/git-submodule.txt |    8 +++++---\n git-submodule.sh                |   19 +++++++++++++------\n 2 files changed, 18 insertions(+), 9 deletions(-)\n\ndiff --git a/Documentation/git-submodule.txt b/Documentation/git-submodule.txt\nindex cffc6d4..440e234 100644\n--- a/Documentation/git-submodule.txt\n+++ b/Documentation/git-submodule.txt\n@@ -36,9 +36,11 @@ status::\n \n init::\n \tInitialize the submodules, i.e. register in .git/config each submodule\n-\tname and url found in .gitmodules. The key used in .git/config is\n-\t`submodule.$name.url`. This command does not alter existing information\n-\tin .git/config.\n+\tname and url found in .gitmodules, along with the default remote origin.\n+\tFor submodules using a relative url, the default remote is inherited\n+\tfrom the parent project, for absolute urls the default \"origin\" is used.\n+\tThe key used in .git/config is submodule.$name.url`. This command does\n+\tnot alter existing information in .git/config.\n \n update::\n \tUpdate the registered submodules, i.e. clone missing submodules and\ndiff --git a/git-submodule.sh b/git-submodule.sh\nindex ad9fe62..42be4b9 100755\n--- a/git-submodule.sh\n+++ b/git-submodule.sh\n@@ -7,6 +7,7 @@\n USAGE='[--quiet] [--cached] [add <repo> [-b branch]|status|init|update] [--] [<path>...]'\n OPTIONS_SPEC=\n . git-sh-setup\n+. git-parse-remote\n require_work_tree\n \n add=\n@@ -43,9 +44,7 @@ get_repo_base() {\n # Resolve relative url by appending to parent's url\n resolve_relative_url ()\n {\n-\tbranch=\"$(git symbolic-ref HEAD 2>/dev/null)\"\n-\tremote=\"$(git config branch.${branch#refs/heads/}.remote)\"\n-\tremote=\"${remote:-origin}\"\n+\tremote=\"$(get_default_remote)\"\n \tremoteurl=\"$(git config remote.$remote.url)\" ||\n \t\tdie \"remote ($remote) does not have a url in .git/config\"\n \turl=\"$1\"\n@@ -95,6 +94,7 @@ module_clone()\n {\n \tpath=$1\n \turl=$2\n+\torigin=${3:-origin}\n \n \t# If there already is a directory at the submodule path,\n \t# expect it to be empty (since that is the default checkout\n@@ -110,7 +110,7 @@ module_clone()\n \ttest -e \"$path\" &&\n \tdie \"A file already exist at path '$path'\"\n \n-\tgit-clone -n \"$url\" \"$path\" ||\n+\tgit-clone -n -o \"$origin\" \"$url\" \"$path\" ||\n \tdie \"Clone of '$url' into submodule path '$path' failed\"\n }\n \n@@ -130,9 +130,11 @@ module_add()\n \t\tusage\n \tfi\n \n+\torigin=origin\n \tcase \"$repo\" in\n \t./*|../*)\n \t\t# dereference source url relative to parent's url\n+\t\torigin=$(get_default_remote)\n \t\trealrepo=\"$(resolve_relative_url $repo)\" ;;\n \t*)\n \t\t# Turn the source into an absolute path if\n@@ -157,7 +159,7 @@ module_add()\n \tgit ls-files --error-unmatch \"$path\" > /dev/null 2>&1 &&\n \tdie \"'$path' already exists in the index\"\n \n-\tmodule_clone \"$path\" \"$realrepo\" || exit\n+\tmodule_clone \"$path\" \"$realrepo\" \"$origin\" || exit\n \t(unset GIT_DIR; cd \"$path\" && git checkout -q ${branch:+-b \"$branch\" \"origin/$branch\"}) ||\n \tdie \"Unable to checkout submodule '$path'\"\n \tgit add \"$path\" ||\n@@ -189,12 +191,15 @@ modules_init()\n \t\tdie \"No url found for submodule path '$path' in .gitmodules\"\n \n \t\t# Possibly a url relative to parent\n+\t\torigin=origin\n \t\tcase \"$url\" in\n \t\t./*|../*)\n \t\t\turl=\"$(resolve_relative_url \"$url\")\"\n+\t\t\torigin=$(get_default_remote)\n \t\t\t;;\n \t\tesac\n \n+\t\tgit config submodule.\"$name\".origin \"$origin\" &&\n \t\tgit config submodule.\"$name\".url \"$url\" ||\n \t\tdie \"Failed to register url for submodule path '$path'\"\n \n@@ -222,10 +227,12 @@ modules_update()\n \t\t\tsay \"Submodule path '$path' not initialized\"\n \t\t\tcontinue\n \t\tfi\n+\t\torigin=$(git config submodule.\"$name\".origin)\n+\t\torigin=${origin:-origin}\n \n \t\tif ! test -d \"$path\"/.git\n \t\tthen\n-\t\t\tmodule_clone \"$path\" \"$url\" || exit\n+\t\t\tmodule_clone \"$path\" \"$url\" \"$origin\" || exit\n \t\t\tsubsha1=\n \t\telse\n \t\t\tsubsha1=$(unset GIT_DIR; cd \"$path\" &&\n-- \n1.5.4.rc2.98.g1f3d5\n"},{"id":"65134","messageId":"7vbq7ry405.fsf@gitster.siamese.dyndns.org","threadId":"11573","inReplyTo":"478855B5.9070600@gmail.com","subject":"Re: [PATCH] Teach remote machinery about remotes.default config variable","fromName":"Junio C Hamano","fromEmail":"gitster@pobox.com","sentAt":"2008-01-12T06:03:38Z","receivedAt":"2008-01-12T06:03:38Z","isPatch":true,"sender":{"key":"gitster@pobox.com","avatar":"https://avatars.githubusercontent.com/u/54884?v=4"},"body":"Mark Levedahl <mlevedahl@gmail.com> writes:\n\n> My use really is a different use-case than is typical....\n>\n> This breaks down in a project like mine where there are multiple\n> servers and the differences are important. Content and usage vary\n> server to server, not just connectivity. At this point, hiding the\n> server names is counterproductive. Basically, use of origin is data\n> hiding, and data hiding is not good when you actually need the data.\n\nIf you need explicit name, you do not have to use \"origin\".\n\nYou can spell URL explicitly to name which exact repository you\nmean to reach over which datapath (one physical host may have\ndifferent name depending on the network interface you reach it\nvia).  You can always say\n\n\t$ git pull git://that.exact.machine/repo that-branch\n\nif you want to avoid ambiguity.\n\nAnd that is not atypical at all.  Scan the kernel mailing list,\nlooking for \"please pull\" requests.  You will never see 'origin'\nor any short nickname.  The names used in communication should\nbe unambiguous in the context of the communication.  If you know\n'origin' mean different things to different people, do not use\nthat in public communication.\n\nIt's that simple.  Isn't it?\n"},{"id":"65135","messageId":"47885B2C.8020809@gmail.com","threadId":"11573","inReplyTo":"7vbq7ry405.fsf@gitster.siamese.dyndns.org","subject":"Re: [PATCH] Teach remote machinery about remotes.default config variable","fromName":"Mark Levedahl","fromEmail":"mlevedahl@gmail.com","sentAt":"2008-01-12T06:16:12Z","receivedAt":"2008-01-12T06:16:12Z","isPatch":true,"sender":{"key":"mdl123@verizon.net","avatar":"https://avatars.githubusercontent.com/u/5302462?v=4"},"body":"Junio C Hamano wrote:\n> Mark Levedahl <mlevedahl@gmail.com> writes:\n>\n>\n>   \n> It's that simple.  Isn't it?\n>\n>   \nYes, until you hit submodules whose state you are managing from a super \nproject. Then it gets hard because the machinery brings origin into play.\n\nMark\n"},{"id":"65136","messageId":"7v7iify2wm.fsf@gitster.siamese.dyndns.org","threadId":"11573","inReplyTo":"47885B2C.8020809@gmail.com","subject":"Re: [PATCH] Teach remote machinery about remotes.default config variable","fromName":"Junio C Hamano","fromEmail":"gitster@pobox.com","sentAt":"2008-01-12T06:27:21Z","receivedAt":"2008-01-12T06:27:21Z","isPatch":true,"sender":{"key":"gitster@pobox.com","avatar":"https://avatars.githubusercontent.com/u/54884?v=4"},"body":"Mark Levedahl <mlevedahl@gmail.com> writes:\n\n> Junio C Hamano wrote:\n>> Mark Levedahl <mlevedahl@gmail.com> writes:\n>>\n>>   It's that simple.  Isn't it?\n>>\n> Yes, until you hit submodules whose state you are managing from a\n> super project. Then it gets hard because the machinery brings origin\n> into play.\n\nSorry, I may be missing something.\n\nEven if you have a submodule, you can go there and that will be\na valid freestanding repository.  You can always be explicit,\nbypassing any behaviour that defaults to 'origin' to avoid\nambiguity.\n"},{"id":"65174","messageId":"4788BFA8.2030508@gmail.com","threadId":"11573","inReplyTo":"7v7iify2wm.fsf@gitster.siamese.dyndns.org","subject":"Re: [PATCH] Teach remote machinery about remotes.default config variable","fromName":"Mark Levedahl","fromEmail":"mlevedahl@gmail.com","sentAt":"2008-01-12T13:24:56Z","receivedAt":"2008-01-12T13:24:56Z","isPatch":true,"sender":{"key":"mdl123@verizon.net","avatar":"https://avatars.githubusercontent.com/u/5302462?v=4"},"body":"Junio C Hamano wrote:\n> Sorry, I may be missing something.\n>\n> Even if you have a submodule, you can go there and that will be\n> a valid freestanding repository.  You can always be explicit,\n> bypassing any behaviour that defaults to 'origin' to avoid\n> ambiguity.\n>   \n\"git-submodule update\" *requires* that origin is defined in all \nsub-modules. There is no way to avoid this behavior.\n\nMark\n"},{"id":"65190","messageId":"alpine.LSU.1.00.0801121748290.8333@wbgn129.biozentrum.uni-wuerzburg.de","threadId":"11573","inReplyTo":"478855B5.9070600@gmail.com","subject":"Re: [PATCH] Teach remote machinery about remotes.default config variable","fromName":"Johannes Schindelin","fromEmail":"johannes.schindelin@gmx.de","sentAt":"2008-01-12T16:50:19Z","receivedAt":"2008-01-12T16:50:19Z","isPatch":true,"sender":{"key":"johannes.schindelin@gmx.de","avatar":"https://avatars.githubusercontent.com/u/127790?v=4"},"body":"Hi,\n\nOn Sat, 12 Jan 2008, Mark Levedahl wrote:\n\n> The argument against my approach of explicitly naming the server rests \n> upon the premise that hiding a half-dozen servers, all different and \n> with those differences being important, under the single universal name \n> \"origin\", makes things easier.\n\nNo, that was not _at all_ my argument.\n\nI said that hiding it under a different name _that you have to look up, \ntoo_ does _not_ make things easier.\n\nI might even add that it makes misconfigurations even worse.\n\nCiao,\nDscho\n"},{"id":"65193","messageId":"4788F907.1050306@gmail.com","threadId":"11573","inReplyTo":"alpine.LSU.1.00.0801121748290.8333@wbgn129.biozentrum.uni-wuerzburg.de","subject":"Re: [PATCH] Teach remote machinery about remotes.default config variable","fromName":"Mark Levedahl","fromEmail":"mlevedahl@gmail.com","sentAt":"2008-01-12T17:29:43Z","receivedAt":"2008-01-12T17:29:43Z","isPatch":true,"sender":{"key":"mdl123@verizon.net","avatar":"https://avatars.githubusercontent.com/u/5302462?v=4"},"body":"Johannes Schindelin wrote:\n>\n> No, that was not _at all_ my argument.\n>\n> I said that hiding it under a different name _that you have to look up, \n> too_ does _not_ make things easier.\n>\n>   \nGranted, *IF* we had to look it up, but we don't. In fact, we use the \nconvention\n    servername.foo.bar\nhas nickname\n    servername\n\nSo, we need to know the server name we are using, and that server name \nis the nickname. So, no confusion and no extra lookup step. (Our server \nnames are unique without the domain suffixes, so this works well for us).\n\nMark\n"},{"id":"65203","messageId":"7vwsqeubj8.fsf@gitster.siamese.dyndns.org","threadId":"11573","inReplyTo":"4788BFA8.2030508@gmail.com","subject":"Re: [PATCH] Teach remote machinery about remotes.default config variable","fromName":"Junio C Hamano","fromEmail":"gitster@pobox.com","sentAt":"2008-01-12T18:46:51Z","receivedAt":"2008-01-12T18:46:51Z","isPatch":true,"sender":{"key":"gitster@pobox.com","avatar":"https://avatars.githubusercontent.com/u/54884?v=4"},"body":"Mark Levedahl <mlevedahl@gmail.com> writes:\n\n> Junio C Hamano wrote:\n>> Sorry, I may be missing something.\n>>\n>> Even if you have a submodule, you can go there and that will be\n>> a valid freestanding repository.  You can always be explicit,\n>> bypassing any behaviour that defaults to 'origin' to avoid\n>> ambiguity.\n>>\n> \"git-submodule update\" *requires* that origin is defined in all\n> sub-modules. There is no way to avoid this behavior.\n\nAhh.\n\nDoes that suggest the new configuration thing is only about the\n\"submodule update\" command, not \"remotes.default\" that affects\nhow the non-submodule merge and fetch works?\n"},{"id":"65214","messageId":"47891658.3090604@gmail.com","threadId":"11573","inReplyTo":"7vwsqeubj8.fsf@gitster.siamese.dyndns.org","subject":"Re: [PATCH] Teach remote machinery about remotes.default config variable","fromName":"Mark Levedahl","fromEmail":"mlevedahl@gmail.com","sentAt":"2008-01-12T19:34:48Z","receivedAt":"2008-01-12T19:34:48Z","isPatch":true,"sender":{"key":"mdl123@verizon.net","avatar":"https://avatars.githubusercontent.com/u/5302462?v=4"},"body":"Junio C Hamano wrote:\n> Ahh.\n>\n> Does that suggest the new configuration thing is only about the\n> \"submodule update\" command, not \"remotes.default\" that affects\n> how the non-submodule merge and fetch works?\n>\n>   \nYes - this patch set was inspired by the single question of \"how do I \navoid needing to define origin as opposed to a server-specific nickname \nnow that I am using sub-modules?\"\n\nMark\n"},{"id":"65216","messageId":"alpine.LSU.1.00.0801122119580.8333@wbgn129.biozentrum.uni-wuerzburg.de","threadId":"11573","inReplyTo":"4788F907.1050306@gmail.com","subject":"Re: [PATCH] Teach remote machinery about remotes.default config variable","fromName":"Johannes Schindelin","fromEmail":"johannes.schindelin@gmx.de","sentAt":"2008-01-12T20:22:53Z","receivedAt":"2008-01-12T20:22:53Z","isPatch":true,"sender":{"key":"johannes.schindelin@gmx.de","avatar":"https://avatars.githubusercontent.com/u/127790?v=4"},"body":"Hi,\n\nOn Sat, 12 Jan 2008, Mark Levedahl wrote:\n\n> Johannes Schindelin wrote:\n> > \n> > No, that was not _at all_ my argument.\n> > \n> > I said that hiding it under a different name _that you have to look \n> > up, too_ does _not_ make things easier.\n> > \n> >   \n> Granted, *IF* we had to look it up, but we don't. In fact, we use the \n> convention\n>    servername.foo.bar\n> has nickname\n>    servername\n> \n> So, we need to know the server name we are using, and that server name \n> is the nickname. So, no confusion and no extra lookup step. (Our server \n> names are unique without the domain suffixes, so this works well for \n> us).\n\nHow do you know _which_ default remote name your current repository uses? \nExactly: you have to look it up.  So your whole *IF* argument is bogus.\n\nAnd if you already have to look something up, and the user fiddled with \nher setup, you can no longer be sure that nickname servername points to \nservername.foo.bar, and you are in even more trouble.\n\nThat is why I maintain that your solution does not make things better.\n\nHth,\nDscho\n"},{"id":"65217","messageId":"alpine.LSU.1.00.0801122123430.8333@wbgn129.biozentrum.uni-wuerzburg.de","threadId":"11573","inReplyTo":"47891658.3090604@gmail.com","subject":"Re: [PATCH] Teach remote machinery about remotes.default config variable","fromName":"Johannes Schindelin","fromEmail":"johannes.schindelin@gmx.de","sentAt":"2008-01-12T20:24:43Z","receivedAt":"2008-01-12T20:24:43Z","isPatch":true,"sender":{"key":"johannes.schindelin@gmx.de","avatar":"https://avatars.githubusercontent.com/u/127790?v=4"},"body":"Hi,\n\nOn Sat, 12 Jan 2008, Mark Levedahl wrote:\n\n> Junio C Hamano wrote:\n> > Ahh.\n> > \n> > Does that suggest the new configuration thing is only about the \n> > \"submodule update\" command, not \"remotes.default\" that affects how the \n> > non-submodule merge and fetch works?\n>\n> Yes - this patch set was inspired by the single question of \"how do I \n> avoid needing to define origin as opposed to a server-specific nickname \n> now that I am using sub-modules?\"\n\nWhy is your patch then not about git-submodule?\n\nAnd I still fail to see -- even for submodules -- how you begin to tackle \nthat lookup problem.\n\nCiao,\nDscho\n"},{"id":"65218","messageId":"7vbq7qssd7.fsf@gitster.siamese.dyndns.org","threadId":"11573","inReplyTo":"47891658.3090604@gmail.com","subject":"Re: [PATCH] Teach remote machinery about remotes.default config variable","fromName":"Junio C Hamano","fromEmail":"gitster@pobox.com","sentAt":"2008-01-12T20:26:12Z","receivedAt":"2008-01-12T20:26:12Z","isPatch":true,"sender":{"key":"gitster@pobox.com","avatar":"https://avatars.githubusercontent.com/u/54884?v=4"},"body":"Mark Levedahl <mlevedahl@gmail.com> writes:\n\n> Junio C Hamano wrote:\n>> Ahh.\n>>\n>> Does that suggest the new configuration thing is only about the\n>> \"submodule update\" command, not \"remotes.default\" that affects\n>> how the non-submodule merge and fetch works?\n>>\n>>\n> Yes - this patch set was inspired by the single question of \"how do I\n> avoid needing to define origin as opposed to a server-specific\n> nickname now that I am using sub-modules?\"\n\nIf it is truly only about \"submodule update\" then the change\nseems too intrusive, especially \"remotes.default\" variable that\naffects the way how fetch and merge works in situations that do\nnot involve submodules.\n\nIf it is not limited to \"submodule update\" but equally valid fix\nto non-submodule situations, the changes to the other parts may\nvery well be justifiable, but that would mean your \"Yes\" is a\nlie and instead should be \"No, but these situations are helped\nby these changes because...\".\n\nIn any case, let's step back a bit.\n\nEarlier you said in a response to Dscho that your servers are\nnamed consistently across repositories.  servername.foo.bar has\nnickname servername everywhere.\n\nIf your top-level repository needs to access a specific server\n\"frotz.foo.bar\" for updates, then you would have bootstrapped\nthe whole thing with:\n\n\t$ git clone git://frotz.foo.bar/toplevel.git\n\nand in that particular instance of the repository, the source\nrepository on frotz.foo.bar would have been known as 'origin',\nright?  I would not object if you also gave another nickname\n'frotz' to the same repository for consistency across\ndevelopers.\n\nIf that is the case, I am wondering why your subprojects are not\npointing at the corresponding repository on that same\n'frotz.foo.bar' machine as 'origin'.  I suspect the reason is\nthat .gitmodules do not say 'frotz.foo.bar' but name some other\nmachine.\n\nAnd in-tree .gitmodules can name only one URL, as it is project\nglobal and shared by everybody.  There is no escaping it.\n\nAt least as things were designed, \"git submodule init\" takes URL\nrecorded in .gitmodules as a hint, but this is for the user to\noverride in .git/config in the top-level.  Maybe the UI to allow\nthis overriding is not easy enough to use, and your submodules\nended up pointing at wrong (from the machine's point of view)\nURL as 'origin'.  And perhaps that is the root cause of this\nissue?\n\nI am looking at the discussion on the list archive when we\ndiscussed the initial design of .gitmodules:\n\n    http://thread.gmane.org/gmane.comp.version-control.git/47466/focus=47502\n    http://thread.gmane.org/gmane.comp.version-control.git/47466/focus=47548\n    http://thread.gmane.org/gmane.comp.version-control.git/47466/focus=47621\n\nI do not think we are there yet, and suspect that the current\n\"git submodule init\" does not give the user a chance to say \"the\nURL recorded in the in-tree .gitmodules corresponds to this URL\nin this repository for administrative or network connectivity or\nwhatever reasons\".\n\nMaybe that is the real issue that we should be tackling.  I\ndunno.\n\nAlthough I _think_ being able to use nickname other than\nhardcoded 'origin' for fetch/merge is a good change, if my above\nsuspicion is correct, that change alone would not make the life\neasier to people who _use_ submodules, as the need for them to\nset up extra nicknames (like 'frotz') and configure the\nsubmodule repositories to use that specific nickname instead of\n'origin' would not change.\n\nFor communication purposes, I would agree with Dscho that the\nname 'origin' that names different things for different people\nis wrong and using specific name 'frotz' would solve\ncommunication issues.  But when using the repository and doing\nactual work, wouldn't it be _much_ better if you can\nconsistently go to a repository on a random machine and always\ncan say 'origin' to mean the other repository this repository\nusually gets new objects from (and sends its new objects to)?\n"},{"id":"65219","messageId":"47893E1A.5020702@gmail.com","threadId":"11573","inReplyTo":"7vbq7qssd7.fsf@gitster.siamese.dyndns.org","subject":"Re: [PATCH] Teach remote machinery about remotes.default config variable","fromName":"Mark Levedahl","fromEmail":"mlevedahl@gmail.com","sentAt":"2008-01-12T22:24:26Z","receivedAt":"2008-01-12T22:24:26Z","isPatch":true,"sender":{"key":"mdl123@verizon.net","avatar":"https://avatars.githubusercontent.com/u/5302462?v=4"},"body":"Junio C Hamano wrote:\n> If it is truly only about \"submodule update\" then the change\n> seems too intrusive, especially \"remotes.default\" variable that\n> affects the way how fetch and merge works in situations that do\n> not involve submodules.\n> If it is not limited to \"submodule update\" but equally valid fix\n> to non-submodule situations, the changes to the other parts may\n> very well be justifiable, but that would mean your \"Yes\" is a\n> lie and instead should be \"No, but these situations are helped\n> by these changes because...\".\n>\n>   \nFirst, I resent the patch series last night, it now uses core.origin to \navoid touching remotes.* namespace.\n\nThe changes *do* fix a nit when on a non-tracking branch. With this, \nfetch / merge / pull will now honor that the user said (via git clone -o \nfrotz) \"my upstream is nicknamed frotz\" and not try to use origin when \norigin was never defined.\n\nSo, while fixing this minor aggravation wasn't my motivation, I view \nthis as a nice side-benefit :^).\n\nThe driving issues:\n1) I deal with too many servers for \"origin\" to be a useful nick name, \nand we have an agreed set of nickname / server pairings across my project.\n2) Therefore, we always do git clone -o frotz  frotz.foo.bar/path_to_git.\n3) Because of 2, for top-level, \"origin\" is not defined, tracking \nbranches set up via git branch --track point to the correct remote, and \nwe basically understand branch names as <nickname>/branch. In other \nwords, we *are* aware of what server we are using.\n4) git-submodule update breaks the above:\n- a) it invokes git clone frotz.foo.bar/path_to_git thus defining \n\"origin\" as the nickname for frotz.foo.bar.\n  b) it invokes bare git-fetch on a detached head, so the upstream *has* \nto be origin.\n\n> If your top-level repository needs to access a specific server\n> \"frotz.foo.bar\" for updates, then you would have bootstrapped\n> the whole thing with:\n>\n> \t$ git clone git://frotz.foo.bar/toplevel.git\n>\n> and in that particular instance of the repository, the source\n> repository on frotz.foo.bar would have been known as 'origin',\n> right? \nNope, we did it with git clone -o frotz git://frotz.foo.bar/toplevel.git\nWe *never* define origin, frozt.foo.bar is *always* frotz.\n\n>  I would not object if you also gave another nickname\n> 'frotz' to the same repository for consistency across\n> developers.\n>   \ngood. We are making (some) progress. :^)\n> If that is the case, I am wondering why your subprojects are not\n> pointing at the corresponding repository on that same\n> 'frotz.foo.bar' machine as 'origin'.  I suspect the reason is\n> that .gitmodules do not say 'frotz.foo.bar' but name some other\n> machine.\n>   \nActually,\n1) We don't use origin because we avoid having to wonder \"Is \nfrotz.foo.bar named \"origin\" or \"frotz\" on this client, and thus how do \nI get data from frotz?\n2) I submitted the change allowing submodules to be recorded into \n.gitmodules with a relative url (e.g., ./path_from_parent_to_submodule) \nrather than an absolute, so we record the relative path only.\n3) Thus, git submodule has set up the submodules to point at the parent \nproject's default remote. However, in the parent the server is nicknamed \n\"frotz\", but now in the submodule the server is nicknamed \"origin\"  Oops.\n\nWith my patches, parent and submodule both refer to frotz.foo.bar as frotz.\n\n> And in-tree .gitmodules can name only one URL, as it is project\n> global and shared by everybody.  There is no escaping it.\n> At least as things were designed, \"git submodule init\" takes URL\n> recorded in .gitmodules as a hint, but this is for the user to\n> override in .git/config in the top-level.  Maybe the UI to allow\n> this overriding is not easy enough to use, and your submodules\n> ended up pointing at wrong (from the machine's point of view)\n> URL as 'origin'.  And perhaps that is the root cause of this\n> issue?\n>\n>   \nAgain, the relative-url patch was to address this so that a project that \nis mirrored to another server remains valid on the new server without \nmodifying the .gitmodules in-tree. (Yes, I know you *can* modify \ninformation in a given clones .git/config, but I'm trying to avoid such \nmanual per clone/checkout modifications where it can reasonably be done.).\n\nBasically, I think an important (but not complete) test of the design is \nthat\n\n    git clone -o frotz git://frotz.foo.bar/myproject.git\n    cd myproject\n    git submodule init\n    git submodule update\n\nwork, with origin = frotz throughout the submodules, and with the whole \nproject correctly checked out even if the entire project was rehosted \nonto a different server. With relative urls and my latest patch series \nlast night, this all works, and of course upstream can still be \"origin\" \nif that is what is desired.\n\nWhile our overall project exists on many servers, mirroring is an \nincorrect term. Rather, only certain branches of  various parts exist \neverywhere, many other branches are specific to a given server, so we \nreally name branches using servername/branchname. It is this aspect of \nthe project that causes us to be aware of the server in use, and thus \nmakes use of \"origin\" as a generic upstream not useful.\n\n> I am looking at the discussion on the list archive when we\n> discussed the initial design of .gitmodules:\n>\n>     http://thread.gmane.org/gmane.comp.version-control.git/47466/focus=47502\n>     http://thread.gmane.org/gmane.comp.version-control.git/47466/focus=47548\n>     http://thread.gmane.org/gmane.comp.version-control.git/47466/focus=47621\n>\n> I do not think we are there yet, and suspect that the current\n> \"git submodule init\" does not give the user a chance to say \"the\n> URL recorded in the in-tree .gitmodules corresponds to this URL\n> in this repository for administrative or network connectivity or\n> whatever reasons\".\n>   \n> Maybe that is the real issue that we should be tackling.  I\n> dunno.\n>\n> Although I _think_ being able to use nickname other than\n> hardcoded 'origin' for fetch/merge is a good change, if my above\n> suspicion is correct, that change alone would not make the life\n> easier to people who _use_ submodules, as the need for them to\n> set up extra nicknames (like 'frotz') and configure the\n> submodule repositories to use that specific nickname instead of\n> 'origin' would not change.\n>\n>   \n\ngit-submodule right now supports two different layouts (urls relative to \nthe parent, and absolute urls such that each sub-module is on an \nindependent server). The management approaches to these are going to be \ndifferent.\n\nI also suspect there are two basic use cases here: accumulation of a \nnumber of independently managed projects vs. splitting a single major \nproject into a number of smaller pieces to allow some decoupling, but \nstill managing the set as a composite whole.\n\nThere may be some direct correlation of use-case and submodule layout, \ndon't know. My project uses relative-urls, and I am managing a large \nproject that has been split into a number of components. So, my \nsuggestions are focused entirely upon this design and use-case, and I \ndon't expect I am addressing the others at all. (As usual, this requires \nsomeone who needs the other model(s) to step up and drive).\n\nFor *my* uses (relative urls, single logical project):\n\n1) There are times when the parent's branch.<name>.remote should be \nflowed down to all subprojects for git submodule update, of course this \nwould require that the remote be defined for all.\n2) Thus, there needs to be a way to define a new remote globally for the \nproject, and have it be correctly interpreted by each submodule (e.g., a \nrepeat of the relative-url dereferencing now done by submodule init, but \napplied later to all submodules to define a new remote). Yes, this could \nbe accomplished by going into each submodule independently and issuing \nappropriate commands, but administration would be much easier given a \ntop-level command that could recurse and \"do the right thing\" per \nsub-project.\n\nI *suspect* that origin is a much more useful concept for the alternate \nconstruct (absolute urls, loose alliance of separately managed \nprojects), but as I said that is not my problem so please ask folks who \nhave that model to define what works for them.\n> For communication purposes, I would agree with Dscho that the\n> name 'origin' that names different things for different people\n> is wrong and using specific name 'frotz' would solve\n> communication issues.  But when using the repository and doing\n> actual work, wouldn't it be _much_ better if you can\n> consistently go to a repository on a random machine and always\n> can say 'origin' to mean the other repository this repository\n> usually gets new objects from (and sends its new objects to)?\n>\n>\n>   \n(Acutally, I thought I was the one arguing that using origin when it \nmeans different things to different folks is not good. That's the root \nof my problems. :^) )\n\nAnyway, I have not found any use of \"origin\" on my project really \nuseful. We have to be and *are* aware of the server/branchname in use, \nnot just the branch. Partly this is because different subgroups have \ndifferent natural gathering points (we tend to exchange data via ad hoc \n\"mob\" branches on whatever server is most accessible to the particular \ngroup), and partly because some information simply cannot be allowed on \nsome servers, but basically the more accessible a server is, the less \ninformation that server can have. I believe \"origin\" is really useful \nonly when it has just one meaning, or when all values are effectively \nidentical (e.g., you have several mirrors for load balancing, etc, but \nall are identical modulo mirroring delays).\n\nOTOH, a reasonable change to the semantics of \"origin\" might be to have:\n1) core.origin name the remote that is the \"normal\" upstream.\n2) Reserve and allow use of the name \"origin\" to mean $core.origin, \ne.g., in shell scripts replace all references to remote \"origin\" with \n$(git config core.origin). Of course, if core.origin = origin, then no \nuser visible change occurs.\n\nIn this way, git would  not record the same remote's branches in two \nways (as origin/master and as frotz/master), but rather dereference \norigin -> frotz and then get frotz/master. Dunno, no matter how you \nslice it, having more than one way to refer to the same remote is going \nto be confusing, and that's why we don't use origin.\n\n\nMark\n"},{"id":"65220","messageId":"47893F53.2070908@gmail.com","threadId":"11573","inReplyTo":"alpine.LSU.1.00.0801122123430.8333@wbgn129.biozentrum.uni-wuerzburg.de","subject":"Re: [PATCH] Teach remote machinery about remotes.default config variable","fromName":"Mark Levedahl","fromEmail":"mlevedahl@gmail.com","sentAt":"2008-01-12T22:29:39Z","receivedAt":"2008-01-12T22:29:39Z","isPatch":true,"sender":{"key":"mdl123@verizon.net","avatar":"https://avatars.githubusercontent.com/u/5302462?v=4"},"body":"Johannes Schindelin wrote:\n> Why is your patch then not about git-submodule?\n>\n> And I still fail to see -- even for submodules -- how you begin to tackle \n> that lookup problem.\n>\n> Ciao,\n> Dscho\n>\n>   \nBecause git-submodule is a wrapper around git-fetch and git-clone and \ngit-remote, and those lacked the mechanism to honor the fact that when I \nsaid\n\n       git clone -o  frotz frontz.foo.bar/foo.git\n\nI *defined* the upstream's nickname as \"frotz\", not \"origin\", and origin \nis *not* defined so don't try to use it. As sub-modules are git \nprojects, fixing this in a sub-module necessarily fixes it in any git \nproject.\n\nMark\n"},{"id":"65222","messageId":"7v4pdislrf.fsf@gitster.siamese.dyndns.org","threadId":"11573","inReplyTo":"47893E1A.5020702@gmail.com","subject":"Re: [PATCH] Teach remote machinery about remotes.default config variable","fromName":"Junio C Hamano","fromEmail":"gitster@pobox.com","sentAt":"2008-01-12T22:48:52Z","receivedAt":"2008-01-12T22:48:52Z","isPatch":true,"sender":{"key":"gitster@pobox.com","avatar":"https://avatars.githubusercontent.com/u/54884?v=4"},"body":"Mark Levedahl <mlevedahl@gmail.com> writes:\n\n> Basically, I think an important (but not complete) test of the design\n> is that\n>\n>    git clone -o frotz git://frotz.foo.bar/myproject.git\n>    cd myproject\n>    git submodule init\n>    git submodule update\n>\n> work, with origin = frotz throughout the submodules, and with the\n> whole project correctly checked out even if the entire project was\n> rehosted onto a different server.\n\nI like that.  This is a very good argument, especially because\nit clarifies very well that the issue is not about \"'submodule\ninit' misbehaves\" but \"fetch/pull/merge does not play well with\nclone -o\".\n\nThe only remaining (minor) doubt I have (not in the sense that\n\"I object to it!\", but in the sense that \"I wish there could be\na better alternative, but I do not think of one offhand\") is\npolluting the core.* namespace with this configuration variable.\n\nLooking at Documentation/config.txt, I realize that we already\nhave made a mistake of allowing core.gitproxy, but other than\nthat single mistake, everything in core.* is still about things\nthat apply to the use of git even when the repository does not\ntalk with any other repository.  If we deprecate and rename away\nthat one mistake, we can again make core.* to mean things that\nare _really_ core, but using core.origin for \"the default remote\nis not called 'origin' but 'frotz' here\" is a step backwards\nfrom that ideal.\n\nBut that's a minor naming issue.\n"},{"id":"65248","messageId":"478A3284.1000102@gmail.com","threadId":"11573","inReplyTo":"7v4pdislrf.fsf@gitster.siamese.dyndns.org","subject":"Re: [PATCH] Teach remote machinery about remotes.default config variable","fromName":"Mark Levedahl","fromEmail":"mlevedahl@gmail.com","sentAt":"2008-01-13T15:47:16Z","receivedAt":"2008-01-13T15:47:16Z","isPatch":true,"sender":{"key":"mdl123@verizon.net","avatar":"https://avatars.githubusercontent.com/u/5302462?v=4"},"body":"Junio C Hamano wrote:\n> Mark Levedahl <mlevedahl@gmail.com> writes:\n>\n>   \n>> Basically, I think an important (but not complete) test of the design\n>> is that\n>>\n>>    git clone -o frotz git://frotz.foo.bar/myproject.git\n>>    cd myproject\n>>    git submodule init\n>>    git submodule update\n>>\n>> work, with origin = frotz throughout the submodules, and with the\n>> whole project correctly checked out even if the entire project was\n>> rehosted onto a different server.\n>>     \n>\n> I like that.  This is a very good argument, especially because\n> it clarifies very well that the issue is not about \"'submodule\n> init' misbehaves\" but \"fetch/pull/merge does not play well with\n> clone -o\"\nCarrying the above forward...  Assume I have a checked out project as \nabove, then in top-level master project I do:\n\ngit remote add zoo git://zoo.tar.fu hisfork.git\ngit fetch zoo\ngit checkout --track -b fork zoo/fork\ngit submodule update\n\nI claim the submodule machinery *should* now follow master's default \nremote, which is \"zoo\", for the current branch. In addition, the \nsubmodule machinery should define remote \"zoo\" in each submodule  where \nit does not already exist, using the same logic using in the original \ninit/update phase. This should only apply to modules defined using \nrelative urls.\n\nBasically, this formalizes the notion that:\n\n* submodules defined using relative urls are \"owned\" by the master \nproject and will exist anywhere the master does.\n* submodules defined using absolute urls are incorporated into the \nproject but are separately managed. (While some improved mechanism to \nautomate their management from top-level may be proposed, it is not \nobvious to me nor addressed here.)\n\nThe subsequent patch modifies git-submodule to implement this logic, and \napplies on top of my previous series.\n\n(Note: I cannot find my latest series in the git-archives on gmane nor \non marc.info, both have only part, and I am suspicious that something \nwent wrong in my sending via gmail, so I am resending the series here, \nnow five patches long. Please excuse if this is redundant).\n\nMark\n"},{"id":"65250","messageId":"1200241631-3300-1-git-send-email-mlevedahl@gmail.com","threadId":"11573","inReplyTo":"478A3284.1000102@gmail.com","subject":"[PATCH] Teach remote machinery about core.origin config variable","fromName":"Mark Levedahl","fromEmail":"mlevedahl@gmail.com","sentAt":"2008-01-13T16:27:07Z","receivedAt":"2008-01-13T16:27:07Z","isPatch":true,"sender":{"key":"mdl123@verizon.net","avatar":"https://avatars.githubusercontent.com/u/5302462?v=4"},"body":"This introduces a new configuration variable, core.origin, that\ndefines the name of the default remote to be used. Traditionally, this\nis \"origin\", and could be overridden for a given branch. This change\nintroduces a way to redefine the default as desired and have that honored\nregardless of the currently checked out head (e.g., core.origin is\nused when on a detached head or any other non-tracking branch).\n\nSigned-off-by: Mark Levedahl <mlevedahl@gmail.com>\n---\n Documentation/config.txt |    6 ++++++\n git-parse-remote.sh      |    5 +++--\n remote.c                 |   11 ++++++++++-\n 3 files changed, 19 insertions(+), 3 deletions(-)\n\ndiff --git a/Documentation/config.txt b/Documentation/config.txt\nindex df091d1..b7241cf 100644\n--- a/Documentation/config.txt\n+++ b/Documentation/config.txt\n@@ -291,6 +291,12 @@ core.editor::\n \t`GIT_EDITOR` environment, `core.editor`, `VISUAL` and\n \t`EDITOR` environment variables and then finally `vi`.\n \n+core.origin::\n+\tThe name of the remote used by default for fetch / pull. If unset,\n+\torigin is assumed. This value is used whenever the current branch\n+\thas no corresponding branch.<name>.remote, such as when working on\n+\ta detached head.\n+\n core.pager::\n \tThe command that git will use to paginate output.  Can be overridden\n \twith the `GIT_PAGER` environment variable.\ndiff --git a/git-parse-remote.sh b/git-parse-remote.sh\nindex 695a409..c7ac7c7 100755\n--- a/git-parse-remote.sh\n+++ b/git-parse-remote.sh\n@@ -56,8 +56,9 @@ get_remote_url () {\n \n get_default_remote () {\n \tcurr_branch=$(git symbolic-ref -q HEAD | sed -e 's|^refs/heads/||')\n-\torigin=$(git config --get \"branch.$curr_branch.remote\")\n-\techo ${origin:-origin}\n+\tgit config --get \"branch.$curr_branch.remote\" ||\n+\tgit config --get \"core.origin\" ||\n+\techo origin\n }\n \n get_remote_default_refs_for_push () {\ndiff --git a/remote.c b/remote.c\nindex 0e00680..302d499 100644\n--- a/remote.c\n+++ b/remote.c\n@@ -10,6 +10,7 @@ static int allocated_branches;\n \n static struct branch *current_branch;\n static const char *default_remote_name;\n+static const char *core_origin;\n \n #define BUF_SIZE (2048)\n static char buffer[BUF_SIZE];\n@@ -233,6 +234,11 @@ static int handle_config(const char *key, const char *value)\n \t\t\tadd_merge(branch, xstrdup(value));\n \t\treturn 0;\n \t}\n+\tif (!strcmp(key, \"core.origin\")) {\n+\t\tif (value)\n+\t\t\tcore_origin = xstrdup(value);\n+\t\treturn 0;\n+\t}\n \tif (prefixcmp(key,  \"remote.\"))\n \t\treturn 0;\n \tname = key + 7;\n@@ -291,7 +297,6 @@ static void read_config(void)\n \tint flag;\n \tif (default_remote_name) // did this already\n \t\treturn;\n-\tdefault_remote_name = xstrdup(\"origin\");\n \tcurrent_branch = NULL;\n \thead_ref = resolve_ref(\"HEAD\", sha1, 0, &flag);\n \tif (head_ref && (flag & REF_ISSYMREF) &&\n@@ -300,6 +305,10 @@ static void read_config(void)\n \t\t\tmake_branch(head_ref + strlen(\"refs/heads/\"), 0);\n \t}\n \tgit_config(handle_config);\n+\tif (!default_remote_name) {\n+\t\tdefault_remote_name = core_origin ?\n+\t\tcore_origin : xstrdup(\"origin\");\n+\t}\n }\n \n struct refspec *parse_ref_spec(int nr_refspec, const char **refspec)\n-- \n1.5.4.rc3.14.gc50f\n"},{"id":"65252","messageId":"1200241631-3300-2-git-send-email-mlevedahl@gmail.com","threadId":"11573","inReplyTo":"1200241631-3300-1-git-send-email-mlevedahl@gmail.com","subject":"[PATCH] git-remote - Unset core.origin when deleting the default remote","fromName":"Mark Levedahl","fromEmail":"mlevedahl@gmail.com","sentAt":"2008-01-13T16:27:08Z","receivedAt":"2008-01-13T16:27:08Z","isPatch":true,"sender":{"key":"mdl123@verizon.net","avatar":"https://avatars.githubusercontent.com/u/5302462?v=4"},"body":"Signed-off-by: Mark Levedahl <mlevedahl@gmail.com>\n---\n git-remote.perl |    5 +++++\n 1 files changed, 5 insertions(+), 0 deletions(-)\n\ndiff --git a/git-remote.perl b/git-remote.perl\nindex d13e4c1..75d2371 100755\n--- a/git-remote.perl\n+++ b/git-remote.perl\n@@ -328,6 +328,11 @@ sub rm_remote {\n \n \t$git->command('config', '--remove-section', \"remote.$name\");\n \n+\tmy $defremote = $git->config(\"core.origin\");\n+\tif (defined $defremote && $defremote eq $name) {\n+\t       $git->command(\"config\", \"--unset\", \"core.origin\");\n+\t}\n+\n \teval {\n \t    my @trackers = $git->command('config', '--get-regexp',\n \t\t\t'branch.*.remote', $name);\n-- \n1.5.4.rc3.14.gc50f\n"},{"id":"65251","messageId":"1200241631-3300-3-git-send-email-mlevedahl@gmail.com","threadId":"11573","inReplyTo":"1200241631-3300-2-git-send-email-mlevedahl@gmail.com","subject":"[PATCH] git-clone - Set remotes.origin config variable","fromName":"Mark Levedahl","fromEmail":"mlevedahl@gmail.com","sentAt":"2008-01-13T16:27:09Z","receivedAt":"2008-01-13T16:27:09Z","isPatch":true,"sender":{"key":"mdl123@verizon.net","avatar":"https://avatars.githubusercontent.com/u/5302462?v=4"},"body":"This records the users choice of default remote name (by default \"origin\")\nas given by the -o option.\n\nSigned-off-by: Mark Levedahl <mlevedahl@gmail.com>\n---\n Documentation/git-clone.txt |    3 ++-\n git-clone.sh                |    1 +\n 2 files changed, 3 insertions(+), 1 deletions(-)\n\ndiff --git a/Documentation/git-clone.txt b/Documentation/git-clone.txt\nindex fdccbd4..6c15fa4 100644\n--- a/Documentation/git-clone.txt\n+++ b/Documentation/git-clone.txt\n@@ -95,7 +95,8 @@ OPTIONS\n --origin <name>::\n -o <name>::\n \tInstead of using the remote name 'origin' to keep track\n-\tof the upstream repository, use <name> instead.\n+\tof the upstream repository, use <name> instead. The name\n+\tis recorded in the core.origin config variable.\n \n --upload-pack <upload-pack>::\n -u <upload-pack>::\ndiff --git a/git-clone.sh b/git-clone.sh\nindex b4e858c..7208d68 100755\n--- a/git-clone.sh\n+++ b/git-clone.sh\n@@ -242,6 +242,7 @@ fi &&\n export GIT_DIR &&\n GIT_CONFIG=\"$GIT_DIR/config\" git-init $quiet ${template+\"$template\"} || usage\n \n+git config core.origin $origin\n if test -n \"$bare\"\n then\n \tGIT_CONFIG=\"$GIT_DIR/config\" git config core.bare true\n-- \n1.5.4.rc3.14.gc50f\n"},{"id":"65254","messageId":"1200241631-3300-4-git-send-email-mlevedahl@gmail.com","threadId":"11573","inReplyTo":"1200241631-3300-3-git-send-email-mlevedahl@gmail.com","subject":"[PATCH] git-submodule - Possibly inherit parent's default remote on init/clone","fromName":"Mark Levedahl","fromEmail":"mlevedahl@gmail.com","sentAt":"2008-01-13T16:27:10Z","receivedAt":"2008-01-13T16:27:10Z","isPatch":true,"sender":{"key":"mdl123@verizon.net","avatar":"https://avatars.githubusercontent.com/u/5302462?v=4"},"body":"For submodules defined relative to their parent, it is likely that the\nparent's defined default remote is correct for the child as well. This\nallows use of remote names other than \"origin\", important as managed\nsubmodules are typically checked out on a detached head and therefore\nsubmodule-update invokes git-fetch using the default remote. Without this\nchange, submodules effectively had to have a default remote of \"origin.\"\n\nSigned-off-by: Mark Levedahl <mlevedahl@gmail.com>\n---\n Documentation/git-submodule.txt |    8 +++++---\n git-submodule.sh                |   19 +++++++++++++------\n 2 files changed, 18 insertions(+), 9 deletions(-)\n\ndiff --git a/Documentation/git-submodule.txt b/Documentation/git-submodule.txt\nindex cffc6d4..440e234 100644\n--- a/Documentation/git-submodule.txt\n+++ b/Documentation/git-submodule.txt\n@@ -36,9 +36,11 @@ status::\n \n init::\n \tInitialize the submodules, i.e. register in .git/config each submodule\n-\tname and url found in .gitmodules. The key used in .git/config is\n-\t`submodule.$name.url`. This command does not alter existing information\n-\tin .git/config.\n+\tname and url found in .gitmodules, along with the default remote origin.\n+\tFor submodules using a relative url, the default remote is inherited\n+\tfrom the parent project, for absolute urls the default \"origin\" is used.\n+\tThe key used in .git/config is submodule.$name.url`. This command does\n+\tnot alter existing information in .git/config.\n \n update::\n \tUpdate the registered submodules, i.e. clone missing submodules and\ndiff --git a/git-submodule.sh b/git-submodule.sh\nindex ad9fe62..42be4b9 100755\n--- a/git-submodule.sh\n+++ b/git-submodule.sh\n@@ -7,6 +7,7 @@\n USAGE='[--quiet] [--cached] [add <repo> [-b branch]|status|init|update] [--] [<path>...]'\n OPTIONS_SPEC=\n . git-sh-setup\n+. git-parse-remote\n require_work_tree\n \n add=\n@@ -43,9 +44,7 @@ get_repo_base() {\n # Resolve relative url by appending to parent's url\n resolve_relative_url ()\n {\n-\tbranch=\"$(git symbolic-ref HEAD 2>/dev/null)\"\n-\tremote=\"$(git config branch.${branch#refs/heads/}.remote)\"\n-\tremote=\"${remote:-origin}\"\n+\tremote=\"$(get_default_remote)\"\n \tremoteurl=\"$(git config remote.$remote.url)\" ||\n \t\tdie \"remote ($remote) does not have a url in .git/config\"\n \turl=\"$1\"\n@@ -95,6 +94,7 @@ module_clone()\n {\n \tpath=$1\n \turl=$2\n+\torigin=${3:-origin}\n \n \t# If there already is a directory at the submodule path,\n \t# expect it to be empty (since that is the default checkout\n@@ -110,7 +110,7 @@ module_clone()\n \ttest -e \"$path\" &&\n \tdie \"A file already exist at path '$path'\"\n \n-\tgit-clone -n \"$url\" \"$path\" ||\n+\tgit-clone -n -o \"$origin\" \"$url\" \"$path\" ||\n \tdie \"Clone of '$url' into submodule path '$path' failed\"\n }\n \n@@ -130,9 +130,11 @@ module_add()\n \t\tusage\n \tfi\n \n+\torigin=origin\n \tcase \"$repo\" in\n \t./*|../*)\n \t\t# dereference source url relative to parent's url\n+\t\torigin=$(get_default_remote)\n \t\trealrepo=\"$(resolve_relative_url $repo)\" ;;\n \t*)\n \t\t# Turn the source into an absolute path if\n@@ -157,7 +159,7 @@ module_add()\n \tgit ls-files --error-unmatch \"$path\" > /dev/null 2>&1 &&\n \tdie \"'$path' already exists in the index\"\n \n-\tmodule_clone \"$path\" \"$realrepo\" || exit\n+\tmodule_clone \"$path\" \"$realrepo\" \"$origin\" || exit\n \t(unset GIT_DIR; cd \"$path\" && git checkout -q ${branch:+-b \"$branch\" \"origin/$branch\"}) ||\n \tdie \"Unable to checkout submodule '$path'\"\n \tgit add \"$path\" ||\n@@ -189,12 +191,15 @@ modules_init()\n \t\tdie \"No url found for submodule path '$path' in .gitmodules\"\n \n \t\t# Possibly a url relative to parent\n+\t\torigin=origin\n \t\tcase \"$url\" in\n \t\t./*|../*)\n \t\t\turl=\"$(resolve_relative_url \"$url\")\"\n+\t\t\torigin=$(get_default_remote)\n \t\t\t;;\n \t\tesac\n \n+\t\tgit config submodule.\"$name\".origin \"$origin\" &&\n \t\tgit config submodule.\"$name\".url \"$url\" ||\n \t\tdie \"Failed to register url for submodule path '$path'\"\n \n@@ -222,10 +227,12 @@ modules_update()\n \t\t\tsay \"Submodule path '$path' not initialized\"\n \t\t\tcontinue\n \t\tfi\n+\t\torigin=$(git config submodule.\"$name\".origin)\n+\t\torigin=${origin:-origin}\n \n \t\tif ! test -d \"$path\"/.git\n \t\tthen\n-\t\t\tmodule_clone \"$path\" \"$url\" || exit\n+\t\t\tmodule_clone \"$path\" \"$url\" \"$origin\" || exit\n \t\t\tsubsha1=\n \t\telse\n \t\t\tsubsha1=$(unset GIT_DIR; cd \"$path\" &&\n-- \n1.5.4.rc3.14.gc50f\n"},{"id":"65253","messageId":"1200241631-3300-5-git-send-email-mlevedahl@gmail.com","threadId":"11573","inReplyTo":"1200241631-3300-4-git-send-email-mlevedahl@gmail.com","subject":"[PATCH] Teach git-submodule to use master's remote when updating subprojects","fromName":"Mark Levedahl","fromEmail":"mlevedahl@gmail.com","sentAt":"2008-01-13T16:27:11Z","receivedAt":"2008-01-13T16:27:11Z","isPatch":true,"sender":{"key":"mdl123@verizon.net","avatar":"https://avatars.githubusercontent.com/u/5302462?v=4"},"body":"Modules that are defined using relative urls to the master project are\nassumed to be completely owned by the project. When running\n\"submodule update\" from the top level, it is reasonable that the entire\nproject exists at the current master's remote. Using the\nbranch.$name.remote machinery, this remote can be different for each\nbranch and can be different than the current defaults in each submodule.\n\nThis teaches submodule to:\n\n1) Possibly define the current master's remote in each submodule, using\nthe same relative url used by submodule init.\n2) Fetch each submodule's updates from the master's remote.\n\nSubmodules defined using absolute urls (not relative to the parent) are\nnot touched by this logic. These modules are assumed to be independent\nof the master project so submodule can do no better than to fetch from\ntheir currently defined default remotes as already done.\n\n\nSigned-off-by: Mark Levedahl <mlevedahl@gmail.com>\n---\n git-submodule.sh |   20 +++++++++++++++++++-\n 1 files changed, 19 insertions(+), 1 deletions(-)\n\ndiff --git a/git-submodule.sh b/git-submodule.sh\nindex 42be4b9..5b4b16f 100755\n--- a/git-submodule.sh\n+++ b/git-submodule.sh\n@@ -209,11 +209,14 @@ modules_init()\n \n #\n # Update each submodule path to correct revision, using clone and checkout as needed\n+# For owned submodules (defined using relative url), we use master project's remote\n+# and define that in each submodule if not already there\n #\n # $@ = requested paths (default to all)\n #\n modules_update()\n {\n+\tmaster_remote=$(get_default_remote)\n \tgit ls-files --stage -- \"$@\" | grep -e '^160000 ' |\n \twhile read mode sha1 stage path\n \tdo\n@@ -240,9 +243,24 @@ modules_update()\n \t\t\tdie \"Unable to find current revision in submodule path '$path'\"\n \t\tfi\n \n+\t\tbaseurl=\"$(GIT_CONFIG=.gitmodules git config submodule.\"$name\".url)\"\n+\t\tcase \"$baseurl\" in\n+\t\t./*|../*)\n+\t\t\tfetch_remote=$master_remote\n+\t\t\t(unset GIT_DIR ; cd \"$path\" && git config remote.\"$fetch_remote\".url > nul) ||\n+\t\t\t(\n+\t\t\t\tabsurl=\"$(resolve_relative_url $baseurl)\"\n+\t\t\t\tunset GIT_DIR; cd \"$path\" && git remote add \"$master_remote\" \"$absurl\"\n+\t\t\t) || die \"Unable to define remote '$fetch_remote' in submodule path '$path'\"\n+\t\t\t;;\n+\t\t*)\n+\t\t\tfetch_remote=\n+\t\t\t;;\n+\t\tesac\n+\n \t\tif test \"$subsha1\" != \"$sha1\"\n \t\tthen\n-\t\t\t(unset GIT_DIR; cd \"$path\" && git-fetch &&\n+\t\t\t(unset GIT_DIR; cd \"$path\" && git-fetch \"$fetch_remote\" &&\n \t\t\t\tgit-checkout -q \"$sha1\") ||\n \t\t\tdie \"Unable to checkout '$sha1' in submodule path '$path'\"\n \n-- \n1.5.4.rc3.14.gc50f\n"},{"id":"65273","messageId":"alpine.LSU.1.00.0801132220200.8333@wbgn129.biozentrum.uni-wuerzburg.de","threadId":"11573","inReplyTo":"47893F53.2070908@gmail.com","subject":"Re: [PATCH] Teach remote machinery about remotes.default config variable","fromName":"Johannes Schindelin","fromEmail":"johannes.schindelin@gmx.de","sentAt":"2008-01-13T21:22:29Z","receivedAt":"2008-01-13T21:22:29Z","isPatch":true,"sender":{"key":"johannes.schindelin@gmx.de","avatar":"https://avatars.githubusercontent.com/u/127790?v=4"},"body":"Hi,\n\nOn Sat, 12 Jan 2008, Mark Levedahl wrote:\n\n> Johannes Schindelin wrote:\n> > Why is your patch then not about git-submodule?\n> > \n> > And I still fail to see -- even for submodules -- how you begin to \n> > tackle that lookup problem.\n> \n> Because git-submodule is a wrapper around git-fetch and git-clone and \n> git-remote, and those lacked the mechanism to honor the fact that when I \n> said\n> \n>       git clone -o  frotz frontz.foo.bar/foo.git\n> \n> I *defined* the upstream's nickname as \"frotz\", not \"origin\", and origin \n> is *not* defined so don't try to use it. As sub-modules are git \n> projects, fixing this in a sub-module necessarily fixes it in any git \n> project.\n\nUnfortunately, you _still_ fail to even ackonwledge that you still need a \nlookup, and that I have a point when saying \"your patch does not help, \nsince you still have a lookup\".\n\nBut I start to believe that you do not even want to present an argument \nagainst this reasoning, so I will stop here.\n\nCiao,\nDscho\n"},{"id":"65274","messageId":"alpine.LSU.1.00.0801132224540.8333@wbgn129.biozentrum.uni-wuerzburg.de","threadId":"11573","inReplyTo":"7v4pdislrf.fsf@gitster.siamese.dyndns.org","subject":"Re: [PATCH] Teach remote machinery about remotes.default config variable","fromName":"Johannes Schindelin","fromEmail":"johannes.schindelin@gmx.de","sentAt":"2008-01-13T21:27:22Z","receivedAt":"2008-01-13T21:27:22Z","isPatch":true,"sender":{"key":"johannes.schindelin@gmx.de","avatar":"https://avatars.githubusercontent.com/u/127790?v=4"},"body":"Hi,\n\nOn Sat, 12 Jan 2008, Junio C Hamano wrote:\n\n> Mark Levedahl <mlevedahl@gmail.com> writes:\n> \n> > Basically, I think an important (but not complete) test of the design\n> > is that\n> >\n> >    git clone -o frotz git://frotz.foo.bar/myproject.git\n> >    cd myproject\n> >    git submodule init\n> >    git submodule update\n> >\n> > work, with origin = frotz throughout the submodules, and with the\n> > whole project correctly checked out even if the entire project was\n> > rehosted onto a different server.\n> \n> I like that.  This is a very good argument, especially because it \n> clarifies very well that the issue is not about \"'submodule init' \n> misbehaves\" but \"fetch/pull/merge does not play well with clone -o\".\n\nFWIW I disagree.\n\nI never understood why people want to complicate things by being able to \nname default _keys_ differently.  Why not letting \"origin\" being the \ndefault being pulled from, and be done with it?\n\nBesides, I _really_ do not understand why we have such a discussion in rc \nphase.  There are _many_ more interesting discussions now that _also_ do \nnot belong into a freeze phase.\n\nCiao,\nDscho\n"},{"id":"65291","messageId":"7vir1xmazm.fsf@gitster.siamese.dyndns.org","threadId":"11573","inReplyTo":"alpine.LSU.1.00.0801132224540.8333@wbgn129.biozentrum.uni-wuerzburg.de","subject":"Re: [PATCH] Teach remote machinery about remotes.default config variable","fromName":"Junio C Hamano","fromEmail":"gitster@pobox.com","sentAt":"2008-01-14T01:50:21Z","receivedAt":"2008-01-14T01:50:21Z","isPatch":true,"sender":{"key":"gitster@pobox.com","avatar":"https://avatars.githubusercontent.com/u/54884?v=4"},"body":"Johannes Schindelin <Johannes.Schindelin@gmx.de> writes:\n\n> I never understood why people want to complicate things by being able to \n> name default _keys_ differently.  Why not letting \"origin\" being the \n> default being pulled from, and be done with it?\n\nThat happens to match my personal feeling.\n\nHOWEVER.\n\nWe treat 'origin' in a special way when you do this:\n\n\t$ git clone somewhere new.git\n        $ cd new.git\n        $ git checkout HEAD^0\n        $ git pull\n\nAnd we already have \"clone -o\" and claim to support that option.\nI think that it is very reasonable from the consistency point of\nview to make sure that the following sequence treats 'frotz' the\nsame special way the above treats 'origin' specially:\n\n\t$ git clone -o frotz somewhere new.git\n        $ cd new.git\n        $ git checkout HEAD^0\n        $ git pull\n\nA purist alternative is to deprecate \"git clone -o\" and\neventually remove it.\n\nNote that I was agreeing only with this specific aspect of the\nargument.  I am not at all interested in getting involved in\nrefining or re-defining the existing submodule semantics this\nlate in the cycle before 1.5.4.  But I can very well see that\nfixing this specific inconsistency can be separated out from the\nrest of Mark's series and viewed as a set of trivially correct\nfixes.\n\n> Besides, I _really_ do not understand why we have such a\n> discussion in rc phase.  There are _many_ more interesting\n> discussions now that _also_ do not belong into a freeze phase.\n\nCurrently the ones I looked at and consider possible 1.5.4\nmaterial are http-push fixes from Grégoire Barbier and\nparse_commit_buffer() tightening from Martin Koegler.\n\nRecently I looked at the following patches and topics but I do\nnot think any of them belongs to 1.5.4.  None of them is obvious\nand trivially correct fix to regressions or serious existing\nbugs:\n\n * compress/decompress abstraction (Marco)\n\n * crlf (Steffen Prohaska and Dmitry Potapov)\n\n * whitespace error: \"cr at eol is ok\" (me)\n\n * various conflicting submodule changes(Ping Yin, Mark\n   Levedahl, Imran M Yousuf)\n\n * unconfigured ident safety (Stephen Sinclair)\n\n * gitweb feed from commit to commitdiff (Florian La Rouche --\n   Jakub seems to be on top of this so I am not worried about it\n   too much).\n\n * color.ui (Matthias Kestenholz)\n\n * test scripts to use valgrind (Jeff King, but there was another\n   one in the past -- can their efforts compared and coordinated\n   better?).\n\n * various lstat(2) reduction changes (me).\n\n * pathname safety on insane filesystems (Linus, Robin\n   Rosenberg, me).\n\n(yes, some of the above list do not even have any code).\n\nI am hoping that authors will resend the ones they really care\nabout after 1.5.4, as I do not want to take patches early.\n\nThanks.\n"},{"id":"65295","messageId":"478AD5A0.50900@gmail.com","threadId":"11573","inReplyTo":"alpine.LSU.1.00.0801132220200.8333@wbgn129.biozentrum.uni-wuerzburg.de","subject":"Re: [PATCH] Teach remote machinery about remotes.default config variable","fromName":"Mark Levedahl","fromEmail":"mlevedahl@gmail.com","sentAt":"2008-01-14T03:23:12Z","receivedAt":"2008-01-14T03:23:12Z","isPatch":true,"sender":{"key":"mdl123@verizon.net","avatar":"https://avatars.githubusercontent.com/u/5302462?v=4"},"body":"Johannes Schindelin wrote:\n> Unfortunately, you _still_ fail to even ackonwledge that you still need a \n> lookup, and that I have a point when saying \"your patch does not help, \n> since you still have a lookup\".\n>   \nI don't acknowledge this point as it is not true.\n\nI will try to explain one more time.\n\n1 - \"origin\" is fine as an abstraction IFF everyone on the project can \nreasonably expect that \"git fetch origin\" will yield the same results \nfor anyone who executes that command. As I have tried (and apparently \nfailed) to explain, for numerous complex and unchangeable reasons, \"git \nfetch origin\" is *NOT* expected to give the same results around this \nproject and therefore, \"origin\" is not a useful abstraction.\n\n2 - Until we used submodules, we never defined \"origin\", but instead \nexplicitly named the server using standard nicknames (e.g., \"git fetch \nfrotz\", not \"git fetch\"). Everyone who can access frotz gets the same \nresult. Those who can't, and have to use server \"zorft\", get a different \nresult but it is obvious to all they didn't go to frotz.\n\n3 - As the servers are different and have different content, it is just \npart of the workflow to know the server names and use them. We have \nagreed upon a common set of server nicknames. There is no lookup, we \njust know them. Maybe you call this a lookup step, but frankly this is \npart of *required* job knowledge (which server has what and which to use \nfor which purpose).\n\n4 - The problem came with submodules. Now, the recipe of \"git clone -o \nfrotz\" no longer really works, as all of the submodules now have remote \norigin = frotz, and remote frotz is undefined while the master-project \nis the other way around. This is confusing to say the least. As \nsubmodules forced origin in, the path of least resistance  was just \ngiving in and using origin. Now we have to be very aware not only of \nwhat server to use, but now also what origin is so that we can know how \nto reach the server we wanted. (i.e., Do I use \"origin\" or \"frotz\" to \nreach frotz?) This *IS* an extra lookup step required because of origin \nbeing defined.\n\nNow, we can recusively use \"git remote add\" to just go ahead and add all \nremotes needed regardless of what origin says, and *partly* get back to \nwhere we were. Only partly, because git submodule update will still use \norigin, and *only* origin for fetching. So we still have to know what \norigin is (problem #1, fixed by my patches 1-4), and if what we need to \nfetch from is in fact not origin (even though the master project knows \nwhat server to access), submodule update in fact doesn't even work \n(fixed by the fifth patch that flows the remote down from the master).\n\nSo no, I do not acknowledge that we have an extra lookup step and that \njust using origin is the same or simpler or whatever. It absolutely is \nnot. Quite the opposite, for us using \"origin\" forces an unnecessary \nextra lookup and translation step and complicates, not simplifies, use \nof submodules.\n\nMark\n"},{"id":"65296","messageId":"7vabn9m30a.fsf@gitster.siamese.dyndns.org","threadId":"11573","inReplyTo":"478AD5A0.50900@gmail.com","subject":"Re: [PATCH] Teach remote machinery about remotes.default config variable","fromName":"Junio C Hamano","fromEmail":"gitster@pobox.com","sentAt":"2008-01-14T04:42:45Z","receivedAt":"2008-01-14T04:42:45Z","isPatch":true,"sender":{"key":"gitster@pobox.com","avatar":"https://avatars.githubusercontent.com/u/54884?v=4"},"body":"Mark Levedahl <mlevedahl@gmail.com> writes:\n\n> ... if what\n> we need to fetch from is in fact not origin (even though the master\n> project knows what server to access), submodule update in fact doesn't\n> even work ...\n\nThis is an interesting point.\n\nPerhaps git-submodule.sh::modules_update should use $url it\nobtains from the configuration in the upper level when running\ngit-fetch in the submodule.\n\nIf you view the problem this way, your earlier \"git fetch while\nthe HEAD is detached always uses 'origin'\" may turn out to be a\nnon-issue.\n\nWhich again brings us back to Johannes's earlier point.  If the\nissue is about submodule, maybe what needs to be fixes is in\ngit-submodule, and not the defaulting to 'origin' git-fetch and\nfriends do.\n"},{"id":"65302","messageId":"31687420-EB17-4651-AD6C-07213311ABDA@zib.de","threadId":"11573","inReplyTo":"7vir1xmazm.fsf@gitster.siamese.dyndns.org","subject":"safecrlf not in 1.5.4 (was Re: [PATCH] Teach remote machinery about remotes.default config variable)","fromName":"Steffen Prohaska","fromEmail":"prohaska@zib.de","sentAt":"2008-01-14T06:49:14Z","receivedAt":"2008-01-14T06:49:14Z","isPatch":true,"sender":{"key":"prohaska@zib.de","avatar":"https://avatars.githubusercontent.com/u/217580?v=4"},"body":"\nOn Jan 14, 2008, at 2:50 AM, Junio C Hamano wrote:\n\n> Recently I looked at the following patches and topics but I do\n> not think any of them belongs to 1.5.4.  None of them is obvious\n> and trivially correct fix to regressions or serious existing\n> bugs:\n>\n[...]\n\n\n>  * crlf (Steffen Prohaska and Dmitry Potapov)\n\n[...]\n\n\n> I am hoping that authors will resend the ones they really care\n> about after 1.5.4, as I do not want to take patches early.\n\nThanks for your update on this.  I agree with your opinion,\nalthough I'd prefer to have the safecrlf option soon.\n\nWithout safecrlf I'll not enable core.autocrlf=true in msysgit.\nNow that I see a reasonable way of having at least a warning\nabout potential data corruption when core.autocrlf=true, I'm\neven stronger against enabling it without a safety valve.\n\nAs I pointed out in the recent CRLF discussion, I believe the\nproblem is not specific to Windows but is about a reasonable\ndefault configuration for cross-platform projects.  CRLF\nconversion must be enabled on all platforms to have good defaults\nfor a mixed Unix/Windows environment, and hence the safecrlf if\nalso needed on all platforms.\n\nSo I don't see much value in having the safecrlf only in msysgit\nand not in official git.\n\nJunio,\nDo you see a chance to have safecrlf in 1.5.4.1?\n\nI am currently considering wether it is worth following the maint\nseries of official git with msysgit.  That is we'd have a maint\nbranch in msysgit, which would merge from Junio's maint.\nAlthough we're still in preview mode with msysgit I tend to\nbelieve that this would be a good idea.\n\nThe preview tag is mostly due to the unspecified set of features\nof msysgit, not that I think part of msysgit is not already very\nstable and usable.  But msysgit only supports a subset of the\ncommands of official git and we don't really say or even know\nwhich commands currently work reliably.  It could be worth to\ncompile such a list and only install the commands that we are\nconvinced of being ready for production.\n\n\tSteffen\n"},{"id":"65306","messageId":"7vejcklv84.fsf@gitster.siamese.dyndns.org","threadId":"11573","inReplyTo":"31687420-EB17-4651-AD6C-07213311ABDA-wjoc1KHpMeg@public.gmane.org","subject":"Re: safecrlf not in 1.5.4","fromName":"Junio C Hamano","fromEmail":"gitster-e+axbwqsrlaavxtiumwx3w@public.gmane.org","sentAt":"2008-01-14T07:30:51Z","receivedAt":"2008-01-14T07:30:51Z","isPatch":false,"sender":{"key":"gitster-e+axbwqsrlaavxtiumwx3w@public.gmane.org","avatar":null},"body":"\nSteffen Prohaska <prohaska-wjoc1KHpMeg@public.gmane.org> writes:\n\n> Do you see a chance to have safecrlf in 1.5.4.1?\n\nBy definition of 'maint', 1.5.4.X are to fix bugs in the\nfeatures that are in 1.5.4, so the answer is no.\n\nBut we could end up having a short cycle for 1.5.5 if we agree\nthat the lack of crlf=safe is a severe bug that is worth fixing\npost 1.5.4.\n\nCurrently I am not convinced that the lack of crlf=safe is a\nsevere and urgent bug worth \"fixing\" for 1.5.4.  I see it as a\nnew feature, a different variant of crlf behaviour we will be\nintroducing for audience who are not satisfied with existing the\ncrlf variants.\n"},{"id":"65307","messageId":"E4FD5B11-F61A-4838-B9AD-1E6F6C2B0AD6@zib.de","threadId":"11573","inReplyTo":"7vejcklv84.fsf-jO8aZxhGsIagbBziECNbOZn29agUkmeCHZ5vskTnxNA@public.gmane.org","subject":"Re: safecrlf not in 1.5.4","fromName":"Steffen Prohaska","fromEmail":"prohaska-wjoc1khpmeg@public.gmane.org","sentAt":"2008-01-14T08:29:04Z","receivedAt":"2008-01-14T08:29:04Z","isPatch":false,"sender":{"key":"prohaska-wjoc1khpmeg@public.gmane.org","avatar":null},"body":"\n\nOn Jan 14, 2008, at 8:30 AM, Junio C Hamano wrote:\n\n>\n> Steffen Prohaska <prohaska-wjoc1KHpMeg@public.gmane.org> writes:\n>\n>> Do you see a chance to have safecrlf in 1.5.4.1?\n>\n> By definition of 'maint', 1.5.4.X are to fix bugs in the\n> features that are in 1.5.4, so the answer is no.\n\nI expected this answer.\n\n\n> But we could end up having a short cycle for 1.5.5 if we agree\n> that the lack of crlf=safe is a severe bug that is worth fixing\n> post 1.5.4.\n>\n> Currently I am not convinced that the lack of crlf=safe is a\n> severe and urgent bug worth \"fixing\" for 1.5.4.  I see it as a\n> new feature, a different variant of crlf behaviour we will be\n> introducing for audience who are not satisfied with existing the\n> crlf variants.\n\n\nSo I should try harder to find better arguments.  But this has\ntime until the 1.5.4 release is out.  For now, I am being quiet.\n\n(Well, I'll continue to improve the safecrlf patch and most\nlikely will send it to the list, too.  But I don't expect to find\nit anywhere in your repo before 1.5.4.)\n\n\tSteffen\n"},{"id":"65308","messageId":"20080114090456.GZ2963@dpotapov.dyndns.org","threadId":"11573","inReplyTo":"7vejcklv84.fsf-jO8aZxhGsIagbBziECNbOZn29agUkmeCHZ5vskTnxNA@public.gmane.org","subject":"Re: safecrlf not in 1.5.4","fromName":"Dmitry Potapov","fromEmail":"dpotapov-re5jqeeqqe8avxtiumwx3w@public.gmane.org","sentAt":"2008-01-14T09:04:56Z","receivedAt":"2008-01-14T09:04:56Z","isPatch":false,"sender":{"key":"dpotapov-re5jqeeqqe8avxtiumwx3w@public.gmane.org","avatar":null},"body":"\nOn Sun, Jan 13, 2008 at 11:30:51PM -0800, Junio C Hamano wrote:\n> \n> But we could end up having a short cycle for 1.5.5 if we agree\n> that the lack of crlf=safe is a severe bug that is worth fixing\n> post 1.5.4.\n\nHopefully, the cycle for 1.5.5 will be a bit shorter than 1.5.4, because\n1.5.4 seems to have the longest development cycle of all versions, and\nit already contains almost as much changes as three previous versions\n(\"git diff v1.5.3 master\" is almost as big as \"git diff v1.5.0 v1.5.3\").\n\nDmitry\n"},{"id":"65311","messageId":"20080114110512.GA12723@coredump.intra.peff.net","threadId":"11573","inReplyTo":"1200241631-3300-2-git-send-email-mlevedahl@gmail.com","subject":"Re: [PATCH] git-remote - Unset core.origin when deleting the default remote","fromName":"Jeff King","fromEmail":"peff@peff.net","sentAt":"2008-01-14T11:05:12Z","receivedAt":"2008-01-14T11:05:12Z","isPatch":true,"sender":{"key":"peff@peff.net","avatar":"https://avatars.githubusercontent.com/u/45925?v=4"},"body":"On Sun, Jan 13, 2008 at 11:27:08AM -0500, Mark Levedahl wrote:\n\n> --- a/git-remote.perl\n> +++ b/git-remote.perl\n> @@ -328,6 +328,11 @@ sub rm_remote {\n>  \n>  \t$git->command('config', '--remove-section', \"remote.$name\");\n>  \n> +\tmy $defremote = $git->config(\"core.origin\");\n> +\tif (defined $defremote && $defremote eq $name) {\n> +\t       $git->command(\"config\", \"--unset\", \"core.origin\");\n> +\t}\n> +\n\nI'm not sure I see the use case that this helps. Presumably you are\ndoing one of (assuming your core.origin is 'foo'):\n\n  - delete 'foo', and then proceed with usual git commands. In this\n    case, your core.origin has reverted to 'origin', but what is the\n    chance that you actually have such a remote (since you presumably\n    cloned with -o foo)?\n\n  - delete 'foo', then re-add 'foo'. I would expect this to be\n    equivalent to editing the config, but as a side effect, your\n    core.origin has mysteriously changed.\n\n  - delete 'foo', then re-add 'bar' with the intent of making it your\n    new origin. This doesn't help at all, since there's nothing\n    automatically setting core.origin to 'bar', so you might as well\n    leave it as the bogus 'foo' rather than the bogus 'origin'. And to\n    help this use case, something like a \"-d\" flag to git-remote to set\n    the new origin as the default might make sense. I.e.,\n\n      git remote rm foo\n      git remote add -d bar git://bar/project.git\n\n    Alternatively, when adding a remote, if it is the _only_ remote (or\n    perhaps if the current core.origin doesn't exist), we could set\n    core.origin which would automagically cover the latter two cases.\n    Although it feels a little too DWIM.\n\n-Peff\n"},{"id":"65312","messageId":"alpine.LSU.1.00.0801141202240.8333@wbgn129.biozentrum.uni-wuerzburg.de","threadId":"11573","inReplyTo":"7vir1xmazm.fsf@gitster.siamese.dyndns.org","subject":"Re: [PATCH] Teach remote machinery about remotes.default config variable","fromName":"Johannes Schindelin","fromEmail":"johannes.schindelin@gmx.de","sentAt":"2008-01-14T11:18:13Z","receivedAt":"2008-01-14T11:18:13Z","isPatch":true,"sender":{"key":"johannes.schindelin@gmx.de","avatar":"https://avatars.githubusercontent.com/u/127790?v=4"},"body":"Hi,\n\nOn Sun, 13 Jan 2008, Junio C Hamano wrote:\n\n> And we already have \"clone -o\" and claim to support that option.\n\nMy understanding was _always_ that the \"-o\" option was meant for the case \nthat you want to clone from somewhere else than where you want to pull \nfrom.  Something like an initial clone from a USB disk.\n\n>  * test scripts to use valgrind (Jeff King, but there was another\n>    one in the past -- can their efforts compared and coordinated\n>    better?).\n\nYes, that was written in Perl by Christian Couder:\n\nhttp://article.gmane.org/gmane.comp.version-control.git/69236\n\nPeff's version does not need Perl, and is better integrated with the \ntestsuite (via the new option -m).  Christian's version parses the output, \nand might therefore be nicer to look at.\n\nHowever, I think that both versions do not account for scripts, and I \nimagine that going through Git.pm and git-sh-setup is necessary for that.\n\nAlso, it might be a good idea to be able to provide extra arguments, such \nas \"--attach-db=yes\".\n\nPost 1.5.4, definitely.\n\nCiao,\nDscho\n"},{"id":"65316","messageId":"20080114121615.GC12723@coredump.intra.peff.net","threadId":"11573","inReplyTo":"alpine.LSU.1.00.0801141202240.8333@wbgn129.biozentrum.uni-wuerzburg.de","subject":"valgrind test scripts (was Re: [PATCH] Teach remote...)","fromName":"Jeff King","fromEmail":"peff@peff.net","sentAt":"2008-01-14T12:16:15Z","receivedAt":"2008-01-14T12:16:15Z","isPatch":true,"sender":{"key":"peff@peff.net","avatar":"https://avatars.githubusercontent.com/u/45925?v=4"},"body":"On Mon, Jan 14, 2008 at 12:18:13PM +0100, Johannes Schindelin wrote:\n\n> >  * test scripts to use valgrind (Jeff King, but there was another\n> >    one in the past -- can their efforts compared and coordinated\n> >    better?).\n> \n> Yes, that was written in Perl by Christian Couder:\n> \n> http://article.gmane.org/gmane.comp.version-control.git/69236\n> \n> Peff's version does not need Perl, and is better integrated with the \n> testsuite (via the new option -m).  Christian's version parses the output, \n> and might therefore be nicer to look at.\n\nI don't think parsing is necessary. Christian's version counts the\nerrors, whereas I just barf if valgrind has mentioned any errors. And\nusing the '-q' output of valgrind means the output is fairly cleaned up.\n\nBut of course the main difference is that I tried to integrate into the\ntest scripts, and stop running as soon as any errors are found.\n\n> However, I think that both versions do not account for scripts, and I \n> imagine that going through Git.pm and git-sh-setup is necessary for that.\n\nBoth versions use the 'alias' approach. A more comprehensive approach\nwould be something like:\n\n  mkdir wrapper-bin\n  cat >wrapper-bin/git <<EOF\n  ...\n  EOF\n  chmod 755 wrapper-bin/git\n  for i in $GIT_PROGRAMS; do\n    ln -s git wrapper-bin/git-$i\n  done\n  PATH=$PWD/wrapper-bin:$PATH\n\nwhich should get all git calls (though we should probably not wrap\n\"git-foo\" if git-foo is a script (or we should convert it to \"git\nfoo\") since I have no desire to valgrind bash or perl).\n\n> Also, it might be a good idea to be able to provide extra arguments, such \n> as \"--attach-db=yes\".\n\nYes. I suspect some people will need to add custom suppression files\ndepending on their platform, as well.\n\n> Post 1.5.4, definitely.\n\nAgreed.\n\n-Peff\n"},{"id":"65325","messageId":"20080114173502.GA26586@artemis.madism.org","threadId":"11573","inReplyTo":"20080114090456.GZ2963@dpotapov.dyndns.org","subject":"Re: safecrlf not in 1.5.4","fromName":"Pierre Habouzit","fromEmail":"madcoder@debian.org","sentAt":"2008-01-14T17:35:02Z","receivedAt":"2008-01-14T17:35:02Z","isPatch":false,"sender":{"key":"madcoder@debian.org","avatar":"https://avatars.githubusercontent.com/u/44708?v=4"},"body":"On Mon, Jan 14, 2008 at 09:04:56AM +0000, Dmitry Potapov wrote:\n> On Sun, Jan 13, 2008 at 11:30:51PM -0800, Junio C Hamano wrote:\n> > \n> > But we could end up having a short cycle for 1.5.5 if we agree\n> > that the lack of crlf=safe is a severe bug that is worth fixing\n> > post 1.5.4.\n> \n> Hopefully, the cycle for 1.5.5 will be a bit shorter than 1.5.4, because\n> 1.5.4 seems to have the longest development cycle of all versions, and\n> it already contains almost as much changes as three previous versions\n> (\"git diff v1.5.3 master\" is almost as big as \"git diff v1.5.0 v1.5.3\").\n\n  hehe, though we still do not have Megabytes of changes between two RCs\nyet ;)\n\n-- \n·O·  Pierre Habouzit\n··O                                                madcoder@debian.org\nOOO                                                http://www.madism.org\n"},{"id":"65330","messageId":"7vsl10jity.fsf@gitster.siamese.dyndns.org","threadId":"11573","inReplyTo":"E4FD5B11-F61A-4838-B9AD-1E6F6C2B0AD6@zib.de","subject":"Re: [msysGit] Re: safecrlf not in 1.5.4","fromName":"Junio C Hamano","fromEmail":"gitster@pobox.com","sentAt":"2008-01-14T19:41:29Z","receivedAt":"2008-01-14T19:41:29Z","isPatch":false,"sender":{"key":"gitster@pobox.com","avatar":"https://avatars.githubusercontent.com/u/54884?v=4"},"body":"Steffen Prohaska <prohaska@zib.de> writes:\n\n> On Jan 14, 2008, at 8:30 AM, Junio C Hamano wrote:\n>\n>> By definition of 'maint', 1.5.4.X are to fix bugs in the\n>> features that are in 1.5.4, so the answer is no.\n>\n> I expected this answer.\n\nAnd it won't change.\n\n>> But we could end up having a short cycle for 1.5.5 if we agree\n>> that the lack of crlf=safe is a severe bug that is worth fixing\n>> post 1.5.4.\n> ...\n> So I should try harder to find better arguments.  But this has\n> time until the 1.5.4 release is out.  For now, I am being quiet.\n\nInstead, you could be louder and convince people that it is a\nsevere bug worth fixing before 1.5.4, like Linus did with the\nissue with performance regression on a partial commit.  It's\nentirely your choice.\n\n> (Well, I'll continue to improve the safecrlf patch and most\n> likely will send it to the list, too...)\n\nPlease do.  \"I am currently not convinced\" does not mean \"I am\nalways right\" nor \"I won't reconsider\".\n"},{"id":"65358","messageId":"478C3CD3.6010504@gmail.com","threadId":"11573","inReplyTo":"7vabn9m30a.fsf@gitster.siamese.dyndns.org","subject":"Re: [PATCH] Teach remote machinery about remotes.default config variable","fromName":"Mark Levedahl","fromEmail":"mlevedahl@gmail.com","sentAt":"2008-01-15T04:55:47Z","receivedAt":"2008-01-15T04:55:47Z","isPatch":true,"sender":{"key":"mdl123@verizon.net","avatar":"https://avatars.githubusercontent.com/u/5302462?v=4"},"body":"Junio C Hamano wrote:\n> Mark Levedahl <mlevedahl@gmail.com> writes:\n>\n>   \n>> ... if what\n>> we need to fetch from is in fact not origin (even though the master\n>> project knows what server to access), submodule update in fact doesn't\n>> even work ...\n>>     \n>\n> This is an interesting point.\n>\n> Perhaps git-submodule.sh::modules_update should use $url it\n> obtains from the configuration in the upper level when running\n> git-fetch in the submodule.\n>   \nyes, I like this change, it works very nicely. but that last patch is \nonly a partial solution...\n> If you view the problem this way, your earlier \"git fetch while\n> the HEAD is detached always uses 'origin'\" may turn out to be a\n> non-issue.\n>\n> Which again brings us back to Johannes's earlier point.  If the\n> issue is about submodule, maybe what needs to be fixes is in\n> git-submodule, and not the defaulting to 'origin' git-fetch and\n> friends do.\n>   \nNope, git submodule *still* requires origin (e.g., execute git submodule \ninit or update on a detached head). We are dancing around the issue, not \nfixing the root cause. This is perhaps illuminated by splitting projects \ninto two camps:\n\nCamp1 - there is no need to distinguish the upstream servers (or there \nis only one), calling it/all origin is fine.\nCamp2 - there is a need to distinguish servers, they are not identical, \nuniform naming across project is required (but folks might still like to \nbe able to have a default, and probably want to change that default on \noccasion), .\n\nSo far, git is written as if the whole world is in Camp1, and the \nproblems appear for Camp2. The underlying issue is that git has \nconvolved the referencing, naming, and designation of a default remote \ninto *one* thing when it is really three things. For git, the default \nremote is named origin, which is also how it is designated as the \ndefault, and is also how you reference the default in commands. \nNon-default remotes have an arbitrary nickname, are not default as they \nare not called origin, and are referenced by using their nicknames.\n\nTo serve Camp2 (and not impact Camp1), origin should be a handle that \ndereferences to the name of the default remote, and designation of the \ndefault remote should be by a separate config item rather than a special \nname for the remote. Assume core.origin names the default remote:\n\nFor Campl, we have\n    core.origin=origin\nwith the default remote having nickname origin.\n\nFor Camp2, we could have\n    core.origin=<whatever>\nwith the default remote having nickname <whatever>\n\nAt the command line, \"git fetch\" dereferences to $(git config \ncore.origin), which is origin for Camp1, but <whatever> for Camp2. So, \nCamp1 users don't notice anything is different, and Camp2 users don't \nhave a number of different servers all referred to as \"origin\".\n\nThe key is that in Camp2, a given remote now can have  the *same* \nnickname for all members of the project, regardless of which remote they \nhave made their default. \"git fetch\" and \"git fetch origin\" still work, \nthey just dereference core.origin (perhaps verbosely to warn that the \nremote being updated is *not* actually named origin), then update the \nremotes/$(git config core.origin)/* branches.\n\nObviously, Camp1 with core.origin=origin is the default, and everything \nin user land works exactly as it does today. Camp2 with \ncore.origin~=default is only mentioned in the graduate level git course \nand shielded with \"Caution, Sharp Knives!\" signs. Fine, I need the knives.\n\nMark\n"},{"id":"65359","messageId":"478C3E75.2030801@gmail.com","threadId":"11573","inReplyTo":"20080114110512.GA12723@coredump.intra.peff.net","subject":"Re: [PATCH] git-remote - Unset core.origin when deleting the default remote","fromName":"Mark Levedahl","fromEmail":"mlevedahl@gmail.com","sentAt":"2008-01-15T05:02:45Z","receivedAt":"2008-01-15T05:02:45Z","isPatch":true,"sender":{"key":"mdl123@verizon.net","avatar":"https://avatars.githubusercontent.com/u/5302462?v=4"},"body":"Jeff King wrote:\n> On Sun, Jan 13, 2008 at 11:27:08AM -0500, Mark Levedahl wrote:\n>\n>   \n>> --- a/git-remote.perl\n>> +++ b/git-remote.perl\n>> @@ -328,6 +328,11 @@ sub rm_remote {\n>>  \n>>  \t$git->command('config', '--remove-section', \"remote.$name\");\n>>  \n>> +\tmy $defremote = $git->config(\"core.origin\");\n>> +\tif (defined $defremote && $defremote eq $name) {\n>> +\t       $git->command(\"config\", \"--unset\", \"core.origin\");\n>> +\t}\n>> +\n>>     \n>\n> I'm not sure I see the use case that this helps.\n>   \nJust being thorough: the man page claims that \"git remote rm foo\" \nremoves all mention of remote foo.\n\n>     Alternatively, when adding a remote, if it is the _only_ remote (or\n>     perhaps if the current core.origin doesn't exist), we could set\n>     core.origin which would automagically cover the latter two cases.\n>     Although it feels a little too DWIM.\n>\n> -Peff\n>   \nI suspect anything done in this case is going to suffer from DWIM-itis \nin some conditions. I can't offer a better argument than the one above.\n\nMark\n"},{"id":"65363","messageId":"7vy7arhas9.fsf@gitster.siamese.dyndns.org","threadId":"11573","inReplyTo":"478C3CD3.6010504@gmail.com","subject":"Re: [PATCH] Teach remote machinery about remotes.default config variable","fromName":"Junio C Hamano","fromEmail":"gitster@pobox.com","sentAt":"2008-01-15T06:18:14Z","receivedAt":"2008-01-15T06:18:14Z","isPatch":true,"sender":{"key":"gitster@pobox.com","avatar":"https://avatars.githubusercontent.com/u/54884?v=4"},"body":"Mark Levedahl <mlevedahl@gmail.com> writes:\n\n> Junio C Hamano wrote:\n> ...\n>> Perhaps git-submodule.sh::modules_update should use $url it\n>> obtains from the configuration in the upper level when running\n>> git-fetch in the submodule.\n>>\n> yes, I like this change, it works very nicely. but that last patch is\n> only a partial solution...\n>> If you view the problem this way, your earlier \"git fetch while\n>> the HEAD is detached always uses 'origin'\" may turn out to be a\n>> non-issue.\n>>\n>> Which again brings us back to Johannes's earlier point.  If the\n>> issue is about submodule, maybe what needs to be fixes is in\n>> git-submodule, and not the defaulting to 'origin' git-fetch and\n>> friends do.\n>>\n> Nope, git submodule *still* requires origin (e.g., execute git\n> submodule init or update on a detached head).\n\nNow I am even more confused.\n\nThe approach I suggested in a few paragraphs above, to which you\njust said \"I like this change\", is about making \"git submodule\nupdate\" to use the url configured in the upper level repository\nwhen it runs \"git fetch\".  I am looking at around l.238 of\ngit-submodule.sh.  In the current code, it runs \"git-fetch\"\nwithout any parameter, which would allow it default to origin or\nwhatever, which may or may not be desirable depending on where\nthe 'origin' points at.  If you make that particular git-fetch\nexplicitly say where the fetch should be done from, wouldn't it\nfix the issue for that codepath?  Why does it still require\norigin?\n"},{"id":"65390","messageId":"20080115165041.GB9478@coredump.intra.peff.net","threadId":"11573","inReplyTo":"478C3E75.2030801@gmail.com","subject":"Re: [PATCH] git-remote - Unset core.origin when deleting the default remote","fromName":"Jeff King","fromEmail":"peff@peff.net","sentAt":"2008-01-15T16:50:41Z","receivedAt":"2008-01-15T16:50:41Z","isPatch":true,"sender":{"key":"peff@peff.net","avatar":"https://avatars.githubusercontent.com/u/45925?v=4"},"body":"On Tue, Jan 15, 2008 at 12:02:45AM -0500, Mark Levedahl wrote:\n\n>> I'm not sure I see the use case that this helps.\n>>   \n> Just being thorough: the man page claims that \"git remote rm foo\" removes \n> all mention of remote foo.\n\nI was going to respond \"by that rationale, 'git remote rm' should be\nremoving branch.*.remote keys that point to the removed remote\". But\nlooking at the code, it already does that. So your change actually keeps\nthings consistent.\n\nNot the choice I would have made, but I guess it just goes to show that\nI use \"vi\" instead of \"git remote\". Consider my objection withdrawn.\n\n-Peff\n"},{"id":"65432","messageId":"478D3CD8.3040805@gmail.com","threadId":"11573","inReplyTo":"7vy7arhas9.fsf@gitster.siamese.dyndns.org","subject":"Re: [PATCH] Teach remote machinery about remotes.default config variable","fromName":"Mark Levedahl","fromEmail":"mlevedahl@gmail.com","sentAt":"2008-01-15T23:08:08Z","receivedAt":"2008-01-15T23:08:08Z","isPatch":true,"sender":{"key":"mdl123@verizon.net","avatar":"https://avatars.githubusercontent.com/u/5302462?v=4"},"body":"Junio C Hamano wrote:\n>> Nope, git submodule *still* requires origin (e.g., execute git\n>> submodule init or update on a detached head).\n>>     \n>\n> Now I am even more confused.\n>\n> The approach I suggested in a few paragraphs above, to which you\n> just said \"I like this change\", is about making \"git submodule\n> update\" to use the url configured in the upper level repository\n> when it runs \"git fetch\".  I am looking at around l.238 of\n> git-submodule.sh.  In the current code, it runs \"git-fetch\"\n> without any parameter, which would allow it default to origin or\n> whatever, which may or may not be desirable depending on where\n> the 'origin' points at.  If you make that particular git-fetch\n> explicitly say where the fetch should be done from, wouldn't it\n> fix the issue for that codepath?  Why does it still require\n> origin?\n1) If top-level is on a detached head, then the remotes machinery will \nfind current remote is \"origin\". This is what would be passed down the \nchain.\n\n2) Absent the other changes in the thread, git-submodule-init still \ninvokes   git clone *without* -o in the submodules, and thus still \ndefines and points to remote \"origin\".\n\nMark\n"},{"id":"65441","messageId":"alpine.LSU.1.00.0801160016320.17650@racer.site","threadId":"11573","inReplyTo":"478D3CD8.3040805@gmail.com","subject":"Re: [PATCH] Teach remote machinery about remotes.default config variable","fromName":"Johannes Schindelin","fromEmail":"johannes.schindelin@gmx.de","sentAt":"2008-01-16T00:17:06Z","receivedAt":"2008-01-16T00:17:06Z","isPatch":true,"sender":{"key":"johannes.schindelin@gmx.de","avatar":"https://avatars.githubusercontent.com/u/127790?v=4"},"body":"Hi,\n\nOn Tue, 15 Jan 2008, Mark Levedahl wrote:\n\n> Junio C Hamano wrote:\n> > > Nope, git submodule *still* requires origin (e.g., execute git\n> > > submodule init or update on a detached head).\n> > >     \n> > \n> > Now I am even more confused.\n> > \n> > The approach I suggested in a few paragraphs above, to which you\n> > just said \"I like this change\", is about making \"git submodule\n> > update\" to use the url configured in the upper level repository\n> > when it runs \"git fetch\".  I am looking at around l.238 of\n> > git-submodule.sh.  In the current code, it runs \"git-fetch\"\n> > without any parameter, which would allow it default to origin or\n> > whatever, which may or may not be desirable depending on where\n> > the 'origin' points at.  If you make that particular git-fetch\n> > explicitly say where the fetch should be done from, wouldn't it\n> > fix the issue for that codepath?  Why does it still require\n> > origin?\n> 1) If top-level is on a detached head, then the remotes machinery will \n> find current remote is \"origin\". This is what would be passed down the \n> chain.\n> \n> 2) Absent the other changes in the thread, git-submodule-init still \n> invokes git clone *without* -o in the submodules, and thus still defines \n> and points to remote \"origin\".\n\nThere's got to be a way to fix this _without_ affecting other users.\n\nCiao,\nDscho\n"},{"id":"65453","messageId":"478D5D07.3030202@gmail.com","threadId":"11573","inReplyTo":"alpine.LSU.1.00.0801160016320.17650@racer.site","subject":"Re: [PATCH] Teach remote machinery about remotes.default config variable","fromName":"Mark Levedahl","fromEmail":"mlevedahl@gmail.com","sentAt":"2008-01-16T01:25:27Z","receivedAt":"2008-01-16T01:25:27Z","isPatch":true,"sender":{"key":"mdl123@verizon.net","avatar":"https://avatars.githubusercontent.com/u/5302462?v=4"},"body":"Johannes Schindelin wrote:\n>\n> There's got to be a way to fix this _without_ affecting other users.\n>\n> Ciao,\n> Dscho\n>\n>\n>   \nI believe the only normally visible change from my proposal is that   \ngit-submodule update will follow top-level's branch from \nbranch.<name>.remote, which is a good thing. The other changes are only \nvisible if using clone -o or otherwise explicitly asking that \"origin\" \nnot be used or defined, which again is actually following the user's \nrequest.\n\nIf you know of other effects, please explain them.\n\nMark\n"},{"id":"65456","messageId":"alpine.LSU.1.00.0801160139390.17650@racer.site","threadId":"11573","inReplyTo":"478D5D07.3030202@gmail.com","subject":"Re: [PATCH] Teach remote machinery about remotes.default config variable","fromName":"Johannes Schindelin","fromEmail":"johannes.schindelin@gmx.de","sentAt":"2008-01-16T01:40:36Z","receivedAt":"2008-01-16T01:40:36Z","isPatch":true,"sender":{"key":"johannes.schindelin@gmx.de","avatar":"https://avatars.githubusercontent.com/u/127790?v=4"},"body":"Hi,\n\nOn Tue, 15 Jan 2008, Mark Levedahl wrote:\n\n> Johannes Schindelin wrote:\n> \n> > There's got to be a way to fix this _without_ affecting other users.\n>   I believe the only normally visible change from my proposal is that \n> git-submodule update will follow top-level's branch from \n> branch.<name>.remote, which is a good thing. The other changes are only \n> visible if using clone -o or otherwise explicitly asking that \"origin\" \n> not be used or defined, which again is actually following the user's \n> request.\n> \n> If you know of other effects, please explain them.\n\nDo I really have to explain this late in the game for 1.5.4 how such \nintrusive changes can affect stability of code paths which would be \notherwise unaffected by submodules?  I think not.\n\nCiao,\nDscho\n"},{"id":"65841","messageId":"7v63xrh3mw.fsf_-_@gitster.siamese.dyndns.org","threadId":"11573","inReplyTo":"7vir1xmazm.fsf@gitster.siamese.dyndns.org","subject":"What's not in 'master' but should be","fromName":"Junio C Hamano","fromEmail":"gitster@pobox.com","sentAt":"2008-01-18T09:41:43Z","receivedAt":"2008-01-18T09:41:43Z","isPatch":false,"sender":{"key":"gitster@pobox.com","avatar":"https://avatars.githubusercontent.com/u/54884?v=4"},"body":"Junio C Hamano <gitster@pobox.com> writes:\n\n> Currently the ones I looked at and consider possible 1.5.4\n> material are http-push fixes from Grégoire Barbier and\n> parse_commit_buffer() tightening from Martin Koegler.\n\nIt seems that for the past few days, people were having too much\nfun bashing how broken MacOS X is, and the real work has stalled\nin the meantime.  Well, not really stalled but they certainly\nmade the patches and discussions harder to find in the list\narchive.\n\nBut that's Ok.  You cannot win every battle.\n\nNow the lack of unsetenv can be autodetected, and coloring\nbreakage of --color-words has been fixed.  We have also managed\nto catch a real breakage in fast-import, but somebody seems to\nhave managed to bash OS X even in that thread ;-)\n\nBut there are still unapplied patches that deserve attention.\nThe one that I am most worried about is Grégoire Barbier's\nhttp-push changes:\n\n  $gmane/70406 <1200250979-19604-1-git-send-email-gb@gbarbier.org>\n  $gmane/70407 <1200250979-19604-2-git-send-email-gb@gbarbier.org>\n  $gmane/70405 <1200250979-19604-3-git-send-email-gb@gbarbier.org>\n\nThey look sensible on paper. I do not, however, use http-push\nmyself, and I'd really like an independent success (or failure)\nreports on them.  I can also threaten to apply them and see if\nit breaks for anybody, which I may end up doing.\n\nMartin Koegler's parse_commit_buffer() tightening is much easier:\n\n  $gname/70478 <12003456313661-git-send-email-mkoegler@auto.tuwien.ac.at>\n\nIt needs a proper commit message; the patch itself is good.  I\ncould write one myself but I'd rather want description from the\nreal contributor.\n\n  gmane = http://news.gmane.org/gmane.comp.version-control.git\n"},{"id":"65847","messageId":"8c5c35580801180215s2c980b4kbc66fbb05778ff67@mail.gmail.com","threadId":"11573","inReplyTo":"7v63xrh3mw.fsf_-_@gitster.siamese.dyndns.org","subject":"Re: What's not in 'master' but should be","fromName":"Lars Hjemli","fromEmail":"hjemli@gmail.com","sentAt":"2008-01-18T10:15:00Z","receivedAt":"2008-01-18T10:15:00Z","isPatch":false,"sender":{"key":"hjemli@gmail.com","avatar":null},"body":"On Jan 18, 2008 10:41 AM, Junio C Hamano <gitster@pobox.com> wrote:\n> It seems that for the past few days, people were having too much\n> fun bashing how broken MacOS X is, and the real work has stalled\n> in the meantime.  Well, not really stalled but they certainly\n> made the patches and discussions harder to find in the list\n> archive.\n\nHere's a patch which might have been lost in the noise:\n\nhttp://thread.gmane.org/gmane.comp.version-control.git/70463\n\n--\nlarsh\n"},{"id":"65849","messageId":"7vwsq7fn2e.fsf@gitster.siamese.dyndns.org","threadId":"11573","inReplyTo":"8c5c35580801180215s2c980b4kbc66fbb05778ff67@mail.gmail.com","subject":"Re: What's not in 'master' but should be","fromName":"Junio C Hamano","fromEmail":"gitster@pobox.com","sentAt":"2008-01-18T10:24:57Z","receivedAt":"2008-01-18T10:24:57Z","isPatch":false,"sender":{"key":"gitster@pobox.com","avatar":"https://avatars.githubusercontent.com/u/54884?v=4"},"body":"\"Lars Hjemli\" <hjemli@gmail.com> writes:\n\n> On Jan 18, 2008 10:41 AM, Junio C Hamano <gitster@pobox.com> wrote:\n>> It seems that for the past few days, people were having too much\n>> fun bashing how broken MacOS X is, and the real work has stalled\n>> in the meantime.  Well, not really stalled but they certainly\n>> made the patches and discussions harder to find in the list\n>> archive.\n>\n> Here's a patch which might have been lost in the noise:\n>\n> http://thread.gmane.org/gmane.comp.version-control.git/70463\n\nNot really.  It came late into rc cycle without fixing any\nbreakage.  Not 1.5.4 material.\n"},{"id":"65851","messageId":"7vfxwvfmd8.fsf_-_@gitster.siamese.dyndns.org","threadId":"11573","inReplyTo":"7v63xrh3mw.fsf_-_@gitster.siamese.dyndns.org","subject":"What's not in 'master', and likely not to be until 1.5.4","fromName":"Junio C Hamano","fromEmail":"gitster@pobox.com","sentAt":"2008-01-18T10:40:03Z","receivedAt":"2008-01-18T10:40:03Z","isPatch":false,"sender":{"key":"gitster@pobox.com","avatar":"https://avatars.githubusercontent.com/u/54884?v=4"},"body":"Here is an update to the list I sent earlier.  Topics that I\nthought may deserve attention, discussion and eventual inclusion\nbut are not 1.5.4 material.\n\nI think some of them actually have a slight chance of being\n1.5.4 material, if interested parties present good enough\narguments that they are actually good and safe bugfixes.\n\n * compress/decompress abstraction (Marco)\n\n * crlf (Steffen Prohaska and Dmitry Potapov)\n\n * whitespace error: \"cr at eol is ok\" (me)\n\n * moving archive related helpers to libgit.a (Lars Hjemli)\n\n * marking output from \"diff --{no,src,dst}-prefix\" as a non-git\n   diff (me)\n\n * submodule subcommand parser fix for \"git submodule add init\n   update\" (Imran M Yousuf and me)\n\n * submodule recursive wrapper (Imran M Yousuf)\n\n * 'origin' is not so special after \"clone -o frotz\" (Mark Levedahl)\n\n * \"submodule summary\" (Ping Yin)\n\n * unconfigured ident safety (Stephen Sinclair)\n\n * gitweb feed from commit to commitdiff (Florian La Rouche --\n   Jakub seems to be on top of this so I am not worried about it\n   too much).\n\n * color.ui (Matthias Kestenholz)\n\n * test scripts to use valgrind (Jeff King)\n\n * various lstat(2) reduction changes (me).\n\n * \"rebase -i\" UI -- should it be simplified to do commit --amend\n   itself? (Dscho)\n\n * \"cherry-pick/revert\" error message fix (Björn Steinbrink and me)\n\n * pathname safety on filesystems whose readdir(3) thinks it\n   knows better than users (Linus, Robin Rosenberg, me and\n   others).\n\nAgain, I am hoping that authors will resend the ones they really\ncare about after 1.5.4, as I do not want to take patches early.\n"},{"id":"65854","messageId":"8c5c35580801180253x9022e62qf1ec515e101fb294@mail.gmail.com","threadId":"11573","inReplyTo":"7vwsq7fn2e.fsf@gitster.siamese.dyndns.org","subject":"Re: What's not in 'master' but should be","fromName":"Lars Hjemli","fromEmail":"hjemli@gmail.com","sentAt":"2008-01-18T10:53:06Z","receivedAt":"2008-01-18T10:53:06Z","isPatch":false,"sender":{"key":"hjemli@gmail.com","avatar":null},"body":"On Jan 18, 2008 11:24 AM, Junio C Hamano <gitster@pobox.com> wrote:\n>\n> \"Lars Hjemli\" <hjemli@gmail.com> writes:\n>\n> > Here's a patch which might have been lost in the noise:\n> >\n> > http://thread.gmane.org/gmane.comp.version-control.git/70463\n>\n> Not really.  It came late into rc cycle without fixing any\n> breakage.  Not 1.5.4 material.\n\nHmm, isn't a nonfunctional libgit considered breakage? Without\nsomething like this patch it is no longer possible to use\nwrite_tar_archive()/write_zip_archive() in libgit.a.\n\n--\nlarsh\n"},{"id":"65857","messageId":"7vzlv3e6fy.fsf@gitster.siamese.dyndns.org","threadId":"11573","inReplyTo":"8c5c35580801180253x9022e62qf1ec515e101fb294@mail.gmail.com","subject":"Re: What's not in 'master' but should be","fromName":"Junio C Hamano","fromEmail":"gitster@pobox.com","sentAt":"2008-01-18T11:09:21Z","receivedAt":"2008-01-18T11:09:21Z","isPatch":false,"sender":{"key":"gitster@pobox.com","avatar":"https://avatars.githubusercontent.com/u/54884?v=4"},"body":"\"Lars Hjemli\" <hjemli@gmail.com> writes:\n\n> Hmm, isn't a nonfunctional libgit considered breakage? Without\n> something like this patch it is no longer possible to use\n> write_tar_archive()/write_zip_archive() in libgit.a.\n\nSorry, but libgit.a is not part of what we deliver.  We do not\nsupport linking random stuff against libgit.a.  We never did.\nIt is not a \"library\".\n\nIt has always been just an implementation detail for us to be\nlax about our Makefile, so that we do not have to write down\nexactly which *.o files git-foo command depended upon (and it is\nceasing to be useful for that as very many things have moved to\n\"the single git binary\" these days).  Instead we let the linker\npick out the necessary pieces out of the archive.\n\nSo, no, there is no breakage.\n\nThe code movement you did _should_ not hurt so it may be a fine\nmaterial for post 1.5.4, but I haven't carefully compared what\nother change might have accidentally snuck in that patch, and I\nwould rather not have to during the rc cycle.\n"},{"id":"65859","messageId":"47908CAF.90101@viscovery.net","threadId":"11573","inReplyTo":"7vfxwvfmd8.fsf_-_@gitster.siamese.dyndns.org","subject":"Re: What's not in 'master', and likely not to be until 1.5.4","fromName":"Johannes Sixt","fromEmail":"j.sixt@viscovery.net","sentAt":"2008-01-18T11:25:35Z","receivedAt":"2008-01-18T11:25:35Z","isPatch":false,"sender":{"key":"j6t@kdbg.org","avatar":"https://avatars.githubusercontent.com/u/14810926?v=4"},"body":"Junio C Hamano schrieb:\n> Here is an update to the list I sent earlier.  Topics that I\n> thought may deserve attention, discussion and eventual inclusion\n> but are not 1.5.4 material.\n\nBTW, how would you like to have a 40+ patch series presented that\nimplements the port to MinGW? Should I send to the ML despite its volume?\n(Of course not before 1.5.4 is released.)\n\nThe current state of the series is available here:\nhttp://repo.or.cz/w/git/mingw/j6t.git?a=shortlog;h=upstream\n\n-- Hannes\n"},{"id":"65860","messageId":"m3tzlbl6he.fsf@roke.D-201","threadId":"11573","inReplyTo":"7vfxwvfmd8.fsf_-_@gitster.siamese.dyndns.org","subject":"Re: What's not in 'master', and likely not to be until 1.5.4","fromName":"Jakub Narebski","fromEmail":"jnareb@gmail.com","sentAt":"2008-01-18T11:26:50Z","receivedAt":"2008-01-18T11:26:50Z","isPatch":false,"sender":{"key":"jnareb@gmail.com","avatar":"https://avatars.githubusercontent.com/u/2706?v=4"},"body":"Junio C Hamano <gitster@pobox.com> writes:\n\n> Here is an update to the list I sent earlier.  Topics that I\n> thought may deserve attention, discussion and eventual inclusion\n> but are not 1.5.4 material.\n> \n> I think some of them actually have a slight chance of being\n> 1.5.4 material, if interested parties present good enough\n> arguments that they are actually good and safe bugfixes.\n \n>  * submodule subcommand parser fix for \"git submodule add init\n>    update\" (Imran M Yousuf and me)\n\nIsn't it a bugfix, and shouldn't it for this reason be in 1.5.4?\n \n>  * gitweb feed from commit to commitdiff (Florian La Rouche --\n>    Jakub seems to be on top of this so I am not worried about it\n>    too much).\n\nWhat need IMHO to be changed is commit message: state stronger\nthat the only thing that changed is that feed entry refers now\nto 'commitdiff' view rather than 'commit' view. I can agree that\nit might be better... but I do not use gitweb feeds myself.\n\nReasonably post 1.5.4\n\n> Again, I am hoping that authors will resend the ones they really\n> care about after 1.5.4, as I do not want to take patches early.\n\n-- \nJakub Narebski\nPoland\nShadeHawk on #git\n"},{"id":"65861","messageId":"7vsl0ve50f.fsf@gitster.siamese.dyndns.org","threadId":"11573","inReplyTo":"47908CAF.90101@viscovery.net","subject":"Re: What's not in 'master', and likely not to be until 1.5.4","fromName":"Junio C Hamano","fromEmail":"gitster@pobox.com","sentAt":"2008-01-18T11:40:16Z","receivedAt":"2008-01-18T11:40:16Z","isPatch":false,"sender":{"key":"gitster@pobox.com","avatar":"https://avatars.githubusercontent.com/u/54884?v=4"},"body":"Johannes Sixt <j.sixt@viscovery.net> writes:\n\n> BTW, how would you like to have a 40+ patch series presented that\n> implements the port to MinGW? Should I send to the ML despite its volume?\n\nMy gut feeling is that you did your usual great job separating\nthem into logical chunks and it will be a pleasure to review on\nthe usual channel, just like the trickle you did earlier.\n\n> The current state of the series is available here:\n> http://repo.or.cz/w/git/mingw/j6t.git?a=shortlog;h=upstream\n\nLet me take a look sometime (but I cannot even say when right\nnow).  I might change my mind about the above.\n"},{"id":"65862","messageId":"8c5c35580801180354w74774fe2u1d96a8d12f513811@mail.gmail.com","threadId":"11573","inReplyTo":"7vzlv3e6fy.fsf@gitster.siamese.dyndns.org","subject":"Re: What's not in 'master' but should be","fromName":"Lars Hjemli","fromEmail":"hjemli@gmail.com","sentAt":"2008-01-18T11:54:59Z","receivedAt":"2008-01-18T11:54:59Z","isPatch":false,"sender":{"key":"hjemli@gmail.com","avatar":null},"body":"On Jan 18, 2008 12:09 PM, Junio C Hamano <gitster@pobox.com> wrote:\n> \"Lars Hjemli\" <hjemli@gmail.com> writes:\n>\n> > Hmm, isn't a nonfunctional libgit considered breakage? Without\n> > something like this patch it is no longer possible to use\n> > write_tar_archive()/write_zip_archive() in libgit.a.\n>\n> Sorry, but libgit.a is not part of what we deliver.  We do not\n> support linking random stuff against libgit.a.  We never did.\n> It is not a \"library\".\n\nI kind of expected this reply, and I know libgit isn't supposed to be\na stable API aginst git internals, but it still feels like a\nregression: cgit has been linking against libgit for over a year now\n(initial snapshot support added feb 8, 2007), and git-1.5.4 looks like\nthe first git release which cgit cannot use.\n\n> The code movement you did _should_ not hurt so it may be a fine\n> material for post 1.5.4, but I haven't carefully compared what\n> other change might have accidentally snuck in that patch, and I\n> would rather not have to during the rc cycle.\n\nOk, I can't argue with that.\n\nBut could the patch then be part of 1.5.4.X or would I have to wait\nfor 1.5.5 since it's not considered to fix any breakage in 1.5.4? The\nreason I'm asking is that cgit relies on offical git releases (or\nrather, the tarballs published on kernel.org when a release is cut),\nand it would be a shame if the 1.5.4-series becomes unusable for me\n(there's always the possibility to link against a forked git, but I'd\nrather not).\n\n-- \nlarsh\n"},{"id":"65864","messageId":"e5bfff550801180417m587c4bfcm7af348ea1a04f648@mail.gmail.com","threadId":"11573","inReplyTo":"7vfxwvfmd8.fsf_-_@gitster.siamese.dyndns.org","subject":"Re: What's not in 'master', and likely not to be until 1.5.4","fromName":"Marco Costalba","fromEmail":"mcostalba@gmail.com","sentAt":"2008-01-18T12:17:02Z","receivedAt":"2008-01-18T12:17:02Z","isPatch":false,"sender":{"key":"mcostalba@gmail.com","avatar":null},"body":"On Jan 18, 2008 11:40 AM, Junio C Hamano <gitster@pobox.com> wrote:\n>\n> I think some of them actually have a slight chance of being\n> 1.5.4 material, if interested parties present good enough\n> arguments that they are actually good and safe bugfixes.\n>\n>  * compress/decompress abstraction (Marco)\n>\n\nI have good enough arguments to NOT include it in 1.5.4: it's a\ncleanup, so it's developer oriented, not user oriented, no\nperformance/feature benefit, no bug fix.\n\nPlease apply only after 1.5.4 is out.\n\nThanks\nMarco\n"},{"id":"65866","messageId":"e5bfff550801180418p73081872hb2c685ae34c9c679@mail.gmail.com","threadId":"11573","inReplyTo":"e5bfff550801180417m587c4bfcm7af348ea1a04f648@mail.gmail.com","subject":"Re: What's not in 'master', and likely not to be until 1.5.4","fromName":"Marco Costalba","fromEmail":"mcostalba@gmail.com","sentAt":"2008-01-18T12:18:33Z","receivedAt":"2008-01-18T12:18:33Z","isPatch":false,"sender":{"key":"mcostalba@gmail.com","avatar":null},"body":"On Jan 18, 2008 1:17 PM, Marco Costalba <mcostalba@gmail.com> wrote:\n>\n> Please apply only after 1.5.4 is out.\n>\n\nBTW I will resend the whole series this time without lines wrapping I\npromise (I have learnt git send-mail in the mean time ;-)\n\nMarco\n"},{"id":"65867","messageId":"alpine.LSU.1.00.0801181226130.5731@racer.site","threadId":"11573","inReplyTo":"8c5c35580801180354w74774fe2u1d96a8d12f513811@mail.gmail.com","subject":"Re: What's not in 'master' but should be","fromName":"Johannes Schindelin","fromEmail":"johannes.schindelin@gmx.de","sentAt":"2008-01-18T12:34:14Z","receivedAt":"2008-01-18T12:34:14Z","isPatch":false,"sender":{"key":"johannes.schindelin@gmx.de","avatar":"https://avatars.githubusercontent.com/u/127790?v=4"},"body":"Hi,\n\nOn Fri, 18 Jan 2008, Lars Hjemli wrote:\n\n> On Jan 18, 2008 12:09 PM, Junio C Hamano <gitster@pobox.com> wrote:\n> > \"Lars Hjemli\" <hjemli@gmail.com> writes:\n> >\n> > > Hmm, isn't a nonfunctional libgit considered breakage? Without \n> > > something like this patch it is no longer possible to use \n> > > write_tar_archive()/write_zip_archive() in libgit.a.\n> >\n> > Sorry, but libgit.a is not part of what we deliver.  We do not support \n> > linking random stuff against libgit.a.  We never did. It is not a \n> > \"library\".\n> \n> I kind of expected this reply, and I know libgit isn't supposed to be a \n> stable API aginst git internals, but it still feels like a regression: \n> cgit has been linking against libgit for over a year now (initial \n> snapshot support added feb 8, 2007), and git-1.5.4 looks like the first \n> git release which cgit cannot use.\n\nSo you did something that is unsupported, and now it breaks for you.\n\nI'd almost say: you should have expected that.  HOWEVER, this makes you \nthe perfect guy to actually do something about libification (which has \nbeen on my mind for some time, with the prospect of GitCheetah), and \ntherefore you deserve a little help, IMHO.\n\n> > The code movement you did _should_ not hurt so it may be a fine \n> > material for post 1.5.4, but I haven't carefully compared what other \n> > change might have accidentally snuck in that patch, and I would rather \n> > not have to during the rc cycle.\n\nI have.  The 80 lines that were removed are _exactly_ the 80 lines that \nwere added (prepended with some #includes).\n\nLike Lars said, the prototype of the only non-static function, \nsha1_file_to_archive(), was in archive.h, which is included from \nbuiltin-archive.c (where the big hunk was moved from), so there is no \npossibility of a breakage there.\n\nIt is no _functional_ change, but if Lars _uses_ the function in cgit, I'd \nsay it would be a \"courtesy fix\" before 1.5.4.\n\nMind you, I would not propose to make libgit.a fully functional as a \nstandalone library before 1.5.4.\n\nBut Lars contributed a lot, and did a very good job of collecting git \npatches back in October.  Therefore I think that he deserves a little \nextra attention, even if it does not fix a bug in git proper.\n\nCiao,\nDscho\n"},{"id":"65869","messageId":"7E3714CE-0073-4E42-A455-36D595946A6C@zib.de","threadId":"11573","inReplyTo":"7vfxwvfmd8.fsf_-_@gitster.siamese.dyndns.org","subject":"Re: What's not in 'master', and likely not to be until 1.5.4","fromName":"Steffen Prohaska","fromEmail":"prohaska@zib.de","sentAt":"2008-01-18T12:53:14Z","receivedAt":"2008-01-18T12:53:14Z","isPatch":false,"sender":{"key":"prohaska@zib.de","avatar":"https://avatars.githubusercontent.com/u/217580?v=4"},"body":"\nOn Jan 18, 2008, at 11:40 AM, Junio C Hamano wrote:\n\n> Here is an update to the list I sent earlier.  Topics that I\n> thought may deserve attention, discussion and eventual inclusion\n> but are not 1.5.4 material.\n>\n> I think some of them actually have a slight chance of being\n> 1.5.4 material, if interested parties present good enough\n> arguments that they are actually good and safe bugfixes.\n>\n[...]\n>\n>  * crlf (Steffen Prohaska and Dmitry Potapov)\n\n\nI am working on an alternative to the patch I sent last week.\nI hope I can present the two approaches soon.\n\nThe first approach is a lazy check in crlf_to_git() that warns\nabout an irreversible conversion; or dies if safecrlf=true.  This\nis relatively simple code but at least for git-add a workaround\nis needed to suppress printing a warning twice.  The runtime\noverhead is negligible.\n\nThe second approach adds a new machinery is_worktree_crlfsafe()\nthat could be run independently of the crlf_to_git() conversion.\nThe code doing the conversion would stay unmodified.  The\nadvantage is that the whole work tree could be verified before\nany conversion actually happens and we could die() after printing\nall the warnings instead of printing only the first one.  The\ndrawback is that this approach most likely needs more code and\nwill introduce runtime overhead.  A straight forward\nimplementation would add another pass over the work tree running\nthe stats in convert.c.  So the stats would be run twice.\nAnd for a simple \"git add <file>\" the situation is even worse:\nthe full work tree would be verified even is only a single file\nis to be added.\n\nI haven't found time during the week, so I'll continue to work\non this over the weekend.  Maybe even more time is needed to\ndiscuss the two alternatives.\n\nI do not expect that this topic will be ready for 1.5.4.\n\n\tSteffen\n"},{"id":"65871","messageId":"72B49AA2-B82F-448D-8401-BE1D03C9DCA9@zib.de","threadId":"11573","inReplyTo":"7vsl0ve50f.fsf@gitster.siamese.dyndns.org","subject":"Re: What's not in 'master', and likely not to be until 1.5.4","fromName":"Steffen Prohaska","fromEmail":"prohaska@zib.de","sentAt":"2008-01-18T13:04:59Z","receivedAt":"2008-01-18T13:04:59Z","isPatch":false,"sender":{"key":"prohaska@zib.de","avatar":"https://avatars.githubusercontent.com/u/217580?v=4"},"body":"\nOn Jan 18, 2008, at 12:40 PM, Junio C Hamano wrote:\n\n> Johannes Sixt <j.sixt@viscovery.net> writes:\n>\n>> BTW, how would you like to have a 40+ patch series presented that\n>> implements the port to MinGW? Should I send to the ML despite its  \n>> volume?\n>\n> My gut feeling is that you did your usual great job separating\n> them into logical chunks and it will be a pleasure to review on\n> the usual channel, just like the trickle you did earlier.\n>\n>> The current state of the series is available here:\n>> http://repo.or.cz/w/git/mingw/j6t.git?a=shortlog;h=upstream\n>\n> Let me take a look sometime (but I cannot even say when right\n> now).  I might change my mind about the above.\n\nI have one or two patches that could be added, most notably\nthe gpg/CRLF patch.  Maybe we should discuss them before the\nwhole series is proposed for git.git?  Maybe not; then I'd\nsend my patches to the list after Junio applied your series.\n\n\tSteffen\n"},{"id":"65873","messageId":"alpine.LSU.1.00.0801181308080.5731@racer.site","threadId":"11573","inReplyTo":"7E3714CE-0073-4E42-A455-36D595946A6C@zib.de","subject":"Re: What's not in 'master', and likely not to be until 1.5.4","fromName":"Johannes Schindelin","fromEmail":"johannes.schindelin@gmx.de","sentAt":"2008-01-18T13:09:32Z","receivedAt":"2008-01-18T13:09:32Z","isPatch":false,"sender":{"key":"johannes.schindelin@gmx.de","avatar":"https://avatars.githubusercontent.com/u/127790?v=4"},"body":"Hi,\n\nOn Fri, 18 Jan 2008, Steffen Prohaska wrote:\n\n> \n> On Jan 18, 2008, at 11:40 AM, Junio C Hamano wrote:\n> \n> >  * crlf (Steffen Prohaska and Dmitry Potapov)\n> \n> I am working on an alternative to the patch I sent last week. I hope I \n> can present the two approaches soon.\n> \n> The first approach is a lazy check in crlf_to_git() that warns about an \n> irreversible conversion; or dies if safecrlf=true.  This is relatively \n> simple code but at least for git-add a workaround is needed to suppress \n> printing a warning twice.  The runtime overhead is negligible.\n> \n> The second approach adds a new machinery is_worktree_crlfsafe()\n> that could be run independently of the crlf_to_git() conversion.\n\n>From the sound of it, I like the first approach much better.\n\n> I do not expect that this topic will be ready for 1.5.4.\n\nWhat with our ongoing discussion when to go out of preview phase for \nmsysGit, I think this makes sense.\n\nCiao,\nDscho\n"},{"id":"65874","messageId":"alpine.LSU.1.00.0801181310060.5731@racer.site","threadId":"11573","inReplyTo":"72B49AA2-B82F-448D-8401-BE1D03C9DCA9@zib.de","subject":"Re: What's not in 'master', and likely not to be until 1.5.4","fromName":"Johannes Schindelin","fromEmail":"johannes.schindelin@gmx.de","sentAt":"2008-01-18T13:11:03Z","receivedAt":"2008-01-18T13:11:03Z","isPatch":false,"sender":{"key":"johannes.schindelin@gmx.de","avatar":"https://avatars.githubusercontent.com/u/127790?v=4"},"body":"Hi,\n\nOn Fri, 18 Jan 2008, Steffen Prohaska wrote:\n\n> On Jan 18, 2008, at 12:40 PM, Junio C Hamano wrote:\n> \n> > Johannes Sixt <j.sixt@viscovery.net> writes:\n> > \n> > > BTW, how would you like to have a 40+ patch series presented that \n> > > implements the port to MinGW? Should I send to the ML despite its \n> > > volume?\n> > \n> > My gut feeling is that you did your usual great job separating them \n> > into logical chunks and it will be a pleasure to review on the usual \n> > channel, just like the trickle you did earlier.\n> > \n> > > The current state of the series is available here: \n> > > http://repo.or.cz/w/git/mingw/j6t.git?a=shortlog;h=upstream\n> > \n> > Let me take a look sometime (but I cannot even say when right now).  \n> > I might change my mind about the above.\n> \n> I have one or two patches that could be added, most notably the gpg/CRLF \n> patch.  Maybe we should discuss them before the whole series is proposed \n> for git.git?  Maybe not; then I'd send my patches to the list after \n> Junio applied your series.\n\nI think it is long enough as it is.  My plan is to look at the 40+ \npatches, and try to find a sensible subgrouping so that they can be sent \nin bite-sized chunks.\n\nCiao,\nDscho\n"},{"id":"65875","messageId":"B2CF21CC-2EB0-403C-B7FF-34A2702C81E4@zib.de","threadId":"11573","inReplyTo":"alpine.LSU.1.00.0801181308080.5731@racer.site","subject":"Re: What's not in 'master', and likely not to be until 1.5.4","fromName":"Steffen Prohaska","fromEmail":"prohaska@zib.de","sentAt":"2008-01-18T13:23:38Z","receivedAt":"2008-01-18T13:23:38Z","isPatch":false,"sender":{"key":"prohaska@zib.de","avatar":"https://avatars.githubusercontent.com/u/217580?v=4"},"body":"\nOn Jan 18, 2008, at 2:09 PM, Johannes Schindelin wrote:\n\n> On Fri, 18 Jan 2008, Steffen Prohaska wrote:\n>\n>>\n>> On Jan 18, 2008, at 11:40 AM, Junio C Hamano wrote:\n>>\n>>>  * crlf (Steffen Prohaska and Dmitry Potapov)\n>>\n>> I am working on an alternative to the patch I sent last week. I  \n>> hope I\n>> can present the two approaches soon.\n>>\n>> The first approach is a lazy check in crlf_to_git() that warns  \n>> about an\n>> irreversible conversion; or dies if safecrlf=true.  This is  \n>> relatively\n>> simple code but at least for git-add a workaround is needed to  \n>> suppress\n>> printing a warning twice.  The runtime overhead is negligible.\n>>\n>> The second approach adds a new machinery is_worktree_crlfsafe()\n>> that could be run independently of the crlf_to_git() conversion.\n>\n> From the sound of it, I like the first approach much better.\n\nOk.  I'll start with cleaning up the first approach tomorrow and\nsend resend the patch.\n\n\n>> I do not expect that this topic will be ready for 1.5.4.\n>\n> What with our ongoing discussion when to go out of preview phase for\n> msysGit, I think this makes sense.\n\nI'll work on creating an improved installer that installs only a\nsubset of the commands.  I'll exclude commands that are not yet\nready for Windows (e.g.  git-svn, ...).\n\nAfter we have the first version of this installer we can further\ndiscuss if we leave the preview phase.\n\n\tSteffen\n"},{"id":"65879","messageId":"8c5c35580801180619ub44a795tf4d8e2e12e02811a@mail.gmail.com","threadId":"11573","inReplyTo":"alpine.LSU.1.00.0801181226130.5731@racer.site","subject":"Re: What's not in 'master' but should be","fromName":"Lars Hjemli","fromEmail":"hjemli@gmail.com","sentAt":"2008-01-18T14:19:47Z","receivedAt":"2008-01-18T14:19:47Z","isPatch":false,"sender":{"key":"hjemli@gmail.com","avatar":null},"body":"On Jan 18, 2008 1:34 PM, Johannes Schindelin <Johannes.Schindelin@gmx.de> wrote:\n> So you did something that is unsupported, and now it breaks for you.\n>\n> I'd almost say: you should have expected that.\n\nYeah, it was bound to happen. The sad thing is that I didn't notice\nearlier; I should probably add a test branch to cgit and run something\nlike this in a cron-job:\n\ngit checkout test && git fetch && git reset --hard origin/master &&\n(cd git && git fetch && git reset --hard origin/master) &&\nmake clean &&\nmake test &&\ngit commit -a -m \"Updated to latest git\" &&\ngit push --force origin test\n\nThis should help catching this kind of \"breakage\" a lot earlier.\n\n> [snip]\n\nThanks for the review and the kind words!\n\n-- \nlarsh\n"},{"id":"65904","messageId":"alpine.LSU.1.00.0801181638500.5731@racer.site","threadId":"11573","inReplyTo":"7v63xrh3mw.fsf_-_@gitster.siamese.dyndns.org","subject":"Re: What's not in 'master' but should be","fromName":"Johannes Schindelin","fromEmail":"johannes.schindelin@gmx.de","sentAt":"2008-01-18T18:28:03Z","receivedAt":"2008-01-18T18:28:03Z","isPatch":false,"sender":{"key":"johannes.schindelin@gmx.de","avatar":"https://avatars.githubusercontent.com/u/127790?v=4"},"body":"Hi,\n\nOn Fri, 18 Jan 2008, Junio C Hamano wrote:\n\n> Junio C Hamano <gitster@pobox.com> writes:\n> \n> > Currently the ones I looked at and consider possible 1.5.4 material \n> > are http-push fixes from Grégoire Barbier and parse_commit_buffer() \n> > tightening from Martin Koegler.\n> \n> It seems that for the past few days, people were having too much fun \n> bashing how broken MacOS X is, and the real work has stalled in the \n> meantime.  Well, not really stalled but they certainly made the patches \n> and discussions harder to find in the list archive.\n> \n> [...]\n>\n> But there are still unapplied patches that deserve attention. The one \n> that I am most worried about is Grégoire Barbier's http-push changes:\n> \n>   $gmane/70406 <1200250979-19604-1-git-send-email-gb@gbarbier.org>\n\nThis patch makes http-push Warn if URL does not end if \"/\", but it would \nbe even better to just handle it... we know exactly that HTTP URLs _must_ \nend in a slash.\n\nIt gives a better warning if the URL cannot be accessed, alright.  But I \nhate the fact that it introduces yet another function which does a bunch \nof curl_easy_setopt()s only to start an active slot and check for errors.\n\nCurrently, I am not familiar enough with http-push.c to suggest a proper \nalternative, but I suspect that the return values of the _existing_ calls \nto curl should know precisely why the requests failed, and _this_ should \nbe reported.\n\n>   $gmane/70407 <1200250979-19604-2-git-send-email-gb@gbarbier.org>\n\nI first could not reproduce the breakage described in the commit message \n(bad or no ref given on command line).\n\nAfter playing around for a while, all of a sudden, I got a segmentation \nfault:\n\nWaiting for \nhttp://dscho@127.0.0.1/test.git/objects/56/5e84516c1c6dca168be1715b45aeae70b24d13_36e8d912-4841-455a-bbd9-69e54d00db99\nSegmentation fault (core dumped)\n\nUnfortunately, this is with _and_ without this patch.\n\nIn gdb, it looks like this:\n\nProgram received signal SIGSEGV, Segmentation fault.\n[Switching to Thread -1213430096 (LWP 31418)]\ncheck_locks () at http-push.c:637\n637                     if (!lock->refreshing && time_remaining < \nLOCK_REFRESH) {\n(gdb) p lock\n$1 = (struct remote_lock *) 0x20\n(gdb) bt\n#0  check_locks () at http-push.c:637\n#1  0x08053f8a in process_response (callback_data=0x80c4550)\n    at http-push.c:683\n#2  0x0804dbf4 in process_curl_messages () at http.c:539\n#3  0x0804dc46 in step_active_slots () at http.c:453\n#4  0x0804dccb in run_active_slot (slot=0x80c2388) at http.c:474\n#5  0x0804deaa in http_cleanup () at http.c:291\n#6  0x0805268f in main (argc=3, argv=Cannot access memory at address 0x4\n) at http-push.c:2428\n\nSo it seems that there is more to fix.\n\n>   $gmane/70405 <1200250979-19604-3-git-send-email-gb@gbarbier.org>\n\nThis makes sense.  I only tried to compile http-push once without \nCURL_MULTI, and gave up (I think I even sent out a patch disabling \nCURL_MULTI for curl versions lacking a certain symbol).\n\nCiao,\nDscho\n"},{"id":"65906","messageId":"alpine.LSU.1.00.0801181832180.5731@racer.site","threadId":"11573","inReplyTo":"alpine.LSU.1.00.0801181638500.5731@racer.site","subject":"Re: What's not in 'master' but should be","fromName":"Johannes Schindelin","fromEmail":"johannes.schindelin@gmx.de","sentAt":"2008-01-18T18:36:47Z","receivedAt":"2008-01-18T18:36:47Z","isPatch":false,"sender":{"key":"johannes.schindelin@gmx.de","avatar":"https://avatars.githubusercontent.com/u/127790?v=4"},"body":"Hi,\n\nOn Fri, 18 Jan 2008, Johannes Schindelin wrote:\n\n> >   $gmane/70407 <1200250979-19604-2-git-send-email-gb@gbarbier.org>\n> \n> I first could not reproduce the breakage described in the commit message \n> (bad or no ref given on command line).\n> \n> After playing around for a while, all of a sudden, I got a segmentation \n> fault:\n> \n> Waiting for \n> http://dscho@127.0.0.1/test.git/objects/56/5e84516c1c6dca168be1715b45aeae70b24d13_36e8d912-4841-455a-bbd9-69e54d00db99\n> Segmentation fault (core dumped)\n> \n> Unfortunately, this is with _and_ without this patch.\n>\n> \n> In gdb, it looks like this:\n> \n> Program received signal SIGSEGV, Segmentation fault.\n> [Switching to Thread -1213430096 (LWP 31418)]\n> check_locks () at http-push.c:637\n> 637                     if (!lock->refreshing && time_remaining < \n> LOCK_REFRESH) {\n> (gdb) p lock\n> $1 = (struct remote_lock *) 0x20\n> (gdb) bt\n> #0  check_locks () at http-push.c:637\n> #1  0x08053f8a in process_response (callback_data=0x80c4550)\n>     at http-push.c:683\n> #2  0x0804dbf4 in process_curl_messages () at http.c:539\n> #3  0x0804dc46 in step_active_slots () at http.c:453\n> #4  0x0804dccb in run_active_slot (slot=0x80c2388) at http.c:474\n> #5  0x0804deaa in http_cleanup () at http.c:291\n> #6  0x0805268f in main (argc=3, argv=Cannot access memory at address 0x4\n> ) at http-push.c:2428\n> \n> So it seems that there is more to fix.\n\nThe segmentation fault occurs due to check_locks() accessing the remote \nthat was just free()d, due to the new change.\n\nBut now I cannot even reproduce the segmentation fault, it seems.  \nStrange.  Very strange.\n\nGrégoire, it would help tremendously if you could come up with a test \ncase.  The description you gave did not lead to something reproducible \nhere.\n\nCiao,\nDscho\n"},{"id":"65917","messageId":"alpine.LSU.1.00.0801181948060.5731@racer.site","threadId":"11573","inReplyTo":"47908CAF.90101@viscovery.net","subject":"Re: What's not in 'master', and likely not to be until 1.5.4","fromName":"Johannes Schindelin","fromEmail":"johannes.schindelin@gmx.de","sentAt":"2008-01-18T20:36:52Z","receivedAt":"2008-01-18T20:36:52Z","isPatch":false,"sender":{"key":"johannes.schindelin@gmx.de","avatar":"https://avatars.githubusercontent.com/u/127790?v=4"},"body":"Hi,\n\nOn Fri, 18 Jan 2008, Johannes Sixt wrote:\n\n> Junio C Hamano schrieb:\n> > Here is an update to the list I sent earlier.  Topics that I\n> > thought may deserve attention, discussion and eventual inclusion\n> > but are not 1.5.4 material.\n> \n> BTW, how would you like to have a 40+ patch series presented that\n> implements the port to MinGW? Should I send to the ML despite its volume?\n> (Of course not before 1.5.4 is released.)\n> \n> The current state of the series is available here:\n> http://repo.or.cz/w/git/mingw/j6t.git?a=shortlog;h=upstream\n\nComments from reading the patches briefly (since there are 42 patches, it \nneeds quite some time to even do it briefly):\n\n- Possibly some of these commits could be folded back into\n  f90524e(Add target architecture MinGW):\n\n  96a27f1(MinGW: Implement gettimeofday()),\n  2e05f891(Implement a rudimentary poll() emulation for Windows),\n  142bda0(Fake implementions of getpwuid(), getuid(), and getpwnam() for \n\t  Windows),\n  e799caf(Implement setitimer() and sigaction()),\n  075fee7(Implement a wrapper of execve that can invoke shell scripts),\n  495f0af(Work around misbehaved rename() on Windows),\n  34cf7fd(Implement a pipe() replacement whose ends are not inherited to \n\t  children),\n  4504323(Implement start_command() for Windows),\n  b8e84a6(Implement a work-around for a misbehaved vsnprintf on Windows),\n  08bbcb4(Windows: always chmod(, 0666) before unlink()),\n  f6bbf12(Windows: Implement a wrapper of the open() function),\n  56cedf3(Windows: Fix PRIuMAX definition),\n  7458a97(Windows: Implement wrappers for gethostbyname(), socket(), and \n\t  connect()),\n  ef25947(Windows: Fix ntohl() related warnings about printf formatting),\n  b9db7ad(Windows: Implement a custom spawnve()), and\n  47dacb3(compat/pread.c: Add foward decl to fix warning)\n\n- 142bda0(Fake implementions of getpwuid(), getuid(), and getpwnam() for \n\t  Windows)\n  does not really implement getuid() and getpwnam(), and does not \"fake\" \n  the implementation of getpwuid() either, but has a minimal \n  implementation of it (affecting the other two functions, of course).\n\n- d6596ed(gitk: Disable msgfmt on MinGW) and\n  004fb4b(Fix renaming .gitk-new to .gitk on Windows if there is already a \n\t  .gitk)\n  are gitk patches.\n\n  Further, I think that d6596ed would be better done as an automatic \n  detection of msgfmt's presence; on my Eee PC, there is no msgfmt \n  either...\n\n- 20fd16e(Windows: Use a customized struct stat that also has the \n\t  st_blocks member) should be folded into\n  6f97065(Add a new lstat and fstat implementation based on Win32 API)\n  (with a comment that you customized the struct stat, too)\n\n  But then, without 20fd16e, git does not compile, so again I would rather\n  fold that back into the MinGW commit.\n\n- I would group the following path related commits:\n\n  f15879a(MSYS: local clone must use the drive letter in absolute paths),\n  788324d(Handle Windows style absolute paths in \n\t  safe_create_leading_directories( )),\n  851d28d(Treat Windows style path names),\n  8b9ce70(On Windows use the Windows style PATH separator in add_path()),\n  8811d9c(On Windows strip \".exe\" from the program name),\n  af7a879(Windows: Disambiguate DOS style paths from SSH URLs),\n\n  71911a8(Windows: TMP and TEMP environment variables specify a temporary \n\t  directory),\n\n  ea035ed(Turn builtin_exec_path into a function.)\n  4e7e438(Compute the ultimate fallback for exec_path from the program \n\t  invocation),\n\n  abd87b3(Windows: Use a relative default template_dir and ETC_GITCONFIG),\n  7162bf5(When installing, be prepared that template_dir may be relative).\n\n  The latter two probably want to be merged, too.\n\n- in git.git, the onelines are not terminated by \".\"\n\n- in f6bbf12(Windows: Implement a wrapper of the open() function) there is \n  a typo: \"on^\".\n\n- 47dacb3(compat/pread.c: Add foward decl to fix warning) has a typo:\n  \"foward\".\n\n- The SOB line does not come last in 075fee7(Implement a wrapper of execve \n  that can invoke shell scripts.)\n\n- I'd prefer f90524e(Add target architecture MinGW) to come last.  \n  Alternatively, you could cut out the Makefile change so that the series \n  is still bisectable: MinGW will just not be supported until the very \n  end.\n\nImplementation-wise I could not go into too much depth, naturally, but one \nthing still struck me as odd:\n\n\t$ git grep __MINGW j6t/upstream\n\ncomes up with 26 hits.\n\nThe first of them: cache.h:381, function is_absolute_path().  That just \ncries out loud to be \"#ifdef DOS_STYLE_PATHS\" instead of \"#ifdef \n__MINGW32__\".\n\nI guess there should also be -DHAS_NO_FORK_BUT_THREADS -DHAS_TMP_AND_TEMP \n-DHAS_WINSOCK2, but most of them look like -DDOS_STYLE_PATHS to me.\n\nUff.  That were quite some things to wade through, and it's only to get \nworse when I start for real ;-)\n\nCiao,\nDscho\n"},{"id":"65921","messageId":"alpine.LSU.1.00.0801182055340.5731@racer.site","threadId":"11573","inReplyTo":"alpine.LSU.1.00.0801181948060.5731@racer.site","subject":"Re: What's not in 'master', and likely not to be until 1.5.4","fromName":"Johannes Schindelin","fromEmail":"johannes.schindelin@gmx.de","sentAt":"2008-01-18T20:58:04Z","receivedAt":"2008-01-18T20:58:04Z","isPatch":false,"sender":{"key":"johannes.schindelin@gmx.de","avatar":"https://avatars.githubusercontent.com/u/127790?v=4"},"body":"Hi,\n\nOn Fri, 18 Jan 2008, Johannes Schindelin wrote:\n\n> - d6596ed(gitk: Disable msgfmt on MinGW) and\n>   004fb4b(Fix renaming .gitk-new to .gitk on Windows if there is already a \n> \t  .gitk)\n>   are gitk patches.\n> \n>   Further, I think that d6596ed would be better done as an automatic \n>   detection of msgfmt's presence; on my Eee PC, there is no msgfmt \n>   either...\n\nIOW I think something like this:\n\n-- snipsnap --\n[PATCH] Fall back to po2msg when msgfmt is unavailable\n\nAt least on my Eee PC I do not have msgfmt.\n\nThis should be split into two patches, one for git-gui and one for gitk.\n---\n git-gui/Makefile  |    6 ++++--\n gitk-git/Makefile |    7 +++++--\n 2 files changed, 9 insertions(+), 4 deletions(-)\n\ndiff --git a/git-gui/Makefile b/git-gui/Makefile\nindex c109eab..c7921e7 100644\n--- a/git-gui/Makefile\n+++ b/git-gui/Makefile\n@@ -193,8 +193,9 @@ $(GITGUI_MAIN): git-gui.sh GIT-VERSION-FILE GIT-GUI-VARS\n \tmv $@+ $@\n \n XGETTEXT   ?= xgettext\n+PO2MSG = $(TCL_PATH) po/po2msg.sh\n ifdef NO_MSGFMT\n-\tMSGFMT ?= $(TCL_PATH) po/po2msg.sh\n+\tMSGFMT ?= $(PO2MSG)\n else\n \tMSGFMT ?= msgfmt\n endif\n@@ -210,7 +211,8 @@ $(PO_TEMPLATE): $(SCRIPT_SH) $(ALL_LIBFILES)\n update-po:: $(PO_TEMPLATE)\n \t$(foreach p, $(ALL_POFILES), echo Updating $p ; msgmerge -U $p $(PO_TEMPLATE) ; )\n $(ALL_MSGFILES): %.msg : %.po\n-\t$(QUIET_MSGFMT0)$(MSGFMT) --statistics --tcl -l $(basename $(notdir $<)) -d $(dir $@) $< $(QUIET_MSGFMT1)\n+\t$(QUIET_MSGFMT0)$(MSGFMT) --statistics --tcl -l $(basename $(notdir $<)) -d $(dir $@) $< $(QUIET_MSGFMT1) || \\\n+\t$(QUIET_MSGFMT0)$(PO2MSG) --statistics --tcl -l $(basename $(notdir $<)) -d $(dir $@) $< $(QUIET_MSGFMT1)\n \n lib/tclIndex: $(ALL_LIBFILES) GIT-GUI-VARS\n \t$(QUIET_INDEX)if echo \\\ndiff --git a/gitk-git/Makefile b/gitk-git/Makefile\nindex ae2b80b..669ab0e 100644\n--- a/gitk-git/Makefile\n+++ b/gitk-git/Makefile\n@@ -8,6 +8,7 @@ gitk_libdir   ?= $(sharedir)/gitk/lib\n msgsdir    ?= $(gitk_libdir)/msgs\n msgsdir_SQ  = $(subst ','\\'',$(msgsdir))\n \n+TCL_PATH ?= tclsh\n TCLTK_PATH ?= wish\n INSTALL ?= install\n RM ?= rm -f\n@@ -18,8 +19,9 @@ TCLTK_PATH_SQ = $(subst ','\\'',$(TCLTK_PATH))\n \n ## po-file creation rules\n XGETTEXT   ?= xgettext\n+PO2MSG = $(TCL_PATH) po/po2msg.sh\n ifdef NO_MSGFMT\n-\tMSGFMT ?= $(TCL_PATH) po/po2msg.sh\n+\tMSGFMT ?= $(PO2MSG)\n else\n \tMSGFMT ?= msgfmt\n endif\n@@ -59,5 +61,6 @@ update-po:: $(PO_TEMPLATE)\n \t$(foreach p, $(ALL_POFILES), echo Updating $p ; msgmerge -U $p $(PO_TEMPLATE) ; )\n $(ALL_MSGFILES): %.msg : %.po\n \t@echo Generating catalog $@\n-\t$(MSGFMT) --statistics --tcl $< -l $(basename $(notdir $<)) -d $(dir $@)\n+\t$(MSGFMT) --statistics --tcl $< -l $(basename $(notdir $<)) -d $(dir $@) || \\\n+\t$(PO2MSG) --statistics --tcl $< -l $(basename $(notdir $<)) -d $(dir $@)\n \n-- \n1.5.4.rc3.30.g1de144\n"},{"id":"65922","messageId":"7vzlv2c0k7.fsf@gitster.siamese.dyndns.org","threadId":"11573","inReplyTo":"8c5c35580801180354w74774fe2u1d96a8d12f513811@mail.gmail.com","subject":"Re: What's not in 'master' but should be","fromName":"Junio C Hamano","fromEmail":"gitster@pobox.com","sentAt":"2008-01-18T20:59:20Z","receivedAt":"2008-01-18T20:59:20Z","isPatch":false,"sender":{"key":"gitster@pobox.com","avatar":"https://avatars.githubusercontent.com/u/54884?v=4"},"body":"\"Lars Hjemli\" <hjemli@gmail.com> writes:\n\n> On Jan 18, 2008 12:09 PM, Junio C Hamano <gitster@pobox.com> wrote:\n>> \"Lars Hjemli\" <hjemli@gmail.com> writes:\n>>\n>> > Hmm, isn't a nonfunctional libgit considered breakage? Without\n>> > something like this patch it is no longer possible to use\n>> > write_tar_archive()/write_zip_archive() in libgit.a.\n>>\n>> Sorry, but libgit.a is not part of what we deliver.  We do not\n>> support linking random stuff against libgit.a.  We never did.\n>> It is not a \"library\".\n>\n> I kind of expected this reply, and I know libgit isn't supposed to be\n> a stable API aginst git internals, but it still feels like a\n> regression: cgit has been linking against libgit for over a year now\n> (initial snapshot support added feb 8, 2007), and git-1.5.4 looks like\n> the first git release which cgit cannot use.\n\nIf you expected it, you should have added the above four and\nhalf lines in the initial message.  cgit is something even I\nhave heard of, and breakage of it because of what we have is\nworth taking into consideration.  It would have been nicer if\nthis came before -rc0.\n\n>> The code movement you did _should_ not hurt so it may be a fine\n>> material for post 1.5.4, but I haven't carefully compared what\n>> other change might have accidentally snuck in that patch, and I\n>> would rather not have to during the rc cycle.\n>\n> Ok, I can't argue with that.\n\nInstead of wasting more time in the exchange in this thread, I\nspent a several uninterrupted minutes' attention to read over\nyour patch to make sure there is no accidental slippage (with\nhelp from Dscho as well).  I'll make an exception and will\napply.\n\nThanks for the patch.\n"},{"id":"65926","messageId":"7vk5m6by9f.fsf@gitster.siamese.dyndns.org","threadId":"11573","inReplyTo":"m3tzlbl6he.fsf@roke.D-201","subject":"Re: What's not in 'master', and likely not to be until 1.5.4","fromName":"Junio C Hamano","fromEmail":"gitster@pobox.com","sentAt":"2008-01-18T21:49:00Z","receivedAt":"2008-01-18T21:49:00Z","isPatch":false,"sender":{"key":"gitster@pobox.com","avatar":"https://avatars.githubusercontent.com/u/54884?v=4"},"body":"Jakub Narebski <jnareb@gmail.com> writes:\n\n> Junio C Hamano <gitster@pobox.com> writes:\n>\n>> Here is an update to the list I sent earlier.  Topics that I\n>> thought may deserve attention, discussion and eventual inclusion\n>> but are not 1.5.4 material.\n>> \n>> I think some of them actually have a slight chance of being\n>> 1.5.4 material, if interested parties present good enough\n>> arguments that they are actually good and safe bugfixes.\n>  \n>>  * submodule subcommand parser fix for \"git submodule add init\n>>    update\" (Imran M Yousuf and me)\n>\n> Isn't it a bugfix, and shouldn't it for this reason be in 1.5.4?\n\nYeah, I tend to agree.  I was waiting for an Ack or failure\nreport from Imran, as I turned the table around.\n"},{"id":"65928","messageId":"20080118220735.B7F4B49B15@dx.sixt.local","threadId":"11573","inReplyTo":"alpine.LSU.1.00.0801181948060.5731@racer.site","subject":"Re: What's not in 'master', and likely not to be until 1.5.4","fromName":"Johannes Sixt","fromEmail":"johannes.sixt@telecom.at","sentAt":"2008-01-18T22:07:35Z","receivedAt":"2008-01-18T22:07:35Z","isPatch":false,"sender":{"key":"j6t@kdbg.org","avatar":"https://avatars.githubusercontent.com/u/14810926?v=4"},"body":"[Don't have Cc: in KNode. oh well...]\n\nJohannes Schindelin wrote:\n> On Fri, 18 Jan 2008, Johannes Sixt wrote:\n>> BTW, how would you like to have a 40+ patch series presented that\n>> implements the port to MinGW? Should I send to the ML despite its volume?\n>> (Of course not before 1.5.4 is released.)\n>> \n>> The current state of the series is available here:\n>> http://repo.or.cz/w/git/mingw/j6t.git?a=shortlog;h=upstream\n> \n> Comments from reading the patches briefly (since there are 42 patches, it\n> needs quite some time to even do it briefly):\n\nThanks a lot!\n\nI agree with everything I didn't quote from your message.\n\n> - Possibly some of these commits could be folded back into\n>   f90524e(Add target architecture MinGW):\n> \n>   96a27f1(MinGW: Implement gettimeofday()),\n>   2e05f891(Implement a rudimentary poll() emulation for Windows),\n>   142bda0(Fake implementions of getpwuid(), getuid(), and getpwnam() for\n> Windows),\n>   e799caf(Implement setitimer() and sigaction()),\n>   075fee7(Implement a wrapper of execve that can invoke shell scripts),\n>   495f0af(Work around misbehaved rename() on Windows),\n>   34cf7fd(Implement a pipe() replacement whose ends are not inherited to\n> children),\n>   4504323(Implement start_command() for Windows),\n>   b8e84a6(Implement a work-around for a misbehaved vsnprintf on Windows),\n>   08bbcb4(Windows: always chmod(, 0666) before unlink()),\n>   f6bbf12(Windows: Implement a wrapper of the open() function),\n>   56cedf3(Windows: Fix PRIuMAX definition),\n>   7458a97(Windows: Implement wrappers for gethostbyname(), socket(), and\n> connect()),\n>   ef25947(Windows: Fix ntohl() related warnings about printf formatting),\n>   b9db7ad(Windows: Implement a custom spawnve()), and\n>   47dacb3(compat/pread.c: Add foward decl to fix warning)\n\nThis would become a gigantic patch, which I really dislike. It's much easier\nto follow (and bisect) if things appear in smaller pieces.\n\n> - d6596ed(gitk: Disable msgfmt on MinGW) and\n>   004fb4b(Fix renaming .gitk-new to .gitk on Windows if there is already a\n> .gitk)\n>   are gitk patches.\n>   Further, I think that d6596ed would be better done as an automatic\n>   detection of msgfmt's presence; on my Eee PC, there is no msgfmt\n>   either...\n\nLet's do that later.\n\n> - 20fd16e(Windows: Use a customized struct stat that also has the\n> st_blocks member) should be folded into\n>   6f97065(Add a new lstat and fstat implementation based on Win32 API)\n>   (with a comment that you customized the struct stat, too)\n> \n>   But then, without 20fd16e, git does not compile, so again I would rather\n>   fold that back into the MinGW commit.\n\nThe custom lstat() implementation cannot come after the custom struct stat\nbecause we can't call Windows's stat() with a custom struct stat. But I\nalso don't want the custom lstat() in the code from the beginning because\nit's merely an optimization.\n\n> - in git.git, the onelines are not terminated by \".\"\n\nYou mean commit messages?\n\n> - I'd prefer f90524e(Add target architecture MinGW) to come last.\n>   Alternatively, you could cut out the Makefile change so that the series\n>   is still bisectable: MinGW will just not be supported until the very\n>   end.\n\nI strongly disagree. The series is completely bisectable on *nix. But if the\nMakefile change comes last, it becomes difficult to bisect on MinGW.\n\n> $ git grep __MINGW j6t/upstream\n> \n> comes up with 26 hits.\n> \n> The first of them: cache.h:381, function is_absolute_path().  That just\n> cries out loud to be \"#ifdef DOS_STYLE_PATHS\" instead of \"#ifdef\n> __MINGW32__\".\n> \n> I guess there should also be -DHAS_NO_FORK_BUT_THREADS -DHAS_TMP_AND_TEMP\n> -DHAS_WINSOCK2, but most of them look like -DDOS_STYLE_PATHS to me.\n\nDoesn't this go too far? How many systems are there where not all of them\nwould be set at the same time?\n\n-- Hannes\n"},{"id":"65929","messageId":"alpine.LSU.1.00.0801182228470.5731@racer.site","threadId":"11573","inReplyTo":"20080118220735.B7F4B49B15@dx.sixt.local","subject":"Re: What's not in 'master', and likely not to be until 1.5.4","fromName":"Johannes Schindelin","fromEmail":"johannes.schindelin@gmx.de","sentAt":"2008-01-18T22:37:29Z","receivedAt":"2008-01-18T22:37:29Z","isPatch":false,"sender":{"key":"johannes.schindelin@gmx.de","avatar":"https://avatars.githubusercontent.com/u/127790?v=4"},"body":"Hi,\n\nOn Fri, 18 Jan 2008, Johannes Sixt wrote:\n\n> Johannes Schindelin wrote:\n> \n> > - Possibly some of these commits could be folded back into\n> >   f90524e(Add target architecture MinGW):\n> > \n> >   96a27f1(MinGW: Implement gettimeofday()),\n> >   2e05f891(Implement a rudimentary poll() emulation for Windows),\n> >   142bda0(Fake implementions of getpwuid(), getuid(), and getpwnam() for\n> > Windows),\n> >   e799caf(Implement setitimer() and sigaction()),\n> >   075fee7(Implement a wrapper of execve that can invoke shell scripts),\n> >   495f0af(Work around misbehaved rename() on Windows),\n> >   34cf7fd(Implement a pipe() replacement whose ends are not inherited to\n> > children),\n> >   4504323(Implement start_command() for Windows),\n> >   b8e84a6(Implement a work-around for a misbehaved vsnprintf on Windows),\n> >   08bbcb4(Windows: always chmod(, 0666) before unlink()),\n> >   f6bbf12(Windows: Implement a wrapper of the open() function),\n> >   56cedf3(Windows: Fix PRIuMAX definition),\n> >   7458a97(Windows: Implement wrappers for gethostbyname(), socket(), and\n> > connect()),\n> >   ef25947(Windows: Fix ntohl() related warnings about printf formatting),\n> >   b9db7ad(Windows: Implement a custom spawnve()), and\n> >   47dacb3(compat/pread.c: Add foward decl to fix warning)\n> \n> This would become a gigantic patch, which I really dislike. It's much \n> easier to follow (and bisect) if things appear in smaller pieces.\n\nYes, probably.  (See below for the bisection.)\n\n> > - d6596ed(gitk: Disable msgfmt on MinGW) and\n> >   004fb4b(Fix renaming .gitk-new to .gitk on Windows if there is already a\n> > .gitk)\n> >   are gitk patches.\n> >   Further, I think that d6596ed would be better done as an automatic\n> >   detection of msgfmt's presence; on my Eee PC, there is no msgfmt\n> >   either...\n> \n> Let's do that later.\n\nI think these are more or less independent of the rest.\n\n> > - 20fd16e(Windows: Use a customized struct stat that also has the\n> > st_blocks member) should be folded into\n> >   6f97065(Add a new lstat and fstat implementation based on Win32 API)\n> >   (with a comment that you customized the struct stat, too)\n> > \n> >   But then, without 20fd16e, git does not compile, so again I would rather\n> >   fold that back into the MinGW commit.\n> \n> The custom lstat() implementation cannot come after the custom struct \n> stat because we can't call Windows's stat() with a custom struct stat. \n> But I also don't want the custom lstat() in the code from the beginning \n> because it's merely an optimization.\n\nOkay.\n\n> > - in git.git, the onelines are not terminated by \".\"\n> \n> You mean commit messages?\n\nI meant the subjects of the commit messages.  I.e. \"Add target \narchitecture MinGW.\".  But that's such a minor issue.\n\n> > - I'd prefer f90524e(Add target architecture MinGW) to come last.\n> >   Alternatively, you could cut out the Makefile change so that the series\n> >   is still bisectable: MinGW will just not be supported until the very\n> >   end.\n> \n> I strongly disagree. The series is completely bisectable on *nix. But if \n> the Makefile change comes last, it becomes difficult to bisect on MinGW.\n\nHmm.  You're right, of course, for *nix.\n\nBut for MinGW I am not really sure, as you do not really get a \nfully functional system prior to all of the 42 patches...\n\nI am really torn on this, because I can understand your point of view.\n\nBut when there would be an issue with MinGW, and I wanted to find out if \nit worked _at all_, it would be nice to have an easily determined commit \nwhere MinGW was supposed to be fully functional first, without a private \ntag or something.\n\nReading again what I wrote it appears that my opinion on that was strong; \nit is not.  I am not quite sure what would be best.  (In the end, I will \nalways have the option to not care and let it be Junio's problem ;-)\n\n> > $ git grep __MINGW j6t/upstream\n> > \n> > comes up with 26 hits.\n> > \n> > The first of them: cache.h:381, function is_absolute_path().  That just\n> > cries out loud to be \"#ifdef DOS_STYLE_PATHS\" instead of \"#ifdef\n> > __MINGW32__\".\n> > \n> > I guess there should also be -DHAS_NO_FORK_BUT_THREADS \n> > -DHAS_TMP_AND_TEMP -DHAS_WINSOCK2, but most of them look like \n> > -DDOS_STYLE_PATHS to me.\n> \n> Doesn't this go too far? How many systems are there where not all of \n> them would be set at the same time?\n\nI am not only thinking about other systems... it is also a pretty nice way \nof documenting _why_ this change was made.  With the possible exception of \nHAS_TMP_AND_TEMP, I really would like to see that.  So much so that I \nhereby offer to do the transform myself.\n\nCiao,\nDscho\n"},{"id":"65939","messageId":"20080119061421.GA5023@glandium.org","threadId":"11573","inReplyTo":"alpine.LSU.1.00.0801181638500.5731@racer.site","subject":"Re: What's not in 'master' but should be","fromName":"Mike Hommey","fromEmail":"mh@glandium.org","sentAt":"2008-01-19T06:14:21Z","receivedAt":"2008-01-19T06:14:21Z","isPatch":false,"sender":{"key":"mh@glandium.org","avatar":"https://avatars.githubusercontent.com/u/1038527?v=4"},"body":"On Fri, Jan 18, 2008 at 06:28:03PM +0000, Johannes Schindelin wrote:\n> Hi,\n> \n> On Fri, 18 Jan 2008, Junio C Hamano wrote:\n> \n> > Junio C Hamano <gitster@pobox.com> writes:\n> > \n> > > Currently the ones I looked at and consider possible 1.5.4 material \n> > > are http-push fixes from Grégoire Barbier and parse_commit_buffer() \n> > > tightening from Martin Koegler.\n> > \n> > It seems that for the past few days, people were having too much fun \n> > bashing how broken MacOS X is, and the real work has stalled in the \n> > meantime.  Well, not really stalled but they certainly made the patches \n> > and discussions harder to find in the list archive.\n> > \n> > [...]\n> >\n> > But there are still unapplied patches that deserve attention. The one \n> > that I am most worried about is Grégoire Barbier's http-push changes:\n> > \n> >   $gmane/70406 <1200250979-19604-1-git-send-email-gb@gbarbier.org>\n> \n> This patch makes http-push Warn if URL does not end if \"/\", but it would \n> be even better to just handle it... we know exactly that HTTP URLs _must_ \n> end in a slash.\n> \n> It gives a better warning if the URL cannot be accessed, alright.  But I \n> hate the fact that it introduces yet another function which does a bunch \n> of curl_easy_setopt()s only to start an active slot and check for errors.\n> \n> Currently, I am not familiar enough with http-push.c to suggest a proper \n> alternative, but I suspect that the return values of the _existing_ calls \n> to curl should know precisely why the requests failed, and _this_ should \n> be reported.\n\nFWIW, I have a work in progress refactoring the http code, avoiding a\ngreat amount of curl_easy_setopt()s and simplifying the whole thing.\nIt's been sitting on my hard drive during my (quite long) vacation. I\nwill probably start working again on this soonish.\n\nMike\n"},{"id":"65969","messageId":"47921595.1080100@gbarbier.org","threadId":"11573","inReplyTo":"alpine.LSU.1.00.0801181638500.5731@racer.site","subject":"Re: [PATCH] http-push: fix webdav lock leak.","fromName":"Grégoire Barbier","fromEmail":"gb@gbarbier.org","sentAt":"2008-01-19T15:21:57Z","receivedAt":"2008-01-19T15:21:57Z","isPatch":true,"sender":{"key":"gb@gbarbier.org","avatar":null},"body":"Johannes Schindelin a écrit :\n> > $gmane/70407 <1200250979-19604-2-git-send-email-gb@gbarbier.org>\n>\n>  I first could not reproduce the breakage described in the commit\n>  message (bad or no ref given on command line).\n\nIt's rather easy anyway:\n\nFirst, you need a test git repository availlable over http+webdav, let's \nsay at http://myhost/myrepo.git/\nThen, you do this:\n$ git clone http://myhost/myrepo.git/\n$ cd myrepo\n$ git push http\nFetching remote heads...\n  refs/\n  refs/heads/\n  refs/tags/\nNo refs in common and none specified; doing nothing.\n$ git push http\nFetching remote heads...\n  refs/\n  refs/heads/\n  refs/tags/\nNo refs in common and none specified; doing nothing.\n$\n\nFinally, you look at the web server logs, and will find one LOCK query \nand no UNLOCK query, of course the second one will be in 423 return code \ninstead of 200:\n1.2.3.4 - gb [19/Jan/2008:14:24:56 +0100] \"LOCK /myrepo.git/info/refs \nHTTP/1.1\" 200 465\n(...)\n1.2.3.4 - gb [19/Jan/2008:14:25:10 +0100] \"LOCK /myrepo.git/info/refs \nHTTP/1.1\" 423 363\n\nWith my patch, there would have be two UNLOCKs in addition of the LOCKs\n\n From the user point of view:\n- If you realize that you should have typed e.g. \"git push http master\" \ninstead of \"git push http\", you will have to wait for 10 minutes for the \nlock to expire by its own.\n- Furthermore, if somebody else is dumb enough to type \"git push http\" \nwhile you need to push \"master\" branch, then you'll need too to wait for \n10 minutes too.\n\n>  After playing around for a while, all of a sudden, I got a\n>  segmentation fault:\n>\n>  Waiting for\n> \nhttp://dscho@127.0.0.1/test.git/objects/56/5e84516c1c6dca168be1715b45aeae70b24d13_36e8d912-4841-455a-bbd9-69e54d00db99\n>  Segmentation fault (core dumped)\n>\n>  Unfortunately, this is with _and_ without this patch.\n>\n>  In gdb, it looks like this:\n(...)\n>  The segmentation fault occurs due to check_locks() accessing the\n>  remote that was just free()d, due to the new change.\n>\n>  But now I cannot even reproduce the segmentation fault, it seems.\n>  Strange.  Very strange.\n>\n>  Grégoire, it would help tremendously if you could come up with a test\n>  case.  The description you gave did not lead to something\n>  reproducible here.\n\nI don't know what's wrong but I can't manage to reproduce the segfault, \nI'm using the master branch on git.git plus my patches, and with CFLAGS \ncontaining -DUSE_CURL_MULTI, nothing more nothing less.\nIs the test case I described above is enough for you to make another test?\nWhat kind of additional information would you need ?\n\nI will resubmit this patch today with a more detailled commit message \nincluding the way to reproduce the issue.\nBTW you'll be interested to look at one of the \"patches\" I will repost \ntoday, since it's related to this one (the patch subject is \"http-push: \nfail when info/refs exists and is already locked\").\n\n-- \nGrégoire Barbier - gb à gbarbier.org - +33 6 21 35 73 49\n"},{"id":"66002","messageId":"alpine.LSU.1.00.0801192336350.5731@racer.site","threadId":"11573","inReplyTo":"47921595.1080100@gbarbier.org","subject":"Re: [PATCH] http-push: fix webdav lock leak.","fromName":"Johannes Schindelin","fromEmail":"johannes.schindelin@gmx.de","sentAt":"2008-01-19T23:38:12Z","receivedAt":"2008-01-19T23:38:12Z","isPatch":true,"sender":{"key":"johannes.schindelin@gmx.de","avatar":"https://avatars.githubusercontent.com/u/127790?v=4"},"body":"Hi,\n\nOn Sat, 19 Jan 2008, Grégoire Barbier wrote:\n\n> Johannes Schindelin a écrit :\n>\n> >  After playing around for a while, all of a sudden, I got a\n> >  segmentation fault:\n> > \n> >  Waiting for\n> > \n> > http://dscho@127.0.0.1/test.git/objects/56/5e84516c1c6dca168be1715b45aeae70b24d13_36e8d912-4841-455a-bbd9-69e54d00db99\n> > Segmentation fault (core dumped)\n> > \n> >  Unfortunately, this is with _and_ without this patch.\n\nLooking at it again in more depth, it seems that this failure is indeed \nindependent of your patch.\n\nBut I would still feel better if the fixes were kept minimal for now \n(codepath-wise, not only code-wise).\n\nCiao,\nDscho"},{"id":"66068","messageId":"7vr6gb3nv1.fsf@gitster.siamese.dyndns.org","threadId":"11573","inReplyTo":"7vfxwvfmd8.fsf_-_@gitster.siamese.dyndns.org","subject":"What's not in 'master', and likely not to be in, until 1.5.4","fromName":"Junio C Hamano","fromEmail":"gitster@pobox.com","sentAt":"2008-01-21T02:37:38Z","receivedAt":"2008-01-21T02:37:38Z","isPatch":false,"sender":{"key":"gitster@pobox.com","avatar":"https://avatars.githubusercontent.com/u/54884?v=4"},"body":"Here is an update to the list I sent earlier.\n\nTopics that I thought may deserve attention, discussion and\neventual inclusion but are not 1.5.4 material.\n\nI think these two could be part of 1.5.4, but I left them out of\n1.5.4-rc4 (IOW, I do not think they should be on this list):\n\n * marking output from \"diff --{no,src,dst}-prefix\" as a non-git\n   diff (me)\n\n   Linus had an objection but I think I made a reasonable\n   argument against that.  Haven't heard back since then, so\n   this is in limbo.\n\n * submodule subcommand parser fix for \"git submodule add init\n   update\" (Imran M Yousuf and me)\n\n   As Jakub noticed, this is meant to be a bugfix but as I do\n   not use submodule heavily myself, backing it with real-world\n   success stories would be needed.\n\nNow these two out of our way, here is the list.\n\n * various lstat(2) reduction changes (me, Linus and Dscho).\n\n   This will be queued in 'pu'; it appears this introduces a\n   timing related breakages in t75?? tests.\n\n * compress/decompress abstraction (Marco)\n\n * crlf (Steffen Prohaska and Dmitry Potapov)\n\n * whitespace error: \"cr at eol is ok\" (me)\n\n * submodule recursive wrapper (Imran M Yousuf)\n\n * 'origin' is not so special after \"clone -o frotz\" (Mark Levedahl)\n\n * \"submodule summary\" (Ping Yin)\n\n * unconfigured ident safety (Stephen Sinclair)\n\n * gitweb feed from commit to commitdiff (Florian La Rouche --\n   Jakub seems to be on top of this so I am not worried about it\n   too much).\n\n * color.ui (Matthias Kestenholz)\n\n * test scripts to use valgrind (Jeff King)\n\n * \"rebase -i\" UI -- should it be simplified to do commit --amend\n   itself? (Dscho)\n\n * \"cherry-pick/revert\" error message fix (Björn Steinbrink and me)\n\n * pathname safety on filesystems whose readdir(3) thinks it\n   knows better than users (Linus, Robin Rosenberg, me and\n   others).\n\n   I tend to prefer a much simpler approach Linus suggested, to\n   wrap readdir(3) on systems that are known to mangle files,\n   but I have a slight suspicion it would not work well enough\n   for cross platform projects.\n\nAgain, I am hoping that authors will resend the ones they really\ncare about after 1.5.4, as I do not want to take patches early.\n\nThe previous version of this list did not include the some that\nwere discussed and landed in 'pu' (or 'offcuts').  The ones that\nwe may want to polish that are in 'pu' are:\n\n * omit cc recipients from send-email (David Brown)\n\n * sha1 lookup optimization (me)\n\n * rewrite cherry-pick/revert in order to improve its D/F\n   conflict resolution (me)\n\n * allow native protocol to tell exactly which branch HEAD\n   points at (me)\n\nThere is also 1.6.0 material queued already, way before the rc\ncycle:\n\n * Moving \"git-foo\" out of users' $PATH (Nguyễn Thái Ngọc Duy)\n\nI suspect it might be a good idea to make an early declaration\nthat 1.5.5 is to resolve the above listed issues plus the ones\nalready in 'pu' (and nothing else), and have a fairly short\ncycle after 1.5.4.\n"},{"id":"66076","messageId":"20080121044632.GH24004@spearce.org","threadId":"11573","inReplyTo":"alpine.LSU.1.00.0801182055340.5731@racer.site","subject":"Re: What's not in 'master', and likely not to be until 1.5.4","fromName":"Shawn O. Pearce","fromEmail":"spearce@spearce.org","sentAt":"2008-01-21T04:46:32Z","receivedAt":"2008-01-21T04:46:32Z","isPatch":false,"sender":{"key":"spearce@spearce.org","avatar":"https://avatars.githubusercontent.com/u/34844?v=4"},"body":"Johannes Schindelin <Johannes.Schindelin@gmx.de> wrote:\n> [PATCH] Fall back to po2msg when msgfmt is unavailable\n> \n> diff --git a/git-gui/Makefile b/git-gui/Makefile\n> index c109eab..c7921e7 100644\n> --- a/git-gui/Makefile\n> +++ b/git-gui/Makefile\n> @@ -210,7 +211,8 @@ $(PO_TEMPLATE): $(SCRIPT_SH) $(ALL_LIBFILES)\n>  update-po:: $(PO_TEMPLATE)\n>  \t$(foreach p, $(ALL_POFILES), echo Updating $p ; msgmerge -U $p $(PO_TEMPLATE) ; )\n>  $(ALL_MSGFILES): %.msg : %.po\n> -\t$(QUIET_MSGFMT0)$(MSGFMT) --statistics --tcl -l $(basename $(notdir $<)) -d $(dir $@) $< $(QUIET_MSGFMT1)\n> +\t$(QUIET_MSGFMT0)$(MSGFMT) --statistics --tcl -l $(basename $(notdir $<)) -d $(dir $@) $< $(QUIET_MSGFMT1) || \\\n> +\t$(QUIET_MSGFMT0)$(PO2MSG) --statistics --tcl -l $(basename $(notdir $<)) -d $(dir $@) $< $(QUIET_MSGFMT1)\n\nThat will cause the QUIET_MSGFMT0 script to echo twice; once\nwhen we try to run msgfmt and again when we fallback to po2msg.\n\nThat messes with the user's display and won't look very nice coming\nout of a supposedly quiet make.\n\nIn other words this is probably better:\n\n+\t$(QUIET_MSGFMT0)($(MSGFMT) --statistics --tcl -l $(basename $(notdir $<)) -d $(dir $@) $< || \\\n+\t$(PO2MSG) --statistics --tcl -l $(basename $(notdir $<)) -d $(dir $@) $< )$(QUIET_MSGFMT1)\n\nBut it is a lot uglier to read, and I tend to not like subshells.\n\n-- \nShawn.\n"},{"id":"66078","messageId":"alpine.LFD.1.00.0801202114580.2957@woody.linux-foundation.org","threadId":"11573","inReplyTo":"7vr6gb3nv1.fsf@gitster.siamese.dyndns.org","subject":"Re: What's not in 'master', and likely not to be in, until 1.5.4","fromName":"Linus Torvalds","fromEmail":"torvalds@linux-foundation.org","sentAt":"2008-01-21T05:21:13Z","receivedAt":"2008-01-21T05:21:13Z","isPatch":false,"sender":{"key":"torvalds@linux-foundation.org","avatar":"https://avatars.githubusercontent.com/u/1024025?v=4"},"body":"\n\nOn Sun, 20 Jan 2008, Junio C Hamano wrote:\n> \n>  * marking output from \"diff --{no,src,dst}-prefix\" as a non-git\n>    diff (me)\n> \n>    Linus had an objection but I think I made a reasonable\n>    argument against that.  Haven't heard back since then, so\n>    this is in limbo.\n\nI just didn'̈́t really care enough. I still don't think the prefix has \nanything to do with git'ness, but at the same time it's just not something \nI'll ever use, so..\n\n>  * various lstat(2) reduction changes (me, Linus and Dscho).\n> \n>    This will be queued in 'pu'; it appears this introduces a\n>    timing related breakages in t75?? tests.\n\nCan you send some more info on this? I obviously like that series, and \nI've been running various versions of it for a while now, and have run \n\"make test\" a lot. Haven't seen any failures (except the ones I've \nintroduced while developing), but would be happy to see reports.\n\n\t\t\tLinus\n"},{"id":"66079","messageId":"alpine.LNX.1.00.0801210009290.13593@iabervon.org","threadId":"11573","inReplyTo":"7vr6gb3nv1.fsf@gitster.siamese.dyndns.org","subject":"Re: What's not in 'master', and likely not to be in, until 1.5.4","fromName":"Daniel Barkalow","fromEmail":"barkalow@iabervon.org","sentAt":"2008-01-21T05:35:34Z","receivedAt":"2008-01-21T05:35:34Z","isPatch":false,"sender":{"key":"barkalow@iabervon.org","avatar":"https://avatars.githubusercontent.com/u/55364219?v=4"},"body":"On Sun, 20 Jan 2008, Junio C Hamano wrote:\n\n> Here is an update to the list I sent earlier.\n> \n> Topics that I thought may deserve attention, discussion and\n> eventual inclusion but are not 1.5.4 material.\n> \n> I think these two could be part of 1.5.4, but I left them out of\n> 1.5.4-rc4 (IOW, I do not think they should be on this list):\n> \n>  * marking output from \"diff --{no,src,dst}-prefix\" as a non-git\n>    diff (me)\n> \n>    Linus had an objection but I think I made a reasonable\n>    argument against that.  Haven't heard back since then, so\n>    this is in limbo.\n\nIf Linus is still not happy with it, we could instead require that the \nprefixes have at least one slash, not at the beginning, and figure that \n'a/foo/' 'b/foo/' intends the effect it will have on git-apply. The effect \nof --no-prefix on git-apply is kind of incoherent, so that's more sensible \nto prohibit.\n\n> I suspect it might be a good idea to make an early declaration\n> that 1.5.5 is to resolve the above listed issues plus the ones\n> already in 'pu' (and nothing else), and have a fairly short\n> cycle after 1.5.4.\n\nI've got 4 topics that I've been holding back until 1.5.4 is out:\n\n * Use fewer connections to perform git-native fetches (this is actually \n   from before transport.c made it to master, and I forgot about it until \n   I was rebasing stuff and it didn't go away).\n\n * Make checkout a builtin (includes a certain amount of infrastructure \n   improvement for programs that might wants to read multiple trees into \n   the same index in memory in sequence)\n\n * Generate a cover letter from format-patch (originally Dscho's patch; I \n   reworked a bunch of it)\n\n * Let the user provide aliases for URL patterns (should be useful for \n   groups whose members don't all have the same best access to a remote\n   repository)\n\nIf you want to have cycles that only handle stuff that's been submitted \nbeforehand, it doesn't make sense to have a feature freeze beforehand, and \ntherefore only take patches in that cycle from people who ignore your \nwishes. I think in order to do that sort of thing, we'd need a tree run \nlike -mm, maintained by somebody whose attention won't be taken away from \nthe mainline release process by managing patches that are cooking.\n\n\t-Daniel\n*This .sig left intentionally blank*\n"},{"id":"66081","messageId":"7bfdc29a0801202155o471db5c7v38e1a587115abf36@mail.gmail.com","threadId":"11573","inReplyTo":"7vk5m6by9f.fsf@gitster.siamese.dyndns.org","subject":"Re: What's not in 'master', and likely not to be until 1.5.4","fromName":"Imran M Yousuf","fromEmail":"imyousuf@gmail.com","sentAt":"2008-01-21T05:55:19Z","receivedAt":"2008-01-21T05:55:19Z","isPatch":false,"sender":{"key":"imyousuf@gmail.com","avatar":"https://gravatar.com/avatar/fda3c870262849d03c7b9c4d288842e128d6d80769fa7bc2d22731b7597928be?d=mp&s=160"},"body":"On Jan 19, 2008 3:49 AM, Junio C Hamano <gitster@pobox.com> wrote:\n> Jakub Narebski <jnareb@gmail.com> writes:\n>\n> > Junio C Hamano <gitster@pobox.com> writes:\n> >\n> >> Here is an update to the list I sent earlier.  Topics that I\n> >> thought may deserve attention, discussion and eventual inclusion\n> >> but are not 1.5.4 material.\n> >>\n> >> I think some of them actually have a slight chance of being\n> >> 1.5.4 material, if interested parties present good enough\n> >> arguments that they are actually good and safe bugfixes.\n> >\n> >>  * submodule subcommand parser fix for \"git submodule add init\n> >>    update\" (Imran M Yousuf and me)\n> >\n> > Isn't it a bugfix, and shouldn't it for this reason be in 1.5.4?\n>\n> Yeah, I tend to agree.  I was waiting for an Ack or failure\n> report from Imran, as I turned the table around.\n\nSorry I forgot to mention it earlier, your patches worked fine :),\nthank you once again for the help.\n\n>\n\n\n\n-- \nImran M Yousuf\n"},{"id":"66082","messageId":"7vd4rv3ds5.fsf@gitster.siamese.dyndns.org","threadId":"11573","inReplyTo":"alpine.LFD.1.00.0801202114580.2957@woody.linux-foundation.org","subject":"Re: What's not in 'master', and likely not to be in, until 1.5.4","fromName":"Junio C Hamano","fromEmail":"gitster@pobox.com","sentAt":"2008-01-21T06:15:22Z","receivedAt":"2008-01-21T06:15:22Z","isPatch":false,"sender":{"key":"gitster@pobox.com","avatar":"https://avatars.githubusercontent.com/u/54884?v=4"},"body":"Linus Torvalds <torvalds@linux-foundation.org> writes:\n\n> On Sun, 20 Jan 2008, Junio C Hamano wrote:\n>> \n>>  * marking output from \"diff --{no,src,dst}-prefix\" as a non-git\n>>    diff (me)\n>> \n>>    Linus had an objection but I think I made a reasonable\n>>    argument against that.  Haven't heard back since then, so\n>>    this is in limbo.\n>\n> I just didn'̈́t really care enough. I still don't think the prefix has \n> anything to do with git'ness, but at the same time it's just not something \n> I'll ever use, so..\n>\n>>  * various lstat(2) reduction changes (me, Linus and Dscho).\n>> \n>>    This will be queued in 'pu'; it appears this introduces a\n>>    timing related breakages in t75?? tests.\n>\n> Can you send some more info on this?\n\nIt's a Heisenbug.  I actually merged it to 'next' but rewound it\nbefore pushing the result out after seeing a breakage.\n\n\"make clean test\" to run everything through sometimes fails and\nimmediately after that when I do \"cd t && sh t75??-???.sh -i -v\"\nit happily runs through the end.\n\nI'll be back with more details when I have some.\n"},{"id":"66086","messageId":"7v3asr3d59.fsf@gitster.siamese.dyndns.org","threadId":"11573","inReplyTo":"7bfdc29a0801202155o471db5c7v38e1a587115abf36@mail.gmail.com","subject":"Re: What's not in 'master', and likely not to be until 1.5.4","fromName":"Junio C Hamano","fromEmail":"gitster@pobox.com","sentAt":"2008-01-21T06:29:06Z","receivedAt":"2008-01-21T06:29:06Z","isPatch":false,"sender":{"key":"gitster@pobox.com","avatar":"https://avatars.githubusercontent.com/u/54884?v=4"},"body":"Thanks.\n"},{"id":"66088","messageId":"12008976873999-git-send-email-prohaska@zib.de","threadId":"11573","inReplyTo":"209F2074-DD8D-429A-95AA-6FB484852E4E@zib.de","subject":"[PATCH] submodule: Document the details of the command line syntax","fromName":"Steffen Prohaska","fromEmail":"prohaska@zib.de","sentAt":"2008-01-21T06:41:27Z","receivedAt":"2008-01-21T06:41:27Z","isPatch":true,"sender":{"key":"prohaska@zib.de","avatar":"https://avatars.githubusercontent.com/u/217580?v=4"},"body":"Only \"status\" accepts \"--cached\" and the preferred way of\npassing sub-command specific options is after the sub-command.\n\nThe documentation is adapted to reflect this.\n\nSigned-off-by: Steffen Prohaska <prohaska@zib.de>\n---\n Documentation/git-submodule.txt |    5 +++--\n 1 files changed, 3 insertions(+), 2 deletions(-)\n\ndiff --git a/Documentation/git-submodule.txt b/Documentation/git-submodule.txt\nindex cffc6d4..e818e6e 100644\n--- a/Documentation/git-submodule.txt\n+++ b/Documentation/git-submodule.txt\n@@ -9,8 +9,9 @@ git-submodule - Initialize, update or inspect submodules\n SYNOPSIS\n --------\n [verse]\n-'git-submodule' [--quiet] [-b branch] add <repository> [<path>]\n-'git-submodule' [--quiet] [--cached] [status|init|update] [--] [<path>...]\n+'git-submodule' [--quiet] add [-b branch] [--] <repository> [<path>]\n+'git-submodule' [--quiet] status [--cached] [--] [<path>...]\n+'git-submodule' [--quiet] [init|update] [--] [<path>...]\n \n \n COMMANDS\n-- \n1.5.4.rc4.3.g7c32b\n"},{"id":"66087","messageId":"209F2074-DD8D-429A-95AA-6FB484852E4E@zib.de","threadId":"11573","inReplyTo":"7bfdc29a0801202155o471db5c7v38e1a587115abf36@mail.gmail.com","subject":"Re: What's not in 'master', and likely not to be until 1.5.4","fromName":"Steffen Prohaska","fromEmail":"prohaska@zib.de","sentAt":"2008-01-21T06:42:01Z","receivedAt":"2008-01-21T06:42:01Z","isPatch":false,"sender":{"key":"prohaska@zib.de","avatar":"https://avatars.githubusercontent.com/u/217580?v=4"},"body":"\nOn Jan 21, 2008, at 6:55 AM, Imran M Yousuf wrote:\n\n> On Jan 19, 2008 3:49 AM, Junio C Hamano <gitster@pobox.com> wrote:\n>> Jakub Narebski <jnareb@gmail.com> writes:\n>>\n>>> Junio C Hamano <gitster@pobox.com> writes:\n>>>\n>>>> Here is an update to the list I sent earlier.  Topics that I\n>>>> thought may deserve attention, discussion and eventual inclusion\n>>>> but are not 1.5.4 material.\n>>>>\n>>>> I think some of them actually have a slight chance of being\n>>>> 1.5.4 material, if interested parties present good enough\n>>>> arguments that they are actually good and safe bugfixes.\n>>>\n>>>>  * submodule subcommand parser fix for \"git submodule add init\n>>>>    update\" (Imran M Yousuf and me)\n>>>\n>>> Isn't it a bugfix, and shouldn't it for this reason be in 1.5.4?\n>>\n>> Yeah, I tend to agree.  I was waiting for an Ack or failure\n>> report from Imran, as I turned the table around.\n>\n> Sorry I forgot to mention it earlier, your patches worked fine :),\n> thank you once again for the help.\n\nI read through the patch and it looks good.\n\nI think the documentation should be slightly adjusted.  Patch follows\nas a reply to this mail.\n\n\tSteffen\n"},{"id":"66089","messageId":"7vy7aj1xpo.fsf@gitster.siamese.dyndns.org","threadId":"11573","inReplyTo":"12008976873999-git-send-email-prohaska@zib.de","subject":"Re: [PATCH] submodule: Document the details of the command line syntax","fromName":"Junio C Hamano","fromEmail":"gitster@pobox.com","sentAt":"2008-01-21T06:47:47Z","receivedAt":"2008-01-21T06:47:47Z","isPatch":true,"sender":{"key":"gitster@pobox.com","avatar":"https://avatars.githubusercontent.com/u/54884?v=4"},"body":"Thanks.  That change makes sense to me.\n"},{"id":"66091","messageId":"7vtzl71x1c.fsf@gitster.siamese.dyndns.org","threadId":"11573","inReplyTo":"7vd4rv3ds5.fsf@gitster.siamese.dyndns.org","subject":"Re: What's not in 'master', and likely not to be in, until 1.5.4","fromName":"Junio C Hamano","fromEmail":"gitster@pobox.com","sentAt":"2008-01-21T07:02:23Z","receivedAt":"2008-01-21T07:02:23Z","isPatch":false,"sender":{"key":"gitster@pobox.com","avatar":"https://avatars.githubusercontent.com/u/54884?v=4"},"body":"Junio C Hamano <gitster@pobox.com> writes:\n\n> It's a Heisenbug.  I actually merged it to 'next' but rewound it\n> before pushing the result out after seeing a breakage.\n>\n> \"make clean test\" to run everything through sometimes fails and\n> immediately after that when I do \"cd t && sh t75??-???.sh -i -v\"\n> it happily runs through the end.\n>\n> I'll be back with more details when I have some.\n\nIn t7501-commit.sh, \"partial commit that involves removal (1)\"\ntest, it _sometimes_ fails.\n\n    test_expect_success 'partial commit that involves removal (1)' '\n\n        git rm --cached file &&\n        mv file elif &&\n        git add elif &&\n        git diff-index --name-status HEAD >changes &&\n        git commit -m \"Partial: add elif\" elif &&\n        git diff-tree --name-status HEAD^ HEAD >current &&\n        echo \"A     elif\" >expected &&\n        diff expected current\n\n    '\n\nIt removes \"file\" from the index, adds \"elif\" to the index, and\ntries to commit _only_ the addition of \"elif\" without recording\nthe removal of \"file\" (I added \"diff-index\" above to see where\nit fails, its presense or absense does not change the bug, and\nit shows that both addition of elif and removal of file are in\nthe index).\n\nWhen the test fails, the resulting commit however does not\nrecord the addition of elif.  The commit records the same tree\nas its parent instead.  The index that is left has \"elif\" but\nnot \"file\" (iow, it records the expected state after such a\npartial commit).\n"},{"id":"66092","messageId":"7vprvv1wnu.fsf@gitster.siamese.dyndns.org","threadId":"11573","inReplyTo":"7vtzl71x1c.fsf@gitster.siamese.dyndns.org","subject":"Re: What's not in 'master', and likely not to be in, until 1.5.4","fromName":"Junio C Hamano","fromEmail":"gitster@pobox.com","sentAt":"2008-01-21T07:10:29Z","receivedAt":"2008-01-21T07:10:29Z","isPatch":false,"sender":{"key":"gitster@pobox.com","avatar":"https://avatars.githubusercontent.com/u/54884?v=4"},"body":"Junio C Hamano <gitster@pobox.com> writes:\n\n> Junio C Hamano <gitster@pobox.com> writes:\n>\n>> It's a Heisenbug.  I actually merged it to 'next' but rewound it\n>> before pushing the result out after seeing a breakage.\n>>\n>> \"make clean test\" to run everything through sometimes fails and\n>> immediately after that when I do \"cd t && sh t75??-???.sh -i -v\"\n>> it happily runs through the end.\n>>\n>> I'll be back with more details when I have some.\n>\n> In t7501-commit.sh, \"partial commit that involves removal (1)\"\n> test, it _sometimes_ fails.\n>\n>     test_expect_success 'partial commit that involves removal (1)' '\n>\n>         git rm --cached file &&\n>         mv file elif &&\n>         git add elif &&\n>         git diff-index --name-status HEAD >changes &&\n>         git commit -m \"Partial: add elif\" elif &&\n>         git diff-tree --name-status HEAD^ HEAD >current &&\n>         echo \"A     elif\" >expected &&\n>         diff expected current\n>\n>     '\n>\n> It removes \"file\" from the index, adds \"elif\" to the index, and\n> tries to commit _only_ the addition of \"elif\" without recording\n> the removal of \"file\" (I added \"diff-index\" above to see where\n> it fails, its presense or absense does not change the bug, and\n> it shows that both addition of elif and removal of file are in\n> the index).\n>\n> When the test fails, the resulting commit however does not\n> record the addition of elif.  The commit records the same tree\n> as its parent instead.  The index that is left has \"elif\" but\n> not \"file\" (iow, it records the expected state after such a\n> partial commit).\n\nBad news is that this does not seem to have much to do with the\nincore-index series.  v1.5.4-rc4 shows the same breakage.\n"},{"id":"66093","messageId":"7vlk6j1wjj.fsf@gitster.siamese.dyndns.org","threadId":"11573","inReplyTo":"7vprvv1wnu.fsf@gitster.siamese.dyndns.org","subject":"Re: What's not in 'master', and likely not to be in, until 1.5.4","fromName":"Junio C Hamano","fromEmail":"gitster@pobox.com","sentAt":"2008-01-21T07:13:04Z","receivedAt":"2008-01-21T07:13:04Z","isPatch":false,"sender":{"key":"gitster@pobox.com","avatar":"https://avatars.githubusercontent.com/u/54884?v=4"},"body":"Junio C Hamano <gitster@pobox.com> writes:\n\n> Bad news is that this does not seem to have much to do with the\n> incore-index series.  v1.5.4-rc4 shows the same breakage.\n\nPlease disregard that bad news -- that was my stupidity while\nbisecting.  v1.5.4-rc4 seems to be Ok.\n"},{"id":"66095","messageId":"7vhch71vvb.fsf@gitster.siamese.dyndns.org","threadId":"11573","inReplyTo":"7vlk6j1wjj.fsf@gitster.siamese.dyndns.org","subject":"Re: What's not in 'master', and likely not to be in, until 1.5.4","fromName":"Junio C Hamano","fromEmail":"gitster@pobox.com","sentAt":"2008-01-21T07:27:36Z","receivedAt":"2008-01-21T07:27:36Z","isPatch":false,"sender":{"key":"gitster@pobox.com","avatar":"https://avatars.githubusercontent.com/u/54884?v=4"},"body":"Junio C Hamano <gitster@pobox.com> writes:\n\n> Junio C Hamano <gitster@pobox.com> writes:\n>\n>> Bad news is that this does not seem to have much to do with the\n>> incore-index series.  v1.5.4-rc4 shows the same breakage.\n>\n> Please disregard that bad news -- that was my stupidity while\n> bisecting.  v1.5.4-rc4 seems to be Ok.\n\nAnd the bisection points at the first one in the series \"Updated\nin-memory index cleanup\".  Which is kind of odd and sad, as it\nis not supposed to change the semantics at all, and I did not\nsee anything obviously wrong with it.\n\n$ cd t\n$ while :\n  do\n    sh -x ./t7501-commit.sh -i -v >,,log 2>&1 || break\n  done\n"},{"id":"66097","messageId":"e5bfff550801210011i149c6e70t661024a3ed68b8f9@mail.gmail.com","threadId":"11573","inReplyTo":"7vr6gb3nv1.fsf@gitster.siamese.dyndns.org","subject":"Re: What's not in 'master', and likely not to be in, until 1.5.4","fromName":"Marco Costalba","fromEmail":"mcostalba@gmail.com","sentAt":"2008-01-21T08:11:06Z","receivedAt":"2008-01-21T08:11:06Z","isPatch":false,"sender":{"key":"mcostalba@gmail.com","avatar":null},"body":"On Jan 21, 2008 3:37 AM, Junio C Hamano <gitster@pobox.com> wrote:\n>\n> I suspect it might be a good idea to make an early declaration\n> that 1.5.5 is to resolve the above listed issues plus the ones\n> already in 'pu' (and nothing else), and have a fairly short\n> cycle after 1.5.4.\n>\n\nI have another patch, already sent to the list but lost somewhere\nabout pretty=format optimization that I'm planning to resend after a\ncleanup when 1.5.4 is out.\nPatch improves git log speed when --pretty=format is used.\n\nMarco\n"},{"id":"66098","messageId":"479457D8.3010909@viscovery.net","threadId":"11573","inReplyTo":"7vtzl71x1c.fsf@gitster.siamese.dyndns.org","subject":"Re: What's not in 'master', and likely not to be in, until 1.5.4","fromName":"Johannes Sixt","fromEmail":"j.sixt@viscovery.net","sentAt":"2008-01-21T08:29:12Z","receivedAt":"2008-01-21T08:29:12Z","isPatch":false,"sender":{"key":"j6t@kdbg.org","avatar":"https://avatars.githubusercontent.com/u/14810926?v=4"},"body":"Junio C Hamano schrieb:\n> Junio C Hamano <gitster@pobox.com> writes:\n> \n>> It's a Heisenbug.  I actually merged it to 'next' but rewound it\n>> before pushing the result out after seeing a breakage.\n>>\n>> \"make clean test\" to run everything through sometimes fails and\n>> immediately after that when I do \"cd t && sh t75??-???.sh -i -v\"\n>> it happily runs through the end.\n>>\n>> I'll be back with more details when I have some.\n> \n> In t7501-commit.sh, \"partial commit that involves removal (1)\"\n> test, it _sometimes_ fails.\n> \n>     test_expect_success 'partial commit that involves removal (1)' '\n> \n>         git rm --cached file &&\n>         mv file elif &&\n>         git add elif &&\n>         git diff-index --name-status HEAD >changes &&\n>         git commit -m \"Partial: add elif\" elif &&\n>         git diff-tree --name-status HEAD^ HEAD >current &&\n>         echo \"A     elif\" >expected &&\n>         diff expected current\n> \n>     '\n> \n> It removes \"file\" from the index, adds \"elif\" to the index, and\n> tries to commit _only_ the addition of \"elif\" without recording\n> the removal of \"file\" (I added \"diff-index\" above to see where\n> it fails, its presense or absense does not change the bug, and\n> it shows that both addition of elif and removal of file are in\n> the index).\n> \n> When the test fails, the resulting commit however does not\n> record the addition of elif.  The commit records the same tree\n> as its parent instead.  The index that is left has \"elif\" but\n> not \"file\" (iow, it records the expected state after such a\n> partial commit).\n\nDéjà-vu! We had similar problems on Windows. I was able to solve it this\nway when git-commit was still a shell script:\n\n save_index () {\n-\tcp -p \"$THIS_INDEX\" \"$NEXT_INDEX\"\n+\tln \"$THIS_INDEX\" \"$NEXT_INDEX\"\n }\n\nbecause 'cp -p' does not keep the precise timestamp, but 'ln' does (which\ncreates hardlinks on NTFS). This violated the assumptions on which the\nracy-git check relies.\n\n-- Hannes\n"},{"id":"66099","messageId":"7v8x2j1sul.fsf@gitster.siamese.dyndns.org","threadId":"11573","inReplyTo":"7vhch71vvb.fsf@gitster.siamese.dyndns.org","subject":"Re: What's not in 'master', and likely not to be in, until 1.5.4","fromName":"Junio C Hamano","fromEmail":"gitster@pobox.com","sentAt":"2008-01-21T08:32:50Z","receivedAt":"2008-01-21T08:32:50Z","isPatch":false,"sender":{"key":"gitster@pobox.com","avatar":"https://avatars.githubusercontent.com/u/54884?v=4"},"body":"An update, with three attachments (sorry), but not final\nresolution yet (sorry again) and I am going to bed.\n\nt7501-commit-2.sh is a very reduced test script.  Drop it in t/\nand run it like:\n\n $ while :; do sh ./t7501-commit-2.sh -i -v || break; done\n\nI stops after running for a while with \"Updated in-memory index\ncleanup\" patch (and does not seem to stop without).  Note that\nthis is before any of the lstat(2) reduction changes.\n\nThe attached \"trace.log.old\" is strace output from the round that\nran successfully, and \"trace.log\" is the same from the round\nthat failed.\n\nThe real place the logs start diverging is around line 240, the\ngood one runs two lstat(2) on \"elif\", opens \"elif\" in O_RDONLY\nand closes it immediately (eh, what is it doing?  I do not even\nsee any read or mmap --- it is just open and close) and then\nreads the config and attributes (presumably this is doing the\nconvert-to-git stuff).  The bad one runs three lstat(2) on it\nand writes the next-index out, without even opening \"elif\".\n\n\n\n#!/bin/sh\n\ntest_description='reduced 7501'\n\n. ./test-lib.sh\n\ntest_expect_success setup '\n\n\t>file &&\n\tgit add file &&\n\ttest_tick &&\n\tgit commit -m initial\n\n'\n\nif test -f ../trace.log\nthen\n\tmv ../trace.log ../trace.log.old\nfi\n\ntest_expect_success 'partial commit that involves removal (1)' '\n\n\ttest_tick &&\n\tgit rm --cached file &&\n\tmv file elif &&\n\tgit add elif &&\n\n\tstrace -f -o ../trace.log git commit -m \"Partial: add elif\" elif &&\n\n\tgit diff-tree --name-status HEAD^ HEAD >current &&\n\techo \"A\telif\" >expected &&\n\tdiff expected current\n\n'\n\ntest_done\n\n\n10888 execve(\"/opt/packrat/playpen/public/in-place/git/git.junio/t/../git\", [\"git\", \"commit\", \"-m\", \"Partial: add elif\", \"elif\"], [/* 51 vars */]) = 0\n10888 brk(0)                            = 0x6f7000\n10888 mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x2b064998c000\n10888 uname({sys=\"Linux\", node=\"gitster\", ...}) = 0\n10888 access(\"/etc/ld.so.nohwcap\", F_OK) = -1 ENOENT (No such file or directory)\n10888 mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x2b064998d000\n10888 access(\"/etc/ld.so.preload\", R_OK) = -1 ENOENT (No such file or directory)\n10888 open(\"/etc/ld.so.cache\", O_RDONLY) = 6\n10888 fstat(6, {st_mode=S_IFREG|0644, st_size=70263, ...}) = 0\n10888 mmap(NULL, 70263, PROT_READ, MAP_PRIVATE, 6, 0) = 0x2b064998f000\n10888 close(6)                          = 0\n10888 access(\"/etc/ld.so.nohwcap\", F_OK) = -1 ENOENT (No such file or directory)\n10888 open(\"/usr/lib/libcurl.so.3\", O_RDONLY) = 6\n10888 read(6, \"\\177ELF\\2\\1\\1\\0\\0\\0\\0\\0\\0\\0\\0\\0\\3\\0>\\0\\1\\0\\0\\0`m\\0\\0\\0\"..., 832) = 832\n10888 fstat(6, {st_mode=S_IFREG|0644, st_size=227856, ...}) = 0\n10888 mmap(NULL, 1275080, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 6, 0) = 0x2b06499a1000\n10888 mprotect(0x2b06499d7000, 1048576, PROT_NONE) = 0\n10888 mmap(0x2b0649ad7000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 6, 0x36000) = 0x2b0649ad7000\n10888 close(6)                          = 0\n10888 access(\"/etc/ld.so.nohwcap\", F_OK) = -1 ENOENT (No such file or directory)\n10888 open(\"/usr/lib/libz.so.1\", O_RDONLY) = 6\n10888 read(6, \"\\177ELF\\2\\1\\1\\0\\0\\0\\0\\0\\0\\0\\0\\0\\3\\0>\\0\\1\\0\\0\\0@!\\0\\0\\0\"..., 832) = 832\n10888 fstat(6, {st_mode=S_IFREG|0644, st_size=93504, ...}) = 0\n10888 mmap(NULL, 2188616, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 6, 0) = 0x2b0649b8d000\n10888 mprotect(0x2b0649ba3000, 2097152, PROT_NONE) = 0\n10888 mmap(0x2b0649da3000, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 6, 0x16000) = 0x2b0649da3000\n10888 close(6)                          = 0\n10888 access(\"/etc/ld.so.nohwcap\", F_OK) = -1 ENOENT (No such file or directory)\n10888 open(\"/usr/lib/libcrypto.so.0.9.8\", O_RDONLY) = 6\n10888 read(6, \"\\177ELF\\2\\1\\1\\0\\0\\0\\0\\0\\0\\0\\0\\0\\3\\0>\\0\\1\\0\\0\\0\\360\\364\"..., 832) = 832\n10888 fstat(6, {st_mode=S_IFREG|0644, st_size=1510344, ...}) = 0\n10888 mmap(NULL, 2571832, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 6, 0) = 0x2b0649da4000\n10888 mprotect(0x2b0649ef2000, 1048576, PROT_NONE) = 0\n10888 mmap(0x2b0649ff2000, 143360, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 6, 0x14e000) = 0x2b0649ff2000\n10888 mmap(0x2b064a015000, 11832, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x2b064a015000\n10888 close(6)                          = 0\n10888 access(\"/etc/ld.so.nohwcap\", F_OK) = -1 ENOENT (No such file or directory)\n10888 open(\"/lib/libc.so.6\", O_RDONLY)  = 6\n10888 read(6, \"\\177ELF\\2\\1\\1\\0\\0\\0\\0\\0\\0\\0\\0\\0\\3\\0>\\0\\1\\0\\0\\0`\\334\\1\\0\"..., 832) = 832\n10888 fstat(6, {st_mode=S_IFREG|0755, st_size=1391928, ...}) = 0\n10888 mmap(NULL, 3498360, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 6, 0) = 0x2b064a018000\n10888 mprotect(0x2b064a165000, 2097152, PROT_NONE) = 0\n10888 mmap(0x2b064a365000, 20480, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 6, 0x14d000) = 0x2b064a365000\n10888 mmap(0x2b064a36a000, 16760, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x2b064a36a000\n10888 close(6)                          = 0\n10888 access(\"/etc/ld.so.nohwcap\", F_OK) = -1 ENOENT (No such file or directory)\n10888 open(\"/usr/lib/libgssapi_krb5.so.2\", O_RDONLY) = 6\n10888 read(6, \"\\177ELF\\2\\1\\1\\0\\0\\0\\0\\0\\0\\0\\0\\0\\3\\0>\\0\\1\\0\\0\\0\\20e\\0\\0\"..., 832) = 832\n10888 fstat(6, {st_mode=S_IFREG|0644, st_size=173640, ...}) = 0\n10888 mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x2b064a36f000\n10888 mmap(NULL, 2269136, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 6, 0) = 0x2b064a370000\n10888 mprotect(0x2b064a399000, 2093056, PROT_NONE) = 0\n10888 mmap(0x2b064a598000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 6, 0x28000) = 0x2b064a598000\n10888 close(6)                          = 0\n10888 access(\"/etc/ld.so.nohwcap\", F_OK) = -1 ENOENT (No such file or directory)\n10888 open(\"/usr/lib/libkrb5.so.3\", O_RDONLY) = 6\n10888 read(6, \"\\177ELF\\2\\1\\1\\0\\0\\0\\0\\0\\0\\0\\0\\0\\3\\0>\\0\\1\\0\\0\\0\\300\\221\"..., 832) = 832\n10888 fstat(6, {st_mode=S_IFREG|0644, st_size=635688, ...}) = 0\n10888 mmap(NULL, 2730976, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 6, 0) = 0x2b064a59a000\n10888 mprotect(0x2b064a631000, 2097152, PROT_NONE) = 0\n10888 mmap(0x2b064a831000, 16384, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 6, 0x97000) = 0x2b064a831000\n10888 close(6)                          = 0\n10888 access(\"/etc/ld.so.nohwcap\", F_OK) = -1 ENOENT (No such file or directory)\n10888 open(\"/usr/lib/libk5crypto.so.3\", O_RDONLY) = 6\n10888 read(6, \"\\177ELF\\2\\1\\1\\0\\0\\0\\0\\0\\0\\0\\0\\0\\3\\0>\\0\\1\\0\\0\\0\\320X\\0\\0\"..., 832) = 832\n10888 fstat(6, {st_mode=S_IFREG|0644, st_size=150656, ...}) = 0\n10888 mmap(NULL, 2246952, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 6, 0) = 0x2b064a835000\n10888 mprotect(0x2b064a858000, 2097152, PROT_NONE) = 0\n10888 mmap(0x2b064aa58000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 6, 0x23000) = 0x2b064aa58000\n10888 close(6)                          = 0\n10888 access(\"/etc/ld.so.nohwcap\", F_OK) = -1 ENOENT (No such file or directory)\n10888 open(\"/lib/libcom_err.so.2\", O_RDONLY) = 6\n10888 read(6, \"\\177ELF\\2\\1\\1\\0\\0\\0\\0\\0\\0\\0\\0\\0\\3\\0>\\0\\1\\0\\0\\0\\260\\f\\0\"..., 832) = 832\n10888 fstat(6, {st_mode=S_IFREG|0644, st_size=7984, ...}) = 0\n10888 mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x2b064aa5a000\n10888 mmap(NULL, 1054920, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 6, 0) = 0x2b064aa5b000\n10888 mprotect(0x2b064aa5d000, 1044480, PROT_NONE) = 0\n10888 mmap(0x2b064ab5c000, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 6, 0x1000) = 0x2b064ab5c000\n10888 close(6)                          = 0\n10888 access(\"/etc/ld.so.nohwcap\", F_OK) = -1 ENOENT (No such file or directory)\n10888 open(\"/usr/lib/libkrb5support.so.0\", O_RDONLY) = 6\n10888 read(6, \"\\177ELF\\2\\1\\1\\0\\0\\0\\0\\0\\0\\0\\0\\0\\3\\0>\\0\\1\\0\\0\\0\\200\\35\\0\"..., 832) = 832\n10888 fstat(6, {st_mode=S_IFREG|0644, st_size=30408, ...}) = 0\n10888 mmap(NULL, 2125648, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 6, 0) = 0x2b064ab5d000\n10888 mprotect(0x2b064ab64000, 2093056, PROT_NONE) = 0\n10888 mmap(0x2b064ad63000, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 6, 0x6000) = 0x2b064ad63000\n10888 close(6)                          = 0\n10888 access(\"/etc/ld.so.nohwcap\", F_OK) = -1 ENOENT (No such file or directory)\n10888 open(\"/lib/libresolv.so.2\", O_RDONLY) = 6\n10888 read(6, \"\\177ELF\\2\\1\\1\\0\\0\\0\\0\\0\\0\\0\\0\\0\\3\\0>\\0\\1\\0\\0\\0\\0003\\0\\0\"..., 832) = 832\n10888 fstat(6, {st_mode=S_IFREG|0644, st_size=76664, ...}) = 0\n10888 mmap(NULL, 2181896, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 6, 0) = 0x2b064ad64000\n10888 mprotect(0x2b064ad75000, 2097152, PROT_NONE) = 0\n10888 mmap(0x2b064af75000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 6, 0x11000) = 0x2b064af75000\n10888 mmap(0x2b064af77000, 6920, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x2b064af77000\n10888 close(6)                          = 0\n10888 access(\"/etc/ld.so.nohwcap\", F_OK) = -1 ENOENT (No such file or directory)\n10888 open(\"/usr/lib/libidn.so.11\", O_RDONLY) = 6\n10888 read(6, \"\\177ELF\\2\\1\\1\\0\\0\\0\\0\\0\\0\\0\\0\\0\\3\\0>\\0\\1\\0\\0\\0\\340/\\0\\0\"..., 832) = 832\n10888 fstat(6, {st_mode=S_IFREG|0644, st_size=202368, ...}) = 0\n10888 mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x2b064af79000\n10888 mmap(NULL, 1249152, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 6, 0) = 0x2b064af7a000\n10888 mprotect(0x2b064afab000, 1044480, PROT_NONE) = 0\n10888 mmap(0x2b064b0aa000, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 6, 0x30000) = 0x2b064b0aa000\n10888 close(6)                          = 0\n10888 access(\"/etc/ld.so.nohwcap\", F_OK) = -1 ENOENT (No such file or directory)\n10888 open(\"/lib/libdl.so.2\", O_RDONLY) = 6\n10888 read(6, \"\\177ELF\\2\\1\\1\\0\\0\\0\\0\\0\\0\\0\\0\\0\\3\\0>\\0\\1\\0\\0\\0 \\16\\0\\0\"..., 832) = 832\n10888 fstat(6, {st_mode=S_IFREG|0644, st_size=14624, ...}) = 0\n10888 mmap(NULL, 2109728, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 6, 0) = 0x2b064b0ab000\n10888 mprotect(0x2b064b0ad000, 2097152, PROT_NONE) = 0\n10888 mmap(0x2b064b2ad000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 6, 0x2000) = 0x2b064b2ad000\n10888 close(6)                          = 0\n10888 access(\"/etc/ld.so.nohwcap\", F_OK) = -1 ENOENT (No such file or directory)\n10888 open(\"/usr/lib/libssl.so.0.9.8\", O_RDONLY) = 6\n10888 read(6, \"\\177ELF\\2\\1\\1\\0\\0\\0\\0\\0\\0\\0\\0\\0\\3\\0>\\0\\1\\0\\0\\0\\340\\31\\1\"..., 832) = 832\n10888 fstat(6, {st_mode=S_IFREG|0644, st_size=291816, ...}) = 0\n10888 mmap(NULL, 1338608, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 6, 0) = 0x2b064b2af000\n10888 mprotect(0x2b064b2f0000, 1048576, PROT_NONE) = 0\n10888 mmap(0x2b064b3f0000, 24576, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 6, 0x41000) = 0x2b064b3f0000\n10888 close(6)                          = 0\n10888 access(\"/etc/ld.so.nohwcap\", F_OK) = -1 ENOENT (No such file or directory)\n10888 open(\"/lib/libkeyutils.so.1\", O_RDONLY) = 6\n10888 read(6, \"\\177ELF\\2\\1\\1\\0\\0\\0\\0\\0\\0\\0\\0\\0\\3\\0>\\0\\1\\0\\0\\0\\260\\v\\0\"..., 832) = 832\n10888 fstat(6, {st_mode=S_IFREG|0644, st_size=7304, ...}) = 0\n10888 mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x2b064b3f6000\n10888 mmap(NULL, 1054160, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 6, 0) = 0x2b064b3f7000\n10888 mprotect(0x2b064b3f9000, 1044480, PROT_NONE) = 0\n10888 mmap(0x2b064b4f8000, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 6, 0x1000) = 0x2b064b4f8000\n10888 close(6)                          = 0\n10888 mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x2b064b4f9000\n10888 mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x2b064b4fa000\n10888 arch_prctl(ARCH_SET_FS, 0x2b064b4f9f10) = 0\n10888 mprotect(0x2b064a365000, 12288, PROT_READ) = 0\n10888 munmap(0x2b064998f000, 70263)     = 0\n10888 brk(0)                            = 0x6f7000\n10888 brk(0x718000)                     = 0x718000\n10888 getcwd(\"/opt/packrat/playpen/public/in-place/git/git.junio/t/trash\", 4096) = 59\n10888 access(\".git/objects\", X_OK)      = 0\n10888 access(\".git/refs\", X_OK)         = 0\n10888 lstat(\".git/HEAD\", {st_mode=S_IFREG|0664, st_size=23, ...}) = 0\n10888 open(\".git/HEAD\", O_RDONLY)       = 6\n10888 read(6, \"ref: refs/heads/master\\n\", 255) = 23\n10888 read(6, \"\", 232)                  = 0\n10888 close(6)                          = 0\n10888 open(\".git/config\", O_RDONLY)     = 6\n10888 fstat(6, {st_mode=S_IFREG|0664, st_size=92, ...}) = 0\n10888 mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x2b064998f000\n10888 read(6, \"[core]\\n\\trepositoryformatversion \"..., 4096) = 92\n10888 read(6, \"\", 4096)                 = 0\n10888 close(6)                          = 0\n10888 munmap(0x2b064998f000, 4096)      = 0\n10888 stat(\".git\", {st_mode=S_IFDIR|S_ISGID|0775, st_size=4096, ...}) = 0\n10888 getcwd(\"/opt/packrat/playpen/public/in-place/git/git.junio/t/trash\", 1024) = 59\n10888 chdir(\".git\")                     = 0\n10888 getcwd(\"/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git\", 4096) = 64\n10888 lstat(\"/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git\", {st_mode=S_IFDIR|S_ISGID|0775, st_size=4096, ...}) = 0\n10888 chdir(\"/opt/packrat/playpen/public/in-place/git/git.junio/t/trash\") = 0\n10888 chdir(\"/opt/packrat/playpen/public/in-place/git/git.junio/t/trash\") = 0\n10888 open(\".git/config\", O_RDONLY)     = 6\n10888 fstat(6, {st_mode=S_IFREG|0664, st_size=92, ...}) = 0\n10888 mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x2b064998f000\n10888 read(6, \"[core]\\n\\trepositoryformatversion \"..., 4096) = 92\n10888 read(6, \"\", 4096)                 = 0\n10888 close(6)                          = 0\n10888 munmap(0x2b064998f000, 4096)      = 0\n10888 lstat(\"/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/HEAD\", {st_mode=S_IFREG|0664, st_size=23, ...}) = 0\n10888 open(\"/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/HEAD\", O_RDONLY) = 6\n10888 read(6, \"ref: refs/heads/master\\n\", 255) = 23\n10888 read(6, \"\", 232)                  = 0\n10888 close(6)                          = 0\n10888 lstat(\"/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/refs/heads/master\", {st_mode=S_IFREG|0664, st_size=41, ...}) = 0\n10888 open(\"/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/refs/heads/master\", O_RDONLY) = 6\n10888 read(6, \"1bd44cb9d13204b0fe1958db0082f502\"..., 255) = 41\n10888 read(6, \"\", 214)                  = 0\n10888 close(6)                          = 0\n10888 lstat(\"/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/refs/HEAD\", 0x7fff611379c0) = -1 ENOENT (No such file or directory)\n10888 open(\"/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/packed-refs\", O_RDONLY) = -1 ENOENT (No such file or directory)\n10888 lstat(\"/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/refs/tags/HEAD\", 0x7fff611379c0) = -1 ENOENT (No such file or directory)\n10888 lstat(\"/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/refs/heads/HEAD\", 0x7fff611379c0) = -1 ENOENT (No such file or directory)\n10888 lstat(\"/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/refs/remotes/HEAD\", 0x7fff611379c0) = -1 ENOENT (No such file or directory)\n10888 lstat(\"/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/refs/remotes/HEAD/HEAD\", 0x7fff611379c0) = -1 ENOENT (No such file or directory)\n10888 lstat(\"/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/MERGE_HEAD\", 0x7fff611379c0) = -1 ENOENT (No such file or directory)\n10888 lstat(\"/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/refs/MERGE_HEAD\", 0x7fff611379c0) = -1 ENOENT (No such file or directory)\n10888 lstat(\"/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/refs/tags/MERGE_HEAD\", 0x7fff611379c0) = -1 ENOENT (No such file or directory)\n10888 lstat(\"/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/refs/heads/MERGE_HEAD\", 0x7fff611379c0) = -1 ENOENT (No such file or directory)\n10888 lstat(\"/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/refs/remotes/MERGE_HEAD\", 0x7fff611379c0) = -1 ENOENT (No such file or directory)\n10888 lstat(\"/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/refs/remotes/MERGE_HEAD/HEAD\", 0x7fff611379c0) = -1 ENOENT (No such file or directory)\n10888 open(\"/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/index\", O_RDONLY) = 6\n10888 fstat(6, {st_mode=S_IFREG|0664, st_size=104, ...}) = 0\n10888 mmap(NULL, 104, PROT_READ|PROT_WRITE, MAP_PRIVATE, 6, 0) = 0x2b064998f000\n10888 close(6)                          = 0\n10888 munmap(0x2b064998f000, 104)       = 0\n10888 lstat(\"/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/MERGE_HEAD\", 0x7fff61137b30) = -1 ENOENT (No such file or directory)\n10888 lstat(\"/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/HEAD\", {st_mode=S_IFREG|0664, st_size=23, ...}) = 0\n10888 open(\"/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/HEAD\", O_RDONLY) = 6\n10888 read(6, \"ref: refs/heads/master\\n\", 255) = 23\n10888 read(6, \"\", 232)                  = 0\n10888 close(6)                          = 0\n10888 lstat(\"/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/refs/heads/master\", {st_mode=S_IFREG|0664, st_size=41, ...}) = 0\n10888 open(\"/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/refs/heads/master\", O_RDONLY) = 6\n10888 read(6, \"1bd44cb9d13204b0fe1958db0082f502\"..., 255) = 41\n10888 read(6, \"\", 214)                  = 0\n10888 close(6)                          = 0\n10888 lstat(\"/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/refs/HEAD\", 0x7fff611378f0) = -1 ENOENT (No such file or directory)\n10888 lstat(\"/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/refs/tags/HEAD\", 0x7fff611378f0) = -1 ENOENT (No such file or directory)\n10888 lstat(\"/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/refs/heads/HEAD\", 0x7fff611378f0) = -1 ENOENT (No such file or directory)\n10888 lstat(\"/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/refs/remotes/HEAD\", 0x7fff611378f0) = -1 ENOENT (No such file or directory)\n10888 lstat(\"/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/refs/remotes/HEAD/HEAD\", 0x7fff611378f0) = -1 ENOENT (No such file or directory)\n10888 open(\"/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/objects/pack\", O_RDONLY|O_NONBLOCK|O_DIRECTORY) = 6\n10888 fstat(6, {st_mode=S_IFDIR|S_ISGID|0775, st_size=4096, ...}) = 0\n10888 fcntl(6, F_SETFD, FD_CLOEXEC)     = 0\n10888 getdents(6, /* 2 entries */, 4096) = 48\n10888 getdents(6, /* 0 entries */, 4096) = 0\n10888 close(6)                          = 0\n10888 open(\"/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/objects/info/alternates\", O_RDONLY) = -1 ENOENT (No such file or directory)\n10888 stat(\"/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/objects/1b/d44cb9d13204b0fe1958db0082f5028a16eb3a\", {st_mode=S_IFREG|0444, st_size=136, ...}) = 0\n10888 open(\"/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/objects/1b/d44cb9d13204b0fe1958db0082f5028a16eb3a\", O_RDONLY|O_NOATIME) = 6\n10888 mmap(NULL, 136, PROT_READ, MAP_PRIVATE, 6, 0) = 0x2b064998f000\n10888 close(6)                          = 0\n10888 munmap(0x2b064998f000, 136)       = 0\n10888 open(\"/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/info/grafts\", O_RDONLY) = -1 ENOENT (No such file or directory)\n10888 open(\"/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/shallow\", O_RDONLY) = -1 ENOENT (No such file or directory)\n10888 stat(\"/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/objects/df/2b8fc99e1c1d4dbc0a854d9f72157f1d6ea078\", {st_mode=S_IFREG|0444, st_size=49, ...}) = 0\n10888 open(\"/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/objects/df/2b8fc99e1c1d4dbc0a854d9f72157f1d6ea078\", O_RDONLY|O_NOATIME) = 6\n10888 mmap(NULL, 49, PROT_READ, MAP_PRIVATE, 6, 0) = 0x2b064998f000\n10888 close(6)                          = 0\n10888 brk(0x739000)                     = 0x739000\n10888 brk(0x736000)                     = 0x736000\n10888 munmap(0x2b064998f000, 49)        = 0\n10888 open(\"/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/index\", O_RDONLY) = 6\n10888 fstat(6, {st_mode=S_IFREG|0664, st_size=104, ...}) = 0\n10888 mmap(NULL, 104, PROT_READ|PROT_WRITE, MAP_PRIVATE, 6, 0) = 0x2b064998f000\n10888 close(6)                          = 0\n10888 munmap(0x2b064998f000, 104)       = 0\n10888 readlink(\"/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/index\", 0x7fff61136b90, 4096) = -1 EINVAL (Invalid argument)\n10888 open(\"/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/index.lock\", O_RDWR|O_CREAT|O_EXCL, 0666) = 6\n10888 rt_sigaction(SIGINT, {0x44bc70, [INT], SA_RESTORER|SA_RESTART, 0x2b064a0496a0}, {SIG_DFL}, 8) = 0\n10888 getpid()                          = 10888\n10888 lstat(\"elif\", {st_mode=S_IFREG|0664, st_size=0, ...}) = 0\n10888 lstat(\"elif\", {st_mode=S_IFREG|0664, st_size=0, ...}) = 0\n10888 open(\"elif\", O_RDONLY)            = 7\n10888 close(7)                          = 0\n10888 open(\".git/config\", O_RDONLY)     = 7\n10888 fstat(7, {st_mode=S_IFREG|0664, st_size=92, ...}) = 0\n10888 mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x2b064998f000\n10888 read(7, \"[core]\\n\\trepositoryformatversion \"..., 4096) = 92\n10888 read(7, \"\", 4096)                 = 0\n10888 close(7)                          = 0\n10888 munmap(0x2b064998f000, 4096)      = 0\n10888 open(\".gitattributes\", O_RDONLY)  = -1 ENOENT (No such file or directory)\n10888 open(\"/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/info/attributes\", O_RDONLY) = -1 ENOENT (No such file or directory)\n10888 stat(\"/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/objects/e6/9de29bb2d1d6434b8b29ae775ad8c2e48c5391\", {st_mode=S_IFREG|0444, st_size=15, ...}) = 0\n10888 lstat(\"elif\", {st_mode=S_IFREG|0664, st_size=0, ...}) = 0\n10888 open(\"elif\", O_RDONLY)            = 7\n10888 close(7)                          = 0\n10888 lstat(\"elif\", {st_mode=S_IFREG|0664, st_size=0, ...}) = 0\n10888 open(\"elif\", O_RDONLY)            = 7\n10888 close(7)                          = 0\n10888 write(6, \"DIRC\\0\\0\\0\\2\\0\\0\\0\\1G\\224S\\266\\0\\0\\0\\0G\\224S\\266\\0\\0\\0\"..., 104) = 104\n10888 close(6)                          = 0\n10888 readlink(\"/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/next-index-10888\", 0x7fff61136b90, 4096) = -1 ENOENT (No such file or directory)\n10888 open(\"/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/next-index-10888.lock\", O_RDWR|O_CREAT|O_EXCL, 0666) = 6\n10888 stat(\"/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/objects/1b/d44cb9d13204b0fe1958db0082f5028a16eb3a\", {st_mode=S_IFREG|0444, st_size=136, ...}) = 0\n10888 open(\"/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/objects/1b/d44cb9d13204b0fe1958db0082f5028a16eb3a\", O_RDONLY|O_NOATIME) = 7\n10888 mmap(NULL, 136, PROT_READ, MAP_PRIVATE, 7, 0) = 0x2b064998f000\n10888 close(7)                          = 0\n10888 munmap(0x2b064998f000, 136)       = 0\n10888 lstat(\"elif\", {st_mode=S_IFREG|0664, st_size=0, ...}) = 0\n10888 lstat(\"elif\", {st_mode=S_IFREG|0664, st_size=0, ...}) = 0\n10888 open(\"elif\", O_RDONLY)            = 7\n10888 close(7)                          = 0\n10888 stat(\"/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/objects/e6/9de29bb2d1d6434b8b29ae775ad8c2e48c5391\", {st_mode=S_IFREG|0444, st_size=15, ...}) = 0\n10888 lstat(\"elif\", {st_mode=S_IFREG|0664, st_size=0, ...}) = 0\n10888 open(\"elif\", O_RDONLY)            = 7\n10888 close(7)                          = 0\n10888 lstat(\"file\", 0x7fff61137a80)     = -1 ENOENT (No such file or directory)\n10888 lstat(\"elif\", {st_mode=S_IFREG|0664, st_size=0, ...}) = 0\n10888 open(\"elif\", O_RDONLY)            = 7\n10888 close(7)                          = 0\n10888 write(6, \"DIRC\\0\\0\\0\\2\\0\\0\\0\\2G\\224S\\266\\0\\0\\0\\0G\\224S\\266\\0\\0\\0\"..., 176) = 176\n10888 close(6)                          = 0\n10888 access(\"/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/hooks/pre-commit\", X_OK) = -1 ENOENT (No such file or directory)\n10888 open(\"/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/COMMIT_EDITMSG\", O_WRONLY|O_CREAT|O_TRUNC, 0666) = 6\n10888 fstat(6, {st_mode=S_IFREG|0664, st_size=0, ...}) = 0\n10888 mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x2b064998f000\n10888 write(6, \"Partial: add elif\\n\", 18) = 18\n10888 close(6)                          = 0\n10888 munmap(0x2b064998f000, 4096)      = 0\n10888 lstat(\"/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/HEAD\", {st_mode=S_IFREG|0664, st_size=23, ...}) = 0\n10888 open(\"/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/HEAD\", O_RDONLY) = 6\n10888 read(6, \"ref: refs/heads/master\\n\", 255) = 23\n10888 read(6, \"\", 232)                  = 0\n10888 close(6)                          = 0\n10888 lstat(\"/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/refs/heads/master\", {st_mode=S_IFREG|0664, st_size=41, ...}) = 0\n10888 open(\"/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/refs/heads/master\", O_RDONLY) = 6\n10888 read(6, \"1bd44cb9d13204b0fe1958db0082f502\"..., 255) = 41\n10888 read(6, \"\", 214)                  = 0\n10888 close(6)                          = 0\n10888 lstat(\"/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/refs/HEAD\", 0x7fff611376a0) = -1 ENOENT (No such file or directory)\n10888 lstat(\"/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/refs/tags/HEAD\", 0x7fff611376a0) = -1 ENOENT (No such file or directory)\n10888 lstat(\"/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/refs/heads/HEAD\", 0x7fff611376a0) = -1 ENOENT (No such file or directory)\n10888 lstat(\"/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/refs/remotes/HEAD\", 0x7fff611376a0) = -1 ENOENT (No such file or directory)\n10888 lstat(\"/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/refs/remotes/HEAD/HEAD\", 0x7fff611376a0) = -1 ENOENT (No such file or directory)\n10888 lstat(\"/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/HEAD\", {st_mode=S_IFREG|0664, st_size=23, ...}) = 0\n10888 open(\"/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/HEAD\", O_RDONLY) = 6\n10888 read(6, \"ref: refs/heads/master\\n\", 255) = 23\n10888 read(6, \"\", 232)                  = 0\n10888 close(6)                          = 0\n10888 lstat(\"/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/refs/heads/master\", {st_mode=S_IFREG|0664, st_size=41, ...}) = 0\n10888 open(\"/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/refs/heads/master\", O_RDONLY) = 6\n10888 read(6, \"1bd44cb9d13204b0fe1958db0082f502\"..., 255) = 41\n10888 read(6, \"\", 214)                  = 0\n10888 close(6)                          = 0\n10888 lstat(\"/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/refs/HEAD\", 0x7fff611375f0) = -1 ENOENT (No such file or directory)\n10888 lstat(\"/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/refs/tags/HEAD\", 0x7fff611375f0) = -1 ENOENT (No such file or directory)\n10888 lstat(\"/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/refs/heads/HEAD\", 0x7fff611375f0) = -1 ENOENT (No such file or directory)\n10888 lstat(\"/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/refs/remotes/HEAD\", 0x7fff611375f0) = -1 ENOENT (No such file or directory)\n10888 lstat(\"/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/refs/remotes/HEAD/HEAD\", 0x7fff611375f0) = -1 ENOENT (No such file or directory)\n10888 stat(\"/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/objects/1b/d44cb9d13204b0fe1958db0082f5028a16eb3a\", {st_mode=S_IFREG|0444, st_size=136, ...}) = 0\n10888 open(\"/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/objects/1b/d44cb9d13204b0fe1958db0082f5028a16eb3a\", O_RDONLY|O_NOATIME) = 6\n10888 mmap(NULL, 136, PROT_READ, MAP_PRIVATE, 6, 0) = 0x2b064998f000\n10888 close(6)                          = 0\n10888 munmap(0x2b064998f000, 136)       = 0\n10888 stat(\"/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/objects/1b/d44cb9d13204b0fe1958db0082f5028a16eb3a\", {st_mode=S_IFREG|0444, st_size=136, ...}) = 0\n10888 open(\"/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/objects/1b/d44cb9d13204b0fe1958db0082f5028a16eb3a\", O_RDONLY|O_NOATIME) = 6\n10888 mmap(NULL, 136, PROT_READ, MAP_PRIVATE, 6, 0) = 0x2b064998f000\n10888 close(6)                          = 0\n10888 munmap(0x2b064998f000, 136)       = 0\n10888 open(\"/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/next-index-10888.lock\", O_RDONLY) = 6\n10888 fstat(6, {st_mode=S_IFREG|0664, st_size=176, ...}) = 0\n10888 mmap(NULL, 176, PROT_READ|PROT_WRITE, MAP_PRIVATE, 6, 0) = 0x2b064998f000\n10888 close(6)                          = 0\n10888 munmap(0x2b064998f000, 176)       = 0\n10888 stat(\"/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/objects/e6/9de29bb2d1d6434b8b29ae775ad8c2e48c5391\", {st_mode=S_IFREG|0444, st_size=15, ...}) = 0\n10888 stat(\"/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/objects/e6/9de29bb2d1d6434b8b29ae775ad8c2e48c5391\", {st_mode=S_IFREG|0444, st_size=15, ...}) = 0\n10888 stat(\"/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/objects/a7/3843106991cb043bd823dd0bf7c821354cc125\", 0x7fff611379b0) = -1 ENOENT (No such file or directory)\n10888 open(\"/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/objects/a7/3843106991cb043bd823dd0bf7c821354cc125\", O_RDONLY) = -1 ENOENT (No such file or directory)\n10888 gettimeofday({1200903094, 936786}, NULL) = 0\n10888 open(\"/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/objects/tmp_obj_p1kDCU\", O_RDWR|O_CREAT|O_EXCL, 0600) = 6\n10888 brk(0x75a000)                     = 0x75a000\n10888 brk(0x74a000)                     = 0x74a000\n10888 brk(0x73a000)                     = 0x73a000\n10888 brk(0x738000)                     = 0x738000\n10888 write(6, \"x\\1+)JMU03a040031QH\\315\\311Lcx6\\367\\321\\354M\\27\\2579{\"..., 57) = 57\n10888 fchmod(6, 0444)                   = 0\n10888 close(6)                          = 0\n10888 link(\"/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/objects/tmp_obj_p1kDCU\", \"/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/objects/a7/3843106991cb043bd823dd0bf7c821354cc125\") = -1 ENOENT (No such file or directory)\n10888 mkdir(\"/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/objects/a7\", 0777) = 0\n10888 link(\"/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/objects/tmp_obj_p1kDCU\", \"/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/objects/a7/3843106991cb043bd823dd0bf7c821354cc125\") = 0\n10888 unlink(\"/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/objects/tmp_obj_p1kDCU\") = 0\n10888 brk(0x736000)                     = 0x736000\n10888 getuid()                          = 1012\n10888 socket(PF_FILE, SOCK_STREAM, 0)   = 6\n10888 fcntl(6, F_SETFL, O_RDWR|O_NONBLOCK) = 0\n10888 connect(6, {sa_family=AF_FILE, path=\"/var/run/nscd/socket\"}, 110) = -1 ENOENT (No such file or directory)\n10888 close(6)                          = 0\n10888 socket(PF_FILE, SOCK_STREAM, 0)   = 6\n10888 fcntl(6, F_SETFL, O_RDWR|O_NONBLOCK) = 0\n10888 connect(6, {sa_family=AF_FILE, path=\"/var/run/nscd/socket\"}, 110) = -1 ENOENT (No such file or directory)\n10888 close(6)                          = 0\n10888 open(\"/etc/nsswitch.conf\", O_RDONLY) = 6\n10888 fstat(6, {st_mode=S_IFREG|0644, st_size=465, ...}) = 0\n10888 mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x2b064998f000\n10888 read(6, \"# /etc/nsswitch.conf\\n#\\n# Example\"..., 4096) = 465\n10888 read(6, \"\", 4096)                 = 0\n10888 close(6)                          = 0\n10888 munmap(0x2b064998f000, 4096)      = 0\n10888 open(\"/etc/ld.so.cache\", O_RDONLY) = 6\n10888 fstat(6, {st_mode=S_IFREG|0644, st_size=70263, ...}) = 0\n10888 mmap(NULL, 70263, PROT_READ, MAP_PRIVATE, 6, 0) = 0x2b064998f000\n10888 close(6)                          = 0\n10888 access(\"/etc/ld.so.nohwcap\", F_OK) = -1 ENOENT (No such file or directory)\n10888 open(\"/lib/libnss_compat.so.2\", O_RDONLY) = 6\n10888 read(6, \"\\177ELF\\2\\1\\1\\0\\0\\0\\0\\0\\0\\0\\0\\0\\3\\0>\\0\\1\\0\\0\\0\\200\\23\\0\"..., 832) = 832\n10888 fstat(6, {st_mode=S_IFREG|0644, st_size=35632, ...}) = 0\n10888 mmap(NULL, 2131176, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 6, 0) = 0x2b064b4fb000\n10888 mprotect(0x2b064b502000, 2097152, PROT_NONE) = 0\n10888 mmap(0x2b064b702000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 6, 0x7000) = 0x2b064b702000\n10888 close(6)                          = 0\n10888 access(\"/etc/ld.so.nohwcap\", F_OK) = -1 ENOENT (No such file or directory)\n10888 open(\"/lib/libnsl.so.1\", O_RDONLY) = 6\n10888 read(6, \"\\177ELF\\2\\1\\1\\0\\0\\0\\0\\0\\0\\0\\0\\0\\3\\0>\\0\\1\\0\\0\\0\\0A\\0\\0\\0\"..., 832) = 832\n10888 fstat(6, {st_mode=S_IFREG|0644, st_size=93088, ...}) = 0\n10888 mmap(NULL, 2198224, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 6, 0) = 0x2b064b704000\n10888 mprotect(0x2b064b719000, 2097152, PROT_NONE) = 0\n10888 mmap(0x2b064b919000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 6, 0x15000) = 0x2b064b919000\n10888 mmap(0x2b064b91b000, 6864, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x2b064b91b000\n10888 close(6)                          = 0\n10888 munmap(0x2b064998f000, 70263)     = 0\n10888 open(\"/etc/ld.so.cache\", O_RDONLY) = 6\n10888 fstat(6, {st_mode=S_IFREG|0644, st_size=70263, ...}) = 0\n10888 mmap(NULL, 70263, PROT_READ, MAP_PRIVATE, 6, 0) = 0x2b064998f000\n10888 close(6)                          = 0\n10888 access(\"/etc/ld.so.nohwcap\", F_OK) = -1 ENOENT (No such file or directory)\n10888 open(\"/lib/libnss_nis.so.2\", O_RDONLY) = 6\n10888 read(6, \"\\177ELF\\2\\1\\1\\0\\0\\0\\0\\0\\0\\0\\0\\0\\3\\0>\\0\\1\\0\\0\\0000 \\0\\0\"..., 832) = 832\n10888 fstat(6, {st_mode=S_IFREG|0644, st_size=43480, ...}) = 0\n10888 mmap(NULL, 2139352, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 6, 0) = 0x2b064b91d000\n10888 mprotect(0x2b064b927000, 2093056, PROT_NONE) = 0\n10888 mmap(0x2b064bb26000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 6, 0x9000) = 0x2b064bb26000\n10888 close(6)                          = 0\n10888 access(\"/etc/ld.so.nohwcap\", F_OK) = -1 ENOENT (No such file or directory)\n10888 open(\"/lib/libnss_files.so.2\", O_RDONLY) = 6\n10888 read(6, \"\\177ELF\\2\\1\\1\\0\\0\\0\\0\\0\\0\\0\\0\\0\\3\\0>\\0\\1\\0\\0\\0P \\0\\0\\0\"..., 832) = 832\n10888 fstat(6, {st_mode=S_IFREG|0644, st_size=43448, ...}) = 0\n10888 mmap(NULL, 2139464, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 6, 0) = 0x2b064bb28000\n10888 mprotect(0x2b064bb32000, 2093056, PROT_NONE) = 0\n10888 mmap(0x2b064bd31000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 6, 0x9000) = 0x2b064bd31000\n10888 close(6)                          = 0\n10888 munmap(0x2b064998f000, 70263)     = 0\n10888 open(\"/etc/passwd\", O_RDONLY)     = 6\n10888 fcntl(6, F_GETFD)                 = 0\n10888 fcntl(6, F_SETFD, FD_CLOEXEC)     = 0\n10888 lseek(6, 0, SEEK_CUR)             = 0\n10888 fstat(6, {st_mode=S_IFREG|0644, st_size=1663, ...}) = 0\n10888 mmap(NULL, 1663, PROT_READ, MAP_SHARED, 6, 0) = 0x2b064998f000\n10888 lseek(6, 1663, SEEK_SET)          = 1663\n10888 munmap(0x2b064998f000, 1663)      = 0\n10888 close(6)                          = 0\n10888 uname({sys=\"Linux\", node=\"gitster\", ...}) = 0\n10888 open(\"/etc/resolv.conf\", O_RDONLY) = 6\n10888 fstat(6, {st_mode=S_IFREG|0644, st_size=44, ...}) = 0\n10888 mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x2b064998f000\n10888 read(6, \"search pv.oc.cox.net\\nnameserver \"..., 4096) = 44\n10888 read(6, \"\", 4096)                 = 0\n10888 close(6)                          = 0\n10888 munmap(0x2b064998f000, 4096)      = 0\n10888 stat(\"/etc/resolv.conf\", {st_mode=S_IFREG|0644, st_size=44, ...}) = 0\n10888 open(\"/etc/resolv.conf\", O_RDONLY) = 6\n10888 fstat(6, {st_mode=S_IFREG|0644, st_size=44, ...}) = 0\n10888 mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x2b064998f000\n10888 read(6, \"search pv.oc.cox.net\\nnameserver \"..., 4096) = 44\n10888 read(6, \"\", 4096)                 = 0\n10888 close(6)                          = 0\n10888 munmap(0x2b064998f000, 4096)      = 0\n10888 socket(PF_FILE, SOCK_STREAM, 0)   = 6\n10888 fcntl(6, F_SETFL, O_RDWR|O_NONBLOCK) = 0\n10888 connect(6, {sa_family=AF_FILE, path=\"/var/run/nscd/socket\"}, 110) = -1 ENOENT (No such file or directory)\n10888 close(6)                          = 0\n10888 socket(PF_FILE, SOCK_STREAM, 0)   = 6\n10888 fcntl(6, F_SETFL, O_RDWR|O_NONBLOCK) = 0\n10888 connect(6, {sa_family=AF_FILE, path=\"/var/run/nscd/socket\"}, 110) = -1 ENOENT (No such file or directory)\n10888 close(6)                          = 0\n10888 open(\"/etc/host.conf\", O_RDONLY)  = 6\n10888 fstat(6, {st_mode=S_IFREG|0644, st_size=9, ...}) = 0\n10888 mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x2b064998f000\n10888 read(6, \"multi on\\n\", 4096)       = 9\n10888 read(6, \"\", 4096)                 = 0\n10888 close(6)                          = 0\n10888 munmap(0x2b064998f000, 4096)      = 0\n10888 open(\"/etc/hosts\", O_RDONLY)      = 6\n10888 fcntl(6, F_GETFD)                 = 0\n10888 fcntl(6, F_SETFD, FD_CLOEXEC)     = 0\n10888 fstat(6, {st_mode=S_IFREG|0644, st_size=570, ...}) = 0\n10888 mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x2b064998f000\n10888 read(6, \"127.0.0.1\\tlocalhost\\n#127.0.1.1\\tg\"..., 4096) = 570\n10888 read(6, \"\", 4096)                 = 0\n10888 close(6)                          = 0\n10888 munmap(0x2b064998f000, 4096)      = 0\n10888 gettimeofday({1200903094, 941441}, NULL) = 0\n10888 open(\"/usr/share/zoneinfo/UTC\", O_RDONLY) = 6\n10888 fstat(6, {st_mode=S_IFREG|0644, st_size=118, ...}) = 0\n10888 fstat(6, {st_mode=S_IFREG|0644, st_size=118, ...}) = 0\n10888 mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x2b064998f000\n10888 read(6, \"TZif2\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\1\\0\\0\\0\\1\\0\\0\"..., 4096) = 118\n10888 lseek(6, -62, SEEK_CUR)           = 56\n10888 read(6, \"TZif2\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\1\\0\\0\\0\\1\\0\\0\"..., 4096) = 62\n10888 close(6)                          = 0\n10888 munmap(0x2b064998f000, 4096)      = 0\n10888 access(\"/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/hooks/commit-msg\", X_OK) = -1 ENOENT (No such file or directory)\n10888 open(\"/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/COMMIT_EDITMSG\", O_RDONLY) = 6\n10888 read(6, \"Partial: add elif\\n\", 8192) = 18\n10888 read(6, \"\", 12400)                = 0\n10888 close(6)                          = 0\n10888 stat(\"/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/objects/c1/7ca051cb2649d9f7bed8021db2cfc08eb9b330\", 0x7fff61137ad0) = -1 ENOENT (No such file or directory)\n10888 open(\"/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/objects/c1/7ca051cb2649d9f7bed8021db2cfc08eb9b330\", O_RDONLY) = -1 ENOENT (No such file or directory)\n10888 open(\"/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/objects/tmp_obj_BZH0dB\", O_RDWR|O_CREAT|O_EXCL, 0600) = 6\n10888 brk(0x75c000)                     = 0x75c000\n10888 brk(0x74c000)                     = 0x74c000\n10888 brk(0x73c000)                     = 0x73c000\n10888 brk(0x73b000)                     = 0x73b000\n10888 write(6, \"x\\1\\205\\316A\\212\\0021\\20\\205a\\3279E]@\\251\\252$v\\\"2\\214\"..., 174) = 174\n10888 fchmod(6, 0444)                   = 0\n10888 close(6)                          = 0\n10888 link(\"/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/objects/tmp_obj_BZH0dB\", \"/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/objects/c1/7ca051cb2649d9f7bed8021db2cfc08eb9b330\") = -1 ENOENT (No such file or directory)\n10888 mkdir(\"/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/objects/c1\", 0777) = 0\n10888 link(\"/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/objects/tmp_obj_BZH0dB\", \"/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/objects/c1/7ca051cb2649d9f7bed8021db2cfc08eb9b330\") = 0\n10888 unlink(\"/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/objects/tmp_obj_BZH0dB\") = 0\n10888 lstat(\"/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/HEAD\", {st_mode=S_IFREG|0664, st_size=23, ...}) = 0\n10888 open(\"/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/HEAD\", O_RDONLY) = 6\n10888 read(6, \"ref: refs/heads/master\\n\", 255) = 23\n10888 read(6, \"\", 232)                  = 0\n10888 close(6)                          = 0\n10888 lstat(\"/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/refs/heads/master\", {st_mode=S_IFREG|0664, st_size=41, ...}) = 0\n10888 open(\"/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/refs/heads/master\", O_RDONLY) = 6\n10888 read(6, \"1bd44cb9d13204b0fe1958db0082f502\"..., 255) = 41\n10888 read(6, \"\", 214)                  = 0\n10888 close(6)                          = 0\n10888 lstat(\"/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/refs/heads/master\", {st_mode=S_IFREG|0664, st_size=41, ...}) = 0\n10888 stat(\"/opt\", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0\n10888 stat(\"/opt/packrat\", {st_mode=S_IFDIR|S_ISGID|0775, st_size=4096, ...}) = 0\n10888 stat(\"/opt/packrat/playpen\", {st_mode=S_IFDIR|S_ISGID|0775, st_size=4096, ...}) = 0\n10888 stat(\"/opt/packrat/playpen/public\", {st_mode=S_IFDIR|S_ISGID|0755, st_size=4096, ...}) = 0\n10888 stat(\"/opt/packrat/playpen/public/in-place\", {st_mode=S_IFDIR|S_ISGID|0755, st_size=4096, ...}) = 0\n10888 stat(\"/opt/packrat/playpen/public/in-place/git\", {st_mode=S_IFDIR|S_ISGID|0775, st_size=4096, ...}) = 0\n10888 stat(\"/opt/packrat/playpen/public/in-place/git/git.junio\", {st_mode=S_IFDIR|S_ISGID|0775, st_size=98304, ...}) = 0\n10888 stat(\"/opt/packrat/playpen/public/in-place/git/git.junio/t\", {st_mode=S_IFDIR|S_ISGID|0775, st_size=8192, ...}) = 0\n10888 stat(\"/opt/packrat/playpen/public/in-place/git/git.junio/t/trash\", {st_mode=S_IFDIR|S_ISGID|0775, st_size=4096, ...}) = 0\n10888 stat(\"/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git\", {st_mode=S_IFDIR|S_ISGID|0775, st_size=4096, ...}) = 0\n10888 stat(\"/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/refs\", {st_mode=S_IFDIR|S_ISGID|0775, st_size=4096, ...}) = 0\n10888 stat(\"/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/refs/heads\", {st_mode=S_IFDIR|S_ISGID|0775, st_size=4096, ...}) = 0\n10888 readlink(\"/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/refs/heads/master\", 0x7fff61136b70, 4096) = -1 EINVAL (Invalid argument)\n10888 open(\"/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/refs/heads/master.lock\", O_RDWR|O_CREAT|O_EXCL, 0666) = 6\n10888 lstat(\"/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/refs/heads/master\", {st_mode=S_IFREG|0664, st_size=41, ...}) = 0\n10888 open(\"/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/refs/heads/master\", O_RDONLY) = 7\n10888 read(7, \"1bd44cb9d13204b0fe1958db0082f502\"..., 255) = 41\n10888 read(7, \"\", 214)                  = 0\n10888 close(7)                          = 0\n10888 stat(\"/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/objects/c1/7ca051cb2649d9f7bed8021db2cfc08eb9b330\", {st_mode=S_IFREG|0444, st_size=174, ...}) = 0\n10888 open(\"/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/objects/c1/7ca051cb2649d9f7bed8021db2cfc08eb9b330\", O_RDONLY|O_NOATIME) = 7\n10888 mmap(NULL, 174, PROT_READ, MAP_PRIVATE, 7, 0) = 0x2b064998f000\n10888 close(7)                          = 0\n10888 munmap(0x2b064998f000, 174)       = 0\n10888 write(6, \"c17ca051cb2649d9f7bed8021db2cfc0\"..., 40) = 40\n10888 write(6, \"\\n\", 1)                 = 1\n10888 close(6)                          = 0\n10888 stat(\"/opt\", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0\n10888 stat(\"/opt/packrat\", {st_mode=S_IFDIR|S_ISGID|0775, st_size=4096, ...}) = 0\n10888 stat(\"/opt/packrat/playpen\", {st_mode=S_IFDIR|S_ISGID|0775, st_size=4096, ...}) = 0\n10888 stat(\"/opt/packrat/playpen/public\", {st_mode=S_IFDIR|S_ISGID|0755, st_size=4096, ...}) = 0\n10888 stat(\"/opt/packrat/playpen/public/in-place\", {st_mode=S_IFDIR|S_ISGID|0755, st_size=4096, ...}) = 0\n10888 stat(\"/opt/packrat/playpen/public/in-place/git\", {st_mode=S_IFDIR|S_ISGID|0775, st_size=4096, ...}) = 0\n10888 stat(\"/opt/packrat/playpen/public/in-place/git/git.junio\", {st_mode=S_IFDIR|S_ISGID|0775, st_size=98304, ...}) = 0\n10888 stat(\"/opt/packrat/playpen/public/in-place/git/git.junio/t\", {st_mode=S_IFDIR|S_ISGID|0775, st_size=8192, ...}) = 0\n10888 stat(\"/opt/packrat/playpen/public/in-place/git/git.junio/t/trash\", {st_mode=S_IFDIR|S_ISGID|0775, st_size=4096, ...}) = 0\n10888 stat(\"/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git\", {st_mode=S_IFDIR|S_ISGID|0775, st_size=4096, ...}) = 0\n10888 stat(\"/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/logs\", {st_mode=S_IFDIR|S_ISGID|0775, st_size=4096, ...}) = 0\n10888 stat(\"/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/logs/refs\", {st_mode=S_IFDIR|S_ISGID|0775, st_size=4096, ...}) = 0\n10888 stat(\"/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/logs/refs/heads\", {st_mode=S_IFDIR|S_ISGID|0775, st_size=4096, ...}) = 0\n10888 open(\"/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/logs/refs/heads/master\", O_WRONLY|O_APPEND|O_CREAT, 0666) = 6\n10888 write(6, \"1bd44cb9d13204b0fe1958db0082f502\"..., 160) = 160\n10888 close(6)                          = 0\n10888 stat(\"/opt\", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0\n10888 stat(\"/opt/packrat\", {st_mode=S_IFDIR|S_ISGID|0775, st_size=4096, ...}) = 0\n10888 stat(\"/opt/packrat/playpen\", {st_mode=S_IFDIR|S_ISGID|0775, st_size=4096, ...}) = 0\n10888 stat(\"/opt/packrat/playpen/public\", {st_mode=S_IFDIR|S_ISGID|0755, st_size=4096, ...}) = 0\n10888 stat(\"/opt/packrat/playpen/public/in-place\", {st_mode=S_IFDIR|S_ISGID|0755, st_size=4096, ...}) = 0\n10888 stat(\"/opt/packrat/playpen/public/in-place/git\", {st_mode=S_IFDIR|S_ISGID|0775, st_size=4096, ...}) = 0\n10888 stat(\"/opt/packrat/playpen/public/in-place/git/git.junio\", {st_mode=S_IFDIR|S_ISGID|0775, st_size=98304, ...}) = 0\n10888 stat(\"/opt/packrat/playpen/public/in-place/git/git.junio/t\", {st_mode=S_IFDIR|S_ISGID|0775, st_size=8192, ...}) = 0\n10888 stat(\"/opt/packrat/playpen/public/in-place/git/git.junio/t/trash\", {st_mode=S_IFDIR|S_ISGID|0775, st_size=4096, ...}) = 0\n10888 stat(\"/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git\", {st_mode=S_IFDIR|S_ISGID|0775, st_size=4096, ...}) = 0\n10888 stat(\"/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/logs\", {st_mode=S_IFDIR|S_ISGID|0775, st_size=4096, ...}) = 0\n10888 open(\"/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/logs/HEAD\", O_WRONLY|O_APPEND|O_CREAT, 0666) = 6\n10888 write(6, \"1bd44cb9d13204b0fe1958db0082f502\"..., 160) = 160\n10888 close(6)                          = 0\n10888 rename(\"/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/refs/heads/master.lock\", \"/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/refs/heads/master\") = 0\n10888 unlink(\"/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/MERGE_HEAD\") = -1 ENOENT (No such file or directory)\n10888 unlink(\"/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/MERGE_MSG\") = -1 ENOENT (No such file or directory)\n10888 rename(\"/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/index.lock\", \"/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/index\") = 0\n10888 unlink(\"/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/next-index-10888.lock\") = 0\n10888 open(\".git/config\", O_RDONLY)     = 6\n10888 fstat(6, {st_mode=S_IFREG|0664, st_size=92, ...}) = 0\n10888 mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x2b064998f000\n10888 read(6, \"[core]\\n\\trepositoryformatversion \"..., 4096) = 92\n10888 read(6, \"\", 4096)                 = 0\n10888 close(6)                          = 0\n10888 munmap(0x2b064998f000, 4096)      = 0\n10888 stat(\"/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/rr-cache\", 0x7fff61137b90) = -1 ENOENT (No such file or directory)\n10888 access(\"/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/hooks/post-commit\", X_OK) = -1 ENOENT (No such file or directory)\n10888 fstat(1, {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 6), ...}) = 0\n10888 mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x2b064998f000\n10888 stat(\"/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/objects/1b/d44cb9d13204b0fe1958db0082f5028a16eb3a\", {st_mode=S_IFREG|0444, st_size=136, ...}) = 0\n10888 open(\"/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/objects/1b/d44cb9d13204b0fe1958db0082f5028a16eb3a\", O_RDONLY|O_NOATIME) = 6\n10888 mmap(NULL, 136, PROT_READ, MAP_PRIVATE, 6, 0) = 0x2b0649990000\n10888 close(6)                          = 0\n10888 munmap(0x2b0649990000, 136)       = 0\n10888 stat(\"/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/objects/df/2b8fc99e1c1d4dbc0a854d9f72157f1d6ea078\", {st_mode=S_IFREG|0444, st_size=49, ...}) = 0\n10888 open(\"/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/objects/df/2b8fc99e1c1d4dbc0a854d9f72157f1d6ea078\", O_RDONLY|O_NOATIME) = 6\n10888 mmap(NULL, 49, PROT_READ, MAP_PRIVATE, 6, 0) = 0x2b0649990000\n10888 close(6)                          = 0\n10888 munmap(0x2b0649990000, 49)        = 0\n10888 stat(\"/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/objects/c1/7ca051cb2649d9f7bed8021db2cfc08eb9b330\", {st_mode=S_IFREG|0444, st_size=174, ...}) = 0\n10888 open(\"/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/objects/c1/7ca051cb2649d9f7bed8021db2cfc08eb9b330\", O_RDONLY|O_NOATIME) = 6\n10888 mmap(NULL, 174, PROT_READ, MAP_PRIVATE, 6, 0) = 0x2b0649990000\n10888 close(6)                          = 0\n10888 munmap(0x2b0649990000, 174)       = 0\n10888 stat(\"/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/objects/a7/3843106991cb043bd823dd0bf7c821354cc125\", {st_mode=S_IFREG|0444, st_size=57, ...}) = 0\n10888 open(\"/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/objects/a7/3843106991cb043bd823dd0bf7c821354cc125\", O_RDONLY|O_NOATIME) = 6\n10888 mmap(NULL, 57, PROT_READ, MAP_PRIVATE, 6, 0) = 0x2b0649990000\n10888 close(6)                          = 0\n10888 munmap(0x2b0649990000, 57)        = 0\n10888 open(\"/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/objects/c1/\", O_RDONLY|O_NONBLOCK|O_DIRECTORY) = 6\n10888 fstat(6, {st_mode=S_IFDIR|S_ISGID|0775, st_size=4096, ...}) = 0\n10888 fcntl(6, F_SETFD, FD_CLOEXEC)     = 0\n10888 getdents(6, /* 3 entries */, 4096) = 112\n10888 getdents(6, /* 0 entries */, 4096) = 0\n10888 close(6)                          = 0\n10888 write(1, \"Created commit c17ca05: Partial:\"..., 42) = 42\n10888 lstat(\"elif\", {st_mode=S_IFREG|0664, st_size=0, ...}) = 0\n10888 open(\"elif\", O_RDONLY)            = 6\n10888 close(6)                          = 0\n10888 lstat(\"elif\", {st_mode=S_IFREG|0664, st_size=0, ...}) = 0\n10888 write(1, \" 0 files changed, 0 insertions(+\"..., 50) = 50\n10888 write(1, \" create mode 100644 elif\\n\", 25) = 25\n10888 fstat(1, {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 6), ...}) = 0\n10888 fstat(1, {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 6), ...}) = 0\n10888 close(1)                          = 0\n10888 munmap(0x2b064998f000, 4096)      = 0\n10888 exit_group(0)                     = ?\n\n\n10922 execve(\"/opt/packrat/playpen/public/in-place/git/git.junio/t/../git\", [\"git\", \"commit\", \"-m\", \"Partial: add elif\", \"elif\"], [/* 51 vars */]) = 0\n10922 brk(0)                            = 0x6f7000\n10922 mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x2ac02877e000\n10922 uname({sys=\"Linux\", node=\"gitster\", ...}) = 0\n10922 access(\"/etc/ld.so.nohwcap\", F_OK) = -1 ENOENT (No such file or directory)\n10922 mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x2ac02877f000\n10922 access(\"/etc/ld.so.preload\", R_OK) = -1 ENOENT (No such file or directory)\n10922 open(\"/etc/ld.so.cache\", O_RDONLY) = 6\n10922 fstat(6, {st_mode=S_IFREG|0644, st_size=70263, ...}) = 0\n10922 mmap(NULL, 70263, PROT_READ, MAP_PRIVATE, 6, 0) = 0x2ac028781000\n10922 close(6)                          = 0\n10922 access(\"/etc/ld.so.nohwcap\", F_OK) = -1 ENOENT (No such file or directory)\n10922 open(\"/usr/lib/libcurl.so.3\", O_RDONLY) = 6\n10922 read(6, \"\\177ELF\\2\\1\\1\\0\\0\\0\\0\\0\\0\\0\\0\\0\\3\\0>\\0\\1\\0\\0\\0`m\\0\\0\\0\"..., 832) = 832\n10922 fstat(6, {st_mode=S_IFREG|0644, st_size=227856, ...}) = 0\n10922 mmap(NULL, 1275080, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 6, 0) = 0x2ac028793000\n10922 mprotect(0x2ac0287c9000, 1048576, PROT_NONE) = 0\n10922 mmap(0x2ac0288c9000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 6, 0x36000) = 0x2ac0288c9000\n10922 close(6)                          = 0\n10922 access(\"/etc/ld.so.nohwcap\", F_OK) = -1 ENOENT (No such file or directory)\n10922 open(\"/usr/lib/libz.so.1\", O_RDONLY) = 6\n10922 read(6, \"\\177ELF\\2\\1\\1\\0\\0\\0\\0\\0\\0\\0\\0\\0\\3\\0>\\0\\1\\0\\0\\0@!\\0\\0\\0\"..., 832) = 832\n10922 fstat(6, {st_mode=S_IFREG|0644, st_size=93504, ...}) = 0\n10922 mmap(NULL, 2188616, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 6, 0) = 0x2ac02897f000\n10922 mprotect(0x2ac028995000, 2097152, PROT_NONE) = 0\n10922 mmap(0x2ac028b95000, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 6, 0x16000) = 0x2ac028b95000\n10922 close(6)                          = 0\n10922 access(\"/etc/ld.so.nohwcap\", F_OK) = -1 ENOENT (No such file or directory)\n10922 open(\"/usr/lib/libcrypto.so.0.9.8\", O_RDONLY) = 6\n10922 read(6, \"\\177ELF\\2\\1\\1\\0\\0\\0\\0\\0\\0\\0\\0\\0\\3\\0>\\0\\1\\0\\0\\0\\360\\364\"..., 832) = 832\n10922 fstat(6, {st_mode=S_IFREG|0644, st_size=1510344, ...}) = 0\n10922 mmap(NULL, 2571832, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 6, 0) = 0x2ac028b96000\n10922 mprotect(0x2ac028ce4000, 1048576, PROT_NONE) = 0\n10922 mmap(0x2ac028de4000, 143360, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 6, 0x14e000) = 0x2ac028de4000\n10922 mmap(0x2ac028e07000, 11832, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x2ac028e07000\n10922 close(6)                          = 0\n10922 access(\"/etc/ld.so.nohwcap\", F_OK) = -1 ENOENT (No such file or directory)\n10922 open(\"/lib/libc.so.6\", O_RDONLY)  = 6\n10922 read(6, \"\\177ELF\\2\\1\\1\\0\\0\\0\\0\\0\\0\\0\\0\\0\\3\\0>\\0\\1\\0\\0\\0`\\334\\1\\0\"..., 832) = 832\n10922 fstat(6, {st_mode=S_IFREG|0755, st_size=1391928, ...}) = 0\n10922 mmap(NULL, 3498360, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 6, 0) = 0x2ac028e0a000\n10922 mprotect(0x2ac028f57000, 2097152, PROT_NONE) = 0\n10922 mmap(0x2ac029157000, 20480, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 6, 0x14d000) = 0x2ac029157000\n10922 mmap(0x2ac02915c000, 16760, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x2ac02915c000\n10922 close(6)                          = 0\n10922 access(\"/etc/ld.so.nohwcap\", F_OK) = -1 ENOENT (No such file or directory)\n10922 open(\"/usr/lib/libgssapi_krb5.so.2\", O_RDONLY) = 6\n10922 read(6, \"\\177ELF\\2\\1\\1\\0\\0\\0\\0\\0\\0\\0\\0\\0\\3\\0>\\0\\1\\0\\0\\0\\20e\\0\\0\"..., 832) = 832\n10922 fstat(6, {st_mode=S_IFREG|0644, st_size=173640, ...}) = 0\n10922 mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x2ac029161000\n10922 mmap(NULL, 2269136, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 6, 0) = 0x2ac029162000\n10922 mprotect(0x2ac02918b000, 2093056, PROT_NONE) = 0\n10922 mmap(0x2ac02938a000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 6, 0x28000) = 0x2ac02938a000\n10922 close(6)                          = 0\n10922 access(\"/etc/ld.so.nohwcap\", F_OK) = -1 ENOENT (No such file or directory)\n10922 open(\"/usr/lib/libkrb5.so.3\", O_RDONLY) = 6\n10922 read(6, \"\\177ELF\\2\\1\\1\\0\\0\\0\\0\\0\\0\\0\\0\\0\\3\\0>\\0\\1\\0\\0\\0\\300\\221\"..., 832) = 832\n10922 fstat(6, {st_mode=S_IFREG|0644, st_size=635688, ...}) = 0\n10922 mmap(NULL, 2730976, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 6, 0) = 0x2ac02938c000\n10922 mprotect(0x2ac029423000, 2097152, PROT_NONE) = 0\n10922 mmap(0x2ac029623000, 16384, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 6, 0x97000) = 0x2ac029623000\n10922 close(6)                          = 0\n10922 access(\"/etc/ld.so.nohwcap\", F_OK) = -1 ENOENT (No such file or directory)\n10922 open(\"/usr/lib/libk5crypto.so.3\", O_RDONLY) = 6\n10922 read(6, \"\\177ELF\\2\\1\\1\\0\\0\\0\\0\\0\\0\\0\\0\\0\\3\\0>\\0\\1\\0\\0\\0\\320X\\0\\0\"..., 832) = 832\n10922 fstat(6, {st_mode=S_IFREG|0644, st_size=150656, ...}) = 0\n10922 mmap(NULL, 2246952, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 6, 0) = 0x2ac029627000\n10922 mprotect(0x2ac02964a000, 2097152, PROT_NONE) = 0\n10922 mmap(0x2ac02984a000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 6, 0x23000) = 0x2ac02984a000\n10922 close(6)                          = 0\n10922 access(\"/etc/ld.so.nohwcap\", F_OK) = -1 ENOENT (No such file or directory)\n10922 open(\"/lib/libcom_err.so.2\", O_RDONLY) = 6\n10922 read(6, \"\\177ELF\\2\\1\\1\\0\\0\\0\\0\\0\\0\\0\\0\\0\\3\\0>\\0\\1\\0\\0\\0\\260\\f\\0\"..., 832) = 832\n10922 fstat(6, {st_mode=S_IFREG|0644, st_size=7984, ...}) = 0\n10922 mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x2ac02984c000\n10922 mmap(NULL, 1054920, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 6, 0) = 0x2ac02984d000\n10922 mprotect(0x2ac02984f000, 1044480, PROT_NONE) = 0\n10922 mmap(0x2ac02994e000, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 6, 0x1000) = 0x2ac02994e000\n10922 close(6)                          = 0\n10922 access(\"/etc/ld.so.nohwcap\", F_OK) = -1 ENOENT (No such file or directory)\n10922 open(\"/usr/lib/libkrb5support.so.0\", O_RDONLY) = 6\n10922 read(6, \"\\177ELF\\2\\1\\1\\0\\0\\0\\0\\0\\0\\0\\0\\0\\3\\0>\\0\\1\\0\\0\\0\\200\\35\\0\"..., 832) = 832\n10922 fstat(6, {st_mode=S_IFREG|0644, st_size=30408, ...}) = 0\n10922 mmap(NULL, 2125648, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 6, 0) = 0x2ac02994f000\n10922 mprotect(0x2ac029956000, 2093056, PROT_NONE) = 0\n10922 mmap(0x2ac029b55000, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 6, 0x6000) = 0x2ac029b55000\n10922 close(6)                          = 0\n10922 access(\"/etc/ld.so.nohwcap\", F_OK) = -1 ENOENT (No such file or directory)\n10922 open(\"/lib/libresolv.so.2\", O_RDONLY) = 6\n10922 read(6, \"\\177ELF\\2\\1\\1\\0\\0\\0\\0\\0\\0\\0\\0\\0\\3\\0>\\0\\1\\0\\0\\0\\0003\\0\\0\"..., 832) = 832\n10922 fstat(6, {st_mode=S_IFREG|0644, st_size=76664, ...}) = 0\n10922 mmap(NULL, 2181896, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 6, 0) = 0x2ac029b56000\n10922 mprotect(0x2ac029b67000, 2097152, PROT_NONE) = 0\n10922 mmap(0x2ac029d67000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 6, 0x11000) = 0x2ac029d67000\n10922 mmap(0x2ac029d69000, 6920, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x2ac029d69000\n10922 close(6)                          = 0\n10922 access(\"/etc/ld.so.nohwcap\", F_OK) = -1 ENOENT (No such file or directory)\n10922 open(\"/usr/lib/libidn.so.11\", O_RDONLY) = 6\n10922 read(6, \"\\177ELF\\2\\1\\1\\0\\0\\0\\0\\0\\0\\0\\0\\0\\3\\0>\\0\\1\\0\\0\\0\\340/\\0\\0\"..., 832) = 832\n10922 fstat(6, {st_mode=S_IFREG|0644, st_size=202368, ...}) = 0\n10922 mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x2ac029d6b000\n10922 mmap(NULL, 1249152, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 6, 0) = 0x2ac029d6c000\n10922 mprotect(0x2ac029d9d000, 1044480, PROT_NONE) = 0\n10922 mmap(0x2ac029e9c000, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 6, 0x30000) = 0x2ac029e9c000\n10922 close(6)                          = 0\n10922 access(\"/etc/ld.so.nohwcap\", F_OK) = -1 ENOENT (No such file or directory)\n10922 open(\"/lib/libdl.so.2\", O_RDONLY) = 6\n10922 read(6, \"\\177ELF\\2\\1\\1\\0\\0\\0\\0\\0\\0\\0\\0\\0\\3\\0>\\0\\1\\0\\0\\0 \\16\\0\\0\"..., 832) = 832\n10922 fstat(6, {st_mode=S_IFREG|0644, st_size=14624, ...}) = 0\n10922 mmap(NULL, 2109728, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 6, 0) = 0x2ac029e9d000\n10922 mprotect(0x2ac029e9f000, 2097152, PROT_NONE) = 0\n10922 mmap(0x2ac02a09f000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 6, 0x2000) = 0x2ac02a09f000\n10922 close(6)                          = 0\n10922 access(\"/etc/ld.so.nohwcap\", F_OK) = -1 ENOENT (No such file or directory)\n10922 open(\"/usr/lib/libssl.so.0.9.8\", O_RDONLY) = 6\n10922 read(6, \"\\177ELF\\2\\1\\1\\0\\0\\0\\0\\0\\0\\0\\0\\0\\3\\0>\\0\\1\\0\\0\\0\\340\\31\\1\"..., 832) = 832\n10922 fstat(6, {st_mode=S_IFREG|0644, st_size=291816, ...}) = 0\n10922 mmap(NULL, 1338608, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 6, 0) = 0x2ac02a0a1000\n10922 mprotect(0x2ac02a0e2000, 1048576, PROT_NONE) = 0\n10922 mmap(0x2ac02a1e2000, 24576, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 6, 0x41000) = 0x2ac02a1e2000\n10922 close(6)                          = 0\n10922 access(\"/etc/ld.so.nohwcap\", F_OK) = -1 ENOENT (No such file or directory)\n10922 open(\"/lib/libkeyutils.so.1\", O_RDONLY) = 6\n10922 read(6, \"\\177ELF\\2\\1\\1\\0\\0\\0\\0\\0\\0\\0\\0\\0\\3\\0>\\0\\1\\0\\0\\0\\260\\v\\0\"..., 832) = 832\n10922 fstat(6, {st_mode=S_IFREG|0644, st_size=7304, ...}) = 0\n10922 mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x2ac02a1e8000\n10922 mmap(NULL, 1054160, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 6, 0) = 0x2ac02a1e9000\n10922 mprotect(0x2ac02a1eb000, 1044480, PROT_NONE) = 0\n10922 mmap(0x2ac02a2ea000, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 6, 0x1000) = 0x2ac02a2ea000\n10922 close(6)                          = 0\n10922 mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x2ac02a2eb000\n10922 mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x2ac02a2ec000\n10922 arch_prctl(ARCH_SET_FS, 0x2ac02a2ebf10) = 0\n10922 mprotect(0x2ac029157000, 12288, PROT_READ) = 0\n10922 munmap(0x2ac028781000, 70263)     = 0\n10922 brk(0)                            = 0x6f7000\n10922 brk(0x718000)                     = 0x718000\n10922 getcwd(\"/opt/packrat/playpen/public/in-place/git/git.junio/t/trash\", 4096) = 59\n10922 access(\".git/objects\", X_OK)      = 0\n10922 access(\".git/refs\", X_OK)         = 0\n10922 lstat(\".git/HEAD\", {st_mode=S_IFREG|0664, st_size=23, ...}) = 0\n10922 open(\".git/HEAD\", O_RDONLY)       = 6\n10922 read(6, \"ref: refs/heads/master\\n\", 255) = 23\n10922 read(6, \"\", 232)                  = 0\n10922 close(6)                          = 0\n10922 open(\".git/config\", O_RDONLY)     = 6\n10922 fstat(6, {st_mode=S_IFREG|0664, st_size=92, ...}) = 0\n10922 mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x2ac028781000\n10922 read(6, \"[core]\\n\\trepositoryformatversion \"..., 4096) = 92\n10922 read(6, \"\", 4096)                 = 0\n10922 close(6)                          = 0\n10922 munmap(0x2ac028781000, 4096)      = 0\n10922 stat(\".git\", {st_mode=S_IFDIR|S_ISGID|0775, st_size=4096, ...}) = 0\n10922 getcwd(\"/opt/packrat/playpen/public/in-place/git/git.junio/t/trash\", 1024) = 59\n10922 chdir(\".git\")                     = 0\n10922 getcwd(\"/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git\", 4096) = 64\n10922 lstat(\"/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git\", {st_mode=S_IFDIR|S_ISGID|0775, st_size=4096, ...}) = 0\n10922 chdir(\"/opt/packrat/playpen/public/in-place/git/git.junio/t/trash\") = 0\n10922 chdir(\"/opt/packrat/playpen/public/in-place/git/git.junio/t/trash\") = 0\n10922 open(\".git/config\", O_RDONLY)     = 6\n10922 fstat(6, {st_mode=S_IFREG|0664, st_size=92, ...}) = 0\n10922 mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x2ac028781000\n10922 read(6, \"[core]\\n\\trepositoryformatversion \"..., 4096) = 92\n10922 read(6, \"\", 4096)                 = 0\n10922 close(6)                          = 0\n10922 munmap(0x2ac028781000, 4096)      = 0\n10922 lstat(\"/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/HEAD\", {st_mode=S_IFREG|0664, st_size=23, ...}) = 0\n10922 open(\"/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/HEAD\", O_RDONLY) = 6\n10922 read(6, \"ref: refs/heads/master\\n\", 255) = 23\n10922 read(6, \"\", 232)                  = 0\n10922 close(6)                          = 0\n10922 lstat(\"/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/refs/heads/master\", {st_mode=S_IFREG|0664, st_size=41, ...}) = 0\n10922 open(\"/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/refs/heads/master\", O_RDONLY) = 6\n10922 read(6, \"1bd44cb9d13204b0fe1958db0082f502\"..., 255) = 41\n10922 read(6, \"\", 214)                  = 0\n10922 close(6)                          = 0\n10922 lstat(\"/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/refs/HEAD\", 0x7fff82343bd0) = -1 ENOENT (No such file or directory)\n10922 open(\"/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/packed-refs\", O_RDONLY) = -1 ENOENT (No such file or directory)\n10922 lstat(\"/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/refs/tags/HEAD\", 0x7fff82343bd0) = -1 ENOENT (No such file or directory)\n10922 lstat(\"/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/refs/heads/HEAD\", 0x7fff82343bd0) = -1 ENOENT (No such file or directory)\n10922 lstat(\"/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/refs/remotes/HEAD\", 0x7fff82343bd0) = -1 ENOENT (No such file or directory)\n10922 lstat(\"/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/refs/remotes/HEAD/HEAD\", 0x7fff82343bd0) = -1 ENOENT (No such file or directory)\n10922 lstat(\"/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/MERGE_HEAD\", 0x7fff82343bd0) = -1 ENOENT (No such file or directory)\n10922 lstat(\"/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/refs/MERGE_HEAD\", 0x7fff82343bd0) = -1 ENOENT (No such file or directory)\n10922 lstat(\"/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/refs/tags/MERGE_HEAD\", 0x7fff82343bd0) = -1 ENOENT (No such file or directory)\n10922 lstat(\"/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/refs/heads/MERGE_HEAD\", 0x7fff82343bd0) = -1 ENOENT (No such file or directory)\n10922 lstat(\"/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/refs/remotes/MERGE_HEAD\", 0x7fff82343bd0) = -1 ENOENT (No such file or directory)\n10922 lstat(\"/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/refs/remotes/MERGE_HEAD/HEAD\", 0x7fff82343bd0) = -1 ENOENT (No such file or directory)\n10922 open(\"/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/index\", O_RDONLY) = 6\n10922 fstat(6, {st_mode=S_IFREG|0664, st_size=104, ...}) = 0\n10922 mmap(NULL, 104, PROT_READ|PROT_WRITE, MAP_PRIVATE, 6, 0) = 0x2ac028781000\n10922 close(6)                          = 0\n10922 munmap(0x2ac028781000, 104)       = 0\n10922 lstat(\"/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/MERGE_HEAD\", 0x7fff82343d40) = -1 ENOENT (No such file or directory)\n10922 lstat(\"/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/HEAD\", {st_mode=S_IFREG|0664, st_size=23, ...}) = 0\n10922 open(\"/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/HEAD\", O_RDONLY) = 6\n10922 read(6, \"ref: refs/heads/master\\n\", 255) = 23\n10922 read(6, \"\", 232)                  = 0\n10922 close(6)                          = 0\n10922 lstat(\"/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/refs/heads/master\", {st_mode=S_IFREG|0664, st_size=41, ...}) = 0\n10922 open(\"/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/refs/heads/master\", O_RDONLY) = 6\n10922 read(6, \"1bd44cb9d13204b0fe1958db0082f502\"..., 255) = 41\n10922 read(6, \"\", 214)                  = 0\n10922 close(6)                          = 0\n10922 lstat(\"/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/refs/HEAD\", 0x7fff82343b00) = -1 ENOENT (No such file or directory)\n10922 lstat(\"/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/refs/tags/HEAD\", 0x7fff82343b00) = -1 ENOENT (No such file or directory)\n10922 lstat(\"/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/refs/heads/HEAD\", 0x7fff82343b00) = -1 ENOENT (No such file or directory)\n10922 lstat(\"/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/refs/remotes/HEAD\", 0x7fff82343b00) = -1 ENOENT (No such file or directory)\n10922 lstat(\"/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/refs/remotes/HEAD/HEAD\", 0x7fff82343b00) = -1 ENOENT (No such file or directory)\n10922 open(\"/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/objects/pack\", O_RDONLY|O_NONBLOCK|O_DIRECTORY) = 6\n10922 fstat(6, {st_mode=S_IFDIR|S_ISGID|0775, st_size=4096, ...}) = 0\n10922 fcntl(6, F_SETFD, FD_CLOEXEC)     = 0\n10922 getdents(6, /* 2 entries */, 4096) = 48\n10922 getdents(6, /* 0 entries */, 4096) = 0\n10922 close(6)                          = 0\n10922 open(\"/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/objects/info/alternates\", O_RDONLY) = -1 ENOENT (No such file or directory)\n10922 stat(\"/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/objects/1b/d44cb9d13204b0fe1958db0082f5028a16eb3a\", {st_mode=S_IFREG|0444, st_size=136, ...}) = 0\n10922 open(\"/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/objects/1b/d44cb9d13204b0fe1958db0082f5028a16eb3a\", O_RDONLY|O_NOATIME) = 6\n10922 mmap(NULL, 136, PROT_READ, MAP_PRIVATE, 6, 0) = 0x2ac028781000\n10922 close(6)                          = 0\n10922 munmap(0x2ac028781000, 136)       = 0\n10922 open(\"/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/info/grafts\", O_RDONLY) = -1 ENOENT (No such file or directory)\n10922 open(\"/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/shallow\", O_RDONLY) = -1 ENOENT (No such file or directory)\n10922 stat(\"/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/objects/df/2b8fc99e1c1d4dbc0a854d9f72157f1d6ea078\", {st_mode=S_IFREG|0444, st_size=49, ...}) = 0\n10922 open(\"/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/objects/df/2b8fc99e1c1d4dbc0a854d9f72157f1d6ea078\", O_RDONLY|O_NOATIME) = 6\n10922 mmap(NULL, 49, PROT_READ, MAP_PRIVATE, 6, 0) = 0x2ac028781000\n10922 close(6)                          = 0\n10922 brk(0x739000)                     = 0x739000\n10922 brk(0x736000)                     = 0x736000\n10922 munmap(0x2ac028781000, 49)        = 0\n10922 open(\"/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/index\", O_RDONLY) = 6\n10922 fstat(6, {st_mode=S_IFREG|0664, st_size=104, ...}) = 0\n10922 mmap(NULL, 104, PROT_READ|PROT_WRITE, MAP_PRIVATE, 6, 0) = 0x2ac028781000\n10922 close(6)                          = 0\n10922 munmap(0x2ac028781000, 104)       = 0\n10922 readlink(\"/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/index\", 0x7fff82342da0, 4096) = -1 EINVAL (Invalid argument)\n10922 open(\"/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/index.lock\", O_RDWR|O_CREAT|O_EXCL, 0666) = 6\n10922 rt_sigaction(SIGINT, {0x44bc70, [INT], SA_RESTORER|SA_RESTART, 0x2ac028e3b6a0}, {SIG_DFL}, 8) = 0\n10922 getpid()                          = 10922\n10922 lstat(\"elif\", {st_mode=S_IFREG|0664, st_size=0, ...}) = 0\n10922 lstat(\"elif\", {st_mode=S_IFREG|0664, st_size=0, ...}) = 0\n10922 lstat(\"elif\", {st_mode=S_IFREG|0664, st_size=0, ...}) = 0\n10922 write(6, \"DIRC\\0\\0\\0\\2\\0\\0\\0\\1G\\224S\\267\\0\\0\\0\\0G\\224S\\266\\0\\0\\0\"..., 104) = 104\n10922 close(6)                          = 0\n10922 readlink(\"/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/next-index-10922\", 0x7fff82342da0, 4096) = -1 ENOENT (No such file or directory)\n10922 open(\"/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/next-index-10922.lock\", O_RDWR|O_CREAT|O_EXCL, 0666) = 6\n10922 stat(\"/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/objects/1b/d44cb9d13204b0fe1958db0082f5028a16eb3a\", {st_mode=S_IFREG|0444, st_size=136, ...}) = 0\n10922 open(\"/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/objects/1b/d44cb9d13204b0fe1958db0082f5028a16eb3a\", O_RDONLY|O_NOATIME) = 7\n10922 mmap(NULL, 136, PROT_READ, MAP_PRIVATE, 7, 0) = 0x2ac028781000\n10922 close(7)                          = 0\n10922 munmap(0x2ac028781000, 136)       = 0\n10922 lstat(\"elif\", {st_mode=S_IFREG|0664, st_size=0, ...}) = 0\n10922 lstat(\"elif\", {st_mode=S_IFREG|0664, st_size=0, ...}) = 0\n10922 lstat(\"elif\", {st_mode=S_IFREG|0664, st_size=0, ...}) = 0\n10922 lstat(\"file\", 0x7fff82343c90)     = -1 ENOENT (No such file or directory)\n10922 write(6, \"DIRC\\0\\0\\0\\2\\0\\0\\0\\1\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\"..., 104) = 104\n10922 close(6)                          = 0\n10922 access(\"/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/hooks/pre-commit\", X_OK) = -1 ENOENT (No such file or directory)\n10922 open(\"/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/COMMIT_EDITMSG\", O_WRONLY|O_CREAT|O_TRUNC, 0666) = 6\n10922 fstat(6, {st_mode=S_IFREG|0664, st_size=0, ...}) = 0\n10922 mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x2ac028781000\n10922 write(6, \"Partial: add elif\\n\", 18) = 18\n10922 close(6)                          = 0\n10922 munmap(0x2ac028781000, 4096)      = 0\n10922 lstat(\"/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/HEAD\", {st_mode=S_IFREG|0664, st_size=23, ...}) = 0\n10922 open(\"/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/HEAD\", O_RDONLY) = 6\n10922 read(6, \"ref: refs/heads/master\\n\", 255) = 23\n10922 read(6, \"\", 232)                  = 0\n10922 close(6)                          = 0\n10922 lstat(\"/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/refs/heads/master\", {st_mode=S_IFREG|0664, st_size=41, ...}) = 0\n10922 open(\"/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/refs/heads/master\", O_RDONLY) = 6\n10922 read(6, \"1bd44cb9d13204b0fe1958db0082f502\"..., 255) = 41\n10922 read(6, \"\", 214)                  = 0\n10922 close(6)                          = 0\n10922 lstat(\"/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/refs/HEAD\", 0x7fff823438b0) = -1 ENOENT (No such file or directory)\n10922 lstat(\"/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/refs/tags/HEAD\", 0x7fff823438b0) = -1 ENOENT (No such file or directory)\n10922 lstat(\"/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/refs/heads/HEAD\", 0x7fff823438b0) = -1 ENOENT (No such file or directory)\n10922 lstat(\"/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/refs/remotes/HEAD\", 0x7fff823438b0) = -1 ENOENT (No such file or directory)\n10922 lstat(\"/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/refs/remotes/HEAD/HEAD\", 0x7fff823438b0) = -1 ENOENT (No such file or directory)\n10922 lstat(\"/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/HEAD\", {st_mode=S_IFREG|0664, st_size=23, ...}) = 0\n10922 open(\"/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/HEAD\", O_RDONLY) = 6\n10922 read(6, \"ref: refs/heads/master\\n\", 255) = 23\n10922 read(6, \"\", 232)                  = 0\n10922 close(6)                          = 0\n10922 lstat(\"/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/refs/heads/master\", {st_mode=S_IFREG|0664, st_size=41, ...}) = 0\n10922 open(\"/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/refs/heads/master\", O_RDONLY) = 6\n10922 read(6, \"1bd44cb9d13204b0fe1958db0082f502\"..., 255) = 41\n10922 read(6, \"\", 214)                  = 0\n10922 close(6)                          = 0\n10922 lstat(\"/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/refs/HEAD\", 0x7fff82343800) = -1 ENOENT (No such file or directory)\n10922 lstat(\"/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/refs/tags/HEAD\", 0x7fff82343800) = -1 ENOENT (No such file or directory)\n10922 lstat(\"/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/refs/heads/HEAD\", 0x7fff82343800) = -1 ENOENT (No such file or directory)\n10922 lstat(\"/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/refs/remotes/HEAD\", 0x7fff82343800) = -1 ENOENT (No such file or directory)\n10922 lstat(\"/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/refs/remotes/HEAD/HEAD\", 0x7fff82343800) = -1 ENOENT (No such file or directory)\n10922 stat(\"/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/objects/1b/d44cb9d13204b0fe1958db0082f5028a16eb3a\", {st_mode=S_IFREG|0444, st_size=136, ...}) = 0\n10922 open(\"/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/objects/1b/d44cb9d13204b0fe1958db0082f5028a16eb3a\", O_RDONLY|O_NOATIME) = 6\n10922 mmap(NULL, 136, PROT_READ, MAP_PRIVATE, 6, 0) = 0x2ac028781000\n10922 close(6)                          = 0\n10922 munmap(0x2ac028781000, 136)       = 0\n10922 stat(\"/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/objects/1b/d44cb9d13204b0fe1958db0082f5028a16eb3a\", {st_mode=S_IFREG|0444, st_size=136, ...}) = 0\n10922 open(\"/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/objects/1b/d44cb9d13204b0fe1958db0082f5028a16eb3a\", O_RDONLY|O_NOATIME) = 6\n10922 mmap(NULL, 136, PROT_READ, MAP_PRIVATE, 6, 0) = 0x2ac028781000\n10922 close(6)                          = 0\n10922 munmap(0x2ac028781000, 136)       = 0\n10922 open(\"/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/next-index-10922.lock\", O_RDONLY) = 6\n10922 fstat(6, {st_mode=S_IFREG|0664, st_size=104, ...}) = 0\n10922 mmap(NULL, 104, PROT_READ|PROT_WRITE, MAP_PRIVATE, 6, 0) = 0x2ac028781000\n10922 close(6)                          = 0\n10922 munmap(0x2ac028781000, 104)       = 0\n10922 stat(\"/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/objects/e6/9de29bb2d1d6434b8b29ae775ad8c2e48c5391\", {st_mode=S_IFREG|0444, st_size=15, ...}) = 0\n10922 stat(\"/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/objects/df/2b8fc99e1c1d4dbc0a854d9f72157f1d6ea078\", {st_mode=S_IFREG|0444, st_size=49, ...}) = 0\n10922 getuid()                          = 1012\n10922 socket(PF_FILE, SOCK_STREAM, 0)   = 6\n10922 fcntl(6, F_SETFL, O_RDWR|O_NONBLOCK) = 0\n10922 connect(6, {sa_family=AF_FILE, path=\"/var/run/nscd/socket\"}, 110) = -1 ENOENT (No such file or directory)\n10922 close(6)                          = 0\n10922 socket(PF_FILE, SOCK_STREAM, 0)   = 6\n10922 fcntl(6, F_SETFL, O_RDWR|O_NONBLOCK) = 0\n10922 connect(6, {sa_family=AF_FILE, path=\"/var/run/nscd/socket\"}, 110) = -1 ENOENT (No such file or directory)\n10922 close(6)                          = 0\n10922 open(\"/etc/nsswitch.conf\", O_RDONLY) = 6\n10922 fstat(6, {st_mode=S_IFREG|0644, st_size=465, ...}) = 0\n10922 mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x2ac028781000\n10922 read(6, \"# /etc/nsswitch.conf\\n#\\n# Example\"..., 4096) = 465\n10922 read(6, \"\", 4096)                 = 0\n10922 close(6)                          = 0\n10922 munmap(0x2ac028781000, 4096)      = 0\n10922 open(\"/etc/ld.so.cache\", O_RDONLY) = 6\n10922 fstat(6, {st_mode=S_IFREG|0644, st_size=70263, ...}) = 0\n10922 mmap(NULL, 70263, PROT_READ, MAP_PRIVATE, 6, 0) = 0x2ac028781000\n10922 close(6)                          = 0\n10922 access(\"/etc/ld.so.nohwcap\", F_OK) = -1 ENOENT (No such file or directory)\n10922 open(\"/lib/libnss_compat.so.2\", O_RDONLY) = 6\n10922 read(6, \"\\177ELF\\2\\1\\1\\0\\0\\0\\0\\0\\0\\0\\0\\0\\3\\0>\\0\\1\\0\\0\\0\\200\\23\\0\"..., 832) = 832\n10922 fstat(6, {st_mode=S_IFREG|0644, st_size=35632, ...}) = 0\n10922 mmap(NULL, 2131176, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 6, 0) = 0x2ac02a2ed000\n10922 mprotect(0x2ac02a2f4000, 2097152, PROT_NONE) = 0\n10922 mmap(0x2ac02a4f4000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 6, 0x7000) = 0x2ac02a4f4000\n10922 close(6)                          = 0\n10922 access(\"/etc/ld.so.nohwcap\", F_OK) = -1 ENOENT (No such file or directory)\n10922 open(\"/lib/libnsl.so.1\", O_RDONLY) = 6\n10922 read(6, \"\\177ELF\\2\\1\\1\\0\\0\\0\\0\\0\\0\\0\\0\\0\\3\\0>\\0\\1\\0\\0\\0\\0A\\0\\0\\0\"..., 832) = 832\n10922 fstat(6, {st_mode=S_IFREG|0644, st_size=93088, ...}) = 0\n10922 mmap(NULL, 2198224, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 6, 0) = 0x2ac02a4f6000\n10922 mprotect(0x2ac02a50b000, 2097152, PROT_NONE) = 0\n10922 mmap(0x2ac02a70b000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 6, 0x15000) = 0x2ac02a70b000\n10922 mmap(0x2ac02a70d000, 6864, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x2ac02a70d000\n10922 close(6)                          = 0\n10922 munmap(0x2ac028781000, 70263)     = 0\n10922 open(\"/etc/ld.so.cache\", O_RDONLY) = 6\n10922 fstat(6, {st_mode=S_IFREG|0644, st_size=70263, ...}) = 0\n10922 mmap(NULL, 70263, PROT_READ, MAP_PRIVATE, 6, 0) = 0x2ac028781000\n10922 close(6)                          = 0\n10922 access(\"/etc/ld.so.nohwcap\", F_OK) = -1 ENOENT (No such file or directory)\n10922 open(\"/lib/libnss_nis.so.2\", O_RDONLY) = 6\n10922 read(6, \"\\177ELF\\2\\1\\1\\0\\0\\0\\0\\0\\0\\0\\0\\0\\3\\0>\\0\\1\\0\\0\\0000 \\0\\0\"..., 832) = 832\n10922 fstat(6, {st_mode=S_IFREG|0644, st_size=43480, ...}) = 0\n10922 mmap(NULL, 2139352, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 6, 0) = 0x2ac02a70f000\n10922 mprotect(0x2ac02a719000, 2093056, PROT_NONE) = 0\n10922 mmap(0x2ac02a918000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 6, 0x9000) = 0x2ac02a918000\n10922 close(6)                          = 0\n10922 access(\"/etc/ld.so.nohwcap\", F_OK) = -1 ENOENT (No such file or directory)\n10922 open(\"/lib/libnss_files.so.2\", O_RDONLY) = 6\n10922 read(6, \"\\177ELF\\2\\1\\1\\0\\0\\0\\0\\0\\0\\0\\0\\0\\3\\0>\\0\\1\\0\\0\\0P \\0\\0\\0\"..., 832) = 832\n10922 fstat(6, {st_mode=S_IFREG|0644, st_size=43448, ...}) = 0\n10922 mmap(NULL, 2139464, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 6, 0) = 0x2ac02a91a000\n10922 mprotect(0x2ac02a924000, 2093056, PROT_NONE) = 0\n10922 mmap(0x2ac02ab23000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 6, 0x9000) = 0x2ac02ab23000\n10922 close(6)                          = 0\n10922 munmap(0x2ac028781000, 70263)     = 0\n10922 open(\"/etc/passwd\", O_RDONLY)     = 6\n10922 fcntl(6, F_GETFD)                 = 0\n10922 fcntl(6, F_SETFD, FD_CLOEXEC)     = 0\n10922 lseek(6, 0, SEEK_CUR)             = 0\n10922 fstat(6, {st_mode=S_IFREG|0644, st_size=1663, ...}) = 0\n10922 mmap(NULL, 1663, PROT_READ, MAP_SHARED, 6, 0) = 0x2ac028781000\n10922 lseek(6, 1663, SEEK_SET)          = 1663\n10922 munmap(0x2ac028781000, 1663)      = 0\n10922 close(6)                          = 0\n10922 uname({sys=\"Linux\", node=\"gitster\", ...}) = 0\n10922 open(\"/etc/resolv.conf\", O_RDONLY) = 6\n10922 fstat(6, {st_mode=S_IFREG|0644, st_size=44, ...}) = 0\n10922 mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x2ac028781000\n10922 read(6, \"search pv.oc.cox.net\\nnameserver \"..., 4096) = 44\n10922 read(6, \"\", 4096)                 = 0\n10922 close(6)                          = 0\n10922 munmap(0x2ac028781000, 4096)      = 0\n10922 stat(\"/etc/resolv.conf\", {st_mode=S_IFREG|0644, st_size=44, ...}) = 0\n10922 open(\"/etc/resolv.conf\", O_RDONLY) = 6\n10922 fstat(6, {st_mode=S_IFREG|0644, st_size=44, ...}) = 0\n10922 mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x2ac028781000\n10922 read(6, \"search pv.oc.cox.net\\nnameserver \"..., 4096) = 44\n10922 read(6, \"\", 4096)                 = 0\n10922 close(6)                          = 0\n10922 munmap(0x2ac028781000, 4096)      = 0\n10922 socket(PF_FILE, SOCK_STREAM, 0)   = 6\n10922 fcntl(6, F_SETFL, O_RDWR|O_NONBLOCK) = 0\n10922 connect(6, {sa_family=AF_FILE, path=\"/var/run/nscd/socket\"}, 110) = -1 ENOENT (No such file or directory)\n10922 close(6)                          = 0\n10922 socket(PF_FILE, SOCK_STREAM, 0)   = 6\n10922 fcntl(6, F_SETFL, O_RDWR|O_NONBLOCK) = 0\n10922 connect(6, {sa_family=AF_FILE, path=\"/var/run/nscd/socket\"}, 110) = -1 ENOENT (No such file or directory)\n10922 close(6)                          = 0\n10922 open(\"/etc/host.conf\", O_RDONLY)  = 6\n10922 fstat(6, {st_mode=S_IFREG|0644, st_size=9, ...}) = 0\n10922 mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x2ac028781000\n10922 read(6, \"multi on\\n\", 4096)       = 9\n10922 read(6, \"\", 4096)                 = 0\n10922 close(6)                          = 0\n10922 munmap(0x2ac028781000, 4096)      = 0\n10922 open(\"/etc/hosts\", O_RDONLY)      = 6\n10922 fcntl(6, F_GETFD)                 = 0\n10922 fcntl(6, F_SETFD, FD_CLOEXEC)     = 0\n10922 fstat(6, {st_mode=S_IFREG|0644, st_size=570, ...}) = 0\n10922 mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x2ac028781000\n10922 read(6, \"127.0.0.1\\tlocalhost\\n#127.0.1.1\\tg\"..., 4096) = 570\n10922 read(6, \"\", 4096)                 = 0\n10922 close(6)                          = 0\n10922 munmap(0x2ac028781000, 4096)      = 0\n10922 gettimeofday({1200903095, 36084}, NULL) = 0\n10922 open(\"/usr/share/zoneinfo/UTC\", O_RDONLY) = 6\n10922 fstat(6, {st_mode=S_IFREG|0644, st_size=118, ...}) = 0\n10922 fstat(6, {st_mode=S_IFREG|0644, st_size=118, ...}) = 0\n10922 mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x2ac028781000\n10922 read(6, \"TZif2\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\1\\0\\0\\0\\1\\0\\0\"..., 4096) = 118\n10922 lseek(6, -62, SEEK_CUR)           = 56\n10922 read(6, \"TZif2\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\0\\1\\0\\0\\0\\1\\0\\0\"..., 4096) = 62\n10922 close(6)                          = 0\n10922 munmap(0x2ac028781000, 4096)      = 0\n10922 access(\"/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/hooks/commit-msg\", X_OK) = -1 ENOENT (No such file or directory)\n10922 open(\"/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/COMMIT_EDITMSG\", O_RDONLY) = 6\n10922 read(6, \"Partial: add elif\\n\", 8192) = 18\n10922 read(6, \"\", 12400)                = 0\n10922 close(6)                          = 0\n10922 stat(\"/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/objects/94/5b990ce4a77ccd314fbc9b33c5959023a92714\", 0x7fff82343ce0) = -1 ENOENT (No such file or directory)\n10922 open(\"/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/objects/94/5b990ce4a77ccd314fbc9b33c5959023a92714\", O_RDONLY) = -1 ENOENT (No such file or directory)\n10922 gettimeofday({1200903095, 36797}, NULL) = 0\n10922 open(\"/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/objects/tmp_obj_bX9DDU\", O_RDWR|O_CREAT|O_EXCL, 0600) = 6\n10922 brk(0x75c000)                     = 0x75c000\n10922 brk(0x74c000)                     = 0x74c000\n10922 brk(0x73c000)                     = 0x73c000\n10922 brk(0x73b000)                     = 0x73b000\n10922 write(6, \"x\\1\\205\\316Aj\\0031\\f\\205\\341\\254}\\n]\\240A\\322\\330\\31;\\204\"..., 176) = 176\n10922 fchmod(6, 0444)                   = 0\n10922 close(6)                          = 0\n10922 link(\"/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/objects/tmp_obj_bX9DDU\", \"/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/objects/94/5b990ce4a77ccd314fbc9b33c5959023a92714\") = -1 ENOENT (No such file or directory)\n10922 mkdir(\"/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/objects/94\", 0777) = 0\n10922 link(\"/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/objects/tmp_obj_bX9DDU\", \"/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/objects/94/5b990ce4a77ccd314fbc9b33c5959023a92714\") = 0\n10922 unlink(\"/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/objects/tmp_obj_bX9DDU\") = 0\n10922 lstat(\"/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/HEAD\", {st_mode=S_IFREG|0664, st_size=23, ...}) = 0\n10922 open(\"/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/HEAD\", O_RDONLY) = 6\n10922 read(6, \"ref: refs/heads/master\\n\", 255) = 23\n10922 read(6, \"\", 232)                  = 0\n10922 close(6)                          = 0\n10922 lstat(\"/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/refs/heads/master\", {st_mode=S_IFREG|0664, st_size=41, ...}) = 0\n10922 open(\"/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/refs/heads/master\", O_RDONLY) = 6\n10922 read(6, \"1bd44cb9d13204b0fe1958db0082f502\"..., 255) = 41\n10922 read(6, \"\", 214)                  = 0\n10922 close(6)                          = 0\n10922 lstat(\"/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/refs/heads/master\", {st_mode=S_IFREG|0664, st_size=41, ...}) = 0\n10922 stat(\"/opt\", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0\n10922 stat(\"/opt/packrat\", {st_mode=S_IFDIR|S_ISGID|0775, st_size=4096, ...}) = 0\n10922 stat(\"/opt/packrat/playpen\", {st_mode=S_IFDIR|S_ISGID|0775, st_size=4096, ...}) = 0\n10922 stat(\"/opt/packrat/playpen/public\", {st_mode=S_IFDIR|S_ISGID|0755, st_size=4096, ...}) = 0\n10922 stat(\"/opt/packrat/playpen/public/in-place\", {st_mode=S_IFDIR|S_ISGID|0755, st_size=4096, ...}) = 0\n10922 stat(\"/opt/packrat/playpen/public/in-place/git\", {st_mode=S_IFDIR|S_ISGID|0775, st_size=4096, ...}) = 0\n10922 stat(\"/opt/packrat/playpen/public/in-place/git/git.junio\", {st_mode=S_IFDIR|S_ISGID|0775, st_size=98304, ...}) = 0\n10922 stat(\"/opt/packrat/playpen/public/in-place/git/git.junio/t\", {st_mode=S_IFDIR|S_ISGID|0775, st_size=8192, ...}) = 0\n10922 stat(\"/opt/packrat/playpen/public/in-place/git/git.junio/t/trash\", {st_mode=S_IFDIR|S_ISGID|0775, st_size=4096, ...}) = 0\n10922 stat(\"/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git\", {st_mode=S_IFDIR|S_ISGID|0775, st_size=4096, ...}) = 0\n10922 stat(\"/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/refs\", {st_mode=S_IFDIR|S_ISGID|0775, st_size=4096, ...}) = 0\n10922 stat(\"/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/refs/heads\", {st_mode=S_IFDIR|S_ISGID|0775, st_size=4096, ...}) = 0\n10922 readlink(\"/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/refs/heads/master\", 0x7fff82342d80, 4096) = -1 EINVAL (Invalid argument)\n10922 open(\"/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/refs/heads/master.lock\", O_RDWR|O_CREAT|O_EXCL, 0666) = 6\n10922 lstat(\"/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/refs/heads/master\", {st_mode=S_IFREG|0664, st_size=41, ...}) = 0\n10922 open(\"/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/refs/heads/master\", O_RDONLY) = 7\n10922 read(7, \"1bd44cb9d13204b0fe1958db0082f502\"..., 255) = 41\n10922 read(7, \"\", 214)                  = 0\n10922 close(7)                          = 0\n10922 stat(\"/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/objects/94/5b990ce4a77ccd314fbc9b33c5959023a92714\", {st_mode=S_IFREG|0444, st_size=176, ...}) = 0\n10922 open(\"/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/objects/94/5b990ce4a77ccd314fbc9b33c5959023a92714\", O_RDONLY|O_NOATIME) = 7\n10922 mmap(NULL, 176, PROT_READ, MAP_PRIVATE, 7, 0) = 0x2ac028781000\n10922 close(7)                          = 0\n10922 munmap(0x2ac028781000, 176)       = 0\n10922 write(6, \"945b990ce4a77ccd314fbc9b33c59590\"..., 40) = 40\n10922 write(6, \"\\n\", 1)                 = 1\n10922 close(6)                          = 0\n10922 stat(\"/opt\", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0\n10922 stat(\"/opt/packrat\", {st_mode=S_IFDIR|S_ISGID|0775, st_size=4096, ...}) = 0\n10922 stat(\"/opt/packrat/playpen\", {st_mode=S_IFDIR|S_ISGID|0775, st_size=4096, ...}) = 0\n10922 stat(\"/opt/packrat/playpen/public\", {st_mode=S_IFDIR|S_ISGID|0755, st_size=4096, ...}) = 0\n10922 stat(\"/opt/packrat/playpen/public/in-place\", {st_mode=S_IFDIR|S_ISGID|0755, st_size=4096, ...}) = 0\n10922 stat(\"/opt/packrat/playpen/public/in-place/git\", {st_mode=S_IFDIR|S_ISGID|0775, st_size=4096, ...}) = 0\n10922 stat(\"/opt/packrat/playpen/public/in-place/git/git.junio\", {st_mode=S_IFDIR|S_ISGID|0775, st_size=98304, ...}) = 0\n10922 stat(\"/opt/packrat/playpen/public/in-place/git/git.junio/t\", {st_mode=S_IFDIR|S_ISGID|0775, st_size=8192, ...}) = 0\n10922 stat(\"/opt/packrat/playpen/public/in-place/git/git.junio/t/trash\", {st_mode=S_IFDIR|S_ISGID|0775, st_size=4096, ...}) = 0\n10922 stat(\"/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git\", {st_mode=S_IFDIR|S_ISGID|0775, st_size=4096, ...}) = 0\n10922 stat(\"/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/logs\", {st_mode=S_IFDIR|S_ISGID|0775, st_size=4096, ...}) = 0\n10922 stat(\"/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/logs/refs\", {st_mode=S_IFDIR|S_ISGID|0775, st_size=4096, ...}) = 0\n10922 stat(\"/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/logs/refs/heads\", {st_mode=S_IFDIR|S_ISGID|0775, st_size=4096, ...}) = 0\n10922 open(\"/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/logs/refs/heads/master\", O_WRONLY|O_APPEND|O_CREAT, 0666) = 6\n10922 write(6, \"1bd44cb9d13204b0fe1958db0082f502\"..., 160) = 160\n10922 close(6)                          = 0\n10922 stat(\"/opt\", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0\n10922 stat(\"/opt/packrat\", {st_mode=S_IFDIR|S_ISGID|0775, st_size=4096, ...}) = 0\n10922 stat(\"/opt/packrat/playpen\", {st_mode=S_IFDIR|S_ISGID|0775, st_size=4096, ...}) = 0\n10922 stat(\"/opt/packrat/playpen/public\", {st_mode=S_IFDIR|S_ISGID|0755, st_size=4096, ...}) = 0\n10922 stat(\"/opt/packrat/playpen/public/in-place\", {st_mode=S_IFDIR|S_ISGID|0755, st_size=4096, ...}) = 0\n10922 stat(\"/opt/packrat/playpen/public/in-place/git\", {st_mode=S_IFDIR|S_ISGID|0775, st_size=4096, ...}) = 0\n10922 stat(\"/opt/packrat/playpen/public/in-place/git/git.junio\", {st_mode=S_IFDIR|S_ISGID|0775, st_size=98304, ...}) = 0\n10922 stat(\"/opt/packrat/playpen/public/in-place/git/git.junio/t\", {st_mode=S_IFDIR|S_ISGID|0775, st_size=8192, ...}) = 0\n10922 stat(\"/opt/packrat/playpen/public/in-place/git/git.junio/t/trash\", {st_mode=S_IFDIR|S_ISGID|0775, st_size=4096, ...}) = 0\n10922 stat(\"/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git\", {st_mode=S_IFDIR|S_ISGID|0775, st_size=4096, ...}) = 0\n10922 stat(\"/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/logs\", {st_mode=S_IFDIR|S_ISGID|0775, st_size=4096, ...}) = 0\n10922 open(\"/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/logs/HEAD\", O_WRONLY|O_APPEND|O_CREAT, 0666) = 6\n10922 write(6, \"1bd44cb9d13204b0fe1958db0082f502\"..., 160) = 160\n10922 close(6)                          = 0\n10922 rename(\"/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/refs/heads/master.lock\", \"/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/refs/heads/master\") = 0\n10922 unlink(\"/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/MERGE_HEAD\") = -1 ENOENT (No such file or directory)\n10922 unlink(\"/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/MERGE_MSG\") = -1 ENOENT (No such file or directory)\n10922 rename(\"/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/index.lock\", \"/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/index\") = 0\n10922 unlink(\"/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/next-index-10922.lock\") = 0\n10922 open(\".git/config\", O_RDONLY)     = 6\n10922 fstat(6, {st_mode=S_IFREG|0664, st_size=92, ...}) = 0\n10922 mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x2ac028781000\n10922 read(6, \"[core]\\n\\trepositoryformatversion \"..., 4096) = 92\n10922 read(6, \"\", 4096)                 = 0\n10922 close(6)                          = 0\n10922 munmap(0x2ac028781000, 4096)      = 0\n10922 stat(\"/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/rr-cache\", 0x7fff82343da0) = -1 ENOENT (No such file or directory)\n10922 access(\"/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/hooks/post-commit\", X_OK) = -1 ENOENT (No such file or directory)\n10922 fstat(1, {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 6), ...}) = 0\n10922 mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x2ac028781000\n10922 stat(\"/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/objects/1b/d44cb9d13204b0fe1958db0082f5028a16eb3a\", {st_mode=S_IFREG|0444, st_size=136, ...}) = 0\n10922 open(\"/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/objects/1b/d44cb9d13204b0fe1958db0082f5028a16eb3a\", O_RDONLY|O_NOATIME) = 6\n10922 mmap(NULL, 136, PROT_READ, MAP_PRIVATE, 6, 0) = 0x2ac028782000\n10922 close(6)                          = 0\n10922 munmap(0x2ac028782000, 136)       = 0\n10922 stat(\"/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/objects/df/2b8fc99e1c1d4dbc0a854d9f72157f1d6ea078\", {st_mode=S_IFREG|0444, st_size=49, ...}) = 0\n10922 open(\"/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/objects/df/2b8fc99e1c1d4dbc0a854d9f72157f1d6ea078\", O_RDONLY|O_NOATIME) = 6\n10922 mmap(NULL, 49, PROT_READ, MAP_PRIVATE, 6, 0) = 0x2ac028782000\n10922 close(6)                          = 0\n10922 munmap(0x2ac028782000, 49)        = 0\n10922 stat(\"/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/objects/94/5b990ce4a77ccd314fbc9b33c5959023a92714\", {st_mode=S_IFREG|0444, st_size=176, ...}) = 0\n10922 open(\"/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/objects/94/5b990ce4a77ccd314fbc9b33c5959023a92714\", O_RDONLY|O_NOATIME) = 6\n10922 mmap(NULL, 176, PROT_READ, MAP_PRIVATE, 6, 0) = 0x2ac028782000\n10922 close(6)                          = 0\n10922 munmap(0x2ac028782000, 176)       = 0\n10922 stat(\"/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/objects/df/2b8fc99e1c1d4dbc0a854d9f72157f1d6ea078\", {st_mode=S_IFREG|0444, st_size=49, ...}) = 0\n10922 open(\"/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/objects/df/2b8fc99e1c1d4dbc0a854d9f72157f1d6ea078\", O_RDONLY|O_NOATIME) = 6\n10922 mmap(NULL, 49, PROT_READ, MAP_PRIVATE, 6, 0) = 0x2ac028782000\n10922 close(6)                          = 0\n10922 munmap(0x2ac028782000, 49)        = 0\n10922 fstat(1, {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 6), ...}) = 0\n10922 write(1, \"Created commit \", 15)   = 15\n10922 open(\"/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/objects/94/\", O_RDONLY|O_NONBLOCK|O_DIRECTORY) = 6\n10922 fstat(6, {st_mode=S_IFDIR|S_ISGID|0775, st_size=4096, ...}) = 0\n10922 fcntl(6, F_SETFD, FD_CLOEXEC)     = 0\n10922 getdents(6, /* 3 entries */, 4096) = 112\n10922 getdents(6, /* 0 entries */, 4096) = 0\n10922 close(6)                          = 0\n10922 write(1, \"945b990: Partial: add elif\\n\", 27) = 27\n10922 fstat(1, {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 6), ...}) = 0\n10922 close(1)                          = 0\n10922 munmap(0x2ac028781000, 4096)      = 0\n10922 exit_group(0)                     = ?\n"},{"id":"66100","messageId":"7v4pd71sal.fsf_-_@gitster.siamese.dyndns.org","threadId":"11573","inReplyTo":"7v8x2j1sul.fsf@gitster.siamese.dyndns.org","subject":"[PATCH 1/2] read-cache.c: introduce is_racy_timestamp() helper","fromName":"Junio C Hamano","fromEmail":"gitster@pobox.com","sentAt":"2008-01-21T08:44:50Z","receivedAt":"2008-01-21T08:44:50Z","isPatch":true,"sender":{"key":"gitster@pobox.com","avatar":"https://avatars.githubusercontent.com/u/54884?v=4"},"body":"This just moves a common boolean expression into a helper function.\n\nSigned-off-by: Junio C Hamano <gitster@pobox.com>\n---\n read-cache.c |   13 ++++++++-----\n 1 files changed, 8 insertions(+), 5 deletions(-)\n\ndiff --git a/read-cache.c b/read-cache.c\nindex f5f9c3d..9554896 100644\n--- a/read-cache.c\n+++ b/read-cache.c\n@@ -177,6 +177,12 @@ static int ce_match_stat_basic(struct cache_entry *ce, struct stat *st)\n \treturn changed;\n }\n \n+static int is_racy_timestamp(struct index_state *istate, struct cache_entry *ce)\n+{\n+\treturn (istate->timestamp &&\n+\t\tistate->timestamp <= ce->ce_mtime);\n+}\n+\n int ie_match_stat(struct index_state *istate,\n \t\t  struct cache_entry *ce, struct stat *st,\n \t\t  unsigned int options)\n@@ -210,9 +216,7 @@ int ie_match_stat(struct index_state *istate,\n \t * whose mtime are the same as the index file timestamp more\n \t * carefully than others.\n \t */\n-\tif (!changed &&\n-\t    istate->timestamp &&\n-\t    istate->timestamp <= ce->ce_mtime) {\n+\tif (!changed && is_racy_timestamp(istate, ce)) {\n \t\tif (assume_racy_is_modified)\n \t\t\tchanged |= DATA_CHANGED;\n \t\telse\n@@ -1207,8 +1211,7 @@ int write_index(struct index_state *istate, int newfd)\n \t\tstruct cache_entry *ce = cache[i];\n \t\tif (ce->ce_flags & CE_REMOVE)\n \t\t\tcontinue;\n-\t\tif (istate->timestamp &&\n-\t\t    istate->timestamp <= ce->ce_mtime)\n+\t\tif (is_racy_timestamp(istate, ce))\n \t\t\tce_smudge_racily_clean_entry(ce);\n \t\tif (ce_write_entry(&c, newfd, ce) < 0)\n \t\t\treturn -1;\n-- \n1.5.4.rc4.5.g36a1\n"},{"id":"66101","messageId":"7vzluzzhud.fsf_-_@gitster.siamese.dyndns.org","threadId":"11573","inReplyTo":"7v8x2j1sul.fsf@gitster.siamese.dyndns.org","subject":"[PATCH 2/2] read-cache.c: fix timestamp comparison","fromName":"Junio C Hamano","fromEmail":"gitster@pobox.com","sentAt":"2008-01-21T08:46:34Z","receivedAt":"2008-01-21T08:46:34Z","isPatch":true,"sender":{"key":"gitster@pobox.com","avatar":"https://avatars.githubusercontent.com/u/54884?v=4"},"body":"The mtime recorded in the cache entry is not time_t anymore but\nof type (unsigned int).  This casts the comparison and also adds\nfuzz factor of 1 second.\n\nSigned-off-by: Junio C Hamano <gitster@pobox.com>\n---\n\n * With these two patches the t7501 Heisenbug seems to go away.\n   I do not understand why this fuzz factor of 1 second helps,\n   but it apparently does.  I do not want to commit this before\n   I understand why, but it is past my bedtime.\n\n read-cache.c |    2 +-\n 1 files changed, 1 insertions(+), 1 deletions(-)\n\ndiff --git a/read-cache.c b/read-cache.c\nindex 9554896..745c3fe 100644\n--- a/read-cache.c\n+++ b/read-cache.c\n@@ -180,7 +180,7 @@ static int ce_match_stat_basic(struct cache_entry *ce, struct stat *st)\n static int is_racy_timestamp(struct index_state *istate, struct cache_entry *ce)\n {\n \treturn (istate->timestamp &&\n-\t\tistate->timestamp <= ce->ce_mtime);\n+\t\t((unsigned int) istate->timestamp) <= ce->ce_mtime + 1);\n }\n \n int ie_match_stat(struct index_state *istate,\n-- \n1.5.4.rc4.5.g36a1\n"},{"id":"66115","messageId":"alpine.LSU.1.00.0801211034040.5731@racer.site","threadId":"11573","inReplyTo":"20080121044632.GH24004@spearce.org","subject":"Re: What's not in 'master', and likely not to be until 1.5.4","fromName":"Johannes Schindelin","fromEmail":"johannes.schindelin@gmx.de","sentAt":"2008-01-21T10:37:23Z","receivedAt":"2008-01-21T10:37:23Z","isPatch":false,"sender":{"key":"johannes.schindelin@gmx.de","avatar":"https://avatars.githubusercontent.com/u/127790?v=4"},"body":"Hi,\n\nOn Sun, 20 Jan 2008, Shawn O. Pearce wrote:\n\n> Johannes Schindelin <Johannes.Schindelin@gmx.de> wrote:\n> > [PATCH] Fall back to po2msg when msgfmt is unavailable\n> > \n> > diff --git a/git-gui/Makefile b/git-gui/Makefile\n> > index c109eab..c7921e7 100644\n> > --- a/git-gui/Makefile\n> > +++ b/git-gui/Makefile\n> > @@ -210,7 +211,8 @@ $(PO_TEMPLATE): $(SCRIPT_SH) $(ALL_LIBFILES)\n> >  update-po:: $(PO_TEMPLATE)\n> >  \t$(foreach p, $(ALL_POFILES), echo Updating $p ; msgmerge -U $p $(PO_TEMPLATE) ; )\n> >  $(ALL_MSGFILES): %.msg : %.po\n> > -\t$(QUIET_MSGFMT0)$(MSGFMT) --statistics --tcl -l $(basename $(notdir $<)) -d $(dir $@) $< $(QUIET_MSGFMT1)\n> > +\t$(QUIET_MSGFMT0)$(MSGFMT) --statistics --tcl -l $(basename $(notdir $<)) -d $(dir $@) $< $(QUIET_MSGFMT1) || \\\n> > +\t$(QUIET_MSGFMT0)$(PO2MSG) --statistics --tcl -l $(basename $(notdir $<)) -d $(dir $@) $< $(QUIET_MSGFMT1)\n> \n> That will cause the QUIET_MSGFMT0 script to echo twice; once when we try \n> to run msgfmt and again when we fallback to po2msg.\n> \n> That messes with the user's display and won't look very nice coming out \n> of a supposedly quiet make.\n> \n> In other words this is probably better:\n> \n> +\t$(QUIET_MSGFMT0)($(MSGFMT) --statistics --tcl -l $(basename $(notdir $<)) -d $(dir $@) $< || \\\n> +\t$(PO2MSG) --statistics --tcl -l $(basename $(notdir $<)) -d $(dir $@) $< )$(QUIET_MSGFMT1)\n> \n> But it is a lot uglier to read, and I tend to not like subshells.\n\nIt was exactly this ugliness which made me not do it.\n\nNote: There might be yet a better way.  Instead of trying each and every \ntime, we could detect the presence of msgfmt with something like this:\n\n+ifeq $(shell msgfmt2 2>/dev/null >/dev/null; echo $?) = 127\n+\tMSGFMT = $(TCL_PATH) po/po2msg.sh\n+endif\n\nThis is not tested, yet, tough,\n\nCiao,\nDscho\n"},{"id":"66165","messageId":"alpine.LFD.1.00.0801211022350.2957@woody.linux-foundation.org","threadId":"11573","inReplyTo":"7vzluzzhud.fsf_-_@gitster.siamese.dyndns.org","subject":"Re: [PATCH 2/2] read-cache.c: fix timestamp comparison","fromName":"Linus Torvalds","fromEmail":"torvalds@linux-foundation.org","sentAt":"2008-01-21T18:47:04Z","receivedAt":"2008-01-21T18:47:04Z","isPatch":true,"sender":{"key":"torvalds@linux-foundation.org","avatar":"https://avatars.githubusercontent.com/u/1024025?v=4"},"body":"\n\nOn Mon, 21 Jan 2008, Junio C Hamano wrote:\n>\n> The mtime recorded in the cache entry is not time_t anymore but\n> of type (unsigned int).  This casts the comparison and also adds\n> fuzz factor of 1 second.\n\nI really don't think this is the right fix.\n\nThe real problem seems to be that the whole \"racy_timestamp()\" thing \n*hides* the bug, and your change actually makes racy_timestamp() just hide \nthings even more (by making it trigger all the time).\n\nAdding a \"sleep 1\" to your test-case (appended) actually makes it fail \nreliably (without your hack - with your \"+1\" hack I assume you'd need to \nmake the sleep longer).\n\nSo the problem is that the test-suite actually *hid* the bug by doing \nthigns so fast that the racy code triggered, and that in turn somehow \nfixed things up. \n\nWill experiment more now that I have a case that reliably fails. The \ncommit that causes this literally shouldn't have caused any semantic \nchanges at all, so this is rather interesting.\n\n\t\tLinus\n\n---\n#!/bin/sh\n\ntest_description='reduced 7501'\n\n. ./test-lib.sh\n\ntest_expect_success setup '\n\n        >file &&\n        git add file &&\n        test_tick &&\n        git commit -m initial\n\n'\n\nif test -f ../trace.log\nthen\n        mv ../trace.log ../trace.log.old\nfi\n\ntest_expect_success 'partial commit that involves removal (1)' '\n\n        test_tick &&\n        git rm --cached file &&\n        mv file elif &&\n\tsleep 1 &&\n        git add elif &&\n\tsleep 1 &&\n\n        strace -v -o ../trace.log git commit -m \"Partial: add elif\" elif &&\n\n        git diff-tree --name-status HEAD^ HEAD >current &&\n        echo \"A\telif\" >expected &&\n        diff expected current\n\n'\n\ntest_done\n"},{"id":"66167","messageId":"alpine.LSU.1.00.0801211905100.5731@racer.site","threadId":"11573","inReplyTo":"alpine.LFD.1.00.0801211022350.2957@woody.linux-foundation.org","subject":"Re: [PATCH 2/2] read-cache.c: fix timestamp comparison","fromName":"Johannes Schindelin","fromEmail":"johannes.schindelin@gmx.de","sentAt":"2008-01-21T19:06:14Z","receivedAt":"2008-01-21T19:06:14Z","isPatch":true,"sender":{"key":"johannes.schindelin@gmx.de","avatar":"https://avatars.githubusercontent.com/u/127790?v=4"},"body":"Hi,\n\nOn Mon, 21 Jan 2008, Linus Torvalds wrote:\n\n> On Mon, 21 Jan 2008, Junio C Hamano wrote:\n> >\n> > The mtime recorded in the cache entry is not time_t anymore but of \n> > type (unsigned int).  This casts the comparison and also adds fuzz \n> > factor of 1 second.\n> \n> I really don't think this is the right fix.\n\nJunio, have you tried Hannes' fix (using ln instead of cp -p)?  I would \nnot be surprised if the same happened on Linux as on Windows, only much \nrarer, since Linux is so darned fast...\n\nCiao,\nDscho\n"},{"id":"66169","messageId":"alpine.LFD.1.00.0801211104590.2957@woody.linux-foundation.org","threadId":"11573","inReplyTo":"alpine.LFD.1.00.0801211022350.2957@woody.linux-foundation.org","subject":"Re: [PATCH 2/2] read-cache.c: fix timestamp comparison","fromName":"Linus Torvalds","fromEmail":"torvalds@linux-foundation.org","sentAt":"2008-01-21T19:09:44Z","receivedAt":"2008-01-21T19:09:44Z","isPatch":true,"sender":{"key":"torvalds@linux-foundation.org","avatar":"https://avatars.githubusercontent.com/u/1024025?v=4"},"body":"\n\nOn Mon, 21 Jan 2008, Linus Torvalds wrote:\n> \n> Will experiment more now that I have a case that reliably fails. The \n> commit that causes this literally shouldn't have caused any semantic \n> changes at all, so this is rather interesting.\n\nIntriguing. It's the \"ce_mode\" -> CE_REMOVE changes that trigger this bug.\n\nThe problem goes away with this one-liner.\n\nI haven't figured out *why*, yet, but the reason I checked CE_REMOVE was \nthat it was the only part that wasn't just a pure network order change.\n\nI suspect we have some code-path that didn't check for explicit removal, \nbut that happened to check for \"mode doesn't match\", so clearing ce_mode \njust magically triggered it.\n\nStill looking.\n\n\t\tLinus\n\n---\ndiff --git a/unpack-trees.c b/unpack-trees.c\nindex ff46fd6..d6fcf60 100644\n--- a/unpack-trees.c\n+++ b/unpack-trees.c\n@@ -613,6 +613,7 @@ static int deleted_entry(struct cache_entry *ce, struct cache_entry *old,\n \telse\n \t\tverify_absent(ce, \"removed\", o);\n \tce->ce_flags |= CE_REMOVE;\n+\tce->ce_mode = 0;\n \tadd_cache_entry(ce, ADD_CACHE_OK_TO_ADD|ADD_CACHE_OK_TO_REPLACE);\n \tinvalidate_ce_path(ce);\n \treturn 1;\n"},{"id":"66172","messageId":"alpine.LFD.1.00.0801211120350.2957@woody.linux-foundation.org","threadId":"11573","inReplyTo":"alpine.LFD.1.00.0801211104590.2957@woody.linux-foundation.org","subject":"Re: [PATCH 2/2] read-cache.c: fix timestamp comparison","fromName":"Linus Torvalds","fromEmail":"torvalds@linux-foundation.org","sentAt":"2008-01-21T19:24:13Z","receivedAt":"2008-01-21T19:24:13Z","isPatch":true,"sender":{"key":"torvalds@linux-foundation.org","avatar":"https://avatars.githubusercontent.com/u/1024025?v=4"},"body":"\n\nOn Mon, 21 Jan 2008, Linus Torvalds wrote:\n> \n> Still looking.\n\nDamn.\n\nThe comment that I also  moved says it all.\n\nI'd forgotten about that really ugly special case. It's no longer ugly, \nbut missing that part of the ce_mode handling cleanup certainly explains \nthe test-suite failing.\n\n\t\tLinus\n\n---\n read-cache.c |    6 ++++--\n 1 files changed, 4 insertions(+), 2 deletions(-)\n\ndiff --git a/read-cache.c b/read-cache.c\nindex f5f9c3d..58a9b95 100644\n--- a/read-cache.c\n+++ b/read-cache.c\n@@ -124,6 +124,9 @@ static int ce_match_stat_basic(struct cache_entry *ce, struct stat *st)\n {\n \tunsigned int changed = 0;\n \n+\tif (ce->ce_flags & CE_REMOVE)\n+\t\treturn MODE_CHANGED | DATA_CHANGED | TYPE_CHANGED;\n+\n \tswitch (ce->ce_mode & S_IFMT) {\n \tcase S_IFREG:\n \t\tchanged |= !S_ISREG(st->st_mode) ? TYPE_CHANGED : 0;\n@@ -145,8 +149,6 @@ static int ce_match_stat_basic(struct cache_entry *ce, struct stat *st)\n \t\telse if (ce_compare_gitlink(ce))\n \t\t\tchanged |= DATA_CHANGED;\n \t\treturn changed;\n-\tcase 0: /* Special case: unmerged file in index */\n-\t\treturn MODE_CHANGED | DATA_CHANGED | TYPE_CHANGED;\n \tdefault:\n \t\tdie(\"internal error: ce_mode is %o\", ce->ce_mode);\n \t}\n"},{"id":"66173","messageId":"alpine.LSU.1.00.0801211925580.5731@racer.site","threadId":"11573","inReplyTo":"alpine.LFD.1.00.0801211120350.2957@woody.linux-foundation.org","subject":"Re: [PATCH 2/2] read-cache.c: fix timestamp comparison","fromName":"Johannes Schindelin","fromEmail":"johannes.schindelin@gmx.de","sentAt":"2008-01-21T19:26:48Z","receivedAt":"2008-01-21T19:26:48Z","isPatch":true,"sender":{"key":"johannes.schindelin@gmx.de","avatar":"https://avatars.githubusercontent.com/u/127790?v=4"},"body":"Hi,\n\nOn Mon, 21 Jan 2008, Linus Torvalds wrote:\n\n> diff --git a/read-cache.c b/read-cache.c\n> index f5f9c3d..58a9b95 100644\n> --- a/read-cache.c\n> +++ b/read-cache.c\n> @@ -124,6 +124,9 @@ static int ce_match_stat_basic(struct cache_entry *ce, struct stat *st)\n>  {\n>  \tunsigned int changed = 0;\n>  \n> +\tif (ce->ce_flags & CE_REMOVE)\n> +\t\treturn MODE_CHANGED | DATA_CHANGED | TYPE_CHANGED;\n> +\n>  \tswitch (ce->ce_mode & S_IFMT) {\n>  \tcase S_IFREG:\n>  \t\tchanged |= !S_ISREG(st->st_mode) ? TYPE_CHANGED : 0;\n> @@ -145,8 +149,6 @@ static int ce_match_stat_basic(struct cache_entry *ce, struct stat *st)\n>  \t\telse if (ce_compare_gitlink(ce))\n>  \t\t\tchanged |= DATA_CHANGED;\n>  \t\treturn changed;\n> -\tcase 0: /* Special case: unmerged file in index */\n> -\t\treturn MODE_CHANGED | DATA_CHANGED | TYPE_CHANGED;\n\nNot that I understand what is _really_ going on, but shouldn't the comment \nbe actually moved, not be deleted?\n\nCiao,\nDscho\n"},{"id":"66177","messageId":"alpine.LFD.1.00.0801211141160.2957@woody.linux-foundation.org","threadId":"11573","inReplyTo":"alpine.LSU.1.00.0801211925580.5731@racer.site","subject":"Re: [PATCH 2/2] read-cache.c: fix timestamp comparison","fromName":"Linus Torvalds","fromEmail":"torvalds@linux-foundation.org","sentAt":"2008-01-21T19:47:39Z","receivedAt":"2008-01-21T19:47:39Z","isPatch":true,"sender":{"key":"torvalds@linux-foundation.org","avatar":"https://avatars.githubusercontent.com/u/1024025?v=4"},"body":"\n\nOn Mon, 21 Jan 2008, Johannes Schindelin wrote:\n> \n> Not that I understand what is _really_ going on, but shouldn't the comment \n> be actually moved, not be deleted?\n\nWell, the thing is, it's not a special case any more, and you can now see \nthe code, and say \"that's obviously correct\".\n\nThe whole point of that function is to compare a index entry with the stat \ninformation, and it does that by validating it in special ways. It used to \nbe that the \"ce_mode = 0\" was a special case. Now it isn't.\n\nA deleted entry can obviously never match an entry that is still on disk \n(regardless of *any* other issues). So now the\n\n\tif (ce->ce_flags & CE_REMOVE)\n\t\treturn MODE_CHANGED | DATA_CHANGED | TYPE_CHANGED;\n\nstatement is in no way a special case - rather the reverse, it's a lot \nmore obvious than testing for inode ownership changes etc.\n\nSo I removed the comment, because it doesn't make sense any more.\n\nOf course, I could have - instead of deleting it - changed it from \n\"Special case: ..\" to something like \"A deleted index entry doesn't match \nany on-disk file\", but does that actually add any information to the above \ntwo lines? Sure, we can comment things, but shouldn't we comment the ones \nthat are subtle or odd, rather than the obvious ones?\n\nThis was why the CE_REMOVE bit was done in the first place: to remove the \nrather special case of ce_mode being zero meaning something special.\n\n\t\t\tLinus\n"},{"id":"66189","messageId":"7vabmyykvg.fsf@gitster.siamese.dyndns.org","threadId":"11573","inReplyTo":"alpine.LFD.1.00.0801211120350.2957@woody.linux-foundation.org","subject":"Re: [PATCH 2/2] read-cache.c: fix timestamp comparison","fromName":"Junio C Hamano","fromEmail":"gitster@pobox.com","sentAt":"2008-01-21T20:38:43Z","receivedAt":"2008-01-21T20:38:43Z","isPatch":true,"sender":{"key":"gitster@pobox.com","avatar":"https://avatars.githubusercontent.com/u/54884?v=4"},"body":"Linus Torvalds <torvalds@linux-foundation.org> writes:\n\n> On Mon, 21 Jan 2008, Linus Torvalds wrote:\n>> \n>> Still looking.\n>\n> Damn.\n>\n> The comment that I also  moved says it all.\n>\n> I'd forgotten about that really ugly special case. It's no longer ugly, \n> but missing that part of the ce_mode handling cleanup certainly explains \n> the test-suite failing.\n\nVery good catch.\n"},{"id":"66203","messageId":"alpine.LFD.1.00.0801211242330.2957@woody.linux-foundation.org","threadId":"11573","inReplyTo":"7vabmyykvg.fsf@gitster.siamese.dyndns.org","subject":"Re: [PATCH 2/2] read-cache.c: fix timestamp comparison","fromName":"Linus Torvalds","fromEmail":"torvalds@linux-foundation.org","sentAt":"2008-01-21T21:22:15Z","receivedAt":"2008-01-21T21:22:15Z","isPatch":true,"sender":{"key":"torvalds@linux-foundation.org","avatar":"https://avatars.githubusercontent.com/u/1024025?v=4"},"body":"\n\nOn Mon, 21 Jan 2008, Junio C Hamano wrote:\n> >\n> > I'd forgotten about that really ugly special case. It's no longer ugly, \n> > but missing that part of the ce_mode handling cleanup certainly explains \n> > the test-suite failing.\n> \n> Very good catch.\n\nThe stupid thing is that I literally _grepped_ for the code testing \n\"ce_mode\".\n\nI had missed that one because I had looked for things like\n\n\tif ([!].*ce_mode)\n\nbut that switch statement meant that the comparison to zero was \nnon-local and my grep didn't see it. And while the test-suite did have a \ntest for this, it was hidden by the racy index logic.. Unlucky.\n\nAnyway, I've created a rebased tree with the commits fixed (and some \nwhitespace fixes too), so that it should hopefully all be bisect-clean \netc.\n\n[ To clarify: it's both rebased to the current git 'master' (which is \n  currently -rc4) _and_ it has the commits fixed up. So I also squashed \n  the \"-m\" flag fix into the commit that made diff-index use unpack_trees, \n  etc, so that none of the commits should be introducing bugs that get \n  fixed later.\n\n  I also cleaned up some of the commit messages, particularly the one \n  about using unpack_trees() (which was talking about \"take 2\" of lstat \n  reduction - true, but not very descriptive of what it actually did) ]\n\nIt's in the same place: branch 'new-lstat' at\n\n\tgit://git.kernel.org/pub/scm/linux/kernel/git/torvalds/git.git new-lstat\n\nand I'll continue to maintain it if only because it's what I use myself \n(until I just switch to 'next' or something).\n\n\t\tLinus\n"},{"id":"66214","messageId":"7v63xmyh07.fsf@gitster.siamese.dyndns.org","threadId":"11573","inReplyTo":"alpine.LFD.1.00.0801211242330.2957@woody.linux-foundation.org","subject":"Re: [PATCH 2/2] read-cache.c: fix timestamp comparison","fromName":"Junio C Hamano","fromEmail":"gitster@pobox.com","sentAt":"2008-01-21T22:02:16Z","receivedAt":"2008-01-21T22:02:16Z","isPatch":true,"sender":{"key":"gitster@pobox.com","avatar":"https://avatars.githubusercontent.com/u/54884?v=4"},"body":"Linus Torvalds <torvalds@linux-foundation.org> writes:\n\n> It's in the same place: branch 'new-lstat' at\n>\n> \tgit://git.kernel.org/pub/scm/linux/kernel/git/torvalds/git.git new-lstat\n>\n> and I'll continue to maintain it if only because it's what I use myself \n> (until I just switch to 'next' or something).\n\nI'll find time to replace lt/in-core-index branch that is\ncurrently in 'pu' with it, hopefully sometime tonight.  Mine has\nthese two idiotic stuff you commented on.\n"},{"id":"66296","messageId":"7v3asqry28.fsf@gitster.siamese.dyndns.org","threadId":"11573","inReplyTo":"alpine.LFD.1.00.0801211242330.2957@woody.linux-foundation.org","subject":"Re: [PATCH 2/2] read-cache.c: fix timestamp comparison","fromName":"Junio C Hamano","fromEmail":"gitster@pobox.com","sentAt":"2008-01-22T09:47:59Z","receivedAt":"2008-01-22T09:47:59Z","isPatch":true,"sender":{"key":"gitster@pobox.com","avatar":"https://avatars.githubusercontent.com/u/54884?v=4"},"body":"Linus Torvalds <torvalds@linux-foundation.org> writes:\n\n> The stupid thing is that I literally _grepped_ for the code testing \n> \"ce_mode\".\n>\n> I had missed that one because I had looked for things like\n>\n> \tif ([!].*ce_mode)\n>\n> but that switch statement meant that the comparison to zero was \n> non-local and my grep didn't see it.\n\nWould a patch to sparse help you in cases like this?\n"},{"id":"66320","messageId":"alpine.LFD.1.00.0801220919390.2957@woody.linux-foundation.org","threadId":"11573","inReplyTo":"7v3asqry28.fsf@gitster.siamese.dyndns.org","subject":"Re: [PATCH 2/2] read-cache.c: fix timestamp comparison","fromName":"Linus Torvalds","fromEmail":"torvalds@linux-foundation.org","sentAt":"2008-01-22T17:25:25Z","receivedAt":"2008-01-22T17:25:25Z","isPatch":true,"sender":{"key":"torvalds@linux-foundation.org","avatar":"https://avatars.githubusercontent.com/u/1024025?v=4"},"body":"\n\nOn Tue, 22 Jan 2008, Junio C Hamano wrote:\n\n> Linus Torvalds <torvalds@linux-foundation.org> writes:\n> \n> > The stupid thing is that I literally _grepped_ for the code testing \n> > \"ce_mode\".\n> >\n> > I had missed that one because I had looked for things like\n> >\n> > \tif ([!].*ce_mode)\n> >\n> > but that switch statement meant that the comparison to zero was \n> > non-local and my grep didn't see it.\n> \n> Would a patch to sparse help you in cases like this?\n\nHeh. Sparse can do anything, but some things are more specialized than \nothers. In this case, I could possibly have added a type modifier that \nsays \"don't compare against zero\", and that kind of thing may even make \nsense (ie you can mark pointers that are known not to be NULL), and yes, \nit would have caught this.\n\nBut sparse right now doesn't have that kind of flag (the \"safe expression\" \nthing comes pretty close).\n\nSo yes, sparse could do things like this, but it's generally a fair amount \nof work to add specialized sparse rules.\n\n\t\tLinus\n"},{"id":"66330","messageId":"alpine.LFD.1.00.0801221355110.1741@woody.linux-foundation.org","threadId":"11573","inReplyTo":"alpine.LFD.1.00.0801211242330.2957@woody.linux-foundation.org","subject":"Re: [PATCH 2/2] read-cache.c: fix timestamp comparison","fromName":"Linus Torvalds","fromEmail":"torvalds@linux-foundation.org","sentAt":"2008-01-22T22:00:25Z","receivedAt":"2008-01-22T22:00:25Z","isPatch":true,"sender":{"key":"torvalds@linux-foundation.org","avatar":"https://avatars.githubusercontent.com/u/1024025?v=4"},"body":"\n\nOn Mon, 21 Jan 2008, Linus Torvalds wrote:\n> On Mon, 21 Jan 2008, Junio C Hamano wrote:\n> > \n> > Very good catch.\n> \n> The stupid thing is that I literally _grepped_ for the code testing \n> \"ce_mode\".\n> \n> I had missed that one because I had looked for things like\n> \n> \tif ([!].*ce_mode)\n> \n> but that switch statement meant that the comparison to zero was \n> non-local and my grep didn't see it. And while the test-suite did have a \n> test for this, it was hidden by the racy index logic.. Unlucky.\n\nOk, having looked a bit more, I found another two cases that my grep had \nmissed. They were regular if-statements, just more complex than my stupid \ngrep pattern had taken into account.\n\nBoth are in read-cache.c:\n\nread-cache.c:                   if (stage || istate->cache[pos]->ce_mode) {\nread-cache.c:                   if (ce_stage(p) == stage && (stage || p->ce_mode))\n\nand I'd send a patch, except my tree right now is in pretty bad shape \nbecause I'm also trying to see if I can add a name hash to the index.\n\nAnyway, the \"xyzzy->ce_mode\" check should in both cases become a \n\"!(xyzzy->ce_flags & CE_REMOVE)\" instead.\n\nAnd we obviously don't seem to have any tests for this situation (I think \nthey are both D/F conflicts with the file having been marked removed by an \nearlier phase, so they'd be some really odd kind of merge or something).\n\n\t\tLinus\n"},{"id":"66365","messageId":"7vir1lp646.fsf@gitster.siamese.dyndns.org","threadId":"11573","inReplyTo":"alpine.LFD.1.00.0801221355110.1741@woody.linux-foundation.org","subject":"Re: [PATCH 2/2] read-cache.c: fix timestamp comparison","fromName":"Junio C Hamano","fromEmail":"gitster@pobox.com","sentAt":"2008-01-23T03:34:33Z","receivedAt":"2008-01-23T03:34:33Z","isPatch":true,"sender":{"key":"gitster@pobox.com","avatar":"https://avatars.githubusercontent.com/u/54884?v=4"},"body":"Linus Torvalds <torvalds@linux-foundation.org> writes:\n\n> Ok, having looked a bit more, I found another two cases that my grep had \n> missed. They were regular if-statements, just more complex than my stupid \n> grep pattern had taken into account.\n>\n> Both are in read-cache.c:\n>\n> read-cache.c:                   if (stage || istate->cache[pos]->ce_mode) {\n> read-cache.c:                   if (ce_stage(p) == stage && (stage || p->ce_mode))\n>\n> and I'd send a patch, except my tree right now is in pretty bad shape \n> because I'm also trying to see if I can add a name hash to the index.\n\n-- >8 --\nread-cache.c: fix a couple more CE_REMOVE conversion\n\nIt is a D/F conflict if you want to add \"foo/bar\" to the index\nwhen \"foo\" already exists.  Also it is a conflict if you want to\nadd a file \"foo\" when \"foo/bar\" exists.\n\nAn exception is when the existing entry is there only to mark \"I\nused to be here but I am being removed\".  This is needed for\noperations such as \"git read-tree -m -u\" that update the index\nand then reflect the result to the work tree --- we need to\nremember what to remove somewhere, and we use the index for\nthat.  In such a case, an existing file \"foo\" is being removed\nand we can create \"foo/\" directory and hang \"bar\" underneath it\nwithout any conflict.\n\nWe used to use (ce->ce_mode == 0) to mark an entry that is being\nremoved, but (CE_REMOVE & ce->ce_flags) is used for that purpose\nthese days.  An earlier commit forgot to convert the logic in\nthe code that checks D/F conflict condition.\n\nThe old code knew that \"to be removed\" entries cannot be at\nhigher stage and actively checked that condition, but it was an\nunnecessary check.  This patch removes the extra check as well.\n\nSigned-off-by: Junio C Hamano <gitster@pobox.com>\n---\n read-cache.c |    7 ++++---\n 1 files changed, 4 insertions(+), 3 deletions(-)\n\ndiff --git a/read-cache.c b/read-cache.c\nindex 8ba8f0f..8f5d02a 100644\n--- a/read-cache.c\n+++ b/read-cache.c\n@@ -615,7 +615,7 @@ static int has_dir_name(struct index_state *istate,\n \t\t\t * it is Ok to have a directory at the same\n \t\t\t * path.\n \t\t\t */\n-\t\t\tif (stage || istate->cache[pos]->ce_mode) {\n+\t\t\tif (!(istate->cache[pos]->ce_flags & CE_REMOVE)) {\n \t\t\t\tretval = -1;\n \t\t\t\tif (!ok_to_replace)\n \t\t\t\t\tbreak;\n@@ -637,8 +637,9 @@ static int has_dir_name(struct index_state *istate,\n \t\t\t    (p->name[len] != '/') ||\n \t\t\t    memcmp(p->name, name, len))\n \t\t\t\tbreak; /* not our subdirectory */\n-\t\t\tif (ce_stage(p) == stage && (stage || p->ce_mode))\n-\t\t\t\t/* p is at the same stage as our entry, and\n+\t\t\tif (ce_stage(p) == stage && !(p->ce_flags & CE_REMOVE))\n+\t\t\t\t/*\n+\t\t\t\t * p is at the same stage as our entry, and\n \t\t\t\t * is a subdirectory of what we are looking\n \t\t\t\t * at, so we cannot have conflicts at our\n \t\t\t\t * level or anything shorter.\n"},{"id":"66366","messageId":"alpine.LFD.1.00.0801221953030.1741@woody.linux-foundation.org","threadId":"11573","inReplyTo":"7vir1lp646.fsf@gitster.siamese.dyndns.org","subject":"Re: [PATCH 2/2] read-cache.c: fix timestamp comparison","fromName":"Linus Torvalds","fromEmail":"torvalds@linux-foundation.org","sentAt":"2008-01-23T03:53:56Z","receivedAt":"2008-01-23T03:53:56Z","isPatch":true,"sender":{"key":"torvalds@linux-foundation.org","avatar":"https://avatars.githubusercontent.com/u/1024025?v=4"},"body":"\n\nOn Tue, 22 Jan 2008, Junio C Hamano wrote:\n>\n> read-cache.c: fix a couple more CE_REMOVE conversion\n\nAcked-by: Linus Torvalds <torvalds@linux-foundation.org>\n\n\t\t\tLinus\n"},{"id":"66367","messageId":"20080123044428.GK24004@spearce.org","threadId":"11573","inReplyTo":"alpine.LSU.1.00.0801211034040.5731@racer.site","subject":"Re: What's not in 'master', and likely not to be until 1.5.4","fromName":"Shawn O. Pearce","fromEmail":"spearce@spearce.org","sentAt":"2008-01-23T04:44:28Z","receivedAt":"2008-01-23T04:44:28Z","isPatch":false,"sender":{"key":"spearce@spearce.org","avatar":"https://avatars.githubusercontent.com/u/34844?v=4"},"body":"Johannes Schindelin <Johannes.Schindelin@gmx.de> wrote:\n> Note: There might be yet a better way.  Instead of trying each and every \n> time, we could detect the presence of msgfmt with something like this:\n> \n> +ifeq $(shell msgfmt2 2>/dev/null >/dev/null; echo $?) = 127\n> +\tMSGFMT = $(TCL_PATH) po/po2msg.sh\n> +endif\n\nI like it.  I'm applying this diff (which I tested) to git-gui:\n\ndiff --git a/Makefile b/Makefile\nindex 1baf4b0..5f1023e 100644\n--- a/Makefile\n+++ b/Makefile\n@@ -198,6 +198,9 @@ ifdef NO_MSGFMT\n \tMSGFMT ?= $(TCL_PATH) po/po2msg.sh\n else\n \tMSGFMT ?= msgfmt\n+\tifeq ($(shell $(MSGFMT) >/dev/null 2>&1 || echo $$?),127)\n+\t\tMSGFMT := $(TCL_PATH) po/po2msg.sh\n+\tendif\n endif\n \n msgsdir     = $(gg_libdir)/msgs\n\n-- \nShawn.\n"},{"id":"66389","messageId":"alpine.LSU.1.00.0801231111310.5731@racer.site","threadId":"11573","inReplyTo":"20080123044428.GK24004@spearce.org","subject":"Re: What's not in 'master', and likely not to be until 1.5.4","fromName":"Johannes Schindelin","fromEmail":"johannes.schindelin@gmx.de","sentAt":"2008-01-23T11:12:36Z","receivedAt":"2008-01-23T11:12:36Z","isPatch":false,"sender":{"key":"johannes.schindelin@gmx.de","avatar":"https://avatars.githubusercontent.com/u/127790?v=4"},"body":"Hi,\n\nOn Tue, 22 Jan 2008, Shawn O. Pearce wrote:\n\n> diff --git a/Makefile b/Makefile\n> index 1baf4b0..5f1023e 100644\n> --- a/Makefile\n> +++ b/Makefile\n> @@ -198,6 +198,9 @@ ifdef NO_MSGFMT\n>  \tMSGFMT ?= $(TCL_PATH) po/po2msg.sh\n>  else\n>  \tMSGFMT ?= msgfmt\n> +\tifeq ($(shell $(MSGFMT) >/dev/null 2>&1 || echo $$?),127)\n> +\t\tMSGFMT := $(TCL_PATH) po/po2msg.sh\n> +\tendif\n>  endif\n>  \n>  msgsdir     = $(gg_libdir)/msgs\n> \n\nThanks!\n\nPaul, you might want to do something like that for gitk, too.  I imagine \nthat the diff even applies as-is...\n\nCiao,\nDscho\n"},{"id":"69195","messageId":"alpine.LSU.1.00.0802181956270.30505@racer.site","threadId":"11573","inReplyTo":"alpine.LSU.1.00.0801181832180.5731@racer.site","subject":"Re: What's not in 'master' but should be","fromName":"Johannes Schindelin","fromEmail":"johannes.schindelin@gmx.de","sentAt":"2008-02-18T19:57:42Z","receivedAt":"2008-02-18T19:57:42Z","isPatch":false,"sender":{"key":"johannes.schindelin@gmx.de","avatar":"https://avatars.githubusercontent.com/u/127790?v=4"},"body":"Hi,\n\nOn Fri, 18 Jan 2008, Johannes Schindelin wrote:\n\n> Grégoire, it would help tremendously if you could come up with a test \n> case.  The description you gave did not lead to something reproducible \n> here.\n\nIt seems that I hit the problem myself recently; it only showed when there \nwas more than one ref.  A fix is already in \"next\".\n\nGrégoire, could you please test a current \"next\", just to make sure that \nthe problem is now gone?\n\nCiao,\nDscho\n\n"}]}