git checkout resets modified files

2015-08-29 Thread Steve Heyns
git checkout resets modified files

Version git  2.5.0,

Description:
I was automating a process that would pull and switch to another
branch when I stumbled across this. I have not been able to emulate
this from command line but using go (or I imagine other languages are
similar) if you execute a command like

exec.Command(git,checkout,)

A checkout with the branch parameter but the branch parameter is empty.

The result is git resets the the repository, modified files are reset
back to original state without warning.

I would expect the behavior should be the same as a git checkout command

Has anyone else seen something like this ? For myself the solution was
to simply suppress passing in the revision as a third argument if the
revision was empty. But this does appear to be an off behavior.

Thanks
Nz
--
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


Git crash on different versions, including current

2015-08-29 Thread Christian Soltenborn
Hi everybody,

today I ran into a git issue on Windows 7/64. My directory structure
looks like this, and I wondered why the content of a dir wouldn't get added.

C:\Users\chris\git\GoogleTestExtension
-- .git
-- ConsoleApplication1 (new)
- gtest-1.7.0 dir (does not get added)
- stuff that has been successfully added
-- more stuff that's already under git control

So here's about what I did:
- Looked at it with Git Gui, noticed that gtest-1.7.0 is a submodule
- Deleted gtest-1.7.0/.git
- performed git add --all . within the gtest-1.7.0 dir = crash, output
below
- installed git 2.5.0
- uninstalled git 1.9.1
- deleted lock file
- performed git add --all . within the gtest-1.7.0 dir = crash, output
below

I could provide the according dir for reproducing the issue (I will now
zip it for reference) - if anybody is interested, drop me an email.

All the best
Christian



Output with git 1.9.1:

C:\Users\chris\git\GoogleTestExtension\ConsoleApplication1\gtest-1.7.0git
add --all .
A
This application has requested the Runtime to terminate it in an unusual
way.
Please contact the application's support team for more information.
Assertion failed: item-nowildcard_len = item-len  item-prefix =
item-len, file pathspec.c, line 317



Output with git 2.5.0:

C:\Users\chris\git\GoogleTestExtension\ConsoleApplication1\gtest-1.7.0git
add --all .

This application has requested the Runtime to terminate it in an unusual
way.
Please contact the application's support team for more information.
A s s e r t i o n   f a i l e d !

 P r o g r a m :   C : \ P r o g r a m   F i l e s \ G i t \ m i n g w 6
4 \ b i n \ g i t . e x e
 F i l e :   p a t h s p e c . c ,   L i n e   3 1 7

 E x p r e s s i o n :   i t e m -  n o w i l d c a r d _ l e n=
 i t e m -  l e n   i t e m -  p r e f i x=   i t e m -  l
e n--
Dylan Thomas: An alcoholic is someone you don't like who drinks as much
as you do.
--
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: git checkout resets modified files

2015-08-29 Thread Junio C Hamano
Steve Heyns notzi...@gmail.com writes:

 git checkout resets modified files

 Version git  2.5.0,

 Description:
 I was automating a process that would pull and switch to another
 branch when I stumbled across this. I have not been able to emulate
 this from command line but using go (or I imagine other languages are
 similar) if you execute a command like

 exec.Command(git,checkout,)

 A checkout with the branch parameter but the branch parameter is empty.

It is not feeding an empty branch parameter [*1*].  It is asking Git
to check out all paths that match a pathspec  out of the index.

Now, arguably, the user who would want to match everything may be
more likely to give . as the pathspec (or if she is not at the
root of the working tree, :/), but  means the same thing as .,
and the requested behaviour check out all that match this pathspec
from the index would essentially mean I want to get rid of all the
modification in my working tree relative to the index.

I do not think this behaviour depends on the vintage of Git.  An
empty string as pathspec has always matched everything in here
AFAIR.


[Footnote]

*1* Checking out a branch whose name is an empty string can be asked
explicitly by disambiguating double-dash like this:

$ git checkout  --

And it will be answered (correctly) with:

fatal: invalid reference
--
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: git checkout resets modified files

2015-08-29 Thread Junio C Hamano
Junio C Hamano gits...@pobox.com writes:

 I do not think this behaviour depends on the vintage of Git.  An
 empty string as pathspec has always matched everything in here
 AFAIR.

Having said all that, I think the DWIM used by git checkout has
some room for improvement, namely, its we didn't see a double-dash;
is it a ref or is it a pathspec? disambiguation should become
similar to the revision parser's.

Notice that

$ git log 

will error out, saying that an empty string does not name either a
revision or an existing path in the working tree.  I think the same
refusal due to ambiguity should be in git checkout when the user
says

$ git checkout 

Right now, when there is no double-dash, the code checks if the
first token X can be DWIMmed as a ref.  It may either name an
existing branch X, or it may be a non-existing branch name, but
there is a single remotes/Y/X and the user is too lazy to say 'git
checkout -t -b remotes/Y/X X' and instead said 'git checkout X'.

And if the first token X cannot be DWIMmed as a ref according to the
above logic, unlike the revision parser, we do not check it (and all
the subsequent tokens) name existing filesystem entity.

I think we really should.  With that, Steve's command line would
have correctly diagnosed as a liely error.

Of course, that still allows people to say

$ git checkout -- 

if they really mean it, but they can type

$ git checkout -- :/

just as easily, so there is no big loss.

After following the existing code myself, I think this is a rather
easy low-hanging fruit for any aspiring Git hacker.  Hint, hint...


 [Footnote]

 *1* Checking out a branch whose name is an empty string can be asked
 explicitly by disambiguating double-dash like this:

 $ git checkout  --

 And it will be answered (correctly) with:

 fatal: invalid reference
--
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


Dear Customer,

2015-08-29 Thread DHL
Please find attached your DHL air way bill tracking number

Sincerely

DHL Express Team

---
This email has been checked for viruses by Avast antivirus software.
https://www.avast.com/antivirus


DHL-Tracking_Number.pdf
Description: Adobe PDF document


[PATCH v14 13/13] tag.c: implement '--merged' and '--no-merged' options

2015-08-29 Thread Karthik Nayak
Use 'ref-filter' APIs to implement the '--merged' and '--no-merged'
options into 'tag.c'. The '--merged' option lets the user to only list
tags merged into the named commit. The '--no-merged' option lets the
user to only list tags not merged into the named commit.  If no object
is provided it assumes HEAD as the object.

Add documentation and tests for the same.

Mentored-by: Christian Couder christian.cou...@gmail.com
Mentored-by: Matthieu Moy matthieu@grenoble-inp.fr
Signed-off-by: Karthik Nayak karthik@gmail.com
---
 Documentation/git-tag.txt |  7 ++-
 builtin/tag.c |  6 +-
 t/t7004-tag.sh| 27 +++
 3 files changed, 38 insertions(+), 2 deletions(-)

diff --git a/Documentation/git-tag.txt b/Documentation/git-tag.txt
index 0c7f4e6..3803bf7 100644
--- a/Documentation/git-tag.txt
+++ b/Documentation/git-tag.txt
@@ -14,7 +14,7 @@ SYNOPSIS
 'git tag' -d tagname...
 'git tag' [-n[num]] -l [--contains commit] [--points-at object]
[--column[=options] | --no-column] [--create-reflog] [--sort=key]
-   [--format=format] [pattern...]
+   [--format=format] [--[no-]merged [commit]] [pattern...]
 'git tag' -v tagname...
 
 DESCRIPTION
@@ -165,6 +165,11 @@ This option is only applicable when listing tags without 
annotation lines.
that of linkgit:git-for-each-ref[1].  When unspecified,
defaults to `%(refname:short)`.
 
+--[no-]merged [commit]::
+   Only list tags whose tips are reachable, or not reachable
+   if '--no-merged' is used, from the specified commit ('HEAD'
+   if not specified).
+
 CONFIGURATION
 -
 By default, 'git tag' in sign-with-default mode (-s) will use your
diff --git a/builtin/tag.c b/builtin/tag.c
index dc4494d..9fa1400 100644
--- a/builtin/tag.c
+++ b/builtin/tag.c
@@ -23,7 +23,7 @@ static const char * const git_tag_usage[] = {
N_(git tag [-a | -s | -u key-id] [-f] [-m msg | -F file] 
tagname [head]),
N_(git tag -d tagname...),
N_(git tag -l [-n[num]] [--contains commit] [--points-at object]
-   \n\t\t[--format=format] [pattern...]),
+   \n\t\t[--format=format] [--[no-]merged [commit]] 
[pattern...]),
N_(git tag -v tagname...),
NULL
 };
@@ -358,6 +358,8 @@ int cmd_tag(int argc, const char **argv, const char *prefix)
OPT_COLUMN(0, column, colopts, N_(show tag list in 
columns)),
OPT_CONTAINS(filter.with_commit, N_(print only tags that 
contain the commit)),
OPT_WITH(filter.with_commit, N_(print only tags that contain 
the commit)),
+   OPT_MERGED(filter, N_(print only tags that are merged)),
+   OPT_NO_MERGED(filter, N_(print only tags that are not 
merged)),
OPT_CALLBACK(0 , sort, sorting_tail, N_(key),
 N_(field name to sort on), 
parse_opt_ref_sorting),
{
@@ -416,6 +418,8 @@ int cmd_tag(int argc, const char **argv, const char *prefix)
die(_(--contains option is only allowed with -l.));
if (filter.points_at.nr)
die(_(--points-at option is only allowed with -l.));
+   if (filter.merge_commit)
+   die(_(--merged and --no-merged option are only allowed with 
-l));
if (cmdmode == 'd')
return for_each_tag_name(argv, delete_tag);
if (cmdmode == 'v')
diff --git a/t/t7004-tag.sh b/t/t7004-tag.sh
index 8987fb1..3dd2f51 100755
--- a/t/t7004-tag.sh
+++ b/t/t7004-tag.sh
@@ -1531,4 +1531,31 @@ test_expect_success '--format should list tags as per 
format given' '
test_cmp expect actual
 '
 
+test_expect_success 'setup --merged test tags' '
+   git tag mergetest-1 HEAD~2 
+   git tag mergetest-2 HEAD~1 
+   git tag mergetest-3 HEAD
+'
+
+test_expect_success '--merged cannot be used in non-list mode' '
+   test_must_fail git tag --merged=mergetest-2 foo
+'
+
+test_expect_success '--merged shows merged tags' '
+   cat expect -\EOF 
+   mergetest-1
+   mergetest-2
+   EOF
+   git tag -l --merged=mergetest-2 mergetest-* actual 
+   test_cmp expect actual
+'
+
+test_expect_success '--no-merged show unmerged tags' '
+   cat expect -\EOF 
+   mergetest-3
+   EOF
+   git tag -l --no-merged=mergetest-2 mergetest-* actual 
+   test_cmp expect actual
+'
+
 test_done
-- 
2.5.0

--
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 v14 04/13] ref-filter: implement an `align` atom

2015-08-29 Thread Karthik Nayak
Implement an `align` atom which left-, middle-, or right-aligns the
content between %(align:..) and %(end).

It is followed by `:width,position`, where the `position` is
either left, right or middle and `width` is the size of the area
into which the content will be placed. If the content between
%(align:) and %(end) is more than the width then no alignment is
performed. e.g. to align a refname atom to the middle with a total
width of 40 we can do: --format=%(align:middle,40)%(refname)%(end).

We now have a `handler()` for each atom_value which will be called
when that atom_value is being parsed, and similarly an `at_end`
function for each element of the stack which is to be called when the
`end` atom is encountered. Using this we implement the `align` atom
which aligns the given strbuf by calling `strbuf_utf8_align()` from
utf8.c.

Extract perform_quote_formatting() from append_atom(). Given a string
a quote_value and a strbuf, perform_quote_formatting() formats the
string based on the quote_value and stores it into the strbuf.

Ensure that quote formatting is performed on the whole of
%(align)...%(end) rather than individual atoms. We do this by skipping
individual quote formatting for atoms whenever the stack has more than
one element, and performing formatting for the entire stack element
when the `%(end)` atoms is encountered.

Add documentation and tests for the same.

Mentored-by: Christian Couder christian.cou...@gmail.com
Mentored-by: Matthieu Moy matthieu@grenoble-inp.fr
Signed-off-by: Karthik Nayak karthik@gmail.com
---
 Documentation/git-for-each-ref.txt |   9 +++
 ref-filter.c   | 151 +++--
 t/t6302-for-each-ref-filter.sh |  85 +
 3 files changed, 221 insertions(+), 24 deletions(-)

