Re: Bug: .gitconfig folder

2015-05-27 Thread Jeff King
On Wed, May 27, 2015 at 03:24:47PM -0700, Stefan Beller wrote:

> What is our thinking for after-fact recovery attempts?
> Like we try the mmap first, if that fails we just use open to get the
> contents of
> the file. And when open fails, we can still print a nice error message?

For config, I think we could just open and read the file in the first
place. The data is not typically very big (and if you have a 3G config
file and git barfs with "out of memory", I can live with that).

-Peff
--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: Redirect "git" subcommand to itself?

2015-05-27 Thread Jeff King
On Wed, May 27, 2015 at 06:53:26PM -0700, Junio C Hamano wrote:

> > I wonder if we want to make a "git" subcommand, which behaves exactly
> > the same as git itself?
> > Then "git git git status" would just return the same as "git status".
> 
> A few unrelated thoughts.
> 
>  * Perhaps we should omit 'git' from these advice-texts?  E.g.
> 
>  use "revert --abort" to cancel
> 
>I dunno.

Please don't. You help the set of people who type "git" and then paste
the rest of the command at the expense of people who just  paste the
whole command. We don't know the relative numbers of those people, but
we know there is at least 1 in each group. ;)

-Peff
--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: Redirect "git" subcommand to itself?

2015-05-27 Thread Junio C Hamano
Stefan Beller  writes:

> so I just run into this problem again (which happens to me maybe twice a 
> week):
> I want to do a git operations, so I type "git " into my shell, and
> then I look around what
> exactly I want to do and usually I find it in the help text of a
> previous command such as
> You are currently reverting commit 383c14b.
>   (fix conflicts and run "git revert --continue")
>   (use "git revert --abort" to cancel the revert operation)
>
> then I copy the whole operation "git revert --abort" in this case and
> paste it to the shell
> and let go.
> The result looks like
> $ git git revert --abort
> git: 'git' is not a git command. See 'git --help'.
>
> Did you mean this?
> init
>
> I wonder if we want to make a "git" subcommand, which behaves exactly
> the same as git itself?
> Then "git git git status" would just return the same as "git status".

A few unrelated thoughts.

 * Perhaps we should omit 'git' from these advice-texts?  E.g.

 use "revert --abort" to cancel

   I dunno.

 * While we bend over backwards to a certain degree to be helpful, I
   somehow feel making "git git" a synonym to "git" is going too
   far, akin to asking POSIX maintainers to define "act", "cta",
   "atc", "tca", and "tac" all as synonyms to "cat" because you
   often fat-finger when typing "cat" (yes, "tac" does something
   else that is more useful, I know).

 * You can help yourself with something like this, I suppose:

   [alias]
git = "!sh -c 'exec git \"$@\"' -"

   but I personally feel that it is too ugly to live as part of our
   official suggestion, so please do not send a patch to add it as
   a built-in alias ;-).
--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH] glossary: add "remote", "submodule", "superproject"

2015-05-27 Thread Stefan Beller
Noticed-by: Philip Oakley 
Helped-by: Junio C Hamano 
Signed-off-by: Stefan Beller 
---
 Documentation/glossary-content.txt | 17 +
 1 file changed, 17 insertions(+)

diff --git a/Documentation/glossary-content.txt 
b/Documentation/glossary-content.txt
index bf383c2..23ab692 100644
--- a/Documentation/glossary-content.txt
+++ b/Documentation/glossary-content.txt
@@ -469,6 +469,11 @@ The most notable example is `HEAD`.
<> to describe the mapping between remote
<> and local ref.
 
+[[def_remote]]remote repository::
+   A <> which is used to track the same
+   project but resides somewhere else. To communicate with remotes,
+   see <> or <>.
+
 [[def_remote_tracking_branch]]remote-tracking branch::
A <> that is used to follow changes from another
<>. It typically looks like
@@ -515,6 +520,18 @@ The most notable example is `HEAD`.
is created by giving the `--depth` option to linkgit:git-clone[1], and
its history can be later deepened with linkgit:git-fetch[1].
 
+[[def_submodule]]submodule::
+   A <> that holds the history of a
+   separate project inside another repository (the latter of
+   which is called <>). The
+   containing superproject knows about the names of (but does
+   not hold copies of) commit objects of the contained submodules.
+
+[[def_superproject]]superproject::
+   A <> that references other repositories
+   inside itself as <>. The superproject
+   tracks only the remote and the name of the submodule.
+
 [[def_symref]]symref::
Symbolic reference: instead of containing the <>
id itself, it is of the format 'ref: refs/some/thing' and when
-- 
2.4.1.345.gab207b6.dirty

--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Redirect "git" subcommand to itself?

2015-05-27 Thread Stefan Beller
Hi,

so I just run into this problem again (which happens to me maybe twice a week):
I want to do a git operations, so I type "git " into my shell, and
then I look around what
exactly I want to do and usually I find it in the help text of a
previous command such as
You are currently reverting commit 383c14b.
  (fix conflicts and run "git revert --continue")
  (use "git revert --abort" to cancel the revert operation)

then I copy the whole operation "git revert --abort" in this case and
paste it to the shell
and let go.
The result looks like
$ git git revert --abort
git: 'git' is not a git command. See 'git --help'.

Did you mean this?
init

I wonder if we want to make a "git" subcommand, which behaves exactly
the same as git itself?
Then "git git git status" would just return the same as "git status".

Thanks,
Stefan
--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH/RFC 1/2] git-rebase -i: Add key word "drop" to remove a commit

2015-05-27 Thread Philip Oakley

From: "Junio C Hamano" 

Matthieu Moy  writes:


I find it weird to write

noop  


True, but then it can be spelled

   #  

too, so do we still want 'drop'?  Unless we have a strong reason to
believe migrants from Hg cannot be (re)trained, personally, I'd feel
that we do not need this 'drop' thing.

To me, the addition of "drop" would be a better completion of the list 
of action verbs for 'normal' users.


Training/Retraining users to use atypical techniques is a never ending 
task, so making drop a synonym for the existing noop appeals to my 
experience of users (of all sorts of tools, including personal 
experience ;-).


--
Philip 


--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH] glossary: add "remote" and "submodule"

2015-05-27 Thread Stefan Beller
On Wed, May 27, 2015 at 4:05 PM, Junio C Hamano  wrote:
> Stefan Beller  writes:
>
 +[[def_submodule]]submodule::
 + A <> inside another repository. The two
 + repositories have different history, though the outer repository
 + knows the commit of the inner repository.
>>>
>> ... But correctness trumps brevity indeed.
>
> I do not think the correct way is that much longer, though.
>
> A repository inside another repository. The two repositories have different 
> history
> A repository that holds the history of a separate project inside another 
> repository
>
> Heh, they are the same length, no?
>
>>
>>>
>>>A repository that holds the history of a separate project
>>>inside another repository (the latter of which is called
>>>superproject).
>>
>> This is better than what I proposed, but confusing. When naming
>> a project a submodule, my mental standpoint is the superproject.
>> ("This project has the submodule foo and bar"). But In your description
>> the superproject is called "another repository".
>
> That is because you are adding an entry for "submodule" to the
> glossary, no?  I was writing from submodule's point of view, i.e. "I
> (submodule) is inside another repository, and my project is separate
> from that other repository's".

The submodule doesn't know it's a submodule though, so the point of view
"I (as a submodule)" only happens rarely in the real world?
I have a library in mind when talking about submodules. And the libraries
maintainer may not care if their library is used as a submodule or just
"make install"ed or just put somewhere in the filesystem

Usually submodules are only interesting from the superprojects point of view,
like "I want to upgrade libfoo now, so I make a commit changing the gitlink
of the submodule to point at that tag/commit"
That's why I found the presented perspective a bit strange.

>
>>>The containing superproject knows about the
>>>names of (but does not hold copies of) commit objects of the
>>>contained submodules.
>>
>> That makes sense to point out here. Though should we also introduce
>> "superproject" now?
>
> Yes, that is what I was hinting at.

ok
--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH] p4: Retrieve the right revision of the UTF-16 file

2015-05-27 Thread Miguel Torroja
Fixing bug with UTF-16 files when they are retrieved by git-p4.
It was always getting the tip version of the file and the history of the
file was lost.

Signed-off-by: Miguel Torroja 
---
 git-p4.py |2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/git-p4.py b/git-p4.py
index cdfa2df..be2c7da 100755
--- a/git-p4.py
+++ b/git-p4.py
@@ -2098,7 +2098,7 @@ class P4Sync(Command, P4UserMap):
 # them back too.  This is not needed to the cygwin windows version,
 # just the native "NT" type.
 #
-text = p4_read_pipe(['print', '-q', '-o', '-', file['depotFile']])
+text = p4_read_pipe(['print', '-q', '-o', '-', "%s@%s" % 
(file['depotFile'], file['change']) ])
 if p4_version_string().find("/NT") >= 0:
 text = text.replace("\r\n", "\n")
 contents = [ text ]
-- 
1.7.10.4

--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH] glossary: add "remote" and "submodule"

2015-05-27 Thread Junio C Hamano
Stefan Beller  writes:

>>> +[[def_submodule]]submodule::
>>> + A <> inside another repository. The two
>>> + repositories have different history, though the outer repository
>>> + knows the commit of the inner repository.
>>
> ... But correctness trumps brevity indeed.

I do not think the correct way is that much longer, though.

A repository inside another repository. The two repositories have different 
history
A repository that holds the history of a separate project inside another 
repository

Heh, they are the same length, no?

>
>>
>>A repository that holds the history of a separate project
>>inside another repository (the latter of which is called
>>superproject).
>
> This is better than what I proposed, but confusing. When naming
> a project a submodule, my mental standpoint is the superproject.
> ("This project has the submodule foo and bar"). But In your description
> the superproject is called "another repository".

That is because you are adding an entry for "submodule" to the
glossary, no?  I was writing from submodule's point of view, i.e. "I
(submodule) is inside another repository, and my project is separate
from that other repository's".

>>The containing superproject knows about the
>>names of (but does not hold copies of) commit objects of the
>>contained submodules.
>
> That makes sense to point out here. Though should we also introduce
> "superproject" now?

Yes, that is what I was hinting at.
--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH] glossary: add "remote" and "submodule"

2015-05-27 Thread Stefan Beller
On Wed, May 27, 2015 at 3:29 PM, Junio C Hamano  wrote:
> Stefan Beller  writes:
>
>> Noticed-by: Philip Oakley 
>> Signed-off-by: Stefan Beller 
>> ---
>>  Documentation/glossary-content.txt | 10 ++
>>  1 file changed, 10 insertions(+)
>>
>> diff --git a/Documentation/glossary-content.txt 
>> b/Documentation/glossary-content.txt
>> index bf383c2..e303135 100644
>> --- a/Documentation/glossary-content.txt
>> +++ b/Documentation/glossary-content.txt
>> @@ -469,6 +469,11 @@ The most notable example is `HEAD`.
>>   <> to describe the mapping between remote
>>   <> and local ref.
>>
>> +[[def_remote]]remote repository::
>> + A <> which is used to track the same
>> + project but resides somewhere else. To communicate with remotes,
>> + see <> or <>.
>> +
>
> OK.
>
>> @@ -515,6 +520,11 @@ The most notable example is `HEAD`.
>>   is created by giving the `--depth` option to linkgit:git-clone[1], and
>>   its history can be later deepened with linkgit:git-fetch[1].
>>
>> +[[def_submodule]]submodule::
>> + A <> inside another repository. The two
>> + repositories have different history, though the outer repository
>> + knows the commit of the inner repository.
>
> I'd stress that they are not just different histories (as the
> 'master' and the 'maint' branches of my project has different
> histories) but they are separate projects.  Perhaps like this?

This is a very subtle distinction IMHO, as both master and maint
"are the same project". Looking from enough distance, it's just the
git project without the fine detail of what makes these 2 histories different.
I tried coming up with a short paragraph, which may explain my choice
of words. But correctness trumps brevity indeed.

>
>A repository that holds the history of a separate project
>inside another repository (the latter of which is called
>superproject).

This is better than what I proposed, but confusing. When naming
a project a submodule, my mental standpoint is the superproject.
("This project has the submodule foo and bar"). But In your description
the superproject is called "another repository".

>The containing superproject knows about the
>names of (but does not hold copies of) commit objects of the
>contained submodules.

That makes sense to point out here. Though should we also introduce
"superproject" now?

>
> It is not like that it is strange or unintuitive that the
> superproject knows about some commits in its submodule.  "X, though
> Y" however makes it sound as if Y is true "despite X".  I do not
> think there is any "despite" here.
--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: Bug: .gitconfig folder

2015-05-27 Thread Junio C Hamano
Jeff King  writes:

>> -die_errno("Out of memory? mmap failed");
>> +die_errno("mmap failed");
>
> This is definitely an improvement, but the real failing of that error
> message is that it does not tell us that "~/.gitconfig" is the culprit.
> I don't think we can do much from xmmap, though; it does not have the
> filename. It would be nice if we got EISDIR from open() in the first
> place, but I don't think we can implement that efficiently (if we added
> an "xopen" that checked that, it would have to stat() every file we
> opened).

The patch was meant to be a tongue-in-cheek tangent that is a vast
improvement for cases where we absolutely need to use mmap but does
not help the OP at all ;-)  I do not think there is any need for the
config reader to read the existing file via mmap interface; just
open it, strbuf_read() the whole thing (and complain when it cannot)
and we should be ok.

Or do we write back through the mmaped region or something?

--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH] glossary: add "remote" and "submodule"

2015-05-27 Thread Junio C Hamano
Stefan Beller  writes:

> Noticed-by: Philip Oakley 
> Signed-off-by: Stefan Beller 
> ---
>  Documentation/glossary-content.txt | 10 ++
>  1 file changed, 10 insertions(+)
>
> diff --git a/Documentation/glossary-content.txt 
> b/Documentation/glossary-content.txt
> index bf383c2..e303135 100644
> --- a/Documentation/glossary-content.txt
> +++ b/Documentation/glossary-content.txt
> @@ -469,6 +469,11 @@ The most notable example is `HEAD`.
>   <> to describe the mapping between remote
>   <> and local ref.
>  
> +[[def_remote]]remote repository::
> + A <> which is used to track the same
> + project but resides somewhere else. To communicate with remotes,
> + see <> or <>.
> +

OK.

> @@ -515,6 +520,11 @@ The most notable example is `HEAD`.
>   is created by giving the `--depth` option to linkgit:git-clone[1], and
>   its history can be later deepened with linkgit:git-fetch[1].
>  
> +[[def_submodule]]submodule::
> + A <> inside another repository. The two
> + repositories have different history, though the outer repository
> + knows the commit of the inner repository.

I'd stress that they are not just different histories (as the
'master' and the 'maint' branches of my project has different
histories) but they are separate projects.  Perhaps like this?

   A repository that holds the history of a separate project
   inside another repository (the latter of which is called
   superproject).  The containing superproject knows about the
   names of (but does not hold copies of) commit objects of the
   contained submodules.

It is not like that it is strange or unintuitive that the
superproject knows about some commits in its submodule.  "X, though
Y" however makes it sound as if Y is true "despite X".  I do not
think there is any "despite" here.
--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: Bug: .gitconfig folder

2015-05-27 Thread Stefan Beller
On Wed, May 27, 2015 at 3:18 PM, Jeff King  wrote:
> On Wed, May 27, 2015 at 01:30:29PM -0700, Junio C Hamano wrote:
>
>> Jorge  writes:
>>
>> > If you have a folder named ~/.gitconfig instead of a file with that
>> > name, when you try to run some global config editing command it will
>> > fail with a wrong error message:
>> >
>> > "fatal: Out of memory? mmap failed: No such device"
>>
>> That indeed is a funny error message.
>>
>> How about this patch?
>>
>> -- >8 --
>> We show that message with die_errno(), but the OS is ought to know
>> why mmap(2) failed much better than we do.  There is no reason for
>> us to say "Out of memory?" here.
>>
>> Note that mmap(2) fails with ENODEV when the file you specify is not
>> something that can be mmap'ed, so you still need to know that "No
>> such device" can include cases like having a directory when a
>> regular file is expected, but we can expect that a user who creates
>> a directory to a location where a regular file is expected to be
>> would know what s/he is doing, hopefully ;-)
>>
>>  sha1_file.c | 2 +-
>>  1 file changed, 1 insertion(+), 1 deletion(-)
>>
>> diff --git a/sha1_file.c b/sha1_file.c
>> index ccc6dac..551a9e9 100644
>> --- a/sha1_file.c
>> +++ b/sha1_file.c
>> @@ -720,7 +720,7 @@ void *xmmap(void *start, size_t length,
>>   release_pack_memory(length);
>>   ret = mmap(start, length, prot, flags, fd, offset);
>>   if (ret == MAP_FAILED)
>> - die_errno("Out of memory? mmap failed");
>> + die_errno("mmap failed");
>>   }
>
> This is definitely an improvement, but the real failing of that error
> message is that it does not tell us that "~/.gitconfig" is the culprit.
> I don't think we can do much from xmmap, though; it does not have the
> filename. It would be nice if we got EISDIR from open() in the first
> place, but I don't think we can implement that efficiently (if we added
> an "xopen" that checked that, it would have to stat() every file we
> opened).

What is our thinking for after-fact recovery attempts?
Like we try the mmap first, if that fails we just use open to get the
contents of
the file. And when open fails, we can still print a nice error message?

>
> -Peff
> --
> To unsubscribe from this list: send the line "unsubscribe git" in
> the body of a message to majord...@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH 1/2] config: add options to list only variable names

2015-05-27 Thread Junio C Hamano
SZEDER Gábor  writes:

> diff --git a/builtin/config.c b/builtin/config.c
> index 7188405..38bcf83 100644
> --- a/builtin/config.c
> +++ b/builtin/config.c
> @@ -13,6 +13,7 @@ static char *key;
>  static regex_t *key_regexp;
>  static regex_t *regexp;
>  static int show_keys;
> +static int show_only_keys;

Is it just me who thinks this is a strange phrase?  Somehow these
words do not roll well on my tongue.

Perhaps "static int omit_values"?  Which would match what this part
does pretty well:

>  static int show_all_config(const char *key_, const char *value_, void *cb)
>  {
> - if (value_)
> + if (!show_only_keys && value_)

That is, "if not omitting values and there is a value, then do this".

> - return format_config(&values->items[values->nr++], key_, value_);
> + if (show_only_keys) {
> + struct strbuf *buf = &values->items[values->nr++];
> + strbuf_init(buf, 0);
> + strbuf_addstr(buf, key_);
> + strbuf_addch(buf, term);
> + return 0;

xstrfmt()?
--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: Bug: .gitconfig folder

2015-05-27 Thread Jeff King
On Wed, May 27, 2015 at 01:30:29PM -0700, Junio C Hamano wrote:

> Jorge  writes:
> 
> > If you have a folder named ~/.gitconfig instead of a file with that
> > name, when you try to run some global config editing command it will
> > fail with a wrong error message:
> >
> > "fatal: Out of memory? mmap failed: No such device"
> 
> That indeed is a funny error message.
> 
> How about this patch?
> 
> -- >8 --
> We show that message with die_errno(), but the OS is ought to know
> why mmap(2) failed much better than we do.  There is no reason for
> us to say "Out of memory?" here.
> 
> Note that mmap(2) fails with ENODEV when the file you specify is not
> something that can be mmap'ed, so you still need to know that "No
> such device" can include cases like having a directory when a
> regular file is expected, but we can expect that a user who creates
> a directory to a location where a regular file is expected to be
> would know what s/he is doing, hopefully ;-)
> 
>  sha1_file.c | 2 +-
>  1 file changed, 1 insertion(+), 1 deletion(-)
> 
> diff --git a/sha1_file.c b/sha1_file.c
> index ccc6dac..551a9e9 100644
> --- a/sha1_file.c
> +++ b/sha1_file.c
> @@ -720,7 +720,7 @@ void *xmmap(void *start, size_t length,
>   release_pack_memory(length);
>   ret = mmap(start, length, prot, flags, fd, offset);
>   if (ret == MAP_FAILED)
> - die_errno("Out of memory? mmap failed");
> + die_errno("mmap failed");
>   }

This is definitely an improvement, but the real failing of that error
message is that it does not tell us that "~/.gitconfig" is the culprit.
I don't think we can do much from xmmap, though; it does not have the
filename. It would be nice if we got EISDIR from open() in the first
place, but I don't think we can implement that efficiently (if we added
an "xopen" that checked that, it would have to stat() every file we
opened).

-Peff
--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH/WIP 6/8] am: extract patch, message and authorship with git-mailinfo

2015-05-27 Thread Jeff King
On Wed, May 27, 2015 at 01:44:26PM -0700, Junio C Hamano wrote:

