# [PATCH 01/10] refs: add "for_each_bisect_ref" function

12 messages from 2009-03-26 to 2009-03-27. Participants: Christian Couder, Sverre Rabbelier, Michael J Gruber, Johannes Schindelin, Julian Phillips.
Thread: https://gitlist.dev/t/18556

## Christian Couder, 2009-03-26 04:55

Subject: [PATCH 01/10] refs: add "for_each_bisect_ref" function
Message-ID: <20090326055509.1bc16b28.chriscool@tuxfamily.org>
URL: https://gitlist.dev/e/20090326055509.1bc16b28.chriscool%40tuxfamily.org

```
Signed-off-by: Christian Couder <chriscool@tuxfamily.org>
---
 refs.c |    5 +++++
 refs.h |    1 +
 2 files changed, 6 insertions(+), 0 deletions(-)

diff --git a/refs.c b/refs.c
index 8d3c502..2b21148 100644
--- a/refs.c
+++ b/refs.c
@@ -662,6 +662,11 @@ int for_each_remote_ref(each_ref_fn fn, void *cb_data)
 	return do_for_each_ref("refs/remotes/", fn, 13, 0, cb_data);
 }
 
+int for_each_bisect_ref(each_ref_fn fn, void *cb_data)
+{
+	return do_for_each_ref("refs/bisect/", fn, 12, 0, cb_data);
+}
+
 int for_each_rawref(each_ref_fn fn, void *cb_data)
 {
 	return do_for_each_ref("refs/", fn, 0,
diff --git a/refs.h b/refs.h
index 29bdcec..e5d6e80 100644
--- a/refs.h
+++ b/refs.h
@@ -23,6 +23,7 @@ extern int for_each_ref(each_ref_fn, void *);
 extern int for_each_tag_ref(each_ref_fn, void *);
 extern int for_each_branch_ref(each_ref_fn, void *);
 extern int for_each_remote_ref(each_ref_fn, void *);
+extern int for_each_bisect_ref(each_ref_fn, void *);
 
 /* can be used to learn about broken ref and symref */
 extern int for_each_rawref(each_ref_fn, void *);
-- 
1.6.2.1.317.g3d804

```

## Sverre Rabbelier, 2009-03-26 06:20

Subject: Re: [PATCH 01/10] refs: add "for_each_bisect_ref" function
Message-ID: <fabb9a1e0903252320j2edf4a8ct39f784c4319c3cb0@mail.gmail.com>
URL: https://gitlist.dev/e/fabb9a1e0903252320j2edf4a8ct39f784c4319c3cb0%40mail.gmail.com
In-Reply-To: <20090326055509.1bc16b28.chriscool@tuxfamily.org>

```
Heya

On Thu, Mar 26, 2009 at 05:55, Christian Couder <chriscool@tuxfamily.org> wrote:
> Signed-off-by: Christian Couder <chriscool@tuxfamily.org>

A 10 patches series with no cover letter? And no description of the
individual patches either! C'mon Christian, you know better than that
;).

-- 
Cheers,

Sverre Rabbelier

```

## Christian Couder, 2009-03-26 07:48

Subject: Re: [PATCH 01/10] refs: add "for_each_bisect_ref" function
Message-ID: <200903260848.42104.chriscool@tuxfamily.org>
URL: https://gitlist.dev/e/200903260848.42104.chriscool%40tuxfamily.org
In-Reply-To: <fabb9a1e0903252320j2edf4a8ct39f784c4319c3cb0@mail.gmail.com>

```
Hi Sverre,

Le jeudi 26 mars 2009, Sverre Rabbelier a écrit :
> Heya
>
> On Thu, Mar 26, 2009 at 05:55, Christian Couder <chriscool@tuxfamily.org> 
wrote:
> > Signed-off-by: Christian Couder <chriscool@tuxfamily.org>
>
> A 10 patches series with no cover letter? 

I am not a big fan of cover letters. Usually I prefer adding comments in the 
patches.

> And no description of the 
> individual patches either! 

There is a commit message in each patch. And many of the patches are very 
small.

> C'mon Christian, you know better than that 
> ;).

If some commit messages are not clear enough, please tell me and I will try 
to improve them ;)

Regards,
Christian.

```