diff --git a/Documentation/git-for-each-ref.txt 
b/Documentation/git-for-each-ref.txt
index e49d578..943975d 100644
--- a/Documentation/git-for-each-ref.txt
+++ b/Documentation/git-for-each-ref.txt
@@ -127,6 +127,15 @@ color::
Change output color.  Followed by `:colorname`, where names
are described in `color.branch.*`.
 
+align::
+   Left-, middle-, or right-align the content between %(align:..)
+   and %(end). Followed by `:width,position`, where the
+   `position` is either left, right or middle and `width` is
+   the total length of the content with alignment. If the
+   contents length is more than the width then no alignment is
+   performed. If used with '--quote' everything in between %(align:..)
+   and %(end) is quoted.
+
 In addition to the above, for commit and tag objects, the header
 field names (`tree`, `parent`, `object`, `type`, and `tag`) can
 be used to specify the value in the header field.
diff --git a/ref-filter.c b/ref-filter.c
index 432cea0..21c8b5f 100644
--- a/ref-filter.c
+++ b/ref-filter.c
@@ -10,6 +10,7 @@
 #include quote.h
 #include ref-filter.h
 #include revision.h
+#include utf8.h
 
 typedef enum { FIELD_STR, FIELD_ULONG, FIELD_TIME } cmp_type;
 
@@ -53,6 +54,13 @@ static struct {
{ flag },
{ HEAD },
{ color },
+   { align },
+   { end },
+};
+
+struct align {
+   align_type position;
+   unsigned int width;
 };
 
 #define REF_FORMATTING_STATE_INIT  { 0, NULL }