> Paul Tan  writes:
> 
> > @@ -17,6 +34,10 @@ struct am_state {
> > struct strbuf dir;/* state directory path */
> > int cur;  /* current patch number */
> > int last; /* last patch number */
> > +   struct strbuf msg;/* commit message */
> > +   struct strbuf author_name;/* commit author's name */
> > +   struct strbuf author_email;   /* commit author's email */
> > +   struct strbuf author_date;/* commit author's date */
> > int prec; /* number of digits in patch filename */
> >  };
> 
> I always get suspicious when structure fields are overly commented,
> wondering if it is a sign of naming fields poorly.  All of the above
> fields look quite self-explanatory and I am not sure if it is worth
> having these comments, spending efforts to type SP many times to
> align them and all.

Just my 2 cents, but I think that grouping and overhead comments can
often make things more obvious. For example:

  struct am_state {
/* state directory path */
struct strbuf dir;

/*
 * current and last patch numbers; are these 1-indexed
 * or 0-indexed?
 */
int cur;
int last;

struct strbuf author_name;
struct strbuf author_email;
struct strbuf author_date;
struct strbuf msg;

/* number of digits in patch filename */
int prec;
  }

Note that by grouping "cur" and "last", we can discuss them as a group,
and the overhead comment gives us room to mention their shared
properties (my indexing question is a real question, btw, whose answer I
think would be useful to mention in a comment).

Likewise, by grouping the "msg" strbuf with the author information, it
becomes much more clear that they are all about the commit metadata
(though I would not be opposed to a comment above the whole block,
either).

-Peff
--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH/WIP 6/8] am: extract patch, message and authorship with git-mailinfo

2015-05-27 Thread Junio C Hamano
Paul Tan  writes:

> +static const char *msgnum(const struct am_state *state)
> +{
> + static struct strbuf fmt = STRBUF_INIT;
> + static struct strbuf sb = STRBUF_INIT;
> +
> + strbuf_reset(&fmt);
> + strbuf_addf(&fmt, "%%0%dd", state->prec);
> +
> + strbuf_reset(&sb);
> + strbuf_addf(&sb, fmt.buf, state->cur);

Hmph, wouldn't ("%*d", state->prec, state->cur) work or am I missing
something?

--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html



Release candidate of Git for Windows 2.x is out

2015-05-27 Thread Johannes Schindelin
Hi all,

I just uploaded release candidates for the upcoming Git for Windows 2.x 
release. Please find the download link here:

https://git-for-windows.github.io/#download

There are 32-bit and 64-bit versions both of regular installers and portable 
installers ("portable" meaning that they are .7z archives that can be unpacked 
anywhere and run in place, without any need for running an installer).

My projected time line is to hammer out the last kinks until Friday, and then 
continue after a one-week leave, if needed, and then finally retire msysGit and 
start the official 2.x release cycle of Git for Windows.

If you are running Windows and have a little time to spare, please test this 
release candidate thoroughly. If you find bugs, please first look at 
https://github.com/git-for-windows/git/issues (even the closed ones), and 
comment either on existing tickets or open new ones. It would be even cooler, 
of course, if you could open Pull Requests with fixes :-)

Ciao,
Johannes
--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH] p4: Retrieve the right revision of the UTF-16 file

2015-05-27 Thread Junio C Hamano
On Wed, May 27, 2015 at 3:04 PM, Luke Diamand  wrote:
> On 27/05/15 23:31, Miguel Torroja wrote:
>>
>> Fixing bug with UTF-16 files when they are retreived by git-p4.
>> It was always getting the tip version of the file and the history of the
>> file was lost.
>
> This looks sensible to me, and seems to work in some simple testing, thanks!
>
> Ack.
>
> Luke

Thanks; Miguel, please sign-off your patch; otherwise we cannot use it.

Thanks.

>> ---
>>   git-p4.py |2 +-
>>   1 file changed, 1 insertion(+), 1 deletion(-)
>>
>> diff --git a/git-p4.py b/git-p4.py
>> index cdfa2df..be2c7da 100755
>> --- a/git-p4.py
>> +++ b/git-p4.py
>> @@ -2098,7 +2098,7 @@ class P4Sync(Command, P4UserMap):
>>   # them back too.  This is not needed to the cygwin windows
>> version,
>>   # just the native "NT" type.
>>   #
>> -text = p4_read_pipe(['print', '-q', '-o', '-',
>> file['depotFile']])
>> +text = p4_read_pipe(['print', '-q', '-o', '-', "%s@%s" %
>> (file['depotFile'], file['change']) ])
>>   if p4_version_string().find("/NT") >= 0:
>>   text = text.replace("\r\n", "\n")
>>   contents = [ text ]
>>
>
--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH] p4: Retrieve the right revision of the UTF-16 file

2015-05-27 Thread Luke Diamand

On 27/05/15 23:31, Miguel Torroja wrote:

Fixing bug with UTF-16 files when they are retreived by git-p4.
It was always getting the tip version of the file and the history of the
file was lost.


This looks sensible to me, and seems to work in some simple testing, thanks!

Ack.

Luke



---
  git-p4.py |2 +-
  1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/git-p4.py b/git-p4.py
index cdfa2df..be2c7da 100755
--- a/git-p4.py
+++ b/git-p4.py
@@ -2098,7 +2098,7 @@ class P4Sync(Command, P4UserMap):
  # them back too.  This is not needed to the cygwin windows 
version,
  # just the native "NT" type.
  #
-text = p4_read_pipe(['print', '-q', '-o', '-', file['depotFile']])
+text = p4_read_pipe(['print', '-q', '-o', '-', "%s@%s" % 
(file['depotFile'], file['change']) ])
  if p4_version_string().find("/NT") >= 0:
  text = text.replace("\r\n", "\n")
  contents = [ text ]



--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH/WIP 2/8] wrapper: implement xfopen()

2015-05-27 Thread Jeff King
On Wed, May 27, 2015 at 09:33:32PM +0800, Paul Tan wrote:

> +/**
> + * xfopen() is the same as fopen(), but it die()s if the fopen() fails.
> + */
> +FILE *xfopen(const char *path, const char *mode)
> +{
> + FILE *fp;
> +
> + assert(path);
> + assert(mode);
> + fp = fopen(path, mode);
> + if (!fp) {
> + if (*mode == 'w' || *mode == 'a')
> + die_errno(_("could not open '%s' for writing"), path);

This misses "r+". I don't think we use that in our code currently, but
if we're going to introduce a wrapper like this, I think it makes sense
to cover all cases.

-Peff
--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH] Documentation: include 'merge.branchdesc' for merge and config as well

2015-05-27 Thread SZEDER Gábor
'merge.branchdesc' is only mentioned in the docs of 'git fmt-merge-msg'.

The description of 'merge.log' is already duplicated between
'merge-config.txt' and 'git-fmt-merge-msg.txt'; instead of duplicating the
description of another config variable, extract the descriptions of both
of these variables from 'git-fmt-merge-msg.txt' into a separate file and
include it there and in 'merge-config.txt'.

Leave 'merge.summary' only in git-fmt-merge-msg.txt, as it is marked for
deprecation.

Signed-off-by: SZEDER Gábor 
---
 Documentation/fmt-merge-msg-config.txt | 10 ++
 Documentation/git-fmt-merge-msg.txt| 12 +---
 Documentation/merge-config.txt |  6 +-
 3 files changed, 12 insertions(+), 16 deletions(-)
 create mode 100644 Documentation/fmt-merge-msg-config.txt

diff --git a/Documentation/fmt-merge-msg-config.txt 
b/Documentation/fmt-merge-msg-config.txt
new file mode 100644
index 00..c73cfa90b7
--- /dev/null
+++ b/Documentation/fmt-merge-msg-config.txt
@@ -0,0 +1,10 @@
+merge.branchdesc::
+   In addition to branch names, populate the log message with
+   the branch description text associated with them.  Defaults
+   to false.
+
+merge.log::
+   In addition to branch names, populate the log message with at
+   most the specified number of one-line descriptions from the
+   actual commits that are being merged.  Defaults to false, and
+   true is a synonym for 20.
diff --git a/Documentation/git-fmt-merge-msg.txt 
b/Documentation/git-fmt-merge-msg.txt
index bb1232a52c..55a9a4b93a 100644
--- a/Documentation/git-fmt-merge-msg.txt
+++ b/Documentation/git-fmt-merge-msg.txt
@@ -51,17 +51,7 @@ OPTIONS
 
 CONFIGURATION
 -
-
-merge.branchdesc::
-   In addition to branch names, populate the log message with
-   the branch description text associated with them.  Defaults
-   to false.
-
-merge.log::
-   In addition to branch names, populate the log message with at
-   most the specified number of one-line descriptions from the
-   actual commits that are being merged.  Defaults to false, and
-   true is a synonym for 20.
+include::fmt-merge-msg-config.txt[]
 
 merge.summary::
Synonym to `merge.log`; this is deprecated and will be removed in
diff --git a/Documentation/merge-config.txt b/Documentation/merge-config.txt
index 8a0e52f8ee..002ca58c21 100644
--- a/Documentation/merge-config.txt
+++ b/Documentation/merge-config.txt
@@ -26,11 +26,7 @@ merge.ff::
allowed (equivalent to giving the `--ff-only` option from the
command line).
 
-merge.log::
-   In addition to branch names, populate the log message with at
-   most the specified number of one-line descriptions from the
-   actual commits that are being merged.  Defaults to false, and
-   true is a synonym for 20.
+include::fmt-merge-msg-config.txt[]
 
 merge.renameLimit::
The number of files to consider when performing rename detection
-- 
2.4.2.349.g6883b65

--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH/WIP 1/8] wrapper: implement xopen()

2015-05-27 Thread Jeff King
On Wed, May 27, 2015 at 09:03:47PM +0200, Torsten Bögershausen wrote:

> The original open can take 2 or 3 parameters, how about this:
> int xopen(const char *path, int oflag, ... )
> {
> va_list params;
> int mode;
> int fd;
> 
> va_start(params, oflag);
> mode = va_arg(params, int);
> va_end(params);
> 
> fd = open(path, oflag, mode);

Don't you need a conditional on pulling the mode arg off the stack
(i.e., if O_CREAT is in the flags)?

-Peff
--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH/RFC 1/2] git-rebase -i: Add key word "drop" to remove a commit

2015-05-27 Thread Stefan Beller
On Wed, May 27, 2015 at 1:35 PM, Junio C Hamano  wrote:
> Matthieu Moy  writes:
>
>> Junio C Hamano  writes:
>>
>>> Matthieu Moy  writes:
>>>
 I find it weird to write

 noop  
>>>
>>> True, but then it can be spelled
>>>
>>> #  
>>
>> I do find it weird too. "#" means "comment", which means "do as if it
>> was not there" to me. And in this case it does change the semantics once
>> you activate the safety feature: error out without the "# 
>> ", rebase dropping the commit if the comment is present.
>
> Well, I do not agree with the premise that "A line was removed, the
> user may have made a mistake, we need to warn about it" is a good
> idea in the first place.  Removing an insn that is not wanted has
> been the way to skip and not replay a change from the beginning of
> the time, and users shouldn't be trained into thinking that somehow
> is a bad practice by having such an option that warns.

Talking about ideas:
I sometimes have the wrong branch checked out when doing a small
fixup commit. So I want to drop that patch from the current branch
and apply it to another branch. Maybe an instruction like
cherry-pick-to-branch-(and-do-not-apply-here) would help me there.

On the other hand I do understand the reasoning for having more
safety features in rebase as that exposes lots of power and many people
find the power a bit daunting.

So maybe you don't want to check the rebase instructions, but rather
after the fact, when the rebase is done:

$ git rebase -i origin/master
Successfully rebased and updated refs/heads/mytopic
Rebased the following commits:
0e33744 Document protocol version 2
6b6e3a7 t5544: add a test case for the new protocol
d6aff73 transport: get_refs_via_connect exchanges capabilities before refs.
cbb6089 transport: connect_setup appends protocol version number
0b86fa1 fetch-pack: use the configured transport protocol
23ed0ff remote.h: add get_remote_capabilities, request_capabilities
e18b6dc transport: add infrastructure to support a protocol version number
fd8d40d upload-pack-2: Implement the version 2 of upload-pack
bf781ae upload-pack: move capabilities out of send_ref
4c9cb59 upload-pack: make client capability parsing code a separate function
Dropped the following commits:
deadbee upload-pack: only accept capabilities on the first "want" line
New commits: (due to rewording, double picking, etc)
c0ffee1 More Documentation

I'd guess you would construct the information from the reflog
(The line before "rebase -i (start)" in the reflog) delta'd against HEAD,
so it's a crude incantation of git log maybe?

Also we need to turn this off for the power users, though I'd welcome if
we'd make it default on in git 3. (Being maximally verbose is good for new
users I assume, and turning it off is easy for advanced folks, so we can do
that for all porcelain commands?)

>
> --
> To unsubscribe from this list: send the line "unsubscribe git" in
> the body of a message to majord...@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [RFC/WIP PATCH 04/11] upload-pack-2: Implement the version 2 of upload-pack

2015-05-27 Thread Jeff King
On Wed, May 27, 2015 at 01:45:55PM -0700, Stefan Beller wrote:

> > Right, but I think (and please correct me if there's a case I'm
> > missing) that the behavior is the same whether it is spelled
> > "ping-pong" or "capability:ping-pong". That is, the rule for
> > "capability:" is "if you do not understand it, ignore it and do not
> > mention it in your capabilities; the server is required to assume
> > you were written before that capability was invented". But that is
> > _also_ the rule for ping-pong, I think.
> 
> The rules are the same, right. But the allowed characters are limited
> (in theory) as the regular expressions given for the capabilities
> don't allow for binary data for example, but only well formed ASCII
> text, space separated.  The "ping-pong" keyword could introduce a
> binary stream there including line feeds. (Today it sounds like a
> stupid idea though)

Do we need that restriction? IOW, as long as we parse from the start of
the packet and give up as soon as we realize it is not a thing we
understand, I do not think anybody is hurt by the contents of the item.

E.g., if an old client sees:

   00XXping-pong=

It knows:

  1. The item starts with ping-pong; we don't know what that is, so we
 never even bother looking at the binary goo.

  2. It's in a pkt-line. We read to the end of the packet line and throw
 the rest of the data away. Now we're synchronized to read the next
 item.

Of course, "ping-pong" may also introduce another phase to the protocol
which is not encapsulated in pkt-lines (e.g., if the data is too big to
fit right inside the capability pkt-line, or if it needs a lot of back
and forth like ref negotiation). But then we only proceed to that
phase if both sides have said "I understand ping-pong".

So I think we are capable of boot-strapping just about anything using
capability negotiation (with the exception of fixing the capability
negotiation itself; but even that, we can bootstrap a second more
intensive capability negotiation using a capability in the initial
list).

-Peff
--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH 1/2] config: add options to list only variable names

2015-05-27 Thread SZEDER Gábor


Quoting Jeff King :


On Wed, May 27, 2015 at 10:07:19PM +0200, SZEDER Gábor wrote:


Help the completion script by introducing the '--list-names' and
'--get-names-regexp' options, the "names-only" equivalents of '--list' and
'--get-regexp', so it doesn't have to separate variable names from their
values anymore.


Thanks, this sounds like the best solution. It should be a tiny bit more
efficient, too, though I doubt it matters much in practice.


-'git config' [] [-z|--null] -l | --list
+'git config' [] [-z|--null] -l | --list | --list-name


s/list-name/&s/, to match the code (and your commit message).


And note how I added an extra 's' to the other option in the commit message!


 cat > expect << EOF
+beta.noindent
+nextsection.nonewline
+123456.a123
+version.1.2.3eX.alpha
+EOF
+
+test_expect_success 'working --list-names' '
+   git config --list-names > output &&
+   test_cmp expect output
+'
+
+cat > expect << EOF


We usually avoid the extra space after redirection operators. But we
also usually match existing code. I'm not sure which is more evil in
this case. ;)


+test_expect_success '--get-name-regexp' '
+   git config --get-name-regexp in >output &&
+   test_cmp expect output
+'


This one is the odd man out if you are following existing style,
though.


Heh, in both cases I simply copied the existing "name-less" test, and  
only adjusted the expected output and the name of the option to test. :)


Will reroll.

Gábor
--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH 3/5] verify_lock(): report errors via a strbuf

2015-05-27 Thread Michael Haggerty
On 05/27/2015 09:48 PM, Junio C Hamano wrote:
> Michael Haggerty  writes:
> 
>> Instead of writing error messages directly to stderr, write them to a
>> "strbuf *err". In lock_ref_sha1_basic(), arrange for these errors to
>> be returned to its caller.
> 
> I had to scratch my head and view long outside the context before
> realizing that the caller lock_ref_sha1_basic() already arranges
> with its caller that errors from it are passed via the strbuf, and
> this change is just turning verify_lock(), a callee from it, follows
> that already established pattern.
> 
> Looks sensible, but the last sentence was misleading at least to me.
> 
>   The caller, lock_ref_sha1_basic(), uses this error reporting
>   convention with all the other callees, and reports its error
> this way to its callers.
> 
> perhaps?

+1

Thanks for clarifying this sentence.

Michael

-- 
Michael Haggerty
mhag...@alum.mit.edu

--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH] glossary: add "remote" and "submodule"

2015-05-27 Thread Stefan Beller
Noticed-by: Philip Oakley 
Signed-off-by: Stefan Beller 
---
 Documentation/glossary-content.txt | 10 ++
 1 file changed, 10 insertions(+)

diff --git a/Documentation/glossary-content.txt 
b/Documentation/glossary-content.txt
index bf383c2..e303135 100644
--- a/Documentation/glossary-content.txt
+++ b/Documentation/glossary-content.txt
@@ -469,6 +469,11 @@ The most notable example is `HEAD`.
<> to describe the mapping between remote
<> and local ref.
 
+[[def_remote]]remote repository::
+   A <> which is used to track the same
+   project but resides somewhere else. To communicate with remotes,
+   see <> or <>.
+
 [[def_remote_tracking_branch]]remote-tracking branch::
A <> that is used to follow changes from another
<>. It typically looks like
@@ -515,6 +520,11 @@ The most notable example is `HEAD`.
is created by giving the `--depth` option to linkgit:git-clone[1], and
its history can be later deepened with linkgit:git-fetch[1].
 
+[[def_submodule]]submodule::
+   A <> inside another repository. The two
+   repositories have different history, though the outer repository
+   knows the commit of the inner repository.
+
 [[def_symref]]symref::
Symbolic reference: instead of containing the <>
id itself, it is of the format 'ref: refs/some/thing' and when
-- 
2.4.1.345.gab207b6.dirty

--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH 1/2] config: add options to list only variable names

2015-05-27 Thread Jeff King
On Wed, May 27, 2015 at 05:04:38PM -0400, Jeff King wrote:

> > -'git config' [] [-z|--null] -l | --list
> > +'git config' [] [-z|--null] -l | --list | --list-name
> 
> s/list-name/&s/, to match the code (and your commit message).

Doh, just saw your "1.5".

FWIW, I expected "PATCH 1.5/2" to be "eh, I should have put this in
between patches 1 and 2". I expect a re-roll to be "v1.5" (or just
"v2").

This was the only real error in the patch, so your 1.5 looks OK to me.
Though I hope you will consider my other suggestions, too.

-Peff
--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH 2/2] completion: use new 'git config' options to reliably list variable names

2015-05-27 Thread Jeff King
On Wed, May 27, 2015 at 10:07:20PM +0200, SZEDER Gábor wrote:

> List all set config variable names with 'git config --list-names' instead
> of '--list' post processing.  Similarly, use 'git config
> --get-name-regexp' instead of '--get-regexp' to get config variables in a
> given section.
> 
> Signed-off-by: SZEDER Gábor 
> ---
>  contrib/completion/git-completion.bash | 15 +++
>  1 file changed, 3 insertions(+), 12 deletions(-)

Nice diffstat. The less hacky bash parsing we can do, the better.

-Peff
--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH 1/2] config: add options to list only variable names

2015-05-27 Thread Jeff King
On Wed, May 27, 2015 at 10:07:19PM +0200, SZEDER Gábor wrote:

> Help the completion script by introducing the '--list-names' and
> '--get-names-regexp' options, the "names-only" equivalents of '--list' and
> '--get-regexp', so it doesn't have to separate variable names from their
> values anymore.

Thanks, this sounds like the best solution. It should be a tiny bit more
efficient, too, though I doubt it matters much in practice.

> -'git config' [] [-z|--null] -l | --list
> +'git config' [] [-z|--null] -l | --list | --list-name

s/list-name/&s/, to match the code (and your commit message).

> @@ -161,6 +166,9 @@ See also <>.
>  --list::
>   List all variables set in config file.
>  
> +--list-name::
> + List the names of all variables set in config file.

Ditto here. Also, now that we have two similar modes, perhaps the
"--list" description above should become:

  List all variables set in config file, along with their values.

> @@ -165,7 +170,14 @@ static int collect_config(const char *key_, const char 
> *value_, void *cb)
>  
>   ALLOC_GROW(values->items, values->nr + 1, values->alloc);
>  
> - return format_config(&values->items[values->nr++], key_, value_);
> + if (show_only_keys) {
> + struct strbuf *buf = &values->items[values->nr++];
> + strbuf_init(buf, 0);
> + strbuf_addstr(buf, key_);
> + strbuf_addch(buf, term);
> + return 0;
> + } else
> + return format_config(&values->items[values->nr++], key_, 
> value_);
>  }