## Sverre Rabbelier, 2009-03-26 12:37

Subject: Re: [PATCH 01/10] refs: add "for_each_bisect_ref" function
Message-ID: <fabb9a1e0903260537r61647d82t4ffb6b8b67d5c2f1@mail.gmail.com>
URL: https://gitlist.dev/e/fabb9a1e0903260537r61647d82t4ffb6b8b67d5c2f1%40mail.gmail.com
In-Reply-To: <200903260848.42104.chriscool@tuxfamily.org>

```
Heya,

On Thu, Mar 26, 2009 at 08:48, Christian Couder <chriscool@tuxfamily.org> wrote:
> I am not a big fan of cover letters. Usually I prefer adding comments in the
> patches.

The downside of that is that it makes it harder to quickly scan the
series; now I have to go through each patch (which involves trying
finding which patch is next, as my MUA is retarded and doesn't
understand proper threading).

>> And no description of the
>> individual patches either!
>
> There is a commit message in each patch. And many of the patches are very
> small.

Hehe, my bad; the first one didn't have a commit message, which is the
one I looked at first.

> If some commit messages are not clear enough, please tell me and I will try
> to improve them ;)

The rest of the series is nicely readable, I guess I shouldn't send
whine mails before reading the entire series next time :).

-- 
Cheers,

Sverre Rabbelier

```

## Michael J Gruber, 2009-03-26 15:50

Subject: Re: [PATCH 01/10] refs: add "for_each_bisect_ref" function
Message-ID: <49CBA42D.3000404@drmicha.warpmail.net>
URL: https://gitlist.dev/e/49CBA42D.3000404%40drmicha.warpmail.net
In-Reply-To: <200903260848.42104.chriscool@tuxfamily.org>

```
Christian Couder venit, vidit, dixit 26.03.2009 08:48:
> Hi Sverre,
> 
> Le jeudi 26 mars 2009, Sverre Rabbelier a écrit :
>> Heya
>>
>> On Thu, Mar 26, 2009 at 05:55, Christian Couder <chriscool@tuxfamily.org> 
> wrote:
>>> Signed-off-by: Christian Couder <chriscool@tuxfamily.org>
>>
>> A 10 patches series with no cover letter? 
> 
> I am not a big fan of cover letters. Usually I prefer adding comments in the 
> patches.

I'm sorry I have to say that, but your individual preferences don't
matter. Many of us would do things differently, each in their own way,
but people adjust to the list's preferences. It's a matter of attitude.
So, please...

Cheers,
Michael

> 
>> And no description of the 
>> individual patches either! 
> 
> There is a commit message in each patch. And many of the patches are very 
> small.
> 
>> C'mon Christian, you know better than that 
>> ;).
> 
> If some commit messages are not clear enough, please tell me and I will try 
> to improve them ;)
> 
> Regards,
> Christian.

```

## Johannes Schindelin, 2009-03-26 16:52

Subject: Re: [PATCH 01/10] refs: add "for_each_bisect_ref" function
Message-ID: <alpine.DEB.1.00.0903261748280.12753@intel-tinevez-2-302>
URL: https://gitlist.dev/e/alpine.DEB.1.00.0903261748280.12753%40intel-tinevez-2-302
In-Reply-To: <49CBA42D.3000404@drmicha.warpmail.net>

