From: "David Kågedal" <davidk@lysator.liu.se>
To: Xavier Maillard <zedek@gnu.org>
Cc: git@vger.kernel.org
Subject: Re: [PATCH] git-blame.el: pick a set of random colors for each git-blame turn
Date: Wed, 28 Mar 2007 11:15:25 +0200 [thread overview]
Message-ID: <874po54tle.fsf@morpheus.local> (raw)
In-Reply-To: <200703272151.l2RLpqD7012317@localhost.localdomain> (Xavier Maillard's message of "Tue, 27 Mar 2007 23:51:52 +0200")
Xavier Maillard <zedek@gnu.org> writes:
> @@ -294,18 +312,22 @@ See also function `git-blame-mode'."
> (t
> nil)))
>
> -
> (defun git-blame-new-commit (hash src-line res-line num-lines)
> (save-excursion
> (set-buffer git-blame-file)
> (let ((info (gethash hash git-blame-cache))
> (inhibit-point-motion-hooks t)
> - (inhibit-modification-hooks t))
> + (inhibit-modification-hooks t)
> + (colors git-blame-colors))
> (when (not info)
> - (let ((color (pop git-blame-colors)))
> - (unless color
> - (setq color git-blame-ancient-color))
> - (setq info (list hash src-line res-line num-lines
> + ;; Assign a random color to each new commit info
> + ;; Take care not to select the same color multiple times
> + (let* ((idx (random (length colors)))
> + (color (or (elt colors idx)
> + git-blame-ancient-color)))
> + (and (assoc color colors)
> + (setq colors (delete idx colors)))
> + (setq info (list hash src-line res-line num-lines
> (git-describe-commit hash)
> (cons 'color color))))
> (puthash hash info git-blame-cache))
I have a few questions here. Why do you make a local reference
(color) to git-blame-colors, but you are still destructively updating
the list (using delete), possibly making git-blame-colors point to a
partial ruin of the original list? My original version may look
similar, but pop is only destructive on the variable it is popping
from. Any other references to the original list will be intact.
Remember that git-blame-colors is a buffer-local variable, but if it
points to a global list, any destructive changes will mess up the
global list.
Then it's this part
> + (let* ((idx (random (length colors)))
> + (color (or (elt colors idx)
> + git-blame-ancient-color)))
If you have already consumed all colors, (length colors) will be zero
and random will return an arbitrary integer. And then you will do (elt
'() -47100) and check if that was nil. It should work, but only by
luck.
I'd prefer something like this:
(let ((color (if colors
(elt colors (random (length colors)))
git-blame-ancient-color)))
Then you have to remove it, and your (assoc color colors) looks
"weird", since assoc compares the car of each list element in colors,
but colors doesn't contain any pairs, so I don't really see how it
would ever return something.
You could break this out to a function:
(defmacro random-pop (l)
"Remove a random element from l and update l"
;; only works on lists with unique elements
`(let ((e (elt ,l (random (length ,l)))))
(setq ,l (remove e ,l))
e))
and use it like this:
(let ((color (if colors
(random-pop colors)
git-blame-ancient-color)))
--
David Kågedal
next prev parent reply other threads:[~2007-03-28 9:15 UTC|newest]
Thread overview: 13+ messages / expand[flat|nested] mbox.gz Atom feed top
2007-03-26 21:01 [PATCH 2/2] git-blame.el: pick a set of random colors when blaming Xavier Maillard
2007-03-27 8:44 ` David Kågedal
2007-03-27 15:31 ` Xavier Maillard
2007-03-28 8:49 ` David Kågedal
2007-03-27 21:51 ` [PATCH] git-blame.el: pick a set of random colors for each git-blame turn Xavier Maillard
2007-03-28 9:15 ` David Kågedal [this message]
2007-03-28 10:29 ` Xavier Maillard
2007-03-28 10:31 ` Xavier Maillard
2007-03-28 12:02 ` David Kågedal
2007-03-28 16:44 ` Xavier Maillard
2007-03-29 9:26 ` David Kågedal
2007-03-29 9:59 ` Xavier Maillard
-- strict thread matches above, loose matches on Subject: below --
2007-03-27 20:09 Xavier Maillard
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=874po54tle.fsf@morpheus.local \
--to=davidk@lysator.liu.se \
--cc=git@vger.kernel.org \
--cc=zedek@gnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).