Might it flow a little better to always enter format_config, and then
just return early (before writing the value) when show_key_only is set?

>  cat > expect << EOF
> +beta.noindent
> +nextsection.nonewline
> +123456.a123
> +version.1.2.3eX.alpha
> +EOF
> +
> +test_expect_success 'working --list-names' '
> + git config --list-names > output &&
> + test_cmp expect output
> +'
> +
> +cat > expect << EOF

We usually avoid the extra space after redirection operators. But we
also usually match existing code. I'm not sure which is more evil in
this case. ;)

> +test_expect_success '--get-name-regexp' '
> + git config --get-name-regexp in >output &&
> + test_cmp expect output
> +'

This one is the odd man out if you are following existing style,
though.

The rest of the patch looks good to me.

-Peff
--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH v3 0/4] showing existing ws breakage

2015-05-27 Thread Junio C Hamano
Jeff King  writes:

> On Wed, May 27, 2015 at 01:46:26PM -0700, Junio C Hamano wrote:
>
>> Jeff King  writes:
>> 
>> > Do you want me to also eradicate PLAIN from the code itself? It's a
>> > rather simple change, but it does touch a lot of places.
>> 
>> Nah, that is not user-facing.  We do not do s/cache/index/ in the
>> code, either.
>> 
>> Besides, I actually find plain much easier to type than context ;-)
>
> OK. I just did it while our emails were in flight, so here it is just
> for reference.

I actually like that; the changes are fairly isolated and contained.