```
Hi,

On Thu, 26 Mar 2009, Michael J Gruber wrote:

> Christian Couder venit, vidit, dixit 26.03.2009 08:48:
> 
> > Le jeudi 26 mars 2009, Sverre Rabbelier a écrit :
> >
> >> A 10 patches series with no cover letter?
> > 
> > I am not a big fan of cover letters. Usually I prefer adding comments 
> > in the patches.
> 
> I'm sorry I have to say that, but your individual preferences don't 
> matter. Many of us would do things differently, each in their own way, 
> but people adjust to the list's preferences. It's a matter of attitude. 
> So, please...

Actually, a better way to ask for a cover letter would have been to 
convince Christian.  So I'll try that.

>From the patch series' titles (especially when they are cropped due to the 
text window being too small to fit the indented thread), it is not all 
that obvious what you want to achieve with those 10 patches.

>From recent discussions, I seem to remember that you wanted to have some 
cute way to mark commits as non-testable during a bisect, and I further 
seem to remember that Junio said that very method should be usable outside 
of bisect, too.

Unfortunately, that does not reveal to me, quickly, what is the current 
state of affairs, and what you changed since the last time.

In addition, I am very sorry that I cannot review your patches; day job is 
killing me right now.

Ciao,
Dscho

```

## Sverre Rabbelier, 2009-03-26 16:54

Subject: Re: [PATCH 01/10] refs: add "for_each_bisect_ref" function
Message-ID: <fabb9a1e0903260954u23bd7c7aq505e016e7a5c0c29@mail.gmail.com>
URL: https://gitlist.dev/e/fabb9a1e0903260954u23bd7c7aq505e016e7a5c0c29%40mail.gmail.com
In-Reply-To: <alpine.DEB.1.00.0903261748280.12753@intel-tinevez-2-302>

```
Heya,

On Thu, Mar 26, 2009 at 17:52, Johannes Schindelin
<Johannes.Schindelin@gmx.de> > From the patch series' titles
(especially when they are cropped due to the
> text window being too small to fit the indented thread), it is not all
> that obvious what you want to achieve with those 10 patches.

<snip>

> Unfortunately, that does not reveal to me, quickly, what is the current
> state of affairs, and what you changed since the last time.

This is exactly what I meant to say, only worded much much better,
thanks Johannes! :)

-- 
Cheers,

Sverre Rabbelier

```

## Christian Couder, 2009-03-27 00:41

Subject: Re: [PATCH 01/10] refs: add "for_each_bisect_ref" function
Message-ID: <200903270141.57426.chriscool@tuxfamily.org>
URL: https://gitlist.dev/e/200903270141.57426.chriscool%40tuxfamily.org
In-Reply-To: <alpine.DEB.1.00.0903261748280.12753@intel-tinevez-2-302>

```
Le jeudi 26 mars 2009, Johannes Schindelin a écrit :
> Hi,
>
> On Thu, 26 Mar 2009, Michael J Gruber wrote:
> > Christian Couder venit, vidit, dixit 26.03.2009 08:48:
> > > Le jeudi 26 mars 2009, Sverre Rabbelier a écrit :
> > >> A 10 patches series with no cover letter?
> > >
> > > I am not a big fan of cover letters. Usually I prefer adding comments
> > > in the patches.
> >
> > I'm sorry I have to say that, but your individual preferences don't
> > matter. Many of us would do things differently, each in their own way,
> > but people adjust to the list's preferences. It's a matter of attitude.
> > So, please...
>
> Actually, a better way to ask for a cover letter would have been to
> convince Christian.  So I'll try that.

Thanks.

As you know, I have been sending patches since nearly 3 years ago to this 
list. And it's only since a few weeks ago that I am asked to send cover 
letters...

> From the patch series' titles (especially when they are cropped due to
> the text window being too small to fit the indented thread), it is not
> all that obvious what you want to achieve with those 10 patches.
>
> From recent discussions, I seem to remember that you wanted to have some
> cute way to mark commits as non-testable during a bisect, and I further
> seem to remember that Junio said that very method should be usable
> outside of bisect, too.

Well, we want to move "git bisect skip" code from shell (in "git-bisect.sh") 
to C. So this patch series does that by creating a new "git bisect--helper" 
command in C that contains the new code and using that new command 
in "git-bisect.sh".

> Unfortunately, that does not reveal to me, quickly, what is the current
> state of affairs, and what you changed since the last time.

Yeah, I should have at least put something in the comment section of my 
first patch in this series.

And I try to improve, you know, I even tried to use "git send-email" again 
this morning to see if perhaps I could use it to send my patch series.

I did:

$ git send-email --compose --dry-run bh15/*
Can't call method "repo_path" on an undefined value 
at /home/christian/libexec/git-core//git-send-email line 160.

and then I gave up, because I don't like spending a lot of my free time to 
fight with tools I don't like.

If someone knows some other tools that can easily send a threaded patch 
series, I will try to see if I can use them...

Thanks in advance,
Christian.

```

