* Allowing override of the default "origin" nickname @ 2008-01-11 3:29 Mark Levedahl 2008-01-11 3:29 ` [PATCH] Teach remote machinery about remotes.default config variable Mark Levedahl ` (2 more replies) 0 siblings, 3 replies; 134+ messages in thread From: Mark Levedahl @ 2008-01-11 3:29 UTC (permalink / raw) To: gitster; +Cc: git git's current support for remote nicknames other than "origin" is restricted to tracking branches where branch.<name>.remote is defined. This does not work on detached heads, and thus does not work for managed submodules as those are kept on detached heads. When working with submodules, the remote must be called "origin." As my project is distributed across multiple domains with many firewalls and airgaps such that no single server is available to all, we really need to use nicknames to refer to different servers, and we need that to work well with submodules. So, this patch series: 1) defines a new "remotes.default" config variable per repository to be the default remote used if no branch.<name>.remote is found. 2) teaches clone to set remotes.default according to the user's command (via -o). 3) teaches remote rm to unset remotes.default if deleting that remote. 4) teaches git-submodule to propoagate the parent's default branch to submoules during "init", IFF those modules are defined using relative urls. (Modules using absolute urls are likely from a different server, so this inheritence is not likely the right thing in that case.) This is working well for me, allowing git clone -o myserver <url> project cd project git submodule init git submoule update to work as expected, with all submodules pointing to "myserver" rather than "origin" and updating correctly despite being on detached heads. Mark Levedahl ^ permalink raw reply [flat|nested] 134+ messages in thread
* [PATCH] Teach remote machinery about remotes.default config variable 2008-01-11 3:29 Allowing override of the default "origin" nickname Mark Levedahl @ 2008-01-11 3:29 ` Mark Levedahl 2008-01-11 3:29 ` [PATCH] git-remote - Unset remotes.default when deleting the default remote Mark Levedahl 2008-01-11 8:00 ` [PATCH] Teach remote machinery about remotes.default config variable Junio C Hamano 2008-01-11 12:03 ` Allowing override of the default "origin" nickname Johannes Schindelin 2008-01-11 23:11 ` Daniel Barkalow 2 siblings, 2 replies; 134+ messages in thread From: Mark Levedahl @ 2008-01-11 3:29 UTC (permalink / raw) To: gitster; +Cc: git, Mark Levedahl This introduces a new configuration variable, remotes.default, that defines the name of the default remote to be used. Traditionally, this is "origin", and could be overridden for a given branch. This change introduces a way to redefine the default as desired and have that honored regardless of the currently checked out head (e.g., remotes.default is used when on a detached head or any other non-tracking branch). Signed-off-by: Mark Levedahl <mlevedahl@gmail.com> --- Documentation/config.txt | 6 ++++++ git-parse-remote.sh | 5 +++-- remote.c | 11 ++++++++++- 3 files changed, 19 insertions(+), 3 deletions(-) diff --git a/Documentation/config.txt b/Documentation/config.txt index 1b6d6d6..01ce295 100644 --- a/Documentation/config.txt +++ b/Documentation/config.txt @@ -800,6 +800,12 @@ remote.<name>.tagopt:: Setting this value to --no-tags disables automatic tag following when fetching from remote <name> +remotes.default:: + The name of the remote used by default for fetch / pull. If unset, + origin is assumed. This value is used whenever the current branch + has no corresponding branch.<name>.remote, such as when working on + a detached head. + remotes.<group>:: The list of remotes which are fetched by "git remote update <group>". See linkgit:git-remote[1]. diff --git a/git-parse-remote.sh b/git-parse-remote.sh index 695a409..1b235e0 100755 --- a/git-parse-remote.sh +++ b/git-parse-remote.sh @@ -56,8 +56,9 @@ get_remote_url () { get_default_remote () { curr_branch=$(git symbolic-ref -q HEAD | sed -e 's|^refs/heads/||') - origin=$(git config --get "branch.$curr_branch.remote") - echo ${origin:-origin} + git config --get "branch.$curr_branch.remote" || + git config --get "remotes.default" || + echo origin } get_remote_default_refs_for_push () { diff --git a/remote.c b/remote.c index 0e00680..4937237 100644 --- a/remote.c +++ b/remote.c @@ -10,6 +10,7 @@ static int allocated_branches; static struct branch *current_branch; static const char *default_remote_name; +static const char *remotes_default_name; #define BUF_SIZE (2048) static char buffer[BUF_SIZE]; @@ -233,6 +234,11 @@ static int handle_config(const char *key, const char *value) add_merge(branch, xstrdup(value)); return 0; } + if (!strcmp(key, "remotes.default")) { + if (value) + remotes_default_name = xstrdup(value); + return 0; + } if (prefixcmp(key, "remote.")) return 0; name = key + 7; @@ -291,7 +297,6 @@ static void read_config(void) int flag; if (default_remote_name) // did this already return; - default_remote_name = xstrdup("origin"); current_branch = NULL; head_ref = resolve_ref("HEAD", sha1, 0, &flag); if (head_ref && (flag & REF_ISSYMREF) && @@ -300,6 +305,10 @@ static void read_config(void) make_branch(head_ref + strlen("refs/heads/"), 0); } git_config(handle_config); + if (!default_remote_name) { + default_remote_name = remotes_default_name ? + remotes_default_name : xstrdup("origin"); + } } struct refspec *parse_ref_spec(int nr_refspec, const char **refspec) -- 1.5.4.rc2.99.g3ef7-dirty ^ permalink raw reply related [flat|nested] 134+ messages in thread
* [PATCH] git-remote - Unset remotes.default when deleting the default remote 2008-01-11 3:29 ` [PATCH] Teach remote machinery about remotes.default config variable Mark Levedahl @ 2008-01-11 3:29 ` Mark Levedahl 2008-01-11 3:29 ` [PATCH] git-clone - Set remotes.default config variable Mark Levedahl 2008-01-11 8:00 ` [PATCH] Teach remote machinery about remotes.default config variable Junio C Hamano 1 sibling, 1 reply; 134+ messages in thread From: Mark Levedahl @ 2008-01-11 3:29 UTC (permalink / raw) To: gitster; +Cc: git, Mark Levedahl Signed-off-by: Mark Levedahl <mlevedahl@gmail.com> --- git-remote.perl | 5 +++++ 1 files changed, 5 insertions(+), 0 deletions(-) diff --git a/git-remote.perl b/git-remote.perl index d13e4c1..2469b59 100755 --- a/git-remote.perl +++ b/git-remote.perl @@ -328,6 +328,11 @@ sub rm_remote { $git->command('config', '--remove-section', "remote.$name"); + my $defremote = $git->config("remotes.default"); + if (defined $defremote && $defremote eq $name) { + $git->command("config", "--unset", "remotes.default"); + } + eval { my @trackers = $git->command('config', '--get-regexp', 'branch.*.remote', $name); -- 1.5.4.rc2.99.g3ef7-dirty ^ permalink raw reply related [flat|nested] 134+ messages in thread
* [PATCH] git-clone - Set remotes.default config variable 2008-01-11 3:29 ` [PATCH] git-remote - Unset remotes.default when deleting the default remote Mark Levedahl @ 2008-01-11 3:29 ` Mark Levedahl 2008-01-11 3:29 ` [PATCH] git-submodule - Possibly inherit parent's default remote on init/clone Mark Levedahl 0 siblings, 1 reply; 134+ messages in thread From: Mark Levedahl @ 2008-01-11 3:29 UTC (permalink / raw) To: gitster; +Cc: git, Mark Levedahl This records the users choice of default remote name (by default "origin") as given by the -o option. Signed-off-by: Mark Levedahl <mlevedahl@gmail.com> --- Documentation/git-clone.txt | 3 ++- git-clone.sh | 1 + 2 files changed, 3 insertions(+), 1 deletions(-) diff --git a/Documentation/git-clone.txt b/Documentation/git-clone.txt index fdccbd4..7fd3ea1 100644 --- a/Documentation/git-clone.txt +++ b/Documentation/git-clone.txt @@ -95,7 +95,8 @@ OPTIONS --origin <name>:: -o <name>:: Instead of using the remote name 'origin' to keep track - of the upstream repository, use <name> instead. + of the upstream repository, use <name> instead. The name + is recorded in the remotes.default config variable. --upload-pack <upload-pack>:: -u <upload-pack>:: diff --git a/git-clone.sh b/git-clone.sh index b4e858c..efbcee2 100755 --- a/git-clone.sh +++ b/git-clone.sh @@ -242,6 +242,7 @@ fi && export GIT_DIR && GIT_CONFIG="$GIT_DIR/config" git-init $quiet ${template+"$template"} || usage +git config remotes.default $origin if test -n "$bare" then GIT_CONFIG="$GIT_DIR/config" git config core.bare true -- 1.5.4.rc2.99.g3ef7-dirty ^ permalink raw reply related [flat|nested] 134+ messages in thread
* [PATCH] git-submodule - Possibly inherit parent's default remote on init/clone 2008-01-11 3:29 ` [PATCH] git-clone - Set remotes.default config variable Mark Levedahl @ 2008-01-11 3:29 ` Mark Levedahl 0 siblings, 0 replies; 134+ messages in thread From: Mark Levedahl @ 2008-01-11 3:29 UTC (permalink / raw) To: gitster; +Cc: git, Mark Levedahl For submodules defined relative to their parent, it is likely that the parent's defined default remote is correct for the child as well. This allows use of remote names other than "origin", important as managed submodules are typically checked out on a detached head and therefore submodule-update invokes git-fetch using the default remote. Without this change, submodules effectively had to have a default remote of "origin." Signed-off-by: Mark Levedahl <mlevedahl@gmail.com> --- Documentation/git-submodule.txt | 8 +++++--- git-submodule.sh | 15 ++++++++++++--- 2 files changed, 17 insertions(+), 6 deletions(-) diff --git a/Documentation/git-submodule.txt b/Documentation/git-submodule.txt index cffc6d4..440e234 100644 --- a/Documentation/git-submodule.txt +++ b/Documentation/git-submodule.txt @@ -36,9 +36,11 @@ status:: init:: Initialize the submodules, i.e. register in .git/config each submodule - name and url found in .gitmodules. The key used in .git/config is - `submodule.$name.url`. This command does not alter existing information - in .git/config. + name and url found in .gitmodules, along with the default remote origin. + For submodules using a relative url, the default remote is inherited + from the parent project, for absolute urls the default "origin" is used. + The key used in .git/config is submodule.$name.url`. This command does + not alter existing information in .git/config. update:: Update the registered submodules, i.e. clone missing submodules and diff --git a/git-submodule.sh b/git-submodule.sh index ad9fe62..30e0270 100755 --- a/git-submodule.sh +++ b/git-submodule.sh @@ -7,6 +7,7 @@ USAGE='[--quiet] [--cached] [add <repo> [-b branch]|status|init|update] [--] [<path>...]' OPTIONS_SPEC= . git-sh-setup +. git-parse-remote require_work_tree add= @@ -95,6 +96,7 @@ module_clone() { path=$1 url=$2 + origin=${3:-origin} # If there already is a directory at the submodule path, # expect it to be empty (since that is the default checkout @@ -110,7 +112,7 @@ module_clone() test -e "$path" && die "A file already exist at path '$path'" - git-clone -n "$url" "$path" || + git-clone -n -o "$origin" "$url" "$path" || die "Clone of '$url' into submodule path '$path' failed" } @@ -130,9 +132,11 @@ module_add() usage fi + origin=origin case "$repo" in ./*|../*) # dereference source url relative to parent's url + origin=$(get_default_remote) realrepo="$(resolve_relative_url $repo)" ;; *) # Turn the source into an absolute path if @@ -157,7 +161,7 @@ module_add() git ls-files --error-unmatch "$path" > /dev/null 2>&1 && die "'$path' already exists in the index" - module_clone "$path" "$realrepo" || exit + module_clone "$path" "$realrepo" "$origin" || exit (unset GIT_DIR; cd "$path" && git checkout -q ${branch:+-b "$branch" "origin/$branch"}) || die "Unable to checkout submodule '$path'" git add "$path" || @@ -189,12 +193,15 @@ modules_init() die "No url found for submodule path '$path' in .gitmodules" # Possibly a url relative to parent + origin=origin case "$url" in ./*|../*) url="$(resolve_relative_url "$url")" + origin=$(get_default_remote) ;; esac + git config submodule."$name".origin "$origin" && git config submodule."$name".url "$url" || die "Failed to register url for submodule path '$path'" @@ -222,10 +229,12 @@ modules_update() say "Submodule path '$path' not initialized" continue fi + origin=$(git config submodule."$name".origin) + origin=${origin:-origin} if ! test -d "$path"/.git then - module_clone "$path" "$url" || exit + module_clone "$path" "$url" "$origin" || exit subsha1= else subsha1=$(unset GIT_DIR; cd "$path" && -- 1.5.4.rc2.99.g3ef7-dirty ^ permalink raw reply related [flat|nested] 134+ messages in thread
* Re: [PATCH] Teach remote machinery about remotes.default config variable 2008-01-11 3:29 ` [PATCH] Teach remote machinery about remotes.default config variable Mark Levedahl 2008-01-11 3:29 ` [PATCH] git-remote - Unset remotes.default when deleting the default remote Mark Levedahl @ 2008-01-11 8:00 ` Junio C Hamano 2008-01-11 20:52 ` Mark Levedahl 1 sibling, 1 reply; 134+ messages in thread From: Junio C Hamano @ 2008-01-11 8:00 UTC (permalink / raw) To: Mark Levedahl; +Cc: git Mark Levedahl <mlevedahl@gmail.com> writes: > This introduces a new configuration variable, remotes.default, that > defines the name of the default remote to be used. Does this mean "default" is now a new reserved word that cannot be used as "git remote update default"? > ... Traditionally, this > is "origin", and could be overridden for a given branch. This change > introduces a way to redefine the default as desired and have that honored > regardless of the currently checked out head (e.g., remotes.default is > used when on a detached head or any other non-tracking branch). I'd 100% agree that being able to use anything not just hardcoded 'origin' is much better than not being able to. I do not have much against that goal. However, it is a bit hard to judge how much of inconvenience it really is in your real life that the current behaviour does not allow you to. In your cover letter, you said: >> As my project is distributed across multiple domains with >> many firewalls and airgaps such that no single server is >> available to all, we really need to use nicknames to refer >> to different servers,... If you need to access different repositories on different machines from your submodules, you would of course need to access different domains from your submodule repositories. But that does not mean each of them cannot be named 'origin'. That name is local to each of the submodule (and the toplevel) and can point at different domains over different transfer channels. > diff --git a/git-parse-remote.sh b/git-parse-remote.sh > index 695a409..1b235e0 100755 > --- a/git-parse-remote.sh > +++ b/git-parse-remote.sh > @@ -56,8 +56,9 @@ get_remote_url () { > > get_default_remote () { > curr_branch=$(git symbolic-ref -q HEAD | sed -e 's|^refs/heads/||') > - origin=$(git config --get "branch.$curr_branch.remote") > - echo ${origin:-origin} > + git config --get "branch.$curr_branch.remote" || > + git config --get "remotes.default" || > + echo origin This sequence cascaded with || is much nicer than the original, even if it did not change the behaviour. > @@ -300,6 +305,10 @@ static void read_config(void) > make_branch(head_ref + strlen("refs/heads/"), 0); > } > git_config(handle_config); > + if (!default_remote_name) { > + default_remote_name = remotes_default_name ? > + remotes_default_name : xstrdup("origin"); > + } Is this a bit too deep indentation? ^ permalink raw reply [flat|nested] 134+ messages in thread
* Re: [PATCH] Teach remote machinery about remotes.default config variable 2008-01-11 8:00 ` [PATCH] Teach remote machinery about remotes.default config variable Junio C Hamano @ 2008-01-11 20:52 ` Mark Levedahl 2008-01-12 2:18 ` Junio C Hamano 0 siblings, 1 reply; 134+ messages in thread From: Mark Levedahl @ 2008-01-11 20:52 UTC (permalink / raw) To: Junio C Hamano; +Cc: git On Jan 11, 2008 3:00 AM, Junio C Hamano <gitster@pobox.com> wrote: > > Does this mean "default" is now a new reserved word that cannot > be used as "git remote update default"? oops...git-remote already has a (partially undocumented) use for remotes.* as well as remote.*, so I need another variable name, probably core.origin to avoid either defining new namespace or polluting one reserved for arbitrary end-user use. Will resend patches later tonight. > > However, it is a bit hard to judge how much of inconvenience it > really is in your real life that the current behaviour does not > allow you to. I believe I addressed this in the thread with Dscho. > > git_config(handle_config); > > + if (!default_remote_name) { > > + default_remote_name = remotes_default_name ? > > + remotes_default_name : xstrdup("origin"); > > + } > > Is this a bit too deep indentation? > will fix. Mark ^ permalink raw reply [flat|nested] 134+ messages in thread
* Re: [PATCH] Teach remote machinery about remotes.default config variable 2008-01-11 20:52 ` Mark Levedahl @ 2008-01-12 2:18 ` Junio C Hamano 2008-01-12 5:52 ` Mark Levedahl 2008-01-12 5:54 ` [PATCH] Teach remote machinery about core.origin " Mark Levedahl 0 siblings, 2 replies; 134+ messages in thread From: Junio C Hamano @ 2008-01-12 2:18 UTC (permalink / raw) To: Mark Levedahl; +Cc: git "Mark Levedahl" <mlevedahl@gmail.com> writes: >> However, it is a bit hard to judge how much of inconvenience it >> really is in your real life that the current behaviour does not >> allow you to. > > I believe I addressed this in the thread with Dscho. Thanks. I have to admit that I happen to agree with Dscho. I do not see this helping to solve communication issues very much. ^ permalink raw reply [flat|nested] 134+ messages in thread
* Re: [PATCH] Teach remote machinery about remotes.default config variable 2008-01-12 2:18 ` Junio C Hamano @ 2008-01-12 5:52 ` Mark Levedahl 2008-01-12 6:03 ` Junio C Hamano 2008-01-12 16:50 ` [PATCH] Teach remote machinery about remotes.default config variable Johannes Schindelin 2008-01-12 5:54 ` [PATCH] Teach remote machinery about core.origin " Mark Levedahl 1 sibling, 2 replies; 134+ messages in thread From: Mark Levedahl @ 2008-01-12 5:52 UTC (permalink / raw) To: Junio C Hamano; +Cc: git Junio C Hamano wrote: > "Mark Levedahl" <mlevedahl@gmail.com> writes: > > Thanks. > > I have to admit that I happen to agree with Dscho. I do not see > this helping to solve communication issues very much. > Junio, My use really is a different use-case than is typical. Origin is a great concept for the common case of projects with a single upstream repository. Except for cloning, you don't have to know or care the name of the upstream as you move from project to project, it is just always "origin" and you use the same remote nickname in each. This breaks down in a project like mine where there are multiple servers and the differences are important. Content and usage vary server to server, not just connectivity. At this point, hiding the server names is counterproductive. Basically, use of origin is data hiding, and data hiding is not good when you actually need the data. Across the git project, I believe everyone basically understands origin as git.kernel.org/..., and origin is not ambiguous. There is just one server. For my project, there are multiple servers and a number of us pull from and push to multiple servers with no intent that any one server has everything (This multiplicity is necessary for several reasons, and we have various guards in place restrict the content of different servers). Thus, there really is no usefully defined *origin*. There just isn't. This is where the disagreements lie. The argument against my approach of explicitly naming the server rests upon the premise that hiding a half-dozen servers, all different and with those differences being important, under the single universal name "origin", makes things easier. It doesn't when different servers are different. Yes, it is possible to figure out what "origin" means at a given client, and thus understand how to address a given server from that client. That is the essence of the problem. It is clear to address server1 as "server1", and server3 as "server3." It is not helpful to sometimes refer to server1 as origin, sometimes as server3, and thus need to know the definition of origin to know how to name the server. For the "normal" git use-case the specific definition of origin is unimportant when you use it and so provides a useful abstraction. That I must know what origin means in order to know what to do indicates the abstraction is counter-productive. Until we started using sub-modules, we used git clone --origin <nickname> and per our standard usage never even had "origin" defined. We just agreed on a common set of nicknames for our servers and used those. Not everyone had all the remotes defined, but nickname "foo" meant the same thing everywhere it was defined. That worked very well for us. So, all I am doing here is trying to extend a basic multi-server capability git already has for a monolithic project into projects using sub-modules. This will let us resume working the way we did before and stop overloading a single nickname (origin) with multiple meanings. Mark ^ permalink raw reply [flat|nested] 134+ messages in thread
* Re: [PATCH] Teach remote machinery about remotes.default config variable 2008-01-12 5:52 ` Mark Levedahl @ 2008-01-12 6:03 ` Junio C Hamano 2008-01-12 6:16 ` Mark Levedahl 2008-01-12 16:50 ` [PATCH] Teach remote machinery about remotes.default config variable Johannes Schindelin 1 sibling, 1 reply; 134+ messages in thread From: Junio C Hamano @ 2008-01-12 6:03 UTC (permalink / raw) To: Mark Levedahl; +Cc: git Mark Levedahl <mlevedahl@gmail.com> writes: > My use really is a different use-case than is typical.... > > This breaks down in a project like mine where there are multiple > servers and the differences are important. Content and usage vary > server to server, not just connectivity. At this point, hiding the > server names is counterproductive. Basically, use of origin is data > hiding, and data hiding is not good when you actually need the data. If you need explicit name, you do not have to use "origin". You can spell URL explicitly to name which exact repository you mean to reach over which datapath (one physical host may have different name depending on the network interface you reach it via). You can always say $ git pull git://that.exact.machine/repo that-branch if you want to avoid ambiguity. And that is not atypical at all. Scan the kernel mailing list, looking for "please pull" requests. You will never see 'origin' or any short nickname. The names used in communication should be unambiguous in the context of the communication. If you know 'origin' mean different things to different people, do not use that in public communication. It's that simple. Isn't it? ^ permalink raw reply [flat|nested] 134+ messages in thread
* Re: [PATCH] Teach remote machinery about remotes.default config variable 2008-01-12 6:03 ` Junio C Hamano @ 2008-01-12 6:16 ` Mark Levedahl 2008-01-12 6:27 ` Junio C Hamano 0 siblings, 1 reply; 134+ messages in thread From: Mark Levedahl @ 2008-01-12 6:16 UTC (permalink / raw) To: Junio C Hamano; +Cc: git Junio C Hamano wrote: > Mark Levedahl <mlevedahl@gmail.com> writes: > > > > It's that simple. Isn't it? > > Yes, until you hit submodules whose state you are managing from a super project. Then it gets hard because the machinery brings origin into play. Mark ^ permalink raw reply [flat|nested] 134+ messages in thread
* Re: [PATCH] Teach remote machinery about remotes.default config variable 2008-01-12 6:16 ` Mark Levedahl @ 2008-01-12 6:27 ` Junio C Hamano 2008-01-12 13:24 ` Mark Levedahl 0 siblings, 1 reply; 134+ messages in thread From: Junio C Hamano @ 2008-01-12 6:27 UTC (permalink / raw) To: Mark Levedahl; +Cc: git Mark Levedahl <mlevedahl@gmail.com> writes: > Junio C Hamano wrote: >> Mark Levedahl <mlevedahl@gmail.com> writes: >> >> It's that simple. Isn't it? >> > Yes, until you hit submodules whose state you are managing from a > super project. Then it gets hard because the machinery brings origin > into play. Sorry, I may be missing something. Even if you have a submodule, you can go there and that will be a valid freestanding repository. You can always be explicit, bypassing any behaviour that defaults to 'origin' to avoid ambiguity. ^ permalink raw reply [flat|nested] 134+ messages in thread
* Re: [PATCH] Teach remote machinery about remotes.default config variable 2008-01-12 6:27 ` Junio C Hamano @ 2008-01-12 13:24 ` Mark Levedahl 2008-01-12 18:46 ` Junio C Hamano 0 siblings, 1 reply; 134+ messages in thread From: Mark Levedahl @ 2008-01-12 13:24 UTC (permalink / raw) To: Junio C Hamano; +Cc: git Junio C Hamano wrote: > Sorry, I may be missing something. > > Even if you have a submodule, you can go there and that will be > a valid freestanding repository. You can always be explicit, > bypassing any behaviour that defaults to 'origin' to avoid > ambiguity. > "git-submodule update" *requires* that origin is defined in all sub-modules. There is no way to avoid this behavior. Mark ^ permalink raw reply [flat|nested] 134+ messages in thread
* Re: [PATCH] Teach remote machinery about remotes.default config variable 2008-01-12 13:24 ` Mark Levedahl @ 2008-01-12 18:46 ` Junio C Hamano 2008-01-12 19:34 ` Mark Levedahl 0 siblings, 1 reply; 134+ messages in thread From: Junio C Hamano @ 2008-01-12 18:46 UTC (permalink / raw) To: Mark Levedahl; +Cc: git Mark Levedahl <mlevedahl@gmail.com> writes: > Junio C Hamano wrote: >> Sorry, I may be missing something. >> >> Even if you have a submodule, you can go there and that will be >> a valid freestanding repository. You can always be explicit, >> bypassing any behaviour that defaults to 'origin' to avoid >> ambiguity. >> > "git-submodule update" *requires* that origin is defined in all > sub-modules. There is no way to avoid this behavior. Ahh. Does that suggest the new configuration thing is only about the "submodule update" command, not "remotes.default" that affects how the non-submodule merge and fetch works? ^ permalink raw reply [flat|nested] 134+ messages in thread
* Re: [PATCH] Teach remote machinery about remotes.default config variable 2008-01-12 18:46 ` Junio C Hamano @ 2008-01-12 19:34 ` Mark Levedahl 2008-01-12 20:24 ` Johannes Schindelin 2008-01-12 20:26 ` Junio C Hamano 0 siblings, 2 replies; 134+ messages in thread From: Mark Levedahl @ 2008-01-12 19:34 UTC (permalink / raw) To: Junio C Hamano; +Cc: git Junio C Hamano wrote: > Ahh. > > Does that suggest the new configuration thing is only about the > "submodule update" command, not "remotes.default" that affects > how the non-submodule merge and fetch works? > > Yes - this patch set was inspired by the single question of "how do I avoid needing to define origin as opposed to a server-specific nickname now that I am using sub-modules?" Mark ^ permalink raw reply [flat|nested] 134+ messages in thread
* Re: [PATCH] Teach remote machinery about remotes.default config variable 2008-01-12 19:34 ` Mark Levedahl @ 2008-01-12 20:24 ` Johannes Schindelin 2008-01-12 22:29 ` Mark Levedahl 2008-01-12 20:26 ` Junio C Hamano 1 sibling, 1 reply; 134+ messages in thread From: Johannes Schindelin @ 2008-01-12 20:24 UTC (permalink / raw) To: Mark Levedahl; +Cc: Junio C Hamano, git Hi, On Sat, 12 Jan 2008, Mark Levedahl wrote: > Junio C Hamano wrote: > > Ahh. > > > > Does that suggest the new configuration thing is only about the > > "submodule update" command, not "remotes.default" that affects how the > > non-submodule merge and fetch works? > > Yes - this patch set was inspired by the single question of "how do I > avoid needing to define origin as opposed to a server-specific nickname > now that I am using sub-modules?" Why is your patch then not about git-submodule? And I still fail to see -- even for submodules -- how you begin to tackle that lookup problem. Ciao, Dscho ^ permalink raw reply [flat|nested] 134+ messages in thread
* Re: [PATCH] Teach remote machinery about remotes.default config variable 2008-01-12 20:24 ` Johannes Schindelin @ 2008-01-12 22:29 ` Mark Levedahl 2008-01-13 21:22 ` Johannes Schindelin 0 siblings, 1 reply; 134+ messages in thread From: Mark Levedahl @ 2008-01-12 22:29 UTC (permalink / raw) To: Johannes Schindelin; +Cc: Junio C Hamano, git Johannes Schindelin wrote: > Why is your patch then not about git-submodule? > > And I still fail to see -- even for submodules -- how you begin to tackle > that lookup problem. > > Ciao, > Dscho > > Because git-submodule is a wrapper around git-fetch and git-clone and git-remote, and those lacked the mechanism to honor the fact that when I said git clone -o frotz frontz.foo.bar/foo.git I *defined* the upstream's nickname as "frotz", not "origin", and origin is *not* defined so don't try to use it. As sub-modules are git projects, fixing this in a sub-module necessarily fixes it in any git project. Mark ^ permalink raw reply [flat|nested] 134+ messages in thread
* Re: [PATCH] Teach remote machinery about remotes.default config variable 2008-01-12 22:29 ` Mark Levedahl @ 2008-01-13 21:22 ` Johannes Schindelin 2008-01-14 3:23 ` Mark Levedahl 0 siblings, 1 reply; 134+ messages in thread From: Johannes Schindelin @ 2008-01-13 21:22 UTC (permalink / raw) To: Mark Levedahl; +Cc: Junio C Hamano, git Hi, On Sat, 12 Jan 2008, Mark Levedahl wrote: > Johannes Schindelin wrote: > > Why is your patch then not about git-submodule? > > > > And I still fail to see -- even for submodules -- how you begin to > > tackle that lookup problem. > > Because git-submodule is a wrapper around git-fetch and git-clone and > git-remote, and those lacked the mechanism to honor the fact that when I > said > > git clone -o frotz frontz.foo.bar/foo.git > > I *defined* the upstream's nickname as "frotz", not "origin", and origin > is *not* defined so don't try to use it. As sub-modules are git > projects, fixing this in a sub-module necessarily fixes it in any git > project. Unfortunately, you _still_ fail to even ackonwledge that you still need a lookup, and that I have a point when saying "your patch does not help, since you still have a lookup". But I start to believe that you do not even want to present an argument against this reasoning, so I will stop here. Ciao, Dscho ^ permalink raw reply [flat|nested] 134+ messages in thread
* Re: [PATCH] Teach remote machinery about remotes.default config variable 2008-01-13 21:22 ` Johannes Schindelin @ 2008-01-14 3:23 ` Mark Levedahl 2008-01-14 4:42 ` Junio C Hamano 0 siblings, 1 reply; 134+ messages in thread From: Mark Levedahl @ 2008-01-14 3:23 UTC (permalink / raw) To: Johannes Schindelin; +Cc: Junio C Hamano, git Johannes Schindelin wrote: > Unfortunately, you _still_ fail to even ackonwledge that you still need a > lookup, and that I have a point when saying "your patch does not help, > since you still have a lookup". > I don't acknowledge this point as it is not true. I will try to explain one more time. 1 - "origin" is fine as an abstraction IFF everyone on the project can reasonably expect that "git fetch origin" will yield the same results for anyone who executes that command. As I have tried (and apparently failed) to explain, for numerous complex and unchangeable reasons, "git fetch origin" is *NOT* expected to give the same results around this project and therefore, "origin" is not a useful abstraction. 2 - Until we used submodules, we never defined "origin", but instead explicitly named the server using standard nicknames (e.g., "git fetch frotz", not "git fetch"). Everyone who can access frotz gets the same result. Those who can't, and have to use server "zorft", get a different result but it is obvious to all they didn't go to frotz. 3 - As the servers are different and have different content, it is just part of the workflow to know the server names and use them. We have agreed upon a common set of server nicknames. There is no lookup, we just know them. Maybe you call this a lookup step, but frankly this is part of *required* job knowledge (which server has what and which to use for which purpose). 4 - The problem came with submodules. Now, the recipe of "git clone -o frotz" no longer really works, as all of the submodules now have remote origin = frotz, and remote frotz is undefined while the master-project is the other way around. This is confusing to say the least. As submodules forced origin in, the path of least resistance was just giving in and using origin. Now we have to be very aware not only of what server to use, but now also what origin is so that we can know how to reach the server we wanted. (i.e., Do I use "origin" or "frotz" to reach frotz?) This *IS* an extra lookup step required because of origin being defined. Now, we can recusively use "git remote add" to just go ahead and add all remotes needed regardless of what origin says, and *partly* get back to where we were. Only partly, because git submodule update will still use origin, and *only* origin for fetching. So we still have to know what origin is (problem #1, fixed by my patches 1-4), and if what we need to fetch from is in fact not origin (even though the master project knows what server to access), submodule update in fact doesn't even work (fixed by the fifth patch that flows the remote down from the master). So no, I do not acknowledge that we have an extra lookup step and that just using origin is the same or simpler or whatever. It absolutely is not. Quite the opposite, for us using "origin" forces an unnecessary extra lookup and translation step and complicates, not simplifies, use of submodules. Mark ^ permalink raw reply [flat|nested] 134+ messages in thread
* Re: [PATCH] Teach remote machinery about remotes.default config variable 2008-01-14 3:23 ` Mark Levedahl @ 2008-01-14 4:42 ` Junio C Hamano 2008-01-15 4:55 ` Mark Levedahl 0 siblings, 1 reply; 134+ messages in thread From: Junio C Hamano @ 2008-01-14 4:42 UTC (permalink / raw) To: Mark Levedahl; +Cc: Johannes Schindelin, git Mark Levedahl <mlevedahl@gmail.com> writes: > ... if what > we need to fetch from is in fact not origin (even though the master > project knows what server to access), submodule update in fact doesn't > even work ... This is an interesting point. Perhaps git-submodule.sh::modules_update should use $url it obtains from the configuration in the upper level when running git-fetch in the submodule. If you view the problem this way, your earlier "git fetch while the HEAD is detached always uses 'origin'" may turn out to be a non-issue. Which again brings us back to Johannes's earlier point. If the issue is about submodule, maybe what needs to be fixes is in git-submodule, and not the defaulting to 'origin' git-fetch and friends do. ^ permalink raw reply [flat|nested] 134+ messages in thread
* Re: [PATCH] Teach remote machinery about remotes.default config variable 2008-01-14 4:42 ` Junio C Hamano @ 2008-01-15 4:55 ` Mark Levedahl 2008-01-15 6:18 ` Junio C Hamano 0 siblings, 1 reply; 134+ messages in thread From: Mark Levedahl @ 2008-01-15 4:55 UTC (permalink / raw) To: Junio C Hamano; +Cc: Johannes Schindelin, git Junio C Hamano wrote: > Mark Levedahl <mlevedahl@gmail.com> writes: > > >> ... if what >> we need to fetch from is in fact not origin (even though the master >> project knows what server to access), submodule update in fact doesn't >> even work ... >> > > This is an interesting point. > > Perhaps git-submodule.sh::modules_update should use $url it > obtains from the configuration in the upper level when running > git-fetch in the submodule. > yes, I like this change, it works very nicely. but that last patch is only a partial solution... > If you view the problem this way, your earlier "git fetch while > the HEAD is detached always uses 'origin'" may turn out to be a > non-issue. > > Which again brings us back to Johannes's earlier point. If the > issue is about submodule, maybe what needs to be fixes is in > git-submodule, and not the defaulting to 'origin' git-fetch and > friends do. > Nope, git submodule *still* requires origin (e.g., execute git submodule init or update on a detached head). We are dancing around the issue, not fixing the root cause. This is perhaps illuminated by splitting projects into two camps: Camp1 - there is no need to distinguish the upstream servers (or there is only one), calling it/all origin is fine. Camp2 - there is a need to distinguish servers, they are not identical, uniform naming across project is required (but folks might still like to be able to have a default, and probably want to change that default on occasion), . So far, git is written as if the whole world is in Camp1, and the problems appear for Camp2. The underlying issue is that git has convolved the referencing, naming, and designation of a default remote into *one* thing when it is really three things. For git, the default remote is named origin, which is also how it is designated as the default, and is also how you reference the default in commands. Non-default remotes have an arbitrary nickname, are not default as they are not called origin, and are referenced by using their nicknames. To serve Camp2 (and not impact Camp1), origin should be a handle that dereferences to the name of the default remote, and designation of the default remote should be by a separate config item rather than a special name for the remote. Assume core.origin names the default remote: For Campl, we have core.origin=origin with the default remote having nickname origin. For Camp2, we could have core.origin=<whatever> with the default remote having nickname <whatever> At the command line, "git fetch" dereferences to $(git config core.origin), which is origin for Camp1, but <whatever> for Camp2. So, Camp1 users don't notice anything is different, and Camp2 users don't have a number of different servers all referred to as "origin". The key is that in Camp2, a given remote now can have the *same* nickname for all members of the project, regardless of which remote they have made their default. "git fetch" and "git fetch origin" still work, they just dereference core.origin (perhaps verbosely to warn that the remote being updated is *not* actually named origin), then update the remotes/$(git config core.origin)/* branches. Obviously, Camp1 with core.origin=origin is the default, and everything in user land works exactly as it does today. Camp2 with core.origin~=default is only mentioned in the graduate level git course and shielded with "Caution, Sharp Knives!" signs. Fine, I need the knives. Mark ^ permalink raw reply [flat|nested] 134+ messages in thread
* Re: [PATCH] Teach remote machinery about remotes.default config variable 2008-01-15 4:55 ` Mark Levedahl @ 2008-01-15 6:18 ` Junio C Hamano 2008-01-15 23:08 ` Mark Levedahl 0 siblings, 1 reply; 134+ messages in thread From: Junio C Hamano @ 2008-01-15 6:18 UTC (permalink / raw) To: Mark Levedahl; +Cc: Johannes Schindelin, git Mark Levedahl <mlevedahl@gmail.com> writes: > Junio C Hamano wrote: > ... >> Perhaps git-submodule.sh::modules_update should use $url it >> obtains from the configuration in the upper level when running >> git-fetch in the submodule. >> > yes, I like this change, it works very nicely. but that last patch is > only a partial solution... >> If you view the problem this way, your earlier "git fetch while >> the HEAD is detached always uses 'origin'" may turn out to be a >> non-issue. >> >> Which again brings us back to Johannes's earlier point. If the >> issue is about submodule, maybe what needs to be fixes is in >> git-submodule, and not the defaulting to 'origin' git-fetch and >> friends do. >> > Nope, git submodule *still* requires origin (e.g., execute git > submodule init or update on a detached head). Now I am even more confused. The approach I suggested in a few paragraphs above, to which you just said "I like this change", is about making "git submodule update" to use the url configured in the upper level repository when it runs "git fetch". I am looking at around l.238 of git-submodule.sh. In the current code, it runs "git-fetch" without any parameter, which would allow it default to origin or whatever, which may or may not be desirable depending on where the 'origin' points at. If you make that particular git-fetch explicitly say where the fetch should be done from, wouldn't it fix the issue for that codepath? Why does it still require origin? ^ permalink raw reply [flat|nested] 134+ messages in thread
* Re: [PATCH] Teach remote machinery about remotes.default config variable 2008-01-15 6:18 ` Junio C Hamano @ 2008-01-15 23:08 ` Mark Levedahl 2008-01-16 0:17 ` Johannes Schindelin 0 siblings, 1 reply; 134+ messages in thread From: Mark Levedahl @ 2008-01-15 23:08 UTC (permalink / raw) To: Junio C Hamano; +Cc: git Junio C Hamano wrote: >> Nope, git submodule *still* requires origin (e.g., execute git >> submodule init or update on a detached head). >> > > Now I am even more confused. > > The approach I suggested in a few paragraphs above, to which you > just said "I like this change", is about making "git submodule > update" to use the url configured in the upper level repository > when it runs "git fetch". I am looking at around l.238 of > git-submodule.sh. In the current code, it runs "git-fetch" > without any parameter, which would allow it default to origin or > whatever, which may or may not be desirable depending on where > the 'origin' points at. If you make that particular git-fetch > explicitly say where the fetch should be done from, wouldn't it > fix the issue for that codepath? Why does it still require > origin? 1) If top-level is on a detached head, then the remotes machinery will find current remote is "origin". This is what would be passed down the chain. 2) Absent the other changes in the thread, git-submodule-init still invokes git clone *without* -o in the submodules, and thus still defines and points to remote "origin". Mark ^ permalink raw reply [flat|nested] 134+ messages in thread
* Re: [PATCH] Teach remote machinery about remotes.default config variable 2008-01-15 23:08 ` Mark Levedahl @ 2008-01-16 0:17 ` Johannes Schindelin 2008-01-16 1:25 ` Mark Levedahl 0 siblings, 1 reply; 134+ messages in thread From: Johannes Schindelin @ 2008-01-16 0:17 UTC (permalink / raw) To: Mark Levedahl; +Cc: Junio C Hamano, git Hi, On Tue, 15 Jan 2008, Mark Levedahl wrote: > Junio C Hamano wrote: > > > Nope, git submodule *still* requires origin (e.g., execute git > > > submodule init or update on a detached head). > > > > > > > Now I am even more confused. > > > > The approach I suggested in a few paragraphs above, to which you > > just said "I like this change", is about making "git submodule > > update" to use the url configured in the upper level repository > > when it runs "git fetch". I am looking at around l.238 of > > git-submodule.sh. In the current code, it runs "git-fetch" > > without any parameter, which would allow it default to origin or > > whatever, which may or may not be desirable depending on where > > the 'origin' points at. If you make that particular git-fetch > > explicitly say where the fetch should be done from, wouldn't it > > fix the issue for that codepath? Why does it still require > > origin? > 1) If top-level is on a detached head, then the remotes machinery will > find current remote is "origin". This is what would be passed down the > chain. > > 2) Absent the other changes in the thread, git-submodule-init still > invokes git clone *without* -o in the submodules, and thus still defines > and points to remote "origin". There's got to be a way to fix this _without_ affecting other users. Ciao, Dscho ^ permalink raw reply [flat|nested] 134+ messages in thread
* Re: [PATCH] Teach remote machinery about remotes.default config variable 2008-01-16 0:17 ` Johannes Schindelin @ 2008-01-16 1:25 ` Mark Levedahl 2008-01-16 1:40 ` Johannes Schindelin 0 siblings, 1 reply; 134+ messages in thread From: Mark Levedahl @ 2008-01-16 1:25 UTC (permalink / raw) To: Johannes Schindelin; +Cc: Junio C Hamano, git Johannes Schindelin wrote: > > There's got to be a way to fix this _without_ affecting other users. > > Ciao, > Dscho > > > I believe the only normally visible change from my proposal is that git-submodule update will follow top-level's branch from branch.<name>.remote, which is a good thing. The other changes are only visible if using clone -o or otherwise explicitly asking that "origin" not be used or defined, which again is actually following the user's request. If you know of other effects, please explain them. Mark ^ permalink raw reply [flat|nested] 134+ messages in thread
* Re: [PATCH] Teach remote machinery about remotes.default config variable 2008-01-16 1:25 ` Mark Levedahl @ 2008-01-16 1:40 ` Johannes Schindelin 0 siblings, 0 replies; 134+ messages in thread From: Johannes Schindelin @ 2008-01-16 1:40 UTC (permalink / raw) To: Mark Levedahl; +Cc: Junio C Hamano, git Hi, On Tue, 15 Jan 2008, Mark Levedahl wrote: > Johannes Schindelin wrote: > > > There's got to be a way to fix this _without_ affecting other users. > I believe the only normally visible change from my proposal is that > git-submodule update will follow top-level's branch from > branch.<name>.remote, which is a good thing. The other changes are only > visible if using clone -o or otherwise explicitly asking that "origin" > not be used or defined, which again is actually following the user's > request. > > If you know of other effects, please explain them. Do I really have to explain this late in the game for 1.5.4 how such intrusive changes can affect stability of code paths which would be otherwise unaffected by submodules? I think not. Ciao, Dscho ^ permalink raw reply [flat|nested] 134+ messages in thread
* Re: [PATCH] Teach remote machinery about remotes.default config variable 2008-01-12 19:34 ` Mark Levedahl 2008-01-12 20:24 ` Johannes Schindelin @ 2008-01-12 20:26 ` Junio C Hamano 2008-01-12 22:24 ` Mark Levedahl 1 sibling, 1 reply; 134+ messages in thread From: Junio C Hamano @ 2008-01-12 20:26 UTC (permalink / raw) To: Mark Levedahl; +Cc: git Mark Levedahl <mlevedahl@gmail.com> writes: > Junio C Hamano wrote: >> Ahh. >> >> Does that suggest the new configuration thing is only about the >> "submodule update" command, not "remotes.default" that affects >> how the non-submodule merge and fetch works? >> >> > Yes - this patch set was inspired by the single question of "how do I > avoid needing to define origin as opposed to a server-specific > nickname now that I am using sub-modules?" If it is truly only about "submodule update" then the change seems too intrusive, especially "remotes.default" variable that affects the way how fetch and merge works in situations that do not involve submodules. If it is not limited to "submodule update" but equally valid fix to non-submodule situations, the changes to the other parts may very well be justifiable, but that would mean your "Yes" is a lie and instead should be "No, but these situations are helped by these changes because...". In any case, let's step back a bit. Earlier you said in a response to Dscho that your servers are named consistently across repositories. servername.foo.bar has nickname servername everywhere. If your top-level repository needs to access a specific server "frotz.foo.bar" for updates, then you would have bootstrapped the whole thing with: $ git clone git://frotz.foo.bar/toplevel.git and in that particular instance of the repository, the source repository on frotz.foo.bar would have been known as 'origin', right? I would not object if you also gave another nickname 'frotz' to the same repository for consistency across developers. If that is the case, I am wondering why your subprojects are not pointing at the corresponding repository on that same 'frotz.foo.bar' machine as 'origin'. I suspect the reason is that .gitmodules do not say 'frotz.foo.bar' but name some other machine. And in-tree .gitmodules can name only one URL, as it is project global and shared by everybody. There is no escaping it. At least as things were designed, "git submodule init" takes URL recorded in .gitmodules as a hint, but this is for the user to override in .git/config in the top-level. Maybe the UI to allow this overriding is not easy enough to use, and your submodules ended up pointing at wrong (from the machine's point of view) URL as 'origin'. And perhaps that is the root cause of this issue? I am looking at the discussion on the list archive when we discussed the initial design of .gitmodules: http://thread.gmane.org/gmane.comp.version-control.git/47466/focus=47502 http://thread.gmane.org/gmane.comp.version-control.git/47466/focus=47548 http://thread.gmane.org/gmane.comp.version-control.git/47466/focus=47621 I do not think we are there yet, and suspect that the current "git submodule init" does not give the user a chance to say "the URL recorded in the in-tree .gitmodules corresponds to this URL in this repository for administrative or network connectivity or whatever reasons". Maybe that is the real issue that we should be tackling. I dunno. Although I _think_ being able to use nickname other than hardcoded 'origin' for fetch/merge is a good change, if my above suspicion is correct, that change alone would not make the life easier to people who _use_ submodules, as the need for them to set up extra nicknames (like 'frotz') and configure the submodule repositories to use that specific nickname instead of 'origin' would not change. For communication purposes, I would agree with Dscho that the name 'origin' that names different things for different people is wrong and using specific name 'frotz' would solve communication issues. But when using the repository and doing actual work, wouldn't it be _much_ better if you can consistently go to a repository on a random machine and always can say 'origin' to mean the other repository this repository usually gets new objects from (and sends its new objects to)? ^ permalink raw reply [flat|nested] 134+ messages in thread
* Re: [PATCH] Teach remote machinery about remotes.default config variable 2008-01-12 20:26 ` Junio C Hamano @ 2008-01-12 22:24 ` Mark Levedahl 2008-01-12 22:48 ` Junio C Hamano 0 siblings, 1 reply; 134+ messages in thread From: Mark Levedahl @ 2008-01-12 22:24 UTC (permalink / raw) To: Junio C Hamano; +Cc: git Junio C Hamano wrote: > If it is truly only about "submodule update" then the change > seems too intrusive, especially "remotes.default" variable that > affects the way how fetch and merge works in situations that do > not involve submodules. > If it is not limited to "submodule update" but equally valid fix > to non-submodule situations, the changes to the other parts may > very well be justifiable, but that would mean your "Yes" is a > lie and instead should be "No, but these situations are helped > by these changes because...". > > First, I resent the patch series last night, it now uses core.origin to avoid touching remotes.* namespace. The changes *do* fix a nit when on a non-tracking branch. With this, fetch / merge / pull will now honor that the user said (via git clone -o frotz) "my upstream is nicknamed frotz" and not try to use origin when origin was never defined. So, while fixing this minor aggravation wasn't my motivation, I view this as a nice side-benefit :^). The driving issues: 1) I deal with too many servers for "origin" to be a useful nick name, and we have an agreed set of nickname / server pairings across my project. 2) Therefore, we always do git clone -o frotz frotz.foo.bar/path_to_git. 3) Because of 2, for top-level, "origin" is not defined, tracking branches set up via git branch --track point to the correct remote, and we basically understand branch names as <nickname>/branch. In other words, we *are* aware of what server we are using. 4) git-submodule update breaks the above: - a) it invokes git clone frotz.foo.bar/path_to_git thus defining "origin" as the nickname for frotz.foo.bar. b) it invokes bare git-fetch on a detached head, so the upstream *has* to be origin. > If your top-level repository needs to access a specific server > "frotz.foo.bar" for updates, then you would have bootstrapped > the whole thing with: > > $ git clone git://frotz.foo.bar/toplevel.git > > and in that particular instance of the repository, the source > repository on frotz.foo.bar would have been known as 'origin', > right? Nope, we did it with git clone -o frotz git://frotz.foo.bar/toplevel.git We *never* define origin, frozt.foo.bar is *always* frotz. > I would not object if you also gave another nickname > 'frotz' to the same repository for consistency across > developers. > good. We are making (some) progress. :^) > If that is the case, I am wondering why your subprojects are not > pointing at the corresponding repository on that same > 'frotz.foo.bar' machine as 'origin'. I suspect the reason is > that .gitmodules do not say 'frotz.foo.bar' but name some other > machine. > Actually, 1) We don't use origin because we avoid having to wonder "Is frotz.foo.bar named "origin" or "frotz" on this client, and thus how do I get data from frotz? 2) I submitted the change allowing submodules to be recorded into .gitmodules with a relative url (e.g., ./path_from_parent_to_submodule) rather than an absolute, so we record the relative path only. 3) Thus, git submodule has set up the submodules to point at the parent project's default remote. However, in the parent the server is nicknamed "frotz", but now in the submodule the server is nicknamed "origin" Oops. With my patches, parent and submodule both refer to frotz.foo.bar as frotz. > And in-tree .gitmodules can name only one URL, as it is project > global and shared by everybody. There is no escaping it. > At least as things were designed, "git submodule init" takes URL > recorded in .gitmodules as a hint, but this is for the user to > override in .git/config in the top-level. Maybe the UI to allow > this overriding is not easy enough to use, and your submodules > ended up pointing at wrong (from the machine's point of view) > URL as 'origin'. And perhaps that is the root cause of this > issue? > > Again, the relative-url patch was to address this so that a project that is mirrored to another server remains valid on the new server without modifying the .gitmodules in-tree. (Yes, I know you *can* modify information in a given clones .git/config, but I'm trying to avoid such manual per clone/checkout modifications where it can reasonably be done.). Basically, I think an important (but not complete) test of the design is that git clone -o frotz git://frotz.foo.bar/myproject.git cd myproject git submodule init git submodule update work, with origin = frotz throughout the submodules, and with the whole project correctly checked out even if the entire project was rehosted onto a different server. With relative urls and my latest patch series last night, this all works, and of course upstream can still be "origin" if that is what is desired. While our overall project exists on many servers, mirroring is an incorrect term. Rather, only certain branches of various parts exist everywhere, many other branches are specific to a given server, so we really name branches using servername/branchname. It is this aspect of the project that causes us to be aware of the server in use, and thus makes use of "origin" as a generic upstream not useful. > I am looking at the discussion on the list archive when we > discussed the initial design of .gitmodules: > > http://thread.gmane.org/gmane.comp.version-control.git/47466/focus=47502 > http://thread.gmane.org/gmane.comp.version-control.git/47466/focus=47548 > http://thread.gmane.org/gmane.comp.version-control.git/47466/focus=47621 > > I do not think we are there yet, and suspect that the current > "git submodule init" does not give the user a chance to say "the > URL recorded in the in-tree .gitmodules corresponds to this URL > in this repository for administrative or network connectivity or > whatever reasons". > > Maybe that is the real issue that we should be tackling. I > dunno. > > Although I _think_ being able to use nickname other than > hardcoded 'origin' for fetch/merge is a good change, if my above > suspicion is correct, that change alone would not make the life > easier to people who _use_ submodules, as the need for them to > set up extra nicknames (like 'frotz') and configure the > submodule repositories to use that specific nickname instead of > 'origin' would not change. > > git-submodule right now supports two different layouts (urls relative to the parent, and absolute urls such that each sub-module is on an independent server). The management approaches to these are going to be different. I also suspect there are two basic use cases here: accumulation of a number of independently managed projects vs. splitting a single major project into a number of smaller pieces to allow some decoupling, but still managing the set as a composite whole. There may be some direct correlation of use-case and submodule layout, don't know. My project uses relative-urls, and I am managing a large project that has been split into a number of components. So, my suggestions are focused entirely upon this design and use-case, and I don't expect I am addressing the others at all. (As usual, this requires someone who needs the other model(s) to step up and drive). For *my* uses (relative urls, single logical project): 1) There are times when the parent's branch.<name>.remote should be flowed down to all subprojects for git submodule update, of course this would require that the remote be defined for all. 2) Thus, there needs to be a way to define a new remote globally for the project, and have it be correctly interpreted by each submodule (e.g., a repeat of the relative-url dereferencing now done by submodule init, but applied later to all submodules to define a new remote). Yes, this could be accomplished by going into each submodule independently and issuing appropriate commands, but administration would be much easier given a top-level command that could recurse and "do the right thing" per sub-project. I *suspect* that origin is a much more useful concept for the alternate construct (absolute urls, loose alliance of separately managed projects), but as I said that is not my problem so please ask folks who have that model to define what works for them. > For communication purposes, I would agree with Dscho that the > name 'origin' that names different things for different people > is wrong and using specific name 'frotz' would solve > communication issues. But when using the repository and doing > actual work, wouldn't it be _much_ better if you can > consistently go to a repository on a random machine and always > can say 'origin' to mean the other repository this repository > usually gets new objects from (and sends its new objects to)? > > > (Acutally, I thought I was the one arguing that using origin when it means different things to different folks is not good. That's the root of my problems. :^) ) Anyway, I have not found any use of "origin" on my project really useful. We have to be and *are* aware of the server/branchname in use, not just the branch. Partly this is because different subgroups have different natural gathering points (we tend to exchange data via ad hoc "mob" branches on whatever server is most accessible to the particular group), and partly because some information simply cannot be allowed on some servers, but basically the more accessible a server is, the less information that server can have. I believe "origin" is really useful only when it has just one meaning, or when all values are effectively identical (e.g., you have several mirrors for load balancing, etc, but all are identical modulo mirroring delays). OTOH, a reasonable change to the semantics of "origin" might be to have: 1) core.origin name the remote that is the "normal" upstream. 2) Reserve and allow use of the name "origin" to mean $core.origin, e.g., in shell scripts replace all references to remote "origin" with $(git config core.origin). Of course, if core.origin = origin, then no user visible change occurs. In this way, git would not record the same remote's branches in two ways (as origin/master and as frotz/master), but rather dereference origin -> frotz and then get frotz/master. Dunno, no matter how you slice it, having more than one way to refer to the same remote is going to be confusing, and that's why we don't use origin. Mark ^ permalink raw reply [flat|nested] 134+ messages in thread
* Re: [PATCH] Teach remote machinery about remotes.default config variable 2008-01-12 22:24 ` Mark Levedahl @ 2008-01-12 22:48 ` Junio C Hamano 2008-01-13 15:47 ` Mark Levedahl 2008-01-13 21:27 ` [PATCH] Teach remote machinery about remotes.default config variable Johannes Schindelin 0 siblings, 2 replies; 134+ messages in thread From: Junio C Hamano @ 2008-01-12 22:48 UTC (permalink / raw) To: Mark Levedahl; +Cc: git Mark Levedahl <mlevedahl@gmail.com> writes: > Basically, I think an important (but not complete) test of the design > is that > > git clone -o frotz git://frotz.foo.bar/myproject.git > cd myproject > git submodule init > git submodule update > > work, with origin = frotz throughout the submodules, and with the > whole project correctly checked out even if the entire project was > rehosted onto a different server. I like that. This is a very good argument, especially because it clarifies very well that the issue is not about "'submodule init' misbehaves" but "fetch/pull/merge does not play well with clone -o". The only remaining (minor) doubt I have (not in the sense that "I object to it!", but in the sense that "I wish there could be a better alternative, but I do not think of one offhand") is polluting the core.* namespace with this configuration variable. Looking at Documentation/config.txt, I realize that we already have made a mistake of allowing core.gitproxy, but other than that single mistake, everything in core.* is still about things that apply to the use of git even when the repository does not talk with any other repository. If we deprecate and rename away that one mistake, we can again make core.* to mean things that are _really_ core, but using core.origin for "the default remote is not called 'origin' but 'frotz' here" is a step backwards from that ideal. But that's a minor naming issue. ^ permalink raw reply [flat|nested] 134+ messages in thread
* Re: [PATCH] Teach remote machinery about remotes.default config variable 2008-01-12 22:48 ` Junio C Hamano @ 2008-01-13 15:47 ` Mark Levedahl 2008-01-13 16:27 ` [PATCH] Teach remote machinery about core.origin " Mark Levedahl 2008-01-13 21:27 ` [PATCH] Teach remote machinery about remotes.default config variable Johannes Schindelin 1 sibling, 1 reply; 134+ messages in thread From: Mark Levedahl @ 2008-01-13 15:47 UTC (permalink / raw) To: Junio C Hamano; +Cc: git Junio C Hamano wrote: > Mark Levedahl <mlevedahl@gmail.com> writes: > > >> Basically, I think an important (but not complete) test of the design >> is that >> >> git clone -o frotz git://frotz.foo.bar/myproject.git >> cd myproject >> git submodule init >> git submodule update >> >> work, with origin = frotz throughout the submodules, and with the >> whole project correctly checked out even if the entire project was >> rehosted onto a different server. >> > > I like that. This is a very good argument, especially because > it clarifies very well that the issue is not about "'submodule > init' misbehaves" but "fetch/pull/merge does not play well with > clone -o" Carrying the above forward... Assume I have a checked out project as above, then in top-level master project I do: git remote add zoo git://zoo.tar.fu hisfork.git git fetch zoo git checkout --track -b fork zoo/fork git submodule update I claim the submodule machinery *should* now follow master's default remote, which is "zoo", for the current branch. In addition, the submodule machinery should define remote "zoo" in each submodule where it does not already exist, using the same logic using in the original init/update phase. This should only apply to modules defined using relative urls. Basically, this formalizes the notion that: * submodules defined using relative urls are "owned" by the master project and will exist anywhere the master does. * submodules defined using absolute urls are incorporated into the project but are separately managed. (While some improved mechanism to automate their management from top-level may be proposed, it is not obvious to me nor addressed here.) The subsequent patch modifies git-submodule to implement this logic, and applies on top of my previous series. (Note: I cannot find my latest series in the git-archives on gmane nor on marc.info, both have only part, and I am suspicious that something went wrong in my sending via gmail, so I am resending the series here, now five patches long. Please excuse if this is redundant). Mark ^ permalink raw reply [flat|nested] 134+ messages in thread
* [PATCH] Teach remote machinery about core.origin config variable 2008-01-13 15:47 ` Mark Levedahl @ 2008-01-13 16:27 ` Mark Levedahl 2008-01-13 16:27 ` [PATCH] git-remote - Unset core.origin when deleting the default remote Mark Levedahl 0 siblings, 1 reply; 134+ messages in thread From: Mark Levedahl @ 2008-01-13 16:27 UTC (permalink / raw) To: gitster; +Cc: git, Mark Levedahl This introduces a new configuration variable, core.origin, that defines the name of the default remote to be used. Traditionally, this is "origin", and could be overridden for a given branch. This change introduces a way to redefine the default as desired and have that honored regardless of the currently checked out head (e.g., core.origin is used when on a detached head or any other non-tracking branch). Signed-off-by: Mark Levedahl <mlevedahl@gmail.com> --- Documentation/config.txt | 6 ++++++ git-parse-remote.sh | 5 +++-- remote.c | 11 ++++++++++- 3 files changed, 19 insertions(+), 3 deletions(-) diff --git a/Documentation/config.txt b/Documentation/config.txt index df091d1..b7241cf 100644 --- a/Documentation/config.txt +++ b/Documentation/config.txt @@ -291,6 +291,12 @@ core.editor:: `GIT_EDITOR` environment, `core.editor`, `VISUAL` and `EDITOR` environment variables and then finally `vi`. +core.origin:: + The name of the remote used by default for fetch / pull. If unset, + origin is assumed. This value is used whenever the current branch + has no corresponding branch.<name>.remote, such as when working on + a detached head. + core.pager:: The command that git will use to paginate output. Can be overridden with the `GIT_PAGER` environment variable. diff --git a/git-parse-remote.sh b/git-parse-remote.sh index 695a409..c7ac7c7 100755 --- a/git-parse-remote.sh +++ b/git-parse-remote.sh @@ -56,8 +56,9 @@ get_remote_url () { get_default_remote () { curr_branch=$(git symbolic-ref -q HEAD | sed -e 's|^refs/heads/||') - origin=$(git config --get "branch.$curr_branch.remote") - echo ${origin:-origin} + git config --get "branch.$curr_branch.remote" || + git config --get "core.origin" || + echo origin } get_remote_default_refs_for_push () { diff --git a/remote.c b/remote.c index 0e00680..302d499 100644 --- a/remote.c +++ b/remote.c @@ -10,6 +10,7 @@ static int allocated_branches; static struct branch *current_branch; static const char *default_remote_name; +static const char *core_origin; #define BUF_SIZE (2048) static char buffer[BUF_SIZE]; @@ -233,6 +234,11 @@ static int handle_config(const char *key, const char *value) add_merge(branch, xstrdup(value)); return 0; } + if (!strcmp(key, "core.origin")) { + if (value) + core_origin = xstrdup(value); + return 0; + } if (prefixcmp(key, "remote.")) return 0; name = key + 7; @@ -291,7 +297,6 @@ static void read_config(void) int flag; if (default_remote_name) // did this already return; - default_remote_name = xstrdup("origin"); current_branch = NULL; head_ref = resolve_ref("HEAD", sha1, 0, &flag); if (head_ref && (flag & REF_ISSYMREF) && @@ -300,6 +305,10 @@ static void read_config(void) make_branch(head_ref + strlen("refs/heads/"), 0); } git_config(handle_config); + if (!default_remote_name) { + default_remote_name = core_origin ? + core_origin : xstrdup("origin"); + } } struct refspec *parse_ref_spec(int nr_refspec, const char **refspec) -- 1.5.4.rc3.14.gc50f ^ permalink raw reply related [flat|nested] 134+ messages in thread
* [PATCH] git-remote - Unset core.origin when deleting the default remote 2008-01-13 16:27 ` [PATCH] Teach remote machinery about core.origin " Mark Levedahl @ 2008-01-13 16:27 ` Mark Levedahl 2008-01-13 16:27 ` [PATCH] git-clone - Set remotes.origin config variable Mark Levedahl 2008-01-14 11:05 ` [PATCH] git-remote - Unset core.origin when deleting the default remote Jeff King 0 siblings, 2 replies; 134+ messages in thread From: Mark Levedahl @ 2008-01-13 16:27 UTC (permalink / raw) To: gitster; +Cc: git, Mark Levedahl Signed-off-by: Mark Levedahl <mlevedahl@gmail.com> --- git-remote.perl | 5 +++++ 1 files changed, 5 insertions(+), 0 deletions(-) diff --git a/git-remote.perl b/git-remote.perl index d13e4c1..75d2371 100755 --- a/git-remote.perl +++ b/git-remote.perl @@ -328,6 +328,11 @@ sub rm_remote { $git->command('config', '--remove-section', "remote.$name"); + my $defremote = $git->config("core.origin"); + if (defined $defremote && $defremote eq $name) { + $git->command("config", "--unset", "core.origin"); + } + eval { my @trackers = $git->command('config', '--get-regexp', 'branch.*.remote', $name); -- 1.5.4.rc3.14.gc50f ^ permalink raw reply related [flat|nested] 134+ messages in thread
* [PATCH] git-clone - Set remotes.origin config variable 2008-01-13 16:27 ` [PATCH] git-remote - Unset core.origin when deleting the default remote Mark Levedahl @ 2008-01-13 16:27 ` Mark Levedahl 2008-01-13 16:27 ` [PATCH] git-submodule - Possibly inherit parent's default remote on init/clone Mark Levedahl 2008-01-14 11:05 ` [PATCH] git-remote - Unset core.origin when deleting the default remote Jeff King 1 sibling, 1 reply; 134+ messages in thread From: Mark Levedahl @ 2008-01-13 16:27 UTC (permalink / raw) To: gitster; +Cc: git, Mark Levedahl This records the users choice of default remote name (by default "origin") as given by the -o option. Signed-off-by: Mark Levedahl <mlevedahl@gmail.com> --- Documentation/git-clone.txt | 3 ++- git-clone.sh | 1 + 2 files changed, 3 insertions(+), 1 deletions(-) diff --git a/Documentation/git-clone.txt b/Documentation/git-clone.txt index fdccbd4..6c15fa4 100644 --- a/Documentation/git-clone.txt +++ b/Documentation/git-clone.txt @@ -95,7 +95,8 @@ OPTIONS --origin <name>:: -o <name>:: Instead of using the remote name 'origin' to keep track - of the upstream repository, use <name> instead. + of the upstream repository, use <name> instead. The name + is recorded in the core.origin config variable. --upload-pack <upload-pack>:: -u <upload-pack>:: diff --git a/git-clone.sh b/git-clone.sh index b4e858c..7208d68 100755 --- a/git-clone.sh +++ b/git-clone.sh @@ -242,6 +242,7 @@ fi && export GIT_DIR && GIT_CONFIG="$GIT_DIR/config" git-init $quiet ${template+"$template"} || usage +git config core.origin $origin if test -n "$bare" then GIT_CONFIG="$GIT_DIR/config" git config core.bare true -- 1.5.4.rc3.14.gc50f ^ permalink raw reply related [flat|nested] 134+ messages in thread
* [PATCH] git-submodule - Possibly inherit parent's default remote on init/clone 2008-01-13 16:27 ` [PATCH] git-clone - Set remotes.origin config variable Mark Levedahl @ 2008-01-13 16:27 ` Mark Levedahl 2008-01-13 16:27 ` [PATCH] Teach git-submodule to use master's remote when updating subprojects Mark Levedahl 0 siblings, 1 reply; 134+ messages in thread From: Mark Levedahl @ 2008-01-13 16:27 UTC (permalink / raw) To: gitster; +Cc: git, Mark Levedahl For submodules defined relative to their parent, it is likely that the parent's defined default remote is correct for the child as well. This allows use of remote names other than "origin", important as managed submodules are typically checked out on a detached head and therefore submodule-update invokes git-fetch using the default remote. Without this change, submodules effectively had to have a default remote of "origin." Signed-off-by: Mark Levedahl <mlevedahl@gmail.com> --- Documentation/git-submodule.txt | 8 +++++--- git-submodule.sh | 19 +++++++++++++------ 2 files changed, 18 insertions(+), 9 deletions(-) diff --git a/Documentation/git-submodule.txt b/Documentation/git-submodule.txt index cffc6d4..440e234 100644 --- a/Documentation/git-submodule.txt +++ b/Documentation/git-submodule.txt @@ -36,9 +36,11 @@ status:: init:: Initialize the submodules, i.e. register in .git/config each submodule - name and url found in .gitmodules. The key used in .git/config is - `submodule.$name.url`. This command does not alter existing information - in .git/config. + name and url found in .gitmodules, along with the default remote origin. + For submodules using a relative url, the default remote is inherited + from the parent project, for absolute urls the default "origin" is used. + The key used in .git/config is submodule.$name.url`. This command does + not alter existing information in .git/config. update:: Update the registered submodules, i.e. clone missing submodules and diff --git a/git-submodule.sh b/git-submodule.sh index ad9fe62..42be4b9 100755 --- a/git-submodule.sh +++ b/git-submodule.sh @@ -7,6 +7,7 @@ USAGE='[--quiet] [--cached] [add <repo> [-b branch]|status|init|update] [--] [<path>...]' OPTIONS_SPEC= . git-sh-setup +. git-parse-remote require_work_tree add= @@ -43,9 +44,7 @@ get_repo_base() { # Resolve relative url by appending to parent's url resolve_relative_url () { - branch="$(git symbolic-ref HEAD 2>/dev/null)" - remote="$(git config branch.${branch#refs/heads/}.remote)" - remote="${remote:-origin}" + remote="$(get_default_remote)" remoteurl="$(git config remote.$remote.url)" || die "remote ($remote) does not have a url in .git/config" url="$1" @@ -95,6 +94,7 @@ module_clone() { path=$1 url=$2 + origin=${3:-origin} # If there already is a directory at the submodule path, # expect it to be empty (since that is the default checkout @@ -110,7 +110,7 @@ module_clone() test -e "$path" && die "A file already exist at path '$path'" - git-clone -n "$url" "$path" || + git-clone -n -o "$origin" "$url" "$path" || die "Clone of '$url' into submodule path '$path' failed" } @@ -130,9 +130,11 @@ module_add() usage fi + origin=origin case "$repo" in ./*|../*) # dereference source url relative to parent's url + origin=$(get_default_remote) realrepo="$(resolve_relative_url $repo)" ;; *) # Turn the source into an absolute path if @@ -157,7 +159,7 @@ module_add() git ls-files --error-unmatch "$path" > /dev/null 2>&1 && die "'$path' already exists in the index" - module_clone "$path" "$realrepo" || exit + module_clone "$path" "$realrepo" "$origin" || exit (unset GIT_DIR; cd "$path" && git checkout -q ${branch:+-b "$branch" "origin/$branch"}) || die "Unable to checkout submodule '$path'" git add "$path" || @@ -189,12 +191,15 @@ modules_init() die "No url found for submodule path '$path' in .gitmodules" # Possibly a url relative to parent + origin=origin case "$url" in ./*|../*) url="$(resolve_relative_url "$url")" + origin=$(get_default_remote) ;; esac + git config submodule."$name".origin "$origin" && git config submodule."$name".url "$url" || die "Failed to register url for submodule path '$path'" @@ -222,10 +227,12 @@ modules_update() say "Submodule path '$path' not initialized" continue fi + origin=$(git config submodule."$name".origin) + origin=${origin:-origin} if ! test -d "$path"/.git then - module_clone "$path" "$url" || exit + module_clone "$path" "$url" "$origin" || exit subsha1= else subsha1=$(unset GIT_DIR; cd "$path" && -- 1.5.4.rc3.14.gc50f ^ permalink raw reply related [flat|nested] 134+ messages in thread
* [PATCH] Teach git-submodule to use master's remote when updating subprojects 2008-01-13 16:27 ` [PATCH] git-submodule - Possibly inherit parent's default remote on init/clone Mark Levedahl @ 2008-01-13 16:27 ` Mark Levedahl 0 siblings, 0 replies; 134+ messages in thread From: Mark Levedahl @ 2008-01-13 16:27 UTC (permalink / raw) To: gitster; +Cc: git, Mark Levedahl Modules that are defined using relative urls to the master project are assumed to be completely owned by the project. When running "submodule update" from the top level, it is reasonable that the entire project exists at the current master's remote. Using the branch.$name.remote machinery, this remote can be different for each branch and can be different than the current defaults in each submodule. This teaches submodule to: 1) Possibly define the current master's remote in each submodule, using the same relative url used by submodule init. 2) Fetch each submodule's updates from the master's remote. Submodules defined using absolute urls (not relative to the parent) are not touched by this logic. These modules are assumed to be independent of the master project so submodule can do no better than to fetch from their currently defined default remotes as already done. Signed-off-by: Mark Levedahl <mlevedahl@gmail.com> --- git-submodule.sh | 20 +++++++++++++++++++- 1 files changed, 19 insertions(+), 1 deletions(-) diff --git a/git-submodule.sh b/git-submodule.sh index 42be4b9..5b4b16f 100755 --- a/git-submodule.sh +++ b/git-submodule.sh @@ -209,11 +209,14 @@ modules_init() # # Update each submodule path to correct revision, using clone and checkout as needed +# For owned submodules (defined using relative url), we use master project's remote +# and define that in each submodule if not already there # # $@ = requested paths (default to all) # modules_update() { + master_remote=$(get_default_remote) git ls-files --stage -- "$@" | grep -e '^160000 ' | while read mode sha1 stage path do @@ -240,9 +243,24 @@ modules_update() die "Unable to find current revision in submodule path '$path'" fi + baseurl="$(GIT_CONFIG=.gitmodules git config submodule."$name".url)" + case "$baseurl" in + ./*|../*) + fetch_remote=$master_remote + (unset GIT_DIR ; cd "$path" && git config remote."$fetch_remote".url > nul) || + ( + absurl="$(resolve_relative_url $baseurl)" + unset GIT_DIR; cd "$path" && git remote add "$master_remote" "$absurl" + ) || die "Unable to define remote '$fetch_remote' in submodule path '$path'" + ;; + *) + fetch_remote= + ;; + esac + if test "$subsha1" != "$sha1" then - (unset GIT_DIR; cd "$path" && git-fetch && + (unset GIT_DIR; cd "$path" && git-fetch "$fetch_remote" && git-checkout -q "$sha1") || die "Unable to checkout '$sha1' in submodule path '$path'" -- 1.5.4.rc3.14.gc50f ^ permalink raw reply related [flat|nested] 134+ messages in thread
* Re: [PATCH] git-remote - Unset core.origin when deleting the default remote 2008-01-13 16:27 ` [PATCH] git-remote - Unset core.origin when deleting the default remote Mark Levedahl 2008-01-13 16:27 ` [PATCH] git-clone - Set remotes.origin config variable Mark Levedahl @ 2008-01-14 11:05 ` Jeff King 2008-01-15 5:02 ` Mark Levedahl 1 sibling, 1 reply; 134+ messages in thread From: Jeff King @ 2008-01-14 11:05 UTC (permalink / raw) To: Mark Levedahl; +Cc: gitster, git On Sun, Jan 13, 2008 at 11:27:08AM -0500, Mark Levedahl wrote: > --- a/git-remote.perl > +++ b/git-remote.perl > @@ -328,6 +328,11 @@ sub rm_remote { > > $git->command('config', '--remove-section', "remote.$name"); > > + my $defremote = $git->config("core.origin"); > + if (defined $defremote && $defremote eq $name) { > + $git->command("config", "--unset", "core.origin"); > + } > + I'm not sure I see the use case that this helps. Presumably you are doing one of (assuming your core.origin is 'foo'): - delete 'foo', and then proceed with usual git commands. In this case, your core.origin has reverted to 'origin', but what is the chance that you actually have such a remote (since you presumably cloned with -o foo)? - delete 'foo', then re-add 'foo'. I would expect this to be equivalent to editing the config, but as a side effect, your core.origin has mysteriously changed. - delete 'foo', then re-add 'bar' with the intent of making it your new origin. This doesn't help at all, since there's nothing automatically setting core.origin to 'bar', so you might as well leave it as the bogus 'foo' rather than the bogus 'origin'. And to help this use case, something like a "-d" flag to git-remote to set the new origin as the default might make sense. I.e., git remote rm foo git remote add -d bar git://bar/project.git Alternatively, when adding a remote, if it is the _only_ remote (or perhaps if the current core.origin doesn't exist), we could set core.origin which would automagically cover the latter two cases. Although it feels a little too DWIM. -Peff ^ permalink raw reply [flat|nested] 134+ messages in thread
* Re: [PATCH] git-remote - Unset core.origin when deleting the default remote 2008-01-14 11:05 ` [PATCH] git-remote - Unset core.origin when deleting the default remote Jeff King @ 2008-01-15 5:02 ` Mark Levedahl 2008-01-15 16:50 ` Jeff King 0 siblings, 1 reply; 134+ messages in thread From: Mark Levedahl @ 2008-01-15 5:02 UTC (permalink / raw) To: Jeff King; +Cc: gitster, git Jeff King wrote: > On Sun, Jan 13, 2008 at 11:27:08AM -0500, Mark Levedahl wrote: > > >> --- a/git-remote.perl >> +++ b/git-remote.perl >> @@ -328,6 +328,11 @@ sub rm_remote { >> >> $git->command('config', '--remove-section', "remote.$name"); >> >> + my $defremote = $git->config("core.origin"); >> + if (defined $defremote && $defremote eq $name) { >> + $git->command("config", "--unset", "core.origin"); >> + } >> + >> > > I'm not sure I see the use case that this helps. > Just being thorough: the man page claims that "git remote rm foo" removes all mention of remote foo. > Alternatively, when adding a remote, if it is the _only_ remote (or > perhaps if the current core.origin doesn't exist), we could set > core.origin which would automagically cover the latter two cases. > Although it feels a little too DWIM. > > -Peff > I suspect anything done in this case is going to suffer from DWIM-itis in some conditions. I can't offer a better argument than the one above. Mark ^ permalink raw reply [flat|nested] 134+ messages in thread
* Re: [PATCH] git-remote - Unset core.origin when deleting the default remote 2008-01-15 5:02 ` Mark Levedahl @ 2008-01-15 16:50 ` Jeff King 0 siblings, 0 replies; 134+ messages in thread From: Jeff King @ 2008-01-15 16:50 UTC (permalink / raw) To: Mark Levedahl; +Cc: gitster, git On Tue, Jan 15, 2008 at 12:02:45AM -0500, Mark Levedahl wrote: >> I'm not sure I see the use case that this helps. >> > Just being thorough: the man page claims that "git remote rm foo" removes > all mention of remote foo. I was going to respond "by that rationale, 'git remote rm' should be removing branch.*.remote keys that point to the removed remote". But looking at the code, it already does that. So your change actually keeps things consistent. Not the choice I would have made, but I guess it just goes to show that I use "vi" instead of "git remote". Consider my objection withdrawn. -Peff ^ permalink raw reply [flat|nested] 134+ messages in thread
* Re: [PATCH] Teach remote machinery about remotes.default config variable 2008-01-12 22:48 ` Junio C Hamano 2008-01-13 15:47 ` Mark Levedahl @ 2008-01-13 21:27 ` Johannes Schindelin 2008-01-14 1:50 ` Junio C Hamano 1 sibling, 1 reply; 134+ messages in thread From: Johannes Schindelin @ 2008-01-13 21:27 UTC (permalink / raw) To: Junio C Hamano; +Cc: Mark Levedahl, git Hi, On Sat, 12 Jan 2008, Junio C Hamano wrote: > Mark Levedahl <mlevedahl@gmail.com> writes: > > > Basically, I think an important (but not complete) test of the design > > is that > > > > git clone -o frotz git://frotz.foo.bar/myproject.git > > cd myproject > > git submodule init > > git submodule update > > > > work, with origin = frotz throughout the submodules, and with the > > whole project correctly checked out even if the entire project was > > rehosted onto a different server. > > I like that. This is a very good argument, especially because it > clarifies very well that the issue is not about "'submodule init' > misbehaves" but "fetch/pull/merge does not play well with clone -o". FWIW I disagree. I never understood why people want to complicate things by being able to name default _keys_ differently. Why not letting "origin" being the default being pulled from, and be done with it? Besides, I _really_ do not understand why we have such a discussion in rc phase. There are _many_ more interesting discussions now that _also_ do not belong into a freeze phase. Ciao, Dscho ^ permalink raw reply [flat|nested] 134+ messages in thread
* Re: [PATCH] Teach remote machinery about remotes.default config variable 2008-01-13 21:27 ` [PATCH] Teach remote machinery about remotes.default config variable Johannes Schindelin @ 2008-01-14 1:50 ` Junio C Hamano 2008-01-14 6:49 ` safecrlf not in 1.5.4 (was Re: [PATCH] Teach remote machinery about remotes.default config variable) Steffen Prohaska ` (2 more replies) 0 siblings, 3 replies; 134+ messages in thread From: Junio C Hamano @ 2008-01-14 1:50 UTC (permalink / raw) To: Johannes Schindelin; +Cc: Mark Levedahl, git Johannes Schindelin <Johannes.Schindelin@gmx.de> writes: > I never understood why people want to complicate things by being able to > name default _keys_ differently. Why not letting "origin" being the > default being pulled from, and be done with it? That happens to match my personal feeling. HOWEVER. We treat 'origin' in a special way when you do this: $ git clone somewhere new.git $ cd new.git $ git checkout HEAD^0 $ git pull And we already have "clone -o" and claim to support that option. I think that it is very reasonable from the consistency point of view to make sure that the following sequence treats 'frotz' the same special way the above treats 'origin' specially: $ git clone -o frotz somewhere new.git $ cd new.git $ git checkout HEAD^0 $ git pull A purist alternative is to deprecate "git clone -o" and eventually remove it. Note that I was agreeing only with this specific aspect of the argument. I am not at all interested in getting involved in refining or re-defining the existing submodule semantics this late in the cycle before 1.5.4. But I can very well see that fixing this specific inconsistency can be separated out from the rest of Mark's series and viewed as a set of trivially correct fixes. > Besides, I _really_ do not understand why we have such a > discussion in rc phase. There are _many_ more interesting > discussions now that _also_ do not belong into a freeze phase. Currently the ones I looked at and consider possible 1.5.4 material are http-push fixes from Grégoire Barbier and parse_commit_buffer() tightening from Martin Koegler. Recently I looked at the following patches and topics but I do not think any of them belongs to 1.5.4. None of them is obvious and trivially correct fix to regressions or serious existing bugs: * compress/decompress abstraction (Marco) * crlf (Steffen Prohaska and Dmitry Potapov) * whitespace error: "cr at eol is ok" (me) * various conflicting submodule changes(Ping Yin, Mark Levedahl, Imran M Yousuf) * unconfigured ident safety (Stephen Sinclair) * gitweb feed from commit to commitdiff (Florian La Rouche -- Jakub seems to be on top of this so I am not worried about it too much). * color.ui (Matthias Kestenholz) * test scripts to use valgrind (Jeff King, but there was another one in the past -- can their efforts compared and coordinated better?). * various lstat(2) reduction changes (me). * pathname safety on insane filesystems (Linus, Robin Rosenberg, me). (yes, some of the above list do not even have any code). I am hoping that authors will resend the ones they really care about after 1.5.4, as I do not want to take patches early. Thanks. ^ permalink raw reply [flat|nested] 134+ messages in thread
* safecrlf not in 1.5.4 (was Re: [PATCH] Teach remote machinery about remotes.default config variable) 2008-01-14 1:50 ` Junio C Hamano @ 2008-01-14 6:49 ` Steffen Prohaska [not found] ` <31687420-EB17-4651-AD6C-07213311ABDA-wjoc1KHpMeg@public.gmane.org> [not found] ` < 7vejcklv84.fsf@gitster.siamese.dyndns.org> 2008-01-14 11:18 ` [PATCH] Teach remote machinery about remotes.default config variable Johannes Schindelin 2008-01-18 9:41 ` What's not in 'master' but should be Junio C Hamano 2 siblings, 2 replies; 134+ messages in thread From: Steffen Prohaska @ 2008-01-14 6:49 UTC (permalink / raw) To: Junio C Hamano Cc: Johannes Schindelin, Mark Levedahl, Git Mailing List, msysGit On Jan 14, 2008, at 2:50 AM, Junio C Hamano wrote: > Recently I looked at the following patches and topics but I do > not think any of them belongs to 1.5.4. None of them is obvious > and trivially correct fix to regressions or serious existing > bugs: > [...] > * crlf (Steffen Prohaska and Dmitry Potapov) [...] > I am hoping that authors will resend the ones they really care > about after 1.5.4, as I do not want to take patches early. Thanks for your update on this. I agree with your opinion, although I'd prefer to have the safecrlf option soon. Without safecrlf I'll not enable core.autocrlf=true in msysgit. Now that I see a reasonable way of having at least a warning about potential data corruption when core.autocrlf=true, I'm even stronger against enabling it without a safety valve. As I pointed out in the recent CRLF discussion, I believe the problem is not specific to Windows but is about a reasonable default configuration for cross-platform projects. CRLF conversion must be enabled on all platforms to have good defaults for a mixed Unix/Windows environment, and hence the safecrlf if also needed on all platforms. So I don't see much value in having the safecrlf only in msysgit and not in official git. Junio, Do you see a chance to have safecrlf in 1.5.4.1? I am currently considering wether it is worth following the maint series of official git with msysgit. That is we'd have a maint branch in msysgit, which would merge from Junio's maint. Although we're still in preview mode with msysgit I tend to believe that this would be a good idea. The preview tag is mostly due to the unspecified set of features of msysgit, not that I think part of msysgit is not already very stable and usable. But msysgit only supports a subset of the commands of official git and we don't really say or even know which commands currently work reliably. It could be worth to compile such a list and only install the commands that we are convinced of being ready for production. Steffen ^ permalink raw reply [flat|nested] 134+ messages in thread
[parent not found: <31687420-EB17-4651-AD6C-07213311ABDA-wjoc1KHpMeg@public.gmane.org>]
* Re: safecrlf not in 1.5.4 [not found] ` <31687420-EB17-4651-AD6C-07213311ABDA-wjoc1KHpMeg@public.gmane.org> @ 2008-01-14 7:30 ` Junio C Hamano 0 siblings, 0 replies; 134+ messages in thread From: Junio C Hamano @ 2008-01-14 7:30 UTC (permalink / raw) To: Steffen Prohaska Cc: Johannes Schindelin, Mark Levedahl, Git Mailing List, msysGit Steffen Prohaska <prohaska-wjoc1KHpMeg@public.gmane.org> writes: > Do you see a chance to have safecrlf in 1.5.4.1? By definition of 'maint', 1.5.4.X are to fix bugs in the features that are in 1.5.4, so the answer is no. But we could end up having a short cycle for 1.5.5 if we agree that the lack of crlf=safe is a severe bug that is worth fixing post 1.5.4. Currently I am not convinced that the lack of crlf=safe is a severe and urgent bug worth "fixing" for 1.5.4. I see it as a new feature, a different variant of crlf behaviour we will be introducing for audience who are not satisfied with existing the crlf variants. ^ permalink raw reply [flat|nested] 134+ messages in thread
[parent not found: < 7vejcklv84.fsf@gitster.siamese.dyndns.org>]
[parent not found: <7vejcklv84.fsf-jO8aZxhGsIagbBziECNbOZn29agUkmeCHZ5vskTnxNA@public.gmane.org>]
* Re: safecrlf not in 1.5.4 [not found] ` <7vejcklv84.fsf-jO8aZxhGsIagbBziECNbOZn29agUkmeCHZ5vskTnxNA@public.gmane.org> @ 2008-01-14 8:29 ` Steffen Prohaska 2008-01-14 19:41 ` [msysGit] " Junio C Hamano 2008-01-14 9:04 ` Dmitry Potapov 1 sibling, 1 reply; 134+ messages in thread From: Steffen Prohaska @ 2008-01-14 8:29 UTC (permalink / raw) To: Junio C Hamano Cc: Johannes Schindelin, Mark Levedahl, Git Mailing List, msysGit On Jan 14, 2008, at 8:30 AM, Junio C Hamano wrote: > > Steffen Prohaska <prohaska-wjoc1KHpMeg@public.gmane.org> writes: > >> Do you see a chance to have safecrlf in 1.5.4.1? > > By definition of 'maint', 1.5.4.X are to fix bugs in the > features that are in 1.5.4, so the answer is no. I expected this answer. > But we could end up having a short cycle for 1.5.5 if we agree > that the lack of crlf=safe is a severe bug that is worth fixing > post 1.5.4. > > Currently I am not convinced that the lack of crlf=safe is a > severe and urgent bug worth "fixing" for 1.5.4. I see it as a > new feature, a different variant of crlf behaviour we will be > introducing for audience who are not satisfied with existing the > crlf variants. So I should try harder to find better arguments. But this has time until the 1.5.4 release is out. For now, I am being quiet. (Well, I'll continue to improve the safecrlf patch and most likely will send it to the list, too. But I don't expect to find it anywhere in your repo before 1.5.4.) Steffen ^ permalink raw reply [flat|nested] 134+ messages in thread
* Re: [msysGit] Re: safecrlf not in 1.5.4 2008-01-14 8:29 ` Steffen Prohaska @ 2008-01-14 19:41 ` Junio C Hamano 0 siblings, 0 replies; 134+ messages in thread From: Junio C Hamano @ 2008-01-14 19:41 UTC (permalink / raw) To: Steffen Prohaska Cc: Johannes Schindelin, Mark Levedahl, Git Mailing List, msysGit Steffen Prohaska <prohaska@zib.de> writes: > On Jan 14, 2008, at 8:30 AM, Junio C Hamano wrote: > >> By definition of 'maint', 1.5.4.X are to fix bugs in the >> features that are in 1.5.4, so the answer is no. > > I expected this answer. And it won't change. >> But we could end up having a short cycle for 1.5.5 if we agree >> that the lack of crlf=safe is a severe bug that is worth fixing >> post 1.5.4. > ... > So I should try harder to find better arguments. But this has > time until the 1.5.4 release is out. For now, I am being quiet. Instead, you could be louder and convince people that it is a severe bug worth fixing before 1.5.4, like Linus did with the issue with performance regression on a partial commit. It's entirely your choice. > (Well, I'll continue to improve the safecrlf patch and most > likely will send it to the list, too...) Please do. "I am currently not convinced" does not mean "I am always right" nor "I won't reconsider". ^ permalink raw reply [flat|nested] 134+ messages in thread
* Re: safecrlf not in 1.5.4 [not found] ` <7vejcklv84.fsf-jO8aZxhGsIagbBziECNbOZn29agUkmeCHZ5vskTnxNA@public.gmane.org> 2008-01-14 8:29 ` Steffen Prohaska @ 2008-01-14 9:04 ` Dmitry Potapov 2008-01-14 17:35 ` Pierre Habouzit 1 sibling, 1 reply; 134+ messages in thread From: Dmitry Potapov @ 2008-01-14 9:04 UTC (permalink / raw) To: Junio C Hamano Cc: Steffen Prohaska, Johannes Schindelin, Mark Levedahl, Git Mailing List, msysGit On Sun, Jan 13, 2008 at 11:30:51PM -0800, Junio C Hamano wrote: > > But we could end up having a short cycle for 1.5.5 if we agree > that the lack of crlf=safe is a severe bug that is worth fixing > post 1.5.4. Hopefully, the cycle for 1.5.5 will be a bit shorter than 1.5.4, because 1.5.4 seems to have the longest development cycle of all versions, and it already contains almost as much changes as three previous versions ("git diff v1.5.3 master" is almost as big as "git diff v1.5.0 v1.5.3"). Dmitry ^ permalink raw reply [flat|nested] 134+ messages in thread
* Re: safecrlf not in 1.5.4 2008-01-14 9:04 ` Dmitry Potapov @ 2008-01-14 17:35 ` Pierre Habouzit 0 siblings, 0 replies; 134+ messages in thread From: Pierre Habouzit @ 2008-01-14 17:35 UTC (permalink / raw) To: Dmitry Potapov Cc: Junio C Hamano, Steffen Prohaska, Johannes Schindelin, Mark Levedahl, Git Mailing List, msysGit [-- Attachment #1: Type: text/plain, Size: 858 bytes --] On Mon, Jan 14, 2008 at 09:04:56AM +0000, Dmitry Potapov wrote: > On Sun, Jan 13, 2008 at 11:30:51PM -0800, Junio C Hamano wrote: > > > > But we could end up having a short cycle for 1.5.5 if we agree > > that the lack of crlf=safe is a severe bug that is worth fixing > > post 1.5.4. > > Hopefully, the cycle for 1.5.5 will be a bit shorter than 1.5.4, because > 1.5.4 seems to have the longest development cycle of all versions, and > it already contains almost as much changes as three previous versions > ("git diff v1.5.3 master" is almost as big as "git diff v1.5.0 v1.5.3"). hehe, though we still do not have Megabytes of changes between two RCs yet ;) -- ·O· Pierre Habouzit ··O madcoder@debian.org OOO http://www.madism.org [-- Attachment #2: Type: application/pgp-signature, Size: 189 bytes --] ^ permalink raw reply [flat|nested] 134+ messages in thread
* Re: [PATCH] Teach remote machinery about remotes.default config variable 2008-01-14 1:50 ` Junio C Hamano 2008-01-14 6:49 ` safecrlf not in 1.5.4 (was Re: [PATCH] Teach remote machinery about remotes.default config variable) Steffen Prohaska @ 2008-01-14 11:18 ` Johannes Schindelin 2008-01-14 12:16 ` valgrind test scripts (was Re: [PATCH] Teach remote...) Jeff King 2008-01-18 9:41 ` What's not in 'master' but should be Junio C Hamano 2 siblings, 1 reply; 134+ messages in thread From: Johannes Schindelin @ 2008-01-14 11:18 UTC (permalink / raw) To: Junio C Hamano; +Cc: Mark Levedahl, git Hi, On Sun, 13 Jan 2008, Junio C Hamano wrote: > And we already have "clone -o" and claim to support that option. My understanding was _always_ that the "-o" option was meant for the case that you want to clone from somewhere else than where you want to pull from. Something like an initial clone from a USB disk. > * test scripts to use valgrind (Jeff King, but there was another > one in the past -- can their efforts compared and coordinated > better?). Yes, that was written in Perl by Christian Couder: http://article.gmane.org/gmane.comp.version-control.git/69236 Peff's version does not need Perl, and is better integrated with the testsuite (via the new option -m). Christian's version parses the output, and might therefore be nicer to look at. However, I think that both versions do not account for scripts, and I imagine that going through Git.pm and git-sh-setup is necessary for that. Also, it might be a good idea to be able to provide extra arguments, such as "--attach-db=yes". Post 1.5.4, definitely. Ciao, Dscho ^ permalink raw reply [flat|nested] 134+ messages in thread
* valgrind test scripts (was Re: [PATCH] Teach remote...) 2008-01-14 11:18 ` [PATCH] Teach remote machinery about remotes.default config variable Johannes Schindelin @ 2008-01-14 12:16 ` Jeff King 0 siblings, 0 replies; 134+ messages in thread From: Jeff King @ 2008-01-14 12:16 UTC (permalink / raw) To: Johannes Schindelin; +Cc: Junio C Hamano, git On Mon, Jan 14, 2008 at 12:18:13PM +0100, Johannes Schindelin wrote: > > * test scripts to use valgrind (Jeff King, but there was another > > one in the past -- can their efforts compared and coordinated > > better?). > > Yes, that was written in Perl by Christian Couder: > > http://article.gmane.org/gmane.comp.version-control.git/69236 > > Peff's version does not need Perl, and is better integrated with the > testsuite (via the new option -m). Christian's version parses the output, > and might therefore be nicer to look at. I don't think parsing is necessary. Christian's version counts the errors, whereas I just barf if valgrind has mentioned any errors. And using the '-q' output of valgrind means the output is fairly cleaned up. But of course the main difference is that I tried to integrate into the test scripts, and stop running as soon as any errors are found. > However, I think that both versions do not account for scripts, and I > imagine that going through Git.pm and git-sh-setup is necessary for that. Both versions use the 'alias' approach. A more comprehensive approach would be something like: mkdir wrapper-bin cat >wrapper-bin/git <<EOF ... EOF chmod 755 wrapper-bin/git for i in $GIT_PROGRAMS; do ln -s git wrapper-bin/git-$i done PATH=$PWD/wrapper-bin:$PATH which should get all git calls (though we should probably not wrap "git-foo" if git-foo is a script (or we should convert it to "git foo") since I have no desire to valgrind bash or perl). > Also, it might be a good idea to be able to provide extra arguments, such > as "--attach-db=yes". Yes. I suspect some people will need to add custom suppression files depending on their platform, as well. > Post 1.5.4, definitely. Agreed. -Peff ^ permalink raw reply [flat|nested] 134+ messages in thread
* What's not in 'master' but should be 2008-01-14 1:50 ` Junio C Hamano 2008-01-14 6:49 ` safecrlf not in 1.5.4 (was Re: [PATCH] Teach remote machinery about remotes.default config variable) Steffen Prohaska 2008-01-14 11:18 ` [PATCH] Teach remote machinery about remotes.default config variable Johannes Schindelin @ 2008-01-18 9:41 ` Junio C Hamano 2008-01-18 10:15 ` Lars Hjemli ` (2 more replies) 2 siblings, 3 replies; 134+ messages in thread From: Junio C Hamano @ 2008-01-18 9:41 UTC (permalink / raw) To: git; +Cc: Martin Koegler, Grégoire Barbier Junio C Hamano <gitster@pobox.com> writes: > Currently the ones I looked at and consider possible 1.5.4 > material are http-push fixes from Grégoire Barbier and > parse_commit_buffer() tightening from Martin Koegler. It seems that for the past few days, people were having too much fun bashing how broken MacOS X is, and the real work has stalled in the meantime. Well, not really stalled but they certainly made the patches and discussions harder to find in the list archive. But that's Ok. You cannot win every battle. Now the lack of unsetenv can be autodetected, and coloring breakage of --color-words has been fixed. We have also managed to catch a real breakage in fast-import, but somebody seems to have managed to bash OS X even in that thread ;-) But there are still unapplied patches that deserve attention. The one that I am most worried about is Grégoire Barbier's http-push changes: $gmane/70406 <1200250979-19604-1-git-send-email-gb@gbarbier.org> $gmane/70407 <1200250979-19604-2-git-send-email-gb@gbarbier.org> $gmane/70405 <1200250979-19604-3-git-send-email-gb@gbarbier.org> They look sensible on paper. I do not, however, use http-push myself, and I'd really like an independent success (or failure) reports on them. I can also threaten to apply them and see if it breaks for anybody, which I may end up doing. Martin Koegler's parse_commit_buffer() tightening is much easier: $gname/70478 <12003456313661-git-send-email-mkoegler@auto.tuwien.ac.at> It needs a proper commit message; the patch itself is good. I could write one myself but I'd rather want description from the real contributor. gmane = http://news.gmane.org/gmane.comp.version-control.git ^ permalink raw reply [flat|nested] 134+ messages in thread
* Re: What's not in 'master' but should be 2008-01-18 9:41 ` What's not in 'master' but should be Junio C Hamano @ 2008-01-18 10:15 ` Lars Hjemli 2008-01-18 10:24 ` Junio C Hamano 2008-01-18 10:40 ` What's not in 'master', and likely not to be until 1.5.4 Junio C Hamano 2008-01-18 18:28 ` What's not in 'master' but should be Johannes Schindelin 2 siblings, 1 reply; 134+ messages in thread From: Lars Hjemli @ 2008-01-18 10:15 UTC (permalink / raw) To: Junio C Hamano; +Cc: git On Jan 18, 2008 10:41 AM, Junio C Hamano <gitster@pobox.com> wrote: > It seems that for the past few days, people were having too much > fun bashing how broken MacOS X is, and the real work has stalled > in the meantime. Well, not really stalled but they certainly > made the patches and discussions harder to find in the list > archive. Here's a patch which might have been lost in the noise: http://thread.gmane.org/gmane.comp.version-control.git/70463 -- larsh ^ permalink raw reply [flat|nested] 134+ messages in thread
* Re: What's not in 'master' but should be 2008-01-18 10:15 ` Lars Hjemli @ 2008-01-18 10:24 ` Junio C Hamano 2008-01-18 10:53 ` Lars Hjemli 0 siblings, 1 reply; 134+ messages in thread From: Junio C Hamano @ 2008-01-18 10:24 UTC (permalink / raw) To: Lars Hjemli; +Cc: Junio C Hamano, git "Lars Hjemli" <hjemli@gmail.com> writes: > On Jan 18, 2008 10:41 AM, Junio C Hamano <gitster@pobox.com> wrote: >> It seems that for the past few days, people were having too much >> fun bashing how broken MacOS X is, and the real work has stalled >> in the meantime. Well, not really stalled but they certainly >> made the patches and discussions harder to find in the list >> archive. > > Here's a patch which might have been lost in the noise: > > http://thread.gmane.org/gmane.comp.version-control.git/70463 Not really. It came late into rc cycle without fixing any breakage. Not 1.5.4 material. ^ permalink raw reply [flat|nested] 134+ messages in thread
* Re: What's not in 'master' but should be 2008-01-18 10:24 ` Junio C Hamano @ 2008-01-18 10:53 ` Lars Hjemli 2008-01-18 11:09 ` Junio C Hamano 0 siblings, 1 reply; 134+ messages in thread From: Lars Hjemli @ 2008-01-18 10:53 UTC (permalink / raw) To: Junio C Hamano; +Cc: git On Jan 18, 2008 11:24 AM, Junio C Hamano <gitster@pobox.com> wrote: > > "Lars Hjemli" <hjemli@gmail.com> writes: > > > Here's a patch which might have been lost in the noise: > > > > http://thread.gmane.org/gmane.comp.version-control.git/70463 > > Not really. It came late into rc cycle without fixing any > breakage. Not 1.5.4 material. Hmm, isn't a nonfunctional libgit considered breakage? Without something like this patch it is no longer possible to use write_tar_archive()/write_zip_archive() in libgit.a. -- larsh ^ permalink raw reply [flat|nested] 134+ messages in thread
* Re: What's not in 'master' but should be 2008-01-18 10:53 ` Lars Hjemli @ 2008-01-18 11:09 ` Junio C Hamano 2008-01-18 11:54 ` Lars Hjemli 0 siblings, 1 reply; 134+ messages in thread From: Junio C Hamano @ 2008-01-18 11:09 UTC (permalink / raw) To: Lars Hjemli; +Cc: git "Lars Hjemli" <hjemli@gmail.com> writes: > Hmm, isn't a nonfunctional libgit considered breakage? Without > something like this patch it is no longer possible to use > write_tar_archive()/write_zip_archive() in libgit.a. Sorry, but libgit.a is not part of what we deliver. We do not support linking random stuff against libgit.a. We never did. It is not a "library". It has always been just an implementation detail for us to be lax about our Makefile, so that we do not have to write down exactly which *.o files git-foo command depended upon (and it is ceasing to be useful for that as very many things have moved to "the single git binary" these days). Instead we let the linker pick out the necessary pieces out of the archive. So, no, there is no breakage. The code movement you did _should_ not hurt so it may be a fine material for post 1.5.4, but I haven't carefully compared what other change might have accidentally snuck in that patch, and I would rather not have to during the rc cycle. ^ permalink raw reply [flat|nested] 134+ messages in thread
* Re: What's not in 'master' but should be 2008-01-18 11:09 ` Junio C Hamano @ 2008-01-18 11:54 ` Lars Hjemli 2008-01-18 12:34 ` Johannes Schindelin 2008-01-18 20:59 ` Junio C Hamano 0 siblings, 2 replies; 134+ messages in thread From: Lars Hjemli @ 2008-01-18 11:54 UTC (permalink / raw) To: Junio C Hamano; +Cc: git On Jan 18, 2008 12:09 PM, Junio C Hamano <gitster@pobox.com> wrote: > "Lars Hjemli" <hjemli@gmail.com> writes: > > > Hmm, isn't a nonfunctional libgit considered breakage? Without > > something like this patch it is no longer possible to use > > write_tar_archive()/write_zip_archive() in libgit.a. > > Sorry, but libgit.a is not part of what we deliver. We do not > support linking random stuff against libgit.a. We never did. > It is not a "library". I kind of expected this reply, and I know libgit isn't supposed to be a stable API aginst git internals, but it still feels like a regression: cgit has been linking against libgit for over a year now (initial snapshot support added feb 8, 2007), and git-1.5.4 looks like the first git release which cgit cannot use. > The code movement you did _should_ not hurt so it may be a fine > material for post 1.5.4, but I haven't carefully compared what > other change might have accidentally snuck in that patch, and I > would rather not have to during the rc cycle. Ok, I can't argue with that. But could the patch then be part of 1.5.4.X or would I have to wait for 1.5.5 since it's not considered to fix any breakage in 1.5.4? The reason I'm asking is that cgit relies on offical git releases (or rather, the tarballs published on kernel.org when a release is cut), and it would be a shame if the 1.5.4-series becomes unusable for me (there's always the possibility to link against a forked git, but I'd rather not). -- larsh ^ permalink raw reply [flat|nested] 134+ messages in thread
* Re: What's not in 'master' but should be 2008-01-18 11:54 ` Lars Hjemli @ 2008-01-18 12:34 ` Johannes Schindelin 2008-01-18 14:19 ` Lars Hjemli 2008-01-18 20:59 ` Junio C Hamano 1 sibling, 1 reply; 134+ messages in thread From: Johannes Schindelin @ 2008-01-18 12:34 UTC (permalink / raw) To: Lars Hjemli; +Cc: Junio C Hamano, git Hi, On Fri, 18 Jan 2008, Lars Hjemli wrote: > On Jan 18, 2008 12:09 PM, Junio C Hamano <gitster@pobox.com> wrote: > > "Lars Hjemli" <hjemli@gmail.com> writes: > > > > > Hmm, isn't a nonfunctional libgit considered breakage? Without > > > something like this patch it is no longer possible to use > > > write_tar_archive()/write_zip_archive() in libgit.a. > > > > Sorry, but libgit.a is not part of what we deliver. We do not support > > linking random stuff against libgit.a. We never did. It is not a > > "library". > > I kind of expected this reply, and I know libgit isn't supposed to be a > stable API aginst git internals, but it still feels like a regression: > cgit has been linking against libgit for over a year now (initial > snapshot support added feb 8, 2007), and git-1.5.4 looks like the first > git release which cgit cannot use. So you did something that is unsupported, and now it breaks for you. I'd almost say: you should have expected that. HOWEVER, this makes you the perfect guy to actually do something about libification (which has been on my mind for some time, with the prospect of GitCheetah), and therefore you deserve a little help, IMHO. > > The code movement you did _should_ not hurt so it may be a fine > > material for post 1.5.4, but I haven't carefully compared what other > > change might have accidentally snuck in that patch, and I would rather > > not have to during the rc cycle. I have. The 80 lines that were removed are _exactly_ the 80 lines that were added (prepended with some #includes). Like Lars said, the prototype of the only non-static function, sha1_file_to_archive(), was in archive.h, which is included from builtin-archive.c (where the big hunk was moved from), so there is no possibility of a breakage there. It is no _functional_ change, but if Lars _uses_ the function in cgit, I'd say it would be a "courtesy fix" before 1.5.4. Mind you, I would not propose to make libgit.a fully functional as a standalone library before 1.5.4. But Lars contributed a lot, and did a very good job of collecting git patches back in October. Therefore I think that he deserves a little extra attention, even if it does not fix a bug in git proper. Ciao, Dscho ^ permalink raw reply [flat|nested] 134+ messages in thread
* Re: What's not in 'master' but should be 2008-01-18 12:34 ` Johannes Schindelin @ 2008-01-18 14:19 ` Lars Hjemli 0 siblings, 0 replies; 134+ messages in thread From: Lars Hjemli @ 2008-01-18 14:19 UTC (permalink / raw) To: Johannes Schindelin; +Cc: Junio C Hamano, git On Jan 18, 2008 1:34 PM, Johannes Schindelin <Johannes.Schindelin@gmx.de> wrote: > So you did something that is unsupported, and now it breaks for you. > > I'd almost say: you should have expected that. Yeah, it was bound to happen. The sad thing is that I didn't notice earlier; I should probably add a test branch to cgit and run something like this in a cron-job: git checkout test && git fetch && git reset --hard origin/master && (cd git && git fetch && git reset --hard origin/master) && make clean && make test && git commit -a -m "Updated to latest git" && git push --force origin test This should help catching this kind of "breakage" a lot earlier. > [snip] Thanks for the review and the kind words! -- larsh ^ permalink raw reply [flat|nested] 134+ messages in thread
* Re: What's not in 'master' but should be 2008-01-18 11:54 ` Lars Hjemli 2008-01-18 12:34 ` Johannes Schindelin @ 2008-01-18 20:59 ` Junio C Hamano 1 sibling, 0 replies; 134+ messages in thread From: Junio C Hamano @ 2008-01-18 20:59 UTC (permalink / raw) To: Lars Hjemli; +Cc: git "Lars Hjemli" <hjemli@gmail.com> writes: > On Jan 18, 2008 12:09 PM, Junio C Hamano <gitster@pobox.com> wrote: >> "Lars Hjemli" <hjemli@gmail.com> writes: >> >> > Hmm, isn't a nonfunctional libgit considered breakage? Without >> > something like this patch it is no longer possible to use >> > write_tar_archive()/write_zip_archive() in libgit.a. >> >> Sorry, but libgit.a is not part of what we deliver. We do not >> support linking random stuff against libgit.a. We never did. >> It is not a "library". > > I kind of expected this reply, and I know libgit isn't supposed to be > a stable API aginst git internals, but it still feels like a > regression: cgit has been linking against libgit for over a year now > (initial snapshot support added feb 8, 2007), and git-1.5.4 looks like > the first git release which cgit cannot use. If you expected it, you should have added the above four and half lines in the initial message. cgit is something even I have heard of, and breakage of it because of what we have is worth taking into consideration. It would have been nicer if this came before -rc0. >> The code movement you did _should_ not hurt so it may be a fine >> material for post 1.5.4, but I haven't carefully compared what >> other change might have accidentally snuck in that patch, and I >> would rather not have to during the rc cycle. > > Ok, I can't argue with that. Instead of wasting more time in the exchange in this thread, I spent a several uninterrupted minutes' attention to read over your patch to make sure there is no accidental slippage (with help from Dscho as well). I'll make an exception and will apply. Thanks for the patch. ^ permalink raw reply [flat|nested] 134+ messages in thread
* What's not in 'master', and likely not to be until 1.5.4 2008-01-18 9:41 ` What's not in 'master' but should be Junio C Hamano 2008-01-18 10:15 ` Lars Hjemli @ 2008-01-18 10:40 ` Junio C Hamano 2008-01-18 11:25 ` Johannes Sixt ` (4 more replies) 2008-01-18 18:28 ` What's not in 'master' but should be Johannes Schindelin 2 siblings, 5 replies; 134+ messages in thread From: Junio C Hamano @ 2008-01-18 10:40 UTC (permalink / raw) To: git Here is an update to the list I sent earlier. Topics that I thought may deserve attention, discussion and eventual inclusion but are not 1.5.4 material. I think some of them actually have a slight chance of being 1.5.4 material, if interested parties present good enough arguments that they are actually good and safe bugfixes. * compress/decompress abstraction (Marco) * crlf (Steffen Prohaska and Dmitry Potapov) * whitespace error: "cr at eol is ok" (me) * moving archive related helpers to libgit.a (Lars Hjemli) * marking output from "diff --{no,src,dst}-prefix" as a non-git diff (me) * submodule subcommand parser fix for "git submodule add init update" (Imran M Yousuf and me) * submodule recursive wrapper (Imran M Yousuf) * 'origin' is not so special after "clone -o frotz" (Mark Levedahl) * "submodule summary" (Ping Yin) * unconfigured ident safety (Stephen Sinclair) * gitweb feed from commit to commitdiff (Florian La Rouche -- Jakub seems to be on top of this so I am not worried about it too much). * color.ui (Matthias Kestenholz) * test scripts to use valgrind (Jeff King) * various lstat(2) reduction changes (me). * "rebase -i" UI -- should it be simplified to do commit --amend itself? (Dscho) * "cherry-pick/revert" error message fix (Björn Steinbrink and me) * pathname safety on filesystems whose readdir(3) thinks it knows better than users (Linus, Robin Rosenberg, me and others). Again, I am hoping that authors will resend the ones they really care about after 1.5.4, as I do not want to take patches early. ^ permalink raw reply [flat|nested] 134+ messages in thread
* Re: What's not in 'master', and likely not to be until 1.5.4 2008-01-18 10:40 ` What's not in 'master', and likely not to be until 1.5.4 Junio C Hamano @ 2008-01-18 11:25 ` Johannes Sixt 2008-01-18 11:40 ` Junio C Hamano 2008-01-18 20:36 ` Johannes Schindelin 2008-01-18 11:26 ` Jakub Narebski ` (3 subsequent siblings) 4 siblings, 2 replies; 134+ messages in thread From: Johannes Sixt @ 2008-01-18 11:25 UTC (permalink / raw) To: Junio C Hamano; +Cc: git Junio C Hamano schrieb: > Here is an update to the list I sent earlier. Topics that I > thought may deserve attention, discussion and eventual inclusion > but are not 1.5.4 material. BTW, how would you like to have a 40+ patch series presented that implements the port to MinGW? Should I send to the ML despite its volume? (Of course not before 1.5.4 is released.) The current state of the series is available here: http://repo.or.cz/w/git/mingw/j6t.git?a=shortlog;h=upstream -- Hannes ^ permalink raw reply [flat|nested] 134+ messages in thread
* Re: What's not in 'master', and likely not to be until 1.5.4 2008-01-18 11:25 ` Johannes Sixt @ 2008-01-18 11:40 ` Junio C Hamano 2008-01-18 13:04 ` Steffen Prohaska 2008-01-18 20:36 ` Johannes Schindelin 1 sibling, 1 reply; 134+ messages in thread From: Junio C Hamano @ 2008-01-18 11:40 UTC (permalink / raw) To: Johannes Sixt; +Cc: git Johannes Sixt <j.sixt@viscovery.net> writes: > BTW, how would you like to have a 40+ patch series presented that > implements the port to MinGW? Should I send to the ML despite its volume? My gut feeling is that you did your usual great job separating them into logical chunks and it will be a pleasure to review on the usual channel, just like the trickle you did earlier. > The current state of the series is available here: > http://repo.or.cz/w/git/mingw/j6t.git?a=shortlog;h=upstream Let me take a look sometime (but I cannot even say when right now). I might change my mind about the above. ^ permalink raw reply [flat|nested] 134+ messages in thread
* Re: What's not in 'master', and likely not to be until 1.5.4 2008-01-18 11:40 ` Junio C Hamano @ 2008-01-18 13:04 ` Steffen Prohaska 2008-01-18 13:11 ` Johannes Schindelin 0 siblings, 1 reply; 134+ messages in thread From: Steffen Prohaska @ 2008-01-18 13:04 UTC (permalink / raw) To: Johannes Sixt; +Cc: Git Mailing List, Junio C Hamano On Jan 18, 2008, at 12:40 PM, Junio C Hamano wrote: > Johannes Sixt <j.sixt@viscovery.net> writes: > >> BTW, how would you like to have a 40+ patch series presented that >> implements the port to MinGW? Should I send to the ML despite its >> volume? > > My gut feeling is that you did your usual great job separating > them into logical chunks and it will be a pleasure to review on > the usual channel, just like the trickle you did earlier. > >> The current state of the series is available here: >> http://repo.or.cz/w/git/mingw/j6t.git?a=shortlog;h=upstream > > Let me take a look sometime (but I cannot even say when right > now). I might change my mind about the above. I have one or two patches that could be added, most notably the gpg/CRLF patch. Maybe we should discuss them before the whole series is proposed for git.git? Maybe not; then I'd send my patches to the list after Junio applied your series. Steffen ^ permalink raw reply [flat|nested] 134+ messages in thread
* Re: What's not in 'master', and likely not to be until 1.5.4 2008-01-18 13:04 ` Steffen Prohaska @ 2008-01-18 13:11 ` Johannes Schindelin 0 siblings, 0 replies; 134+ messages in thread From: Johannes Schindelin @ 2008-01-18 13:11 UTC (permalink / raw) To: Steffen Prohaska; +Cc: Johannes Sixt, Git Mailing List, Junio C Hamano Hi, On Fri, 18 Jan 2008, Steffen Prohaska wrote: > On Jan 18, 2008, at 12:40 PM, Junio C Hamano wrote: > > > Johannes Sixt <j.sixt@viscovery.net> writes: > > > > > BTW, how would you like to have a 40+ patch series presented that > > > implements the port to MinGW? Should I send to the ML despite its > > > volume? > > > > My gut feeling is that you did your usual great job separating them > > into logical chunks and it will be a pleasure to review on the usual > > channel, just like the trickle you did earlier. > > > > > The current state of the series is available here: > > > http://repo.or.cz/w/git/mingw/j6t.git?a=shortlog;h=upstream > > > > Let me take a look sometime (but I cannot even say when right now). > > I might change my mind about the above. > > I have one or two patches that could be added, most notably the gpg/CRLF > patch. Maybe we should discuss them before the whole series is proposed > for git.git? Maybe not; then I'd send my patches to the list after > Junio applied your series. I think it is long enough as it is. My plan is to look at the 40+ patches, and try to find a sensible subgrouping so that they can be sent in bite-sized chunks. Ciao, Dscho ^ permalink raw reply [flat|nested] 134+ messages in thread
* Re: What's not in 'master', and likely not to be until 1.5.4 2008-01-18 11:25 ` Johannes Sixt 2008-01-18 11:40 ` Junio C Hamano @ 2008-01-18 20:36 ` Johannes Schindelin 2008-01-18 20:58 ` Johannes Schindelin 2008-01-18 22:07 ` Johannes Sixt 1 sibling, 2 replies; 134+ messages in thread From: Johannes Schindelin @ 2008-01-18 20:36 UTC (permalink / raw) To: Johannes Sixt; +Cc: Junio C Hamano, git Hi, On Fri, 18 Jan 2008, Johannes Sixt wrote: > Junio C Hamano schrieb: > > Here is an update to the list I sent earlier. Topics that I > > thought may deserve attention, discussion and eventual inclusion > > but are not 1.5.4 material. > > BTW, how would you like to have a 40+ patch series presented that > implements the port to MinGW? Should I send to the ML despite its volume? > (Of course not before 1.5.4 is released.) > > The current state of the series is available here: > http://repo.or.cz/w/git/mingw/j6t.git?a=shortlog;h=upstream Comments from reading the patches briefly (since there are 42 patches, it needs quite some time to even do it briefly): - Possibly some of these commits could be folded back into f90524e(Add target architecture MinGW): 96a27f1(MinGW: Implement gettimeofday()), 2e05f891(Implement a rudimentary poll() emulation for Windows), 142bda0(Fake implementions of getpwuid(), getuid(), and getpwnam() for Windows), e799caf(Implement setitimer() and sigaction()), 075fee7(Implement a wrapper of execve that can invoke shell scripts), 495f0af(Work around misbehaved rename() on Windows), 34cf7fd(Implement a pipe() replacement whose ends are not inherited to children), 4504323(Implement start_command() for Windows), b8e84a6(Implement a work-around for a misbehaved vsnprintf on Windows), 08bbcb4(Windows: always chmod(, 0666) before unlink()), f6bbf12(Windows: Implement a wrapper of the open() function), 56cedf3(Windows: Fix PRIuMAX definition), 7458a97(Windows: Implement wrappers for gethostbyname(), socket(), and connect()), ef25947(Windows: Fix ntohl() related warnings about printf formatting), b9db7ad(Windows: Implement a custom spawnve()), and 47dacb3(compat/pread.c: Add foward decl to fix warning) - 142bda0(Fake implementions of getpwuid(), getuid(), and getpwnam() for Windows) does not really implement getuid() and getpwnam(), and does not "fake" the implementation of getpwuid() either, but has a minimal implementation of it (affecting the other two functions, of course). - d6596ed(gitk: Disable msgfmt on MinGW) and 004fb4b(Fix renaming .gitk-new to .gitk on Windows if there is already a .gitk) are gitk patches. Further, I think that d6596ed would be better done as an automatic detection of msgfmt's presence; on my Eee PC, there is no msgfmt either... - 20fd16e(Windows: Use a customized struct stat that also has the st_blocks member) should be folded into 6f97065(Add a new lstat and fstat implementation based on Win32 API) (with a comment that you customized the struct stat, too) But then, without 20fd16e, git does not compile, so again I would rather fold that back into the MinGW commit. - I would group the following path related commits: f15879a(MSYS: local clone must use the drive letter in absolute paths), 788324d(Handle Windows style absolute paths in safe_create_leading_directories( )), 851d28d(Treat Windows style path names), 8b9ce70(On Windows use the Windows style PATH separator in add_path()), 8811d9c(On Windows strip ".exe" from the program name), af7a879(Windows: Disambiguate DOS style paths from SSH URLs), 71911a8(Windows: TMP and TEMP environment variables specify a temporary directory), ea035ed(Turn builtin_exec_path into a function.) 4e7e438(Compute the ultimate fallback for exec_path from the program invocation), abd87b3(Windows: Use a relative default template_dir and ETC_GITCONFIG), 7162bf5(When installing, be prepared that template_dir may be relative). The latter two probably want to be merged, too. - in git.git, the onelines are not terminated by "." - in f6bbf12(Windows: Implement a wrapper of the open() function) there is a typo: "on^". - 47dacb3(compat/pread.c: Add foward decl to fix warning) has a typo: "foward". - The SOB line does not come last in 075fee7(Implement a wrapper of execve that can invoke shell scripts.) - I'd prefer f90524e(Add target architecture MinGW) to come last. Alternatively, you could cut out the Makefile change so that the series is still bisectable: MinGW will just not be supported until the very end. Implementation-wise I could not go into too much depth, naturally, but one thing still struck me as odd: $ git grep __MINGW j6t/upstream comes up with 26 hits. The first of them: cache.h:381, function is_absolute_path(). That just cries out loud to be "#ifdef DOS_STYLE_PATHS" instead of "#ifdef __MINGW32__". I guess there should also be -DHAS_NO_FORK_BUT_THREADS -DHAS_TMP_AND_TEMP -DHAS_WINSOCK2, but most of them look like -DDOS_STYLE_PATHS to me. Uff. That were quite some things to wade through, and it's only to get worse when I start for real ;-) Ciao, Dscho ^ permalink raw reply [flat|nested] 134+ messages in thread
* Re: What's not in 'master', and likely not to be until 1.5.4 2008-01-18 20:36 ` Johannes Schindelin @ 2008-01-18 20:58 ` Johannes Schindelin 2008-01-21 4:46 ` Shawn O. Pearce 2008-01-18 22:07 ` Johannes Sixt 1 sibling, 1 reply; 134+ messages in thread From: Johannes Schindelin @ 2008-01-18 20:58 UTC (permalink / raw) To: Johannes Sixt; +Cc: Junio C Hamano, git Hi, On Fri, 18 Jan 2008, Johannes Schindelin wrote: > - d6596ed(gitk: Disable msgfmt on MinGW) and > 004fb4b(Fix renaming .gitk-new to .gitk on Windows if there is already a > .gitk) > are gitk patches. > > Further, I think that d6596ed would be better done as an automatic > detection of msgfmt's presence; on my Eee PC, there is no msgfmt > either... IOW I think something like this: -- snipsnap -- [PATCH] Fall back to po2msg when msgfmt is unavailable At least on my Eee PC I do not have msgfmt. This should be split into two patches, one for git-gui and one for gitk. --- git-gui/Makefile | 6 ++++-- gitk-git/Makefile | 7 +++++-- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/git-gui/Makefile b/git-gui/Makefile index c109eab..c7921e7 100644 --- a/git-gui/Makefile +++ b/git-gui/Makefile @@ -193,8 +193,9 @@ $(GITGUI_MAIN): git-gui.sh GIT-VERSION-FILE GIT-GUI-VARS mv $@+ $@ XGETTEXT ?= xgettext +PO2MSG = $(TCL_PATH) po/po2msg.sh ifdef NO_MSGFMT - MSGFMT ?= $(TCL_PATH) po/po2msg.sh + MSGFMT ?= $(PO2MSG) else MSGFMT ?= msgfmt endif @@ -210,7 +211,8 @@ $(PO_TEMPLATE): $(SCRIPT_SH) $(ALL_LIBFILES) update-po:: $(PO_TEMPLATE) $(foreach p, $(ALL_POFILES), echo Updating $p ; msgmerge -U $p $(PO_TEMPLATE) ; ) $(ALL_MSGFILES): %.msg : %.po - $(QUIET_MSGFMT0)$(MSGFMT) --statistics --tcl -l $(basename $(notdir $<)) -d $(dir $@) $< $(QUIET_MSGFMT1) + $(QUIET_MSGFMT0)$(MSGFMT) --statistics --tcl -l $(basename $(notdir $<)) -d $(dir $@) $< $(QUIET_MSGFMT1) || \ + $(QUIET_MSGFMT0)$(PO2MSG) --statistics --tcl -l $(basename $(notdir $<)) -d $(dir $@) $< $(QUIET_MSGFMT1) lib/tclIndex: $(ALL_LIBFILES) GIT-GUI-VARS $(QUIET_INDEX)if echo \ diff --git a/gitk-git/Makefile b/gitk-git/Makefile index ae2b80b..669ab0e 100644 --- a/gitk-git/Makefile +++ b/gitk-git/Makefile @@ -8,6 +8,7 @@ gitk_libdir ?= $(sharedir)/gitk/lib msgsdir ?= $(gitk_libdir)/msgs msgsdir_SQ = $(subst ','\'',$(msgsdir)) +TCL_PATH ?= tclsh TCLTK_PATH ?= wish INSTALL ?= install RM ?= rm -f @@ -18,8 +19,9 @@ TCLTK_PATH_SQ = $(subst ','\'',$(TCLTK_PATH)) ## po-file creation rules XGETTEXT ?= xgettext +PO2MSG = $(TCL_PATH) po/po2msg.sh ifdef NO_MSGFMT - MSGFMT ?= $(TCL_PATH) po/po2msg.sh + MSGFMT ?= $(PO2MSG) else MSGFMT ?= msgfmt endif @@ -59,5 +61,6 @@ update-po:: $(PO_TEMPLATE) $(foreach p, $(ALL_POFILES), echo Updating $p ; msgmerge -U $p $(PO_TEMPLATE) ; ) $(ALL_MSGFILES): %.msg : %.po @echo Generating catalog $@ - $(MSGFMT) --statistics --tcl $< -l $(basename $(notdir $<)) -d $(dir $@) + $(MSGFMT) --statistics --tcl $< -l $(basename $(notdir $<)) -d $(dir $@) || \ + $(PO2MSG) --statistics --tcl $< -l $(basename $(notdir $<)) -d $(dir $@) -- 1.5.4.rc3.30.g1de144 ^ permalink raw reply related [flat|nested] 134+ messages in thread
* Re: What's not in 'master', and likely not to be until 1.5.4 2008-01-18 20:58 ` Johannes Schindelin @ 2008-01-21 4:46 ` Shawn O. Pearce 2008-01-21 10:37 ` Johannes Schindelin 0 siblings, 1 reply; 134+ messages in thread From: Shawn O. Pearce @ 2008-01-21 4:46 UTC (permalink / raw) To: Johannes Schindelin; +Cc: Johannes Sixt, Junio C Hamano, git Johannes Schindelin <Johannes.Schindelin@gmx.de> wrote: > [PATCH] Fall back to po2msg when msgfmt is unavailable > > diff --git a/git-gui/Makefile b/git-gui/Makefile > index c109eab..c7921e7 100644 > --- a/git-gui/Makefile > +++ b/git-gui/Makefile > @@ -210,7 +211,8 @@ $(PO_TEMPLATE): $(SCRIPT_SH) $(ALL_LIBFILES) > update-po:: $(PO_TEMPLATE) > $(foreach p, $(ALL_POFILES), echo Updating $p ; msgmerge -U $p $(PO_TEMPLATE) ; ) > $(ALL_MSGFILES): %.msg : %.po > - $(QUIET_MSGFMT0)$(MSGFMT) --statistics --tcl -l $(basename $(notdir $<)) -d $(dir $@) $< $(QUIET_MSGFMT1) > + $(QUIET_MSGFMT0)$(MSGFMT) --statistics --tcl -l $(basename $(notdir $<)) -d $(dir $@) $< $(QUIET_MSGFMT1) || \ > + $(QUIET_MSGFMT0)$(PO2MSG) --statistics --tcl -l $(basename $(notdir $<)) -d $(dir $@) $< $(QUIET_MSGFMT1) That will cause the QUIET_MSGFMT0 script to echo twice; once when we try to run msgfmt and again when we fallback to po2msg. That messes with the user's display and won't look very nice coming out of a supposedly quiet make. In other words this is probably better: + $(QUIET_MSGFMT0)($(MSGFMT) --statistics --tcl -l $(basename $(notdir $<)) -d $(dir $@) $< || \ + $(PO2MSG) --statistics --tcl -l $(basename $(notdir $<)) -d $(dir $@) $< )$(QUIET_MSGFMT1) But it is a lot uglier to read, and I tend to not like subshells. -- Shawn. ^ permalink raw reply [flat|nested] 134+ messages in thread
* Re: What's not in 'master', and likely not to be until 1.5.4 2008-01-21 4:46 ` Shawn O. Pearce @ 2008-01-21 10:37 ` Johannes Schindelin 2008-01-23 4:44 ` Shawn O. Pearce 0 siblings, 1 reply; 134+ messages in thread From: Johannes Schindelin @ 2008-01-21 10:37 UTC (permalink / raw) To: Shawn O. Pearce; +Cc: Johannes Sixt, Junio C Hamano, git Hi, On Sun, 20 Jan 2008, Shawn O. Pearce wrote: > Johannes Schindelin <Johannes.Schindelin@gmx.de> wrote: > > [PATCH] Fall back to po2msg when msgfmt is unavailable > > > > diff --git a/git-gui/Makefile b/git-gui/Makefile > > index c109eab..c7921e7 100644 > > --- a/git-gui/Makefile > > +++ b/git-gui/Makefile > > @@ -210,7 +211,8 @@ $(PO_TEMPLATE): $(SCRIPT_SH) $(ALL_LIBFILES) > > update-po:: $(PO_TEMPLATE) > > $(foreach p, $(ALL_POFILES), echo Updating $p ; msgmerge -U $p $(PO_TEMPLATE) ; ) > > $(ALL_MSGFILES): %.msg : %.po > > - $(QUIET_MSGFMT0)$(MSGFMT) --statistics --tcl -l $(basename $(notdir $<)) -d $(dir $@) $< $(QUIET_MSGFMT1) > > + $(QUIET_MSGFMT0)$(MSGFMT) --statistics --tcl -l $(basename $(notdir $<)) -d $(dir $@) $< $(QUIET_MSGFMT1) || \ > > + $(QUIET_MSGFMT0)$(PO2MSG) --statistics --tcl -l $(basename $(notdir $<)) -d $(dir $@) $< $(QUIET_MSGFMT1) > > That will cause the QUIET_MSGFMT0 script to echo twice; once when we try > to run msgfmt and again when we fallback to po2msg. > > That messes with the user's display and won't look very nice coming out > of a supposedly quiet make. > > In other words this is probably better: > > + $(QUIET_MSGFMT0)($(MSGFMT) --statistics --tcl -l $(basename $(notdir $<)) -d $(dir $@) $< || \ > + $(PO2MSG) --statistics --tcl -l $(basename $(notdir $<)) -d $(dir $@) $< )$(QUIET_MSGFMT1) > > But it is a lot uglier to read, and I tend to not like subshells. It was exactly this ugliness which made me not do it. Note: There might be yet a better way. Instead of trying each and every time, we could detect the presence of msgfmt with something like this: +ifeq $(shell msgfmt2 2>/dev/null >/dev/null; echo $?) = 127 + MSGFMT = $(TCL_PATH) po/po2msg.sh +endif This is not tested, yet, tough, Ciao, Dscho ^ permalink raw reply [flat|nested] 134+ messages in thread
* Re: What's not in 'master', and likely not to be until 1.5.4 2008-01-21 10:37 ` Johannes Schindelin @ 2008-01-23 4:44 ` Shawn O. Pearce 2008-01-23 11:12 ` Johannes Schindelin 0 siblings, 1 reply; 134+ messages in thread From: Shawn O. Pearce @ 2008-01-23 4:44 UTC (permalink / raw) To: Johannes Schindelin; +Cc: Johannes Sixt, Junio C Hamano, git Johannes Schindelin <Johannes.Schindelin@gmx.de> wrote: > Note: There might be yet a better way. Instead of trying each and every > time, we could detect the presence of msgfmt with something like this: > > +ifeq $(shell msgfmt2 2>/dev/null >/dev/null; echo $?) = 127 > + MSGFMT = $(TCL_PATH) po/po2msg.sh > +endif I like it. I'm applying this diff (which I tested) to git-gui: diff --git a/Makefile b/Makefile index 1baf4b0..5f1023e 100644 --- a/Makefile +++ b/Makefile @@ -198,6 +198,9 @@ ifdef NO_MSGFMT MSGFMT ?= $(TCL_PATH) po/po2msg.sh else MSGFMT ?= msgfmt + ifeq ($(shell $(MSGFMT) >/dev/null 2>&1 || echo $$?),127) + MSGFMT := $(TCL_PATH) po/po2msg.sh + endif endif msgsdir = $(gg_libdir)/msgs -- Shawn. ^ permalink raw reply related [flat|nested] 134+ messages in thread
* Re: What's not in 'master', and likely not to be until 1.5.4 2008-01-23 4:44 ` Shawn O. Pearce @ 2008-01-23 11:12 ` Johannes Schindelin 0 siblings, 0 replies; 134+ messages in thread From: Johannes Schindelin @ 2008-01-23 11:12 UTC (permalink / raw) To: Shawn O. Pearce; +Cc: paulus, git Hi, On Tue, 22 Jan 2008, Shawn O. Pearce wrote: > diff --git a/Makefile b/Makefile > index 1baf4b0..5f1023e 100644 > --- a/Makefile > +++ b/Makefile > @@ -198,6 +198,9 @@ ifdef NO_MSGFMT > MSGFMT ?= $(TCL_PATH) po/po2msg.sh > else > MSGFMT ?= msgfmt > + ifeq ($(shell $(MSGFMT) >/dev/null 2>&1 || echo $$?),127) > + MSGFMT := $(TCL_PATH) po/po2msg.sh > + endif > endif > > msgsdir = $(gg_libdir)/msgs > Thanks! Paul, you might want to do something like that for gitk, too. I imagine that the diff even applies as-is... Ciao, Dscho ^ permalink raw reply [flat|nested] 134+ messages in thread
* Re: What's not in 'master', and likely not to be until 1.5.4 2008-01-18 20:36 ` Johannes Schindelin 2008-01-18 20:58 ` Johannes Schindelin @ 2008-01-18 22:07 ` Johannes Sixt 2008-01-18 22:37 ` Johannes Schindelin 1 sibling, 1 reply; 134+ messages in thread From: Johannes Sixt @ 2008-01-18 22:07 UTC (permalink / raw) To: Johannes Schindelin, Junio C Hamano, git [Don't have Cc: in KNode. oh well...] Johannes Schindelin wrote: > On Fri, 18 Jan 2008, Johannes Sixt wrote: >> BTW, how would you like to have a 40+ patch series presented that >> implements the port to MinGW? Should I send to the ML despite its volume? >> (Of course not before 1.5.4 is released.) >> >> The current state of the series is available here: >> http://repo.or.cz/w/git/mingw/j6t.git?a=shortlog;h=upstream > > Comments from reading the patches briefly (since there are 42 patches, it > needs quite some time to even do it briefly): Thanks a lot! I agree with everything I didn't quote from your message. > - Possibly some of these commits could be folded back into > f90524e(Add target architecture MinGW): > > 96a27f1(MinGW: Implement gettimeofday()), > 2e05f891(Implement a rudimentary poll() emulation for Windows), > 142bda0(Fake implementions of getpwuid(), getuid(), and getpwnam() for > Windows), > e799caf(Implement setitimer() and sigaction()), > 075fee7(Implement a wrapper of execve that can invoke shell scripts), > 495f0af(Work around misbehaved rename() on Windows), > 34cf7fd(Implement a pipe() replacement whose ends are not inherited to > children), > 4504323(Implement start_command() for Windows), > b8e84a6(Implement a work-around for a misbehaved vsnprintf on Windows), > 08bbcb4(Windows: always chmod(, 0666) before unlink()), > f6bbf12(Windows: Implement a wrapper of the open() function), > 56cedf3(Windows: Fix PRIuMAX definition), > 7458a97(Windows: Implement wrappers for gethostbyname(), socket(), and > connect()), > ef25947(Windows: Fix ntohl() related warnings about printf formatting), > b9db7ad(Windows: Implement a custom spawnve()), and > 47dacb3(compat/pread.c: Add foward decl to fix warning) This would become a gigantic patch, which I really dislike. It's much easier to follow (and bisect) if things appear in smaller pieces. > - d6596ed(gitk: Disable msgfmt on MinGW) and > 004fb4b(Fix renaming .gitk-new to .gitk on Windows if there is already a > .gitk) > are gitk patches. > Further, I think that d6596ed would be better done as an automatic > detection of msgfmt's presence; on my Eee PC, there is no msgfmt > either... Let's do that later. > - 20fd16e(Windows: Use a customized struct stat that also has the > st_blocks member) should be folded into > 6f97065(Add a new lstat and fstat implementation based on Win32 API) > (with a comment that you customized the struct stat, too) > > But then, without 20fd16e, git does not compile, so again I would rather > fold that back into the MinGW commit. The custom lstat() implementation cannot come after the custom struct stat because we can't call Windows's stat() with a custom struct stat. But I also don't want the custom lstat() in the code from the beginning because it's merely an optimization. > - in git.git, the onelines are not terminated by "." You mean commit messages? > - I'd prefer f90524e(Add target architecture MinGW) to come last. > Alternatively, you could cut out the Makefile change so that the series > is still bisectable: MinGW will just not be supported until the very > end. I strongly disagree. The series is completely bisectable on *nix. But if the Makefile change comes last, it becomes difficult to bisect on MinGW. > $ git grep __MINGW j6t/upstream > > comes up with 26 hits. > > The first of them: cache.h:381, function is_absolute_path(). That just > cries out loud to be "#ifdef DOS_STYLE_PATHS" instead of "#ifdef > __MINGW32__". > > I guess there should also be -DHAS_NO_FORK_BUT_THREADS -DHAS_TMP_AND_TEMP > -DHAS_WINSOCK2, but most of them look like -DDOS_STYLE_PATHS to me. Doesn't this go too far? How many systems are there where not all of them would be set at the same time? -- Hannes ^ permalink raw reply [flat|nested] 134+ messages in thread
* Re: What's not in 'master', and likely not to be until 1.5.4 2008-01-18 22:07 ` Johannes Sixt @ 2008-01-18 22:37 ` Johannes Schindelin 0 siblings, 0 replies; 134+ messages in thread From: Johannes Schindelin @ 2008-01-18 22:37 UTC (permalink / raw) To: Johannes Sixt; +Cc: Junio C Hamano, git Hi, On Fri, 18 Jan 2008, Johannes Sixt wrote: > Johannes Schindelin wrote: > > > - Possibly some of these commits could be folded back into > > f90524e(Add target architecture MinGW): > > > > 96a27f1(MinGW: Implement gettimeofday()), > > 2e05f891(Implement a rudimentary poll() emulation for Windows), > > 142bda0(Fake implementions of getpwuid(), getuid(), and getpwnam() for > > Windows), > > e799caf(Implement setitimer() and sigaction()), > > 075fee7(Implement a wrapper of execve that can invoke shell scripts), > > 495f0af(Work around misbehaved rename() on Windows), > > 34cf7fd(Implement a pipe() replacement whose ends are not inherited to > > children), > > 4504323(Implement start_command() for Windows), > > b8e84a6(Implement a work-around for a misbehaved vsnprintf on Windows), > > 08bbcb4(Windows: always chmod(, 0666) before unlink()), > > f6bbf12(Windows: Implement a wrapper of the open() function), > > 56cedf3(Windows: Fix PRIuMAX definition), > > 7458a97(Windows: Implement wrappers for gethostbyname(), socket(), and > > connect()), > > ef25947(Windows: Fix ntohl() related warnings about printf formatting), > > b9db7ad(Windows: Implement a custom spawnve()), and > > 47dacb3(compat/pread.c: Add foward decl to fix warning) > > This would become a gigantic patch, which I really dislike. It's much > easier to follow (and bisect) if things appear in smaller pieces. Yes, probably. (See below for the bisection.) > > - d6596ed(gitk: Disable msgfmt on MinGW) and > > 004fb4b(Fix renaming .gitk-new to .gitk on Windows if there is already a > > .gitk) > > are gitk patches. > > Further, I think that d6596ed would be better done as an automatic > > detection of msgfmt's presence; on my Eee PC, there is no msgfmt > > either... > > Let's do that later. I think these are more or less independent of the rest. > > - 20fd16e(Windows: Use a customized struct stat that also has the > > st_blocks member) should be folded into > > 6f97065(Add a new lstat and fstat implementation based on Win32 API) > > (with a comment that you customized the struct stat, too) > > > > But then, without 20fd16e, git does not compile, so again I would rather > > fold that back into the MinGW commit. > > The custom lstat() implementation cannot come after the custom struct > stat because we can't call Windows's stat() with a custom struct stat. > But I also don't want the custom lstat() in the code from the beginning > because it's merely an optimization. Okay. > > - in git.git, the onelines are not terminated by "." > > You mean commit messages? I meant the subjects of the commit messages. I.e. "Add target architecture MinGW.". But that's such a minor issue. > > - I'd prefer f90524e(Add target architecture MinGW) to come last. > > Alternatively, you could cut out the Makefile change so that the series > > is still bisectable: MinGW will just not be supported until the very > > end. > > I strongly disagree. The series is completely bisectable on *nix. But if > the Makefile change comes last, it becomes difficult to bisect on MinGW. Hmm. You're right, of course, for *nix. But for MinGW I am not really sure, as you do not really get a fully functional system prior to all of the 42 patches... I am really torn on this, because I can understand your point of view. But when there would be an issue with MinGW, and I wanted to find out if it worked _at all_, it would be nice to have an easily determined commit where MinGW was supposed to be fully functional first, without a private tag or something. Reading again what I wrote it appears that my opinion on that was strong; it is not. I am not quite sure what would be best. (In the end, I will always have the option to not care and let it be Junio's problem ;-) > > $ git grep __MINGW j6t/upstream > > > > comes up with 26 hits. > > > > The first of them: cache.h:381, function is_absolute_path(). That just > > cries out loud to be "#ifdef DOS_STYLE_PATHS" instead of "#ifdef > > __MINGW32__". > > > > I guess there should also be -DHAS_NO_FORK_BUT_THREADS > > -DHAS_TMP_AND_TEMP -DHAS_WINSOCK2, but most of them look like > > -DDOS_STYLE_PATHS to me. > > Doesn't this go too far? How many systems are there where not all of > them would be set at the same time? I am not only thinking about other systems... it is also a pretty nice way of documenting _why_ this change was made. With the possible exception of HAS_TMP_AND_TEMP, I really would like to see that. So much so that I hereby offer to do the transform myself. Ciao, Dscho ^ permalink raw reply [flat|nested] 134+ messages in thread
* Re: What's not in 'master', and likely not to be until 1.5.4 2008-01-18 10:40 ` What's not in 'master', and likely not to be until 1.5.4 Junio C Hamano 2008-01-18 11:25 ` Johannes Sixt @ 2008-01-18 11:26 ` Jakub Narebski 2008-01-18 21:49 ` Junio C Hamano 2008-01-18 12:17 ` What's not in 'master', and likely not to be until 1.5.4 Marco Costalba ` (2 subsequent siblings) 4 siblings, 1 reply; 134+ messages in thread From: Jakub Narebski @ 2008-01-18 11:26 UTC (permalink / raw) To: Junio C Hamano; +Cc: git Junio C Hamano <gitster@pobox.com> writes: > Here is an update to the list I sent earlier. Topics that I > thought may deserve attention, discussion and eventual inclusion > but are not 1.5.4 material. > > I think some of them actually have a slight chance of being > 1.5.4 material, if interested parties present good enough > arguments that they are actually good and safe bugfixes. > * submodule subcommand parser fix for "git submodule add init > update" (Imran M Yousuf and me) Isn't it a bugfix, and shouldn't it for this reason be in 1.5.4? > * gitweb feed from commit to commitdiff (Florian La Rouche -- > Jakub seems to be on top of this so I am not worried about it > too much). What need IMHO to be changed is commit message: state stronger that the only thing that changed is that feed entry refers now to 'commitdiff' view rather than 'commit' view. I can agree that it might be better... but I do not use gitweb feeds myself. Reasonably post 1.5.4 > Again, I am hoping that authors will resend the ones they really > care about after 1.5.4, as I do not want to take patches early. -- Jakub Narebski Poland ShadeHawk on #git ^ permalink raw reply [flat|nested] 134+ messages in thread
* Re: What's not in 'master', and likely not to be until 1.5.4 2008-01-18 11:26 ` Jakub Narebski @ 2008-01-18 21:49 ` Junio C Hamano 2008-01-21 5:55 ` Imran M Yousuf 0 siblings, 1 reply; 134+ messages in thread From: Junio C Hamano @ 2008-01-18 21:49 UTC (permalink / raw) To: Jakub Narebski; +Cc: git, Imran M Yousuf Jakub Narebski <jnareb@gmail.com> writes: > Junio C Hamano <gitster@pobox.com> writes: > >> Here is an update to the list I sent earlier. Topics that I >> thought may deserve attention, discussion and eventual inclusion >> but are not 1.5.4 material. >> >> I think some of them actually have a slight chance of being >> 1.5.4 material, if interested parties present good enough >> arguments that they are actually good and safe bugfixes. > >> * submodule subcommand parser fix for "git submodule add init >> update" (Imran M Yousuf and me) > > Isn't it a bugfix, and shouldn't it for this reason be in 1.5.4? Yeah, I tend to agree. I was waiting for an Ack or failure report from Imran, as I turned the table around. ^ permalink raw reply [flat|nested] 134+ messages in thread
* Re: What's not in 'master', and likely not to be until 1.5.4 2008-01-18 21:49 ` Junio C Hamano @ 2008-01-21 5:55 ` Imran M Yousuf 2008-01-21 6:29 ` Junio C Hamano 2008-01-21 6:42 ` Steffen Prohaska 0 siblings, 2 replies; 134+ messages in thread From: Imran M Yousuf @ 2008-01-21 5:55 UTC (permalink / raw) To: Junio C Hamano; +Cc: Jakub Narebski, git On Jan 19, 2008 3:49 AM, Junio C Hamano <gitster@pobox.com> wrote: > Jakub Narebski <jnareb@gmail.com> writes: > > > Junio C Hamano <gitster@pobox.com> writes: > > > >> Here is an update to the list I sent earlier. Topics that I > >> thought may deserve attention, discussion and eventual inclusion > >> but are not 1.5.4 material. > >> > >> I think some of them actually have a slight chance of being > >> 1.5.4 material, if interested parties present good enough > >> arguments that they are actually good and safe bugfixes. > > > >> * submodule subcommand parser fix for "git submodule add init > >> update" (Imran M Yousuf and me) > > > > Isn't it a bugfix, and shouldn't it for this reason be in 1.5.4? > > Yeah, I tend to agree. I was waiting for an Ack or failure > report from Imran, as I turned the table around. Sorry I forgot to mention it earlier, your patches worked fine :), thank you once again for the help. > -- Imran M Yousuf ^ permalink raw reply [flat|nested] 134+ messages in thread
* Re: What's not in 'master', and likely not to be until 1.5.4 2008-01-21 5:55 ` Imran M Yousuf @ 2008-01-21 6:29 ` Junio C Hamano 2008-01-21 6:42 ` Steffen Prohaska 1 sibling, 0 replies; 134+ messages in thread From: Junio C Hamano @ 2008-01-21 6:29 UTC (permalink / raw) To: Imran M Yousuf; +Cc: Junio C Hamano, Jakub Narebski, git Thanks. ^ permalink raw reply [flat|nested] 134+ messages in thread
* Re: What's not in 'master', and likely not to be until 1.5.4 2008-01-21 5:55 ` Imran M Yousuf 2008-01-21 6:29 ` Junio C Hamano @ 2008-01-21 6:42 ` Steffen Prohaska 2008-01-21 6:41 ` [PATCH] submodule: Document the details of the command line syntax Steffen Prohaska 1 sibling, 1 reply; 134+ messages in thread From: Steffen Prohaska @ 2008-01-21 6:42 UTC (permalink / raw) To: Junio C Hamano; +Cc: Jakub Narebski, Git Mailing List, Imran M Yousuf On Jan 21, 2008, at 6:55 AM, Imran M Yousuf wrote: > On Jan 19, 2008 3:49 AM, Junio C Hamano <gitster@pobox.com> wrote: >> Jakub Narebski <jnareb@gmail.com> writes: >> >>> Junio C Hamano <gitster@pobox.com> writes: >>> >>>> Here is an update to the list I sent earlier. Topics that I >>>> thought may deserve attention, discussion and eventual inclusion >>>> but are not 1.5.4 material. >>>> >>>> I think some of them actually have a slight chance of being >>>> 1.5.4 material, if interested parties present good enough >>>> arguments that they are actually good and safe bugfixes. >>> >>>> * submodule subcommand parser fix for "git submodule add init >>>> update" (Imran M Yousuf and me) >>> >>> Isn't it a bugfix, and shouldn't it for this reason be in 1.5.4? >> >> Yeah, I tend to agree. I was waiting for an Ack or failure >> report from Imran, as I turned the table around. > > Sorry I forgot to mention it earlier, your patches worked fine :), > thank you once again for the help. I read through the patch and it looks good. I think the documentation should be slightly adjusted. Patch follows as a reply to this mail. Steffen ^ permalink raw reply [flat|nested] 134+ messages in thread
* [PATCH] submodule: Document the details of the command line syntax 2008-01-21 6:42 ` Steffen Prohaska @ 2008-01-21 6:41 ` Steffen Prohaska 2008-01-21 6:47 ` Junio C Hamano 0 siblings, 1 reply; 134+ messages in thread From: Steffen Prohaska @ 2008-01-21 6:41 UTC (permalink / raw) To: gitster; +Cc: imyousuf, jnareb, git, Steffen Prohaska Only "status" accepts "--cached" and the preferred way of passing sub-command specific options is after the sub-command. The documentation is adapted to reflect this. Signed-off-by: Steffen Prohaska <prohaska@zib.de> --- Documentation/git-submodule.txt | 5 +++-- 1 files changed, 3 insertions(+), 2 deletions(-) diff --git a/Documentation/git-submodule.txt b/Documentation/git-submodule.txt index cffc6d4..e818e6e 100644 --- a/Documentation/git-submodule.txt +++ b/Documentation/git-submodule.txt @@ -9,8 +9,9 @@ git-submodule - Initialize, update or inspect submodules SYNOPSIS -------- [verse] -'git-submodule' [--quiet] [-b branch] add <repository> [<path>] -'git-submodule' [--quiet] [--cached] [status|init|update] [--] [<path>...] +'git-submodule' [--quiet] add [-b branch] [--] <repository> [<path>] +'git-submodule' [--quiet] status [--cached] [--] [<path>...] +'git-submodule' [--quiet] [init|update] [--] [<path>...] COMMANDS -- 1.5.4.rc4.3.g7c32b ^ permalink raw reply related [flat|nested] 134+ messages in thread
* Re: [PATCH] submodule: Document the details of the command line syntax 2008-01-21 6:41 ` [PATCH] submodule: Document the details of the command line syntax Steffen Prohaska @ 2008-01-21 6:47 ` Junio C Hamano 0 siblings, 0 replies; 134+ messages in thread From: Junio C Hamano @ 2008-01-21 6:47 UTC (permalink / raw) To: Steffen Prohaska; +Cc: imyousuf, jnareb, git Thanks. That change makes sense to me. ^ permalink raw reply [flat|nested] 134+ messages in thread
* Re: What's not in 'master', and likely not to be until 1.5.4 2008-01-18 10:40 ` What's not in 'master', and likely not to be until 1.5.4 Junio C Hamano 2008-01-18 11:25 ` Johannes Sixt 2008-01-18 11:26 ` Jakub Narebski @ 2008-01-18 12:17 ` Marco Costalba 2008-01-18 12:18 ` Marco Costalba 2008-01-18 12:53 ` Steffen Prohaska 2008-01-21 2:37 ` What's not in 'master', and likely not to be in, " Junio C Hamano 4 siblings, 1 reply; 134+ messages in thread From: Marco Costalba @ 2008-01-18 12:17 UTC (permalink / raw) To: Junio C Hamano; +Cc: git On Jan 18, 2008 11:40 AM, Junio C Hamano <gitster@pobox.com> wrote: > > I think some of them actually have a slight chance of being > 1.5.4 material, if interested parties present good enough > arguments that they are actually good and safe bugfixes. > > * compress/decompress abstraction (Marco) > I have good enough arguments to NOT include it in 1.5.4: it's a cleanup, so it's developer oriented, not user oriented, no performance/feature benefit, no bug fix. Please apply only after 1.5.4 is out. Thanks Marco ^ permalink raw reply [flat|nested] 134+ messages in thread
* Re: What's not in 'master', and likely not to be until 1.5.4 2008-01-18 12:17 ` What's not in 'master', and likely not to be until 1.5.4 Marco Costalba @ 2008-01-18 12:18 ` Marco Costalba 0 siblings, 0 replies; 134+ messages in thread From: Marco Costalba @ 2008-01-18 12:18 UTC (permalink / raw) To: Junio C Hamano; +Cc: git On Jan 18, 2008 1:17 PM, Marco Costalba <mcostalba@gmail.com> wrote: > > Please apply only after 1.5.4 is out. > BTW I will resend the whole series this time without lines wrapping I promise (I have learnt git send-mail in the mean time ;-) Marco ^ permalink raw reply [flat|nested] 134+ messages in thread
* Re: What's not in 'master', and likely not to be until 1.5.4 2008-01-18 10:40 ` What's not in 'master', and likely not to be until 1.5.4 Junio C Hamano ` (2 preceding siblings ...) 2008-01-18 12:17 ` What's not in 'master', and likely not to be until 1.5.4 Marco Costalba @ 2008-01-18 12:53 ` Steffen Prohaska 2008-01-18 13:09 ` Johannes Schindelin 2008-01-21 2:37 ` What's not in 'master', and likely not to be in, " Junio C Hamano 4 siblings, 1 reply; 134+ messages in thread From: Steffen Prohaska @ 2008-01-18 12:53 UTC (permalink / raw) To: Junio C Hamano; +Cc: git On Jan 18, 2008, at 11:40 AM, Junio C Hamano wrote: > Here is an update to the list I sent earlier. Topics that I > thought may deserve attention, discussion and eventual inclusion > but are not 1.5.4 material. > > I think some of them actually have a slight chance of being > 1.5.4 material, if interested parties present good enough > arguments that they are actually good and safe bugfixes. > [...] > > * crlf (Steffen Prohaska and Dmitry Potapov) I am working on an alternative to the patch I sent last week. I hope I can present the two approaches soon. The first approach is a lazy check in crlf_to_git() that warns about an irreversible conversion; or dies if safecrlf=true. This is relatively simple code but at least for git-add a workaround is needed to suppress printing a warning twice. The runtime overhead is negligible. The second approach adds a new machinery is_worktree_crlfsafe() that could be run independently of the crlf_to_git() conversion. The code doing the conversion would stay unmodified. The advantage is that the whole work tree could be verified before any conversion actually happens and we could die() after printing all the warnings instead of printing only the first one. The drawback is that this approach most likely needs more code and will introduce runtime overhead. A straight forward implementation would add another pass over the work tree running the stats in convert.c. So the stats would be run twice. And for a simple "git add <file>" the situation is even worse: the full work tree would be verified even is only a single file is to be added. I haven't found time during the week, so I'll continue to work on this over the weekend. Maybe even more time is needed to discuss the two alternatives. I do not expect that this topic will be ready for 1.5.4. Steffen ^ permalink raw reply [flat|nested] 134+ messages in thread
* Re: What's not in 'master', and likely not to be until 1.5.4 2008-01-18 12:53 ` Steffen Prohaska @ 2008-01-18 13:09 ` Johannes Schindelin 2008-01-18 13:23 ` Steffen Prohaska 0 siblings, 1 reply; 134+ messages in thread From: Johannes Schindelin @ 2008-01-18 13:09 UTC (permalink / raw) To: Steffen Prohaska; +Cc: Junio C Hamano, git Hi, On Fri, 18 Jan 2008, Steffen Prohaska wrote: > > On Jan 18, 2008, at 11:40 AM, Junio C Hamano wrote: > > > * crlf (Steffen Prohaska and Dmitry Potapov) > > I am working on an alternative to the patch I sent last week. I hope I > can present the two approaches soon. > > The first approach is a lazy check in crlf_to_git() that warns about an > irreversible conversion; or dies if safecrlf=true. This is relatively > simple code but at least for git-add a workaround is needed to suppress > printing a warning twice. The runtime overhead is negligible. > > The second approach adds a new machinery is_worktree_crlfsafe() > that could be run independently of the crlf_to_git() conversion. >From the sound of it, I like the first approach much better. > I do not expect that this topic will be ready for 1.5.4. What with our ongoing discussion when to go out of preview phase for msysGit, I think this makes sense. Ciao, Dscho ^ permalink raw reply [flat|nested] 134+ messages in thread
* Re: What's not in 'master', and likely not to be until 1.5.4 2008-01-18 13:09 ` Johannes Schindelin @ 2008-01-18 13:23 ` Steffen Prohaska 0 siblings, 0 replies; 134+ messages in thread From: Steffen Prohaska @ 2008-01-18 13:23 UTC (permalink / raw) To: Johannes Schindelin; +Cc: Junio C Hamano, git On Jan 18, 2008, at 2:09 PM, Johannes Schindelin wrote: > On Fri, 18 Jan 2008, Steffen Prohaska wrote: > >> >> On Jan 18, 2008, at 11:40 AM, Junio C Hamano wrote: >> >>> * crlf (Steffen Prohaska and Dmitry Potapov) >> >> I am working on an alternative to the patch I sent last week. I >> hope I >> can present the two approaches soon. >> >> The first approach is a lazy check in crlf_to_git() that warns >> about an >> irreversible conversion; or dies if safecrlf=true. This is >> relatively >> simple code but at least for git-add a workaround is needed to >> suppress >> printing a warning twice. The runtime overhead is negligible. >> >> The second approach adds a new machinery is_worktree_crlfsafe() >> that could be run independently of the crlf_to_git() conversion. > > From the sound of it, I like the first approach much better. Ok. I'll start with cleaning up the first approach tomorrow and send resend the patch. >> I do not expect that this topic will be ready for 1.5.4. > > What with our ongoing discussion when to go out of preview phase for > msysGit, I think this makes sense. I'll work on creating an improved installer that installs only a subset of the commands. I'll exclude commands that are not yet ready for Windows (e.g. git-svn, ...). After we have the first version of this installer we can further discuss if we leave the preview phase. Steffen ^ permalink raw reply [flat|nested] 134+ messages in thread
* What's not in 'master', and likely not to be in, until 1.5.4 2008-01-18 10:40 ` What's not in 'master', and likely not to be until 1.5.4 Junio C Hamano ` (3 preceding siblings ...) 2008-01-18 12:53 ` Steffen Prohaska @ 2008-01-21 2:37 ` Junio C Hamano 2008-01-21 5:21 ` Linus Torvalds ` (2 more replies) 4 siblings, 3 replies; 134+ messages in thread From: Junio C Hamano @ 2008-01-21 2:37 UTC (permalink / raw) To: git Here is an update to the list I sent earlier. Topics that I thought may deserve attention, discussion and eventual inclusion but are not 1.5.4 material. I think these two could be part of 1.5.4, but I left them out of 1.5.4-rc4 (IOW, I do not think they should be on this list): * marking output from "diff --{no,src,dst}-prefix" as a non-git diff (me) Linus had an objection but I think I made a reasonable argument against that. Haven't heard back since then, so this is in limbo. * submodule subcommand parser fix for "git submodule add init update" (Imran M Yousuf and me) As Jakub noticed, this is meant to be a bugfix but as I do not use submodule heavily myself, backing it with real-world success stories would be needed. Now these two out of our way, here is the list. * various lstat(2) reduction changes (me, Linus and Dscho). This will be queued in 'pu'; it appears this introduces a timing related breakages in t75?? tests. * compress/decompress abstraction (Marco) * crlf (Steffen Prohaska and Dmitry Potapov) * whitespace error: "cr at eol is ok" (me) * submodule recursive wrapper (Imran M Yousuf) * 'origin' is not so special after "clone -o frotz" (Mark Levedahl) * "submodule summary" (Ping Yin) * unconfigured ident safety (Stephen Sinclair) * gitweb feed from commit to commitdiff (Florian La Rouche -- Jakub seems to be on top of this so I am not worried about it too much). * color.ui (Matthias Kestenholz) * test scripts to use valgrind (Jeff King) * "rebase -i" UI -- should it be simplified to do commit --amend itself? (Dscho) * "cherry-pick/revert" error message fix (Björn Steinbrink and me) * pathname safety on filesystems whose readdir(3) thinks it knows better than users (Linus, Robin Rosenberg, me and others). I tend to prefer a much simpler approach Linus suggested, to wrap readdir(3) on systems that are known to mangle files, but I have a slight suspicion it would not work well enough for cross platform projects. Again, I am hoping that authors will resend the ones they really care about after 1.5.4, as I do not want to take patches early. The previous version of this list did not include the some that were discussed and landed in 'pu' (or 'offcuts'). The ones that we may want to polish that are in 'pu' are: * omit cc recipients from send-email (David Brown) * sha1 lookup optimization (me) * rewrite cherry-pick/revert in order to improve its D/F conflict resolution (me) * allow native protocol to tell exactly which branch HEAD points at (me) There is also 1.6.0 material queued already, way before the rc cycle: * Moving "git-foo" out of users' $PATH (Nguyễn Thái Ngọc Duy) I suspect it might be a good idea to make an early declaration that 1.5.5 is to resolve the above listed issues plus the ones already in 'pu' (and nothing else), and have a fairly short cycle after 1.5.4. ^ permalink raw reply [flat|nested] 134+ messages in thread
* Re: What's not in 'master', and likely not to be in, until 1.5.4 2008-01-21 2:37 ` What's not in 'master', and likely not to be in, " Junio C Hamano @ 2008-01-21 5:21 ` Linus Torvalds 2008-01-21 6:15 ` Junio C Hamano 2008-01-21 5:35 ` Daniel Barkalow 2008-01-21 8:11 ` Marco Costalba 2 siblings, 1 reply; 134+ messages in thread From: Linus Torvalds @ 2008-01-21 5:21 UTC (permalink / raw) To: Junio C Hamano; +Cc: git On Sun, 20 Jan 2008, Junio C Hamano wrote: > > * marking output from "diff --{no,src,dst}-prefix" as a non-git > diff (me) > > Linus had an objection but I think I made a reasonable > argument against that. Haven't heard back since then, so > this is in limbo. I just didn'̈́t really care enough. I still don't think the prefix has anything to do with git'ness, but at the same time it's just not something I'll ever use, so.. > * various lstat(2) reduction changes (me, Linus and Dscho). > > This will be queued in 'pu'; it appears this introduces a > timing related breakages in t75?? tests. Can you send some more info on this? I obviously like that series, and I've been running various versions of it for a while now, and have run "make test" a lot. Haven't seen any failures (except the ones I've introduced while developing), but would be happy to see reports. Linus ^ permalink raw reply [flat|nested] 134+ messages in thread
* Re: What's not in 'master', and likely not to be in, until 1.5.4 2008-01-21 5:21 ` Linus Torvalds @ 2008-01-21 6:15 ` Junio C Hamano 2008-01-21 7:02 ` Junio C Hamano 0 siblings, 1 reply; 134+ messages in thread From: Junio C Hamano @ 2008-01-21 6:15 UTC (permalink / raw) To: Linus Torvalds; +Cc: git Linus Torvalds <torvalds@linux-foundation.org> writes: > On Sun, 20 Jan 2008, Junio C Hamano wrote: >> >> * marking output from "diff --{no,src,dst}-prefix" as a non-git >> diff (me) >> >> Linus had an objection but I think I made a reasonable >> argument against that. Haven't heard back since then, so >> this is in limbo. > > I just didn'̈́t really care enough. I still don't think the prefix has > anything to do with git'ness, but at the same time it's just not something > I'll ever use, so.. > >> * various lstat(2) reduction changes (me, Linus and Dscho). >> >> This will be queued in 'pu'; it appears this introduces a >> timing related breakages in t75?? tests. > > Can you send some more info on this? It's a Heisenbug. I actually merged it to 'next' but rewound it before pushing the result out after seeing a breakage. "make clean test" to run everything through sometimes fails and immediately after that when I do "cd t && sh t75??-???.sh -i -v" it happily runs through the end. I'll be back with more details when I have some. ^ permalink raw reply [flat|nested] 134+ messages in thread
* Re: What's not in 'master', and likely not to be in, until 1.5.4 2008-01-21 6:15 ` Junio C Hamano @ 2008-01-21 7:02 ` Junio C Hamano 2008-01-21 7:10 ` Junio C Hamano 2008-01-21 8:29 ` What's not in 'master', and likely not to be in, until 1.5.4 Johannes Sixt 0 siblings, 2 replies; 134+ messages in thread From: Junio C Hamano @ 2008-01-21 7:02 UTC (permalink / raw) To: Linus Torvalds; +Cc: git Junio C Hamano <gitster@pobox.com> writes: > It's a Heisenbug. I actually merged it to 'next' but rewound it > before pushing the result out after seeing a breakage. > > "make clean test" to run everything through sometimes fails and > immediately after that when I do "cd t && sh t75??-???.sh -i -v" > it happily runs through the end. > > I'll be back with more details when I have some. In t7501-commit.sh, "partial commit that involves removal (1)" test, it _sometimes_ fails. test_expect_success 'partial commit that involves removal (1)' ' git rm --cached file && mv file elif && git add elif && git diff-index --name-status HEAD >changes && git commit -m "Partial: add elif" elif && git diff-tree --name-status HEAD^ HEAD >current && echo "A elif" >expected && diff expected current ' It removes "file" from the index, adds "elif" to the index, and tries to commit _only_ the addition of "elif" without recording the removal of "file" (I added "diff-index" above to see where it fails, its presense or absense does not change the bug, and it shows that both addition of elif and removal of file are in the index). When the test fails, the resulting commit however does not record the addition of elif. The commit records the same tree as its parent instead. The index that is left has "elif" but not "file" (iow, it records the expected state after such a partial commit). ^ permalink raw reply [flat|nested] 134+ messages in thread
* Re: What's not in 'master', and likely not to be in, until 1.5.4 2008-01-21 7:02 ` Junio C Hamano @ 2008-01-21 7:10 ` Junio C Hamano 2008-01-21 7:13 ` Junio C Hamano 2008-01-21 8:29 ` What's not in 'master', and likely not to be in, until 1.5.4 Johannes Sixt 1 sibling, 1 reply; 134+ messages in thread From: Junio C Hamano @ 2008-01-21 7:10 UTC (permalink / raw) To: Linus Torvalds; +Cc: git Junio C Hamano <gitster@pobox.com> writes: > Junio C Hamano <gitster@pobox.com> writes: > >> It's a Heisenbug. I actually merged it to 'next' but rewound it >> before pushing the result out after seeing a breakage. >> >> "make clean test" to run everything through sometimes fails and >> immediately after that when I do "cd t && sh t75??-???.sh -i -v" >> it happily runs through the end. >> >> I'll be back with more details when I have some. > > In t7501-commit.sh, "partial commit that involves removal (1)" > test, it _sometimes_ fails. > > test_expect_success 'partial commit that involves removal (1)' ' > > git rm --cached file && > mv file elif && > git add elif && > git diff-index --name-status HEAD >changes && > git commit -m "Partial: add elif" elif && > git diff-tree --name-status HEAD^ HEAD >current && > echo "A elif" >expected && > diff expected current > > ' > > It removes "file" from the index, adds "elif" to the index, and > tries to commit _only_ the addition of "elif" without recording > the removal of "file" (I added "diff-index" above to see where > it fails, its presense or absense does not change the bug, and > it shows that both addition of elif and removal of file are in > the index). > > When the test fails, the resulting commit however does not > record the addition of elif. The commit records the same tree > as its parent instead. The index that is left has "elif" but > not "file" (iow, it records the expected state after such a > partial commit). Bad news is that this does not seem to have much to do with the incore-index series. v1.5.4-rc4 shows the same breakage. ^ permalink raw reply [flat|nested] 134+ messages in thread
* Re: What's not in 'master', and likely not to be in, until 1.5.4 2008-01-21 7:10 ` Junio C Hamano @ 2008-01-21 7:13 ` Junio C Hamano 2008-01-21 7:27 ` Junio C Hamano 0 siblings, 1 reply; 134+ messages in thread From: Junio C Hamano @ 2008-01-21 7:13 UTC (permalink / raw) To: Linus Torvalds; +Cc: git Junio C Hamano <gitster@pobox.com> writes: > Bad news is that this does not seem to have much to do with the > incore-index series. v1.5.4-rc4 shows the same breakage. Please disregard that bad news -- that was my stupidity while bisecting. v1.5.4-rc4 seems to be Ok. ^ permalink raw reply [flat|nested] 134+ messages in thread
* Re: What's not in 'master', and likely not to be in, until 1.5.4 2008-01-21 7:13 ` Junio C Hamano @ 2008-01-21 7:27 ` Junio C Hamano 2008-01-21 8:32 ` Junio C Hamano 0 siblings, 1 reply; 134+ messages in thread From: Junio C Hamano @ 2008-01-21 7:27 UTC (permalink / raw) To: Linus Torvalds; +Cc: git Junio C Hamano <gitster@pobox.com> writes: > Junio C Hamano <gitster@pobox.com> writes: > >> Bad news is that this does not seem to have much to do with the >> incore-index series. v1.5.4-rc4 shows the same breakage. > > Please disregard that bad news -- that was my stupidity while > bisecting. v1.5.4-rc4 seems to be Ok. And the bisection points at the first one in the series "Updated in-memory index cleanup". Which is kind of odd and sad, as it is not supposed to change the semantics at all, and I did not see anything obviously wrong with it. $ cd t $ while : do sh -x ./t7501-commit.sh -i -v >,,log 2>&1 || break done ^ permalink raw reply [flat|nested] 134+ messages in thread
* Re: What's not in 'master', and likely not to be in, until 1.5.4 2008-01-21 7:27 ` Junio C Hamano @ 2008-01-21 8:32 ` Junio C Hamano 2008-01-21 8:44 ` [PATCH 1/2] read-cache.c: introduce is_racy_timestamp() helper Junio C Hamano 2008-01-21 8:46 ` [PATCH 2/2] read-cache.c: fix timestamp comparison Junio C Hamano 0 siblings, 2 replies; 134+ messages in thread From: Junio C Hamano @ 2008-01-21 8:32 UTC (permalink / raw) To: Linus Torvalds; +Cc: git [-- Attachment #1: Type: text/plain, Size: 1012 bytes --] An update, with three attachments (sorry), but not final resolution yet (sorry again) and I am going to bed. t7501-commit-2.sh is a very reduced test script. Drop it in t/ and run it like: $ while :; do sh ./t7501-commit-2.sh -i -v || break; done I stops after running for a while with "Updated in-memory index cleanup" patch (and does not seem to stop without). Note that this is before any of the lstat(2) reduction changes. The attached "trace.log.old" is strace output from the round that ran successfully, and "trace.log" is the same from the round that failed. The real place the logs start diverging is around line 240, the good one runs two lstat(2) on "elif", opens "elif" in O_RDONLY and closes it immediately (eh, what is it doing? I do not even see any read or mmap --- it is just open and close) and then reads the config and attributes (presumably this is doing the convert-to-git stuff). The bad one runs three lstat(2) on it and writes the next-index out, without even opening "elif". [-- Attachment #2: Reduced 7501 test --] [-- Type: text/plain, Size: 552 bytes --] #!/bin/sh test_description='reduced 7501' . ./test-lib.sh test_expect_success setup ' >file && git add file && test_tick && git commit -m initial ' if test -f ../trace.log then mv ../trace.log ../trace.log.old fi test_expect_success 'partial commit that involves removal (1)' ' test_tick && git rm --cached file && mv file elif && git add elif && strace -f -o ../trace.log git commit -m "Partial: add elif" elif && git diff-tree --name-status HEAD^ HEAD >current && echo "A elif" >expected && diff expected current ' test_done [-- Attachment #3: strace output from a good run --] [-- Type: text/plain, Size: 50037 bytes --] 10888 execve("/opt/packrat/playpen/public/in-place/git/git.junio/t/../git", ["git", "commit", "-m", "Partial: add elif", "elif"], [/* 51 vars */]) = 0 10888 brk(0) = 0x6f7000 10888 mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x2b064998c000 10888 uname({sys="Linux", node="gitster", ...}) = 0 10888 access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory) 10888 mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x2b064998d000 10888 access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or directory) 10888 open("/etc/ld.so.cache", O_RDONLY) = 6 10888 fstat(6, {st_mode=S_IFREG|0644, st_size=70263, ...}) = 0 10888 mmap(NULL, 70263, PROT_READ, MAP_PRIVATE, 6, 0) = 0x2b064998f000 10888 close(6) = 0 10888 access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory) 10888 open("/usr/lib/libcurl.so.3", O_RDONLY) = 6 10888 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 10888 fstat(6, {st_mode=S_IFREG|0644, st_size=227856, ...}) = 0 10888 mmap(NULL, 1275080, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 6, 0) = 0x2b06499a1000 10888 mprotect(0x2b06499d7000, 1048576, PROT_NONE) = 0 10888 mmap(0x2b0649ad7000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 6, 0x36000) = 0x2b0649ad7000 10888 close(6) = 0 10888 access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory) 10888 open("/usr/lib/libz.so.1", O_RDONLY) = 6 10888 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 10888 fstat(6, {st_mode=S_IFREG|0644, st_size=93504, ...}) = 0 10888 mmap(NULL, 2188616, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 6, 0) = 0x2b0649b8d000 10888 mprotect(0x2b0649ba3000, 2097152, PROT_NONE) = 0 10888 mmap(0x2b0649da3000, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 6, 0x16000) = 0x2b0649da3000 10888 close(6) = 0 10888 access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory) 10888 open("/usr/lib/libcrypto.so.0.9.8", O_RDONLY) = 6 10888 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 10888 fstat(6, {st_mode=S_IFREG|0644, st_size=1510344, ...}) = 0 10888 mmap(NULL, 2571832, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 6, 0) = 0x2b0649da4000 10888 mprotect(0x2b0649ef2000, 1048576, PROT_NONE) = 0 10888 mmap(0x2b0649ff2000, 143360, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 6, 0x14e000) = 0x2b0649ff2000 10888 mmap(0x2b064a015000, 11832, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x2b064a015000 10888 close(6) = 0 10888 access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory) 10888 open("/lib/libc.so.6", O_RDONLY) = 6 10888 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 10888 fstat(6, {st_mode=S_IFREG|0755, st_size=1391928, ...}) = 0 10888 mmap(NULL, 3498360, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 6, 0) = 0x2b064a018000 10888 mprotect(0x2b064a165000, 2097152, PROT_NONE) = 0 10888 mmap(0x2b064a365000, 20480, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 6, 0x14d000) = 0x2b064a365000 10888 mmap(0x2b064a36a000, 16760, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x2b064a36a000 10888 close(6) = 0 10888 access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory) 10888 open("/usr/lib/libgssapi_krb5.so.2", O_RDONLY) = 6 10888 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 10888 fstat(6, {st_mode=S_IFREG|0644, st_size=173640, ...}) = 0 10888 mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x2b064a36f000 10888 mmap(NULL, 2269136, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 6, 0) = 0x2b064a370000 10888 mprotect(0x2b064a399000, 2093056, PROT_NONE) = 0 10888 mmap(0x2b064a598000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 6, 0x28000) = 0x2b064a598000 10888 close(6) = 0 10888 access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory) 10888 open("/usr/lib/libkrb5.so.3", O_RDONLY) = 6 10888 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 10888 fstat(6, {st_mode=S_IFREG|0644, st_size=635688, ...}) = 0 10888 mmap(NULL, 2730976, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 6, 0) = 0x2b064a59a000 10888 mprotect(0x2b064a631000, 2097152, PROT_NONE) = 0 10888 mmap(0x2b064a831000, 16384, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 6, 0x97000) = 0x2b064a831000 10888 close(6) = 0 10888 access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory) 10888 open("/usr/lib/libk5crypto.so.3", O_RDONLY) = 6 10888 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 10888 fstat(6, {st_mode=S_IFREG|0644, st_size=150656, ...}) = 0 10888 mmap(NULL, 2246952, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 6, 0) = 0x2b064a835000 10888 mprotect(0x2b064a858000, 2097152, PROT_NONE) = 0 10888 mmap(0x2b064aa58000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 6, 0x23000) = 0x2b064aa58000 10888 close(6) = 0 10888 access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory) 10888 open("/lib/libcom_err.so.2", O_RDONLY) = 6 10888 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 10888 fstat(6, {st_mode=S_IFREG|0644, st_size=7984, ...}) = 0 10888 mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x2b064aa5a000 10888 mmap(NULL, 1054920, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 6, 0) = 0x2b064aa5b000 10888 mprotect(0x2b064aa5d000, 1044480, PROT_NONE) = 0 10888 mmap(0x2b064ab5c000, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 6, 0x1000) = 0x2b064ab5c000 10888 close(6) = 0 10888 access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory) 10888 open("/usr/lib/libkrb5support.so.0", O_RDONLY) = 6 10888 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 10888 fstat(6, {st_mode=S_IFREG|0644, st_size=30408, ...}) = 0 10888 mmap(NULL, 2125648, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 6, 0) = 0x2b064ab5d000 10888 mprotect(0x2b064ab64000, 2093056, PROT_NONE) = 0 10888 mmap(0x2b064ad63000, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 6, 0x6000) = 0x2b064ad63000 10888 close(6) = 0 10888 access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory) 10888 open("/lib/libresolv.so.2", O_RDONLY) = 6 10888 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 10888 fstat(6, {st_mode=S_IFREG|0644, st_size=76664, ...}) = 0 10888 mmap(NULL, 2181896, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 6, 0) = 0x2b064ad64000 10888 mprotect(0x2b064ad75000, 2097152, PROT_NONE) = 0 10888 mmap(0x2b064af75000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 6, 0x11000) = 0x2b064af75000 10888 mmap(0x2b064af77000, 6920, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x2b064af77000 10888 close(6) = 0 10888 access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory) 10888 open("/usr/lib/libidn.so.11", O_RDONLY) = 6 10888 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 10888 fstat(6, {st_mode=S_IFREG|0644, st_size=202368, ...}) = 0 10888 mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x2b064af79000 10888 mmap(NULL, 1249152, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 6, 0) = 0x2b064af7a000 10888 mprotect(0x2b064afab000, 1044480, PROT_NONE) = 0 10888 mmap(0x2b064b0aa000, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 6, 0x30000) = 0x2b064b0aa000 10888 close(6) = 0 10888 access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory) 10888 open("/lib/libdl.so.2", O_RDONLY) = 6 10888 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 10888 fstat(6, {st_mode=S_IFREG|0644, st_size=14624, ...}) = 0 10888 mmap(NULL, 2109728, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 6, 0) = 0x2b064b0ab000 10888 mprotect(0x2b064b0ad000, 2097152, PROT_NONE) = 0 10888 mmap(0x2b064b2ad000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 6, 0x2000) = 0x2b064b2ad000 10888 close(6) = 0 10888 access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory) 10888 open("/usr/lib/libssl.so.0.9.8", O_RDONLY) = 6 10888 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 10888 fstat(6, {st_mode=S_IFREG|0644, st_size=291816, ...}) = 0 10888 mmap(NULL, 1338608, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 6, 0) = 0x2b064b2af000 10888 mprotect(0x2b064b2f0000, 1048576, PROT_NONE) = 0 10888 mmap(0x2b064b3f0000, 24576, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 6, 0x41000) = 0x2b064b3f0000 10888 close(6) = 0 10888 access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory) 10888 open("/lib/libkeyutils.so.1", O_RDONLY) = 6 10888 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 10888 fstat(6, {st_mode=S_IFREG|0644, st_size=7304, ...}) = 0 10888 mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x2b064b3f6000 10888 mmap(NULL, 1054160, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 6, 0) = 0x2b064b3f7000 10888 mprotect(0x2b064b3f9000, 1044480, PROT_NONE) = 0 10888 mmap(0x2b064b4f8000, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 6, 0x1000) = 0x2b064b4f8000 10888 close(6) = 0 10888 mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x2b064b4f9000 10888 mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x2b064b4fa000 10888 arch_prctl(ARCH_SET_FS, 0x2b064b4f9f10) = 0 10888 mprotect(0x2b064a365000, 12288, PROT_READ) = 0 10888 munmap(0x2b064998f000, 70263) = 0 10888 brk(0) = 0x6f7000 10888 brk(0x718000) = 0x718000 10888 getcwd("/opt/packrat/playpen/public/in-place/git/git.junio/t/trash", 4096) = 59 10888 access(".git/objects", X_OK) = 0 10888 access(".git/refs", X_OK) = 0 10888 lstat(".git/HEAD", {st_mode=S_IFREG|0664, st_size=23, ...}) = 0 10888 open(".git/HEAD", O_RDONLY) = 6 10888 read(6, "ref: refs/heads/master\n", 255) = 23 10888 read(6, "", 232) = 0 10888 close(6) = 0 10888 open(".git/config", O_RDONLY) = 6 10888 fstat(6, {st_mode=S_IFREG|0664, st_size=92, ...}) = 0 10888 mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x2b064998f000 10888 read(6, "[core]\n\trepositoryformatversion "..., 4096) = 92 10888 read(6, "", 4096) = 0 10888 close(6) = 0 10888 munmap(0x2b064998f000, 4096) = 0 10888 stat(".git", {st_mode=S_IFDIR|S_ISGID|0775, st_size=4096, ...}) = 0 10888 getcwd("/opt/packrat/playpen/public/in-place/git/git.junio/t/trash", 1024) = 59 10888 chdir(".git") = 0 10888 getcwd("/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git", 4096) = 64 10888 lstat("/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git", {st_mode=S_IFDIR|S_ISGID|0775, st_size=4096, ...}) = 0 10888 chdir("/opt/packrat/playpen/public/in-place/git/git.junio/t/trash") = 0 10888 chdir("/opt/packrat/playpen/public/in-place/git/git.junio/t/trash") = 0 10888 open(".git/config", O_RDONLY) = 6 10888 fstat(6, {st_mode=S_IFREG|0664, st_size=92, ...}) = 0 10888 mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x2b064998f000 10888 read(6, "[core]\n\trepositoryformatversion "..., 4096) = 92 10888 read(6, "", 4096) = 0 10888 close(6) = 0 10888 munmap(0x2b064998f000, 4096) = 0 10888 lstat("/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/HEAD", {st_mode=S_IFREG|0664, st_size=23, ...}) = 0 10888 open("/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/HEAD", O_RDONLY) = 6 10888 read(6, "ref: refs/heads/master\n", 255) = 23 10888 read(6, "", 232) = 0 10888 close(6) = 0 10888 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 10888 open("/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/refs/heads/master", O_RDONLY) = 6 10888 read(6, "1bd44cb9d13204b0fe1958db0082f502"..., 255) = 41 10888 read(6, "", 214) = 0 10888 close(6) = 0 10888 lstat("/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/refs/HEAD", 0x7fff611379c0) = -1 ENOENT (No such file or directory) 10888 open("/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/packed-refs", O_RDONLY) = -1 ENOENT (No such file or directory) 10888 lstat("/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/refs/tags/HEAD", 0x7fff611379c0) = -1 ENOENT (No such file or directory) 10888 lstat("/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/refs/heads/HEAD", 0x7fff611379c0) = -1 ENOENT (No such file or directory) 10888 lstat("/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/refs/remotes/HEAD", 0x7fff611379c0) = -1 ENOENT (No such file or directory) 10888 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) 10888 lstat("/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/MERGE_HEAD", 0x7fff611379c0) = -1 ENOENT (No such file or directory) 10888 lstat("/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/refs/MERGE_HEAD", 0x7fff611379c0) = -1 ENOENT (No such file or directory) 10888 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) 10888 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) 10888 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) 10888 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) 10888 open("/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/index", O_RDONLY) = 6 10888 fstat(6, {st_mode=S_IFREG|0664, st_size=104, ...}) = 0 10888 mmap(NULL, 104, PROT_READ|PROT_WRITE, MAP_PRIVATE, 6, 0) = 0x2b064998f000 10888 close(6) = 0 10888 munmap(0x2b064998f000, 104) = 0 10888 lstat("/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/MERGE_HEAD", 0x7fff61137b30) = -1 ENOENT (No such file or directory) 10888 lstat("/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/HEAD", {st_mode=S_IFREG|0664, st_size=23, ...}) = 0 10888 open("/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/HEAD", O_RDONLY) = 6 10888 read(6, "ref: refs/heads/master\n", 255) = 23 10888 read(6, "", 232) = 0 10888 close(6) = 0 10888 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 10888 open("/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/refs/heads/master", O_RDONLY) = 6 10888 read(6, "1bd44cb9d13204b0fe1958db0082f502"..., 255) = 41 10888 read(6, "", 214) = 0 10888 close(6) = 0 10888 lstat("/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/refs/HEAD", 0x7fff611378f0) = -1 ENOENT (No such file or directory) 10888 lstat("/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/refs/tags/HEAD", 0x7fff611378f0) = -1 ENOENT (No such file or directory) 10888 lstat("/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/refs/heads/HEAD", 0x7fff611378f0) = -1 ENOENT (No such file or directory) 10888 lstat("/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/refs/remotes/HEAD", 0x7fff611378f0) = -1 ENOENT (No such file or directory) 10888 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) 10888 open("/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/objects/pack", O_RDONLY|O_NONBLOCK|O_DIRECTORY) = 6 10888 fstat(6, {st_mode=S_IFDIR|S_ISGID|0775, st_size=4096, ...}) = 0 10888 fcntl(6, F_SETFD, FD_CLOEXEC) = 0 10888 getdents(6, /* 2 entries */, 4096) = 48 10888 getdents(6, /* 0 entries */, 4096) = 0 10888 close(6) = 0 10888 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) 10888 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 10888 open("/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/objects/1b/d44cb9d13204b0fe1958db0082f5028a16eb3a", O_RDONLY|O_NOATIME) = 6 10888 mmap(NULL, 136, PROT_READ, MAP_PRIVATE, 6, 0) = 0x2b064998f000 10888 close(6) = 0 10888 munmap(0x2b064998f000, 136) = 0 10888 open("/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/info/grafts", O_RDONLY) = -1 ENOENT (No such file or directory) 10888 open("/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/shallow", O_RDONLY) = -1 ENOENT (No such file or directory) 10888 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 10888 open("/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/objects/df/2b8fc99e1c1d4dbc0a854d9f72157f1d6ea078", O_RDONLY|O_NOATIME) = 6 10888 mmap(NULL, 49, PROT_READ, MAP_PRIVATE, 6, 0) = 0x2b064998f000 10888 close(6) = 0 10888 brk(0x739000) = 0x739000 10888 brk(0x736000) = 0x736000 10888 munmap(0x2b064998f000, 49) = 0 10888 open("/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/index", O_RDONLY) = 6 10888 fstat(6, {st_mode=S_IFREG|0664, st_size=104, ...}) = 0 10888 mmap(NULL, 104, PROT_READ|PROT_WRITE, MAP_PRIVATE, 6, 0) = 0x2b064998f000 10888 close(6) = 0 10888 munmap(0x2b064998f000, 104) = 0 10888 readlink("/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/index", 0x7fff61136b90, 4096) = -1 EINVAL (Invalid argument) 10888 open("/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/index.lock", O_RDWR|O_CREAT|O_EXCL, 0666) = 6 10888 rt_sigaction(SIGINT, {0x44bc70, [INT], SA_RESTORER|SA_RESTART, 0x2b064a0496a0}, {SIG_DFL}, 8) = 0 10888 getpid() = 10888 10888 lstat("elif", {st_mode=S_IFREG|0664, st_size=0, ...}) = 0 10888 lstat("elif", {st_mode=S_IFREG|0664, st_size=0, ...}) = 0 10888 open("elif", O_RDONLY) = 7 10888 close(7) = 0 10888 open(".git/config", O_RDONLY) = 7 10888 fstat(7, {st_mode=S_IFREG|0664, st_size=92, ...}) = 0 10888 mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x2b064998f000 10888 read(7, "[core]\n\trepositoryformatversion "..., 4096) = 92 10888 read(7, "", 4096) = 0 10888 close(7) = 0 10888 munmap(0x2b064998f000, 4096) = 0 10888 open(".gitattributes", O_RDONLY) = -1 ENOENT (No such file or directory) 10888 open("/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/info/attributes", O_RDONLY) = -1 ENOENT (No such file or directory) 10888 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 10888 lstat("elif", {st_mode=S_IFREG|0664, st_size=0, ...}) = 0 10888 open("elif", O_RDONLY) = 7 10888 close(7) = 0 10888 lstat("elif", {st_mode=S_IFREG|0664, st_size=0, ...}) = 0 10888 open("elif", O_RDONLY) = 7 10888 close(7) = 0 10888 write(6, "DIRC\0\0\0\2\0\0\0\1G\224S\266\0\0\0\0G\224S\266\0\0\0"..., 104) = 104 10888 close(6) = 0 10888 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) 10888 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 10888 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 10888 open("/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/objects/1b/d44cb9d13204b0fe1958db0082f5028a16eb3a", O_RDONLY|O_NOATIME) = 7 10888 mmap(NULL, 136, PROT_READ, MAP_PRIVATE, 7, 0) = 0x2b064998f000 10888 close(7) = 0 10888 munmap(0x2b064998f000, 136) = 0 10888 lstat("elif", {st_mode=S_IFREG|0664, st_size=0, ...}) = 0 10888 lstat("elif", {st_mode=S_IFREG|0664, st_size=0, ...}) = 0 10888 open("elif", O_RDONLY) = 7 10888 close(7) = 0 10888 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 10888 lstat("elif", {st_mode=S_IFREG|0664, st_size=0, ...}) = 0 10888 open("elif", O_RDONLY) = 7 10888 close(7) = 0 10888 lstat("file", 0x7fff61137a80) = -1 ENOENT (No such file or directory) 10888 lstat("elif", {st_mode=S_IFREG|0664, st_size=0, ...}) = 0 10888 open("elif", O_RDONLY) = 7 10888 close(7) = 0 10888 write(6, "DIRC\0\0\0\2\0\0\0\2G\224S\266\0\0\0\0G\224S\266\0\0\0"..., 176) = 176 10888 close(6) = 0 10888 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) 10888 open("/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/COMMIT_EDITMSG", O_WRONLY|O_CREAT|O_TRUNC, 0666) = 6 10888 fstat(6, {st_mode=S_IFREG|0664, st_size=0, ...}) = 0 10888 mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x2b064998f000 10888 write(6, "Partial: add elif\n", 18) = 18 10888 close(6) = 0 10888 munmap(0x2b064998f000, 4096) = 0 10888 lstat("/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/HEAD", {st_mode=S_IFREG|0664, st_size=23, ...}) = 0 10888 open("/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/HEAD", O_RDONLY) = 6 10888 read(6, "ref: refs/heads/master\n", 255) = 23 10888 read(6, "", 232) = 0 10888 close(6) = 0 10888 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 10888 open("/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/refs/heads/master", O_RDONLY) = 6 10888 read(6, "1bd44cb9d13204b0fe1958db0082f502"..., 255) = 41 10888 read(6, "", 214) = 0 10888 close(6) = 0 10888 lstat("/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/refs/HEAD", 0x7fff611376a0) = -1 ENOENT (No such file or directory) 10888 lstat("/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/refs/tags/HEAD", 0x7fff611376a0) = -1 ENOENT (No such file or directory) 10888 lstat("/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/refs/heads/HEAD", 0x7fff611376a0) = -1 ENOENT (No such file or directory) 10888 lstat("/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/refs/remotes/HEAD", 0x7fff611376a0) = -1 ENOENT (No such file or directory) 10888 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) 10888 lstat("/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/HEAD", {st_mode=S_IFREG|0664, st_size=23, ...}) = 0 10888 open("/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/HEAD", O_RDONLY) = 6 10888 read(6, "ref: refs/heads/master\n", 255) = 23 10888 read(6, "", 232) = 0 10888 close(6) = 0 10888 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 10888 open("/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/refs/heads/master", O_RDONLY) = 6 10888 read(6, "1bd44cb9d13204b0fe1958db0082f502"..., 255) = 41 10888 read(6, "", 214) = 0 10888 close(6) = 0 10888 lstat("/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/refs/HEAD", 0x7fff611375f0) = -1 ENOENT (No such file or directory) 10888 lstat("/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/refs/tags/HEAD", 0x7fff611375f0) = -1 ENOENT (No such file or directory) 10888 lstat("/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/refs/heads/HEAD", 0x7fff611375f0) = -1 ENOENT (No such file or directory) 10888 lstat("/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/refs/remotes/HEAD", 0x7fff611375f0) = -1 ENOENT (No such file or directory) 10888 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) 10888 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 10888 open("/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/objects/1b/d44cb9d13204b0fe1958db0082f5028a16eb3a", O_RDONLY|O_NOATIME) = 6 10888 mmap(NULL, 136, PROT_READ, MAP_PRIVATE, 6, 0) = 0x2b064998f000 10888 close(6) = 0 10888 munmap(0x2b064998f000, 136) = 0 10888 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 10888 open("/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/objects/1b/d44cb9d13204b0fe1958db0082f5028a16eb3a", O_RDONLY|O_NOATIME) = 6 10888 mmap(NULL, 136, PROT_READ, MAP_PRIVATE, 6, 0) = 0x2b064998f000 10888 close(6) = 0 10888 munmap(0x2b064998f000, 136) = 0 10888 open("/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/next-index-10888.lock", O_RDONLY) = 6 10888 fstat(6, {st_mode=S_IFREG|0664, st_size=176, ...}) = 0 10888 mmap(NULL, 176, PROT_READ|PROT_WRITE, MAP_PRIVATE, 6, 0) = 0x2b064998f000 10888 close(6) = 0 10888 munmap(0x2b064998f000, 176) = 0 10888 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 10888 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 10888 stat("/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/objects/a7/3843106991cb043bd823dd0bf7c821354cc125", 0x7fff611379b0) = -1 ENOENT (No such file or directory) 10888 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) 10888 gettimeofday({1200903094, 936786}, NULL) = 0 10888 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 10888 brk(0x75a000) = 0x75a000 10888 brk(0x74a000) = 0x74a000 10888 brk(0x73a000) = 0x73a000 10888 brk(0x738000) = 0x738000 10888 write(6, "x\1+)JMU03a040031QH\315\311Lcx6\367\321\354M\27\2579{"..., 57) = 57 10888 fchmod(6, 0444) = 0 10888 close(6) = 0 10888 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) 10888 mkdir("/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/objects/a7", 0777) = 0 10888 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 10888 unlink("/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/objects/tmp_obj_p1kDCU") = 0 10888 brk(0x736000) = 0x736000 10888 getuid() = 1012 10888 socket(PF_FILE, SOCK_STREAM, 0) = 6 10888 fcntl(6, F_SETFL, O_RDWR|O_NONBLOCK) = 0 10888 connect(6, {sa_family=AF_FILE, path="/var/run/nscd/socket"}, 110) = -1 ENOENT (No such file or directory) 10888 close(6) = 0 10888 socket(PF_FILE, SOCK_STREAM, 0) = 6 10888 fcntl(6, F_SETFL, O_RDWR|O_NONBLOCK) = 0 10888 connect(6, {sa_family=AF_FILE, path="/var/run/nscd/socket"}, 110) = -1 ENOENT (No such file or directory) 10888 close(6) = 0 10888 open("/etc/nsswitch.conf", O_RDONLY) = 6 10888 fstat(6, {st_mode=S_IFREG|0644, st_size=465, ...}) = 0 10888 mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x2b064998f000 10888 read(6, "# /etc/nsswitch.conf\n#\n# Example"..., 4096) = 465 10888 read(6, "", 4096) = 0 10888 close(6) = 0 10888 munmap(0x2b064998f000, 4096) = 0 10888 open("/etc/ld.so.cache", O_RDONLY) = 6 10888 fstat(6, {st_mode=S_IFREG|0644, st_size=70263, ...}) = 0 10888 mmap(NULL, 70263, PROT_READ, MAP_PRIVATE, 6, 0) = 0x2b064998f000 10888 close(6) = 0 10888 access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory) 10888 open("/lib/libnss_compat.so.2", O_RDONLY) = 6 10888 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 10888 fstat(6, {st_mode=S_IFREG|0644, st_size=35632, ...}) = 0 10888 mmap(NULL, 2131176, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 6, 0) = 0x2b064b4fb000 10888 mprotect(0x2b064b502000, 2097152, PROT_NONE) = 0 10888 mmap(0x2b064b702000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 6, 0x7000) = 0x2b064b702000 10888 close(6) = 0 10888 access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory) 10888 open("/lib/libnsl.so.1", O_RDONLY) = 6 10888 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 10888 fstat(6, {st_mode=S_IFREG|0644, st_size=93088, ...}) = 0 10888 mmap(NULL, 2198224, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 6, 0) = 0x2b064b704000 10888 mprotect(0x2b064b719000, 2097152, PROT_NONE) = 0 10888 mmap(0x2b064b919000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 6, 0x15000) = 0x2b064b919000 10888 mmap(0x2b064b91b000, 6864, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x2b064b91b000 10888 close(6) = 0 10888 munmap(0x2b064998f000, 70263) = 0 10888 open("/etc/ld.so.cache", O_RDONLY) = 6 10888 fstat(6, {st_mode=S_IFREG|0644, st_size=70263, ...}) = 0 10888 mmap(NULL, 70263, PROT_READ, MAP_PRIVATE, 6, 0) = 0x2b064998f000 10888 close(6) = 0 10888 access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory) 10888 open("/lib/libnss_nis.so.2", O_RDONLY) = 6 10888 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 10888 fstat(6, {st_mode=S_IFREG|0644, st_size=43480, ...}) = 0 10888 mmap(NULL, 2139352, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 6, 0) = 0x2b064b91d000 10888 mprotect(0x2b064b927000, 2093056, PROT_NONE) = 0 10888 mmap(0x2b064bb26000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 6, 0x9000) = 0x2b064bb26000 10888 close(6) = 0 10888 access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory) 10888 open("/lib/libnss_files.so.2", O_RDONLY) = 6 10888 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 10888 fstat(6, {st_mode=S_IFREG|0644, st_size=43448, ...}) = 0 10888 mmap(NULL, 2139464, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 6, 0) = 0x2b064bb28000 10888 mprotect(0x2b064bb32000, 2093056, PROT_NONE) = 0 10888 mmap(0x2b064bd31000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 6, 0x9000) = 0x2b064bd31000 10888 close(6) = 0 10888 munmap(0x2b064998f000, 70263) = 0 10888 open("/etc/passwd", O_RDONLY) = 6 10888 fcntl(6, F_GETFD) = 0 10888 fcntl(6, F_SETFD, FD_CLOEXEC) = 0 10888 lseek(6, 0, SEEK_CUR) = 0 10888 fstat(6, {st_mode=S_IFREG|0644, st_size=1663, ...}) = 0 10888 mmap(NULL, 1663, PROT_READ, MAP_SHARED, 6, 0) = 0x2b064998f000 10888 lseek(6, 1663, SEEK_SET) = 1663 10888 munmap(0x2b064998f000, 1663) = 0 10888 close(6) = 0 10888 uname({sys="Linux", node="gitster", ...}) = 0 10888 open("/etc/resolv.conf", O_RDONLY) = 6 10888 fstat(6, {st_mode=S_IFREG|0644, st_size=44, ...}) = 0 10888 mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x2b064998f000 10888 read(6, "search pv.oc.cox.net\nnameserver "..., 4096) = 44 10888 read(6, "", 4096) = 0 10888 close(6) = 0 10888 munmap(0x2b064998f000, 4096) = 0 10888 stat("/etc/resolv.conf", {st_mode=S_IFREG|0644, st_size=44, ...}) = 0 10888 open("/etc/resolv.conf", O_RDONLY) = 6 10888 fstat(6, {st_mode=S_IFREG|0644, st_size=44, ...}) = 0 10888 mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x2b064998f000 10888 read(6, "search pv.oc.cox.net\nnameserver "..., 4096) = 44 10888 read(6, "", 4096) = 0 10888 close(6) = 0 10888 munmap(0x2b064998f000, 4096) = 0 10888 socket(PF_FILE, SOCK_STREAM, 0) = 6 10888 fcntl(6, F_SETFL, O_RDWR|O_NONBLOCK) = 0 10888 connect(6, {sa_family=AF_FILE, path="/var/run/nscd/socket"}, 110) = -1 ENOENT (No such file or directory) 10888 close(6) = 0 10888 socket(PF_FILE, SOCK_STREAM, 0) = 6 10888 fcntl(6, F_SETFL, O_RDWR|O_NONBLOCK) = 0 10888 connect(6, {sa_family=AF_FILE, path="/var/run/nscd/socket"}, 110) = -1 ENOENT (No such file or directory) 10888 close(6) = 0 10888 open("/etc/host.conf", O_RDONLY) = 6 10888 fstat(6, {st_mode=S_IFREG|0644, st_size=9, ...}) = 0 10888 mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x2b064998f000 10888 read(6, "multi on\n", 4096) = 9 10888 read(6, "", 4096) = 0 10888 close(6) = 0 10888 munmap(0x2b064998f000, 4096) = 0 10888 open("/etc/hosts", O_RDONLY) = 6 10888 fcntl(6, F_GETFD) = 0 10888 fcntl(6, F_SETFD, FD_CLOEXEC) = 0 10888 fstat(6, {st_mode=S_IFREG|0644, st_size=570, ...}) = 0 10888 mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x2b064998f000 10888 read(6, "127.0.0.1\tlocalhost\n#127.0.1.1\tg"..., 4096) = 570 10888 read(6, "", 4096) = 0 10888 close(6) = 0 10888 munmap(0x2b064998f000, 4096) = 0 10888 gettimeofday({1200903094, 941441}, NULL) = 0 10888 open("/usr/share/zoneinfo/UTC", O_RDONLY) = 6 10888 fstat(6, {st_mode=S_IFREG|0644, st_size=118, ...}) = 0 10888 fstat(6, {st_mode=S_IFREG|0644, st_size=118, ...}) = 0 10888 mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x2b064998f000 10888 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 10888 lseek(6, -62, SEEK_CUR) = 56 10888 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 10888 close(6) = 0 10888 munmap(0x2b064998f000, 4096) = 0 10888 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) 10888 open("/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/COMMIT_EDITMSG", O_RDONLY) = 6 10888 read(6, "Partial: add elif\n", 8192) = 18 10888 read(6, "", 12400) = 0 10888 close(6) = 0 10888 stat("/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/objects/c1/7ca051cb2649d9f7bed8021db2cfc08eb9b330", 0x7fff61137ad0) = -1 ENOENT (No such file or directory) 10888 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) 10888 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 10888 brk(0x75c000) = 0x75c000 10888 brk(0x74c000) = 0x74c000 10888 brk(0x73c000) = 0x73c000 10888 brk(0x73b000) = 0x73b000 10888 write(6, "x\1\205\316A\212\0021\20\205a\3279E]@\251\252$v\"2\214"..., 174) = 174 10888 fchmod(6, 0444) = 0 10888 close(6) = 0 10888 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) 10888 mkdir("/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/objects/c1", 0777) = 0 10888 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 10888 unlink("/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/objects/tmp_obj_BZH0dB") = 0 10888 lstat("/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/HEAD", {st_mode=S_IFREG|0664, st_size=23, ...}) = 0 10888 open("/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/HEAD", O_RDONLY) = 6 10888 read(6, "ref: refs/heads/master\n", 255) = 23 10888 read(6, "", 232) = 0 10888 close(6) = 0 10888 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 10888 open("/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/refs/heads/master", O_RDONLY) = 6 10888 read(6, "1bd44cb9d13204b0fe1958db0082f502"..., 255) = 41 10888 read(6, "", 214) = 0 10888 close(6) = 0 10888 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 10888 stat("/opt", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0 10888 stat("/opt/packrat", {st_mode=S_IFDIR|S_ISGID|0775, st_size=4096, ...}) = 0 10888 stat("/opt/packrat/playpen", {st_mode=S_IFDIR|S_ISGID|0775, st_size=4096, ...}) = 0 10888 stat("/opt/packrat/playpen/public", {st_mode=S_IFDIR|S_ISGID|0755, st_size=4096, ...}) = 0 10888 stat("/opt/packrat/playpen/public/in-place", {st_mode=S_IFDIR|S_ISGID|0755, st_size=4096, ...}) = 0 10888 stat("/opt/packrat/playpen/public/in-place/git", {st_mode=S_IFDIR|S_ISGID|0775, st_size=4096, ...}) = 0 10888 stat("/opt/packrat/playpen/public/in-place/git/git.junio", {st_mode=S_IFDIR|S_ISGID|0775, st_size=98304, ...}) = 0 10888 stat("/opt/packrat/playpen/public/in-place/git/git.junio/t", {st_mode=S_IFDIR|S_ISGID|0775, st_size=8192, ...}) = 0 10888 stat("/opt/packrat/playpen/public/in-place/git/git.junio/t/trash", {st_mode=S_IFDIR|S_ISGID|0775, st_size=4096, ...}) = 0 10888 stat("/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git", {st_mode=S_IFDIR|S_ISGID|0775, st_size=4096, ...}) = 0 10888 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 10888 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 10888 readlink("/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/refs/heads/master", 0x7fff61136b70, 4096) = -1 EINVAL (Invalid argument) 10888 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 10888 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 10888 open("/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/refs/heads/master", O_RDONLY) = 7 10888 read(7, "1bd44cb9d13204b0fe1958db0082f502"..., 255) = 41 10888 read(7, "", 214) = 0 10888 close(7) = 0 10888 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 10888 open("/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/objects/c1/7ca051cb2649d9f7bed8021db2cfc08eb9b330", O_RDONLY|O_NOATIME) = 7 10888 mmap(NULL, 174, PROT_READ, MAP_PRIVATE, 7, 0) = 0x2b064998f000 10888 close(7) = 0 10888 munmap(0x2b064998f000, 174) = 0 10888 write(6, "c17ca051cb2649d9f7bed8021db2cfc0"..., 40) = 40 10888 write(6, "\n", 1) = 1 10888 close(6) = 0 10888 stat("/opt", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0 10888 stat("/opt/packrat", {st_mode=S_IFDIR|S_ISGID|0775, st_size=4096, ...}) = 0 10888 stat("/opt/packrat/playpen", {st_mode=S_IFDIR|S_ISGID|0775, st_size=4096, ...}) = 0 10888 stat("/opt/packrat/playpen/public", {st_mode=S_IFDIR|S_ISGID|0755, st_size=4096, ...}) = 0 10888 stat("/opt/packrat/playpen/public/in-place", {st_mode=S_IFDIR|S_ISGID|0755, st_size=4096, ...}) = 0 10888 stat("/opt/packrat/playpen/public/in-place/git", {st_mode=S_IFDIR|S_ISGID|0775, st_size=4096, ...}) = 0 10888 stat("/opt/packrat/playpen/public/in-place/git/git.junio", {st_mode=S_IFDIR|S_ISGID|0775, st_size=98304, ...}) = 0 10888 stat("/opt/packrat/playpen/public/in-place/git/git.junio/t", {st_mode=S_IFDIR|S_ISGID|0775, st_size=8192, ...}) = 0 10888 stat("/opt/packrat/playpen/public/in-place/git/git.junio/t/trash", {st_mode=S_IFDIR|S_ISGID|0775, st_size=4096, ...}) = 0 10888 stat("/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git", {st_mode=S_IFDIR|S_ISGID|0775, st_size=4096, ...}) = 0 10888 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 10888 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 10888 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 10888 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 10888 write(6, "1bd44cb9d13204b0fe1958db0082f502"..., 160) = 160 10888 close(6) = 0 10888 stat("/opt", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0 10888 stat("/opt/packrat", {st_mode=S_IFDIR|S_ISGID|0775, st_size=4096, ...}) = 0 10888 stat("/opt/packrat/playpen", {st_mode=S_IFDIR|S_ISGID|0775, st_size=4096, ...}) = 0 10888 stat("/opt/packrat/playpen/public", {st_mode=S_IFDIR|S_ISGID|0755, st_size=4096, ...}) = 0 10888 stat("/opt/packrat/playpen/public/in-place", {st_mode=S_IFDIR|S_ISGID|0755, st_size=4096, ...}) = 0 10888 stat("/opt/packrat/playpen/public/in-place/git", {st_mode=S_IFDIR|S_ISGID|0775, st_size=4096, ...}) = 0 10888 stat("/opt/packrat/playpen/public/in-place/git/git.junio", {st_mode=S_IFDIR|S_ISGID|0775, st_size=98304, ...}) = 0 10888 stat("/opt/packrat/playpen/public/in-place/git/git.junio/t", {st_mode=S_IFDIR|S_ISGID|0775, st_size=8192, ...}) = 0 10888 stat("/opt/packrat/playpen/public/in-place/git/git.junio/t/trash", {st_mode=S_IFDIR|S_ISGID|0775, st_size=4096, ...}) = 0 10888 stat("/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git", {st_mode=S_IFDIR|S_ISGID|0775, st_size=4096, ...}) = 0 10888 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 10888 open("/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/logs/HEAD", O_WRONLY|O_APPEND|O_CREAT, 0666) = 6 10888 write(6, "1bd44cb9d13204b0fe1958db0082f502"..., 160) = 160 10888 close(6) = 0 10888 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 10888 unlink("/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/MERGE_HEAD") = -1 ENOENT (No such file or directory) 10888 unlink("/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/MERGE_MSG") = -1 ENOENT (No such file or directory) 10888 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 10888 unlink("/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/next-index-10888.lock") = 0 10888 open(".git/config", O_RDONLY) = 6 10888 fstat(6, {st_mode=S_IFREG|0664, st_size=92, ...}) = 0 10888 mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x2b064998f000 10888 read(6, "[core]\n\trepositoryformatversion "..., 4096) = 92 10888 read(6, "", 4096) = 0 10888 close(6) = 0 10888 munmap(0x2b064998f000, 4096) = 0 10888 stat("/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/rr-cache", 0x7fff61137b90) = -1 ENOENT (No such file or directory) 10888 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) 10888 fstat(1, {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 6), ...}) = 0 10888 mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x2b064998f000 10888 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 10888 open("/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/objects/1b/d44cb9d13204b0fe1958db0082f5028a16eb3a", O_RDONLY|O_NOATIME) = 6 10888 mmap(NULL, 136, PROT_READ, MAP_PRIVATE, 6, 0) = 0x2b0649990000 10888 close(6) = 0 10888 munmap(0x2b0649990000, 136) = 0 10888 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 10888 open("/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/objects/df/2b8fc99e1c1d4dbc0a854d9f72157f1d6ea078", O_RDONLY|O_NOATIME) = 6 10888 mmap(NULL, 49, PROT_READ, MAP_PRIVATE, 6, 0) = 0x2b0649990000 10888 close(6) = 0 10888 munmap(0x2b0649990000, 49) = 0 10888 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 10888 open("/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/objects/c1/7ca051cb2649d9f7bed8021db2cfc08eb9b330", O_RDONLY|O_NOATIME) = 6 10888 mmap(NULL, 174, PROT_READ, MAP_PRIVATE, 6, 0) = 0x2b0649990000 10888 close(6) = 0 10888 munmap(0x2b0649990000, 174) = 0 10888 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 10888 open("/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/objects/a7/3843106991cb043bd823dd0bf7c821354cc125", O_RDONLY|O_NOATIME) = 6 10888 mmap(NULL, 57, PROT_READ, MAP_PRIVATE, 6, 0) = 0x2b0649990000 10888 close(6) = 0 10888 munmap(0x2b0649990000, 57) = 0 10888 open("/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/objects/c1/", O_RDONLY|O_NONBLOCK|O_DIRECTORY) = 6 10888 fstat(6, {st_mode=S_IFDIR|S_ISGID|0775, st_size=4096, ...}) = 0 10888 fcntl(6, F_SETFD, FD_CLOEXEC) = 0 10888 getdents(6, /* 3 entries */, 4096) = 112 10888 getdents(6, /* 0 entries */, 4096) = 0 10888 close(6) = 0 10888 write(1, "Created commit c17ca05: Partial:"..., 42) = 42 10888 lstat("elif", {st_mode=S_IFREG|0664, st_size=0, ...}) = 0 10888 open("elif", O_RDONLY) = 6 10888 close(6) = 0 10888 lstat("elif", {st_mode=S_IFREG|0664, st_size=0, ...}) = 0 10888 write(1, " 0 files changed, 0 insertions(+"..., 50) = 50 10888 write(1, " create mode 100644 elif\n", 25) = 25 10888 fstat(1, {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 6), ...}) = 0 10888 fstat(1, {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 6), ...}) = 0 10888 close(1) = 0 10888 munmap(0x2b064998f000, 4096) = 0 10888 exit_group(0) = ? [-- Attachment #4: strace output from a bad run --] [-- Type: text/plain, Size: 46509 bytes --] 10922 execve("/opt/packrat/playpen/public/in-place/git/git.junio/t/../git", ["git", "commit", "-m", "Partial: add elif", "elif"], [/* 51 vars */]) = 0 10922 brk(0) = 0x6f7000 10922 mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x2ac02877e000 10922 uname({sys="Linux", node="gitster", ...}) = 0 10922 access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory) 10922 mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x2ac02877f000 10922 access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or directory) 10922 open("/etc/ld.so.cache", O_RDONLY) = 6 10922 fstat(6, {st_mode=S_IFREG|0644, st_size=70263, ...}) = 0 10922 mmap(NULL, 70263, PROT_READ, MAP_PRIVATE, 6, 0) = 0x2ac028781000 10922 close(6) = 0 10922 access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory) 10922 open("/usr/lib/libcurl.so.3", O_RDONLY) = 6 10922 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 10922 fstat(6, {st_mode=S_IFREG|0644, st_size=227856, ...}) = 0 10922 mmap(NULL, 1275080, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 6, 0) = 0x2ac028793000 10922 mprotect(0x2ac0287c9000, 1048576, PROT_NONE) = 0 10922 mmap(0x2ac0288c9000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 6, 0x36000) = 0x2ac0288c9000 10922 close(6) = 0 10922 access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory) 10922 open("/usr/lib/libz.so.1", O_RDONLY) = 6 10922 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 10922 fstat(6, {st_mode=S_IFREG|0644, st_size=93504, ...}) = 0 10922 mmap(NULL, 2188616, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 6, 0) = 0x2ac02897f000 10922 mprotect(0x2ac028995000, 2097152, PROT_NONE) = 0 10922 mmap(0x2ac028b95000, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 6, 0x16000) = 0x2ac028b95000 10922 close(6) = 0 10922 access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory) 10922 open("/usr/lib/libcrypto.so.0.9.8", O_RDONLY) = 6 10922 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 10922 fstat(6, {st_mode=S_IFREG|0644, st_size=1510344, ...}) = 0 10922 mmap(NULL, 2571832, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 6, 0) = 0x2ac028b96000 10922 mprotect(0x2ac028ce4000, 1048576, PROT_NONE) = 0 10922 mmap(0x2ac028de4000, 143360, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 6, 0x14e000) = 0x2ac028de4000 10922 mmap(0x2ac028e07000, 11832, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x2ac028e07000 10922 close(6) = 0 10922 access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory) 10922 open("/lib/libc.so.6", O_RDONLY) = 6 10922 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 10922 fstat(6, {st_mode=S_IFREG|0755, st_size=1391928, ...}) = 0 10922 mmap(NULL, 3498360, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 6, 0) = 0x2ac028e0a000 10922 mprotect(0x2ac028f57000, 2097152, PROT_NONE) = 0 10922 mmap(0x2ac029157000, 20480, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 6, 0x14d000) = 0x2ac029157000 10922 mmap(0x2ac02915c000, 16760, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x2ac02915c000 10922 close(6) = 0 10922 access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory) 10922 open("/usr/lib/libgssapi_krb5.so.2", O_RDONLY) = 6 10922 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 10922 fstat(6, {st_mode=S_IFREG|0644, st_size=173640, ...}) = 0 10922 mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x2ac029161000 10922 mmap(NULL, 2269136, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 6, 0) = 0x2ac029162000 10922 mprotect(0x2ac02918b000, 2093056, PROT_NONE) = 0 10922 mmap(0x2ac02938a000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 6, 0x28000) = 0x2ac02938a000 10922 close(6) = 0 10922 access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory) 10922 open("/usr/lib/libkrb5.so.3", O_RDONLY) = 6 10922 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 10922 fstat(6, {st_mode=S_IFREG|0644, st_size=635688, ...}) = 0 10922 mmap(NULL, 2730976, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 6, 0) = 0x2ac02938c000 10922 mprotect(0x2ac029423000, 2097152, PROT_NONE) = 0 10922 mmap(0x2ac029623000, 16384, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 6, 0x97000) = 0x2ac029623000 10922 close(6) = 0 10922 access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory) 10922 open("/usr/lib/libk5crypto.so.3", O_RDONLY) = 6 10922 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 10922 fstat(6, {st_mode=S_IFREG|0644, st_size=150656, ...}) = 0 10922 mmap(NULL, 2246952, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 6, 0) = 0x2ac029627000 10922 mprotect(0x2ac02964a000, 2097152, PROT_NONE) = 0 10922 mmap(0x2ac02984a000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 6, 0x23000) = 0x2ac02984a000 10922 close(6) = 0 10922 access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory) 10922 open("/lib/libcom_err.so.2", O_RDONLY) = 6 10922 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 10922 fstat(6, {st_mode=S_IFREG|0644, st_size=7984, ...}) = 0 10922 mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x2ac02984c000 10922 mmap(NULL, 1054920, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 6, 0) = 0x2ac02984d000 10922 mprotect(0x2ac02984f000, 1044480, PROT_NONE) = 0 10922 mmap(0x2ac02994e000, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 6, 0x1000) = 0x2ac02994e000 10922 close(6) = 0 10922 access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory) 10922 open("/usr/lib/libkrb5support.so.0", O_RDONLY) = 6 10922 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 10922 fstat(6, {st_mode=S_IFREG|0644, st_size=30408, ...}) = 0 10922 mmap(NULL, 2125648, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 6, 0) = 0x2ac02994f000 10922 mprotect(0x2ac029956000, 2093056, PROT_NONE) = 0 10922 mmap(0x2ac029b55000, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 6, 0x6000) = 0x2ac029b55000 10922 close(6) = 0 10922 access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory) 10922 open("/lib/libresolv.so.2", O_RDONLY) = 6 10922 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 10922 fstat(6, {st_mode=S_IFREG|0644, st_size=76664, ...}) = 0 10922 mmap(NULL, 2181896, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 6, 0) = 0x2ac029b56000 10922 mprotect(0x2ac029b67000, 2097152, PROT_NONE) = 0 10922 mmap(0x2ac029d67000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 6, 0x11000) = 0x2ac029d67000 10922 mmap(0x2ac029d69000, 6920, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x2ac029d69000 10922 close(6) = 0 10922 access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory) 10922 open("/usr/lib/libidn.so.11", O_RDONLY) = 6 10922 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 10922 fstat(6, {st_mode=S_IFREG|0644, st_size=202368, ...}) = 0 10922 mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x2ac029d6b000 10922 mmap(NULL, 1249152, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 6, 0) = 0x2ac029d6c000 10922 mprotect(0x2ac029d9d000, 1044480, PROT_NONE) = 0 10922 mmap(0x2ac029e9c000, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 6, 0x30000) = 0x2ac029e9c000 10922 close(6) = 0 10922 access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory) 10922 open("/lib/libdl.so.2", O_RDONLY) = 6 10922 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 10922 fstat(6, {st_mode=S_IFREG|0644, st_size=14624, ...}) = 0 10922 mmap(NULL, 2109728, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 6, 0) = 0x2ac029e9d000 10922 mprotect(0x2ac029e9f000, 2097152, PROT_NONE) = 0 10922 mmap(0x2ac02a09f000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 6, 0x2000) = 0x2ac02a09f000 10922 close(6) = 0 10922 access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory) 10922 open("/usr/lib/libssl.so.0.9.8", O_RDONLY) = 6 10922 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 10922 fstat(6, {st_mode=S_IFREG|0644, st_size=291816, ...}) = 0 10922 mmap(NULL, 1338608, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 6, 0) = 0x2ac02a0a1000 10922 mprotect(0x2ac02a0e2000, 1048576, PROT_NONE) = 0 10922 mmap(0x2ac02a1e2000, 24576, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 6, 0x41000) = 0x2ac02a1e2000 10922 close(6) = 0 10922 access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory) 10922 open("/lib/libkeyutils.so.1", O_RDONLY) = 6 10922 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 10922 fstat(6, {st_mode=S_IFREG|0644, st_size=7304, ...}) = 0 10922 mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x2ac02a1e8000 10922 mmap(NULL, 1054160, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 6, 0) = 0x2ac02a1e9000 10922 mprotect(0x2ac02a1eb000, 1044480, PROT_NONE) = 0 10922 mmap(0x2ac02a2ea000, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 6, 0x1000) = 0x2ac02a2ea000 10922 close(6) = 0 10922 mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x2ac02a2eb000 10922 mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x2ac02a2ec000 10922 arch_prctl(ARCH_SET_FS, 0x2ac02a2ebf10) = 0 10922 mprotect(0x2ac029157000, 12288, PROT_READ) = 0 10922 munmap(0x2ac028781000, 70263) = 0 10922 brk(0) = 0x6f7000 10922 brk(0x718000) = 0x718000 10922 getcwd("/opt/packrat/playpen/public/in-place/git/git.junio/t/trash", 4096) = 59 10922 access(".git/objects", X_OK) = 0 10922 access(".git/refs", X_OK) = 0 10922 lstat(".git/HEAD", {st_mode=S_IFREG|0664, st_size=23, ...}) = 0 10922 open(".git/HEAD", O_RDONLY) = 6 10922 read(6, "ref: refs/heads/master\n", 255) = 23 10922 read(6, "", 232) = 0 10922 close(6) = 0 10922 open(".git/config", O_RDONLY) = 6 10922 fstat(6, {st_mode=S_IFREG|0664, st_size=92, ...}) = 0 10922 mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x2ac028781000 10922 read(6, "[core]\n\trepositoryformatversion "..., 4096) = 92 10922 read(6, "", 4096) = 0 10922 close(6) = 0 10922 munmap(0x2ac028781000, 4096) = 0 10922 stat(".git", {st_mode=S_IFDIR|S_ISGID|0775, st_size=4096, ...}) = 0 10922 getcwd("/opt/packrat/playpen/public/in-place/git/git.junio/t/trash", 1024) = 59 10922 chdir(".git") = 0 10922 getcwd("/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git", 4096) = 64 10922 lstat("/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git", {st_mode=S_IFDIR|S_ISGID|0775, st_size=4096, ...}) = 0 10922 chdir("/opt/packrat/playpen/public/in-place/git/git.junio/t/trash") = 0 10922 chdir("/opt/packrat/playpen/public/in-place/git/git.junio/t/trash") = 0 10922 open(".git/config", O_RDONLY) = 6 10922 fstat(6, {st_mode=S_IFREG|0664, st_size=92, ...}) = 0 10922 mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x2ac028781000 10922 read(6, "[core]\n\trepositoryformatversion "..., 4096) = 92 10922 read(6, "", 4096) = 0 10922 close(6) = 0 10922 munmap(0x2ac028781000, 4096) = 0 10922 lstat("/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/HEAD", {st_mode=S_IFREG|0664, st_size=23, ...}) = 0 10922 open("/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/HEAD", O_RDONLY) = 6 10922 read(6, "ref: refs/heads/master\n", 255) = 23 10922 read(6, "", 232) = 0 10922 close(6) = 0 10922 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 10922 open("/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/refs/heads/master", O_RDONLY) = 6 10922 read(6, "1bd44cb9d13204b0fe1958db0082f502"..., 255) = 41 10922 read(6, "", 214) = 0 10922 close(6) = 0 10922 lstat("/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/refs/HEAD", 0x7fff82343bd0) = -1 ENOENT (No such file or directory) 10922 open("/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/packed-refs", O_RDONLY) = -1 ENOENT (No such file or directory) 10922 lstat("/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/refs/tags/HEAD", 0x7fff82343bd0) = -1 ENOENT (No such file or directory) 10922 lstat("/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/refs/heads/HEAD", 0x7fff82343bd0) = -1 ENOENT (No such file or directory) 10922 lstat("/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/refs/remotes/HEAD", 0x7fff82343bd0) = -1 ENOENT (No such file or directory) 10922 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) 10922 lstat("/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/MERGE_HEAD", 0x7fff82343bd0) = -1 ENOENT (No such file or directory) 10922 lstat("/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/refs/MERGE_HEAD", 0x7fff82343bd0) = -1 ENOENT (No such file or directory) 10922 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) 10922 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) 10922 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) 10922 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) 10922 open("/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/index", O_RDONLY) = 6 10922 fstat(6, {st_mode=S_IFREG|0664, st_size=104, ...}) = 0 10922 mmap(NULL, 104, PROT_READ|PROT_WRITE, MAP_PRIVATE, 6, 0) = 0x2ac028781000 10922 close(6) = 0 10922 munmap(0x2ac028781000, 104) = 0 10922 lstat("/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/MERGE_HEAD", 0x7fff82343d40) = -1 ENOENT (No such file or directory) 10922 lstat("/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/HEAD", {st_mode=S_IFREG|0664, st_size=23, ...}) = 0 10922 open("/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/HEAD", O_RDONLY) = 6 10922 read(6, "ref: refs/heads/master\n", 255) = 23 10922 read(6, "", 232) = 0 10922 close(6) = 0 10922 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 10922 open("/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/refs/heads/master", O_RDONLY) = 6 10922 read(6, "1bd44cb9d13204b0fe1958db0082f502"..., 255) = 41 10922 read(6, "", 214) = 0 10922 close(6) = 0 10922 lstat("/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/refs/HEAD", 0x7fff82343b00) = -1 ENOENT (No such file or directory) 10922 lstat("/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/refs/tags/HEAD", 0x7fff82343b00) = -1 ENOENT (No such file or directory) 10922 lstat("/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/refs/heads/HEAD", 0x7fff82343b00) = -1 ENOENT (No such file or directory) 10922 lstat("/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/refs/remotes/HEAD", 0x7fff82343b00) = -1 ENOENT (No such file or directory) 10922 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) 10922 open("/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/objects/pack", O_RDONLY|O_NONBLOCK|O_DIRECTORY) = 6 10922 fstat(6, {st_mode=S_IFDIR|S_ISGID|0775, st_size=4096, ...}) = 0 10922 fcntl(6, F_SETFD, FD_CLOEXEC) = 0 10922 getdents(6, /* 2 entries */, 4096) = 48 10922 getdents(6, /* 0 entries */, 4096) = 0 10922 close(6) = 0 10922 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) 10922 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 10922 open("/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/objects/1b/d44cb9d13204b0fe1958db0082f5028a16eb3a", O_RDONLY|O_NOATIME) = 6 10922 mmap(NULL, 136, PROT_READ, MAP_PRIVATE, 6, 0) = 0x2ac028781000 10922 close(6) = 0 10922 munmap(0x2ac028781000, 136) = 0 10922 open("/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/info/grafts", O_RDONLY) = -1 ENOENT (No such file or directory) 10922 open("/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/shallow", O_RDONLY) = -1 ENOENT (No such file or directory) 10922 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 10922 open("/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/objects/df/2b8fc99e1c1d4dbc0a854d9f72157f1d6ea078", O_RDONLY|O_NOATIME) = 6 10922 mmap(NULL, 49, PROT_READ, MAP_PRIVATE, 6, 0) = 0x2ac028781000 10922 close(6) = 0 10922 brk(0x739000) = 0x739000 10922 brk(0x736000) = 0x736000 10922 munmap(0x2ac028781000, 49) = 0 10922 open("/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/index", O_RDONLY) = 6 10922 fstat(6, {st_mode=S_IFREG|0664, st_size=104, ...}) = 0 10922 mmap(NULL, 104, PROT_READ|PROT_WRITE, MAP_PRIVATE, 6, 0) = 0x2ac028781000 10922 close(6) = 0 10922 munmap(0x2ac028781000, 104) = 0 10922 readlink("/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/index", 0x7fff82342da0, 4096) = -1 EINVAL (Invalid argument) 10922 open("/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/index.lock", O_RDWR|O_CREAT|O_EXCL, 0666) = 6 10922 rt_sigaction(SIGINT, {0x44bc70, [INT], SA_RESTORER|SA_RESTART, 0x2ac028e3b6a0}, {SIG_DFL}, 8) = 0 10922 getpid() = 10922 10922 lstat("elif", {st_mode=S_IFREG|0664, st_size=0, ...}) = 0 10922 lstat("elif", {st_mode=S_IFREG|0664, st_size=0, ...}) = 0 10922 lstat("elif", {st_mode=S_IFREG|0664, st_size=0, ...}) = 0 10922 write(6, "DIRC\0\0\0\2\0\0\0\1G\224S\267\0\0\0\0G\224S\266\0\0\0"..., 104) = 104 10922 close(6) = 0 10922 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) 10922 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 10922 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 10922 open("/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/objects/1b/d44cb9d13204b0fe1958db0082f5028a16eb3a", O_RDONLY|O_NOATIME) = 7 10922 mmap(NULL, 136, PROT_READ, MAP_PRIVATE, 7, 0) = 0x2ac028781000 10922 close(7) = 0 10922 munmap(0x2ac028781000, 136) = 0 10922 lstat("elif", {st_mode=S_IFREG|0664, st_size=0, ...}) = 0 10922 lstat("elif", {st_mode=S_IFREG|0664, st_size=0, ...}) = 0 10922 lstat("elif", {st_mode=S_IFREG|0664, st_size=0, ...}) = 0 10922 lstat("file", 0x7fff82343c90) = -1 ENOENT (No such file or directory) 10922 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 10922 close(6) = 0 10922 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) 10922 open("/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/COMMIT_EDITMSG", O_WRONLY|O_CREAT|O_TRUNC, 0666) = 6 10922 fstat(6, {st_mode=S_IFREG|0664, st_size=0, ...}) = 0 10922 mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x2ac028781000 10922 write(6, "Partial: add elif\n", 18) = 18 10922 close(6) = 0 10922 munmap(0x2ac028781000, 4096) = 0 10922 lstat("/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/HEAD", {st_mode=S_IFREG|0664, st_size=23, ...}) = 0 10922 open("/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/HEAD", O_RDONLY) = 6 10922 read(6, "ref: refs/heads/master\n", 255) = 23 10922 read(6, "", 232) = 0 10922 close(6) = 0 10922 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 10922 open("/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/refs/heads/master", O_RDONLY) = 6 10922 read(6, "1bd44cb9d13204b0fe1958db0082f502"..., 255) = 41 10922 read(6, "", 214) = 0 10922 close(6) = 0 10922 lstat("/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/refs/HEAD", 0x7fff823438b0) = -1 ENOENT (No such file or directory) 10922 lstat("/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/refs/tags/HEAD", 0x7fff823438b0) = -1 ENOENT (No such file or directory) 10922 lstat("/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/refs/heads/HEAD", 0x7fff823438b0) = -1 ENOENT (No such file or directory) 10922 lstat("/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/refs/remotes/HEAD", 0x7fff823438b0) = -1 ENOENT (No such file or directory) 10922 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) 10922 lstat("/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/HEAD", {st_mode=S_IFREG|0664, st_size=23, ...}) = 0 10922 open("/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/HEAD", O_RDONLY) = 6 10922 read(6, "ref: refs/heads/master\n", 255) = 23 10922 read(6, "", 232) = 0 10922 close(6) = 0 10922 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 10922 open("/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/refs/heads/master", O_RDONLY) = 6 10922 read(6, "1bd44cb9d13204b0fe1958db0082f502"..., 255) = 41 10922 read(6, "", 214) = 0 10922 close(6) = 0 10922 lstat("/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/refs/HEAD", 0x7fff82343800) = -1 ENOENT (No such file or directory) 10922 lstat("/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/refs/tags/HEAD", 0x7fff82343800) = -1 ENOENT (No such file or directory) 10922 lstat("/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/refs/heads/HEAD", 0x7fff82343800) = -1 ENOENT (No such file or directory) 10922 lstat("/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/refs/remotes/HEAD", 0x7fff82343800) = -1 ENOENT (No such file or directory) 10922 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) 10922 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 10922 open("/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/objects/1b/d44cb9d13204b0fe1958db0082f5028a16eb3a", O_RDONLY|O_NOATIME) = 6 10922 mmap(NULL, 136, PROT_READ, MAP_PRIVATE, 6, 0) = 0x2ac028781000 10922 close(6) = 0 10922 munmap(0x2ac028781000, 136) = 0 10922 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 10922 open("/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/objects/1b/d44cb9d13204b0fe1958db0082f5028a16eb3a", O_RDONLY|O_NOATIME) = 6 10922 mmap(NULL, 136, PROT_READ, MAP_PRIVATE, 6, 0) = 0x2ac028781000 10922 close(6) = 0 10922 munmap(0x2ac028781000, 136) = 0 10922 open("/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/next-index-10922.lock", O_RDONLY) = 6 10922 fstat(6, {st_mode=S_IFREG|0664, st_size=104, ...}) = 0 10922 mmap(NULL, 104, PROT_READ|PROT_WRITE, MAP_PRIVATE, 6, 0) = 0x2ac028781000 10922 close(6) = 0 10922 munmap(0x2ac028781000, 104) = 0 10922 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 10922 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 10922 getuid() = 1012 10922 socket(PF_FILE, SOCK_STREAM, 0) = 6 10922 fcntl(6, F_SETFL, O_RDWR|O_NONBLOCK) = 0 10922 connect(6, {sa_family=AF_FILE, path="/var/run/nscd/socket"}, 110) = -1 ENOENT (No such file or directory) 10922 close(6) = 0 10922 socket(PF_FILE, SOCK_STREAM, 0) = 6 10922 fcntl(6, F_SETFL, O_RDWR|O_NONBLOCK) = 0 10922 connect(6, {sa_family=AF_FILE, path="/var/run/nscd/socket"}, 110) = -1 ENOENT (No such file or directory) 10922 close(6) = 0 10922 open("/etc/nsswitch.conf", O_RDONLY) = 6 10922 fstat(6, {st_mode=S_IFREG|0644, st_size=465, ...}) = 0 10922 mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x2ac028781000 10922 read(6, "# /etc/nsswitch.conf\n#\n# Example"..., 4096) = 465 10922 read(6, "", 4096) = 0 10922 close(6) = 0 10922 munmap(0x2ac028781000, 4096) = 0 10922 open("/etc/ld.so.cache", O_RDONLY) = 6 10922 fstat(6, {st_mode=S_IFREG|0644, st_size=70263, ...}) = 0 10922 mmap(NULL, 70263, PROT_READ, MAP_PRIVATE, 6, 0) = 0x2ac028781000 10922 close(6) = 0 10922 access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory) 10922 open("/lib/libnss_compat.so.2", O_RDONLY) = 6 10922 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 10922 fstat(6, {st_mode=S_IFREG|0644, st_size=35632, ...}) = 0 10922 mmap(NULL, 2131176, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 6, 0) = 0x2ac02a2ed000 10922 mprotect(0x2ac02a2f4000, 2097152, PROT_NONE) = 0 10922 mmap(0x2ac02a4f4000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 6, 0x7000) = 0x2ac02a4f4000 10922 close(6) = 0 10922 access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory) 10922 open("/lib/libnsl.so.1", O_RDONLY) = 6 10922 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 10922 fstat(6, {st_mode=S_IFREG|0644, st_size=93088, ...}) = 0 10922 mmap(NULL, 2198224, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 6, 0) = 0x2ac02a4f6000 10922 mprotect(0x2ac02a50b000, 2097152, PROT_NONE) = 0 10922 mmap(0x2ac02a70b000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 6, 0x15000) = 0x2ac02a70b000 10922 mmap(0x2ac02a70d000, 6864, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x2ac02a70d000 10922 close(6) = 0 10922 munmap(0x2ac028781000, 70263) = 0 10922 open("/etc/ld.so.cache", O_RDONLY) = 6 10922 fstat(6, {st_mode=S_IFREG|0644, st_size=70263, ...}) = 0 10922 mmap(NULL, 70263, PROT_READ, MAP_PRIVATE, 6, 0) = 0x2ac028781000 10922 close(6) = 0 10922 access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory) 10922 open("/lib/libnss_nis.so.2", O_RDONLY) = 6 10922 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 10922 fstat(6, {st_mode=S_IFREG|0644, st_size=43480, ...}) = 0 10922 mmap(NULL, 2139352, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 6, 0) = 0x2ac02a70f000 10922 mprotect(0x2ac02a719000, 2093056, PROT_NONE) = 0 10922 mmap(0x2ac02a918000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 6, 0x9000) = 0x2ac02a918000 10922 close(6) = 0 10922 access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory) 10922 open("/lib/libnss_files.so.2", O_RDONLY) = 6 10922 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 10922 fstat(6, {st_mode=S_IFREG|0644, st_size=43448, ...}) = 0 10922 mmap(NULL, 2139464, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 6, 0) = 0x2ac02a91a000 10922 mprotect(0x2ac02a924000, 2093056, PROT_NONE) = 0 10922 mmap(0x2ac02ab23000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 6, 0x9000) = 0x2ac02ab23000 10922 close(6) = 0 10922 munmap(0x2ac028781000, 70263) = 0 10922 open("/etc/passwd", O_RDONLY) = 6 10922 fcntl(6, F_GETFD) = 0 10922 fcntl(6, F_SETFD, FD_CLOEXEC) = 0 10922 lseek(6, 0, SEEK_CUR) = 0 10922 fstat(6, {st_mode=S_IFREG|0644, st_size=1663, ...}) = 0 10922 mmap(NULL, 1663, PROT_READ, MAP_SHARED, 6, 0) = 0x2ac028781000 10922 lseek(6, 1663, SEEK_SET) = 1663 10922 munmap(0x2ac028781000, 1663) = 0 10922 close(6) = 0 10922 uname({sys="Linux", node="gitster", ...}) = 0 10922 open("/etc/resolv.conf", O_RDONLY) = 6 10922 fstat(6, {st_mode=S_IFREG|0644, st_size=44, ...}) = 0 10922 mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x2ac028781000 10922 read(6, "search pv.oc.cox.net\nnameserver "..., 4096) = 44 10922 read(6, "", 4096) = 0 10922 close(6) = 0 10922 munmap(0x2ac028781000, 4096) = 0 10922 stat("/etc/resolv.conf", {st_mode=S_IFREG|0644, st_size=44, ...}) = 0 10922 open("/etc/resolv.conf", O_RDONLY) = 6 10922 fstat(6, {st_mode=S_IFREG|0644, st_size=44, ...}) = 0 10922 mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x2ac028781000 10922 read(6, "search pv.oc.cox.net\nnameserver "..., 4096) = 44 10922 read(6, "", 4096) = 0 10922 close(6) = 0 10922 munmap(0x2ac028781000, 4096) = 0 10922 socket(PF_FILE, SOCK_STREAM, 0) = 6 10922 fcntl(6, F_SETFL, O_RDWR|O_NONBLOCK) = 0 10922 connect(6, {sa_family=AF_FILE, path="/var/run/nscd/socket"}, 110) = -1 ENOENT (No such file or directory) 10922 close(6) = 0 10922 socket(PF_FILE, SOCK_STREAM, 0) = 6 10922 fcntl(6, F_SETFL, O_RDWR|O_NONBLOCK) = 0 10922 connect(6, {sa_family=AF_FILE, path="/var/run/nscd/socket"}, 110) = -1 ENOENT (No such file or directory) 10922 close(6) = 0 10922 open("/etc/host.conf", O_RDONLY) = 6 10922 fstat(6, {st_mode=S_IFREG|0644, st_size=9, ...}) = 0 10922 mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x2ac028781000 10922 read(6, "multi on\n", 4096) = 9 10922 read(6, "", 4096) = 0 10922 close(6) = 0 10922 munmap(0x2ac028781000, 4096) = 0 10922 open("/etc/hosts", O_RDONLY) = 6 10922 fcntl(6, F_GETFD) = 0 10922 fcntl(6, F_SETFD, FD_CLOEXEC) = 0 10922 fstat(6, {st_mode=S_IFREG|0644, st_size=570, ...}) = 0 10922 mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x2ac028781000 10922 read(6, "127.0.0.1\tlocalhost\n#127.0.1.1\tg"..., 4096) = 570 10922 read(6, "", 4096) = 0 10922 close(6) = 0 10922 munmap(0x2ac028781000, 4096) = 0 10922 gettimeofday({1200903095, 36084}, NULL) = 0 10922 open("/usr/share/zoneinfo/UTC", O_RDONLY) = 6 10922 fstat(6, {st_mode=S_IFREG|0644, st_size=118, ...}) = 0 10922 fstat(6, {st_mode=S_IFREG|0644, st_size=118, ...}) = 0 10922 mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x2ac028781000 10922 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 10922 lseek(6, -62, SEEK_CUR) = 56 10922 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 10922 close(6) = 0 10922 munmap(0x2ac028781000, 4096) = 0 10922 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) 10922 open("/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/COMMIT_EDITMSG", O_RDONLY) = 6 10922 read(6, "Partial: add elif\n", 8192) = 18 10922 read(6, "", 12400) = 0 10922 close(6) = 0 10922 stat("/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/objects/94/5b990ce4a77ccd314fbc9b33c5959023a92714", 0x7fff82343ce0) = -1 ENOENT (No such file or directory) 10922 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) 10922 gettimeofday({1200903095, 36797}, NULL) = 0 10922 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 10922 brk(0x75c000) = 0x75c000 10922 brk(0x74c000) = 0x74c000 10922 brk(0x73c000) = 0x73c000 10922 brk(0x73b000) = 0x73b000 10922 write(6, "x\1\205\316Aj\0031\f\205\341\254}\n]\240A\322\330\31;\204"..., 176) = 176 10922 fchmod(6, 0444) = 0 10922 close(6) = 0 10922 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) 10922 mkdir("/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/objects/94", 0777) = 0 10922 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 10922 unlink("/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/objects/tmp_obj_bX9DDU") = 0 10922 lstat("/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/HEAD", {st_mode=S_IFREG|0664, st_size=23, ...}) = 0 10922 open("/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/HEAD", O_RDONLY) = 6 10922 read(6, "ref: refs/heads/master\n", 255) = 23 10922 read(6, "", 232) = 0 10922 close(6) = 0 10922 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 10922 open("/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/refs/heads/master", O_RDONLY) = 6 10922 read(6, "1bd44cb9d13204b0fe1958db0082f502"..., 255) = 41 10922 read(6, "", 214) = 0 10922 close(6) = 0 10922 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 10922 stat("/opt", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0 10922 stat("/opt/packrat", {st_mode=S_IFDIR|S_ISGID|0775, st_size=4096, ...}) = 0 10922 stat("/opt/packrat/playpen", {st_mode=S_IFDIR|S_ISGID|0775, st_size=4096, ...}) = 0 10922 stat("/opt/packrat/playpen/public", {st_mode=S_IFDIR|S_ISGID|0755, st_size=4096, ...}) = 0 10922 stat("/opt/packrat/playpen/public/in-place", {st_mode=S_IFDIR|S_ISGID|0755, st_size=4096, ...}) = 0 10922 stat("/opt/packrat/playpen/public/in-place/git", {st_mode=S_IFDIR|S_ISGID|0775, st_size=4096, ...}) = 0 10922 stat("/opt/packrat/playpen/public/in-place/git/git.junio", {st_mode=S_IFDIR|S_ISGID|0775, st_size=98304, ...}) = 0 10922 stat("/opt/packrat/playpen/public/in-place/git/git.junio/t", {st_mode=S_IFDIR|S_ISGID|0775, st_size=8192, ...}) = 0 10922 stat("/opt/packrat/playpen/public/in-place/git/git.junio/t/trash", {st_mode=S_IFDIR|S_ISGID|0775, st_size=4096, ...}) = 0 10922 stat("/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git", {st_mode=S_IFDIR|S_ISGID|0775, st_size=4096, ...}) = 0 10922 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 10922 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 10922 readlink("/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/refs/heads/master", 0x7fff82342d80, 4096) = -1 EINVAL (Invalid argument) 10922 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 10922 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 10922 open("/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/refs/heads/master", O_RDONLY) = 7 10922 read(7, "1bd44cb9d13204b0fe1958db0082f502"..., 255) = 41 10922 read(7, "", 214) = 0 10922 close(7) = 0 10922 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 10922 open("/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/objects/94/5b990ce4a77ccd314fbc9b33c5959023a92714", O_RDONLY|O_NOATIME) = 7 10922 mmap(NULL, 176, PROT_READ, MAP_PRIVATE, 7, 0) = 0x2ac028781000 10922 close(7) = 0 10922 munmap(0x2ac028781000, 176) = 0 10922 write(6, "945b990ce4a77ccd314fbc9b33c59590"..., 40) = 40 10922 write(6, "\n", 1) = 1 10922 close(6) = 0 10922 stat("/opt", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0 10922 stat("/opt/packrat", {st_mode=S_IFDIR|S_ISGID|0775, st_size=4096, ...}) = 0 10922 stat("/opt/packrat/playpen", {st_mode=S_IFDIR|S_ISGID|0775, st_size=4096, ...}) = 0 10922 stat("/opt/packrat/playpen/public", {st_mode=S_IFDIR|S_ISGID|0755, st_size=4096, ...}) = 0 10922 stat("/opt/packrat/playpen/public/in-place", {st_mode=S_IFDIR|S_ISGID|0755, st_size=4096, ...}) = 0 10922 stat("/opt/packrat/playpen/public/in-place/git", {st_mode=S_IFDIR|S_ISGID|0775, st_size=4096, ...}) = 0 10922 stat("/opt/packrat/playpen/public/in-place/git/git.junio", {st_mode=S_IFDIR|S_ISGID|0775, st_size=98304, ...}) = 0 10922 stat("/opt/packrat/playpen/public/in-place/git/git.junio/t", {st_mode=S_IFDIR|S_ISGID|0775, st_size=8192, ...}) = 0 10922 stat("/opt/packrat/playpen/public/in-place/git/git.junio/t/trash", {st_mode=S_IFDIR|S_ISGID|0775, st_size=4096, ...}) = 0 10922 stat("/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git", {st_mode=S_IFDIR|S_ISGID|0775, st_size=4096, ...}) = 0 10922 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 10922 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 10922 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 10922 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 10922 write(6, "1bd44cb9d13204b0fe1958db0082f502"..., 160) = 160 10922 close(6) = 0 10922 stat("/opt", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0 10922 stat("/opt/packrat", {st_mode=S_IFDIR|S_ISGID|0775, st_size=4096, ...}) = 0 10922 stat("/opt/packrat/playpen", {st_mode=S_IFDIR|S_ISGID|0775, st_size=4096, ...}) = 0 10922 stat("/opt/packrat/playpen/public", {st_mode=S_IFDIR|S_ISGID|0755, st_size=4096, ...}) = 0 10922 stat("/opt/packrat/playpen/public/in-place", {st_mode=S_IFDIR|S_ISGID|0755, st_size=4096, ...}) = 0 10922 stat("/opt/packrat/playpen/public/in-place/git", {st_mode=S_IFDIR|S_ISGID|0775, st_size=4096, ...}) = 0 10922 stat("/opt/packrat/playpen/public/in-place/git/git.junio", {st_mode=S_IFDIR|S_ISGID|0775, st_size=98304, ...}) = 0 10922 stat("/opt/packrat/playpen/public/in-place/git/git.junio/t", {st_mode=S_IFDIR|S_ISGID|0775, st_size=8192, ...}) = 0 10922 stat("/opt/packrat/playpen/public/in-place/git/git.junio/t/trash", {st_mode=S_IFDIR|S_ISGID|0775, st_size=4096, ...}) = 0 10922 stat("/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git", {st_mode=S_IFDIR|S_ISGID|0775, st_size=4096, ...}) = 0 10922 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 10922 open("/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/logs/HEAD", O_WRONLY|O_APPEND|O_CREAT, 0666) = 6 10922 write(6, "1bd44cb9d13204b0fe1958db0082f502"..., 160) = 160 10922 close(6) = 0 10922 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 10922 unlink("/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/MERGE_HEAD") = -1 ENOENT (No such file or directory) 10922 unlink("/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/MERGE_MSG") = -1 ENOENT (No such file or directory) 10922 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 10922 unlink("/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/next-index-10922.lock") = 0 10922 open(".git/config", O_RDONLY) = 6 10922 fstat(6, {st_mode=S_IFREG|0664, st_size=92, ...}) = 0 10922 mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x2ac028781000 10922 read(6, "[core]\n\trepositoryformatversion "..., 4096) = 92 10922 read(6, "", 4096) = 0 10922 close(6) = 0 10922 munmap(0x2ac028781000, 4096) = 0 10922 stat("/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/rr-cache", 0x7fff82343da0) = -1 ENOENT (No such file or directory) 10922 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) 10922 fstat(1, {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 6), ...}) = 0 10922 mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x2ac028781000 10922 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 10922 open("/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/objects/1b/d44cb9d13204b0fe1958db0082f5028a16eb3a", O_RDONLY|O_NOATIME) = 6 10922 mmap(NULL, 136, PROT_READ, MAP_PRIVATE, 6, 0) = 0x2ac028782000 10922 close(6) = 0 10922 munmap(0x2ac028782000, 136) = 0 10922 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 10922 open("/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/objects/df/2b8fc99e1c1d4dbc0a854d9f72157f1d6ea078", O_RDONLY|O_NOATIME) = 6 10922 mmap(NULL, 49, PROT_READ, MAP_PRIVATE, 6, 0) = 0x2ac028782000 10922 close(6) = 0 10922 munmap(0x2ac028782000, 49) = 0 10922 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 10922 open("/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/objects/94/5b990ce4a77ccd314fbc9b33c5959023a92714", O_RDONLY|O_NOATIME) = 6 10922 mmap(NULL, 176, PROT_READ, MAP_PRIVATE, 6, 0) = 0x2ac028782000 10922 close(6) = 0 10922 munmap(0x2ac028782000, 176) = 0 10922 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 10922 open("/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/objects/df/2b8fc99e1c1d4dbc0a854d9f72157f1d6ea078", O_RDONLY|O_NOATIME) = 6 10922 mmap(NULL, 49, PROT_READ, MAP_PRIVATE, 6, 0) = 0x2ac028782000 10922 close(6) = 0 10922 munmap(0x2ac028782000, 49) = 0 10922 fstat(1, {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 6), ...}) = 0 10922 write(1, "Created commit ", 15) = 15 10922 open("/opt/packrat/playpen/public/in-place/git/git.junio/t/trash/.git/objects/94/", O_RDONLY|O_NONBLOCK|O_DIRECTORY) = 6 10922 fstat(6, {st_mode=S_IFDIR|S_ISGID|0775, st_size=4096, ...}) = 0 10922 fcntl(6, F_SETFD, FD_CLOEXEC) = 0 10922 getdents(6, /* 3 entries */, 4096) = 112 10922 getdents(6, /* 0 entries */, 4096) = 0 10922 close(6) = 0 10922 write(1, "945b990: Partial: add elif\n", 27) = 27 10922 fstat(1, {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 6), ...}) = 0 10922 close(1) = 0 10922 munmap(0x2ac028781000, 4096) = 0 10922 exit_group(0) = ? ^ permalink raw reply [flat|nested] 134+ messages in thread
* [PATCH 1/2] read-cache.c: introduce is_racy_timestamp() helper 2008-01-21 8:32 ` Junio C Hamano @ 2008-01-21 8:44 ` Junio C Hamano 2008-01-21 8:46 ` [PATCH 2/2] read-cache.c: fix timestamp comparison Junio C Hamano 1 sibling, 0 replies; 134+ messages in thread From: Junio C Hamano @ 2008-01-21 8:44 UTC (permalink / raw) To: Linus Torvalds; +Cc: git This just moves a common boolean expression into a helper function. Signed-off-by: Junio C Hamano <gitster@pobox.com> --- read-cache.c | 13 ++++++++----- 1 files changed, 8 insertions(+), 5 deletions(-) diff --git a/read-cache.c b/read-cache.c index f5f9c3d..9554896 100644 --- a/read-cache.c +++ b/read-cache.c @@ -177,6 +177,12 @@ static int ce_match_stat_basic(struct cache_entry *ce, struct stat *st) return changed; } +static int is_racy_timestamp(struct index_state *istate, struct cache_entry *ce) +{ + return (istate->timestamp && + istate->timestamp <= ce->ce_mtime); +} + int ie_match_stat(struct index_state *istate, struct cache_entry *ce, struct stat *st, unsigned int options) @@ -210,9 +216,7 @@ int ie_match_stat(struct index_state *istate, * whose mtime are the same as the index file timestamp more * carefully than others. */ - if (!changed && - istate->timestamp && - istate->timestamp <= ce->ce_mtime) { + if (!changed && is_racy_timestamp(istate, ce)) { if (assume_racy_is_modified) changed |= DATA_CHANGED; else @@ -1207,8 +1211,7 @@ int write_index(struct index_state *istate, int newfd) struct cache_entry *ce = cache[i]; if (ce->ce_flags & CE_REMOVE) continue; - if (istate->timestamp && - istate->timestamp <= ce->ce_mtime) + if (is_racy_timestamp(istate, ce)) ce_smudge_racily_clean_entry(ce); if (ce_write_entry(&c, newfd, ce) < 0) return -1; -- 1.5.4.rc4.5.g36a1 ^ permalink raw reply related [flat|nested] 134+ messages in thread
* [PATCH 2/2] read-cache.c: fix timestamp comparison 2008-01-21 8:32 ` Junio C Hamano 2008-01-21 8:44 ` [PATCH 1/2] read-cache.c: introduce is_racy_timestamp() helper Junio C Hamano @ 2008-01-21 8:46 ` Junio C Hamano 2008-01-21 18:47 ` Linus Torvalds 1 sibling, 1 reply; 134+ messages in thread From: Junio C Hamano @ 2008-01-21 8:46 UTC (permalink / raw) To: Linus Torvalds; +Cc: git The mtime recorded in the cache entry is not time_t anymore but of type (unsigned int). This casts the comparison and also adds fuzz factor of 1 second. Signed-off-by: Junio C Hamano <gitster@pobox.com> --- * With these two patches the t7501 Heisenbug seems to go away. I do not understand why this fuzz factor of 1 second helps, but it apparently does. I do not want to commit this before I understand why, but it is past my bedtime. read-cache.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/read-cache.c b/read-cache.c index 9554896..745c3fe 100644 --- a/read-cache.c +++ b/read-cache.c @@ -180,7 +180,7 @@ static int ce_match_stat_basic(struct cache_entry *ce, struct stat *st) static int is_racy_timestamp(struct index_state *istate, struct cache_entry *ce) { return (istate->timestamp && - istate->timestamp <= ce->ce_mtime); + ((unsigned int) istate->timestamp) <= ce->ce_mtime + 1); } int ie_match_stat(struct index_state *istate, -- 1.5.4.rc4.5.g36a1 ^ permalink raw reply related [flat|nested] 134+ messages in thread
* Re: [PATCH 2/2] read-cache.c: fix timestamp comparison 2008-01-21 8:46 ` [PATCH 2/2] read-cache.c: fix timestamp comparison Junio C Hamano @ 2008-01-21 18:47 ` Linus Torvalds 2008-01-21 19:06 ` Johannes Schindelin 2008-01-21 19:09 ` Linus Torvalds 0 siblings, 2 replies; 134+ messages in thread From: Linus Torvalds @ 2008-01-21 18:47 UTC (permalink / raw) To: Junio C Hamano; +Cc: git On Mon, 21 Jan 2008, Junio C Hamano wrote: > > The mtime recorded in the cache entry is not time_t anymore but > of type (unsigned int). This casts the comparison and also adds > fuzz factor of 1 second. I really don't think this is the right fix. The real problem seems to be that the whole "racy_timestamp()" thing *hides* the bug, and your change actually makes racy_timestamp() just hide things even more (by making it trigger all the time). Adding a "sleep 1" to your test-case (appended) actually makes it fail reliably (without your hack - with your "+1" hack I assume you'd need to make the sleep longer). So the problem is that the test-suite actually *hid* the bug by doing thigns so fast that the racy code triggered, and that in turn somehow fixed things up. Will experiment more now that I have a case that reliably fails. The commit that causes this literally shouldn't have caused any semantic changes at all, so this is rather interesting. Linus --- #!/bin/sh test_description='reduced 7501' . ./test-lib.sh test_expect_success setup ' >file && git add file && test_tick && git commit -m initial ' if test -f ../trace.log then mv ../trace.log ../trace.log.old fi test_expect_success 'partial commit that involves removal (1)' ' test_tick && git rm --cached file && mv file elif && sleep 1 && git add elif && sleep 1 && strace -v -o ../trace.log git commit -m "Partial: add elif" elif && git diff-tree --name-status HEAD^ HEAD >current && echo "A elif" >expected && diff expected current ' test_done ^ permalink raw reply [flat|nested] 134+ messages in thread
* Re: [PATCH 2/2] read-cache.c: fix timestamp comparison 2008-01-21 18:47 ` Linus Torvalds @ 2008-01-21 19:06 ` Johannes Schindelin 2008-01-21 19:09 ` Linus Torvalds 1 sibling, 0 replies; 134+ messages in thread From: Johannes Schindelin @ 2008-01-21 19:06 UTC (permalink / raw) To: Linus Torvalds; +Cc: Junio C Hamano, git Hi, On Mon, 21 Jan 2008, Linus Torvalds wrote: > On Mon, 21 Jan 2008, Junio C Hamano wrote: > > > > The mtime recorded in the cache entry is not time_t anymore but of > > type (unsigned int). This casts the comparison and also adds fuzz > > factor of 1 second. > > I really don't think this is the right fix. Junio, have you tried Hannes' fix (using ln instead of cp -p)? I would not be surprised if the same happened on Linux as on Windows, only much rarer, since Linux is so darned fast... Ciao, Dscho ^ permalink raw reply [flat|nested] 134+ messages in thread
* Re: [PATCH 2/2] read-cache.c: fix timestamp comparison 2008-01-21 18:47 ` Linus Torvalds 2008-01-21 19:06 ` Johannes Schindelin @ 2008-01-21 19:09 ` Linus Torvalds 2008-01-21 19:24 ` Linus Torvalds 1 sibling, 1 reply; 134+ messages in thread From: Linus Torvalds @ 2008-01-21 19:09 UTC (permalink / raw) To: Junio C Hamano; +Cc: git On Mon, 21 Jan 2008, Linus Torvalds wrote: > > Will experiment more now that I have a case that reliably fails. The > commit that causes this literally shouldn't have caused any semantic > changes at all, so this is rather interesting. Intriguing. It's the "ce_mode" -> CE_REMOVE changes that trigger this bug. The problem goes away with this one-liner. I haven't figured out *why*, yet, but the reason I checked CE_REMOVE was that it was the only part that wasn't just a pure network order change. I suspect we have some code-path that didn't check for explicit removal, but that happened to check for "mode doesn't match", so clearing ce_mode just magically triggered it. Still looking. Linus --- diff --git a/unpack-trees.c b/unpack-trees.c index ff46fd6..d6fcf60 100644 --- a/unpack-trees.c +++ b/unpack-trees.c @@ -613,6 +613,7 @@ static int deleted_entry(struct cache_entry *ce, struct cache_entry *old, else verify_absent(ce, "removed", o); ce->ce_flags |= CE_REMOVE; + ce->ce_mode = 0; add_cache_entry(ce, ADD_CACHE_OK_TO_ADD|ADD_CACHE_OK_TO_REPLACE); invalidate_ce_path(ce); return 1; ^ permalink raw reply related [flat|nested] 134+ messages in thread
* Re: [PATCH 2/2] read-cache.c: fix timestamp comparison 2008-01-21 19:09 ` Linus Torvalds @ 2008-01-21 19:24 ` Linus Torvalds 2008-01-21 19:26 ` Johannes Schindelin 2008-01-21 20:38 ` Junio C Hamano 0 siblings, 2 replies; 134+ messages in thread From: Linus Torvalds @ 2008-01-21 19:24 UTC (permalink / raw) To: Junio C Hamano; +Cc: git On Mon, 21 Jan 2008, Linus Torvalds wrote: > > Still looking. Damn. The comment that I also moved says it all. I'd forgotten about that really ugly special case. It's no longer ugly, but missing that part of the ce_mode handling cleanup certainly explains the test-suite failing. Linus --- read-cache.c | 6 ++++-- 1 files changed, 4 insertions(+), 2 deletions(-) diff --git a/read-cache.c b/read-cache.c index f5f9c3d..58a9b95 100644 --- a/read-cache.c +++ b/read-cache.c @@ -124,6 +124,9 @@ static int ce_match_stat_basic(struct cache_entry *ce, struct stat *st) { unsigned int changed = 0; + if (ce->ce_flags & CE_REMOVE) + return MODE_CHANGED | DATA_CHANGED | TYPE_CHANGED; + switch (ce->ce_mode & S_IFMT) { case S_IFREG: changed |= !S_ISREG(st->st_mode) ? TYPE_CHANGED : 0; @@ -145,8 +149,6 @@ static int ce_match_stat_basic(struct cache_entry *ce, struct stat *st) else if (ce_compare_gitlink(ce)) changed |= DATA_CHANGED; return changed; - case 0: /* Special case: unmerged file in index */ - return MODE_CHANGED | DATA_CHANGED | TYPE_CHANGED; default: die("internal error: ce_mode is %o", ce->ce_mode); } ^ permalink raw reply related [flat|nested] 134+ messages in thread
* Re: [PATCH 2/2] read-cache.c: fix timestamp comparison 2008-01-21 19:24 ` Linus Torvalds @ 2008-01-21 19:26 ` Johannes Schindelin 2008-01-21 19:47 ` Linus Torvalds 2008-01-21 20:38 ` Junio C Hamano 1 sibling, 1 reply; 134+ messages in thread From: Johannes Schindelin @ 2008-01-21 19:26 UTC (permalink / raw) To: Linus Torvalds; +Cc: Junio C Hamano, git Hi, On Mon, 21 Jan 2008, Linus Torvalds wrote: > diff --git a/read-cache.c b/read-cache.c > index f5f9c3d..58a9b95 100644 > --- a/read-cache.c > +++ b/read-cache.c > @@ -124,6 +124,9 @@ static int ce_match_stat_basic(struct cache_entry *ce, struct stat *st) > { > unsigned int changed = 0; > > + if (ce->ce_flags & CE_REMOVE) > + return MODE_CHANGED | DATA_CHANGED | TYPE_CHANGED; > + > switch (ce->ce_mode & S_IFMT) { > case S_IFREG: > changed |= !S_ISREG(st->st_mode) ? TYPE_CHANGED : 0; > @@ -145,8 +149,6 @@ static int ce_match_stat_basic(struct cache_entry *ce, struct stat *st) > else if (ce_compare_gitlink(ce)) > changed |= DATA_CHANGED; > return changed; > - case 0: /* Special case: unmerged file in index */ > - return MODE_CHANGED | DATA_CHANGED | TYPE_CHANGED; Not that I understand what is _really_ going on, but shouldn't the comment be actually moved, not be deleted? Ciao, Dscho ^ permalink raw reply [flat|nested] 134+ messages in thread
* Re: [PATCH 2/2] read-cache.c: fix timestamp comparison 2008-01-21 19:26 ` Johannes Schindelin @ 2008-01-21 19:47 ` Linus Torvalds 0 siblings, 0 replies; 134+ messages in thread From: Linus Torvalds @ 2008-01-21 19:47 UTC (permalink / raw) To: Johannes Schindelin; +Cc: Junio C Hamano, git On Mon, 21 Jan 2008, Johannes Schindelin wrote: > > Not that I understand what is _really_ going on, but shouldn't the comment > be actually moved, not be deleted? Well, the thing is, it's not a special case any more, and you can now see the code, and say "that's obviously correct". The whole point of that function is to compare a index entry with the stat information, and it does that by validating it in special ways. It used to be that the "ce_mode = 0" was a special case. Now it isn't. A deleted entry can obviously never match an entry that is still on disk (regardless of *any* other issues). So now the if (ce->ce_flags & CE_REMOVE) return MODE_CHANGED | DATA_CHANGED | TYPE_CHANGED; statement is in no way a special case - rather the reverse, it's a lot more obvious than testing for inode ownership changes etc. So I removed the comment, because it doesn't make sense any more. Of course, I could have - instead of deleting it - changed it from "Special case: .." to something like "A deleted index entry doesn't match any on-disk file", but does that actually add any information to the above two lines? Sure, we can comment things, but shouldn't we comment the ones that are subtle or odd, rather than the obvious ones? This was why the CE_REMOVE bit was done in the first place: to remove the rather special case of ce_mode being zero meaning something special. Linus ^ permalink raw reply [flat|nested] 134+ messages in thread
* Re: [PATCH 2/2] read-cache.c: fix timestamp comparison 2008-01-21 19:24 ` Linus Torvalds 2008-01-21 19:26 ` Johannes Schindelin @ 2008-01-21 20:38 ` Junio C Hamano 2008-01-21 21:22 ` Linus Torvalds 1 sibling, 1 reply; 134+ messages in thread From: Junio C Hamano @ 2008-01-21 20:38 UTC (permalink / raw) To: Linus Torvalds; +Cc: git Linus Torvalds <torvalds@linux-foundation.org> writes: > On Mon, 21 Jan 2008, Linus Torvalds wrote: >> >> Still looking. > > Damn. > > The comment that I also moved says it all. > > I'd forgotten about that really ugly special case. It's no longer ugly, > but missing that part of the ce_mode handling cleanup certainly explains > the test-suite failing. Very good catch. ^ permalink raw reply [flat|nested] 134+ messages in thread
* Re: [PATCH 2/2] read-cache.c: fix timestamp comparison 2008-01-21 20:38 ` Junio C Hamano @ 2008-01-21 21:22 ` Linus Torvalds 2008-01-21 22:02 ` Junio C Hamano ` (2 more replies) 0 siblings, 3 replies; 134+ messages in thread From: Linus Torvalds @ 2008-01-21 21:22 UTC (permalink / raw) To: Junio C Hamano; +Cc: git On Mon, 21 Jan 2008, Junio C Hamano wrote: > > > > I'd forgotten about that really ugly special case. It's no longer ugly, > > but missing that part of the ce_mode handling cleanup certainly explains > > the test-suite failing. > > Very good catch. The stupid thing is that I literally _grepped_ for the code testing "ce_mode". I had missed that one because I had looked for things like if ([!].*ce_mode) but that switch statement meant that the comparison to zero was non-local and my grep didn't see it. And while the test-suite did have a test for this, it was hidden by the racy index logic.. Unlucky. Anyway, I've created a rebased tree with the commits fixed (and some whitespace fixes too), so that it should hopefully all be bisect-clean etc. [ To clarify: it's both rebased to the current git 'master' (which is currently -rc4) _and_ it has the commits fixed up. So I also squashed the "-m" flag fix into the commit that made diff-index use unpack_trees, etc, so that none of the commits should be introducing bugs that get fixed later. I also cleaned up some of the commit messages, particularly the one about using unpack_trees() (which was talking about "take 2" of lstat reduction - true, but not very descriptive of what it actually did) ] It's in the same place: branch 'new-lstat' at git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/git.git new-lstat and I'll continue to maintain it if only because it's what I use myself (until I just switch to 'next' or something). Linus ^ permalink raw reply [flat|nested] 134+ messages in thread
* Re: [PATCH 2/2] read-cache.c: fix timestamp comparison 2008-01-21 21:22 ` Linus Torvalds @ 2008-01-21 22:02 ` Junio C Hamano 2008-01-22 9:47 ` Junio C Hamano 2008-01-22 22:00 ` Linus Torvalds 2 siblings, 0 replies; 134+ messages in thread From: Junio C Hamano @ 2008-01-21 22:02 UTC (permalink / raw) To: Linus Torvalds; +Cc: git Linus Torvalds <torvalds@linux-foundation.org> writes: > It's in the same place: branch 'new-lstat' at > > git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/git.git new-lstat > > and I'll continue to maintain it if only because it's what I use myself > (until I just switch to 'next' or something). I'll find time to replace lt/in-core-index branch that is currently in 'pu' with it, hopefully sometime tonight. Mine has these two idiotic stuff you commented on. ^ permalink raw reply [flat|nested] 134+ messages in thread
* Re: [PATCH 2/2] read-cache.c: fix timestamp comparison 2008-01-21 21:22 ` Linus Torvalds 2008-01-21 22:02 ` Junio C Hamano @ 2008-01-22 9:47 ` Junio C Hamano 2008-01-22 17:25 ` Linus Torvalds 2008-01-22 22:00 ` Linus Torvalds 2 siblings, 1 reply; 134+ messages in thread From: Junio C Hamano @ 2008-01-22 9:47 UTC (permalink / raw) To: Linus Torvalds; +Cc: git Linus Torvalds <torvalds@linux-foundation.org> writes: > The stupid thing is that I literally _grepped_ for the code testing > "ce_mode". > > I had missed that one because I had looked for things like > > if ([!].*ce_mode) > > but that switch statement meant that the comparison to zero was > non-local and my grep didn't see it. Would a patch to sparse help you in cases like this? ^ permalink raw reply [flat|nested] 134+ messages in thread
* Re: [PATCH 2/2] read-cache.c: fix timestamp comparison 2008-01-22 9:47 ` Junio C Hamano @ 2008-01-22 17:25 ` Linus Torvalds 0 siblings, 0 replies; 134+ messages in thread From: Linus Torvalds @ 2008-01-22 17:25 UTC (permalink / raw) To: Junio C Hamano; +Cc: git On Tue, 22 Jan 2008, Junio C Hamano wrote: > Linus Torvalds <torvalds@linux-foundation.org> writes: > > > The stupid thing is that I literally _grepped_ for the code testing > > "ce_mode". > > > > I had missed that one because I had looked for things like > > > > if ([!].*ce_mode) > > > > but that switch statement meant that the comparison to zero was > > non-local and my grep didn't see it. > > Would a patch to sparse help you in cases like this? Heh. Sparse can do anything, but some things are more specialized than others. In this case, I could possibly have added a type modifier that says "don't compare against zero", and that kind of thing may even make sense (ie you can mark pointers that are known not to be NULL), and yes, it would have caught this. But sparse right now doesn't have that kind of flag (the "safe expression" thing comes pretty close). So yes, sparse could do things like this, but it's generally a fair amount of work to add specialized sparse rules. Linus ^ permalink raw reply [flat|nested] 134+ messages in thread
* Re: [PATCH 2/2] read-cache.c: fix timestamp comparison 2008-01-21 21:22 ` Linus Torvalds 2008-01-21 22:02 ` Junio C Hamano 2008-01-22 9:47 ` Junio C Hamano @ 2008-01-22 22:00 ` Linus Torvalds 2008-01-23 3:34 ` Junio C Hamano 2 siblings, 1 reply; 134+ messages in thread From: Linus Torvalds @ 2008-01-22 22:00 UTC (permalink / raw) To: Junio C Hamano; +Cc: git On Mon, 21 Jan 2008, Linus Torvalds wrote: > On Mon, 21 Jan 2008, Junio C Hamano wrote: > > > > Very good catch. > > The stupid thing is that I literally _grepped_ for the code testing > "ce_mode". > > I had missed that one because I had looked for things like > > if ([!].*ce_mode) > > but that switch statement meant that the comparison to zero was > non-local and my grep didn't see it. And while the test-suite did have a > test for this, it was hidden by the racy index logic.. Unlucky. Ok, having looked a bit more, I found another two cases that my grep had missed. They were regular if-statements, just more complex than my stupid grep pattern had taken into account. Both are in read-cache.c: read-cache.c: if (stage || istate->cache[pos]->ce_mode) { read-cache.c: if (ce_stage(p) == stage && (stage || p->ce_mode)) and I'd send a patch, except my tree right now is in pretty bad shape because I'm also trying to see if I can add a name hash to the index. Anyway, the "xyzzy->ce_mode" check should in both cases become a "!(xyzzy->ce_flags & CE_REMOVE)" instead. And we obviously don't seem to have any tests for this situation (I think they are both D/F conflicts with the file having been marked removed by an earlier phase, so they'd be some really odd kind of merge or something). Linus ^ permalink raw reply [flat|nested] 134+ messages in thread
* Re: [PATCH 2/2] read-cache.c: fix timestamp comparison 2008-01-22 22:00 ` Linus Torvalds @ 2008-01-23 3:34 ` Junio C Hamano 2008-01-23 3:53 ` Linus Torvalds 0 siblings, 1 reply; 134+ messages in thread From: Junio C Hamano @ 2008-01-23 3:34 UTC (permalink / raw) To: Linus Torvalds; +Cc: git Linus Torvalds <torvalds@linux-foundation.org> writes: > Ok, having looked a bit more, I found another two cases that my grep had > missed. They were regular if-statements, just more complex than my stupid > grep pattern had taken into account. > > Both are in read-cache.c: > > read-cache.c: if (stage || istate->cache[pos]->ce_mode) { > read-cache.c: if (ce_stage(p) == stage && (stage || p->ce_mode)) > > and I'd send a patch, except my tree right now is in pretty bad shape > because I'm also trying to see if I can add a name hash to the index. -- >8 -- read-cache.c: fix a couple more CE_REMOVE conversion It is a D/F conflict if you want to add "foo/bar" to the index when "foo" already exists. Also it is a conflict if you want to add a file "foo" when "foo/bar" exists. An exception is when the existing entry is there only to mark "I used to be here but I am being removed". This is needed for operations such as "git read-tree -m -u" that update the index and then reflect the result to the work tree --- we need to remember what to remove somewhere, and we use the index for that. In such a case, an existing file "foo" is being removed and we can create "foo/" directory and hang "bar" underneath it without any conflict. We used to use (ce->ce_mode == 0) to mark an entry that is being removed, but (CE_REMOVE & ce->ce_flags) is used for that purpose these days. An earlier commit forgot to convert the logic in the code that checks D/F conflict condition. The old code knew that "to be removed" entries cannot be at higher stage and actively checked that condition, but it was an unnecessary check. This patch removes the extra check as well. Signed-off-by: Junio C Hamano <gitster@pobox.com> --- read-cache.c | 7 ++++--- 1 files changed, 4 insertions(+), 3 deletions(-) diff --git a/read-cache.c b/read-cache.c index 8ba8f0f..8f5d02a 100644 --- a/read-cache.c +++ b/read-cache.c @@ -615,7 +615,7 @@ static int has_dir_name(struct index_state *istate, * it is Ok to have a directory at the same * path. */ - if (stage || istate->cache[pos]->ce_mode) { + if (!(istate->cache[pos]->ce_flags & CE_REMOVE)) { retval = -1; if (!ok_to_replace) break; @@ -637,8 +637,9 @@ static int has_dir_name(struct index_state *istate, (p->name[len] != '/') || memcmp(p->name, name, len)) break; /* not our subdirectory */ - if (ce_stage(p) == stage && (stage || p->ce_mode)) - /* p is at the same stage as our entry, and + if (ce_stage(p) == stage && !(p->ce_flags & CE_REMOVE)) + /* + * p is at the same stage as our entry, and * is a subdirectory of what we are looking * at, so we cannot have conflicts at our * level or anything shorter. ^ permalink raw reply related [flat|nested] 134+ messages in thread
* Re: [PATCH 2/2] read-cache.c: fix timestamp comparison 2008-01-23 3:34 ` Junio C Hamano @ 2008-01-23 3:53 ` Linus Torvalds 0 siblings, 0 replies; 134+ messages in thread From: Linus Torvalds @ 2008-01-23 3:53 UTC (permalink / raw) To: Junio C Hamano; +Cc: git On Tue, 22 Jan 2008, Junio C Hamano wrote: > > read-cache.c: fix a couple more CE_REMOVE conversion Acked-by: Linus Torvalds <torvalds@linux-foundation.org> Linus ^ permalink raw reply [flat|nested] 134+ messages in thread
* Re: What's not in 'master', and likely not to be in, until 1.5.4 2008-01-21 7:02 ` Junio C Hamano 2008-01-21 7:10 ` Junio C Hamano @ 2008-01-21 8:29 ` Johannes Sixt 1 sibling, 0 replies; 134+ messages in thread From: Johannes Sixt @ 2008-01-21 8:29 UTC (permalink / raw) To: Junio C Hamano; +Cc: Linus Torvalds, git Junio C Hamano schrieb: > Junio C Hamano <gitster@pobox.com> writes: > >> It's a Heisenbug. I actually merged it to 'next' but rewound it >> before pushing the result out after seeing a breakage. >> >> "make clean test" to run everything through sometimes fails and >> immediately after that when I do "cd t && sh t75??-???.sh -i -v" >> it happily runs through the end. >> >> I'll be back with more details when I have some. > > In t7501-commit.sh, "partial commit that involves removal (1)" > test, it _sometimes_ fails. > > test_expect_success 'partial commit that involves removal (1)' ' > > git rm --cached file && > mv file elif && > git add elif && > git diff-index --name-status HEAD >changes && > git commit -m "Partial: add elif" elif && > git diff-tree --name-status HEAD^ HEAD >current && > echo "A elif" >expected && > diff expected current > > ' > > It removes "file" from the index, adds "elif" to the index, and > tries to commit _only_ the addition of "elif" without recording > the removal of "file" (I added "diff-index" above to see where > it fails, its presense or absense does not change the bug, and > it shows that both addition of elif and removal of file are in > the index). > > When the test fails, the resulting commit however does not > record the addition of elif. The commit records the same tree > as its parent instead. The index that is left has "elif" but > not "file" (iow, it records the expected state after such a > partial commit). Déjà-vu! We had similar problems on Windows. I was able to solve it this way when git-commit was still a shell script: save_index () { - cp -p "$THIS_INDEX" "$NEXT_INDEX" + ln "$THIS_INDEX" "$NEXT_INDEX" } because 'cp -p' does not keep the precise timestamp, but 'ln' does (which creates hardlinks on NTFS). This violated the assumptions on which the racy-git check relies. -- Hannes ^ permalink raw reply [flat|nested] 134+ messages in thread
* Re: What's not in 'master', and likely not to be in, until 1.5.4 2008-01-21 2:37 ` What's not in 'master', and likely not to be in, " Junio C Hamano 2008-01-21 5:21 ` Linus Torvalds @ 2008-01-21 5:35 ` Daniel Barkalow 2008-01-21 8:11 ` Marco Costalba 2 siblings, 0 replies; 134+ messages in thread From: Daniel Barkalow @ 2008-01-21 5:35 UTC (permalink / raw) To: Junio C Hamano; +Cc: git On Sun, 20 Jan 2008, Junio C Hamano wrote: > Here is an update to the list I sent earlier. > > Topics that I thought may deserve attention, discussion and > eventual inclusion but are not 1.5.4 material. > > I think these two could be part of 1.5.4, but I left them out of > 1.5.4-rc4 (IOW, I do not think they should be on this list): > > * marking output from "diff --{no,src,dst}-prefix" as a non-git > diff (me) > > Linus had an objection but I think I made a reasonable > argument against that. Haven't heard back since then, so > this is in limbo. If Linus is still not happy with it, we could instead require that the prefixes have at least one slash, not at the beginning, and figure that 'a/foo/' 'b/foo/' intends the effect it will have on git-apply. The effect of --no-prefix on git-apply is kind of incoherent, so that's more sensible to prohibit. > I suspect it might be a good idea to make an early declaration > that 1.5.5 is to resolve the above listed issues plus the ones > already in 'pu' (and nothing else), and have a fairly short > cycle after 1.5.4. I've got 4 topics that I've been holding back until 1.5.4 is out: * Use fewer connections to perform git-native fetches (this is actually from before transport.c made it to master, and I forgot about it until I was rebasing stuff and it didn't go away). * Make checkout a builtin (includes a certain amount of infrastructure improvement for programs that might wants to read multiple trees into the same index in memory in sequence) * Generate a cover letter from format-patch (originally Dscho's patch; I reworked a bunch of it) * Let the user provide aliases for URL patterns (should be useful for groups whose members don't all have the same best access to a remote repository) If you want to have cycles that only handle stuff that's been submitted beforehand, it doesn't make sense to have a feature freeze beforehand, and therefore only take patches in that cycle from people who ignore your wishes. I think in order to do that sort of thing, we'd need a tree run like -mm, maintained by somebody whose attention won't be taken away from the mainline release process by managing patches that are cooking. -Daniel *This .sig left intentionally blank* ^ permalink raw reply [flat|nested] 134+ messages in thread
* Re: What's not in 'master', and likely not to be in, until 1.5.4 2008-01-21 2:37 ` What's not in 'master', and likely not to be in, " Junio C Hamano 2008-01-21 5:21 ` Linus Torvalds 2008-01-21 5:35 ` Daniel Barkalow @ 2008-01-21 8:11 ` Marco Costalba 2 siblings, 0 replies; 134+ messages in thread From: Marco Costalba @ 2008-01-21 8:11 UTC (permalink / raw) To: Junio C Hamano; +Cc: git On Jan 21, 2008 3:37 AM, Junio C Hamano <gitster@pobox.com> wrote: > > I suspect it might be a good idea to make an early declaration > that 1.5.5 is to resolve the above listed issues plus the ones > already in 'pu' (and nothing else), and have a fairly short > cycle after 1.5.4. > I have another patch, already sent to the list but lost somewhere about pretty=format optimization that I'm planning to resend after a cleanup when 1.5.4 is out. Patch improves git log speed when --pretty=format is used. Marco ^ permalink raw reply [flat|nested] 134+ messages in thread
* Re: What's not in 'master' but should be 2008-01-18 9:41 ` What's not in 'master' but should be Junio C Hamano 2008-01-18 10:15 ` Lars Hjemli 2008-01-18 10:40 ` What's not in 'master', and likely not to be until 1.5.4 Junio C Hamano @ 2008-01-18 18:28 ` Johannes Schindelin 2008-01-18 18:36 ` Johannes Schindelin ` (2 more replies) 2 siblings, 3 replies; 134+ messages in thread From: Johannes Schindelin @ 2008-01-18 18:28 UTC (permalink / raw) To: Grégoire Barbier, Junio C Hamano; +Cc: git [-- Attachment #1: Type: TEXT/PLAIN, Size: 2952 bytes --] Hi, On Fri, 18 Jan 2008, Junio C Hamano wrote: > Junio C Hamano <gitster@pobox.com> writes: > > > Currently the ones I looked at and consider possible 1.5.4 material > > are http-push fixes from Grégoire Barbier and parse_commit_buffer() > > tightening from Martin Koegler. > > It seems that for the past few days, people were having too much fun > bashing how broken MacOS X is, and the real work has stalled in the > meantime. Well, not really stalled but they certainly made the patches > and discussions harder to find in the list archive. > > [...] > > But there are still unapplied patches that deserve attention. The one > that I am most worried about is Grégoire Barbier's http-push changes: > > $gmane/70406 <1200250979-19604-1-git-send-email-gb@gbarbier.org> This patch makes http-push Warn if URL does not end if "/", but it would be even better to just handle it... we know exactly that HTTP URLs _must_ end in a slash. It gives a better warning if the URL cannot be accessed, alright. But I hate the fact that it introduces yet another function which does a bunch of curl_easy_setopt()s only to start an active slot and check for errors. Currently, I am not familiar enough with http-push.c to suggest a proper alternative, but I suspect that the return values of the _existing_ calls to curl should know precisely why the requests failed, and _this_ should be reported. > $gmane/70407 <1200250979-19604-2-git-send-email-gb@gbarbier.org> I first could not reproduce the breakage described in the commit message (bad or no ref given on command line). After playing around for a while, all of a sudden, I got a segmentation fault: Waiting for http://dscho@127.0.0.1/test.git/objects/56/5e84516c1c6dca168be1715b45aeae70b24d13_36e8d912-4841-455a-bbd9-69e54d00db99 Segmentation fault (core dumped) Unfortunately, this is with _and_ without this patch. In gdb, it looks like this: Program received signal SIGSEGV, Segmentation fault. [Switching to Thread -1213430096 (LWP 31418)] check_locks () at http-push.c:637 637 if (!lock->refreshing && time_remaining < LOCK_REFRESH) { (gdb) p lock $1 = (struct remote_lock *) 0x20 (gdb) bt #0 check_locks () at http-push.c:637 #1 0x08053f8a in process_response (callback_data=0x80c4550) at http-push.c:683 #2 0x0804dbf4 in process_curl_messages () at http.c:539 #3 0x0804dc46 in step_active_slots () at http.c:453 #4 0x0804dccb in run_active_slot (slot=0x80c2388) at http.c:474 #5 0x0804deaa in http_cleanup () at http.c:291 #6 0x0805268f in main (argc=3, argv=Cannot access memory at address 0x4 ) at http-push.c:2428 So it seems that there is more to fix. > $gmane/70405 <1200250979-19604-3-git-send-email-gb@gbarbier.org> This makes sense. I only tried to compile http-push once without CURL_MULTI, and gave up (I think I even sent out a patch disabling CURL_MULTI for curl versions lacking a certain symbol). Ciao, Dscho ^ permalink raw reply [flat|nested] 134+ messages in thread
* Re: What's not in 'master' but should be 2008-01-18 18:28 ` What's not in 'master' but should be Johannes Schindelin @ 2008-01-18 18:36 ` Johannes Schindelin 2008-02-18 19:57 ` Johannes Schindelin 2008-01-19 6:14 ` Mike Hommey 2008-01-19 15:21 ` [PATCH] http-push: fix webdav lock leak Grégoire Barbier 2 siblings, 1 reply; 134+ messages in thread From: Johannes Schindelin @ 2008-01-18 18:36 UTC (permalink / raw) To: Grégoire Barbier, Junio C Hamano; +Cc: git [-- Attachment #1: Type: TEXT/PLAIN, Size: 1768 bytes --] Hi, On Fri, 18 Jan 2008, Johannes Schindelin wrote: > > $gmane/70407 <1200250979-19604-2-git-send-email-gb@gbarbier.org> > > I first could not reproduce the breakage described in the commit message > (bad or no ref given on command line). > > After playing around for a while, all of a sudden, I got a segmentation > fault: > > Waiting for > http://dscho@127.0.0.1/test.git/objects/56/5e84516c1c6dca168be1715b45aeae70b24d13_36e8d912-4841-455a-bbd9-69e54d00db99 > Segmentation fault (core dumped) > > Unfortunately, this is with _and_ without this patch. > > > In gdb, it looks like this: > > Program received signal SIGSEGV, Segmentation fault. > [Switching to Thread -1213430096 (LWP 31418)] > check_locks () at http-push.c:637 > 637 if (!lock->refreshing && time_remaining < > LOCK_REFRESH) { > (gdb) p lock > $1 = (struct remote_lock *) 0x20 > (gdb) bt > #0 check_locks () at http-push.c:637 > #1 0x08053f8a in process_response (callback_data=0x80c4550) > at http-push.c:683 > #2 0x0804dbf4 in process_curl_messages () at http.c:539 > #3 0x0804dc46 in step_active_slots () at http.c:453 > #4 0x0804dccb in run_active_slot (slot=0x80c2388) at http.c:474 > #5 0x0804deaa in http_cleanup () at http.c:291 > #6 0x0805268f in main (argc=3, argv=Cannot access memory at address 0x4 > ) at http-push.c:2428 > > So it seems that there is more to fix. The segmentation fault occurs due to check_locks() accessing the remote that was just free()d, due to the new change. But now I cannot even reproduce the segmentation fault, it seems. Strange. Very strange. Grégoire, it would help tremendously if you could come up with a test case. The description you gave did not lead to something reproducible here. Ciao, Dscho ^ permalink raw reply [flat|nested] 134+ messages in thread
* Re: What's not in 'master' but should be 2008-01-18 18:36 ` Johannes Schindelin @ 2008-02-18 19:57 ` Johannes Schindelin 0 siblings, 0 replies; 134+ messages in thread From: Johannes Schindelin @ 2008-02-18 19:57 UTC (permalink / raw) To: Grégoire Barbier, Junio C Hamano; +Cc: git [-- Attachment #1: Type: TEXT/PLAIN, Size: 452 bytes --] Hi, On Fri, 18 Jan 2008, Johannes Schindelin wrote: > Grégoire, it would help tremendously if you could come up with a test > case. The description you gave did not lead to something reproducible > here. It seems that I hit the problem myself recently; it only showed when there was more than one ref. A fix is already in "next". Grégoire, could you please test a current "next", just to make sure that the problem is now gone? Ciao, Dscho ^ permalink raw reply [flat|nested] 134+ messages in thread
* Re: What's not in 'master' but should be 2008-01-18 18:28 ` What's not in 'master' but should be Johannes Schindelin 2008-01-18 18:36 ` Johannes Schindelin @ 2008-01-19 6:14 ` Mike Hommey 2008-01-19 15:21 ` [PATCH] http-push: fix webdav lock leak Grégoire Barbier 2 siblings, 0 replies; 134+ messages in thread From: Mike Hommey @ 2008-01-19 6:14 UTC (permalink / raw) To: Johannes Schindelin; +Cc: Grégoire Barbier, Junio C Hamano, git On Fri, Jan 18, 2008 at 06:28:03PM +0000, Johannes Schindelin wrote: > Hi, > > On Fri, 18 Jan 2008, Junio C Hamano wrote: > > > Junio C Hamano <gitster@pobox.com> writes: > > > > > Currently the ones I looked at and consider possible 1.5.4 material > > > are http-push fixes from Grégoire Barbier and parse_commit_buffer() > > > tightening from Martin Koegler. > > > > It seems that for the past few days, people were having too much fun > > bashing how broken MacOS X is, and the real work has stalled in the > > meantime. Well, not really stalled but they certainly made the patches > > and discussions harder to find in the list archive. > > > > [...] > > > > But there are still unapplied patches that deserve attention. The one > > that I am most worried about is Grégoire Barbier's http-push changes: > > > > $gmane/70406 <1200250979-19604-1-git-send-email-gb@gbarbier.org> > > This patch makes http-push Warn if URL does not end if "/", but it would > be even better to just handle it... we know exactly that HTTP URLs _must_ > end in a slash. > > It gives a better warning if the URL cannot be accessed, alright. But I > hate the fact that it introduces yet another function which does a bunch > of curl_easy_setopt()s only to start an active slot and check for errors. > > Currently, I am not familiar enough with http-push.c to suggest a proper > alternative, but I suspect that the return values of the _existing_ calls > to curl should know precisely why the requests failed, and _this_ should > be reported. FWIW, I have a work in progress refactoring the http code, avoiding a great amount of curl_easy_setopt()s and simplifying the whole thing. It's been sitting on my hard drive during my (quite long) vacation. I will probably start working again on this soonish. Mike ^ permalink raw reply [flat|nested] 134+ messages in thread
* Re: [PATCH] http-push: fix webdav lock leak. 2008-01-18 18:28 ` What's not in 'master' but should be Johannes Schindelin 2008-01-18 18:36 ` Johannes Schindelin 2008-01-19 6:14 ` Mike Hommey @ 2008-01-19 15:21 ` Grégoire Barbier 2008-01-19 23:38 ` Johannes Schindelin 2 siblings, 1 reply; 134+ messages in thread From: Grégoire Barbier @ 2008-01-19 15:21 UTC (permalink / raw) To: Johannes Schindelin; +Cc: Junio C Hamano, git Johannes Schindelin a écrit : > > $gmane/70407 <1200250979-19604-2-git-send-email-gb@gbarbier.org> > > I first could not reproduce the breakage described in the commit > message (bad or no ref given on command line). It's rather easy anyway: First, you need a test git repository availlable over http+webdav, let's say at http://myhost/myrepo.git/ Then, you do this: $ git clone http://myhost/myrepo.git/ $ cd myrepo $ git push http Fetching remote heads... refs/ refs/heads/ refs/tags/ No refs in common and none specified; doing nothing. $ git push http Fetching remote heads... refs/ refs/heads/ refs/tags/ No refs in common and none specified; doing nothing. $ Finally, you look at the web server logs, and will find one LOCK query and no UNLOCK query, of course the second one will be in 423 return code instead of 200: 1.2.3.4 - gb [19/Jan/2008:14:24:56 +0100] "LOCK /myrepo.git/info/refs HTTP/1.1" 200 465 (...) 1.2.3.4 - gb [19/Jan/2008:14:25:10 +0100] "LOCK /myrepo.git/info/refs HTTP/1.1" 423 363 With my patch, there would have be two UNLOCKs in addition of the LOCKs From the user point of view: - If you realize that you should have typed e.g. "git push http master" instead of "git push http", you will have to wait for 10 minutes for the lock to expire by its own. - Furthermore, if somebody else is dumb enough to type "git push http" while you need to push "master" branch, then you'll need too to wait for 10 minutes too. > After playing around for a while, all of a sudden, I got a > segmentation fault: > > Waiting for > http://dscho@127.0.0.1/test.git/objects/56/5e84516c1c6dca168be1715b45aeae70b24d13_36e8d912-4841-455a-bbd9-69e54d00db99 > Segmentation fault (core dumped) > > Unfortunately, this is with _and_ without this patch. > > In gdb, it looks like this: (...) > The segmentation fault occurs due to check_locks() accessing the > remote that was just free()d, due to the new change. > > But now I cannot even reproduce the segmentation fault, it seems. > Strange. Very strange. > > Grégoire, it would help tremendously if you could come up with a test > case. The description you gave did not lead to something > reproducible here. I don't know what's wrong but I can't manage to reproduce the segfault, I'm using the master branch on git.git plus my patches, and with CFLAGS containing -DUSE_CURL_MULTI, nothing more nothing less. Is the test case I described above is enough for you to make another test? What kind of additional information would you need ? I will resubmit this patch today with a more detailled commit message including the way to reproduce the issue. BTW you'll be interested to look at one of the "patches" I will repost today, since it's related to this one (the patch subject is "http-push: fail when info/refs exists and is already locked"). -- Grégoire Barbier - gb à gbarbier.org - +33 6 21 35 73 49 ^ permalink raw reply [flat|nested] 134+ messages in thread
* Re: [PATCH] http-push: fix webdav lock leak. 2008-01-19 15:21 ` [PATCH] http-push: fix webdav lock leak Grégoire Barbier @ 2008-01-19 23:38 ` Johannes Schindelin 0 siblings, 0 replies; 134+ messages in thread From: Johannes Schindelin @ 2008-01-19 23:38 UTC (permalink / raw) To: Grégoire Barbier; +Cc: Junio C Hamano, git [-- Attachment #1: Type: TEXT/PLAIN, Size: 646 bytes --] Hi, On Sat, 19 Jan 2008, Grégoire Barbier wrote: > Johannes Schindelin a écrit : > > > After playing around for a while, all of a sudden, I got a > > segmentation fault: > > > > Waiting for > > > > http://dscho@127.0.0.1/test.git/objects/56/5e84516c1c6dca168be1715b45aeae70b24d13_36e8d912-4841-455a-bbd9-69e54d00db99 > > Segmentation fault (core dumped) > > > > Unfortunately, this is with _and_ without this patch. Looking at it again in more depth, it seems that this failure is indeed independent of your patch. But I would still feel better if the fixes were kept minimal for now (codepath-wise, not only code-wise). Ciao, Dscho ^ permalink raw reply [flat|nested] 134+ messages in thread
* Re: [PATCH] Teach remote machinery about remotes.default config variable 2008-01-12 5:52 ` Mark Levedahl 2008-01-12 6:03 ` Junio C Hamano @ 2008-01-12 16:50 ` Johannes Schindelin 2008-01-12 17:29 ` Mark Levedahl 1 sibling, 1 reply; 134+ messages in thread From: Johannes Schindelin @ 2008-01-12 16:50 UTC (permalink / raw) To: Mark Levedahl; +Cc: Junio C Hamano, git Hi, On Sat, 12 Jan 2008, Mark Levedahl wrote: > The argument against my approach of explicitly naming the server rests > upon the premise that hiding a half-dozen servers, all different and > with those differences being important, under the single universal name > "origin", makes things easier. No, that was not _at all_ my argument. I said that hiding it under a different name _that you have to look up, too_ does _not_ make things easier. I might even add that it makes misconfigurations even worse. Ciao, Dscho ^ permalink raw reply [flat|nested] 134+ messages in thread
* Re: [PATCH] Teach remote machinery about remotes.default config variable 2008-01-12 16:50 ` [PATCH] Teach remote machinery about remotes.default config variable Johannes Schindelin @ 2008-01-12 17:29 ` Mark Levedahl 2008-01-12 20:22 ` Johannes Schindelin 0 siblings, 1 reply; 134+ messages in thread From: Mark Levedahl @ 2008-01-12 17:29 UTC (permalink / raw) To: Johannes Schindelin; +Cc: Junio C Hamano, git Johannes Schindelin wrote: > > No, that was not _at all_ my argument. > > I said that hiding it under a different name _that you have to look up, > too_ does _not_ make things easier. > > Granted, *IF* we had to look it up, but we don't. In fact, we use the convention servername.foo.bar has nickname servername So, we need to know the server name we are using, and that server name is the nickname. So, no confusion and no extra lookup step. (Our server names are unique without the domain suffixes, so this works well for us). Mark ^ permalink raw reply [flat|nested] 134+ messages in thread
* Re: [PATCH] Teach remote machinery about remotes.default config variable 2008-01-12 17:29 ` Mark Levedahl @ 2008-01-12 20:22 ` Johannes Schindelin 0 siblings, 0 replies; 134+ messages in thread From: Johannes Schindelin @ 2008-01-12 20:22 UTC (permalink / raw) To: Mark Levedahl; +Cc: Junio C Hamano, git Hi, On Sat, 12 Jan 2008, Mark Levedahl wrote: > Johannes Schindelin wrote: > > > > No, that was not _at all_ my argument. > > > > I said that hiding it under a different name _that you have to look > > up, too_ does _not_ make things easier. > > > > > Granted, *IF* we had to look it up, but we don't. In fact, we use the > convention > servername.foo.bar > has nickname > servername > > So, we need to know the server name we are using, and that server name > is the nickname. So, no confusion and no extra lookup step. (Our server > names are unique without the domain suffixes, so this works well for > us). How do you know _which_ default remote name your current repository uses? Exactly: you have to look it up. So your whole *IF* argument is bogus. And if you already have to look something up, and the user fiddled with her setup, you can no longer be sure that nickname servername points to servername.foo.bar, and you are in even more trouble. That is why I maintain that your solution does not make things better. Hth, Dscho ^ permalink raw reply [flat|nested] 134+ messages in thread
* [PATCH] Teach remote machinery about core.origin config variable 2008-01-12 2:18 ` Junio C Hamano 2008-01-12 5:52 ` Mark Levedahl @ 2008-01-12 5:54 ` Mark Levedahl 2008-01-12 5:54 ` [PATCH] git-remote - Unset core.origin when deleting the default remote Mark Levedahl 1 sibling, 1 reply; 134+ messages in thread From: Mark Levedahl @ 2008-01-12 5:54 UTC (permalink / raw) To: gitster; +Cc: git, Mark Levedahl This introduces a new configuration variable, core.origin, that defines the name of the default remote to be used. Traditionally, this is "origin", and could be overridden for a given branch. This change introduces a way to redefine the default as desired and have that honored regardless of the currently checked out head (e.g., core.origin is used when on a detached head or any other non-tracking branch). Signed-off-by: Mark Levedahl <mlevedahl@gmail.com> --- Documentation/config.txt | 6 ++++++ git-parse-remote.sh | 5 +++-- remote.c | 11 ++++++++++- 3 files changed, 19 insertions(+), 3 deletions(-) diff --git a/Documentation/config.txt b/Documentation/config.txt index 1b6d6d6..a0bdf14 100644 --- a/Documentation/config.txt +++ b/Documentation/config.txt @@ -291,6 +291,12 @@ core.editor:: `GIT_EDITOR` environment, `core.editor`, `VISUAL` and `EDITOR` environment variables and then finally `vi`. +core.origin:: + The name of the remote used by default for fetch / pull. If unset, + origin is assumed. This value is used whenever the current branch + has no corresponding branch.<name>.remote, such as when working on + a detached head. + core.pager:: The command that git will use to paginate output. Can be overridden with the `GIT_PAGER` environment variable. diff --git a/git-parse-remote.sh b/git-parse-remote.sh index 695a409..c7ac7c7 100755 --- a/git-parse-remote.sh +++ b/git-parse-remote.sh @@ -56,8 +56,9 @@ get_remote_url () { get_default_remote () { curr_branch=$(git symbolic-ref -q HEAD | sed -e 's|^refs/heads/||') - origin=$(git config --get "branch.$curr_branch.remote") - echo ${origin:-origin} + git config --get "branch.$curr_branch.remote" || + git config --get "core.origin" || + echo origin } get_remote_default_refs_for_push () { diff --git a/remote.c b/remote.c index 0e00680..302d499 100644 --- a/remote.c +++ b/remote.c @@ -10,6 +10,7 @@ static int allocated_branches; static struct branch *current_branch; static const char *default_remote_name; +static const char *core_origin; #define BUF_SIZE (2048) static char buffer[BUF_SIZE]; @@ -233,6 +234,11 @@ static int handle_config(const char *key, const char *value) add_merge(branch, xstrdup(value)); return 0; } + if (!strcmp(key, "core.origin")) { + if (value) + core_origin = xstrdup(value); + return 0; + } if (prefixcmp(key, "remote.")) return 0; name = key + 7; @@ -291,7 +297,6 @@ static void read_config(void) int flag; if (default_remote_name) // did this already return; - default_remote_name = xstrdup("origin"); current_branch = NULL; head_ref = resolve_ref("HEAD", sha1, 0, &flag); if (head_ref && (flag & REF_ISSYMREF) && @@ -300,6 +305,10 @@ static void read_config(void) make_branch(head_ref + strlen("refs/heads/"), 0); } git_config(handle_config); + if (!default_remote_name) { + default_remote_name = core_origin ? + core_origin : xstrdup("origin"); + } } struct refspec *parse_ref_spec(int nr_refspec, const char **refspec) -- 1.5.4.rc2.98.g1f3d5 ^ permalink raw reply related [flat|nested] 134+ messages in thread
* [PATCH] git-remote - Unset core.origin when deleting the default remote 2008-01-12 5:54 ` [PATCH] Teach remote machinery about core.origin " Mark Levedahl @ 2008-01-12 5:54 ` Mark Levedahl 2008-01-12 5:54 ` [PATCH] git-clone - Set remotes.origin config variable Mark Levedahl 0 siblings, 1 reply; 134+ messages in thread From: Mark Levedahl @ 2008-01-12 5:54 UTC (permalink / raw) To: gitster; +Cc: git, Mark Levedahl Signed-off-by: Mark Levedahl <mlevedahl@gmail.com> --- git-remote.perl | 5 +++++ 1 files changed, 5 insertions(+), 0 deletions(-) diff --git a/git-remote.perl b/git-remote.perl index d13e4c1..75d2371 100755 --- a/git-remote.perl +++ b/git-remote.perl @@ -328,6 +328,11 @@ sub rm_remote { $git->command('config', '--remove-section', "remote.$name"); + my $defremote = $git->config("core.origin"); + if (defined $defremote && $defremote eq $name) { + $git->command("config", "--unset", "core.origin"); + } + eval { my @trackers = $git->command('config', '--get-regexp', 'branch.*.remote', $name); -- 1.5.4.rc2.98.g1f3d5 ^ permalink raw reply related [flat|nested] 134+ messages in thread
* [PATCH] git-clone - Set remotes.origin config variable 2008-01-12 5:54 ` [PATCH] git-remote - Unset core.origin when deleting the default remote Mark Levedahl @ 2008-01-12 5:54 ` Mark Levedahl 2008-01-12 5:54 ` [PATCH] git-submodule - Possibly inherit parent's default remote on init/clone Mark Levedahl 0 siblings, 1 reply; 134+ messages in thread From: Mark Levedahl @ 2008-01-12 5:54 UTC (permalink / raw) To: gitster; +Cc: git, Mark Levedahl This records the users choice of default remote name (by default "origin") as given by the -o option. Signed-off-by: Mark Levedahl <mlevedahl@gmail.com> --- Documentation/git-clone.txt | 3 ++- git-clone.sh | 1 + 2 files changed, 3 insertions(+), 1 deletions(-) diff --git a/Documentation/git-clone.txt b/Documentation/git-clone.txt index fdccbd4..6c15fa4 100644 --- a/Documentation/git-clone.txt +++ b/Documentation/git-clone.txt @@ -95,7 +95,8 @@ OPTIONS --origin <name>:: -o <name>:: Instead of using the remote name 'origin' to keep track - of the upstream repository, use <name> instead. + of the upstream repository, use <name> instead. The name + is recorded in the core.origin config variable. --upload-pack <upload-pack>:: -u <upload-pack>:: diff --git a/git-clone.sh b/git-clone.sh index b4e858c..7208d68 100755 --- a/git-clone.sh +++ b/git-clone.sh @@ -242,6 +242,7 @@ fi && export GIT_DIR && GIT_CONFIG="$GIT_DIR/config" git-init $quiet ${template+"$template"} || usage +git config core.origin $origin if test -n "$bare" then GIT_CONFIG="$GIT_DIR/config" git config core.bare true -- 1.5.4.rc2.98.g1f3d5 ^ permalink raw reply related [flat|nested] 134+ messages in thread
* [PATCH] git-submodule - Possibly inherit parent's default remote on init/clone 2008-01-12 5:54 ` [PATCH] git-clone - Set remotes.origin config variable Mark Levedahl @ 2008-01-12 5:54 ` Mark Levedahl 0 siblings, 0 replies; 134+ messages in thread From: Mark Levedahl @ 2008-01-12 5:54 UTC (permalink / raw) To: gitster; +Cc: git, Mark Levedahl For submodules defined relative to their parent, it is likely that the parent's defined default remote is correct for the child as well. This allows use of remote names other than "origin", important as managed submodules are typically checked out on a detached head and therefore submodule-update invokes git-fetch using the default remote. Without this change, submodules effectively had to have a default remote of "origin." Signed-off-by: Mark Levedahl <mlevedahl@gmail.com> --- Documentation/git-submodule.txt | 8 +++++--- git-submodule.sh | 19 +++++++++++++------ 2 files changed, 18 insertions(+), 9 deletions(-) diff --git a/Documentation/git-submodule.txt b/Documentation/git-submodule.txt index cffc6d4..440e234 100644 --- a/Documentation/git-submodule.txt +++ b/Documentation/git-submodule.txt @@ -36,9 +36,11 @@ status:: init:: Initialize the submodules, i.e. register in .git/config each submodule - name and url found in .gitmodules. The key used in .git/config is - `submodule.$name.url`. This command does not alter existing information - in .git/config. + name and url found in .gitmodules, along with the default remote origin. + For submodules using a relative url, the default remote is inherited + from the parent project, for absolute urls the default "origin" is used. + The key used in .git/config is submodule.$name.url`. This command does + not alter existing information in .git/config. update:: Update the registered submodules, i.e. clone missing submodules and diff --git a/git-submodule.sh b/git-submodule.sh index ad9fe62..42be4b9 100755 --- a/git-submodule.sh +++ b/git-submodule.sh @@ -7,6 +7,7 @@ USAGE='[--quiet] [--cached] [add <repo> [-b branch]|status|init|update] [--] [<path>...]' OPTIONS_SPEC= . git-sh-setup +. git-parse-remote require_work_tree add= @@ -43,9 +44,7 @@ get_repo_base() { # Resolve relative url by appending to parent's url resolve_relative_url () { - branch="$(git symbolic-ref HEAD 2>/dev/null)" - remote="$(git config branch.${branch#refs/heads/}.remote)" - remote="${remote:-origin}" + remote="$(get_default_remote)" remoteurl="$(git config remote.$remote.url)" || die "remote ($remote) does not have a url in .git/config" url="$1" @@ -95,6 +94,7 @@ module_clone() { path=$1 url=$2 + origin=${3:-origin} # If there already is a directory at the submodule path, # expect it to be empty (since that is the default checkout @@ -110,7 +110,7 @@ module_clone() test -e "$path" && die "A file already exist at path '$path'" - git-clone -n "$url" "$path" || + git-clone -n -o "$origin" "$url" "$path" || die "Clone of '$url' into submodule path '$path' failed" } @@ -130,9 +130,11 @@ module_add() usage fi + origin=origin case "$repo" in ./*|../*) # dereference source url relative to parent's url + origin=$(get_default_remote) realrepo="$(resolve_relative_url $repo)" ;; *) # Turn the source into an absolute path if @@ -157,7 +159,7 @@ module_add() git ls-files --error-unmatch "$path" > /dev/null 2>&1 && die "'$path' already exists in the index" - module_clone "$path" "$realrepo" || exit + module_clone "$path" "$realrepo" "$origin" || exit (unset GIT_DIR; cd "$path" && git checkout -q ${branch:+-b "$branch" "origin/$branch"}) || die "Unable to checkout submodule '$path'" git add "$path" || @@ -189,12 +191,15 @@ modules_init() die "No url found for submodule path '$path' in .gitmodules" # Possibly a url relative to parent + origin=origin case "$url" in ./*|../*) url="$(resolve_relative_url "$url")" + origin=$(get_default_remote) ;; esac + git config submodule."$name".origin "$origin" && git config submodule."$name".url "$url" || die "Failed to register url for submodule path '$path'" @@ -222,10 +227,12 @@ modules_update() say "Submodule path '$path' not initialized" continue fi + origin=$(git config submodule."$name".origin) + origin=${origin:-origin} if ! test -d "$path"/.git then - module_clone "$path" "$url" || exit + module_clone "$path" "$url" "$origin" || exit subsha1= else subsha1=$(unset GIT_DIR; cd "$path" && -- 1.5.4.rc2.98.g1f3d5 ^ permalink raw reply related [flat|nested] 134+ messages in thread
* Re: Allowing override of the default "origin" nickname 2008-01-11 3:29 Allowing override of the default "origin" nickname Mark Levedahl 2008-01-11 3:29 ` [PATCH] Teach remote machinery about remotes.default config variable Mark Levedahl @ 2008-01-11 12:03 ` Johannes Schindelin 2008-01-11 13:06 ` Mark Levedahl 2008-01-11 23:11 ` Daniel Barkalow 2 siblings, 1 reply; 134+ messages in thread From: Johannes Schindelin @ 2008-01-11 12:03 UTC (permalink / raw) To: Mark Levedahl; +Cc: gitster, git Hi, On Thu, 10 Jan 2008, Mark Levedahl wrote: > git's current support for remote nicknames other than > "origin" is restricted to tracking branches where > branch.<name>.remote is defined. IIUC your patch only replaces the term "origin" by something user-specifiable. I fail to see the use of it; care to explain what workflow is easier with your patches than without? Ciao, Dscho ^ permalink raw reply [flat|nested] 134+ messages in thread
* Re: Allowing override of the default "origin" nickname 2008-01-11 12:03 ` Allowing override of the default "origin" nickname Johannes Schindelin @ 2008-01-11 13:06 ` Mark Levedahl 2008-01-11 13:52 ` Johannes Schindelin 0 siblings, 1 reply; 134+ messages in thread From: Mark Levedahl @ 2008-01-11 13:06 UTC (permalink / raw) To: Johannes Schindelin; +Cc: gitster, git On Jan 11, 2008 7:03 AM, Johannes Schindelin <Johannes.Schindelin@gmx.de> wrote: > Hi, > > IIUC your patch only replaces the term "origin" by something > user-specifiable. I fail to see the use of it; care to explain what > workflow is easier with your patches than without? > > Ciao, > Dscho Consider a project with several servers, each of which is *supposed* is host the same project but due to lags in mirroring across airgaps, etc., are never quite in sync. Now, we get on a teleconference and discuss issues, find differences, and everyone reports that "origin" has x, but in fact "origin" means different servers to almost everyone. Also consider that only a small subset of the group really understands git, most just follow cook-book recipes to get their work done and don't understand what is going on. This is my problem: "origin" is an abstraction that hides the different server names in use and makes communication difficult, having everyone use nicknames related to their particular upstream server reduces the confusion. Mark ^ permalink raw reply [flat|nested] 134+ messages in thread
* Re: Allowing override of the default "origin" nickname 2008-01-11 13:06 ` Mark Levedahl @ 2008-01-11 13:52 ` Johannes Schindelin 2008-01-11 14:53 ` Mark Levedahl 0 siblings, 1 reply; 134+ messages in thread From: Johannes Schindelin @ 2008-01-11 13:52 UTC (permalink / raw) To: Mark Levedahl; +Cc: gitster, git Hi, On Fri, 11 Jan 2008, Mark Levedahl wrote: > On Jan 11, 2008 7:03 AM, Johannes Schindelin <Johannes.Schindelin@gmx.de> wrote: > > > IIUC your patch only replaces the term "origin" by something > > user-specifiable. I fail to see the use of it; care to explain what > > workflow is easier with your patches than without? > > Consider a project with several servers, each of which is *supposed* is > host the same project but due to lags in mirroring across airgaps, etc., > are never quite in sync. Now, we get on a teleconference and discuss > issues, find differences, and everyone reports that "origin" has x, but > in fact "origin" means different servers to almost everyone. Also > consider that only a small subset of the group really understands git, > most just follow cook-book recipes to get their work done and don't > understand what is going on. Okay, I now understand your intention much better than before. > This is my problem: "origin" is an abstraction that hides the different > server names in use and makes communication difficult, having everyone > use nicknames related to their particular upstream server reduces the > confusion. Unfortunately, I think this will just lead to even more confusion. Because those people following recipes without thinking will now use a name that does not even say the role, let alone the server. IOW I think that your patch worsens the situation you describe. IMHO you should optimise the communication by agreeing on one origin, or alternatively not talk about a server at all (which is made easy by the global uniqueness of commit names; just say "my tip is ac9b7192"). Ciao, Dscho ^ permalink raw reply [flat|nested] 134+ messages in thread
* Re: Allowing override of the default "origin" nickname 2008-01-11 13:52 ` Johannes Schindelin @ 2008-01-11 14:53 ` Mark Levedahl 2008-01-11 15:03 ` Johannes Schindelin 2008-01-11 15:25 ` Jakub Narebski 0 siblings, 2 replies; 134+ messages in thread From: Mark Levedahl @ 2008-01-11 14:53 UTC (permalink / raw) To: Johannes Schindelin; +Cc: gitster, git On Jan 11, 2008 8:52 AM, Johannes Schindelin <Johannes.Schindelin@gmx.de> wrote: > > IMHO you should optimise the communication by agreeing on one origin, > or alternatively not talk about a server at all (which is made easy by the > global uniqueness of commit names; just say "my tip is ac9b7192"). > We *cannot* agree on one definition of "origin": there is no single server accessible by all, but use of submodules currently *requires* that each repo's upstream be given the nickname "origin". With this change, I can enforce that each server has a unique nickname and that one unique nickname per server is used across the program. Absent this, I cannot and end up having to have everyone translate "origin" into what it means for them. SHA-1's are absolutely unique, but what do you do when "origin" does not have acdc101? I want to know that server-x@joe.com doesn't have it, while server-y@mary.org does. This is the frequent problem in conversation, and is the reason we have to be able to talk about the particular upstream server. This change does not eliminate the ability to obscure multiple different server names using "origin" for those who think that is the best way to do things, it just eliminates the requirement for doing so. Mark ^ permalink raw reply [flat|nested] 134+ messages in thread
* Re: Allowing override of the default "origin" nickname 2008-01-11 14:53 ` Mark Levedahl @ 2008-01-11 15:03 ` Johannes Schindelin 2008-01-11 16:39 ` Mark Levedahl 2008-01-11 15:25 ` Jakub Narebski 1 sibling, 1 reply; 134+ messages in thread From: Johannes Schindelin @ 2008-01-11 15:03 UTC (permalink / raw) To: Mark Levedahl; +Cc: gitster, git Hi, On Fri, 11 Jan 2008, Mark Levedahl wrote: > On Jan 11, 2008 8:52 AM, Johannes Schindelin <Johannes.Schindelin@gmx.de> wrote: > > > > IMHO you should optimise the communication by agreeing on one origin, > > or alternatively not talk about a server at all (which is made easy by > > the global uniqueness of commit names; just say "my tip is ac9b7192"). > > We *cannot* agree on one definition of "origin": there is no single > server accessible by all, but use of submodules currently *requires* > that each repo's upstream be given the nickname "origin". With this > change, I can enforce that each server has a unique nickname and that > one unique nickname per server is used across the program. Absent this, > I cannot and end up having to have everyone translate "origin" into what > it means for them. > > SHA-1's are absolutely unique, but what do you do when "origin" does not > have acdc101? I want to know that server-x@joe.com doesn't have it, > while server-y@mary.org does. This is the frequent problem in > conversation, and is the reason we have to be able to talk about the > particular upstream server. Okay, so with your change the user has to either remember or lookup which is the default remote. Without your change, the user has to either remember or lookup where origin points to. I still think your change does not help. Ciao, Dscho ^ permalink raw reply [flat|nested] 134+ messages in thread
* Re: Allowing override of the default "origin" nickname 2008-01-11 15:03 ` Johannes Schindelin @ 2008-01-11 16:39 ` Mark Levedahl 2008-01-11 17:01 ` Björn Steinbrink 0 siblings, 1 reply; 134+ messages in thread From: Mark Levedahl @ 2008-01-11 16:39 UTC (permalink / raw) To: Johannes Schindelin; +Cc: gitster, git On Jan 11, 2008 10:03 AM, Johannes Schindelin > > Okay, so with your change the user has to either remember or lookup which > is the default remote. Without your change, the user has to either > remember or lookup where origin points to. > > I still think your change does not help. That's a theoretical argument: my *experience* with trying to make the current workflow operate was sufficiently bad and troublesome that it caused me to write code and fix it to enable the new workflow. Also, absent submodules the new workflow is fully supported by branch.<name>.remote: are you advocating the elimination of that existing feature? Mark ^ permalink raw reply [flat|nested] 134+ messages in thread
* Re: Allowing override of the default "origin" nickname 2008-01-11 16:39 ` Mark Levedahl @ 2008-01-11 17:01 ` Björn Steinbrink 2008-01-11 17:27 ` Jakub Narebski 0 siblings, 1 reply; 134+ messages in thread From: Björn Steinbrink @ 2008-01-11 17:01 UTC (permalink / raw) To: Mark Levedahl; +Cc: Johannes Schindelin, gitster, git On 2008.01.11 11:39:48 -0500, Mark Levedahl wrote: > On Jan 11, 2008 10:03 AM, Johannes Schindelin > > > Okay, so with your change the user has to either remember or lookup which > > is the default remote. Without your change, the user has to either > > remember or lookup where origin points to. > > > > I still think your change does not help. > > That's a theoretical argument: my *experience* with trying to make the > current workflow operate was sufficiently bad and troublesome that it > caused me to write code and fix it to enable the new workflow. Also, > absent submodules the new workflow is fully supported by > branch.<name>.remote: are you advocating the elimination of that > existing feature? AFAICT your main point is that you can do: git config --get remotes.default and get an unique _symbolic_ name, right? So while you still need to lookup the value of remotes.default, you get e.g. "myremote" instead of "git://myremote/foo.git" which you get from "git remote show origin". At least that's how I interpreted it. Your argumentation wasn't that clear on what you actually want to achieve/improve and why just looking up "origin" isn't enough, IMHO. A different approach, which feels more in-line with the current state of things, might be to allow remote aliases. "origin" would be an alias of "myremote", and "git remote show origin" might say "origin is an alias for myremote" followed by the details of "myremote". So that would give you the same benefit, but "origin" would keep its meaning, and you would not get different behaviour depending on some configuration setting (so the poor folks on #git can just assume that "origin" is the default for everyone). Admittedly, I don't see any use-case for aliases except for that origin thing, but maybe someone else does? Björn ^ permalink raw reply [flat|nested] 134+ messages in thread
* Re: Allowing override of the default "origin" nickname 2008-01-11 17:01 ` Björn Steinbrink @ 2008-01-11 17:27 ` Jakub Narebski 0 siblings, 0 replies; 134+ messages in thread From: Jakub Narebski @ 2008-01-11 17:27 UTC (permalink / raw) To: Björn Steinbrink; +Cc: Mark Levedahl, Johannes Schindelin, gitster, git Björn Steinbrink <B.Steinbrink@gmx.de> writes: > A different approach, which feels more in-line with the current state of > things, might be to allow remote aliases. "origin" would be an alias of > "myremote", and "git remote show origin" might say "origin is an alias > for myremote" followed by the details of "myremote". So that would give > you the same benefit, but "origin" would keep its meaning, and you would > not get different behaviour depending on some configuration setting (so > the poor folks on #git can just assume that "origin" is the default for > everyone). > > Admittedly, I don't see any use-case for aliases except for that origin > thing, but maybe someone else does? Aliases for remotes can address current deficiency in git, namely that you cannot have push and pull under the same remote if they use different URLs. One could use such alias to have the same name for pull and for push. -- Jakub Narebski Poland ShadeHawk on #git ^ permalink raw reply [flat|nested] 134+ messages in thread
* Re: Allowing override of the default "origin" nickname 2008-01-11 14:53 ` Mark Levedahl 2008-01-11 15:03 ` Johannes Schindelin @ 2008-01-11 15:25 ` Jakub Narebski 2008-01-11 16:15 ` Mark Levedahl 1 sibling, 1 reply; 134+ messages in thread From: Jakub Narebski @ 2008-01-11 15:25 UTC (permalink / raw) To: Mark Levedahl; +Cc: Johannes Schindelin, Junio C Hamano, git "Mark Levedahl" <mlevedahl@gmail.com> writes: > On Jan 11, 2008 8:52 AM, Johannes Schindelin <Johannes.Schindelin@gmx.de> wrote: > > > > IMHO you should optimise the communication by agreeing on one origin, > > or alternatively not talk about a server at all (which is made easy by the > > global uniqueness of commit names; just say "my tip is ac9b7192"). > > > > We *cannot* agree on one definition of "origin": there is no single > server accessible by all, but use of submodules currently *requires* > that each repo's upstream be given the nickname "origin". With this > change, I can enforce that each server has a unique nickname and that > one unique nickname per server is used across the program. Absent > this, I cannot and end up having to have everyone translate "origin" > into what it means for them. > > SHA-1's are absolutely unique, but what do you do when "origin" does > not have acdc101? I want to know that server-x@joe.com doesn't have > it, while server-y@mary.org does. This is the frequent problem in > conversation, and is the reason we have to be able to talk about the > particular upstream server. > > This change does not eliminate the ability to obscure multiple > different server names using "origin" for those who think that is the > best way to do things, it just eliminates the requirement for doing > so. Dscho, although I can agree that more flexibility is not always a good thing, I think that in this situation it is a good thing. I especially like that git-clone remembers what name it used for upstream repository (git clone --origin <name>). Mark, if this change is mainly about the fact that git doesn't allow to specify default remote to fetch for detached HEAD (and submodules use detached HEAD), why not provide "branch.HEAD.remote" etc., which would be used _only_ if we are on detached HEAD (i.e. branch has no name). -- Jakub Narebski Poland ShadeHawk on #git ^ permalink raw reply [flat|nested] 134+ messages in thread
* Re: Allowing override of the default "origin" nickname 2008-01-11 15:25 ` Jakub Narebski @ 2008-01-11 16:15 ` Mark Levedahl 2008-01-11 21:12 ` Johannes Schindelin 0 siblings, 1 reply; 134+ messages in thread From: Mark Levedahl @ 2008-01-11 16:15 UTC (permalink / raw) To: Jakub Narebski; +Cc: Johannes Schindelin, Junio C Hamano, git On Jan 11, 2008 10:25 AM, Jakub Narebski <jnareb@gmail.com> wrote: > > Mark, if this change is mainly about the fact that git doesn't allow > to specify default remote to fetch for detached HEAD (and submodules > use detached HEAD), why not provide "branch.HEAD.remote" etc., which > would be used _only_ if we are on detached HEAD (i.e. branch has no > name). > Practically speaking, this would just change the name of the config variable (from remotes.default to branch.HEAD.remote). However, this value is used *whenever* the current branch does not have corresponding branch.<name>.remote, and that is not restricted to detached heads, it applies anytime the current HEAD is not a tracking branch. So, I believe remotes.default better reflects this generality than does branch.HEAD.remote. Mark ^ permalink raw reply [flat|nested] 134+ messages in thread
* Re: Allowing override of the default "origin" nickname 2008-01-11 16:15 ` Mark Levedahl @ 2008-01-11 21:12 ` Johannes Schindelin 0 siblings, 0 replies; 134+ messages in thread From: Johannes Schindelin @ 2008-01-11 21:12 UTC (permalink / raw) To: Mark Levedahl; +Cc: Jakub Narebski, Junio C Hamano, git Hi, On Fri, 11 Jan 2008, Mark Levedahl wrote: > On Jan 11, 2008 10:25 AM, Jakub Narebski <jnareb@gmail.com> wrote: > > > > Mark, if this change is mainly about the fact that git doesn't allow > > to specify default remote to fetch for detached HEAD (and submodules > > use detached HEAD), why not provide "branch.HEAD.remote" etc., which > > would be used _only_ if we are on detached HEAD (i.e. branch has no > > name). > > Practically speaking, this would just change the name of the config > variable (from remotes.default to branch.HEAD.remote). However, this > value is used *whenever* the current branch does not have corresponding > branch.<name>.remote, and that is not restricted to detached heads, it > applies anytime the current HEAD is not a tracking branch. So, I believe > remotes.default better reflects this generality than does > branch.HEAD.remote. Practically speaking, I have enough experience to _know_ that your solution will not help very much. It will just add to confusion. You stated quite clearly -- _after_ I asked -- what your problem is, and I am quite certain that you _still_ have to look up _something_ (as I remarked in the email you responded to). So it is still _utterly_ unclear to me how your patch helps anything. Ciao, Dscho ^ permalink raw reply [flat|nested] 134+ messages in thread
* Re: Allowing override of the default "origin" nickname 2008-01-11 3:29 Allowing override of the default "origin" nickname Mark Levedahl 2008-01-11 3:29 ` [PATCH] Teach remote machinery about remotes.default config variable Mark Levedahl 2008-01-11 12:03 ` Allowing override of the default "origin" nickname Johannes Schindelin @ 2008-01-11 23:11 ` Daniel Barkalow 2 siblings, 0 replies; 134+ messages in thread From: Daniel Barkalow @ 2008-01-11 23:11 UTC (permalink / raw) To: Mark Levedahl; +Cc: gitster, git I'm not sure if this is actually relevant to your situation, but I've got a patch (which I'll probably send post-1.5.4) to allow configuration of aliases for URLs, such that git will rewrite (for example) master.kernel.org:/pub/... to git://git.kernel.org/pub/...; if you're reading a discussion between kernel.org users on the linux-kernel mailing list and you don't have a kernel.org account, and you want to try things, this patch makes it a lot easier (cut-and-paste the URL you can't actually use, and it uses the variant you prefer without making you deal with it for each URL). If, for each person, there's a single best access method to the data, but there's no single access method that works for all of the participants, they could use this patch, and use per-user configuration to replace all of the other possible names with the one they have to use. -Daniel *This .sig left intentionally blank* ^ permalink raw reply [flat|nested] 134+ messages in thread
end of thread, other threads:[~2008-02-18 19:58 UTC | newest] Thread overview: 134+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2008-01-11 3:29 Allowing override of the default "origin" nickname Mark Levedahl 2008-01-11 3:29 ` [PATCH] Teach remote machinery about remotes.default config variable Mark Levedahl 2008-01-11 3:29 ` [PATCH] git-remote - Unset remotes.default when deleting the default remote Mark Levedahl 2008-01-11 3:29 ` [PATCH] git-clone - Set remotes.default config variable Mark Levedahl 2008-01-11 3:29 ` [PATCH] git-submodule - Possibly inherit parent's default remote on init/clone Mark Levedahl 2008-01-11 8:00 ` [PATCH] Teach remote machinery about remotes.default config variable Junio C Hamano 2008-01-11 20:52 ` Mark Levedahl 2008-01-12 2:18 ` Junio C Hamano 2008-01-12 5:52 ` Mark Levedahl 2008-01-12 6:03 ` Junio C Hamano 2008-01-12 6:16 ` Mark Levedahl 2008-01-12 6:27 ` Junio C Hamano 2008-01-12 13:24 ` Mark Levedahl 2008-01-12 18:46 ` Junio C Hamano 2008-01-12 19:34 ` Mark Levedahl 2008-01-12 20:24 ` Johannes Schindelin 2008-01-12 22:29 ` Mark Levedahl 2008-01-13 21:22 ` Johannes Schindelin 2008-01-14 3:23 ` Mark Levedahl 2008-01-14 4:42 ` Junio C Hamano 2008-01-15 4:55 ` Mark Levedahl 2008-01-15 6:18 ` Junio C Hamano 2008-01-15 23:08 ` Mark Levedahl 2008-01-16 0:17 ` Johannes Schindelin 2008-01-16 1:25 ` Mark Levedahl 2008-01-16 1:40 ` Johannes Schindelin 2008-01-12 20:26 ` Junio C Hamano 2008-01-12 22:24 ` Mark Levedahl 2008-01-12 22:48 ` Junio C Hamano 2008-01-13 15:47 ` Mark Levedahl 2008-01-13 16:27 ` [PATCH] Teach remote machinery about core.origin " Mark Levedahl 2008-01-13 16:27 ` [PATCH] git-remote - Unset core.origin when deleting the default remote Mark Levedahl 2008-01-13 16:27 ` [PATCH] git-clone - Set remotes.origin config variable Mark Levedahl 2008-01-13 16:27 ` [PATCH] git-submodule - Possibly inherit parent's default remote on init/clone Mark Levedahl 2008-01-13 16:27 ` [PATCH] Teach git-submodule to use master's remote when updating subprojects Mark Levedahl 2008-01-14 11:05 ` [PATCH] git-remote - Unset core.origin when deleting the default remote Jeff King 2008-01-15 5:02 ` Mark Levedahl 2008-01-15 16:50 ` Jeff King 2008-01-13 21:27 ` [PATCH] Teach remote machinery about remotes.default config variable Johannes Schindelin 2008-01-14 1:50 ` Junio C Hamano 2008-01-14 6:49 ` safecrlf not in 1.5.4 (was Re: [PATCH] Teach remote machinery about remotes.default config variable) Steffen Prohaska [not found] ` <31687420-EB17-4651-AD6C-07213311ABDA-wjoc1KHpMeg@public.gmane.org> 2008-01-14 7:30 ` safecrlf not in 1.5.4 Junio C Hamano [not found] ` < 7vejcklv84.fsf@gitster.siamese.dyndns.org> [not found] ` <7vejcklv84.fsf-jO8aZxhGsIagbBziECNbOZn29agUkmeCHZ5vskTnxNA@public.gmane.org> 2008-01-14 8:29 ` Steffen Prohaska 2008-01-14 19:41 ` [msysGit] " Junio C Hamano 2008-01-14 9:04 ` Dmitry Potapov 2008-01-14 17:35 ` Pierre Habouzit 2008-01-14 11:18 ` [PATCH] Teach remote machinery about remotes.default config variable Johannes Schindelin 2008-01-14 12:16 ` valgrind test scripts (was Re: [PATCH] Teach remote...) Jeff King 2008-01-18 9:41 ` What's not in 'master' but should be Junio C Hamano 2008-01-18 10:15 ` Lars Hjemli 2008-01-18 10:24 ` Junio C Hamano 2008-01-18 10:53 ` Lars Hjemli 2008-01-18 11:09 ` Junio C Hamano 2008-01-18 11:54 ` Lars Hjemli 2008-01-18 12:34 ` Johannes Schindelin 2008-01-18 14:19 ` Lars Hjemli 2008-01-18 20:59 ` Junio C Hamano 2008-01-18 10:40 ` What's not in 'master', and likely not to be until 1.5.4 Junio C Hamano 2008-01-18 11:25 ` Johannes Sixt 2008-01-18 11:40 ` Junio C Hamano 2008-01-18 13:04 ` Steffen Prohaska 2008-01-18 13:11 ` Johannes Schindelin 2008-01-18 20:36 ` Johannes Schindelin 2008-01-18 20:58 ` Johannes Schindelin 2008-01-21 4:46 ` Shawn O. Pearce 2008-01-21 10:37 ` Johannes Schindelin 2008-01-23 4:44 ` Shawn O. Pearce 2008-01-23 11:12 ` Johannes Schindelin 2008-01-18 22:07 ` Johannes Sixt 2008-01-18 22:37 ` Johannes Schindelin 2008-01-18 11:26 ` Jakub Narebski 2008-01-18 21:49 ` Junio C Hamano 2008-01-21 5:55 ` Imran M Yousuf 2008-01-21 6:29 ` Junio C Hamano 2008-01-21 6:42 ` Steffen Prohaska 2008-01-21 6:41 ` [PATCH] submodule: Document the details of the command line syntax Steffen Prohaska 2008-01-21 6:47 ` Junio C Hamano 2008-01-18 12:17 ` What's not in 'master', and likely not to be until 1.5.4 Marco Costalba 2008-01-18 12:18 ` Marco Costalba 2008-01-18 12:53 ` Steffen Prohaska 2008-01-18 13:09 ` Johannes Schindelin 2008-01-18 13:23 ` Steffen Prohaska 2008-01-21 2:37 ` What's not in 'master', and likely not to be in, " Junio C Hamano 2008-01-21 5:21 ` Linus Torvalds 2008-01-21 6:15 ` Junio C Hamano 2008-01-21 7:02 ` Junio C Hamano 2008-01-21 7:10 ` Junio C Hamano 2008-01-21 7:13 ` Junio C Hamano 2008-01-21 7:27 ` Junio C Hamano 2008-01-21 8:32 ` Junio C Hamano 2008-01-21 8:44 ` [PATCH 1/2] read-cache.c: introduce is_racy_timestamp() helper Junio C Hamano 2008-01-21 8:46 ` [PATCH 2/2] read-cache.c: fix timestamp comparison Junio C Hamano 2008-01-21 18:47 ` Linus Torvalds 2008-01-21 19:06 ` Johannes Schindelin 2008-01-21 19:09 ` Linus Torvalds 2008-01-21 19:24 ` Linus Torvalds 2008-01-21 19:26 ` Johannes Schindelin 2008-01-21 19:47 ` Linus Torvalds 2008-01-21 20:38 ` Junio C Hamano 2008-01-21 21:22 ` Linus Torvalds 2008-01-21 22:02 ` Junio C Hamano 2008-01-22 9:47 ` Junio C Hamano 2008-01-22 17:25 ` Linus Torvalds 2008-01-22 22:00 ` Linus Torvalds 2008-01-23 3:34 ` Junio C Hamano 2008-01-23 3:53 ` Linus Torvalds 2008-01-21 8:29 ` What's not in 'master', and likely not to be in, until 1.5.4 Johannes Sixt 2008-01-21 5:35 ` Daniel Barkalow 2008-01-21 8:11 ` Marco Costalba 2008-01-18 18:28 ` What's not in 'master' but should be Johannes Schindelin 2008-01-18 18:36 ` Johannes Schindelin 2008-02-18 19:57 ` Johannes Schindelin 2008-01-19 6:14 ` Mike Hommey 2008-01-19 15:21 ` [PATCH] http-push: fix webdav lock leak Grégoire Barbier 2008-01-19 23:38 ` Johannes Schindelin 2008-01-12 16:50 ` [PATCH] Teach remote machinery about remotes.default config variable Johannes Schindelin 2008-01-12 17:29 ` Mark Levedahl 2008-01-12 20:22 ` Johannes Schindelin 2008-01-12 5:54 ` [PATCH] Teach remote machinery about core.origin " Mark Levedahl 2008-01-12 5:54 ` [PATCH] git-remote - Unset core.origin when deleting the default remote Mark Levedahl 2008-01-12 5:54 ` [PATCH] git-clone - Set remotes.origin config variable Mark Levedahl 2008-01-12 5:54 ` [PATCH] git-submodule - Possibly inherit parent's default remote on init/clone Mark Levedahl 2008-01-11 12:03 ` Allowing override of the default "origin" nickname Johannes Schindelin 2008-01-11 13:06 ` Mark Levedahl 2008-01-11 13:52 ` Johannes Schindelin 2008-01-11 14:53 ` Mark Levedahl 2008-01-11 15:03 ` Johannes Schindelin 2008-01-11 16:39 ` Mark Levedahl 2008-01-11 17:01 ` Björn Steinbrink 2008-01-11 17:27 ` Jakub Narebski 2008-01-11 15:25 ` Jakub Narebski 2008-01-11 16:15 ` Mark Levedahl 2008-01-11 21:12 ` Johannes Schindelin 2008-01-11 23:11 ` Daniel Barkalow
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).