>
> -- >8 --
> Subject: diff.h: rename DIFF_PLAIN color slot to DIFF_CONTEXT
>
> The latter is a much more descriptive name (and we support
> "color.diff.context" now). This also updates the name of any
> local variables which were used to store the color.
>
> Signed-off-by: Jeff King 
> ---
>  combine-diff.c |  6 +++---
>  diff.c | 26 +-
>  diff.h |  2 +-
>  line-log.c |  6 +++---
>  4 files changed, 20 insertions(+), 20 deletions(-)
>
> diff --git a/combine-diff.c b/combine-diff.c
> index 8eb7278..30c7eb6 100644
> --- a/combine-diff.c
> +++ b/combine-diff.c
> @@ -730,7 +730,7 @@ static void dump_sline(struct sline *sline, const char 
> *line_prefix,
>   const char *c_func = diff_get_color(use_color, DIFF_FUNCINFO);
>   const char *c_new = diff_get_color(use_color, DIFF_FILE_NEW);
>   const char *c_old = diff_get_color(use_color, DIFF_FILE_OLD);
> - const char *c_plain = diff_get_color(use_color, DIFF_PLAIN);
> + const char *c_context = diff_get_color(use_color, DIFF_CONTEXT);
>   const char *c_reset = diff_get_color(use_color, DIFF_RESET);
>  
>   if (result_deleted)
> @@ -793,7 +793,7 @@ static void dump_sline(struct sline *sline, const char 
> *line_prefix,
>   }
>   if (comment_end)
>   printf("%s%s %s%s", c_reset,
> - c_plain, c_reset,
> + c_context, c_reset,
>   c_func);
>   for (i = 0; i < comment_end; i++)
>   putchar(hunk_comment[i]);
> @@ -828,7 +828,7 @@ static void dump_sline(struct sline *sline, const char 
> *line_prefix,
>*/
>   if (!context)
>   continue;
> - fputs(c_plain, stdout);
> + fputs(c_context, stdout);
>   }
>   else
>   fputs(c_new, stdout);
> diff --git a/diff.c b/diff.c
> index 27bd371..100773f 100644
> --- a/diff.c
> +++ b/diff.c
> @@ -42,7 +42,7 @@ static long diff_algorithm;
>  
>  static char diff_colors[][COLOR_MAXLEN] = {
>   GIT_COLOR_RESET,
> - GIT_COLOR_NORMAL,   /* PLAIN */
> + GIT_COLOR_NORMAL,   /* CONTEXT */
>   GIT_COLOR_BOLD, /* METAINFO */
>   GIT_COLOR_CYAN, /* FRAGINFO */
>   GIT_COLOR_RED,  /* OLD */
> @@ -55,7 +55,7 @@ static char diff_colors[][COLOR_MAXLEN] = {
>  static int parse_diff_color_slot(const char *var)
>  {
>   if (!strcasecmp(var, "context") || !strcasecmp(var, "plain"))
> - return DIFF_PLAIN;
> + return DIFF_CONTEXT;
>   if (!strcasecmp(var, "meta"))
>   return DIFF_METAINFO;
>   if (!strcasecmp(var, "frag"))
> @@ -501,7 +501,7 @@ static void emit_add_line(const char *reset,
>  static void emit_hunk_header(struct emit_callback *ecbdata,
>const char *line, int len)
>  {
> - const char *plain = diff_get_color(ecbdata->color_diff, DIFF_PLAIN);
> + const char *context = diff_get_color(ecbdata->color_diff, DIFF_CONTEXT);
>   const char *frag = diff_get_color(ecbdata->color_diff, DIFF_FRAGINFO);
>   const char *func = diff_get_color(ecbdata->color_diff, DIFF_FUNCINFO);
>   const char *reset = diff_get_color(ecbdata->color_diff, DIFF_RESET);
> @@ -518,7 +518,7 @@ static void emit_hunk_header(struct emit_callback 
> *ecbdata,
>   if (len < 10 ||
>   memcmp(line, atat, 2) ||
>   !(ep = memmem(line + 2, len - 2, atat, 2))) {
> - emit_line(ecbdata->opt, plain, reset, line, len);
> + emit_line(ecbdata->opt, context, reset, line, len);
>   return;
>   }
>   ep += 2; /* skip over @@ */
> @@ -540,7 +540,7 @@ static void emit_hunk_header(struct emit_callback 
> *ecbdata,
>   if (*ep != ' ' && *ep != '\t')
>   break;
>   if (ep != cp) {
> - strbuf_addstr(&msgbuf, plain);
> + strbuf_addstr(&msgbuf, context);
>   strbuf_add(&msgbuf, cp, ep - cp);
>   strbuf_addstr(&msgbuf, reset);
>   }
> @@ -623,10 +623,10 @@ static void emit_rewrite_lines(struct emit_callb

Re: [PATCH v3 0/4] showing existing ws breakage

2015-05-27 Thread Jeff King
On Wed, May 27, 2015 at 03:22:18AM -0400, Jeff King wrote:

> In color.diff.*, these are called "new", "old", and "plain". I am of the
> opinion that "context" is a far better name than "plain", but perhaps we
> should support both for consistency.
> 
> Here's a patch for the color.diff side, if we want to go that route.

So I had originally thought we would support both names in both places.
But since the diff patch we ended up with is basically "the real name is
context; plain is just a historical anomaly", I do not see any need to
support "plain" in your new whitespace code.

I suspect you came to the same conclusion independently, but I wanted to
make sure what I had written before didn't leave anybody confused.

-Peff
--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH v3 0/4] showing existing ws breakage

2015-05-27 Thread Jeff King
On Wed, May 27, 2015 at 01:46:26PM -0700, Junio C Hamano wrote:

> Jeff King  writes:
> 
> > Do you want me to also eradicate PLAIN from the code itself? It's a
> > rather simple change, but it does touch a lot of places.
> 
> Nah, that is not user-facing.  We do not do s/cache/index/ in the
> code, either.
> 
> Besides, I actually find plain much easier to type than context ;-)

OK. I just did it while our emails were in flight, so here it is just
for reference.

-- >8 --
Subject: diff.h: rename DIFF_PLAIN color slot to DIFF_CONTEXT

The latter is a much more descriptive name (and we support
"color.diff.context" now). This also updates the name of any
local variables which were used to store the color.

Signed-off-by: Jeff King 
---
 combine-diff.c |  6 +++---
 diff.c | 26 +-
 diff.h |  2 +-
 line-log.c |  6 +++---
 4 files changed, 20 insertions(+), 20 deletions(-)

diff --git a/combine-diff.c b/combine-diff.c
index 8eb7278..30c7eb6 100644
--- a/combine-diff.c
+++ b/combine-diff.c
@@ -730,7 +730,7 @@ static void dump_sline(struct sline *sline, const char 
*line_prefix,
const char *c_func = diff_get_color(use_color, DIFF_FUNCINFO);
const char *c_new = diff_get_color(use_color, DIFF_FILE_NEW);
const char *c_old = diff_get_color(use_color, DIFF_FILE_OLD);
-   const char *c_plain = diff_get_color(use_color, DIFF_PLAIN);
+   const char *c_context = diff_get_color(use_color, DIFF_CONTEXT);
const char *c_reset = diff_get_color(use_color, DIFF_RESET);
 
if (result_deleted)
@@ -793,7 +793,7 @@ static void dump_sline(struct sline *sline, const char 
*line_prefix,
}
if (comment_end)
printf("%s%s %s%s", c_reset,
-   c_plain, c_reset,
+   c_context, c_reset,
c_func);
for (i = 0; i < comment_end; i++)
putchar(hunk_comment[i]);
@@ -828,7 +828,7 @@ static void dump_sline(struct sline *sline, const char 
*line_prefix,
 */
if (!context)
continue;
-   fputs(c_plain, stdout);
+   fputs(c_context, stdout);
}
else
fputs(c_new, stdout);
diff --git a/diff.c b/diff.c
index 27bd371..100773f 100644
--- a/diff.c
+++ b/diff.c
@@ -42,7 +42,7 @@ static long diff_algorithm;
 
 static char diff_colors[][COLOR_MAXLEN] = {
GIT_COLOR_RESET,
-   GIT_COLOR_NORMAL,   /* PLAIN */
+   GIT_COLOR_NORMAL,   /* CONTEXT */
GIT_COLOR_BOLD, /* METAINFO */
GIT_COLOR_CYAN, /* FRAGINFO */
GIT_COLOR_RED,  /* OLD */
@@ -55,7 +55,7 @@ static char diff_colors[][COLOR_MAXLEN] = {
 static int parse_diff_color_slot(const char *var)
 {
if (!strcasecmp(var, "context") || !strcasecmp(var, "plain"))
-   return DIFF_PLAIN;
+   return DIFF_CONTEXT;
if (!strcasecmp(var, "meta"))
return DIFF_METAINFO;
if (!strcasecmp(var, "frag"))
@@ -501,7 +501,7 @@ static void emit_add_line(const char *reset,
 static void emit_hunk_header(struct emit_callback *ecbdata,
 const char *line, int len)
 {
-   const char *plain = diff_get_color(ecbdata->color_diff, DIFF_PLAIN);
+   const char *context = diff_get_color(ecbdata->color_diff, DIFF_CONTEXT);
const char *frag = diff_get_color(ecbdata->color_diff, DIFF_FRAGINFO);
const char *func = diff_get_color(ecbdata->color_diff, DIFF_FUNCINFO);
const char *reset = diff_get_color(ecbdata->color_diff, DIFF_RESET);
@@ -518,7 +518,7 @@ static void emit_hunk_header(struct emit_callback *ecbdata,
if (len < 10 ||
memcmp(line, atat, 2) ||
!(ep = memmem(line + 2, len - 2, atat, 2))) {
-   emit_line(ecbdata->opt, plain, reset, line, len);
+   emit_line(ecbdata->opt, context, reset, line, len);
return;
}
ep += 2; /* skip over @@ */
@@ -540,7 +540,7 @@ static void emit_hunk_header(struct emit_callback *ecbdata,
if (*ep != ' ' && *ep != '\t')
break;
if (ep != cp) {
-   strbuf_addstr(&msgbuf, plain);
+   strbuf_addstr(&msgbuf, context);
strbuf_add(&msgbuf, cp, ep - cp);
strbuf_addstr(&msgbuf, reset);
}
@@ -623,10 +623,10 @@ static void emit_rewrite_lines(struct emit_callback *ecb,
data += len;
}
if (!endp) {
-   const char *plain = diff_get_color(ecb->color_diff,
-  DIFF_PL

Re: [RFC/WIP PATCH 04/11] upload-pack-2: Implement the version 2 of upload-pack

2015-05-27 Thread Stefan Beller
On Wed, May 27, 2015 at 1:34 PM, Jeff King  wrote:
> On Wed, May 27, 2015 at 10:40:37AM -0700, Stefan Beller wrote:
>
>> > If we are upload-pack-2, should we advertise that in the capabilities? I
>> > think it may make things easier later if we try to provide some
>> > opportunistic out-of-band data. E.g., if see tell git-daemon:
>> >
>> >   git-upload-pack repo\0host=whatever\0\0version=2
>> >
>> > how do we know whether version=2 was understood and kicked us into v2
>> > mode, versus an old server that ignored it?
>>
>> So in my vision we would call git-upload-pack-2 instead of having a 
>> "version=2".
>> and if git-upload-pack-2 doesn't exist, the whole conversation is
>> over, the client
>> it is left to make up some good error message or retry version 1.
>
> I'd like for that to be a starting point for us, and then to be able to
> add-on "hints" to ease the transition path in whatever way we want. We
> may even not do that in the long run, but I want to leave the door open
> if we can.
>
>> But I think advertising both which versions the server could deal
>> with, as well as
>> the currently expected version is a good thing.
>>
>> capability: can_speak=1,2
>> capability: speaking_now=2
>
> I was thinking just "speaking_now=2", but it probably makes sense to do
> both. I do not think using it to "downgrade" will ever be particularly
> useful (certainly not from v2 to v1, since to understand the flag both
> sides must be v2 in the first place). But advertising that via the v1
> conversation will be a good way to tell the other side that upgrade is
> possible.

If for some reason we discover a flaw in the current version, which
makes it unusable
(a buffer overflow?, some stupid abuse which makes the capability list huge),
you may want to force downgrading (and in the very distant future when we are
current on version 4 and have dropped version 1 already, you can only downgrade
to 2 and 3, so I can see value in it.

Another idea to make it all more future proof:
"capability: speaking_now=2" must be sent as the first line, so then
you can adapt
on the client side easily for which version you are listening.

>
>> > Also, do we need the capability noise-word?
>>
>> I thought it opens up a new possible door in the future.
>> As we ignore anything not starting with "capability" for now, you
>> could introduce
>> your foo and bar ping pong easily and still be version 2 compatible.
>>
>> S: capability: thin
>> S: capability: another-capability
>> S: ping-pong foo
>> S: done
>> C: (not having understood ping-pong) just answering with capability: thin
>> C: done, let's proceed to refs advertisement
>>
>> The alternative client would do:
>>
>> C: ping-pong: foo-data1a
>> S: ping-pong: foo-data1b
>> C: ping-pong: foo-data2a
>> C: capability: thin
>> ...
>
> Right, but I think (and please correct me if there's a case I'm missing)
> that the behavior is the same whether it is spelled "ping-pong" or
> "capability:ping-pong". That is, the rule for "capability:" is "if you
> do not understand it, ignore it and do not mention it in your
> capabilities; the server is required to assume you were written before
> that capability was invented". But that is _also_ the rule for
> ping-pong, I think.

The rules are the same, right. But the allowed characters are limited
(in theory)
as the regular expressions given for the capabilities don't allow for
binary data
for example, but only well formed ASCII text, space separated.
The "ping-pong" keyword could introduce a binary stream there
including line feeds. (Today it sounds like a stupid idea though)

>
>> > Eric mentioned the underflow problems here, but I wonder even more:
>> > what's wrong with the global ends_with() that we already provide?
>>
>> I was missing knowledge we have that, and apparently I was thinking it's
>> faster to come up with my own version than to look for it. :)
>
> Makes sense. :)
>
> -Peff
--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH v3 0/4] showing existing ws breakage

2015-05-27 Thread Junio C Hamano
Jeff King  writes:

> Do you want me to also eradicate PLAIN from the code itself? It's a
> rather simple change, but it does touch a lot of places.

Nah, that is not user-facing.  We do not do s/cache/index/ in the
code, either.

Besides, I actually find plain much easier to type than context ;-)
--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH/WIP 6/8] am: extract patch, message and authorship with git-mailinfo

2015-05-27 Thread Junio C Hamano
Paul Tan  writes:

> @@ -17,6 +34,10 @@ struct am_state {
>   struct strbuf dir;/* state directory path */
>   int cur;  /* current patch number */
>   int last; /* last patch number */
> + struct strbuf msg;/* commit message */
> + struct strbuf author_name;/* commit author's name */
> + struct strbuf author_email;   /* commit author's email */
> + struct strbuf author_date;/* commit author's date */
>   int prec; /* number of digits in patch filename */
>  };

I always get suspicious when structure fields are overly commented,
wondering if it is a sign of naming fields poorly.  All of the above
fields look quite self-explanatory and I am not sure if it is worth
having these comments, spending efforts to type SP many times to
align them and all.

By the way, the overall structure of the series look sensible.

> +static int read_author_script(struct am_state *state)
> +{
> + char *value;
> + struct strbuf sb = STRBUF_INIT;
> + const char *filename = am_path(state, "author-script");
> + FILE *fp = fopen(filename, "r");
> + if (!fp) {
> + if (errno == ENOENT)
> + return 0;
> + die(_("could not open '%s' for reading"), filename);

Hmph, do we want to report with die_errno()?

> + }
> +
> + if (strbuf_getline(&sb, fp, '\n'))
> + return -1;
> + if (!skip_prefix(sb.buf, "GIT_AUTHOR_NAME=", (const char**) &value))

This cast is unfortunate; can't "value" be of "const char *" type?
--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH/WIP 3/8] am: implement patch queue mechanism

2015-05-27 Thread Junio C Hamano
Paul Tan  writes:

>  Makefile |   2 +-
>  builtin.h|   1 +
>  builtin/am.c | 167 
> +++
>  git.c|   1 +
>  4 files changed, 170 insertions(+), 1 deletion(-)
>  create mode 100644 builtin/am.c
>
> diff --git a/Makefile b/Makefile
> index 323c401..57a7c8c 100644
> --- a/Makefile
> +++ b/Makefile
> @@ -466,7 +466,6 @@ TEST_PROGRAMS_NEED_X =
>  # interactive shell sessions without exporting it.
>  unexport CDPATH
>  
> -SCRIPT_SH += git-am.sh

If you are building this "new am" incrementally (and for something
complex like "am", that's the only sensible way), perhaps it is a
good idea to do the "competing implementation" trick I suggested
earlier when we were discussing your "new pull" patches, to allow
you to keep both versions and switch between them at runtime.  That
way, you can run tests, both existing ones and new ones you add, on
both versions to make sure they behave the same way.
--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH v3 0/4] showing existing ws breakage

2015-05-27 Thread Jeff King
On Wed, May 27, 2015 at 11:57:15AM -0700, Junio C Hamano wrote:

> > -- >8 --
> > Subject: diff: accept color.diff.context as a synonym for "plain"
> >
> > The term "plain" is a bit ambiguous; let's allow the more
> > specific "context", but keep "plain" around for
> > compatibility.
> >
> > Signed-off-by: Jeff King 
> > ---
> > I didn't bother mentioning the historical "plain" in the documentation.
> > I don't know if it's better to (for people who find it in the wild and
> > wonder what it means) or if it simply clutters the description.
> 
> 'plain' does sound a misnomer, as these slot names are about "what"
> are painted, not "how" they are painted.  The latter is what their
> values represent.  Whoever named that slot was confused by the fact
> that 'context' (i.e. "what") lines are by default painted in 'plain'
> color without frills (i.e. "how").
> 
> We usually try to give a brief mention to historical names primarily
> to silence those who pick up stale information from the Web, get
> curious, and then complain loudly after finding that we no longer
> document them even though we keep accepting them silently, so I am
> somewhat tempted to do this on top.

Yeah, I waffled on doing it myself. If you take the patch, please do
squash that in.

Do you want me to also eradicate PLAIN from the code itself? It's a
rather simple change, but it does touch a lot of places.

-Peff
--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH/RFC 1/2] git-rebase -i: Add key word "drop" to remove a commit

2015-05-27 Thread Junio C Hamano
Matthieu Moy  writes:

> Junio C Hamano  writes:
>
>> Matthieu Moy  writes:
>>
>>> I find it weird to write
>>>
>>> noop  
>>
>> True, but then it can be spelled
>>
>> #  
>
> I do find it weird too. "#" means "comment", which means "do as if it
> was not there" to me. And in this case it does change the semantics once
> you activate the safety feature: error out without the "# 
> ", rebase dropping the commit if the comment is present.

Well, I do not agree with the premise that "A line was removed, the
user may have made a mistake, we need to warn about it" is a good
idea in the first place.  Removing an insn that is not wanted has
been the way to skip and not replay a change from the beginning of
the time, and users shouldn't be trained into thinking that somehow
is a bad practice by having such an option that warns.

--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [RFC/WIP PATCH 04/11] upload-pack-2: Implement the version 2 of upload-pack

2015-05-27 Thread Jeff King
On Wed, May 27, 2015 at 10:40:37AM -0700, Stefan Beller wrote:

> > If we are upload-pack-2, should we advertise that in the capabilities? I
> > think it may make things easier later if we try to provide some
> > opportunistic out-of-band data. E.g., if see tell git-daemon:
> >
> >   git-upload-pack repo\0host=whatever\0\0version=2
> >
> > how do we know whether version=2 was understood and kicked us into v2
> > mode, versus an old server that ignored it?
> 
> So in my vision we would call git-upload-pack-2 instead of having a 
> "version=2".
> and if git-upload-pack-2 doesn't exist, the whole conversation is
> over, the client
> it is left to make up some good error message or retry version 1.

I'd like for that to be a starting point for us, and then to be able to
add-on "hints" to ease the transition path in whatever way we want. We
may even not do that in the long run, but I want to leave the door open
if we can.

> But I think advertising both which versions the server could deal
> with, as well as
> the currently expected version is a good thing.
> 
> capability: can_speak=1,2
> capability: speaking_now=2

I was thinking just "speaking_now=2", but it probably makes sense to do
both. I do not think using it to "downgrade" will ever be particularly
useful (certainly not from v2 to v1, since to understand the flag both
sides must be v2 in the first place). But advertising that via the v1
conversation will be a good way to tell the other side that upgrade is
possible.

> > Also, do we need the capability noise-word?
> 
> I thought it opens up a new possible door in the future.
> As we ignore anything not starting with "capability" for now, you
> could introduce
> your foo and bar ping pong easily and still be version 2 compatible.
> 
> S: capability: thin
> S: capability: another-capability
> S: ping-pong foo
> S: done
> C: (not having understood ping-pong) just answering with capability: thin
> C: done, let's proceed to refs advertisement
> 
> The alternative client would do:
> 
> C: ping-pong: foo-data1a
> S: ping-pong: foo-data1b
> C: ping-pong: foo-data2a
> C: capability: thin
> ...

Right, but I think (and please correct me if there's a case I'm missing)
that the behavior is the same whether it is spelled "ping-pong" or
"capability:ping-pong". That is, the rule for "capability:" is "if you
do not understand it, ignore it and do not mention it in your
capabilities; the server is required to assume you were written before
that capability was invented". But that is _also_ the rule for
ping-pong, I think.

> > Eric mentioned the underflow problems here, but I wonder even more:
> > what's wrong with the global ends_with() that we already provide?
> 
> I was missing knowledge we have that, and apparently I was thinking it's
> faster to come up with my own version than to look for it. :)

Makes sense. :)

-Peff
--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH] p4: Retrieve the right revision of the UTF-16 file

2015-05-27 Thread Miguel Torroja
Fixing bug with UTF-16 files when they are retreived by git-p4.
It was always getting the tip version of the file and the history of the
file was lost.
---
 git-p4.py |2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/git-p4.py b/git-p4.py
index cdfa2df..be2c7da 100755
--- a/git-p4.py
+++ b/git-p4.py
@@ -2098,7 +2098,7 @@ class P4Sync(Command, P4UserMap):
 # them back too.  This is not needed to the cygwin windows version,
 # just the native "NT" type.
 #
-text = p4_read_pipe(['print', '-q', '-o', '-', file['depotFile']])
+text = p4_read_pipe(['print', '-q', '-o', '-', "%s@%s" % 
(file['depotFile'], file['change']) ])
 if p4_version_string().find("/NT") >= 0:
 text = text.replace("\r\n", "\n")
 contents = [ text ]
-- 
1.7.10.4

--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: Bug: .gitconfig folder

2015-05-27 Thread Junio C Hamano
Jorge  writes:

> If you have a folder named ~/.gitconfig instead of a file with that
> name, when you try to run some global config editing command it will
> fail with a wrong error message:
>
> "fatal: Out of memory? mmap failed: No such device"

That indeed is a funny error message.

How about this patch?

-- >8 --
We show that message with die_errno(), but the OS is ought to know
why mmap(2) failed much better than we do.  There is no reason for
us to say "Out of memory?" here.

Note that mmap(2) fails with ENODEV when the file you specify is not
something that can be mmap'ed, so you still need to know that "No
such device" can include cases like having a directory when a
regular file is expected, but we can expect that a user who creates
a directory to a location where a regular file is expected to be
would know what s/he is doing, hopefully ;-)

 sha1_file.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/sha1_file.c b/sha1_file.c
index ccc6dac..551a9e9 100644
--- a/sha1_file.c
+++ b/sha1_file.c
@@ -720,7 +720,7 @@ void *xmmap(void *start, size_t length,
release_pack_memory(length);
ret = mmap(start, length, prot, flags, fd, offset);
if (ret == MAP_FAILED)
-   die_errno("Out of memory? mmap failed");
+   die_errno("mmap failed");
}
return ret;
 }
--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [RFC/WIP PATCH 05/11] transport: add infrastructure to support a protocol version number

2015-05-27 Thread Jeff King
On Wed, May 27, 2015 at 12:01:50PM -0700, Stefan Beller wrote:

> > Interesting choice for the short option ("-v" would be nice, but
> > obviously it is taken). Do we want to delay on claiming the
> > short-and-sweet 'y' until we are sure this is something people will use
> > a lot? In an ideal world, it is not (i.e., auto-upgrade and other tricks
> > become good enough that nobody bothers to specify it manually).
> [...]
> Or do you rather hint on dropping the short option at all, and just having 
> NULL
> in the field?

Yes, that's what I was hinting.

-Peff
--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [RFC/WIP PATCH 04/11] upload-pack-2: Implement the version 2 of upload-pack

2015-05-27 Thread Jeff King
On Wed, May 27, 2015 at 01:30:28PM -0400, Eric Sunshine wrote:

> > Like Eric, I find the whole next_capability thing a little ugly. His
> > suggestion to pass in the parsing state is an improvement, but I wonder
> > why we need to parse at all. Can we keep the capabilities as:
> >
> >   const char *capabilities[] = {
> > "multi_ack",
> > "thin-pack",
> > ... etc ...
> >   };
> >
> > and then loop over the array?
> 
> Yes, that would be much nicer. I also had this in mind but didn't know
> if there was a strong reason for the capabilities to be shoehorned
> into a single string as they are currently.

I don't think there is a good reason, beyond it being the simplest thing
for the current code to work. But as you can see from the existing
packet_write() in upload-pack, it's already going through some
contortions to handle optional capabilities (i.e., "capabilities" is by
no means the full list anymore).

Doing it item by item will mean we can't use a single packet_write() in
the v1 code, but it's OK to format into a buffer here (we already need
such a buffer for format_symref_info anyway).

-Peff
--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH 1.5/2] config: add options to list only variable names

2015-05-27 Thread SZEDER Gábor
Recenty I created a multi-line branch description with '.' and '='
characters on one of the lines, and noticed that fragments of that line
show up when completing set variable names for 'git config', e.g.:

  $ git config --get branch.b.description
  Branch description to fool the completion script with a
  second line containing dot . and equals = characters.
  $ git config --unset 
  ...
  second line containing dot . and equals
  ...

The completion script runs 'git config --list' and processes its output to
strip the values and keep only the variable names.  It does so by looking
for lines containing '.' and '=' and outputting everything before the '=',
which was fooled by my multi-line branch description.

A similar issue exists with aliases and pretty format aliases with
multi-line values, but in that case 'git config --get-regexp' is run and
subsequent lines don't have to contain either '.' or '=' to fool the
completion script.

Though 'git config' can produce null-terminated output for newline-safe
parsing, that's of no use in this case, becase we can't cope with nulls in
the shell.

Help the completion script by introducing the '--list-names' and
'--get-names-regexp' options, the "names-only" equivalents of '--list' and
'--get-regexp', so it doesn't have to separate variable names from their
values anymore.

Signed-off-by: SZEDER Gábor 
---
D'oh, misspelled the option in the docs...

 Documentation/git-config.txt   | 10 +-
 builtin/config.c   | 22 ++
 contrib/completion/git-completion.bash |  4 ++--
 t/t1300-repo-config.sh | 22 ++
 4 files changed, 51 insertions(+), 7 deletions(-)

diff --git a/Documentation/git-config.txt b/Documentation/git-config.txt
index 02ec096faa..fd519f81d8 100644
--- a/Documentation/git-config.txt
+++ b/Documentation/git-config.txt
@@ -16,11 +16,12 @@ SYNOPSIS
 'git config' [] [type] [-z|--null] --get-all name [value_regex]
 'git config' [] [type] [-z|--null] --get-regexp name_regex 
[value_regex]
 'git config' [] [type] [-z|--null] --get-urlmatch name URL
+'git config' [] [-z|--null] --get-name-regexp name_regex
 'git config' [] --unset name [value_regex]
 'git config' [] --unset-all name [value_regex]
 'git config' [] --rename-section old_name new_name
 'git config' [] --remove-section name
-'git config' [] [-z|--null] -l | --list
+'git config' [] [-z|--null] -l | --list | --list-names
 'git config' [] --get-color name [default]
 'git config' [] --get-colorbool name [stdout-is-tty]
 'git config' [] -e | --edit
@@ -96,6 +97,10 @@ OPTIONS
in which section and variable names are lowercased, but subsection
names are not.
 
+--get-name-regexp::
+   Like --get-regexp, but shows only matching variable names, not its
+   values.
+
 --get-urlmatch name URL::
When given a two-part name section.key, the value for
section..key whose  part matches the best to the
@@ -161,6 +166,9 @@ See also <>.
 --list::
List all variables set in config file.
 
+--list-names::
+   List the names of all variables set in config file.
+
 --bool::
'git config' will ensure that the output is "true" or "false"
 
diff --git a/builtin/config.c b/builtin/config.c
index 7188405f7e..38bcf838c5 100644
--- a/builtin/config.c
+++ b/builtin/config.c
@@ -13,6 +13,7 @@ static char *key;
 static regex_t *key_regexp;
 static regex_t *regexp;
 static int show_keys;
+static int show_only_keys;
 static int use_key_regexp;
 static int do_all;
 static int do_not_match;
@@ -43,6 +44,8 @@ static int respect_includes = -1;
 #define ACTION_GET_COLOR (1<<13)
 #define ACTION_GET_COLORBOOL (1<<14)
 #define ACTION_GET_URLMATCH (1<<15)
+#define ACTION_LIST_NAMES (1<<16)
+#define ACTION_GET_NAME_REGEXP (1<<17)
 
 #define TYPE_BOOL (1<<0)
 #define TYPE_INT (1<<1)
@@ -60,6 +63,7 @@ static struct option builtin_config_options[] = {
OPT_BIT(0, "get", &actions, N_("get value: name [value-regex]"), 
ACTION_GET),
OPT_BIT(0, "get-all", &actions, N_("get all values: key 
[value-regex]"), ACTION_GET_ALL),
OPT_BIT(0, "get-regexp", &actions, N_("get values for regexp: 
name-regex [value-regex]"), ACTION_GET_REGEXP),
+   OPT_BIT(0, "get-name-regexp", &actions, N_("get names for regexp: 
name-regex"), ACTION_GET_NAME_REGEXP),
OPT_BIT(0, "get-urlmatch", &actions, N_("get value specific for the 
URL: section[.var] URL"), ACTION_GET_URLMATCH),
OPT_BIT(0, "replace-all", &actions, N_("replace all matching variables: 
name value [value_regex]"), ACTION_REPLACE_ALL),
OPT_BIT(0, "add", &actions, N_("add a new variable: name value"), 
ACTION_ADD),
@@ -68,6 +72,7 @@ static struct option builtin_config_options[] = {
OPT_BIT(0, "rename-section", &actions, N_("rename section: old-name 
new-name"), ACTION_RENAME_SECTION),
OPT_BIT(0, "remove-section", &actions, N_("remove a section: name"), 
ACTION_REMOVE_SECTION),
OPT_BIT('l', "list", 

Re: [RFC/WIP PATCH 06/11] remote.h: add get_remote_capabilities, request_capabilities

2015-05-27 Thread Jeff King
On Wed, May 27, 2015 at 01:19:39PM -0400, Eric Sunshine wrote:

> >> The 'len > 4' check is needed because there's no guarantee that 'line'
> >> is NUL-terminated. Correct?
> >
> > I think this was just blindly copied from get_remote_heads(). And I
> > think that code was being overly paranoid. Ever since f3a3214 (Make
> > send/receive-pack be closer to doing something interesting, 2005-06-29),
> > the pkt-line reader will add an extra NUL to the buffer to ease cases
> > like this.
> 
> Thanks. I had started digging into packet_read() to determine whether
> it guaranteed NUL-termination, but didn't get far enough to decide. I
> agree that if NUL-termination is guaranteed, then the 'len > 4' check
> is superfluous (and confusing, which is why it caught my attention in
> the first place).

Yeah, agreed that it should be cleaned up. Interestingly, if you dig on
that line, I've touched it several times myself and never noticed this.
:)

-Peff
--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH v6] send-email: Add sendmail email aliases format

2015-05-27 Thread Junio C Hamano
Allen Hubbe  writes:

> Add support for the sendmail email aliases format.

Thanks.

> ** Note: A general 'where to find documentation' paragraph will be added
>by Junio, appearing either before or after this patch in the series.

You didn't have to do this to me; as long as you agree with me that
the paragraph is a good thing to have, it is OK (and even more
preferable) to include it in this patch.

That's called collaboration.

If other person's contribution was really significant and the change
can stand on its own, then a split two-patch series with the author
set to the other person may not be a bad idea, and if other person's
contribution was really significant but the change by the other
person cannot stand on its own, "Helped-by" in the log message would
be sufficient.  My contribution in this case is much less than that.

> ** Note: A fix to other tests to eliminate the use of tilde for the home
>dir will be added by Junio, appearing either before or after this
>patch in the series.

That is a sensible thing to do, as it does not relate to this
change.

Thanks.  Will queue and let's start merging this topic to 'next' and
down.
--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH 1/2] config: add options to list only variable names

2015-05-27 Thread SZEDER Gábor
Recenty I created a multi-line branch description with '.' and '='
characters on one of the lines, and noticed that fragments of that line
show up when completing set variable names for 'git config', e.g.:

  $ git config --get branch.b.description
  Branch description to fool the completion script with a
  second line containing dot . and equals = characters.
  $ git config --unset 
  ...
  second line containing dot . and equals
  ...

The completion script runs 'git config --list' and processes its output to
strip the values and keep only the variable names.  It does so by looking
for lines containing '.' and '=' and outputting everything before the '=',
which was fooled by my multi-line branch description.

A similar issue exists with aliases and pretty format aliases with
multi-line values, but in that case 'git config --get-regexp' is run and
subsequent lines don't have to contain either '.' or '=' to fool the
completion script.

Though 'git config' can produce null-terminated output for newline-safe
parsing, that's of no use in this case, becase we can't cope with nulls in
the shell.

Help the completion script by introducing the '--list-names' and
'--get-names-regexp' options, the "names-only" equivalents of '--list' and
'--get-regexp', so it doesn't have to separate variable names from their
values anymore.

Signed-off-by: SZEDER Gábor 
---
 Documentation/git-config.txt   | 10 +-
 builtin/config.c   | 22 ++
 contrib/completion/git-completion.bash |  4 ++--
 t/t1300-repo-config.sh | 22 ++
 4 files changed, 51 insertions(+), 7 deletions(-)

diff --git a/Documentation/git-config.txt b/Documentation/git-config.txt
index 02ec096..e0d27d5 100644
--- a/Documentation/git-config.txt
+++ b/Documentation/git-config.txt
@@ -16,11 +16,12 @@ SYNOPSIS
 'git config' [] [type] [-z|--null] --get-all name [value_regex]
 'git config' [] [type] [-z|--null] --get-regexp name_regex 
[value_regex]
 'git config' [] [type] [-z|--null] --get-urlmatch name URL
+'git config' [] [-z|--null] --get-name-regexp name_regex
 'git config' [] --unset name [value_regex]
 'git config' [] --unset-all name [value_regex]
 'git config' [] --rename-section old_name new_name
 'git config' [] --remove-section name
-'git config' [] [-z|--null] -l | --list
+'git config' [] [-z|--null] -l | --list | --list-name
 'git config' [] --get-color name [default]
 'git config' [] --get-colorbool name [stdout-is-tty]
 'git config' [] -e | --edit
@@ -96,6 +97,10 @@ OPTIONS
in which section and variable names are lowercased, but subsection
names are not.
 
+--get-name-regexp::
+   Like --get-regexp, but shows only matching variable names, not its
+   values.
+
 --get-urlmatch name URL::
When given a two-part name section.key, the value for
section..key whose  part matches the best to the
@@ -161,6 +166,9 @@ See also <>.
 --list::
List all variables set in config file.
 
+--list-name::
+   List the names of all variables set in config file.
+
 --bool::
'git config' will ensure that the output is "true" or "false"
 
diff --git a/builtin/config.c b/builtin/config.c
index 7188405..38bcf83 100644
--- a/builtin/config.c
+++ b/builtin/config.c
@@ -13,6 +13,7 @@ static char *key;
 static regex_t *key_regexp;
 static regex_t *regexp;
 static int show_keys;
+static int show_only_keys;
 static int use_key_regexp;
 static int do_all;
 static int do_not_match;
@@ -43,6 +44,8 @@ static int respect_includes = -1;
 #define ACTION_GET_COLOR (1<<13)
 #define ACTION_GET_COLORBOOL (1<<14)
 #define ACTION_GET_URLMATCH (1<<15)
+#define ACTION_LIST_NAMES (1<<16)
+#define ACTION_GET_NAME_REGEXP (1<<17)
 
 #define TYPE_BOOL (1<<0)
 #define TYPE_INT (1<<1)
@@ -60,6 +63,7 @@ static struct option builtin_config_options[] = {
OPT_BIT(0, "get", &actions, N_("get value: name [value-regex]"), 
ACTION_GET),
OPT_BIT(0, "get-all", &actions, N_("get all values: key 
[value-regex]"), ACTION_GET_ALL),
OPT_BIT(0, "get-regexp", &actions, N_("get values for regexp: 
name-regex [value-regex]"), ACTION_GET_REGEXP),
+   OPT_BIT(0, "get-name-regexp", &actions, N_("get names for regexp: 
name-regex"), ACTION_GET_NAME_REGEXP),
OPT_BIT(0, "get-urlmatch", &actions, N_("get value specific for the 
URL: section[.var] URL"), ACTION_GET_URLMATCH),
OPT_BIT(0, "replace-all", &actions, N_("replace all matching variables: 
name value [value_regex]"), ACTION_REPLACE_ALL),
OPT_BIT(0, "add", &actions, N_("add a new variable: name value"), 
ACTION_ADD),
@@ -68,6 +72,7 @@ static struct option builtin_config_options[] = {
OPT_BIT(0, "rename-section", &actions, N_("rename section: old-name 
new-name"), ACTION_RENAME_SECTION),
OPT_BIT(0, "remove-section", &actions, N_("remove a section: name"), 
ACTION_REMOVE_SECTION),
OPT_BIT('l', "list", &actions, N_("list all"), ACTION_LIST),
+   OPT_BIT(0,

[PATCH 2/2] completion: use new 'git config' options to reliably list variable names

2015-05-27 Thread SZEDER Gábor
List all set config variable names with 'git config --list-names' instead
of '--list' post processing.  Similarly, use 'git config
--get-name-regexp' instead of '--get-regexp' to get config variables in a
given section.

Signed-off-by: SZEDER Gábor 
---
 contrib/completion/git-completion.bash | 15 +++
 1 file changed, 3 insertions(+), 12 deletions(-)

diff --git a/contrib/completion/git-completion.bash 
b/contrib/completion/git-completion.bash
index 6abbd56..121aa31 100644
--- a/contrib/completion/git-completion.bash
+++ b/contrib/completion/git-completion.bash
@@ -744,9 +744,8 @@ __git_compute_porcelain_commands ()
 __git_get_config_variables ()
 {
local section="$1" i IFS=$'\n'
-   for i in $(git --git-dir="$(__gitdir)" config --get-regexp 
"^$section\..*" 2>/dev/null); do
-   i="${i#$section.}"
-   echo "${i/ */}"
+   for i in $(git --git-dir="$(__gitdir)" config --get-name-regexp 
"^$section\..*" 2>/dev/null); do
+   echo "${i#$section.}"
done
 }
 
@@ -1774,15 +1773,7 @@ __git_config_get_set_variables ()
c=$((--c))
done
 
-   git --git-dir="$(__gitdir)" config $config_file --list 2>/dev/null |
-   while read -r line
-   do
-   case "$line" in
-   *.*=*)
-   echo "${line/=*/}"
-   ;;
-   esac
-   done
+   git --git-dir="$(__gitdir)" config $config_file --list-names 2>/dev/null
 }
 
 _git_config ()
-- 
2.4.2.347.ge926c0d

--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH 0/5] Fix verify_lock() to report errors via strbuf

2015-05-27 Thread Junio C Hamano
Michael Haggerty  writes:

> The last sentence is nonsense. This patch series relies on
> lock_ref_sha1_basic() having a "strbuf *err" parameter, which is only
> the case since
>
> 4a32b2e lock_ref_sha1_basic(): report errors via a "struct strbuf
> *err" (2015-05-11)
>
> The latter commit is in mh/ref-directory-file (which has now been merged
> to master, so technically the last sentence is now correct again).

[5/5] seems to conflict with the write_ref_sha1() vs write_ref_to_lockfile()
updates; I think I can manage, though ;-)
--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH 3/5] verify_lock(): report errors via a strbuf

2015-05-27 Thread Junio C Hamano
Michael Haggerty  writes:

> Instead of writing error messages directly to stderr, write them to a
> "strbuf *err". In lock_ref_sha1_basic(), arrange for these errors to
> be returned to its caller.

I had to scratch my head and view long outside the context before
realizing that the caller lock_ref_sha1_basic() already arranges
with its caller that errors from it are passed via the strbuf, and
this change is just turning verify_lock(), a callee from it, follows
that already established pattern.

Looks sensible, but the last sentence was misleading at least to me.

The caller, lock_ref_sha1_basic(), uses this error reporting
convention with all the other callees, and reports its error
this way to its callers.

perhaps?
--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCHv3] submodule documentation: Reorder introductory paragraphs

2015-05-27 Thread Stefan Beller
It's better to start the man page with a description of what submodules
actually are instead of saying what they are not.

Reorder the paragraphs such that
the first short paragraph introduces the submodule concept,
the second paragraph highlights the usage of the submodule command,
the third paragraph giving background information,
and finally the fourth paragraph discusing alternatives such
as subtrees and remotes, which we don't want to be confused with.

This ordering deepens the knowledge on submodules with each paragraph.
First the basic questions like "How/what" will be answered, while the
underlying concepts will be taught at a later time.

Making sure it is not confused with subtrees and remotes is not really
enhancing knowledge of submodules itself, but rather painting the big
picture of git concepts, so you could also argue to have it as the second
paragraph. Personally I think this may confuse readers, specially
newcomers though.

Additionally to reordering the paragraphs, they have been slightly
reworded.

Signed-off-by: Stefan Beller 
---

I think this is the best I can come up with for now.
* It still mentions the remotes as a potential explanation mud-hole, but I feel
  it helps the reader understand submodules a little better.
* We also start with a typical git man page intro (Dropping "This command does 
...")

 Documentation/git-submodule.txt | 50 ++---
 1 file changed, 22 insertions(+), 28 deletions(-)

diff --git a/Documentation/git-submodule.txt b/Documentation/git-submodule.txt
index 2c25916..2ca1391 100644
--- a/Documentation/git-submodule.txt
+++ b/Documentation/git-submodule.txt
@@ -25,22 +25,17 @@ SYNOPSIS
 
 DESCRIPTION
 ---
-Submodules allow foreign repositories to be embedded within
-a dedicated subdirectory of the source tree, always pointed
-at a particular commit.
+Inspects, updates and manages submodules.
 
-They are not to be confused with remotes, which are meant mainly
-for branches of the same project; submodules are meant for
-different projects you would like to make part of your source tree,
-while the history of the two projects still stays completely
-independent and you cannot modify the contents of the submodule
-from within the main project.
-If you want to merge the project histories and want to treat the
-aggregated whole as a single project from then on, you may want to
-add a remote for the other project and use the 'subtree' merge strategy,
-instead of treating the other project as a submodule. Directories
-that come from both projects can be cloned and checked out as a whole
-if you choose to go that route.
+A Submodule allows you to keep another Git repository in a subdirectory
+of your repository. The other repository has its own history, which does not
+interfere with the history of the current repository. This can be used to
+have external dependencies such as third party libraries for example.
+
+When cloning or pulling a repository containing submodules however,
+these will not be checked out by default; the 'init' and 'update'
+subcommands will maintain submodules checked out and at
+appropriate revision in your working tree.
 
 Submodules are composed from a so-called `gitlink` tree entry
 in the main repository that refers to a particular commit object
@@ -51,19 +46,18 @@ describes the default URL the submodule shall be cloned 
from.
 The logical name can be used for overriding this URL within your
 local repository configuration (see 'submodule init').
 
-This command will manage the tree entries and contents of the
-gitmodules file for you, as well as inspect the status of your
-submodules and update them.
-When adding a new submodule to the tree, the 'add' subcommand
-is to be used.  However, when pulling a tree containing submodules,
-these will not be checked out by default;
-the 'init' and 'update' subcommands will maintain submodules
-checked out and at appropriate revision in your working tree.
-You can briefly inspect the up-to-date status of your submodules
-using the 'status' subcommand and get a detailed overview of the
-difference between the index and checkouts using the 'summary'
-subcommand.
-
+Submodules are not to be confused with remotes, which are other
+repositories of the same project; submodules are meant for
+different projects you would like to make part of your source tree,
+while the history of the two projects still stays completely
+independent and you cannot modify the contents of the submodule
+from within the main project.
+If you want to merge the project histories and want to treat the
+aggregated whole as a single project from then on, you may want to
+add a remote for the other project and use the 'subtree' merge strategy,
+instead of treating the other project as a submodule. Directories
+that come from both projects can be cloned and checked out as a whole
+if you choose to go that route.
 
 COMMANDS
 
-- 
2.4.1.345.gab207b6.dirty

--
To unsubscribe from thi

Re: [PATCH/RFC 1/2] git-rebase -i: Add key word "drop" to remove a commit

2015-05-27 Thread Matthieu Moy
Junio C Hamano  writes:

> Matthieu Moy  writes:
>
>> I find it weird to write
>>
>> noop  
>
> True, but then it can be spelled
>
> #  

I do find it weird too. "#" means "comment", which means "do as if it
was not there" to me. And in this case it does change the semantics once
you activate the safety feature: error out without the "# 
", rebase dropping the commit if the comment is present.

-- 
Matthieu Moy
http://www-verimag.imag.fr/~moy/
--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH 3/3] clone: add `--seed` shorthand

2015-05-27 Thread Junio C Hamano
Jeff King  writes:

> On Sun, May 24, 2015 at 12:07:53PM -0700, Junio C Hamano wrote:
>
>> Jeff King  writes:
>> 
>> > Having slept on it, I really think "--seed" should be "fetch from the
>> > seed into temp refs", and not what I posted earlier.
>> 
>> Yeah, I think that is the right way to do it.
>
> In the meantime, do you want to pick up patches 1 and 2? I think they
> are cleanups that stand on their own, whether we do patch 3 or not.

Thanks for reminding.  Let me take a look.

Thanks.
--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH/RFC 1/2] git-rebase -i: Add key word "drop" to remove a commit

2015-05-27 Thread Junio C Hamano
Matthieu Moy  writes:

> I find it weird to write
>
> noop  

True, but then it can be spelled

#  

too, so do we still want 'drop'?  Unless we have a strong reason to
believe migrants from Hg cannot be (re)trained, personally, I'd feel
that we do not need this 'drop' thing.

--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH/RFC 2/2] git rebase -i: Warn removed or dupplicated commits

2015-05-27 Thread Junio C Hamano
Matthieu Moy  writes:

> Stephen Kelly  writes:
>
>> Galan Rémi  ensimag.grenoble-inp.fr> writes:
>>
>>> 
>>> Check if commits were removed (i.e. a line was deleted) or dupplicated
>>> (e.g. the same commit is picked twice), can print warnings or abort
>>> git rebase according to the value of the configuration variable
>>> rebase.checkLevel.
>>
>> I sometimes duplicate commits deliberately if I want to split a commit in
>> two. I move a copy up and fix the conflict, and I know that I'll still get
>> the right thing later even if I make a mistake with the conflict
>> resolution.
>
> The more I think about it, the more I think we should either not warn at
> all on duplicate commits, or have a separate config variable.

Yeah, I'd say we shouldn't warn, without configuration to keep
things simple.

>
> It's rare to duplicate by mistake, and when you do so, it's already easy
> to notice: you get conflicts, and you can git rebase --skip the second
> occurence. Accidentally dropped commits are another story: it's rather
> easy to cut-and-forget-to-paste, and the consequence currently is silent
> data loss ...
--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH/RFC 2/2] git rebase -i: Warn removed or dupplicated commits

2015-05-27 Thread Junio C Hamano
Remi Galan Alfonso 
writes:

> Thank you for reviewing the code. 
>
> Eric Sunshine writes:
>> > +   # To uppercase
>> > +   checkLevel=$(echo "$checkLevel" | tr '[:lower:]' '[:upper:]')
>> 
>> Is there precedence elsewhere for recognizing uppercase and lowercase
>> variants of config values?
>
> It seems to be commonly used when parsing options in the C files
> through strcasecmp.  For exemple, in config.c:818 :
> if (!strcmp(var, "core.safecrlf")) {
>   if (value && !strcasecmp(value, "warn")) {
>   [...]
> However we didn't see any precedence in shell files. Do you think we
> should remove it?

I think there is a difference between (silently) accepting just to
be lenient and documenting and advocating mixed case uses.

Personally, I'd rather not to see gratuitous flexibility to allow
the same thing spelled in 47 different ways for no good reason.
--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [RFC/WIP PATCH 05/11] transport: add infrastructure to support a protocol version number

2015-05-27 Thread Stefan Beller
On Tue, May 26, 2015 at 11:39 PM, Jeff King  wrote:
> On Tue, May 26, 2015 at 03:01:09PM -0700, Stefan Beller wrote:
>
>> + OPT_STRING('y', "transport-version", &transport_version,
>> +N_("transport-version"),
>> +N_("specify transport version to be used")),
>
> Interesting choice for the short option ("-v" would be nice, but
> obviously it is taken). Do we want to delay on claiming the
> short-and-sweet 'y' until we are sure this is something people will use
> a lot? In an ideal world, it is not (i.e., auto-upgrade and other tricks
> become good enough that nobody bothers to specify it manually).

I made the choice this way:
"Oh crap! -v is taken. so which letter is most likely not taken, so I
can move on?"

So if you have any other proposal with actual reasons I'd switch in a
heart beat.
I figured the -y is good to testing and debugging, but in an ideal
world we don't
want people messing with the transport option because of automatic upgrades
as you said.

Or do you rather hint on dropping the short option at all, and just having NULL
in the field?

>
> -Peff
--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [RFC/WIP PATCH 05/11] transport: add infrastructure to support a protocol version number

2015-05-27 Thread Junio C Hamano
Jeff King  writes:

> On Tue, May 26, 2015 at 03:01:09PM -0700, Stefan Beller wrote:
>
>> +OPT_STRING('y', "transport-version", &transport_version,
>> +   N_("transport-version"),
>> +   N_("specify transport version to be used")),
>
> Interesting choice for the short option ("-v" would be nice, but
> obviously it is taken). Do we want to delay on claiming the
> short-and-sweet 'y' until we are sure this is something people will use
> a lot? In an ideal world, it is not (i.e., auto-upgrade and other tricks
> become good enough that nobody bothers to specify it manually).

Yes, just stuff 0 (not NULL but NUL) there; unless we have a very
good reason to believe that the option will be used every day to
toggle per invocation settings, we shouldn't squat on a short and
sweet single letter.
--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH/WIP 1/8] wrapper: implement xopen()

2015-05-27 Thread Torsten Bögershausen
On 2015-05-27 15.33, Paul Tan wrote:
> A common usage pattern of open() is to check if it was successful, and
> die() if it was not:
> 
>   int fd = open(path, O_WRONLY | O_CREAT, 0777);
>   if (fd < 0)
>   die_errno(_("Could not open '%s' for writing."), path);
> 
> Implement a wrapper function xopen() that does the above so that we can
> save a few lines of code, and make the die() messages consistent.
> 
> Signed-off-by: Paul Tan 
> ---
>  git-compat-util.h |  1 +
>  wrapper.c | 18 ++
>  2 files changed, 19 insertions(+)
> 
> diff --git a/git-compat-util.h b/git-compat-util.h
> index 17584ad..9745962 100644
> --- a/git-compat-util.h
> +++ b/git-compat-util.h
> @@ -718,6 +718,7 @@ extern char *xstrndup(const char *str, size_t len);
>  extern void *xrealloc(void *ptr, size_t size);
>  extern void *xcalloc(size_t nmemb, size_t size);
>  extern void *xmmap(void *start, size_t length, int prot, int flags, int fd, 
> off_t offset);
> +extern int xopen(const char *path, int flags, mode_t mode);
>  extern ssize_t xread(int fd, void *buf, size_t len);
>  extern ssize_t xwrite(int fd, const void *buf, size_t len);
>  extern ssize_t xpread(int fd, void *buf, size_t len, off_t offset);
> diff --git a/wrapper.c b/wrapper.c
> index c1a663f..971665a 100644
> --- a/wrapper.c
> +++ b/wrapper.c
> @@ -189,6 +189,24 @@ void *xcalloc(size_t nmemb, size_t size)
>  # endif
>  #endif
>  
The original open can take 2 or 3 parameters, how about this:
int xopen(const char *path, int oflag, ... )
{
va_list params;
int mode;
int fd;

va_start(params, oflag);
mode = va_arg(params, int);
va_end(params);

fd = open(path, oflag, mode);


> +/**
> + * xopen() is the same as open(), but it die()s if the open() fails.
> + */
> +int xopen(const char *path, int flags, mode_t mode)
> +{
> + int fd;
> +
> + assert(path);
> + fd = open(path, flags, mode);
> + if (fd < 0) {
> + if ((flags & O_WRONLY) || (flags & O_RDWR))
> + die_errno(_("could not open '%s' for writing"), path);
This is only partly true:
it could be either "writing" or "read write".
I don't know if the info "for reading" or "for writing" is needed/helpful at 
all,
or if a simple "could not open" would be enough.


Another thing:
should we handle EINTR ?
(Somewhere in the back of my head I remember that some OS
 returned EINTR when handling some foreign file system
 Mac OS / NTFS ?)
--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH v3 0/4] showing existing ws breakage

2015-05-27 Thread Junio C Hamano
Jeff King  writes:

> In color.diff.*, these are called "new", "old", and "plain". I am of the
> opinion that "context" is a far better name than "plain", but perhaps we
> should support both for consistency.
>
> Here's a patch for the color.diff side, if we want to go that route.
>
> -- >8 --
> Subject: diff: accept color.diff.context as a synonym for "plain"
>
> The term "plain" is a bit ambiguous; let's allow the more
> specific "context", but keep "plain" around for
> compatibility.
>
> Signed-off-by: Jeff King 
> ---
> I didn't bother mentioning the historical "plain" in the documentation.
> I don't know if it's better to (for people who find it in the wild and
> wonder what it means) or if it simply clutters the description.

'plain' does sound a misnomer, as these slot names are about "what"
are painted, not "how" they are painted.  The latter is what their
values represent.  Whoever named that slot was confused by the fact
that 'context' (i.e. "what") lines are by default painted in 'plain'
color without frills (i.e. "how").

We usually try to give a brief mention to historical names primarily
to silence those who pick up stale information from the Web, get
curious, and then complain loudly after finding that we no longer
document them even though we keep accepting them silently, so I am
somewhat tempted to do this on top.

diff --git a/Documentation/config.txt b/Documentation/config.txt
index 0a7ffa5..b458590 100644
--- a/Documentation/config.txt
+++ b/Documentation/config.txt
@@ -870,7 +870,8 @@ command line with the `--color[=]` option.
 color.diff.::
Use customized color for diff colorization.  `` specifies
which part of the patch to use the specified color, and is one
-   of `context` (context text), `meta` (metainformation), `frag`
+   of `context` (context text - `plain` is a historical synonym),
+   `meta` (metainformation), `frag`
(hunk header), 'func' (function in hunk header), `old` (removed lines),
`new` (added lines), `commit` (commit headers), or `whitespace`
(highlighting whitespace errors). The values of these variables may be
--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH/WIP 1/8] wrapper: implement xopen()

2015-05-27 Thread Stefan Beller
On Wed, May 27, 2015 at 6:33 AM, Paul Tan  wrote:
> A common usage pattern of open() is to check if it was successful, and
> die() if it was not:
>
> int fd = open(path, O_WRONLY | O_CREAT, 0777);
> if (fd < 0)
> die_errno(_("Could not open '%s' for writing."), path);
>
> Implement a wrapper function xopen() that does the above so that we can
> save a few lines of code, and make the die() messages consistent.

As a mental todo note for whomever wants to pick up some work: This patch
series indicates to only touch git-am. The first 2 patches introduce
new x-wrappers,
so maybe we'd need to grep through the whole code base and convert the all
these file opening code to the new wrapper.

>
> Signed-off-by: Paul Tan 
> ---
>  git-compat-util.h |  1 +
>  wrapper.c | 18 ++
>  2 files changed, 19 insertions(+)
>
> diff --git a/git-compat-util.h b/git-compat-util.h
> index 17584ad..9745962 100644
> --- a/git-compat-util.h
> +++ b/git-compat-util.h
> @@ -718,6 +718,7 @@ extern char *xstrndup(const char *str, size_t len);
>  extern void *xrealloc(void *ptr, size_t size);
>  extern void *xcalloc(size_t nmemb, size_t size);
>  extern void *xmmap(void *start, size_t length, int prot, int flags, int fd, 
> off_t offset);
> +extern int xopen(const char *path, int flags, mode_t mode);
>  extern ssize_t xread(int fd, void *buf, size_t len);
>  extern ssize_t xwrite(int fd, const void *buf, size_t len);
>  extern ssize_t xpread(int fd, void *buf, size_t len, off_t offset);
> diff --git a/wrapper.c b/wrapper.c
> index c1a663f..971665a 100644
> --- a/wrapper.c
> +++ b/wrapper.c
> @@ -189,6 +189,24 @@ void *xcalloc(size_t nmemb, size_t size)
>  # endif
>  #endif
>
> +/**
> + * xopen() is the same as open(), but it die()s if the open() fails.
> + */
> +int xopen(const char *path, int flags, mode_t mode)
> +{
> +   int fd;
> +
> +   assert(path);
> +   fd = open(path, flags, mode);
> +   if (fd < 0) {
> +   if ((flags & O_WRONLY) || (flags & O_RDWR))
> +   die_errno(_("could not open '%s' for writing"), path);
> +   else
> +   die_errno(_("could not open '%s' for reading"), path);
> +   }
> +   return fd;
> +}
> +
>  /*
>   * xread() is the same a read(), but it automatically restarts read()
>   * operations with a recoverable error (EAGAIN and EINTR). xread()
> --
> 2.1.4
>
--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH/RFC 2/2] git rebase -i: Warn removed or dupplicated commits

2015-05-27 Thread Eric Sunshine
On Wed, May 27, 2015 at 9:19 AM, Remi Galan Alfonso
 wrote:
> Eric Sunshine writes:
>> > +   # To uppercase
>> > +   checkLevel=$(echo "$checkLevel" | tr '[:lower:]' '[:upper:]')
>>
>> Is there precedence elsewhere for recognizing uppercase and lowercase
>> variants of config values?
>
> It seems to be commonly used when parsing options in the C files
> through strcasecmp.  For exemple, in config.c:818 :
> if (!strcmp(var, "core.safecrlf")) {
> if (value && !strcasecmp(value, "warn")) {
> [...]
> However we didn't see any precedence in shell files. Do you think we
> should remove it?

Precedence in C code is good enough for me, and it makes sense for
your new code to follow suit by being insensitive to case (as you have
already done).

However, it would be a good idea to be consistent in your use of
uppercase/lowercase in the commit message, documentation, and code,
rather than having a mix. I'd suggest sticking with lowercase
throughout since lowercase is more commonly used in the codebase (and
just easier to read).
--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [RFC/WIP PATCH 04/11] upload-pack-2: Implement the version 2 of upload-pack

2015-05-27 Thread Stefan Beller
On Tue, May 26, 2015 at 11:35 PM, Jeff King  wrote:
> On Tue, May 26, 2015 at 03:01:08PM -0700, Stefan Beller wrote:
>
>> --- a/upload-pack.c
>> +++ b/upload-pack.c
>> @@ -716,10 +716,47 @@ static void format_symref_info(struct strbuf *buf, 
>> struct string_list *symref)
>>   strbuf_addf(buf, " symref=%s:%s", item->string, (char 
>> *)item->util);
>>  }
>>
>> -static const char *advertise_capabilities = "multi_ack thin-pack side-band"
>> +static char *advertise_capabilities = "multi_ack thin-pack side-band"
>>   " side-band-64k ofs-delta shallow no-progress"
>>   " include-tag multi_ack_detailed";
>
> If we are upload-pack-2, should we advertise that in the capabilities? I
> think it may make things easier later if we try to provide some
> opportunistic out-of-band data. E.g., if see tell git-daemon:
>
>   git-upload-pack repo\0host=whatever\0\0version=2
>
> how do we know whether version=2 was understood and kicked us into v2
> mode, versus an old server that ignored it?

So in my vision we would call git-upload-pack-2 instead of having a "version=2".
and if git-upload-pack-2 doesn't exist, the whole conversation is
over, the client
it is left to make up some good error message or retry version 1.

But I think advertising both which versions the server could deal
with, as well as
the currently expected version is a good thing.

capability: can_speak=1,2
capability: speaking_now=2

>
> It also just makes the protocol more self-describing; from the
> conversation you can see which version is in use.
>
>> +static void send_capabilities(void)
>> +{
>> + char buf[100];
>> +
>> + while (next_capability(buf))
>> + packet_write(1, "capability:%s\n", buf);
>
> Having a static-sized buffer and then passing it to a function which has
> no idea of the buffer size seems like a recipe for a buffer overflow. :)

Yes. All patches I proposed are very brittle. My first goal was to have the
last test passing (an actual fetch with version 2). Now I will start looking at
making things robust, as by now you all seem to not disagree totally.

>
> You are fine here because you are parsing the hard-coded capabilities
> string, and we know 100 is enough there. But it's nice to avoid such
> magic.
>
> Like Eric, I find the whole next_capability thing a little ugly. His
> suggestion to pass in the parsing state is an improvement, but I wonder
> why we need to parse at all. Can we keep the capabilities as:
>
>   const char *capabilities[] = {
> "multi_ack",
> "thin-pack",
> ... etc ...
>   };
>
> and then loop over the array? The v1 writer will need to be modified,
> but it should be fairly straightforward (loop and add them to the buffer
> rather than dumping the whole string).

Thanks for the design guidance! I'll change that.

>
> Also, do we need the capability noise-word?

I thought it opens up a new possible door in the future.
As we ignore anything not starting with "capability" for now, you
could introduce
your foo and bar ping pong easily and still be version 2 compatible.

S: capability: thin
S: capability: another-capability
S: ping-pong foo
S: done
C: (not having understood ping-pong) just answering with capability: thin
C: done, let's proceed to refs advertisement

The alternative client would do:

C: ping-pong: foo-data1a
S: ping-pong: foo-data1b
C: ping-pong: foo-data2a
C: capability: thin
...

> They all have it, except
> for:
>
>> + packet_write(1, "agent:%s\n", git_user_agent_sanitized());
>
> But isn't that basically a capability, too (I agree it is stretching the
> definition of "capability", but I think that ship has sailed; the
> client's response is not "I support this, too" but "I want to enable
> this").
>
> IOW, is there a reason that the initial conversation is not just:
>
>   pkt-line("multi_ack");
>   pkt-line("thin-pack");
>   ...
>   pkt-line("agent=v2.5.0");
>   pkt-line();
>
> We already have framing for each capability due to the use of pkt-line.
> The "capability:" is just one more thing the client has to parse past.
> The keys are already unique up to any "=", so I don't think there is any
> ambiguity (e.g., we don't care about "capability:agent"; we have already
> assigned a meaning to the term "agent", and will never introduce a
> standalone capability with the same name).

It looks clearer to me (we're not wasting band-width), maybe this ping pong
thing can be part of the capabilities announcement too, so we're good this way.

>
> Likewise, if we introduce new protocol items here, the client should
> either ignore them (if it does not understand them) or know what to do
> with them.
>
>> +static void receive_capabilities(void)
>> +{
>> + int done = 0;
>> + while (1) {
>> + char *line = packet_read_line(0, NULL);
>> + if (!line)
>> + break;
>> + if (starts_with(line, "capability:"))
>> + parse_features(line + strlen("capabilit

Re: [RFC/WIP PATCH 04/11] upload-pack-2: Implement the version 2 of upload-pack

2015-05-27 Thread Eric Sunshine
On Wed, May 27, 2015 at 2:35 AM, Jeff King  wrote:
> On Tue, May 26, 2015 at 03:01:08PM -0700, Stefan Beller wrote:
>> +static void send_capabilities(void)
>> +{
>> + char buf[100];
>> +
>> + while (next_capability(buf))
>> + packet_write(1, "capability:%s\n", buf);
>
> Like Eric, I find the whole next_capability thing a little ugly. His
> suggestion to pass in the parsing state is an improvement, but I wonder
> why we need to parse at all. Can we keep the capabilities as:
>
>   const char *capabilities[] = {
> "multi_ack",
> "thin-pack",
> ... etc ...
>   };
>
> and then loop over the array?

Yes, that would be much nicer. I also had this in mind but didn't know
if there was a strong reason for the capabilities to be shoehorned
into a single string as they are currently.
--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [RFC/WIP PATCH 06/11] remote.h: add get_remote_capabilities, request_capabilities

2015-05-27 Thread Eric Sunshine
On Wed, May 27, 2015 at 2:50 AM, Jeff King  wrote:
> On Tue, May 26, 2015 at 11:25:05PM -0400, Eric Sunshine wrote:
>
>> > +   len = packet_read(in, &src_buf, &src_len,
>> > + packet_buffer, sizeof(packet_buffer),
>> > + PACKET_READ_GENTLE_ON_EOF |
>> > + PACKET_READ_CHOMP_NEWLINE);
>> > +   if (len < 0)
>> > +   die_initial_contact(0);
>> > +
>> > +   if (!len)
>> > +   break;
>> > +
>> > +   if (len > 4 && skip_prefix(line, "ERR ", &arg))
>>
>> The 'len > 4' check is needed because there's no guarantee that 'line'
>> is NUL-terminated. Correct?
>
> I think this was just blindly copied from get_remote_heads(). And I
> think that code was being overly paranoid. Ever since f3a3214 (Make
> send/receive-pack be closer to doing something interesting, 2005-06-29),
> the pkt-line reader will add an extra NUL to the buffer to ease cases
> like this.

Thanks. I had started digging into packet_read() to determine whether
it guaranteed NUL-termination, but didn't get far enough to decide. I
agree that if NUL-termination is guaranteed, then the 'len > 4' check
is superfluous (and confusing, which is why it caught my attention in
the first place).
--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Important Notification

2015-05-27 Thread Technical Support
You are required to click on the link to verify your email account
because we are upgrading our webmail.http://www.skywap.ro/logo/eupdate/

Webmail Technical Support
Copyright 2012. All Rights Reserved
--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH/RFC 1/2] git-rebase -i: Add key word "drop" to remove a commit

2015-05-27 Thread Matthieu Moy
Remi Galan Alfonso  writes:

> It also has some effects with the second part of this patch (checks
> removed and/or duplicated commits): if you comment the line, the
> commit will be considered as removed, thus ending in a warning if the
> config variable is set to warn/error; however this problem won't
> appear with noop.

Indeed, that's the whole point of having a "drop" command.

As an advice for your next submission: use "git send-email
--cover-letter", and explain the overall idea before the patches.

I personally prefer "drop" to "noop" as a command name: I understand
"noop" as a command without argument (useful to say "this is actually an
empty list of commands, not an empty file to ask rebase to abort"), but
I find it weird to write

noop  

As Remi wrote, the inspiration comes from Mercurial. Perhaps we should
ask on the mercurial ml how happy they are with the name.

-- 
Matthieu Moy
http://www-verimag.imag.fr/~moy/
--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH/RFC 1/2] git-rebase -i: Add key word "drop" to remove a commit

2015-05-27 Thread Remi Galan Alfonso
Thank you for reviewing the code.

Johannes Schindelin writes:
> Please note that you can already just comment-out the line if you need to 
> keep a visual trace.
> 
> Alternatively, you can replace the `pick` command by `noop`.
> 
> If you really need the `drop` command (with which I am not 100%
> happy because I already envisage users appending a `drop A` to an
> edit script "pick A; pick B; pick C" and expecting A *not to be
> picked*)

It is true that drop has the same effect as noop or commenting,
however we thought that drop is more understandable for average users of
git. Moreover when using git rebase -i, the 'help' displayed below the
list of commits doesn't mention neither the noop command nor the
effect of commenting the line (though considering what removing a line
does, it can be easily deduced).

The drop command was inspired by the drop command from histedit in
mercurial.

It also has some effects with the second part of this patch (checks
removed and/or duplicated commits): if you comment the line, the
commit will be considered as removed, thus ending in a warning if the
config variable is set to warn/error; however this problem won't
appear with noop.
--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH/WIP 3/8] am: implement patch queue mechanism

2015-05-27 Thread Paul Tan
git-am applies a series of patches. If the process terminates
abnormally, we want to be able to resume applying the series of patches.
This requires the session state to be saved in a persistent location.

Implement the mechanism of a "patch queue", represented by 2 integers --
the index of the current patch we are applying and the index of the last
patch, as well as its lifecycle through the following functions:

* am_setup(), which will set up the state directory
  $GIT_DIR/rebase-apply. As such, even if the process exits abnormally,
  the last-known state will still persist.

* am_state_load(), which is called if there is an am session in
  progress, to load the last known state from the state directory so we
  can resume applying patches.

* am_run(), which will do the actual patch application. After applying a
  patch, it calls am_next() to increment the current patch index. The
  logic for applying and committing a patch is not implemented yet.

* am_destroy(), which is finally called when we successfully applied all
  the patches in the queue, to clean up by removing the state directory
  and its contents.

Signed-off-by: Paul Tan 
---
 Makefile |   2 +-
 builtin.h|   1 +
 builtin/am.c | 167 +++
 git.c|   1 +
 4 files changed, 170 insertions(+), 1 deletion(-)
 create mode 100644 builtin/am.c

diff --git a/Makefile b/Makefile
index 323c401..57a7c8c 100644
--- a/Makefile
+++ b/Makefile
@@ -466,7 +466,6 @@ TEST_PROGRAMS_NEED_X =
 # interactive shell sessions without exporting it.
 unexport CDPATH
 
-SCRIPT_SH += git-am.sh
 SCRIPT_SH += git-bisect.sh
 SCRIPT_SH += git-difftool--helper.sh
 SCRIPT_SH += git-filter-branch.sh
@@ -812,6 +811,7 @@ LIB_OBJS += xdiff-interface.o
 LIB_OBJS += zlib.o
 
 BUILTIN_OBJS += builtin/add.o
+BUILTIN_OBJS += builtin/am.o
 BUILTIN_OBJS += builtin/annotate.o
 BUILTIN_OBJS += builtin/apply.o
 BUILTIN_OBJS += builtin/archive.o
diff --git a/builtin.h b/builtin.h
index b87df70..d50c9d1 100644
--- a/builtin.h
+++ b/builtin.h
@@ -30,6 +30,7 @@ extern int textconv_object(const char *path, unsigned mode, 
const unsigned char
 extern int is_builtin(const char *s);
 
 extern int cmd_add(int argc, const char **argv, const char *prefix);
+extern int cmd_am(int argc, const char **argv, const char *prefix);
 extern int cmd_annotate(int argc, const char **argv, const char *prefix);
 extern int cmd_apply(int argc, const char **argv, const char *prefix);
 extern int cmd_archive(int argc, const char **argv, const char *prefix);
diff --git a/builtin/am.c b/builtin/am.c
new file mode 100644
index 000..6c9
--- /dev/null
+++ b/builtin/am.c
@@ -0,0 +1,167 @@
+/*
+ * Builtin "git am"
+ *
+ * Based on git-am.sh by Junio C Hamano.
+ */
+#include "cache.h"
+#include "parse-options.h"
+#include "dir.h"
+
+struct am_state {
+   struct strbuf dir;/* state directory path */
+   int cur;  /* current patch number */
+   int last; /* last patch number */
+};
+
+/**
+ * Initializes am_state with the default values.
+ */
+static void am_state_init(struct am_state *state)
+{
+   memset(state, 0, sizeof(*state));
+
+   strbuf_init(&state->dir, 0);
+}
+
+/**
+ * Release memory allocated by an am_state.
+ */
+static void am_state_release(struct am_state *state)
+{
+   strbuf_release(&state->dir);
+}
+
+/**
+ * Returns path relative to the am_state directory.
+ */
+static inline const char *am_path(const struct am_state *state, const char 
*path)
+{
+   return mkpath("%s/%s", state->dir.buf, path);
+}
+
+/**
+ * Returns 1 if there is an am session in progress, 0 otherwise.
+ */
+static int am_in_progress(const struct am_state *state)
+{
+   struct stat st;
+
+   if (lstat(state->dir.buf, &st) < 0 || !S_ISDIR(st.st_mode))
+   return 0;
+   if (lstat(am_path(state, "last"), &st) || !S_ISREG(st.st_mode))
+   return 0;
+   if (lstat(am_path(state, "next"), &st) || !S_ISREG(st.st_mode))
+   return 0;
+   return 1;
+}
+
+/**
+ * Reads the contents of `file`. The third argument can be used to give a hint
+ * about the file size, to avoid reallocs. Returns 0 on success, -1 if the file
+ * does not exist.
+ */
+static int read_state_file(struct strbuf *sb, const char *file, size_t hint) {
+   strbuf_reset(sb);
+
+   if (!strbuf_read_file(sb, file, hint))
+   return 0;
+
+   if (errno == ENOENT)
+   return -1;
+
+   die_errno(_("could not read '%s'"), file);
+}
+
+/**
+ * Loads state from disk.
+ */
+static void am_state_load(struct am_state *state)
+{
+   struct strbuf sb = STRBUF_INIT;
+
+   read_state_file(&sb, am_path(state, "next"), 8);
+   state->cur = strtol(sb.buf, NULL, 10);
+
+   read_state_file(&sb, am_path(state, "last"), 8);
+   state->last = strtol(sb.buf, NULL, 10);
+
+   strbuf_release(&sb);
+}
+
+/**
+ * Remove the am_state director

[PATCH/WIP 4/8] am: split out mbox/maildir patches with git-mailsplit

2015-05-27 Thread Paul Tan
git-am.sh supports mbox, stgit and mercurial patches. Re-implement
support for splitting out mbox/maildirs using git-mailsplit, while also
implementing the framework required to support other patch formats in
the future.

Re-implement support for the --patch-format option (since a5a6755
(git-am foreign patch support: introduce patch_format, 2009-05-27)) to
allow the user to choose between the different patch formats.

Signed-off-by: Paul Tan 
---
 builtin/am.c | 104 ---
 1 file changed, 100 insertions(+), 4 deletions(-)

diff --git a/builtin/am.c b/builtin/am.c
index 6c9..9c7b058 100644
--- a/builtin/am.c
+++ b/builtin/am.c
@@ -6,11 +6,18 @@
 #include "cache.h"
 #include "parse-options.h"
 #include "dir.h"
+#include "run-command.h"
+
+enum patch_format {
+   PATCH_FORMAT_UNKNOWN = 0,
+   PATCH_FORMAT_MBOX
+};
 
 struct am_state {
struct strbuf dir;/* state directory path */
int cur;  /* current patch number */
int last; /* last patch number */
+   int prec; /* number of digits in patch filename */
 };
 
 /**
@@ -21,6 +28,7 @@ static void am_state_init(struct am_state *state)
memset(state, 0, sizeof(*state));
 
strbuf_init(&state->dir, 0);
+   state->prec = 4;
 }
 
 /**
@@ -101,13 +109,67 @@ static void am_destroy(const struct am_state *state)
 }
 
 /**
+ * Splits out individual patches from `paths`, where each path is either a mbox
+ * file or a Maildir. Return 0 on success, -1 on failure.
+ */
+static int split_patches_mbox(struct am_state *state, struct string_list 
*paths)
+{
+   struct child_process cp = CHILD_PROCESS_INIT;
+   struct string_list_item *item;
+   struct strbuf last = STRBUF_INIT;
+
+   cp.git_cmd = 1;
+   argv_array_push(&cp.args, "mailsplit");
+   argv_array_pushf(&cp.args, "-d%d", state->prec);
+   argv_array_pushf(&cp.args, "-o%s", state->dir.buf);
+   argv_array_push(&cp.args, "-b");
+   argv_array_push(&cp.args, "--");
+
+   for_each_string_list_item(item, paths)
+   argv_array_push(&cp.args, item->string);
+
+   if (capture_command(&cp, &last, 8))
+   return -1;
+
+   state->cur = 1;
+   state->last = strtol(last.buf, NULL, 10);
+
+   return 0;
+}
+
+/**
+ * Splits out individual patches, of patch_format, contained within paths.
+ * These patches will be stored in the state directory, with each patch's
+ * filename being its index, padded to state->prec digits. state->cur will be
+ * set to the index of the first patch, and state->last will be set to the
+ * index of the last patch. Returns 0 on success, -1 on failure.
+ */
+static int split_patches(struct am_state *state, enum patch_format 
patch_format,
+   struct string_list *paths)
+{
+   switch (patch_format) {
+   case PATCH_FORMAT_MBOX:
+   return split_patches_mbox(state, paths);
+   default:
+   die("BUG: invalid patch_format");
+   }
+   return -1;
+}
+
+/**
  * Setup a new am session for applying patches
  */
-static void am_setup(struct am_state *state)
+static void am_setup(struct am_state *state, enum patch_format patch_format,
+   struct string_list *paths)
 {
if (mkdir(state->dir.buf, 0777) < 0 && errno != EEXIST)
die_errno(_("failed to create directory '%s'"), state->dir.buf);
 
+   if (split_patches(state, patch_format, paths) < 0) {
+   am_destroy(state);
+   die(_("Failed to split patches."));
+   }
+
write_file(am_path(state, "next"), 1, "%d", state->cur);
 
write_file(am_path(state, "last"), 1, "%d", state->last);
@@ -128,13 +190,32 @@ static void am_next(struct am_state *state)
  */
 static void am_run(struct am_state *state)
 {
-   while (state->cur <= state->last)
+   while (state->cur <= state->last) {
+   /* patch application not implemented yet */
+
am_next(state);
+   }
 
am_destroy(state);
 }
 
+/**
+ * parse_options() callback that validates and sets opt->value to the
+ * PATCH_FORMAT_* enum value corresponding to `arg`.
+ */
+static int parse_opt_patchformat(const struct option *opt, const char *arg, 
int unset)
+{
+   int *opt_value = opt->value;
+
+   if (!strcmp(arg, "mbox"))
+   *opt_value = PATCH_FORMAT_MBOX;
+   else
+   return -1;
+   return 0;
+}
+
 struct am_state state;
+int opt_patch_format;
 
 static const char * const am_usage[] = {
N_("git am [options] [(|)...]"),
@@ -142,6 +223,8 @@ static const char * const am_usage[] = {
 };
 
 static struct option am_options[] = {
+   OPT_CALLBACK(0, "patch-format", &opt_patch_format, N_("format"),
+   N_("format the patch(es) are in"), parse_opt_patchformat),
OPT_END()
 };
 
@@ -156,8 +239,21 @@ in

[PATCH/WIP 7/8] am: apply patch with git-apply

2015-05-27 Thread Paul Tan
Implement applying the patch to the index using git-apply.

Signed-off-by: Paul Tan 
---
 builtin/am.c | 50 +-
 1 file changed, 49 insertions(+), 1 deletion(-)

diff --git a/builtin/am.c b/builtin/am.c
index 0b8a42d..7126df3 100644
--- a/builtin/am.c
+++ b/builtin/am.c
@@ -25,6 +25,18 @@ static int is_empty_file(const char *filename)
return !st.st_size;
 }
 
+/**
+ * Returns the first line of msg
+ */
+static const char *firstline(const char *msg)
+{
+   static struct strbuf sb = STRBUF_INIT;
+
+   strbuf_reset(&sb);
+   strbuf_add(&sb, msg, strchrnul(msg, '\n') - msg);
+   return sb.buf;
+}
+
 enum patch_format {
PATCH_FORMAT_UNKNOWN = 0,
PATCH_FORMAT_MBOX
@@ -503,6 +515,29 @@ static int parse_patch(struct am_state *state, const char 
*patch)
return 0;
 }
 
+/*
+ * Applies current patch with git-apply. Returns 0 on success, -1 otherwise.
+ */
+static int run_apply(const struct am_state *state)
+{
+   struct child_process cp = CHILD_PROCESS_INIT;
+
+   cp.git_cmd = 1;
+
+   argv_array_push(&cp.args, "apply");
+   argv_array_push(&cp.args, "--index");
+   argv_array_push(&cp.args, am_path(state, "patch"));
+
+   if (run_command(&cp))
+   return -1;
+
+   /* Reload index as git-apply will have modified it. */
+   discard_cache();
+   read_cache();
+
+   return 0;
+}
+
 /**
  * Applies all queued patches.
  */
@@ -520,7 +555,20 @@ static void am_run(struct am_state *state)
write_file(am_path(state, "final-commit"), 1, "%s", 
state->msg.buf);
write_author_script(state);
 
-   /* patch application not implemented yet */
+   printf_ln(_("Applying: %s"), firstline(state->msg.buf));
+
+   if (run_apply(state) < 0) {
+   int value;
+
+   printf_ln(_("Patch failed at %s %s"), msgnum(state),
+   firstline(state->msg.buf));
+
+   if (!git_config_get_bool("advice.amworkdir", &value) && 
!value)
+   printf_ln(_("The copy of the patch that failed 
is found in: %s"),
+   am_path(state, "patch"));
+
+   exit(128);
+   }
 
 next:
am_next(state);
-- 
2.1.4

--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH/WIP 8/8] am: commit applied patch

2015-05-27 Thread Paul Tan
Implement do_commit(), which commits the index which contains the
results of applying the patch, along with the extracted commit message
and authorship information.

Signed-off-by: Paul Tan 
---
 builtin/am.c | 46 ++
 1 file changed, 46 insertions(+)

diff --git a/builtin/am.c b/builtin/am.c
index 7126df3..3174327 100644
--- a/builtin/am.c
+++ b/builtin/am.c
@@ -8,6 +8,9 @@
 #include "dir.h"
 #include "run-command.h"
 #include "quote.h"
+#include "cache-tree.h"
+#include "refs.h"
+#include "commit.h"
 
 /**
  * Returns 1 if the file is empty or does not exist, 0 otherwise.
@@ -539,6 +542,48 @@ static int run_apply(const struct am_state *state)
 }
 
 /**
+ * Commits the current index with state->msg as the commit message and
+ * state->author_name, state->author_email and state->author_date as the author
+ * information.
+ */
+static void do_commit(const struct am_state *state)
+{
+   unsigned char tree[20], parent[20], commit[20];
+   unsigned char *ptr;
+   struct commit_list *parents = NULL;
+   const char *reflog_msg, *author;
+   struct strbuf sb = STRBUF_INIT;
+
+   if (write_cache_as_tree(tree, 0, NULL))
+   die(_("git write-tree failed to write a tree"));
+
+   if (!get_sha1_commit("HEAD", parent)) {
+   ptr = parent;
+   commit_list_insert(lookup_commit(parent), &parents);
+   } else {
+   ptr = NULL;
+   fprintf_ln(stderr, _("applying to an empty history"));
+   }
+
+   author = fmt_ident(state->author_name.buf, state->author_email.buf,
+   state->author_date.buf, IDENT_STRICT);
+
+   if (commit_tree(state->msg.buf, state->msg.len, tree, parents, commit,
+   author, NULL))
+   die(_("failed to write commit object"));
+
+   reflog_msg = getenv("GIT_REFLOG_ACTION");
+   if (!reflog_msg)
+   reflog_msg = "am";
+
+   strbuf_addf(&sb, "%s: %s", reflog_msg, firstline(state->msg.buf));
+
+   update_ref(sb.buf, "HEAD", commit, ptr, 0, UPDATE_REFS_DIE_ON_ERR);
+
+   strbuf_release(&sb);
+}
+
+/**
  * Applies all queued patches.
  */
 static void am_run(struct am_state *state)
@@ -570,6 +615,7 @@ static void am_run(struct am_state *state)
exit(128);
}
 
+   do_commit(state);
 next:
am_next(state);
}
-- 
2.1.4

--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH/WIP 5/8] am: detect mbox patches

2015-05-27 Thread Paul Tan
Since 15ced75 (git-am foreign patch support: autodetect some patch
formats, 2009-05-27), git-am.sh is able to autodetect mbox, stgit and
mercurial patches through heuristics.

Re-implement support for autodetecting mbox/maildir files.

Signed-off-by: Paul Tan 
---
 builtin/am.c | 99 
 1 file changed, 99 insertions(+)

diff --git a/builtin/am.c b/builtin/am.c
index 9c7b058..d589ec5 100644
--- a/builtin/am.c
+++ b/builtin/am.c
@@ -108,6 +108,97 @@ static void am_destroy(const struct am_state *state)
strbuf_release(&sb);
 }
 
+/*
+ * Returns 1 if the file looks like a piece of email a-la RFC2822, 0 otherwise.
+ * We check this by grabbing all the non-indented lines and seeing if they look
+ * like they begin with valid header field names.
+ */
+static int is_email(const char *filename)
+{
+   struct strbuf sb = STRBUF_INIT;
+   FILE *fp = xfopen(filename, "r");
+   int ret = 1;
+
+   while (!strbuf_getline(&sb, fp, '\n')) {
+   const char *x;
+
+   strbuf_rtrim(&sb);
+
+   if (!sb.len)
+   break; /* End of header */
+
+   /* Ignore indented folded lines */
+   if (*sb.buf == '\t' || *sb.buf == ' ')
+   continue;
+
+   /* It's a header if it matches the regexp "^[!-9;-~]+:" */
+   for (x = sb.buf; *x; x++) {
+   if (('!' <= *x && *x <= '9') || (';' <= *x && *x <= 
'~'))
+   continue;
+   if (*x == ':' && x != sb.buf)
+   break;
+   ret = 0;
+   goto fail;
+   }
+   }
+
+fail:
+   fclose(fp);
+   strbuf_release(&sb);
+   return ret;
+}
+
+/**
+ * Attempts to detect the patch_format of the patches contained in `paths`,
+ * returning the PATCH_FORMAT_* enum value. Returns PATCH_FORMAT_UNKNOWN if
+ * detection fails.
+ */
+static int detect_patch_format(struct string_list *paths)
+{
+   enum patch_format ret = PATCH_FORMAT_UNKNOWN;
+   struct strbuf l1 = STRBUF_INIT;
+   struct strbuf l2 = STRBUF_INIT;
+   struct strbuf l3 = STRBUF_INIT;
+   FILE *fp;
+
+   /*
+* We default to mbox format if input is from stdin and for directories
+*/
+   if (!paths->nr || !strcmp(paths->items->string, "-") ||
+   is_directory(paths->items->string)) {
+   strbuf_release(&l1);
+   strbuf_release(&l2);
+   strbuf_release(&l3);
+   return PATCH_FORMAT_MBOX;
+   }
+
+   /*
+* Otherwise, check the first few 3 lines of the first patch, starting
+* from the first non-blank line, to try to detect its format.
+*/
+   fp = xfopen(paths->items->string, "r");
+   while (!strbuf_getline(&l1, fp, '\n')) {
+   strbuf_trim(&l1);
+   if (l1.len)
+   break;
+   }
+   strbuf_getline(&l2, fp, '\n');
+   strbuf_trim(&l2);
+   strbuf_getline(&l3, fp, '\n');
+   strbuf_trim(&l3);
+   fclose(fp);
+
+   if (starts_with(l1.buf, "From ") || starts_with(l1.buf, "From: "))
+   ret = PATCH_FORMAT_MBOX;
+   else if (l1.len && l2.len && l3.len && is_email(paths->items->string))
+   ret = PATCH_FORMAT_MBOX;
+
+   strbuf_release(&l1);
+   strbuf_release(&l2);
+   strbuf_release(&l3);
+   return ret;
+}
+
 /**
  * Splits out individual patches from `paths`, where each path is either a mbox
  * file or a Maildir. Return 0 on success, -1 on failure.
@@ -162,6 +253,14 @@ static int split_patches(struct am_state *state, enum 
patch_format patch_format,
 static void am_setup(struct am_state *state, enum patch_format patch_format,
struct string_list *paths)
 {
+   if (!patch_format)
+   patch_format = detect_patch_format(paths);
+
+   if (!patch_format) {
+   fprintf_ln(stderr, _("Patch format detection failed."));
+   exit(128);
+   }
+
if (mkdir(state->dir.buf, 0777) < 0 && errno != EEXIST)
die_errno(_("failed to create directory '%s'"), state->dir.buf);
 
-- 
2.1.4

--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH/WIP 6/8] am: extract patch, message and authorship with git-mailinfo

2015-05-27 Thread Paul Tan
For the purpose of applying the patch and committing the results,
implement extracting the patch data, commit message and authorship from
an e-mail message using git-mailinfo.

git-mailinfo is run as a separate process, but ideally in the future,
we should be be able to access its functionality directly without
spawning a new process.

Signed-off-by: Paul Tan 
---
 builtin/am.c | 231 +++
 1 file changed, 231 insertions(+)

diff --git a/builtin/am.c b/builtin/am.c
index d589ec5..0b8a42d 100644
--- a/builtin/am.c
+++ b/builtin/am.c
@@ -7,6 +7,23 @@
 #include "parse-options.h"
 #include "dir.h"
 #include "run-command.h"
+#include "quote.h"
+
+/**
+ * Returns 1 if the file is empty or does not exist, 0 otherwise.
+ */
+static int is_empty_file(const char *filename)
+{
+   struct stat st;
+
+   if (stat(filename, &st) < 0) {
+   if (errno == ENOENT)
+   return 1;
+   die_errno(_("could not stat %s"), filename);
+   }
+
+   return !st.st_size;
+}
 
 enum patch_format {
PATCH_FORMAT_UNKNOWN = 0,
@@ -17,6 +34,10 @@ struct am_state {
struct strbuf dir;/* state directory path */
int cur;  /* current patch number */
int last; /* last patch number */
+   struct strbuf msg;/* commit message */
+   struct strbuf author_name;/* commit author's name */
+   struct strbuf author_email;   /* commit author's email */
+   struct strbuf author_date;/* commit author's date */
int prec; /* number of digits in patch filename */
 };
 
@@ -28,6 +49,10 @@ static void am_state_init(struct am_state *state)
memset(state, 0, sizeof(*state));
 
strbuf_init(&state->dir, 0);
+   strbuf_init(&state->msg, 0);
+   strbuf_init(&state->author_name, 0);
+   strbuf_init(&state->author_email, 0);
+   strbuf_init(&state->author_date, 0);
state->prec = 4;
 }
 
@@ -37,6 +62,10 @@ static void am_state_init(struct am_state *state)
 static void am_state_release(struct am_state *state)
 {
strbuf_release(&state->dir);
+   strbuf_release(&state->msg);
+   strbuf_release(&state->author_name);
+   strbuf_release(&state->author_email);
+   strbuf_release(&state->author_date);
 }
 
 /**
@@ -81,6 +110,92 @@ static int read_state_file(struct strbuf *sb, const char 
*file, size_t hint) {
 }
 
 /**
+ * Parses the "author script" `filename`, and sets state->author_name,
+ * state->author_email and state->author_date accordingly. We are strict with
+ * our parsing, as the author script is supposed to be eval'd, and loosely
+ * parsing it may not give the results the user expects.
+ *
+ * The author script is of the format:
+ *
+ * GIT_AUTHOR_NAME='$author_name'
+ * GIT_AUTHOR_EMAIL='$author_email'
+ *GIT_AUTHOR_DATE='$author_date'
+ *
+ * where $author_name, $author_email and $author_date are quoted.
+ */
+static int read_author_script(struct am_state *state)
+{
+   char *value;
+   struct strbuf sb = STRBUF_INIT;
+   const char *filename = am_path(state, "author-script");
+   FILE *fp = fopen(filename, "r");
+   if (!fp) {
+   if (errno == ENOENT)
+   return 0;
+   die(_("could not open '%s' for reading"), filename);
+   }
+
+   if (strbuf_getline(&sb, fp, '\n'))
+   return -1;
+   if (!skip_prefix(sb.buf, "GIT_AUTHOR_NAME=", (const char**) &value))
+   return -1;
+   value = sq_dequote(value);
+   if (!value)
+   return -1;
+   strbuf_addstr(&state->author_name, value);
+
+   if (strbuf_getline(&sb, fp, '\n'))
+   return -1;
+   if (!skip_prefix(sb.buf, "GIT_AUTHOR_EMAIL=", (const char**) &value))
+   return -1;
+   value = sq_dequote(value);
+   if (!value)
+   return -1;
+   strbuf_addstr(&state->author_email, value);
+
+   if (strbuf_getline(&sb, fp, '\n'))
+   return -1;
+   if (!skip_prefix(sb.buf, "GIT_AUTHOR_DATE=", (const char**) &value))
+   return -1;
+   value = sq_dequote(value);
+   if (!value)
+   return -1;
+   strbuf_addstr(&state->author_date, value);
+
+   if (fgetc(fp) != EOF)
+   return -1;
+
+   fclose(fp);
+   strbuf_release(&sb);
+   return 0;
+}
+
+/**
+ * Saves state->author_name, state->author_email and state->author_date in
+ * `filename` as an "author script", which is the format used by git-am.sh.
+ */
+static void write_author_script(const struct am_state *state)
+{
+   static const char fmt[] = "GIT_AUTHOR_NAME='%s'\n"
+   "GIT_AUTHOR_EMAIL='%s'\n"
+   "GIT_AUTHOR_DATE='%s'\n";
+   struct strbuf author_name = STRBUF_INIT;
+   struct strbuf author_email = STRBUF_INIT;
+   struct strbuf author

[PATCH/WIP 1/8] wrapper: implement xopen()

2015-05-27 Thread Paul Tan
A common usage pattern of open() is to check if it was successful, and
die() if it was not:

int fd = open(path, O_WRONLY | O_CREAT, 0777);
if (fd < 0)
die_errno(_("Could not open '%s' for writing."), path);

Implement a wrapper function xopen() that does the above so that we can
save a few lines of code, and make the die() messages consistent.

Signed-off-by: Paul Tan 
---
 git-compat-util.h |  1 +
 wrapper.c | 18 ++
 2 files changed, 19 insertions(+)

diff --git a/git-compat-util.h b/git-compat-util.h
index 17584ad..9745962 100644
--- a/git-compat-util.h
+++ b/git-compat-util.h
@@ -718,6 +718,7 @@ extern char *xstrndup(const char *str, size_t len);
 extern void *xrealloc(void *ptr, size_t size);
 extern void *xcalloc(size_t nmemb, size_t size);
 extern void *xmmap(void *start, size_t length, int prot, int flags, int fd, 
off_t offset);
+extern int xopen(const char *path, int flags, mode_t mode);
 extern ssize_t xread(int fd, void *buf, size_t len);
 extern ssize_t xwrite(int fd, const void *buf, size_t len);
 extern ssize_t xpread(int fd, void *buf, size_t len, off_t offset);
diff --git a/wrapper.c b/wrapper.c
index c1a663f..971665a 100644
--- a/wrapper.c
+++ b/wrapper.c
@@ -189,6 +189,24 @@ void *xcalloc(size_t nmemb, size_t size)
 # endif
 #endif
 
+/**
+ * xopen() is the same as open(), but it die()s if the open() fails.
+ */
+int xopen(const char *path, int flags, mode_t mode)
+{
+   int fd;
+
+   assert(path);
+   fd = open(path, flags, mode);
+   if (fd < 0) {
+   if ((flags & O_WRONLY) || (flags & O_RDWR))
+   die_errno(_("could not open '%s' for writing"), path);
+   else
+   die_errno(_("could not open '%s' for reading"), path);
+   }
+   return fd;
+}
+
 /*
  * xread() is the same a read(), but it automatically restarts read()
  * operations with a recoverable error (EAGAIN and EINTR). xread()
-- 
2.1.4

--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH/WIP 2/8] wrapper: implement xfopen()

2015-05-27 Thread Paul Tan
A common usage pattern of fopen() is to check if it succeeded, and die()
if it failed:

FILE *fp = fopen(path, "w");
if (!fp)
die_errno(_("could not open '%s' for writing"), path);

Implement a wrapper function xfopen() for the above, so that we can save
a few lines of code and make the die() messages consistent.

Signed-off-by: Paul Tan 
---
 git-compat-util.h |  1 +
 wrapper.c | 19 +++
 2 files changed, 20 insertions(+)

diff --git a/git-compat-util.h b/git-compat-util.h
index 9745962..914d450 100644
--- a/git-compat-util.h
+++ b/git-compat-util.h
@@ -723,6 +723,7 @@ extern ssize_t xread(int fd, void *buf, size_t len);
 extern ssize_t xwrite(int fd, const void *buf, size_t len);
 extern ssize_t xpread(int fd, void *buf, size_t len, off_t offset);
 extern int xdup(int fd);
+extern FILE *xfopen(const char *path, const char *mode);
 extern FILE *xfdopen(int fd, const char *mode);
 extern int xmkstemp(char *template);
 extern int xmkstemp_mode(char *template, int mode);
diff --git a/wrapper.c b/wrapper.c
index 971665a..d5ed780 100644
--- a/wrapper.c
+++ b/wrapper.c
@@ -329,6 +329,25 @@ int xdup(int fd)
return ret;
 }
 
+/**
+ * xfopen() is the same as fopen(), but it die()s if the fopen() fails.
+ */
+FILE *xfopen(const char *path, const char *mode)
+{
+   FILE *fp;
+
+   assert(path);
+   assert(mode);
+   fp = fopen(path, mode);
+   if (!fp) {
+   if (*mode == 'w' || *mode == 'a')
+   die_errno(_("could not open '%s' for writing"), path);
+   else
+   die_errno(_("could not open '%s' for reading"), path);
+   }
+   return fp;
+}
+
 FILE *xfdopen(int fd, const char *mode)
 {
FILE *stream = fdopen(fd, mode);
-- 
2.1.4

--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH/WIP 0/8] Make git-am a builtin

2015-05-27 Thread Paul Tan
git-am is a commonly used command for applying a series of patches from a
mailbox to the current branch. Currently, it is implemented by the shell script
git-am.sh. However, compared to C, shell scripts have certain deficiencies:
they need to spawn a lot of processes, introduce a lot of dependencies and
cannot take advantage of git's internal caches.

This WIP patch series rewrites git-am.sh into optimized C builtin/am.c. It is
based on my finished prototype of the rewrite[1], and over the next 5 weeks I
will be cutting out small patches from the prototype to make it easier to
review and refine the patch series.

This is part of my GSoC project to rewrite git-pull.sh into git-am.sh into C
builtins[2].

A small benchmark that applies 50 patches[3]:

#!/bin/sh
git init &&
echo initial >file &&
git add file &&
git commit -m initial &&
git branch before-am &&
for x in $(seq 50)
do
echo $x >>file &&
git commit -a -m $x
done &&
git format-patch --stdout before-am.. >patches &&
git checkout before-am &&
time git patches >/dev/null

I ran this benchmark on my *Linux* system.

Timings for git on master:

1.40s, 1.42s, 1.25s, 1.32s, 1.10s. Avg: ~1.30s

Timings for git on master + this patch series applied:

0.24s, 0.22s, 0.22s, 0.19s, 0.25s. Avg: ~0.22s

This is around a 6x speedup. It's not because this patch series does less than
git-am.sh -- similar speedups can be observed with the prototype, which passes
the test suite[4].

(Sorry for leaving the other reviews hanging. I was too preoccupied with the
git-am rewrite, and was afraid of forgetting important details should I context
switch. Now that the prototype is finished I can deal with the other patch
series'.)

[1] https://github.com/pyokagan/git/compare/master...pyokagan:pt/ref-builtin-am
[2] https://gist.github.com/pyokagan/1b7b0d1f4dab6ba3cef1
[3] Since a 56-patch series was posted recently ;-)
[4] The subset of the test suite that calls git-rebase and git-am.

Paul Tan (8):
  wrapper: implement xopen()
  wrapper: implement xfopen()
  am: implement patch queue mechanism
  am: split out mbox/maildir patches with git-mailsplit
  am: detect mbox patches
  am: extract patch, message and authorship with git-mailinfo
  am: apply patch with git-apply
  am: commit applied patch

 Makefile  |   2 +-
 builtin.h |   1 +
 builtin/am.c  | 687 ++
 git-compat-util.h |   2 +
 git.c |   1 +
 wrapper.c |  37 +++
 6 files changed, 729 insertions(+), 1 deletion(-)
 create mode 100644 builtin/am.c

-- 
2.1.4

--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Bug: .gitconfig folder

2015-05-27 Thread Jorge
If you have a folder named ~/.gitconfig instead of a file with that 
name, when you try to run some global config editing command it will 
fail with a wrong error message:


"fatal: Out of memory? mmap failed: No such device"


You can reproduce it:

$rm ~/.gitconfig
$mkdir ~/.gitconfig

$ls -la ~
...
drwxr-xr-x 24 hit  hit   4096 may  4 12:30 .gimp-2.8
drwxr-xr-x  2 hit  hit   4096 may 27 15:26 .gitconfig
drwxr-xr-x  6 hit  hit   4096 may 27 14:01 github
...

$git config --global user.name foo
fatal: Out of memory? mmap failed: No such device

$git config --global core.editor "vim"
fatal: Out of memory? mmap failed: No such device



--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH/RFC 2/2] git rebase -i: Warn removed or dupplicated commits

2015-05-27 Thread Remi Galan Alfonso
Eric Sunshine writes:
> Shouldn't this case also 'die' when rebase.checkLevel is "error"? And,
> why doesn't the user get advice about configuring rebase.checkLevel in
> this case?
Stephen Kelly writes:
> I sometimes duplicate commits deliberately if I want to split a commit in
> two.
Matthieu Moy writes:
> The more I think about it, the more I think we should either not warn at
> all on duplicate commits, or have a separate config variable.
Put in common because two config variables would have an effect on the
'die' and advise part.

In this patch we didn't put the 'die' in the duplicate commit part
since there was only one config variable and there are cases where the
user might want to duplicate commits.

After the code reviewing of Eric Sunshine and Stephen Kelly, we also
came to the conclusion that we should use two config variables, one
about missing commits and the other about duplicate commits.

This way if you deliberately want to use duplicate commits, you can
just set the value to 'ignore' for duplicate commits and still have
'warn'/'error' for missing commits. Moreover, each part would have its
'die' depending on the value of the corresponding config variable.
--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


FW: Query on git submodules

2015-05-27 Thread Frawley, Sarah
Thanks Heiko for getting back to me.

Correct when I referred to 10+ layers I meant nested repositories which make up 
a large hierarchy.  Some repositories are repeated across the hierarchy.  We 
check-out submodules to tag versions (as opposed to master branch).  If we need 
to roll out a particular change across a hierarchy (e.g. 60 repos) then every 
level in the hierarchy needs to pick up new submodule tags.

The main 2 issues that we see are:

1. Enforcement of absolute paths in git submodules - I am currently trialing 
using a pre-commit hook to highlight this issue to users so that they can fix 
their submodule urls to relative paths.

2. Slowness Integrating updates to submodule hierarchy -I have been looking at 
ways of automating such a roll out - this can be useful for new project setups 
or for rolling out an update to all repos and quickly integrating it into the 
submodule hierarchy.  The link below shows something similar however it checks 
out a master branch of each submodule in its hierarchy. 
https://chrisjean.com/recursively-updating-git-submodules/




Thanks,
Sarah 
-Original Message-
From: Heiko Voigt [mailto:hvo...@hvoigt.net] 
Sent: Tuesday, May 26, 2015 6:01 PM
To: Frawley, Sarah
Cc: git@vger.kernel.org
Subject: Re: Query on git submodules

Hi,

On Fri, May 22, 2015 at 01:46:24PM +, Frawley, Sarah wrote:
> I am a design automation engineer supporting 200+ designers who use 
> git for hardware design.  We also use the submodule feature where we 
> can have quite complex hierarchy's with 10+ layers.

What does this 10+ layers mean? Nested submodule repositories 10 recursion 
steps deep?

> We have experience issues with re-use of design projects was we move 
>from one derivative to another due to the complexity of the hierarchy 
>along with lack of discipline (using absolute paths in .gitmodule 
>files). To enforce more discipline I am currently working on a 
>pre-commit hook to check the integrity of .gitmodule files.  I would be 
>interested in seeing how other users in the community find submodules 
>for large scale projects and if there are any best known methods for 
>using them.

I do not have anything to share here since our projects did not have such 
problems (not that large scale). It would be interesting to see what you come 
up with. Maybe we can add some of that into core git to support such large 
scale projects better. So maybe you can share exactly what problems you have 
(only absolute paths?) or the pre-commit hooks you will use.

Cheers Heiko
-
Intel Ireland Limited (Branch)
Collinstown Industrial Park, Leixlip, County Kildare, Ireland
Registered Number: E902934

This e-mail and any attachments may contain confidential material for
the sole use of the intended recipient(s). Any review or distribution
by others is strictly prohibited. If you are not the intended
recipient, please contact the sender and delete all copies.

--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH/RFC 2/2] git rebase -i: Warn removed or dupplicated commits

2015-05-27 Thread Remi Galan Alfonso
Thank you for reviewing the code. 

Eric Sunshine writes:
> > +   # To uppercase
> > +   checkLevel=$(echo "$checkLevel" | tr '[:lower:]' '[:upper:]')
> 
> Is there precedence elsewhere for recognizing uppercase and lowercase
> variants of config values?

It seems to be commonly used when parsing options in the C files
through strcasecmp.  For exemple, in config.c:818 :
if (!strcmp(var, "core.safecrlf")) {
if (value && !strcasecmp(value, "warn")) {
[...]
However we didn't see any precedence in shell files. Do you think we
should remove it?
--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH 0/5] Fix verify_lock() to report errors via strbuf

2015-05-27 Thread Michael Haggerty
On 05/23/2015 01:34 AM, Michael Haggerty wrote:
> verify_lock() is a helper function called while committing reference
> transactions. But when it fails, instead of recording its error
> message in a strbuf to be passed back to the caller of
> ref_transaction_commit(), the error message was being written directly
> to stderr.
> 
> Instead, report the errors via a strbuf so that they make it back to
> the caller of ref_transaction_commit().
> 
> [...]
> 
> This is the patch series that I mentioned here [1]. It applies on top
> of mh/ref-directory-file [2] and is thematically a continuation of
> that series in the sense that it further cleans up the error handling
> within reference transactions. It would be easy to rebase to master if
> that is preferred.

The last sentence is nonsense. This patch series relies on
lock_ref_sha1_basic() having a "strbuf *err" parameter, which is only
the case since

4a32b2e lock_ref_sha1_basic(): report errors via a "struct strbuf
*err" (2015-05-11)

The latter commit is in mh/ref-directory-file (which has now been merged
to master, so technically the last sentence is now correct again).

Sorry for the confusion.
Michael

-- 
Michael Haggerty
mhag...@alum.mit.edu

--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH/RFC 2/2] git rebase -i: Warn removed or dupplicated commits

2015-05-27 Thread Matthieu Moy
Stephen Kelly  writes:

> Galan Rémi  ensimag.grenoble-inp.fr> writes:
>
>> 
>> Check if commits were removed (i.e. a line was deleted) or dupplicated
>> (e.g. the same commit is picked twice), can print warnings or abort
>> git rebase according to the value of the configuration variable
>> rebase.checkLevel.
>
> I sometimes duplicate commits deliberately if I want to split a commit in
> two. I move a copy up and fix the conflict, and I know that I'll still get
> the right thing later even if I make a mistake with the conflict
> resolution.

The more I think about it, the more I think we should either not warn at
all on duplicate commits, or have a separate config variable.

It's rare to duplicate by mistake, and when you do so, it's already easy
to notice: you get conflicts, and you can git rebase --skip the second
occurence. Accidentally dropped commits are another story: it's rather
easy to cut-and-forget-to-paste, and the consequence currently is silent
data loss ...

-- 
Matthieu Moy
http://www-verimag.imag.fr/~moy/
--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Recovering from 'fatal: core.bare and core.worktree do not make sense'

2015-05-27 Thread SZEDER Gábor


Hi,

the other day I said 'git config core.worktree /somewhere' in a bare
repo while thinking I was in a regular one, user error.  The 'fatal:
core.bare and core.worktree do not make sense' error from the next
command made me realize immediately that I was wrong, that's good.
However...

OK, let's have a look and recover from the situation:

   $ git config --edit
   fatal: core.bare and core.worktree do not make sense

Well, all was well before I set 'core.worktree', so let's unset it:

   $ git config --unset core.worktree
   fatal: core.bare and core.worktree do not make sense

Hmph, not expecting much, but how about unsetting the other
variable?

   $ git config --unset core.bare
   fatal: core.bare and core.worktree do not make sense

Good, at least it's pretty consistent, though I still don't get what
'git config' has to do with the worktree that is so important that
it has to bail out.  Time to look for help:

   $ git help config
   fatal: core.bare and core.worktree do not make sense

WTF :)
Alright, I give up:

   $ vim config
   $ # happy

It was two days later that I had a bit of a lightbulb moment,
reproduced the situation and just for fun tried this:

   $ git -c core.bare=false config --unset core.bare

I didn't expect, but it worked!  Great.

Some thoughts:

   1) Perhaps 'git config' should be more careful in the first place
  and refuse to set 'core.worktree' when 'core.bare' is already
  true and vice versa.

   2) The damage was done with 'git config', so I expected that I can
  repair it with "plain" 'git config' (i.e. without 'git -c') as
  well.  'git config' has nothing to do with the path to the
  worktree after all.  And 'git config --edit' should work
  regardless of the mess that might be in the config file.

   3) 'git help ' should always work, shouldn't it?  (Though
  that's the easiest to remedy, just cd out of the repo, or fire
  up a new terminal window.)


Gábor

--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH] t7063: hide stderr from setup inside prereq

2015-05-27 Thread Jeff King
When t7063 starts, it runs "update-index --untracked-cache"
to see if we support the untracked cache. Its output goes
straight to stderr, even if the test is not run with "-v".
Let's wrap it in a prereq that will hide the output by
default, but show it with "-v".

Signed-off-by: Jeff King 
---
I noticed this messing up my "prove" output. And it always runs first
with "prove --state=slow", because it has a whopping 17 seconds of
sleeps in it.

 t/t7063-status-untracked-cache.sh | 8 ++--
 1 file changed, 6 insertions(+), 2 deletions(-)

diff --git a/t/t7063-status-untracked-cache.sh 
b/t/t7063-status-untracked-cache.sh
index 2b2ffd7..bd4806c 100755
--- a/t/t7063-status-untracked-cache.sh
+++ b/t/t7063-status-untracked-cache.sh
@@ -8,10 +8,14 @@ avoid_racy() {
sleep 1
 }
 
-git update-index --untracked-cache
 # It's fine if git update-index returns an error code other than one,
 # it'll be caught in the first test.
-if test $? -eq 1; then
+test_lazy_prereq UNTRACKED_CACHE '
+   { git update-index --untracked-cache; ret=$?; } &&
+   test $ret -ne 1
+'
+
+if ! test_have_prereq UNTRACKED_CACHE; then
skip_all='This system does not support untracked cache'
test_done
 fi
-- 
2.4.1.552.g6de66a4
--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH/RFC 2/2] git rebase -i: Warn removed or dupplicated commits

2015-05-27 Thread Stephen Kelly
Galan Rémi  ensimag.grenoble-inp.fr> writes:

> 
> Check if commits were removed (i.e. a line was deleted) or dupplicated
> (e.g. the same commit is picked twice), can print warnings or abort
> git rebase according to the value of the configuration variable
> rebase.checkLevel.

I sometimes duplicate commits deliberately if I want to split a commit in
two. I move a copy up and fix the conflict, and I know that I'll still get
the right thing later even if I make a mistake with the conflict resolution.

Re: [PATCH 3/3] clone: add `--seed` shorthand

2015-05-27 Thread Jeff King
On Sun, May 24, 2015 at 12:07:53PM -0700, Junio C Hamano wrote:

> Jeff King  writes:
> 
> > Having slept on it, I really think "--seed" should be "fetch from the
> > seed into temp refs", and not what I posted earlier.
> 
> Yeah, I think that is the right way to do it.

In the meantime, do you want to pick up patches 1 and 2? I think they
are cleanups that stand on their own, whether we do patch 3 or not.

-Peff
--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH] git-new-workdir: add windows compatibility

2015-05-27 Thread Johannes Schindelin
Hi Daniel,

On 2015-05-26 19:16, Daniel Smith wrote:
> Thanks to everyone for reviewing my proposed patch an providing valuable
> feedback. This was my first patch submission to a large open source project
> like Git and the whole process was a little daunting.

Heh, yeah, it can be quite overwhelming (and this mailing list is very "male", 
too). Sorry!

I hope, though, that it was obvious we all only wanted to be helpful?

> On Tue, May 26, 2015 at 9:48 AM, Karsten Blees 
> wrote:
> 
>> AFAICT, the MSys2 symlink() implementation is pretty smart to detect these
>> conditions and fall back to deep copy (aka 'cp -a') if symlinks are not
>> supported.
>>
>> IOW, using 'ln -s' will hopefully "just work" in the upcoming Git for
>> Windows 2, thus trying to fix it for MSys1 / Git for Windows 1.9x is
>> probably a lost cause.
>>
> 
> In that case, I'll abandon this patch and wait for Git for Windows 2 to
> come out.

Speaking of which: Could you try `git-new-workdir` with Git for Windows 2.x 
(developers' preview)? https://git-for-windows.github.io/#download

It *might* be necessary to define the `MSYS` environment variable to 
`winsymlinks:nativestrict` before starting the Git Bash, to enable symlinking. 
It would be really good to know if that is the case so that I can do something 
about this in the Git for Windows installer.

Ciao,
Johannes
--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: Staging commits with visual diff tools?

2015-05-27 Thread John Lee

On Wed, 27 May 2015, Jeff King wrote:


If you are interested in looking further, see how the %patch_mode hash
is defined in git-add--interactive.perl. Specifically, note that "add
-p" is just one case: diff against the index and apply with "apply
--cached". But once you have a separate tool for picking hunks, you
should be able to drop in the different DIFF/APPLY pairs to implement
"checkout -p", etc.


My plan was to use symlinks, checkout-index, and update-index 
--index-info, similar to how difftool does it.  I verified on the command 
line that that seems to work.



John
--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: Staging commits with visual diff tools?

2015-05-27 Thread Jeff King
On Tue, May 26, 2015 at 09:50:49PM +0100, John Lee wrote:

> Does anybody have code to stage commits using a the visual diff/merge tools
> supported by git-difftool?  Is there support in git itself somewhere, even?
> 
> I'm looking for something functionally similar to git add -p
> 
> Looking at the git-difftool source I can see how to write a command to do
> it, but wanted to check if it had already been implemented.
> 
> Did I miss a way that already exists?

git-gui has a visual staging tool, and I think some other git interfaces
do, too (e.g., tig). But I don't think there is a way to interact with
an arbitrary 3rd-party diff tool. I would think doing so would depend on
the diff tool itself; what facility does it provide for picking lines
or a hunk out of a diff and communicating it back to git to stage?

If you are interested in looking further, see how the %patch_mode hash
is defined in git-add--interactive.perl. Specifically, note that "add
-p" is just one case: diff against the index and apply with "apply
--cached". But once you have a separate tool for picking hunks, you
should be able to drop in the different DIFF/APPLY pairs to implement
"checkout -p", etc.

-Peff
--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCH v3 0/4] showing existing ws breakage

2015-05-27 Thread Jeff King
On Tue, May 26, 2015 at 11:30:28PM -0700, Junio C Hamano wrote:

> The fourth one in v2 used a new option "--[no-]ws-check-deleted",
> but in this round a new option "--ws-error-highlight=" is
> defined instead.  With that, you can say
> 
>   diff --ws-error-highlight=new,old
> 
> to say "I want to see whitespace errors on new and old lines", and
> 
>   diff --ws-error-highlight=new,old,context
>   diff --ws-error-highlight=all
>   
> can be used to also see whitespace errors on context lines.  Being
> able to see whitespace errors on context lines, i.e. the ones that
> were there in the original and you left intact, would help you see
> how prevalent whitespace errors are in the original and hopefully
> would make it easier for you to decide if a separate preliminary
> clean-up to only fix these whitespace errors is warranted.

That makes sense. Neat feature.

In color.diff.*, these are called "new", "old", and "plain". I am of the
opinion that "context" is a far better name than "plain", but perhaps we
should support both for consistency.

Here's a patch for the color.diff side, if we want to go that route.

-- >8 --
Subject: diff: accept color.diff.context as a synonym for "plain"

The term "plain" is a bit ambiguous; let's allow the more
specific "context", but keep "plain" around for
compatibility.

Signed-off-by: Jeff King 
---
I didn't bother mentioning the historical "plain" in the documentation.
I don't know if it's better to (for people who find it in the wild and
wonder what it means) or if it simply clutters the description. It may
also be that people don't find "plain" as meaningless as I do, and would
rather leave it as the primary in the documentation (and accepting
"context" is just a nicety).

I also resisted the urge to refactor every internal variable and enum
mentioning "plain" into "context". I guess whether that is a good idea
depends on how strongly you agree that "plain" is a bad name. :)

 Documentation/config.txt | 2 +-
 diff.c   | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/Documentation/config.txt b/Documentation/config.txt
index 5f76e8c..34ef9fe 100644
--- a/Documentation/config.txt
+++ b/Documentation/config.txt
@@ -914,7 +914,7 @@ command line with the `--color[=]` option.
 color.diff.::
Use customized color for diff colorization.  `` specifies
which part of the patch to use the specified color, and is one
-   of `plain` (context text), `meta` (metainformation), `frag`
+   of `context` (context text), `meta` (metainformation), `frag`
(hunk header), 'func' (function in hunk header), `old` (removed lines),
`new` (added lines), `commit` (commit headers), or `whitespace`
(highlighting whitespace errors).
diff --git a/diff.c b/diff.c
index 7500c55..27bd371 100644
--- a/diff.c
+++ b/diff.c
@@ -54,7 +54,7 @@ static char diff_colors[][COLOR_MAXLEN] = {
 
 static int parse_diff_color_slot(const char *var)
 {
-   if (!strcasecmp(var, "plain"))
+   if (!strcasecmp(var, "context") || !strcasecmp(var, "plain"))
return DIFF_PLAIN;
if (!strcasecmp(var, "meta"))
return DIFF_METAINFO;
-- 
2.4.1.552.g6de66a4

--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [RFC/WIP PATCH 10/11] t5544: add a test case for the new protocol

2015-05-27 Thread Jeff King
On Tue, May 26, 2015 at 03:01:14PM -0700, Stefan Beller wrote:

> Signed-off-by: Stefan Beller 
> ---
>  t/t5544-fetch-2.sh | 40 
>  1 file changed, 40 insertions(+)
>  create mode 100755 t/t5544-fetch-2.sh

Obviously we are not there yet, but a fun test will be to globally bump
the transport version to "2" and try to run the test suite.

We will also want to test interoperation between v1 and v2. Though the
_best_ test of that is not hitting a v2 server configured for v1, but
hitting an actual older version of git. Which is outside the scope of
the current test suite, as it always operates on a single version.

It might be nice to have a separate test suite for doing
interoperability, that knows how to build various versions (there's
already some prior art in t/perf). I know this isn't the first time this
concept has come up.

-Peff
--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [RFC/WIP PATCH 00/11] Protocol version 2, again!

2015-05-27 Thread Jeff King
On Wed, May 27, 2015 at 02:18:18AM -0400, Jeff King wrote:

> > The new protocol works just like the old protocol, except for
> > the capabilities negotiation being before any exchange of real data.
> 
> I like this approach. [...]

So now I've read through all the patches. I still like it. :)

There's a lot of work to be done still, but I think this is a great
start. Thanks for getting the ball rolling.

-Peff
--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [RFC/WIP PATCH 09/11] transport: get_refs_via_connect exchanges capabilities before refs.

2015-05-27 Thread Jeff King
On Tue, May 26, 2015 at 03:01:13PM -0700, Stefan Beller wrote:

> + switch (version) {
> + default: /*
> +   * Configured a protocol version > 2?
> +   * Try version 2 as it's the most future proof.
> +   */
> + /* fall through */

Same comment here as earlier. If we do a v3, it might not be compatible
with v2. Shouldn't we bail if the user asked for it?

> + case 2: /* first talk about capabilities, then get the heads */
> + get_remote_capabilities(data->fd[0], NULL, 0);
> + request_capabilities(data->fd[1]);
> + get_remote_heads(data->fd[0], NULL, 0, &refs,
> +  for_push ? REF_NORMAL : 0,
> +  &data->extra_have,
> +  &data->shallow);
> + break;
> + case 1: /* configured version 1, fall through */
> + case 0: /* unconfigured, use first protocol */
> + get_remote_heads(data->fd[0], NULL, 0, &refs,
> +  for_push ? REF_NORMAL : 0,
> +  &data->extra_have,
> +  &data->shallow);
> + break;
> + }

I actually kind of wonder if we should just die("BUG") here on seeing
"0". Is this low level the right place to do the "default to v1"?
Because eventually we're going to want to default to v2, I would think
(after a few years have passed, at least).  It seems like we should be
making that decision centrally when we init the transport options.

-Peff
--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [RFC/WIP PATCH 08/11] transport: connect_setup appends protocol version number

2015-05-27 Thread Jeff King
On Tue, May 26, 2015 at 03:01:12PM -0700, Stefan Beller wrote:

> Signed-off-by: Stefan Beller 
> ---
>  transport.c | 18 --
>  1 file changed, 16 insertions(+), 2 deletions(-)
> 
> diff --git a/transport.c b/transport.c
> index 3ef15f6..33644a6 100644
> --- a/transport.c
> +++ b/transport.c
> @@ -496,15 +496,29 @@ static int set_git_option(struct git_transport_options 
> *opts,
>  static int connect_setup(struct transport *transport, int for_push, int 
> verbose)
>  {
>   struct git_transport_data *data = transport->data;
> + const char *remote_program;
> + char *buf = 0;

Use NULL when you mean a NULL pointer (they're equivalent to the
compiler, but the word is easier to read).

I agree on Eric's naming this "to_free" (and I consider it idiomatic to
assign them in a chain, like "foo = to_free = xmalloc(...)", but we
don't always do that).

> + if (transport->smart_options
> + && transport->smart_options->transport_version) {
> + buf = xmalloc(strlen(remote_program) + 12);
> + sprintf(buf, "%s-%d", remote_program,
> + transport->smart_options->transport_version);
> + remote_program = buf;
> + }

Using xstrfmt can help you avoid magic numbers and repetition,
like:

  to_free = xstrfmt("%s-%d",
remote_program,
transport->smart_options->transport_version);

-Peff
--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html