## Julian Phillips, 2009-03-27 01:32

Subject: sending patch sets (was: Re: [PATCH 01/10] refs: add "for_each_bisect_ref" function)
Message-ID: <alpine.LNX.2.00.0903270126210.25399@reaper.quantumfyre.co.uk>
URL: https://gitlist.dev/e/alpine.LNX.2.00.0903270126210.25399%40reaper.quantumfyre.co.uk
In-Reply-To: <200903270141.57426.chriscool@tuxfamily.org>

```
On Fri, 27 Mar 2009, Christian Couder wrote:

> If someone knows some other tools that can easily send a threaded patch
> series, I will try to see if I can use them...

I long ago gave up on send-email, as it seemed to cumbersome for what I 
wanted, and my perl had got so rusty I really couldn't face trying to 
improve it.

So I wrote a replacement in Python (attached), which I have subsequently 
used for all patches I've sent.  It calls format-patch, passing through 
arguments (and you can use -- to let it pass options too).

(the only setting it reads from git config atm is mail-commit.to)

I find it much easier to use than send-email, but as usual YMMV ...

-- 
Julian

  ---
Have you seen the latest Japanese camera?  Apparently it is so fast it can
photograph an American with his mouth shut!

#!/usr/bin/python

import optparse
import os
import random
import re
import smtplib
import socket
import sys
import tempfile
import time

from cStringIO import StringIO
from email.Generator import Generator
from email.Message import Message
from email.Parser import FeedParser, Parser
from email.Utils import parseaddr, parsedate, formatdate, \
                        getaddresses, formataddr

my_version = "0.1"
my_name = "git-mail-commits"
this_script = "%s v%s" % (my_name, my_version)

gci_re = re.compile("^(?P<email>(.*) <(.*)>) (\d+ [+-]\d{4})$")

smtp_server = "neutron"

# -----------------------------------------------------------------------------
def get_message_text(message):
    text_msg = StringIO()
    gen = Generator(text_msg, mangle_from_=False)
    gen.flatten(message)
    return text_msg.getvalue()
# -----------------------------------------------------------------------------

# -----------------------------------------------------------------------------
def send_message(msg):
    sent = (None, 'No destination address given')

    (a, fromaddr) = parseaddr(msg.get('From'))
    toaddr_list = msg.get_all('To', [])
    ccaddr_list = msg.get_all('CC', [])
    bccaddr_list = msg.get_all('BCC', [])
    all_recips = getaddresses(toaddr_list + ccaddr_list + bccaddr_list)
    to_list = [ email for (name, email) in all_recips ]

    if len(to_list) > 0:
        server = smtplib.SMTP(smtp_server)
        try:
            errors = server.sendmail(fromaddr, to_list, get_message_text(msg))
            sent = (errors, "Failed to send to one or more recipients")
        except smtplib.SMTPRecipientsRefused, rr:
            sent = (rr.recipients, "Failed to send to all recipients")
        server.quit()

    return sent
# -----------------------------------------------------------------------------

# -----------------------------------------------------------------------------
def get_msgid(idstring=None, idhost=socket.getfqdn(), email=None):
    """Returns a string suitable for RFC 2822 compliant Message-ID, e.g:

    <20020201195627.33539.96671@nightshade.la.mastaler.com>

    Optional idstring if given is a string used to strengthen the
    uniqueness of the message id.

    Based on email.Utils.make_msgid
    """
    timeval = time.time()
    utcdate = time.strftime('%Y%m%d%H%M%S', time.gmtime(timeval))
    pid = os.getpid()
    randint = random.randrange(100000)
    if email is not None:
        ids = ".%s" % (email)
    else:
        if idstring is None:
            idstring = ''
        else:
            idstring = '.' + idstring
        ids = "%s@%s" % (idstring, idhost)
    msgid = '<%s.%s.%s%s>' % (utcdate, pid, randint, ids)
    return msgid
# -----------------------------------------------------------------------------

def get_patches(args, numbered=True, signoff=True):
    patches = []
    cur_patch = None
#    print args
    opts = ['-M']
    if numbered:
        opts.append("-n")
    if signoff:
        opts.append("-s")
    fp = os.popen("git format-patch --stdout %s %s" % (' '.join(opts),
                                                       ' '.join(args)))
    for line in fp.readlines():
        if line[:5] == "From ":
            if cur_patch is not None:
                patches.append(cur_patch.close())
            cur_patch = FeedParser()
        cur_patch.feed(line)
    fp.close()
    if cur_patch is not None:
        patches.append(cur_patch.close())
    return patches

def format_patches(patches, to, initial_msg_id=None,
                   addr=None, cc_list=[]):
    refs = []
    if initial_msg_id is not None:
        refs.append(initial_msg_id)
    for patch in patches:
        if addr is not None:
            patch.replace_header("From", addr)
        if len(cc_list) > 0:
            cc = [x.strip() for x in patch.get("CC", "").split(",")]
            if len(cc) == 1 and cc[0] == "":
                cc = cc_list
            else:
                cc.extend(cc_list)
            del patch['CC']
            print cc
            patch.add_header("CC", ",".join(cc))
        subject = patch.get("Subject")
        (name, email) = parseaddr(patch.get("From"))
        sha1 = patch.get_unixfrom()[5:46]
        msg_id = get_msgid(email=email)
        patch.add_header("To", to)
        del patch['Message-Id']
        patch.add_header("Message-Id", msg_id)
        patch.add_header("X-git-sha1", sha1)
        del patch['X-Mailer']
        patch.add_header("X-Mailer", this_script)
        if len(refs) > 0:
            del patch['In-Reply-To']
            del patch['References']
            patch.add_header("In-Reply-To", refs[-1])
            patch.add_header("References", ' '.join(refs))
        refs.append(msg_id)
#        print "%s - %s" %(sha1[0:7], subject)
#        print patch

def get_git_committer_email():
    gv = os.popen("git var GIT_COMMITTER_IDENT")
    gci = gv.readline()
    gv.close()
#    print gci
    gci_m = gci_re.search(gci)
    if gci_m:
        return gci_m.group('email')
    else:
        print "Unable to get/parse GIT_COMMITTER_IDENT"
        sys.exit(-1)

def get_intro_msg(to, frm_addr, count, filename=None):
    if filename is None:
        if 'EDITOR' not in os.environ:
            print "$EDITOR not set, please set."
            sys.exit(-1)
        (fd, fname) = tempfile.mkstemp()
        f = os.fdopen(fd)
        ret = os.system("%s %s" % (os.environ['EDITOR'], fname))
        if not (os.WIFEXITED(ret) and os.WEXITSTATUS(ret) == 0):
            print "Failed to edit intro message."
            sys.exit(-1)
    else:
        f = open(filename)
    slist = []
    blist = []
    cur = slist
    for line in f.readlines():
        if line == "\n":
            cur = blist
            continue
        cur.append(line)
    f.close()
    if filename is None:
        os.remove(fname)
    subject = ''.join(slist).replace('\n', ' ')
    body = ''.join(blist)
    if subject == "":
        print "No subject for intro message, aborting."
        sys.exit(-1)
    msg = Message()
    msg.add_header('From', frm_addr)
    msg.add_header('To', to)
    (name, email) = parseaddr(msg.get("From"))
    msg.add_header('Message-Id', get_msgid(email=email))
    msg.set_payload(body)
    msg.add_header('Subject', "[PATCH 0/%d] %s" % (count, subject))
    msg.add_header("X-Mailer", this_script)
    return msg

def reply_to(fname):
    p = Parser()
    f = open(fname)
    msg = p.parse(f)
    f.close()
    cc = [x.strip() for x in msg['CC'].split(',')]
    return (msg['From'], msg['Message-ID'], cc)

def main():
    description = "send the given commits as patch emails to the specified " \
                  "address, all non-option arguments are passed to " \
                  "git-format-patch (\"--\" can be used to indicate the end " \
                  "of the options for this script)."
    
    parser = optparse.OptionParser(description=description)
    parser.disable_interspersed_args()

    parser.add_option("", "--to", action="store", default=None,
                      help="the address to send the mails to")

    parser.add_option("", "--cc", action="append", default=[],
                      help="copy the mails to this address")

    parser.add_option("", "--reply-to", action="store", default=None,
                      help="reply to the given mail (rather than use an intro)")

    parser.add_option("-n", "--numbered", action="store_true", default=False,
                      help="send numbered patches (adds -n to the "
                      "git-format-patch options)")

    parser.add_option("-f", "--from", dest="frm_addr", action="store",
                      default=None,
                      help="set FROM as the from address, otherwise use "
                      "GIT_COMMITTER_IDENT")

    parser.add_option("-i", "--intro", dest="intro", action="store_true",
                      help="start with a 0/n intro message using $EDITOR to "
                      "write the message (implies -n).")
    parser.add_option("-I", "--intro-file", dest="intro", action="store",
                      help="start with a 0/n intro message read from INTRO "
                      "(implies -n).")
    parser.set_defaults(intro=None)

    parser.add_option("-e", "--edit", action="store_true", default=False,
                      help="edit the patches before sending")

    parser.add_option("-S", "--no-signoff", dest="signoff",
                      action="store_false", default=True,
                      help="Don't signoff the patches")

    (options, args) = parser.parse_args()

    if len(args) < 1:
        print "You must specify at least one commit to send ..."
        sys.exit(-1)

    if options.to is None:
        gc = os.popen("git config mail-commits.to")
        to = gc.read()
        gc.close()
        if to == "":
            print "you must specify the destination using --to"
            sys.exit(-1)
        else:
            options.to = to.strip()

    print "Sending to: %s\n" % options.to

    if options.frm_addr is not None:
        frm_addr = options.frm_addr
    else:        
        frm_addr = get_git_committer_email()

    if options.intro is not None:
        options.numbered = True

    patches = get_patches(args, options.numbered, signoff=options.signoff)

    intro_msg = None
    intro_msg_id = None
    if options.intro is not None:
        fname = None
        if options.intro is not True:
            fname = options.intro
        intro_msg = get_intro_msg(options.to, frm_addr, len(patches),
                                  filename=fname)
        intro_msg_id = intro_msg.get('Message-Id')

    if options.reply_to is not None:
        (options.to, intro_msg_id, cc) = reply_to(options.reply_to)
        options.cc.extend(cc)

#    print intro_msg

    format_patches(patches, to=options.to, cc_list=options.cc,
                   initial_msg_id=intro_msg_id,
                   addr=frm_addr)

    if options.edit:
        new_patches = []
        for patch in patches:
            (fd, fname) = tempfile.mkstemp()
            f = os.fdopen(fd, "w+")
            f.write(get_message_text(patch))
            f.close()
            if 'EDITOR' not in os.environ:
                print "$EDITOR not set, please set."
                sys.exit(-1)
            ret = os.system("%s %s" % (os.environ['EDITOR'], fname))
            if not (os.WIFEXITED(ret) and os.WEXITSTATUS(ret) == 0):
                print "Failed to edit patch (%d)." % ret
                sys.exit(-1)
            p = FeedParser()
            f = open(fname)
            for line in f:
                p.feed(line)
            m = p.close()
            if m:
                new_patches.append(m)
            f.close()
            os.remove(fname)
        patches = new_patches

    if intro_msg:
        print intro_msg['Subject']
    for patch in patches:
        print patch['Subject']
    print
    print "Press [Enter] to send patches, Ctrl-C to cancel."
    try:
        raw_input()
    except KeyboardInterrupt:
        print "Not sending patches."
        sys.exit(-1)

    print "Sending patches ...\n"

    msgs=[intro_msg]
    msgs.extend(patches)
    for msg in msgs:
        if msg is None:
            continue
        (errors, errmsg) = send_message(msg)
        if len(errors) == 0:
            print "sent %s" % msg['Subject']
        else:
            print "error sending %s" % msg['Subject']
            for (name, (ecode, emsg)) in errors.items():
                print "  %s: %s %s" % (name, ecode, emsg)

if __name__ == "__main__":
    main()

```