@@ -60,6 +68,8 @@ static struct {
 struct ref_formatting_stack {
struct ref_formatting_stack *prev;
struct strbuf output;
+   void (*at_end)(struct ref_formatting_stack *stack);
+   void *cb_data;
 };
 
 struct ref_formatting_state {
@@ -69,6 +79,8 @@ struct ref_formatting_state {
 
 struct atom_value {
const char *s;
+   struct align *align;
+   void (*handler)(struct atom_value *atomv, struct ref_formatting_state 
*state);
unsigned long ul; /* used for sorting when not FIELD_STR */
 };
 
@@ -632,6 +644,84 @@ static inline char *copy_advance(char *dst, const char 
*src)
return dst;
 }
 
+static void align_handler(struct ref_formatting_stack *stack)
+{
+   struct align *align = (struct align *)stack-cb_data;
+   struct strbuf s = STRBUF_INIT;
+
+   strbuf_utf8_align(s, align-position, align-width, stack-output.buf);
+   strbuf_swap(stack-output, s);
+   strbuf_release(s);
+   free(align);
+}
+
+static void align_atom_handler(struct atom_value *atomv, struct 
ref_formatting_state *state)
+{
+   struct ref_formatting_stack *new;
+
+   push_stack_element(state-stack);
+   new = state-stack;
+   new-at_end = align_handler;
+   new-cb_data = atomv-align;
+}
+
+static void quote_formatting(struct strbuf *s, const char *str, int 
quote_style)
+{
+   switch (quote_style) {
+   case QUOTE_NONE:
+   strbuf_addstr(s, str);
+   break;
+   case QUOTE_SHELL:
+   sq_quote_buf(s, str);
+   break;
+   case QUOTE_PERL:
+   perl_quote_buf(s, str);
+   break;
+   case QUOTE_PYTHON:
+   

[PATCH v14 07/13] ref-filter: add support for %(contents:lines=X)

2015-08-29 Thread Karthik Nayak
In 'tag.c' we can print N lines from the annotation of the tag using
the '-nnum' option. Copy code from 'tag.c' to 'ref-filter' and
modify it to support appending of N lines from the annotation of tags
to the given strbuf.

Implement %(contents:lines=X) where X lines of the given object are
obtained.

Add documentation and test for the same.

Mentored-by: Christian Couder christian.cou...@gmail.com
Mentored-by: Matthieu Moy matthieu@grenoble-inp.fr
Signed-off-by: Karthik Nayak karthik@gmail.com
---
 Documentation/git-for-each-ref.txt |  1 +
 builtin/tag.c  |  4 ++
 ref-filter.c   | 75 +-
 ref-filter.h   |  3 +-
 t/t6302-for-each-ref-filter.sh | 16 
 5 files changed, 97 insertions(+), 2 deletions(-)

diff --git a/Documentation/git-for-each-ref.txt 
b/Documentation/git-for-each-ref.txt
index 943975d..7ca1fe4 100644
--- a/Documentation/git-for-each-ref.txt
+++ b/Documentation/git-for-each-ref.txt
@@ -149,6 +149,7 @@ Its first line is `contents:subject`, where subject is the 
concatenation
 of all lines of the commit message up to the first blank line.  The next
 line is 'contents:body', where body is all of the lines after the first
 blank line.  Finally, the optional GPG signature is `contents:signature`.
+The first `N` lines of the object is obtained using `contents:lines=N`.
 
 For sorting purposes, fields with numeric values sort in numeric
 order (`objectsize`, `authordate`, `committerdate`, `taggerdate`).
diff --git a/builtin/tag.c b/builtin/tag.c
index 471d6b1..0fc7557 100644
--- a/builtin/tag.c
+++ b/builtin/tag.c
@@ -185,6 +185,10 @@ static enum contains_result contains(struct commit 
*candidate,
return contains_test(candidate, want);
 }
 
+/*
+ * Currently duplicated in ref-filter, will eventually be removed as
+ * we port tag.c to use ref-filter APIs.
+ */
 static void show_tag_lines(const struct object_id *oid, int lines)
 {
int i;
diff --git a/ref-filter.c b/ref-filter.c
index 1e6754a..ece7a23 100644
--- a/ref-filter.c
+++ b/ref-filter.c
@@ -56,6 +56,7 @@ static struct {
{ color },
{ align },
{ end },
+   { contents:lines },
 };
 
 struct align {
@@ -63,6 +64,11 @@ struct align {
unsigned int width;
 };
 
+struct contents {
+   unsigned int lines;
+   struct object_id oid;
+};
+
 #define REF_FORMATTING_STATE_INIT  { 0, NULL }
 
 struct ref_formatting_stack {
@@ -80,6 +86,7 @@ struct ref_formatting_state {
 struct atom_value {
const char *s;
struct align *align;
+   struct contents *contents;
void (*handler)(struct atom_value *atomv, struct ref_formatting_state 
*state);
unsigned long ul; /* used for sorting when not FIELD_STR */
 };
@@ -569,6 +576,61 @@ static void find_subpos(const char *buf, unsigned long sz,
*nonsiglen = *sig - buf;
 }
 
+/*
+ * If 'lines' is greater than 0, append that many lines from the given
+ * object_id 'oid' to the given strbuf.
+ */
+static void append_tag_lines(struct strbuf *out, const struct object_id *oid, 
int lines)
+{
+   int i;
+   unsigned long size;
+   enum object_type type;
+   char *buf, *sp, *eol;
+   size_t len;
+
+   buf = read_sha1_file(oid-hash, type, size);
+   if (!buf)
+   die_errno(unable to read object %s, oid_to_hex(oid));
+   if (type != OBJ_COMMIT  type != OBJ_TAG)
+   goto free_return;
+   if (!size)
+   die(an empty %s object %s?,
+   typename(type), oid_to_hex(oid));
+
+   /* skip header */
+   sp = strstr(buf, \n\n);
+   if (!sp)
+   goto free_return;
+
+   /* only take up to lines lines, and strip the signature from a tag */
+   if (type == OBJ_TAG)
+   size = parse_signature(buf, size);
+   for (i = 0, sp += 2; i  lines  sp  buf + size; i++) {
+   if (i)
+   strbuf_addstr(out, \n);
+   eol = memchr(sp, '\n', size - (sp - buf));
+   len = eol ? eol - sp : size - (sp - buf);
+   strbuf_add(out, sp, len);
+   if (!eol)
+   break;
+   sp = eol + 1;
+   }
+free_return:
+   free(buf);
+}
+
+static void contents_lines_handler(struct atom_value *atomv, struct 
ref_formatting_state *state)
+{
+   struct contents *contents = (struct contents *)atomv-contents;
+   struct strbuf s = STRBUF_INIT;
+
+   append_tag_lines(s, contents-oid, contents-lines);
+   quote_formatting(state-stack-output, s.buf, state-quote_style);
+   strbuf_release(s);
+
+   free(contents);
+}
+
 /* See grab_values */
 static void grab_sub_body_contents(struct atom_value *val, int deref, struct 
object *obj, void *buf, unsigned long sz)
 {
@@ -579,6 +641,7 @@ static void grab_sub_body_contents(struct atom_value *val, 
int deref, struct obj
for (i = 0; i  used_atom_cnt; i++) 

[PATCH v14 08/13] ref-filter: add support to sort by version

2015-08-29 Thread Karthik Nayak
From: Karthik Nayak karthik@gmail.com

Add support to sort by version using the v:refname and
version:refname option. This is achieved by using the 'versioncmp()'
function as the comparing function for qsort.

This option is included to support sorting by versions in `git tag -l`
which will eventually be ported to use ref-filter APIs.

Add documentation and tests for the same.

Mentored-by: Christian Couder christian.cou...@gmail.com
Mentored-by: Matthieu Moy matthieu@grenoble-inp.fr
Signed-off-by: Karthik Nayak karthik@gmail.com
---
 Documentation/git-for-each-ref.txt |  3 +++
 ref-filter.c   | 15 ++-
 ref-filter.h   |  3 ++-
 t/t6302-for-each-ref-filter.sh | 36 
 4 files changed, 51 insertions(+), 6 deletions(-)

diff --git a/Documentation/git-for-each-ref.txt 
b/Documentation/git-for-each-ref.txt
index 7ca1fe4..1b48b95 100644
--- a/Documentation/git-for-each-ref.txt
+++ b/Documentation/git-for-each-ref.txt
@@ -155,6 +155,9 @@ For sorting purposes, fields with numeric values sort in 
numeric
 order (`objectsize`, `authordate`, `committerdate`, `taggerdate`).
 All other fields are used to sort in their byte-value order.
 
+There is also an option to sort by versions, this can be done by using
+the fieldname `version:refname` or its alias `v:refname`.
+
 In any case, a field name that refers to a field inapplicable to
 the object referred by the ref does not cause an error.  It
 returns an empty string instead.
diff --git a/ref-filter.c b/ref-filter.c
index ece7a23..434f2c9 100644
--- a/ref-filter.c
+++ b/ref-filter.c
@@ -11,6 +11,8 @@
 #include ref-filter.h
 #include revision.h
 #include utf8.h
+#include git-compat-util.h
+#include version.h
 
 typedef enum { FIELD_STR, FIELD_ULONG, FIELD_TIME } cmp_type;
 
@@ -1441,19 +1443,19 @@ static int cmp_ref_sorting(struct ref_sorting *s, 
struct ref_array_item *a, stru
 
get_ref_atom_value(a, s-atom, va);
get_ref_atom_value(b, s-atom, vb);
-   switch (cmp_type) {
-   case FIELD_STR:
+   if (s-version)
+   cmp = versioncmp(va-s, vb-s);
+   else if (cmp_type == FIELD_STR)
cmp = strcmp(va-s, vb-s);
-   break;
-   default:
+   else {
if (va-ul  vb-ul)
cmp = -1;
else if (va-ul == vb-ul)
cmp = 0;
else
cmp = 1;
-   break;
}
+
return (s-reverse) ? -cmp : cmp;
 }
 
@@ -1593,6 +1595,9 @@ int parse_opt_ref_sorting(const struct option *opt, const 
char *arg, int unset)
s-reverse = 1;
arg++;
}
+   if (skip_prefix(arg, version:, arg) ||
+   skip_prefix(arg, v:, arg))
+   s-version = 1;
len = strlen(arg);
s-atom = parse_ref_filter_atom(arg, arg+len);
return 0;
diff --git a/ref-filter.h b/ref-filter.h
index 3759424..1282d70 100644
--- a/ref-filter.h
+++ b/ref-filter.h
@@ -28,7 +28,8 @@ struct atom_value;
 struct ref_sorting {
struct ref_sorting *next;
int atom; /* index into used_atom array (internal) */
-   unsigned reverse : 1;
+   unsigned reverse : 1,
+   version : 1;
 };
 
 struct ref_array_item {
diff --git a/t/t6302-for-each-ref-filter.sh b/t/t6302-for-each-ref-filter.sh
index 0277498..8f18f86 100755
--- a/t/t6302-for-each-ref-filter.sh
+++ b/t/t6302-for-each-ref-filter.sh
@@ -182,4 +182,40 @@ test_expect_success 'check `%(contents:lines=X)`' '
test_cmp expect actual
 '
 
+test_expect_success 'setup for version sort' '
+   test_commit foo1.3 
+   test_commit foo1.6 
+   test_commit foo1.10
+'
+
+test_expect_success 'version sort' '
+   git for-each-ref --sort=version:refname --format=%(refname:short) 
refs/tags/ | grep foo actual 
+   cat expect -\EOF 
+   foo1.3
+   foo1.6
+   foo1.10
+   EOF
+   test_cmp expect actual
+'
+
+test_expect_success 'version sort (shortened)' '
+   git for-each-ref --sort=v:refname --format=%(refname:short) 
refs/tags/ | grep foo actual 
+   cat expect -\EOF 
+   foo1.3
+   foo1.6
+   foo1.10
+   EOF
+   test_cmp expect actual
+'
+
+test_expect_success 'reverse version sort' '
+   git for-each-ref --sort=-version:refname --format=%(refname:short) 
refs/tags/ | grep foo actual 
+   cat expect -\EOF 
+   foo1.10
+   foo1.6
+   foo1.3
+   EOF
+   test_cmp expect actual
+'
+
 test_done
-- 
2.5.0

--
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 v14 10/13] tag.c: use 'ref-filter' data structures

2015-08-29 Thread Karthik Nayak
From: Karthik Nayak karthik@gmail.com

Make 'tag.c' use 'ref-filter' data structures and make changes to
support the new data structures. This is a part of the process
of porting 'tag.c' to use 'ref-filter' APIs.

This is a temporary step before porting 'tag.c' to use 'ref-filter'
completely. As this is a temporary step, most of the code
introduced here will be removed when 'tag.c' is ported over to use
'ref-filter' APIs.

Mentored-by: Christian Couder christian.cou...@gmail.com
Mentored-by: Matthieu Moy matthieu@grenoble-inp.fr
Signed-off-by: Karthik Nayak karthik@gmail.com
---
 builtin/tag.c | 106 +++---
 1 file changed, 57 insertions(+), 49 deletions(-)

diff --git a/builtin/tag.c b/builtin/tag.c
index 0fc7557..e96bae2 100644
--- a/builtin/tag.c
+++ b/builtin/tag.c
@@ -17,6 +17,7 @@
 #include gpg-interface.h
 #include sha1-array.h
 #include column.h
+#include ref-filter.h
 
 static const char * const git_tag_usage[] = {
N_(git tag [-a | -s | -u key-id] [-f] [-m msg | -F file] 
tagname [head]),
@@ -34,15 +35,6 @@ static const char * const git_tag_usage[] = {
 
 static int tag_sort;
 
-struct tag_filter {
-   const char **patterns;
-   int lines;
-   int sort;
-   struct string_list tags;
-   struct commit_list *with_commit;
-};
-
-static struct sha1_array points_at;
 static unsigned int colopts;
 
 static int match_pattern(const char **patterns, const char *ref)
@@ -61,19 +53,20 @@ static int match_pattern(const char **patterns, const char 
*ref)
  * removed as we port tag.c to use the ref-filter APIs.
  */
 static const unsigned char *match_points_at(const char *refname,
-   const unsigned char *sha1)
+   const unsigned char *sha1,
+   struct sha1_array *points_at)
 {
const unsigned char *tagged_sha1 = NULL;
struct object *obj;
 
-   if (sha1_array_lookup(points_at, sha1) = 0)
+   if (sha1_array_lookup(points_at, sha1) = 0)
return sha1;
obj = parse_object(sha1);
if (!obj)
die(_(malformed object at '%s'), refname);
if (obj-type == OBJ_TAG)
tagged_sha1 = ((struct tag *)obj)-tagged-sha1;
-   if (tagged_sha1  sha1_array_lookup(points_at, tagged_sha1) = 0)
+   if (tagged_sha1  sha1_array_lookup(points_at, tagged_sha1) = 0)
return tagged_sha1;
return NULL;
 }
@@ -228,12 +221,24 @@ free_return:
free(buf);
 }
 
+static void ref_array_append(struct ref_array *array, const char *refname)
+{
+   size_t len = strlen(refname);
+   struct ref_array_item *ref = xcalloc(1, sizeof(struct ref_array_item) + 
len + 1);
+   memcpy(ref-refname, refname, len);
+   ref-refname[len] = '\0';
+   REALLOC_ARRAY(array-items, array-nr + 1);
+   array-items[array-nr++] = ref;
+}
+
 static int show_reference(const char *refname, const struct object_id *oid,
  int flag, void *cb_data)
 {
-   struct tag_filter *filter = cb_data;
+   struct ref_filter_cbdata *data = cb_data;
+   struct ref_array *array = data-array;
+   struct ref_filter *filter = data-filter;
 
-   if (match_pattern(filter-patterns, refname)) {
+   if (match_pattern(filter-name_patterns, refname)) {
if (filter-with_commit) {
struct commit *commit;
 
@@ -244,12 +249,12 @@ static int show_reference(const char *refname, const 
struct object_id *oid,
return 0;
}
 
-   if (points_at.nr  !match_points_at(refname, oid-hash))
+   if (filter-points_at.nr  !match_points_at(refname, 
oid-hash, filter-points_at))
return 0;
 
if (!filter-lines) {
-   if (filter-sort)
-   string_list_append(filter-tags, refname);
+   if (tag_sort)
+   ref_array_append(array, refname);
else
printf(%s\n, refname);
return 0;
@@ -264,36 +269,36 @@ static int show_reference(const char *refname, const 
struct object_id *oid,
 
 static int sort_by_version(const void *a_, const void *b_)
 {
-   const struct string_list_item *a = a_;
-   const struct string_list_item *b = b_;
-   return versioncmp(a-string, b-string);
+   const struct ref_array_item *a = *((struct ref_array_item **)a_);
+   const struct ref_array_item *b = *((struct ref_array_item **)b_);
+   return versioncmp(a-refname, b-refname);
 }
 
-static int list_tags(const char **patterns, int lines,
-struct commit_list *with_commit, int sort)
+static int list_tags(struct ref_filter *filter, int sort)
 {
-   struct tag_filter filter;
+   struct ref_array array;
+   

[PATCH v14 11/13] tag.c: use 'ref-filter' APIs

2015-08-29 Thread Karthik Nayak
From: Karthik Nayak karthik@gmail.com

Make 'tag.c' use 'ref-filter' APIs for iterating through refs, sorting
and printing of refs. This removes most of the code used in 'tag.c'
replacing it with calls to the 'ref-filter' library.

Make 'tag.c' use the 'filter_refs()' function provided by 'ref-filter'
to filter out tags based on the options set.

For printing tags we use 'show_ref_array_item()' function provided by
'ref-filter'.

We improve the sorting option provided by 'tag.c' by using the sorting
options provided by 'ref-filter'. This causes the test 'invalid sort
parameter on command line' in t7004 to fail, as 'ref-filter' throws an
error for all sorting fields which are incorrect. The test is changed
to reflect the same.

Modify documentation for the same.

Mentored-by: Christian Couder christian.cou...@gmail.com
Mentored-by: Matthieu Moy matthieu@grenoble-inp.fr
Signed-off-by: Karthik Nayak karthik@gmail.com
---
 Documentation/git-tag.txt |  16 ++-
 builtin/tag.c | 344 ++
 t/t7004-tag.sh|   8 +-
 3 files changed, 52 insertions(+), 316 deletions(-)

diff --git a/Documentation/git-tag.txt b/Documentation/git-tag.txt
index 84f6496..3ac4a96 100644
--- a/Documentation/git-tag.txt
+++ b/Documentation/git-tag.txt
@@ -13,7 +13,7 @@ SYNOPSIS
tagname [commit | object]
 'git tag' -d tagname...
 'git tag' [-n[num]] -l [--contains commit] [--points-at object]
-   [--column[=options] | --no-column] [--create-reflog] [pattern...]
+   [--column[=options] | --no-column] [--create-reflog] [--sort=key] 
[pattern...]
 'git tag' -v tagname...
 
 DESCRIPTION
@@ -94,14 +94,16 @@ OPTIONS
using fnmatch(3)).  Multiple patterns may be given; if any of
them matches, the tag is shown.
 
---sort=type::
-   Sort in a specific order. Supported type is refname
-   (lexicographic order), version:refname or v:refname (tag
+--sort=key::
+   Sort based on the key given.  Prefix `-` to sort in
+   descending order of the value. You may use the --sort=key option
+   multiple times, in which case the last key becomes the primary
+   key. Also supports version:refname or v:refname (tag
names are treated as versions). The version:refname sort
order can also be affected by the
-   versionsort.prereleaseSuffix configuration variable. Prepend
-   - to reverse sort order. When this option is not given, the
-   sort order defaults to the value configured for the 'tag.sort'
+   versionsort.prereleaseSuffix configuration variable.
+   The keys supported are the same as those in `git for-each-ref`.
+   Sort order defaults to the value configured for the 'tag.sort'
variable if it exists, or lexicographic order otherwise. See
linkgit:git-config[1].
 
diff --git a/builtin/tag.c b/builtin/tag.c
index e96bae2..2d348f4 100644
--- a/builtin/tag.c
+++ b/builtin/tag.c
@@ -28,278 +28,34 @@ static const char * const git_tag_usage[] = {
NULL
 };
 
-#define STRCMP_SORT 0  /* must be zero */
-#define VERCMP_SORT 1
-#define SORT_MASK   0x7fff
-#define REVERSE_SORT0x8000
-
-static int tag_sort;
-
 static unsigned int colopts;
 
-static int match_pattern(const char **patterns, const char *ref)
-{
-   /* no pattern means match everything */
-   if (!*patterns)
-   return 1;
-   for (; *patterns; patterns++)
-   if (!wildmatch(*patterns, ref, 0, NULL))
-   return 1;
-   return 0;
-}
-
-/*
- * This is currently duplicated in ref-filter.c, and will eventually be
- * removed as we port tag.c to use the ref-filter APIs.
- */
-static const unsigned char *match_points_at(const char *refname,
-   const unsigned char *sha1,
-   struct sha1_array *points_at)
-{
-   const unsigned char *tagged_sha1 = NULL;
-   struct object *obj;
-
-   if (sha1_array_lookup(points_at, sha1) = 0)
-   return sha1;
-   obj = parse_object(sha1);
-   if (!obj)
-   die(_(malformed object at '%s'), refname);
-   if (obj-type == OBJ_TAG)
-   tagged_sha1 = ((struct tag *)obj)-tagged-sha1;
-   if (tagged_sha1  sha1_array_lookup(points_at, tagged_sha1) = 0)
-   return tagged_sha1;
-   return NULL;
-}
-
-static int in_commit_list(const struct commit_list *want, struct commit *c)
-{
-   for (; want; want = want-next)
-   if (!hashcmp(want-item-object.sha1, c-object.sha1))
-   return 1;
-   return 0;
-}
-
-/*
- * The entire code segment for supporting the --contains option has been
- * copied over to ref-filter.{c,h}. This will be deleted evetually when
- * we port tag.c to use ref-filter APIs.
- */
-enum contains_result {
-   CONTAINS_UNKNOWN = -1,
-   CONTAINS_NO = 0,
-   CONTAINS_YES = 1
-};
-
-/*
- * Test whether the 

[PATCH v14 09/13] ref-filter: add option to match literal pattern

2015-08-29 Thread Karthik Nayak
From: Karthik Nayak karthik@gmail.com

Since 'ref-filter' only has an option to match path names add an
option for plain fnmatch pattern-matching.

This is to support the pattern matching options which are used in `git
tag -l` and `git branch -l` where we can match patterns like `git tag
-l foo*` which would match all tags which has a foo* pattern.

Mentored-by: Christian Couder christian.cou...@gmail.com
Mentored-by: Matthieu Moy matthieu@grenoble-inp.fr
Signed-off-by: Karthik Nayak karthik@gmail.com
---
 builtin/for-each-ref.c |  1 +
 ref-filter.c   | 40 +---
 ref-filter.h   |  3 ++-
 3 files changed, 40 insertions(+), 4 deletions(-)

diff --git a/builtin/for-each-ref.c b/builtin/for-each-ref.c
index 40f343b..4e9f6c2 100644
--- a/builtin/for-each-ref.c
+++ b/builtin/for-each-ref.c
@@ -68,6 +68,7 @@ int cmd_for_each_ref(int argc, const char **argv, const char 
*prefix)
git_config(git_default_config, NULL);
 
filter.name_patterns = argv;
+   filter.match_as_path = 1;
filter_refs(array, filter, FILTER_REFS_ALL | 
FILTER_REFS_INCLUDE_BROKEN);
ref_array_sort(sorting, array);
 
diff --git a/ref-filter.c b/ref-filter.c
index 434f2c9..f268cd7 100644
--- a/ref-filter.c
+++ b/ref-filter.c
@@ -1165,9 +1165,33 @@ static int commit_contains(struct ref_filter *filter, 
struct commit *commit)
 
 /*
  * Return 1 if the refname matches one of the patterns, otherwise 0.
+ * A pattern can be a literal prefix (e.g. a refname refs/heads/master
+ * matches a pattern refs/heads/mas) or a wildcard (e.g. the same ref
+ * matches refs/heads/mas*, too).
+ */
+static int match_pattern(const char **patterns, const char *refname)
+{
+   /*
+* When no '--format' option is given we need to skip the prefix
+* for matching refs of tags and branches.
+*/
+   (void)(skip_prefix(refname, refs/tags/, refname) ||
+  skip_prefix(refname, refs/heads/, refname) ||
+  skip_prefix(refname, refs/remotes/, refname) ||
+  skip_prefix(refname, refs/, refname));
+
+   for (; *patterns; patterns++) {
+   if (!wildmatch(*patterns, refname, 0, NULL))
+   return 1;
+   }
+   return 0;
+}
+
+/*
+ * Return 1 if the refname matches one of the patterns, otherwise 0.
  * A pattern can be path prefix (e.g. a refname refs/heads/master
- * matches a pattern refs/heads/) or a wildcard (e.g. the same ref
- * matches refs/heads/m*,too).
+ * matches a pattern refs/heads/ but not refs/heads/m) or a
+ * wildcard (e.g. the same ref matches refs/heads/m*, too).
  */
 static int match_name_as_path(const char **pattern, const char *refname)
 {
@@ -1188,6 +1212,16 @@ static int match_name_as_path(const char **pattern, 
const char *refname)
return 0;
 }
 
+/* Return 1 if the refname matches one of the patterns, otherwise 0. */
+static int filter_pattern_match(struct ref_filter *filter, const char *refname)
+{
+   if (!*filter-name_patterns)
+   return 1; /* No pattern always matches */
+   if (filter-match_as_path)
+   return match_name_as_path(filter-name_patterns, refname);
+   return match_pattern(filter-name_patterns, refname);
+}
+
 /*
  * Given a ref (sha1, refname), check if the ref belongs to the array
  * of sha1s. If the given ref is a tag, check if the given tag points
@@ -1294,7 +1328,7 @@ static int ref_filter_handler(const char *refname, const 
struct object_id *oid,
if (!(kind  filter-kind))
return 0;
 
-   if (*filter-name_patterns  
!match_name_as_path(filter-name_patterns, refname))
+   if (!filter_pattern_match(filter, refname))
return 0;
 
if (filter-points_at.nr  !match_points_at(filter-points_at, 
oid-hash, refname))
diff --git a/ref-filter.h b/ref-filter.h
index 1282d70..179944c 100644
--- a/ref-filter.h
+++ b/ref-filter.h
@@ -59,7 +59,8 @@ struct ref_filter {
} merge;
struct commit *merge_commit;
 
-   unsigned int with_commit_tag_algo : 1;
+   unsigned int with_commit_tag_algo : 1,
+   match_as_path : 1;
unsigned int kind,
lines;
 };
-- 
2.5.0

--
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 v14 03/13] utf8: add function to align a string into given strbuf

2015-08-29 Thread Karthik Nayak
Add strbuf_utf8_align() which will align a given string into a strbuf
as per given align_type and width. If the width is greater than the
string length then no alignment is performed.

Helped-by: Eric Sunshine sunsh...@sunshineco.com
Mentored-by: Christian Couder christian.cou...@gmail.com
Mentored-by: Matthieu Moy matthieu@grenoble-inp.fr
Signed-off-by: Karthik Nayak karthik@gmail.com
---
 utf8.c | 21 +
 utf8.h | 15 +++
 2 files changed, 36 insertions(+)

diff --git a/utf8.c b/utf8.c
index 28e6d76..00e10c8 100644
--- a/utf8.c
+++ b/utf8.c
@@ -644,3 +644,24 @@ int skip_utf8_bom(char **text, size_t len)
*text += strlen(utf8_bom);
return 1;
 }
+
+void strbuf_utf8_align(struct strbuf *buf, align_type position, unsigned int 
width,
+  const char *s)
+{
+   int slen = strlen(s);
+   int display_len = utf8_strnwidth(s, slen, 0);
+   int utf8_compensation = slen - display_len;
+
+   if (display_len = width) {
+   strbuf_addstr(buf, s);
+   return;
+   }
+
+   if (position == ALIGN_LEFT)
+   strbuf_addf(buf, %-*s, width + utf8_compensation, s);
+   else if (position == ALIGN_MIDDLE) {
+   int left = (width - display_len) / 2;
+   strbuf_addf(buf, %*s%-*s, left, , width - left + 
utf8_compensation, s);
+   } else if (position == ALIGN_RIGHT)
+   strbuf_addf(buf, %*s, width + utf8_compensation, s);
+}
diff --git a/utf8.h b/utf8.h
index 5a9e94b..7930b44 100644
--- a/utf8.h
+++ b/utf8.h
@@ -55,4 +55,19 @@ int mbs_chrlen(const char **text, size_t *remainder_p, const 
char *encoding);
  */
 int is_hfs_dotgit(const char *path);
 
+typedef enum {
+   ALIGN_LEFT,
+   ALIGN_MIDDLE,
+   ALIGN_RIGHT
+} align_type;
+
+/*
+ * Align the string given and store it into a strbuf as per the
+ * 'position' and 'width'. If the given string length is larger than
+ * 'width' than then the input string is not truncated and no
+ * alignment is done.
+ */
+void strbuf_utf8_align(struct strbuf *buf, align_type position, unsigned int 
width,
+  const char *s);
+
 #endif
-- 
2.5.0

--
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 v14 00/13] Port tag.c to use ref-filter.c

2015-08-29 Thread Karthik Nayak
This is part of porting tag.c to ref-filter APIs.
Version 13 can be found:
thread.gmane.org/gmane.comp.version-control.git/276363

Changes in this version:
* Introduce format_ref_array_item() and make show_ref_array_item() a
wrapper around the same.
* Introduce %(contents:lines=X) which gets the first X lines from a
given object.
* Change code in 05/13 to make the code neater and consistent.
* %(align) without arguments fails now.
* Add test for nested alignment.
* We perform quoting on each layer of nested alignment. 

Karthik Nayak (13):
  ref-filter: move `struct atom_value` to ref-filter.c
  ref-filter: introduce ref_formatting_state and ref_formatting_stack
  utf8: add function to align a string into given strbuf
  ref-filter: implement an `align` atom
  ref-filter: add option to filter out tags, branches and remotes
  ref-filter: introduce format_ref_array_item()
  ref-filter: add support for %(contents:lines=X)
  ref-filter: add support to sort by version
  ref-filter: add option to match literal pattern
  tag.c: use 'ref-filter' data structures
  tag.c: use 'ref-filter' APIs
  tag.c: implement '--format' option
  tag.c: implement '--merged' and '--no-merged' options

 Documentation/git-for-each-ref.txt |  13 ++
 Documentation/git-tag.txt  |  27 ++-
 builtin/for-each-ref.c |   1 +
 builtin/tag.c  | 368 ++--
 ref-filter.c   | 418 -
 ref-filter.h   |  32 ++-
 refs.c |   9 +
 refs.h |   1 +
 t/t6302-for-each-ref-filter.sh | 137 
 t/t7004-tag.sh |  47 -
 utf8.c |  21 ++
 utf8.h |  15 ++
 12 files changed, 712 insertions(+), 377 deletions(-)

Interdiff between version 13 and version 14

diff --git a/Documentation/git-for-each-ref.txt 
b/Documentation/git-for-each-ref.txt
index 06d468e..1b48b95 100644
--- a/Documentation/git-for-each-ref.txt
+++ b/Documentation/git-for-each-ref.txt
@@ -149,6 +149,7 @@ Its first line is `contents:subject`, where subject is the 
concatenation
 of all lines of the commit message up to the first blank line.  The next
 line is 'contents:body', where body is all of the lines after the first
 blank line.  Finally, the optional GPG signature is `contents:signature`.
+The first `N` lines of the object is obtained using `contents:lines=N`.
 
 For sorting purposes, fields with numeric values sort in numeric
 order (`objectsize`, `authordate`, `committerdate`, `taggerdate`).
diff --git a/builtin/for-each-ref.c b/builtin/for-each-ref.c
index 3ad6a64..4e9f6c2 100644
--- a/builtin/for-each-ref.c
+++ b/builtin/for-each-ref.c
@@ -75,7 +75,7 @@ int cmd_for_each_ref(int argc, const char **argv, const char 
*prefix)
if (!maxcount || array.nr  maxcount)
maxcount = array.nr;
for (i = 0; i  maxcount; i++)
-   show_ref_array_item(array.items[i], format, quote_style, 0);
+   show_ref_array_item(array.items[i], format, quote_style);
ref_array_clear(array);
return 0;
 }
diff --git a/builtin/tag.c b/builtin/tag.c
index bbbcaed..9fa1400 100644
--- a/builtin/tag.c
+++ b/builtin/tag.c
@@ -33,6 +33,7 @@ static unsigned int colopts;
 static int list_tags(struct ref_filter *filter, struct ref_sorting *sorting, 
const char *format)
 {
struct ref_array array;
+   char *to_free = NULL;
int i;
 
memset(array, 0, sizeof(array));
@@ -42,7 +43,8 @@ static int list_tags(struct ref_filter *filter, struct 
ref_sorting *sorting, con
 
if (!format) {
if (filter-lines)
-   format = %(align:16,left)%(refname:short)%(end);
+   format = to_free = 
xstrfmt(%%(align:15,left)%%(refname:short)%%(end) %%(contents:lines=%d),
+  filter-lines);
else
format = %(refname:short);
}
@@ -52,8 +54,9 @@ static int list_tags(struct ref_filter *filter, struct 
ref_sorting *sorting, con
ref_array_sort(sorting, array);
 
for (i = 0; i  array.nr; i++)
-   show_ref_array_item(array.items[i], format, QUOTE_NONE, 
filter-lines);
+   show_ref_array_item(array.items[i], format, 0);
ref_array_clear(array);
+   free(to_free);
 
return 0;
 }
diff --git a/ref-filter.c b/ref-filter.c
index f8b8fb7..f268cd7 100644
--- a/ref-filter.c
+++ b/ref-filter.c
@@ -58,6 +58,7 @@ static struct {
{ color },
{ align },
{ end },
+   { contents:lines },
 };
 
 struct align {
@@ -65,6 +66,11 @@ struct align {
unsigned int width;
 };
 
+struct contents {
+   unsigned int lines;
+   struct object_id oid;
+};
+
 #define REF_FORMATTING_STATE_INIT  { 0, NULL }
 
 struct ref_formatting_stack {
@@ -82,6 +88,7 @@ struct 

[PATCH v14 01/13] ref-filter: move `struct atom_value` to ref-filter.c

2015-08-29 Thread Karthik Nayak
Since atom_value is only required for the internal working of
ref-filter it doesn't belong in the public header.

Helped-by: Eric Sunshine sunsh...@sunshineco.com
Mentored-by: Christian Couder christian.cou...@gmail.com
Mentored-by: Matthieu Moy matthieu@grenoble-inp.fr
Signed-off-by: Karthik Nayak karthik@gmail.com
---
 ref-filter.c | 5 +
 ref-filter.h | 5 +
 2 files changed, 6 insertions(+), 4 deletions(-)

diff --git a/ref-filter.c b/ref-filter.c
index 46963a5..e53c77e 100644
--- a/ref-filter.c
+++ b/ref-filter.c
@@ -55,6 +55,11 @@ static struct {
{ color },
 };
 
+struct atom_value {
+   const char *s;
+   unsigned long ul; /* used for sorting when not FIELD_STR */
+};
+
 /*
  * An atom is a valid field atom listed above, possibly prefixed with
  * a * to denote deref_tag().
diff --git a/ref-filter.h b/ref-filter.h
index 6bf27d8..45026d0 100644
--- a/ref-filter.h
+++ b/ref-filter.h
@@ -16,10 +16,7 @@
 #define FILTER_REFS_INCLUDE_BROKEN 0x1
 #define FILTER_REFS_ALL 0x2
 
-struct atom_value {
-   const char *s;
-   unsigned long ul; /* used for sorting when not FIELD_STR */
-};
+struct atom_value;
 
 struct ref_sorting {
struct ref_sorting *next;
-- 
2.5.0

--
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 v14 02/13] ref-filter: introduce ref_formatting_state and ref_formatting_stack

2015-08-29 Thread Karthik Nayak
Introduce ref_formatting_state which will hold the formatted output
strbuf instead of directly printing to stdout. This will help us in
creating modifier atoms which modify the format specified before
printing to stdout.

Implement a stack machinery for ref_formatting_state, this allows us
to push and pop elements onto the stack. Whenever we pop an element
from the stack, the strbuf from that element is appended to the strbuf
of the next element on the stack, this will allow us to support
nesting of modifier atoms.

Rename some functions to reflect the changes made:
print_value() - append_atom()
emit()- append_literal()

Mentored-by: Christian Couder christian.cou...@gmail.com
Mentored-by: Matthieu Moy matthieu@grenoble-inp.fr
Signed-off-by: Karthik Nayak karthik@gmail.com
---
 ref-filter.c | 78 +---
 1 file changed, 59 insertions(+), 19 deletions(-)

diff --git a/ref-filter.c b/ref-filter.c
index e53c77e..432cea0 100644
--- a/ref-filter.c
+++ b/ref-filter.c
@@ -55,6 +55,18 @@ static struct {
{ color },
 };
 
+#define REF_FORMATTING_STATE_INIT  { 0, NULL }
+
+struct ref_formatting_stack {
+   struct ref_formatting_stack *prev;
+   struct strbuf output;
+};
+
+struct ref_formatting_state {
+   int quote_style;
+   struct ref_formatting_stack *stack;
+};
+
 struct atom_value {
const char *s;
unsigned long ul; /* used for sorting when not FIELD_STR */
@@ -129,6 +141,27 @@ int parse_ref_filter_atom(const char *atom, const char *ep)
return at;
 }
 
+static void push_stack_element(struct ref_formatting_stack **stack)
+{
+   struct ref_formatting_stack *s = xcalloc(1, sizeof(struct 
ref_formatting_stack));
+
+   strbuf_init(s-output, 0);
+   s-prev = *stack;
+   *stack = s;
+}
+
+static void pop_stack_element(struct ref_formatting_stack **stack)
+{
+   struct ref_formatting_stack *current = *stack;
+   struct ref_formatting_stack *prev = current-prev;
+
+   if (prev)
+   strbuf_addbuf(prev-output, current-output);
+   strbuf_release(current-output);
+   free(current);
+   *stack = prev;
+}
+
 /*
  * In a format string, find the next occurrence of %(atom).
  */
@@ -1195,30 +1228,27 @@ void ref_array_sort(struct ref_sorting *sorting, struct 
ref_array *array)
qsort(array-items, array-nr, sizeof(struct ref_array_item *), 
compare_refs);
 }
 
-static void print_value(struct atom_value *v, int quote_style)
+static void append_atom(struct atom_value *v, struct ref_formatting_state 
*state)
 {
-   struct strbuf sb = STRBUF_INIT;
-   switch (quote_style) {
+   struct strbuf *s = state-stack-output;
+
+   switch (state-quote_style) {
case QUOTE_NONE:
-   fputs(v-s, stdout);
+   strbuf_addstr(s, v-s);
break;
case QUOTE_SHELL:
-   sq_quote_buf(sb, v-s);
+   sq_quote_buf(s, v-s);
break;
case QUOTE_PERL:
-   perl_quote_buf(sb, v-s);
+   perl_quote_buf(s, v-s);
break;
case QUOTE_PYTHON:
-   python_quote_buf(sb, v-s);
+   python_quote_buf(s, v-s);
break;
case QUOTE_TCL:
-   tcl_quote_buf(sb, v-s);
+   tcl_quote_buf(s, v-s);
break;
}
-   if (quote_style != QUOTE_NONE) {
-   fputs(sb.buf, stdout);
-   strbuf_release(sb);
-   }
 }
 
 static int hex1(char ch)
@@ -1239,8 +1269,10 @@ static int hex2(const char *cp)
return -1;
 }
 
-static void emit(const char *cp, const char *ep)
+static void append_literal(const char *cp, const char *ep, struct 
ref_formatting_state *state)
 {
+   struct strbuf *s = state-stack-output;
+
while (*cp  (!ep || cp  ep)) {
if (*cp == '%') {
if (cp[1] == '%')
@@ -1248,13 +1280,13 @@ static void emit(const char *cp, const char *ep)
else {
int ch = hex2(cp + 1);
if (0 = ch) {
-   putchar(ch);
+   strbuf_addch(s, ch);
cp += 3;
continue;
}
}
}
-   putchar(*cp);
+   strbuf_addch(s, *cp);
cp++;
}
 }
@@ -1262,19 +1294,24 @@ static void emit(const char *cp, const char *ep)
 void show_ref_array_item(struct ref_array_item *info, const char *format, int 
quote_style)
 {
const char *cp, *sp, *ep;
+   struct strbuf *final_buf;
+   struct ref_formatting_state state = REF_FORMATTING_STATE_INIT;
+
+   state.quote_style = quote_style;
+   push_stack_element(state.stack);
 
for (cp = format; *cp  (sp = 

[PATCH v14 06/13] ref-filter: introduce format_ref_array_item()

2015-08-29 Thread Karthik Nayak
Create format_ref_array_item() out of show_ref_array_item(). This will
store the output format for the given ref_array_item into the provided
strbuf. Make show_ref_array_item() a wrapper around this to print the
given ref_array_item with linefeed.

Mentored-by: Christian Couder christian.cou...@gmail.com
Mentored-by: Matthieu Moy matthieu@grenoble-inp.fr
Signed-off-by: Karthik Nayak karthik@gmail.com
---
 ref-filter.c | 59 +--
 ref-filter.h |  7 +--
 2 files changed, 38 insertions(+), 28 deletions(-)

diff --git a/ref-filter.c b/ref-filter.c
index 5d4f93d..1e6754a 100644
--- a/ref-filter.c
+++ b/ref-filter.c
@@ -153,6 +153,27 @@ int parse_ref_filter_atom(const char *atom, const char *ep)
return at;
 }
 
+static void quote_formatting(struct strbuf *s, const char *str, int 
quote_style)
+{
+   switch (quote_style) {
+   case QUOTE_NONE:
+   strbuf_addstr(s, str);
+   break;
+   case QUOTE_SHELL:
+   sq_quote_buf(s, str);
+   break;
+   case QUOTE_PERL:
+   perl_quote_buf(s, str);
+   break;
+   case QUOTE_PYTHON:
+   python_quote_buf(s, str);
+   break;
+   case QUOTE_TCL:
+   tcl_quote_buf(s, str);
+   break;
+   }
+}
+
 static void push_stack_element(struct ref_formatting_stack **stack)
 {
struct ref_formatting_stack *s = xcalloc(1, sizeof(struct 
ref_formatting_stack));
@@ -665,27 +686,6 @@ static void align_atom_handler(struct atom_value *atomv, 
struct ref_formatting_s
new-cb_data = atomv-align;
 }
 
-static void quote_formatting(struct strbuf *s, const char *str, int 
quote_style)
-{
-   switch (quote_style) {
-   case QUOTE_NONE:
-   strbuf_addstr(s, str);
-   break;
-   case QUOTE_SHELL:
-   sq_quote_buf(s, str);
-   break;
-   case QUOTE_PERL:
-   perl_quote_buf(s, str);
-   break;
-   case QUOTE_PYTHON:
-   python_quote_buf(s, str);
-   break;
-   case QUOTE_TCL:
-   tcl_quote_buf(s, str);
-   break;
-   }
-}
-
 static void append_atom(struct atom_value *v, struct ref_formatting_state 
*state)
 {
/*
@@ -1445,10 +1445,10 @@ static void append_literal(const char *cp, const char 
*ep, struct ref_formatting
}
 }
 
-void show_ref_array_item(struct ref_array_item *info, const char *format, int 
quote_style)
+void format_ref_array_item(struct strbuf *out, struct ref_array_item *info,
+  const char *format, int quote_style)
 {
const char *cp, *sp, *ep;
-   struct strbuf *final_buf;
struct ref_formatting_state state = REF_FORMATTING_STATE_INIT;
 
state.quote_style = quote_style;
@@ -1478,10 +1478,17 @@ void show_ref_array_item(struct ref_array_item *info, 
const char *format, int qu
}
if (state.stack-prev)
die(_(format: `end` atom missing));
-   final_buf = state.stack-output;
-   fwrite(final_buf-buf, 1, final_buf-len, stdout);
+   strbuf_addbuf(out, state.stack-output);
pop_stack_element(state.stack);
-   putchar('\n');
+}
+
+void show_ref_array_item(struct ref_array_item *item, const char *format, 
unsigned int quote_style)
+{
+   struct strbuf out = STRBUF_INIT;
+   format_ref_array_item(out, item, format, quote_style);
+   fwrite(out.buf, out.len, 1, stdout);
+   printf(\n);
+   strbuf_release(out);
 }
 
 /*  If no sorting option is given, use refname to sort as default */
diff --git a/ref-filter.h b/ref-filter.h
index 0913ba9..082bee5 100644
--- a/ref-filter.h
+++ b/ref-filter.h
@@ -91,8 +91,11 @@ int parse_ref_filter_atom(const char *atom, const char *ep);
 int verify_ref_format(const char *format);
 /*  Sort the given ref_array as per the ref_sorting provided */
 void ref_array_sort(struct ref_sorting *sort, struct ref_array *array);
-/*  Print the ref using the given format and quote_style */
-void show_ref_array_item(struct ref_array_item *info, const char *format, int 
quote_style);
+/*  Format the ref as per given format and quote_style and store it into the 
strbuf */
+void format_ref_array_item(struct strbuf *out, struct ref_array_item *info,
+  const char *format, int quote_style);
+/*  Wrapper around format_ref_array_item() which prints the given 
ref_array_item */
+void show_ref_array_item(struct ref_array_item *item, const char *format, 
unsigned int quote_style);
 /*  Callback function for parsing the sort option */
 int parse_opt_ref_sorting(const struct option *opt, const char *arg, int 
unset);
 /*  Default sort option based on refname */
-- 
2.5.0

--
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 v14 12/13] tag.c: implement '--format' option

2015-08-29 Thread Karthik Nayak
Implement the '--format' option provided by 'ref-filter'.
This lets the user list tags as per desired format similar
to the implementation in 'git for-each-ref'.

Add tests and documentation for the same.

Mentored-by: Christian Couder christian.cou...@gmail.com
Mentored-by: Matthieu Moy matthieu@grenoble-inp.fr
Signed-off-by: Karthik Nayak karthik@gmail.com
---
 Documentation/git-tag.txt |  8 +++-
 builtin/tag.c | 22 +-
 t/t7004-tag.sh| 12 
 3 files changed, 32 insertions(+), 10 deletions(-)

diff --git a/Documentation/git-tag.txt b/Documentation/git-tag.txt
index 3ac4a96..0c7f4e6 100644
--- a/Documentation/git-tag.txt
+++ b/Documentation/git-tag.txt
@@ -13,7 +13,8 @@ SYNOPSIS
tagname [commit | object]
 'git tag' -d tagname...
 'git tag' [-n[num]] -l [--contains commit] [--points-at object]
-   [--column[=options] | --no-column] [--create-reflog] [--sort=key] 
[pattern...]
+   [--column[=options] | --no-column] [--create-reflog] [--sort=key]
+   [--format=format] [pattern...]
 'git tag' -v tagname...
 
 DESCRIPTION
@@ -158,6 +159,11 @@ This option is only applicable when listing tags without 
annotation lines.
The object that the new tag will refer to, usually a commit.
Defaults to HEAD.
 
+format::
+   A string that interpolates `%(fieldname)` from the object
+   pointed at by a ref being shown.  The format is the same as
+   that of linkgit:git-for-each-ref[1].  When unspecified,
+   defaults to `%(refname:short)`.
 
 CONFIGURATION
 -
diff --git a/builtin/tag.c b/builtin/tag.c
index 2d348f4..dc4494d 100644
--- a/builtin/tag.c
+++ b/builtin/tag.c
@@ -23,17 +23,17 @@ static const char * const git_tag_usage[] = {
N_(git tag [-a | -s | -u key-id] [-f] [-m msg | -F file] 
tagname [head]),
N_(git tag -d tagname...),
N_(git tag -l [-n[num]] [--contains commit] [--points-at object]
-   \n\t\t[pattern...]),
+   \n\t\t[--format=format] [pattern...]),
N_(git tag -v tagname...),
NULL
 };
 
 static unsigned int colopts;
 
-static int list_tags(struct ref_filter *filter, struct ref_sorting *sorting)
+static int list_tags(struct ref_filter *filter, struct ref_sorting *sorting, 
const char *format)
 {
struct ref_array array;
-   char *format, *to_free = NULL;
+   char *to_free = NULL;
int i;
 
memset(array, 0, sizeof(array));
@@ -41,11 +41,13 @@ static int list_tags(struct ref_filter *filter, struct 
ref_sorting *sorting)
if (filter-lines == -1)
filter-lines = 0;
 
-   if (filter-lines)
-   format = to_free = 
xstrfmt(%%(align:15,left)%%(refname:short)%%(end) %%(contents:lines=%d),
-  filter-lines);
-   else
-   format = %(refname:short);
+   if (!format) {
+   if (filter-lines)
+   format = to_free = 
xstrfmt(%%(align:15,left)%%(refname:short)%%(end) %%(contents:lines=%d),
+  filter-lines);
+   else
+   format = %(refname:short);
+   }
 
verify_ref_format(format);
filter_refs(array, filter, FILTER_REFS_TAGS);
@@ -329,6 +331,7 @@ int cmd_tag(int argc, const char **argv, const char *prefix)
struct strbuf err = STRBUF_INIT;
struct ref_filter filter;
static struct ref_sorting *sorting = NULL, **sorting_tail = sorting;
+   const char *format = NULL;
struct option options[] = {
OPT_CMDMODE('l', list, cmdmode, N_(list tag names), 'l'),
{ OPTION_INTEGER, 'n', NULL, filter.lines, N_(n),
@@ -361,6 +364,7 @@ int cmd_tag(int argc, const char **argv, const char *prefix)
OPTION_CALLBACK, 0, points-at, filter.points_at, 
N_(object),
N_(print only tags of the object), 0, 
parse_opt_object_name
},
+   OPT_STRING(  0 , format, format, N_(format), N_(format to 
use for the output)),
OPT_END()
};
 
@@ -401,7 +405,7 @@ int cmd_tag(int argc, const char **argv, const char *prefix)
run_column_filter(colopts, copts);
}
filter.name_patterns = argv;
-   ret = list_tags(filter, sorting);
+   ret = list_tags(filter, sorting, format);
if (column_active(colopts))
stop_column_filter();
return ret;
diff --git a/t/t7004-tag.sh b/t/t7004-tag.sh
index 84153ef..8987fb1 100755
--- a/t/t7004-tag.sh
+++ b/t/t7004-tag.sh
@@ -1519,4 +1519,16 @@ EOF
test_cmp expect actual
 '
 
+test_expect_success '--format should list tags as per format given' '
+   cat expect -\EOF 
+   refname : refs/tags/foo1.10
+   refname : refs/tags/foo1.3
+   refname : refs/tags/foo1.6
+   refname : 

Re: [PATCH] show-ref: place angle brackets around variables in usage string

2015-08-29 Thread Philip Oakley

From: Alex Henrie alexhenri...@gmail.com

Signed-off-by: Alex Henrie alexhenri...@gmail.com
---
builtin/show-ref.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/builtin/show-ref.c b/builtin/show-ref.c
index dfbc314..131ef28 100644
--- a/builtin/show-ref.c
+++ b/builtin/show-ref.c
@@ -8,7 +8,7 @@

static const char * const show_ref_usage[] = {
 N_(git show-ref [-q | --quiet] [--verify] [--head] [-d 
| --dereference] [-s | --hash[=n]] [--abbrev[=n]] [--tags] 
[--heads] [--] [pattern...]),

- N_(git show-ref --exclude-existing[=pattern]  ref-list),
+ N_(git show-ref --exclude-existing[=pattern]  ref-list),


Should the '' stdin redirection be shown?

It looks (at first glance) as if this gained a double ' ' at the 
beginning of 'ref-list', rather than being a clean indication of the 
redirection. Perhaps change 'ref-list' to 'ref-list-file' for a slight 
improvement in clarity - this it's only occurance, and the redirection 
would best match a file.




 NULL
};

--
2.5.0


--
Philip
(will be offline for 4 days) 


--
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: [FEATURE REQUEST] Filter-branch extend progress with a simple estimated time remaning

2015-08-29 Thread Gabor Bernat
Hello,

Here's what I ended up using, and seemed to work well:
https://github.com/gaborbernat/git/commit/766841bc1b726a5d6e7e051938b82975368695a0

Does this looks okay, should I create a patch from this?

Thanks,
Bernát GÁBOR


On Wed, Aug 26, 2015 at 4:15 AM, Jeff King p...@peff.net wrote:
 On Tue, Aug 25, 2015 at 04:12:54PM -0400, Eric Sunshine wrote:

  A little googling came up with:
 
  awk 'END { print systime() }' /dev/null
 
  which probably (?) works everywhere.

 On Mac OS X and FreeBSD:

 $ awk 'END { print systime() }' /dev/null
 awk: calling undefined function systime
 source line number 1
 $

 Oh, well. The reference I saw was that the old Kernighan nawk had it,
 but that seems not to be the case:

   http://www.cs.princeton.edu/~bwk/btl.mirror/

 date +%s seems to work on OS X, and so presumably on other BSDs. No
 clue what would work on stuff like SunOS, AIX, 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: [FEATURE REQUEST] Filter-branch extend progress with a simple estimated time remaning

2015-08-29 Thread Gabor Bernat
Amended, the latest version is at https://github.com/gaborbernat/git/commit/ :)
Bernát GÁBOR


On Sat, Aug 29, 2015 at 11:50 AM, Gabor Bernat ber...@primeranks.net wrote:
 Hello,

 Here's what I ended up using, and seemed to work well:
 https://github.com/gaborbernat/git/commit/766841bc1b726a5d6e7e051938b82975368695a0

 Does this looks okay, should I create a patch from this?

 Thanks,
 Bernát GÁBOR


 On Wed, Aug 26, 2015 at 4:15 AM, Jeff King p...@peff.net wrote:
 On Tue, Aug 25, 2015 at 04:12:54PM -0400, Eric Sunshine wrote:

  A little googling came up with:
 
  awk 'END { print systime() }' /dev/null
 
  which probably (?) works everywhere.

 On Mac OS X and FreeBSD:

 $ awk 'END { print systime() }' /dev/null
 awk: calling undefined function systime
 source line number 1
 $

 Oh, well. The reference I saw was that the old Kernighan nawk had it,
 but that seems not to be the case:

   http://www.cs.princeton.edu/~bwk/btl.mirror/

 date +%s seems to work on OS X, and so presumably on other BSDs. No
 clue what would work on stuff like SunOS, AIX, 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


[PATCH v14 05/13] ref-filter: add option to filter out tags, branches and remotes

2015-08-29 Thread Karthik Nayak
From: Karthik Nayak karthik@gmail.com

Add a function called 'for_each_fullref_in()' to refs.{c,h} which
iterates through each ref for the given path without trimming the path
and also accounting for broken refs, if mentioned.

Add 'filter_ref_kind()' in ref-filter.c to check the kind of ref being
handled and return the kind to 'ref_filter_handler()', where we
discard refs which we do not need and assign the kind to needed refs.

Mentored-by: Christian Couder christian.cou...@gmail.com
Mentored-by: Matthieu Moy matthieu@grenoble-inp.fr
Signed-off-by: Karthik Nayak karthik@gmail.com
---
 ref-filter.c | 63 +++-
 ref-filter.h | 13 +++--
 refs.c   |  9 +
 refs.h   |  1 +
 4 files changed, 79 insertions(+), 7 deletions(-)

diff --git a/ref-filter.c b/ref-filter.c
index 21c8b5f..5d4f93d 100644
--- a/ref-filter.c
+++ b/ref-filter.c
@@ -1160,6 +1160,34 @@ static struct ref_array_item *new_ref_array_item(const 
char *refname,
return ref;
 }
 
+static int filter_ref_kind(struct ref_filter *filter, const char *refname)
+{
+   unsigned int i;
+
+   static struct {
+   const char *prefix;
+   unsigned int kind;
+   } ref_kind[] = {
+   { refs/heads/ , FILTER_REFS_BRANCHES },
+   { refs/remotes/ , FILTER_REFS_REMOTES },
+   { refs/tags/, FILTER_REFS_TAGS}
+   };
+
+   if (filter-kind == FILTER_REFS_BRANCHES ||
+   filter-kind == FILTER_REFS_REMOTES ||
+   filter-kind == FILTER_REFS_TAGS)
+   return filter-kind;
+   else if (!strcmp(refname, HEAD))
+   return FILTER_REFS_DETACHED_HEAD;
+
+   for (i = 0; i  ARRAY_SIZE(ref_kind); i++) {
+   if (starts_with(refname, ref_kind[i].prefix))
+   return ref_kind[i].kind;
+   }
+
+   return FILTER_REFS_OTHERS;
+}
+
 /*
  * A call-back given to for_each_ref().  Filter refs and keep them for
  * later object processing.
@@ -1170,6 +1198,7 @@ static int ref_filter_handler(const char *refname, const 
struct object_id *oid,
struct ref_filter *filter = ref_cbdata-filter;
struct ref_array_item *ref;
struct commit *commit = NULL;
+   unsigned int kind;
 
if (flag  REF_BAD_NAME) {
warning(ignoring ref with broken name %s, refname);
@@ -1181,6 +1210,15 @@ static int ref_filter_handler(const char *refname, const 
struct object_id *oid,
return 0;
}
 
+   /*
+* Get the current ref kind. If we're filtering tags, remotes or local 
branches
+* only then the current ref-kind is nothing but filter-kind and 
filter_ref_kind()
+* will only return that value.
+*/
+   kind = filter_ref_kind(filter, refname);
+   if (!(kind  filter-kind))
+   return 0;
+
if (*filter-name_patterns  
!match_name_as_path(filter-name_patterns, refname))
return 0;
 
@@ -1212,6 +1250,7 @@ static int ref_filter_handler(const char *refname, const 
struct object_id *oid,
 
REALLOC_ARRAY(ref_cbdata-array-items, ref_cbdata-array-nr + 1);
ref_cbdata-array-items[ref_cbdata-array-nr++] = ref;
+   ref-kind = kind;
return 0;
 }
 
@@ -1288,17 +1327,31 @@ int filter_refs(struct ref_array *array, struct 
ref_filter *filter, unsigned int
 {
struct ref_filter_cbdata ref_cbdata;
int ret = 0;
+   unsigned int broken = 0;
 
ref_cbdata.array = array;
ref_cbdata.filter = filter;
 
+   if (type  FILTER_REFS_INCLUDE_BROKEN)
+   broken = 1;
+   filter-kind = type  FILTER_REFS_KIND_MASK;
+
/*  Simple per-ref filtering */
-   if (type  (FILTER_REFS_ALL | FILTER_REFS_INCLUDE_BROKEN))
-   ret = for_each_rawref(ref_filter_handler, ref_cbdata);
-   else if (type  FILTER_REFS_ALL)
-   ret = for_each_ref(ref_filter_handler, ref_cbdata);
-   else if (type)
+   if (!filter-kind)
die(filter_refs: invalid type);
+   else {
+   if (filter-kind == FILTER_REFS_BRANCHES)
+   ret = for_each_fullref_in(refs/heads/, 
ref_filter_handler, ref_cbdata, broken);
+   else if (filter-kind == FILTER_REFS_REMOTES)
+   ret = for_each_fullref_in(refs/remotes/, 
ref_filter_handler, ref_cbdata, broken);
+   else if (filter-kind == FILTER_REFS_TAGS)
+   ret = for_each_fullref_in(refs/tags/, 
ref_filter_handler, ref_cbdata, broken);
+   else if (filter-kind  FILTER_REFS_ALL)
+   ret = for_each_fullref_in(, ref_filter_handler, 
ref_cbdata, broken);
+   if (!ret  (filter-kind  FILTER_REFS_DETACHED_HEAD))
+   head_ref(ref_filter_handler, ref_cbdata);
+   }
+
 
/*  Filters that need revision walking */
if (filter-merge_commit)
diff --git 

Re: [PATCH] stash: Add stash.showFlag config variable

2015-08-29 Thread Namhyung Kim
Hi,

On Sat, Aug 29, 2015 at 3:10 AM, Junio C Hamano gits...@pobox.com wrote:
 Namhyung Kim namhy...@gmail.com writes:

 Perhaps a pair of new booleans

  - stash.showStat (defaults to true but you can turn it off)
  - stash.showPatch (defaults to false but you can turn it on)

 or something along that line might be sufficient and more palatable.

 Hmm.. I agree with you, but I don't know what we should do if both of
 the options were off.  Just run 'git diff' with no option is ok to you?

 If the user does not want stat or patch, then not running anything
 would be more appropriate, don't you think?

Ah, ok. :)  I'll change that way and send v3 soon!

Thanks,
Namhyung
--
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 v3] stash: Add two config variables for stash show

2015-08-29 Thread Namhyung Kim
Some users might want to see diff (patch) output always rather than
diffstat when [s]he runs 'git stash show'.  Although this can be done
with adding -p option, it'd be better to provide a config option to
control this behavior IMHO.

This patch adds two variables which control to show diffstat and patch
output respectively.  The stash.showStat is for diffstat and default is
true.  The stat.showPatch is for the patch output and default is false.

Signed-off-by: Namhyung Kim namhy...@gmail.com
---
 Documentation/config.txt| 10 ++
 Documentation/git-stash.txt |  2 ++
 git-stash.sh| 20 +++-
 3 files changed, 31 insertions(+), 1 deletion(-)

diff --git a/Documentation/config.txt b/Documentation/config.txt
index f5d15ff..b4c8ee1 100644
--- a/Documentation/config.txt
+++ b/Documentation/config.txt
@@ -2567,6 +2567,16 @@ status.submoduleSummary::
submodule summary' command, which shows a similar output but does
not honor these settings.
 
+stash.showPatch::
+   If this is set to true, the `git stash show` command without an
+   option will show the stash in patch form.  Defaults to false.
+   See description of 'show' command in linkgit:git-stash[1].
+
+stash.showStat::
+   If this is set to true, the `git stash show` command without an
+   option will show diffstat of the stash.  Defaults to true.
+   See description of 'show' command in linkgit:git-stash[1].
+
 submodule.name.path::
 submodule.name.url::
The path within this project and URL for a submodule. These
diff --git a/Documentation/git-stash.txt b/Documentation/git-stash.txt
index 375213f..92df596 100644
--- a/Documentation/git-stash.txt
+++ b/Documentation/git-stash.txt
@@ -95,6 +95,8 @@ show [stash]::
shows the latest one. By default, the command shows the diffstat, but
it will accept any format known to 'git diff' (e.g., `git stash show
-p stash@{1}` to view the second most recent stash in patch form).
+   You can use stash.showStat and/or stash.showPatch config variables
+   to change the default behavior.
 
 pop [--index] [-q|--quiet] [stash]::
 
diff --git a/git-stash.sh b/git-stash.sh
index 1d5ba7a..c7c65e2 100755
--- a/git-stash.sh
+++ b/git-stash.sh
@@ -305,7 +305,25 @@ show_stash () {
ALLOW_UNKNOWN_FLAGS=t
assert_stash_like $@
 
-   git diff ${FLAGS:---stat} $b_commit $w_commit
+   if test -z $FLAGS
+   then
+   if test $(git config --bool stash.showStat || echo true) = 
true
+   then
+   FLAGS=--stat
+   fi
+
+   if test $(git config --bool stash.showPatch || echo false) = 
true
+   then
+   FLAGS=${FLAGS}${FLAGS:+ }-p
+   fi
+
+   if test -z $FLAGS
+   then
+   return 0
+   fi
+   fi
+
+   git diff ${FLAGS} $b_commit $w_commit
 }
 
 show_help () {
-- 
2.5.0

--
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 v14 03/13] utf8: add function to align a string into given strbuf

2015-08-29 Thread Torsten Bögershausen
On 29.08.15 16:12, Karthik Nayak wrote:
 diff --git a/utf8.h b/utf8.h
 index 5a9e94b..7930b44 100644
 --- a/utf8.h
 +++ b/utf8.h
 @@ -55,4 +55,19 @@ int mbs_chrlen(const char **text, size_t *remainder_p, 
 const char *encoding);
   */
  int is_hfs_dotgit(const char *path);
  
 +typedef enum {
 + ALIGN_LEFT,
 + ALIGN_MIDDLE,
 + ALIGN_RIGHT
 +} align_type;
should this be called strbuf_align_type ?

And is there a reason why the is in utf.c and not in stbuf.c ?

(I know that there is a lot of strbuf in utf8.c, but I hadn't managed to send a 
patch
to move everything into strbuf.c and make utf8.c un-aware of all 
strbub-business)


--
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 v14 03/13] utf8: add function to align a string into given strbuf

2015-08-29 Thread Karthik Nayak
On Sat, Aug 29, 2015 at 10:40 PM, Torsten Bögershausen tbo...@web.de wrote:
 On 29.08.15 16:12, Karthik Nayak wrote:
 diff --git a/utf8.h b/utf8.h
 index 5a9e94b..7930b44 100644
 --- a/utf8.h
 +++ b/utf8.h
 @@ -55,4 +55,19 @@ int mbs_chrlen(const char **text, size_t *remainder_p, 
 const char *encoding);
   */
  int is_hfs_dotgit(const char *path);

 +typedef enum {
 + ALIGN_LEFT,
 + ALIGN_MIDDLE,
 + ALIGN_RIGHT
 +} align_type;
 should this be called strbuf_align_type ?


align_type seemed descriptive and unique enough.

 And is there a reason why the is in utf.c and not in stbuf.c ?

 (I know that there is a lot of strbuf in utf8.c, but I hadn't managed to send 
 a patch
 to move everything into strbuf.c and make utf8.c un-aware of all 
 strbub-business)


This was based on Eric's suggestions.
http://article.gmane.org/gmane.comp.version-control.git/275456

It makes sense also, since rather than acting on a strbuf, this is more of just
utilizing an strbuf to provide the result. whereas the real work is of
alignment.




-- 
Regards,
Karthik Nayak
--
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] show-ref: place angle brackets around variables in usage string

2015-08-29 Thread Alex Henrie
2015-08-29 4:21 GMT-06:00 Philip Oakley philipoak...@iee.org:
 Should the '' stdin redirection be shown?

 It looks (at first glance) as if this gained a double ' ' at the beginning
 of 'ref-list', rather than being a clean indication of the redirection.
 Perhaps change 'ref-list' to 'ref-list-file' for a slight improvement in
 clarity - this it's only occurance, and the redirection would best match a
 file.

This syntax occurs in three other places in Git:

git cat-file (--batch | --batch-check) [--follow-symlinks]  list-of-objects

git check-attr --stdin [-z] [-a | --all | attr...]  list-of-paths

git hash-object  --stdin-paths  list-of-paths

So if we need to say ref-list-file for clarity, we should also say
object-list-file and path-list-file for these other commands.

I think the most sane thing to do is to commit this patch as-is, and
then someone can submit a separate patch to reword all four usage
strings for increased clarity.

-Alex
--
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 v14 06/13] ref-filter: introduce format_ref_array_item()

2015-08-29 Thread Eric Sunshine
On Sat, Aug 29, 2015 at 10:12 AM, Karthik Nayak karthik@gmail.com wrote:
 Create format_ref_array_item() out of show_ref_array_item(). This will
 store the output format for the given ref_array_item into the provided
 strbuf. Make show_ref_array_item() a wrapper around this to print the
 given ref_array_item with linefeed.

Perhaps you could explain why this change is a good idea, such as that
a future patch, for fill-in-the-blank reason, will need the
formatting capability of format_ref_array_item() but not the printing
with newline done by show_ref_array_item().

 Signed-off-by: Karthik Nayak karthik@gmail.com
 ---
 diff --git a/ref-filter.c b/ref-filter.c
 index 5d4f93d..1e6754a 100644
 --- a/ref-filter.c
 +++ b/ref-filter.c
 @@ -153,6 +153,27 @@ int parse_ref_filter_atom(const char *atom, const char 
 *ep)
 return at;
  }

 +static void quote_formatting(struct strbuf *s, const char *str, int 
 quote_style)
 +{
 +   switch (quote_style) {
 +   case QUOTE_NONE:
 +   strbuf_addstr(s, str);
 +   break;
 +   case QUOTE_SHELL:
 +   sq_quote_buf(s, str);
 +   break;
 +   case QUOTE_PERL:
 +   perl_quote_buf(s, str);
 +   break;
 +   case QUOTE_PYTHON:
 +   python_quote_buf(s, str);
 +   break;
 +   case QUOTE_TCL:
 +   tcl_quote_buf(s, str);
 +   break;
 +   }
 +}

This code was already relocated once in patch 4/13, and is now being
relocated again in 6/13. If you instead place the code at the final
desired location in 4/13, then this patch will become less noisy.

More below.

  static void push_stack_element(struct ref_formatting_stack **stack)
  {
 struct ref_formatting_stack *s = xcalloc(1, sizeof(struct 
 ref_formatting_stack));
 @@ -665,27 +686,6 @@ static void align_atom_handler(struct atom_value *atomv, 
 struct ref_formatting_s
 new-cb_data = atomv-align;
  }

 -static void quote_formatting(struct strbuf *s, const char *str, int 
 quote_style)
 -{
 -   switch (quote_style) {
 -   case QUOTE_NONE:
 -   strbuf_addstr(s, str);
 -   break;
 -   case QUOTE_SHELL:
 -   sq_quote_buf(s, str);
 -   break;
 -   case QUOTE_PERL:
 -   perl_quote_buf(s, str);
 -   break;
 -   case QUOTE_PYTHON:
 -   python_quote_buf(s, str);
 -   break;
 -   case QUOTE_TCL:
 -   tcl_quote_buf(s, str);
 -   break;
 -   }
 -}
 -
  static void append_atom(struct atom_value *v, struct ref_formatting_state 
 *state)
  {
 /*
 @@ -1478,10 +1478,17 @@ void show_ref_array_item(struct ref_array_item *info, 
 const char *format, int qu
 }
 if (state.stack-prev)
 die(_(format: `end` atom missing));
 -   final_buf = state.stack-output;
 -   fwrite(final_buf-buf, 1, final_buf-len, stdout);
 +   strbuf_addbuf(out, state.stack-output);
 pop_stack_element(state.stack);
 -   putchar('\n');
 +}
 +
 +void show_ref_array_item(struct ref_array_item *item, const char *format, 
 unsigned int quote_style)
 +{
 +   struct strbuf out = STRBUF_INIT;
 +   format_ref_array_item(out, item, format, quote_style);
 +   fwrite(out.buf, out.len, 1, stdout);
 +   printf(\n);

putchar('\n');

 +   strbuf_release(out);
  }

  /*  If no sorting option is given, use refname to sort as default */
--
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: [FEATURE REQUEST] Filter-branch extend progress with a simple estimated time remaning

2015-08-29 Thread Gabor Bernat
Reading after it, I think the most close we can get with this is, awk
'BEGIN { print strftime(%c, 1271603087); }; and just ignore setting
this value (and avoid displaying it) if that fails too. Do you agree?
Bernát GÁBOR


On Sun, Aug 30, 2015 at 3:20 AM, Eric Sunshine sunsh...@sunshineco.com wrote:
 On Sat, Aug 29, 2015 at 9:29 AM, Gabor Bernat ber...@primeranks.net wrote:
 Amended, the latest version is at https://github.com/gaborbernat/git/commit/ 
 :)
 Does this looks okay, should I create a patch from this?

 Excerpt:

 now=$(date +%s)
 elapsed=$(($now - $start))
 remaining_second=$((...))
 eta=$(($now + $remaining_second))
 finish_by=$(date -d @$eta)

 Unfortunately, -d is not portable. On Mac OS X and FreeBSD, -d sets
 the kernel's value for Daylight Saving Time, rather than displaying
 the specified time as in Linux.
--
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


git bisect replay produces wrong result

2015-08-29 Thread Neil Brown

Hi,
 the following git-bisect log - applied to a recent linux-kernel tree
 produced different end results when I use git bisect replay
 and when I just run it as a shell script.

$ git bisect replay /tmp/log 
We are not bisecting.
Bisecting: a merge base must be tested
[2decb2682f80759f631c8332f9a2a34a02150a03] Merge 
git://git.kernel.org/pub/scm/linux/kernel/git/davem/net


$ bash /tmp/log

Bisecting: 2 revisions left to test after this (roughly 1 step)
[57127645d79d2e83e801f141f7d03f64accf28aa] s390/zcrypt: Introduce new SHA-512 
based Pseudo Random Generator.

Is git bisect replay doing the wrong thing, or am I confused?

I tested on 2.5.0, and the current HEAD.

Thanks,
NeilBrown

git bisect start
# bad: [5ebe6afaf0057ac3eaeb98defd5456894b446d22] Linux 4.1-rc2
git bisect bad 5ebe6afaf0057ac3eaeb98defd5456894b446d22
# good: [39a8804455fb23f09157341d3ba7db6d7ae6ee76] Linux 4.0
git bisect good 39a8804455fb23f09157341d3ba7db6d7ae6ee76
# good: [6c373ca89399c5a3f7ef210ad8f63dc3437da345] Merge 
git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-next
git bisect good 6c373ca89399c5a3f7ef210ad8f63dc3437da345
# good: [2c33ce009ca2389dbf0535d0672214d09738e35e] Merge Linus master into 
drm-next
git bisect good 2c33ce009ca2389dbf0535d0672214d09738e35e
# good: [7d2b6ef19cf0f98cef17aa5185de3631a618710a] Merge tag 'armsoc-drivers' 
of  git://git.kernel.org/pub/scm/linux/kernel/git/arm/arm-soc
git bisect good 7d2b6ef19cf0f98cef17aa5185de3631a618710a
# good: [836ee4874e201a5907f9658fb2bf3527dd952d30] Merge tag 'arm64-upstream' 
of git://git.kernel.org/pub/scm/linux/kernel/git/arm64/linux
git bisect good 836ee4874e201a5907f9658fb2bf3527dd952d30
# good: [78d425677217b655ed36c492a070b5002832fc73] Merge tag 
'platform-drivers-x86-v4.1-1' of 
git://git.infradead.org/users/dvhart/linux-platform-drivers-x86
git bisect good 78d425677217b655ed36c492a070b5002832fc73
# good: [39376ccb1968ba9f83e2a880a8bf02ad5dea44e1] Merge 
git://git.kernel.org/pub/scm/linux/kernel/git/pablo/nf
git bisect good 39376ccb1968ba9f83e2a880a8bf02ad5dea44e1
# bad: [64887b6882de36069c18ef2d9623484d6db7cd3a] Merge branch 'for-linus-4.1' 
of git://git.kernel.org/pub/scm/linux/kernel/git/mason/linux-btrfs
git bisect bad 64887b6882de36069c18ef2d9623484d6db7cd3a
# bad: [9dbbe3cfc3c208643cf0e81c8f660f43e1b4b2e8] Merge tag 'for-linus' of 
git://git.kernel.org/pub/scm/virt/kvm/kvm
git bisect bad 9dbbe3cfc3c208643cf0e81c8f660f43e1b4b2e8
# bad: [dcca8de0aa597f14e31a1b38690626c9f6745fd5] Merge tag 'usb-4.1-rc2' of 
git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/usb
git bisect bad dcca8de0aa597f14e31a1b38690626c9f6745fd5
# bad: [3d99e3fe13d473ac4578c37f477a59b829530764] Merge branch 'stable' of 
git://git.kernel.org/pub/scm/linux/kernel/git/cmetcalf/linux-tile
git bisect bad 3d99e3fe13d473ac4578c37f477a59b829530764
# good: [b7d14f3a92223c3f5e52e9f20c74cb96dc130e87] s390/mm: correct transfer of 
dirty  young bits in __pmd_to_pte
git bisect good b7d14f3a92223c3f5e52e9f20c74cb96dc130e87


signature.asc
Description: PGP signature


Re: [FEATURE REQUEST] Filter-branch extend progress with a simple estimated time remaning

2015-08-29 Thread Eric Sunshine
(Please don't top-post on this list.)

On Sat, Aug 29, 2015 at 11:00 PM, Gabor Bernat ber...@primeranks.net wrote:
 Reading after it, I think the most close we can get with this is, awk
 'BEGIN { print strftime(%c, 1271603087); }; and just ignore setting
 this value (and avoid displaying it) if that fails too. Do you agree?

strftime() in awk is a GNU-ism. It doesn't exist in awk on Mac OS X or
FreeBSD, or even the default awk on Linux (which is mawk on Linux
installations I've checked).

Most portable likely would be Perl, however, that's probably too
heavyweight inside a loop like this, even if called only once each N
iterations.

 On Sun, Aug 30, 2015 at 3:20 AM, Eric Sunshine sunsh...@sunshineco.com 
 wrote:
 On Sat, Aug 29, 2015 at 9:29 AM, Gabor Bernat ber...@primeranks.net wrote:
 Amended, the latest version is at 
 https://github.com/gaborbernat/git/commit/ :)
 Does this looks okay, should I create a patch from this?

 Excerpt:

 now=$(date +%s)
 elapsed=$(($now - $start))
 remaining_second=$((...))
 eta=$(($now + $remaining_second))
 finish_by=$(date -d @$eta)

 Unfortunately, -d is not portable. On Mac OS X and FreeBSD, -d sets
 the kernel's value for Daylight Saving Time, rather than displaying
 the specified time as in Linux.
--
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 v14 05/13] ref-filter: add option to filter out tags, branches and remotes

2015-08-29 Thread Eric Sunshine
On Sat, Aug 29, 2015 at 10:12 AM, Karthik Nayak karthik@gmail.com wrote:
 Add a function called 'for_each_fullref_in()' to refs.{c,h} which
 iterates through each ref for the given path without trimming the path
 and also accounting for broken refs, if mentioned.

 Add 'filter_ref_kind()' in ref-filter.c to check the kind of ref being
 handled and return the kind to 'ref_filter_handler()', where we
 discard refs which we do not need and assign the kind to needed refs.

 Signed-off-by: Karthik Nayak karthik@gmail.com
 ---
 diff --git a/refs.c b/refs.c
 index 4e15f60..a9469c2 100644
 --- a/refs.c
 +++ b/refs.c
 @@ -2108,6 +2108,15 @@ int for_each_ref_in(const char *prefix, each_ref_fn 
 fn, void *cb_data)
 return do_for_each_ref(ref_cache, prefix, fn, strlen(prefix), 0, 
 cb_data);
  }

 +int for_each_fullref_in(const char *prefix, each_ref_fn fn, void *cb_data, 
 unsigned int broken)

Booleans such as 'broken' are typically declared 'int' in this
codebase, rather than 'unsigned int'.

 +{
 +   unsigned int flag = 0;
 +
 +   if (broken)
 +   flag = DO_FOR_EACH_INCLUDE_BROKEN;
 +   return do_for_each_ref(ref_cache, prefix, fn, 0, flag, cb_data);
 +}
 +
  int for_each_ref_in_submodule(const char *submodule, const char *prefix,
 each_ref_fn fn, void *cb_data)
  {
 diff --git a/refs.h b/refs.h
 index e9a5f32..6d30c98 100644
 --- a/refs.h
 +++ b/refs.h
 @@ -173,6 +173,7 @@ typedef int each_ref_fn(const char *refname,
  extern int head_ref(each_ref_fn fn, void *cb_data);
  extern int for_each_ref(each_ref_fn fn, void *cb_data);
  extern int for_each_ref_in(const char *prefix, each_ref_fn fn, void 
 *cb_data);
 +extern int for_each_fullref_in(const char *prefix, each_ref_fn fn, void 
 *cb_data, unsigned int broken);
  extern int for_each_tag_ref(each_ref_fn fn, void *cb_data);
  extern int for_each_branch_ref(each_ref_fn fn, void *cb_data);
  extern int for_each_remote_ref(each_ref_fn fn, void *cb_data);
--
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 v14 04/13] ref-filter: implement an `align` atom

2015-08-29 Thread Eric Sunshine
On Sat, Aug 29, 2015 at 10:12 AM, Karthik Nayak karthik@gmail.com wrote:
 Implement an `align` atom which left-, middle-, or right-aligns the
 content between %(align:..) and %(end).

 It is followed by `:width,position`, where the `position` is
 either left, right or middle and `width` is the size of the area
 into which the content will be placed. If the content between
 %(align:) and %(end) is more than the width then no alignment is
 performed. e.g. to align a refname atom to the middle with a total
 width of 40 we can do: --format=%(align:middle,40)%(refname)%(end).

 We now have a `handler()` for each atom_value which will be called
 when that atom_value is being parsed, and similarly an `at_end`
 function for each element of the stack which is to be called when the
 `end` atom is encountered. Using this we implement the `align` atom
 which aligns the given strbuf by calling `strbuf_utf8_align()` from
 utf8.c.

 Extract perform_quote_formatting() from append_atom(). Given a string
 a quote_value and a strbuf, perform_quote_formatting() formats the
 string based on the quote_value and stores it into the strbuf.

 Ensure that quote formatting is performed on the whole of
 %(align)...%(end) rather than individual atoms. We do this by skipping
 individual quote formatting for atoms whenever the stack has more than
 one element, and performing formatting for the entire stack element
 when the `%(end)` atoms is encountered.

This patch seems to be conflating three distinct changes:

1. adding %(align:) atom
2. extracting quoting logic to a separate function
3. quoting top-level %(align:) but not contained atoms

In fact, #3 seems too specially tied to %(align:)...%(end). One might
expect that the logic for determining when to quote should be
independent of any particular atom, which suggests that this logic is
being handled at the wrong level, and that %(align:) shouldn't have to
know anything about quoting. I'd have thought the quoting logic would
naturally accompany the introduction of the formatting state stack
mechanism in patch 2/13, and that that would generically work with all
atoms, including %(align:) and whatever new ones are added in the
future.

But, I may not have been following the quoting discussion closely, so
perhaps these observations are incorrect?  See more below regarding
%(if:).

 Add documentation and tests for the same.

 Signed-off-by: Karthik Nayak karthik@gmail.com
 ---
 diff --git a/ref-filter.c b/ref-filter.c
 index 432cea0..21c8b5f 100644
 --- a/ref-filter.c
 +++ b/ref-filter.c
 @@ -53,6 +54,13 @@ static struct {
 { flag },
 { HEAD },
 { color },
 +   { align },
 +   { end },
 +};
 +
 +struct align {
 +   align_type position;
 +   unsigned int width;
  };

  #define REF_FORMATTING_STATE_INIT  { 0, NULL }
 @@ -69,6 +79,8 @@ struct ref_formatting_state {

  struct atom_value {
 const char *s;
 +   struct align *align;

Why does 'align' need to be heap-allocated rather than just being a
direct member of 'atom_value'? Does 'align' need to exist beyond the
lifetime of its 'atom_value'? If not, making it a direct member might
simplify resource management (no need to free it).

 +   void (*handler)(struct atom_value *atomv, struct ref_formatting_state 
 *state);
 unsigned long ul; /* used for sorting when not FIELD_STR */
  };

 @@ -632,6 +644,84 @@ static inline char *copy_advance(char *dst, const char 
 *src)
 +static void append_atom(struct atom_value *v, struct ref_formatting_state 
 *state)
 +{
 +   /*
 +* Quote formatting is only done when the stack has a single
 +* element. Otherwise quote formatting is done on the
 +* element's entire output strbuf when the %(end) atom is
 +* encountered.
 +*/
 +   if (!state-stack-prev)

With the disclaimer that I wasn't following the quoting discussion
closely: Is this condition going to be sufficient for all cases, such
as an %(if:) atom? That is, if you have:

%(if:notempty)%(bloop)%(then) --option=%(bloop)%(end)

isn't the intention that, %(bloop) within the %(then) section should
be quoted but not the literal --option=?

The condition `!state-stack-prev' would be insufficient to handle
this if %(if:) pushes one or more states onto the stack, no? This
implies that you might want an explicit flag for enabling/disabling
quoting rather than relying upon the state of the stack, and that
individual atom handlers would control that flag.

Or, am I misunderstanding due to not having followed the discussion closely?

 +   quote_formatting(state-stack-output, v-s, 
 state-quote_style);
 +   else
 +   strbuf_addstr(state-stack-output, v-s);
 +}
 +
 +static void end_atom_handler(struct atom_value *atomv, struct 
 ref_formatting_state *state)
 +{
 +   struct ref_formatting_stack *current = state-stack;
 +   struct strbuf s = STRBUF_INIT;
 +
 +   if (!current-at_end)
 +   

Re: [FEATURE REQUEST] Filter-branch extend progress with a simple estimated time remaning

2015-08-29 Thread Eric Sunshine
On Sat, Aug 29, 2015 at 9:29 AM, Gabor Bernat ber...@primeranks.net wrote:
 Amended, the latest version is at https://github.com/gaborbernat/git/commit/ 
 :)
 Does this looks okay, should I create a patch from this?

Excerpt:

now=$(date +%s)
elapsed=$(($now - $start))
remaining_second=$((...))
eta=$(($now + $remaining_second))
finish_by=$(date -d @$eta)

Unfortunately, -d is not portable. On Mac OS X and FreeBSD, -d sets
the kernel's value for Daylight Saving Time, rather than displaying
the specified time as in Linux.
--
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