## Johannes Schindelin, 2009-03-27 02:08

Subject: Re: [PATCH 01/10] refs: add "for_each_bisect_ref" function
Message-ID: <alpine.DEB.1.00.0903270305340.10279@pacific.mpi-cbg.de>
URL: https://gitlist.dev/e/alpine.DEB.1.00.0903270305340.10279%40pacific.mpi-cbg.de
In-Reply-To: <200903270141.57426.chriscool@tuxfamily.org>

```
Hi,

On Fri, 27 Mar 2009, Christian Couder wrote:

> Le jeudi 26 mars 2009, Johannes Schindelin a écrit :
>
> > On Thu, 26 Mar 2009, Michael J Gruber wrote:
> > > Christian Couder venit, vidit, dixit 26.03.2009 08:48:
> > > > Le jeudi 26 mars 2009, Sverre Rabbelier a écrit :
> > > >> A 10 patches series with no cover letter?
> > > >
> > > > I am not a big fan of cover letters. Usually I prefer adding 
> > > > comments in the patches.
> > >
> > > I'm sorry I have to say that, but your individual preferences don't 
> > > matter. Many of us would do things differently, each in their own 
> > > way, but people adjust to the list's preferences. It's a matter of 
> > > attitude. So, please...
> >
> > Actually, a better way to ask for a cover letter would have been to 
> > convince Christian.  So I'll try that.
> 
> Thanks.
> 
> As you know, I have been sending patches since nearly 3 years ago to 
> this list. And it's only since a few weeks ago that I am asked to send 
> cover letters...

Heh, I have the feeling that your patch series were much shorter, and did 
not have many revisions, until a few weeks ago ;-)

> > From the patch series' titles (especially when they are cropped due to 
> > the text window being too small to fit the indented thread), it is not 
> > all that obvious what you want to achieve with those 10 patches.
> >
> > From recent discussions, I seem to remember that you wanted to have 
> > some cute way to mark commits as non-testable during a bisect, and I 
> > further seem to remember that Junio said that very method should be 
> > usable outside of bisect, too.
> 
> Well, we want to move "git bisect skip" code from shell (in 
> "git-bisect.sh") to C. So this patch series does that by creating a new 
> "git bisect--helper" command in C that contains the new code and using 
> that new command in "git-bisect.sh".

Oh?  I _completely_ missed that.  And that's being one of the original 
Cc:ed persons...

> > Unfortunately, that does not reveal to me, quickly, what is the 
> > current state of affairs, and what you changed since the last time.
> 
> Yeah, I should have at least put something in the comment section of my 
> first patch in this series.

No.  I would still have missed it.

The cover letter is outside of any patch, because it describes the purpose 
of the _whole_ patch series, not just one patch.

So, it would have been nice to get a heads-up that this is not your 
bisect-skip-a-whole-bunch-of-commits series, but a new animal.

This way, I decided I do not have time for something I do not need, and 
deleted it without having a look.

Ciao,
Dscho

```

## Christian Couder, 2009-03-27 07:21

Subject: Re: [PATCH 01/10] refs: add "for_each_bisect_ref" function
Message-ID: <200903270821.03521.chriscool@tuxfamily.org>
URL: https://gitlist.dev/e/200903270821.03521.chriscool%40tuxfamily.org
In-Reply-To: <alpine.DEB.1.00.0903270305340.10279@pacific.mpi-cbg.de>

```
Le vendredi 27 mars 2009, Johannes Schindelin a écrit :
> Hi,
>
> On Fri, 27 Mar 2009, Christian Couder wrote:
> > Le jeudi 26 mars 2009, Johannes Schindelin a écrit :
> > > On Thu, 26 Mar 2009, Michael J Gruber wrote:
> > > > Christian Couder venit, vidit, dixit 26.03.2009 08:48:
> > > > > Le jeudi 26 mars 2009, Sverre Rabbelier a écrit :
> > > > >> A 10 patches series with no cover letter?
> > > > >
> > > > > I am not a big fan of cover letters. Usually I prefer adding
> > > > > comments in the patches.
> > > >
> > > > I'm sorry I have to say that, but your individual preferences don't
> > > > matter. Many of us would do things differently, each in their own
> > > > way, but people adjust to the list's preferences. It's a matter of
> > > > attitude. So, please...
> > >
> > > Actually, a better way to ask for a cover letter would have been to
> > > convince Christian.  So I'll try that.
> >
> > Thanks.
> >
> > As you know, I have been sending patches since nearly 3 years ago to
> > this list. And it's only since a few weeks ago that I am asked to send
> > cover letters...
>
> Heh, I have the feeling that your patch series were much shorter, and did
> not have many revisions, until a few weeks ago ;-)

Please try to look for a 9 patch long series that you reviewed around 
october 2007 with "dunno" or "skip" in the title ;-)

> > > From the patch series' titles (especially when they are cropped due
> > > to the text window being too small to fit the indented thread), it is
> > > not all that obvious what you want to achieve with those 10 patches.
> > >
> > > From recent discussions, I seem to remember that you wanted to have
> > > some cute way to mark commits as non-testable during a bisect, and I
> > > further seem to remember that Junio said that very method should be
> > > usable outside of bisect, too.
> >
> > Well, we want to move "git bisect skip" code from shell (in
> > "git-bisect.sh") to C. So this patch series does that by creating a new
> > "git bisect--helper" command in C that contains the new code and using
> > that new command in "git-bisect.sh".
>
> Oh?  I _completely_ missed that.  And that's being one of the original
> Cc:ed persons...
>
> > > Unfortunately, that does not reveal to me, quickly, what is the
> > > current state of affairs, and what you changed since the last time.
> >
> > Yeah, I should have at least put something in the comment section of my
> > first patch in this series.
>
> No.  I would still have missed it.
>
> The cover letter is outside of any patch, because it describes the
> purpose of the _whole_ patch series, not just one patch.
>
> So, it would have been nice to get a heads-up that this is not your
> bisect-skip-a-whole-bunch-of-commits series, but a new animal.
>
> This way, I decided I do not have time for something I do not need, and
> deleted it without having a look.

Well as I said in my previous email I am willing to improve. So perhaps next 
time.

Best regards,
Christian.

```

## Christian Couder, 2009-03-27 07:22

Subject: Re: sending patch sets (was: Re: [PATCH 01/10] refs: add "for_each_bisect_ref" function)
Message-ID: <200903270822.01209.chriscool@tuxfamily.org>
URL: https://gitlist.dev/e/200903270822.01209.chriscool%40tuxfamily.org
In-Reply-To: <alpine.LNX.2.00.0903270126210.25399@reaper.quantumfyre.co.uk>

```
Le vendredi 27 mars 2009, Julian Phillips a écrit :
> On Fri, 27 Mar 2009, Christian Couder wrote:
> > If someone knows some other tools that can easily send a threaded patch
> > series, I will try to see if I can use them...
>
> I long ago gave up on send-email, as it seemed to cumbersome for what I
> wanted, and my perl had got so rusty I really couldn't face trying to
> improve it.
>
> So I wrote a replacement in Python (attached), which I have subsequently
> used for all patches I've sent.  It calls format-patch, passing through
> arguments (and you can use -- to let it pass options too).
>
> (the only setting it reads from git config atm is mail-commit.to)
>
> I find it much easier to use than send-email, but as usual YMMV ...

Thanks I will try to have a look at it,
Christian.

```
