* Re: [PATCH] Allow curl to rewind the read buffers
From: Martin Storsjö @ 2009-04-01 16:46 UTC (permalink / raw)
To: Junio C Hamano; +Cc: git
In-Reply-To: <7vbprg1h3m.fsf@gitster.siamese.dyndns.org>
On Wed, 1 Apr 2009, Junio C Hamano wrote:
> It may be obvious to people proficient in cURL, but I had to guess that
> you perhaps meant to say "when using multi-pass authentication methods,
> cURL library may need to rewind the read buffers (depending on what is fed
> by the server), and in order to allow the library to do so, we need to
> tell it how by providing the way to manipulate the buffers we supply with
> these IOCTL callbacks."
>
> Do I understand you correctly?
Yeah, that's exactly correct.
> My point is that the your two-line statement of fact (with a bit more
> explanation of the fact that follows) was clear but it was unclear to me
> how that fact translates to the need of what the patch does. We would
> want the commit log message to be helpful to people who look at the code 6
> months down the line and wonder why these lines were added.
The original commit comment was a bit vague in retrospect, yes. I'll reply
with an updated version soon.
Thanks!
// Martin
^ permalink raw reply
* Re: [PATCH] builtin-clone.c: fix memory leak in cmd_clone()
From: Junio C Hamano @ 2009-04-01 16:23 UTC (permalink / raw)
To: Ali Gholami Rudi; +Cc: Johannes Schindelin, git
In-Reply-To: <20090401161254.GD2237@lilem.mirepesht>
Ali Gholami Rudi <ali@rudi.ir> writes:
> Johannes Schindelin <Johannes.Schindelin@gmx.de> wrote:
>> On Wed, 1 Apr 2009, Ali Gholami Rudi wrote:
>>
>> > With this patch, cmd_clone() safely frees its xstrdup()-allocated
>> > memory. Also junk_work_tree and junk_git_dir (used in remove_junk()
>> > which is called asynchronously) were changed to use static arrays rather
>> > than sharing the memory allocated in cmd_clone().
>>
>> If you want to go down that route, you will have a long way to go: the
>> assumption is pretty much in every cmd_() and main() function that
>> singletons will be free()d automatically when the process ends.
>
> Well... I saw strbuf_release() calls in the end of cmd_clone() and had a
> quick look at a few other cmd_*() functions; it seems most of them (?)
> try to free their memory. I thought it might make sense to do that for
> cmd_clone(). But you're right; they will be freed eventually. (It
> seems like a minor leak which is respected only some of the times :-) )
Yup, I'll queue (I won't have time today to work on git it seems) the
other two patches from you, but I was going to drop this one---unless your
plan was to make cmd_clone() callable more than once in order to use it in
say a C rewrite of git submodule or something like that.
^ permalink raw reply
* Re: [PATCH] Allow curl to rewind the read buffers
From: Junio C Hamano @ 2009-04-01 16:19 UTC (permalink / raw)
To: Martin Storsjö; +Cc: git
In-Reply-To: <Pine.LNX.4.64.0904011809080.5901@localhost.localdomain>
Martin Storsjö <martin@martin.st> writes:
> Rewinding of the read buffers may be needed when doing HTTP PUT or POST
> (or PROPFIND) with multi-pass authentication methods.
It may be obvious to people proficient in cURL, but I had to guess that
you perhaps meant to say "when using multi-pass authentication methods,
cURL library may need to rewind the read buffers (depending on what is fed
by the server), and in order to allow the library to do so, we need to
tell it how by providing the way to manipulate the buffers we supply with
these IOCTL callbacks."
Do I understand you correctly?
My point is that the your two-line statement of fact (with a bit more
explanation of the fact that follows) was clear but it was unclear to me
how that fact translates to the need of what the patch does. We would
want the commit log message to be helpful to people who look at the code 6
months down the line and wonder why these lines were added.
Please do not make me guess. I won't claim that other people would be
even less clueful than I am, but I am reasonably sure that more than half
of the people who read this patch would share my uneasiness of not clearly
reading how your statement of fact leads to your conclusion.
Thanks.
^ permalink raw reply
* Re: [PATCH 2/2] Add feature release instructions to gitworkflows man page
From: Junio C Hamano @ 2009-04-01 16:15 UTC (permalink / raw)
To: Raman Gupta; +Cc: git
In-Reply-To: <49D1120B.8060601@fastmail.fm>
Raman Gupta <rocketraman@fastmail.fm> writes:
> It might be useful to add some explanation of why one would want to
> rewind and rebuild vs simply continue as is.
>
> I guess the advantage is that the history for next starts out nice and
> clean for the next release, without any cruft from repeated merging of
> topic branches.
Repeated merges are usually not a major issue. Summarization tools such
as log and shortlog can be told not to list merges.
What matters more is a revert of a topic, that looked promising when it
started, but later found undesirable or premature. In such a case, the
topic is reverted out of 'next' and but the fact remains in the history
that it was once merged, and it was reverted. We would want to get rid of
these records at some point to give a chance for another incarnation of
the topic done right a clean slate to retry, and a feature release is a
good point in history to do so.
> The disadvantage is that one must publish the operation and all forks
> must deal with the rebase.
Yes.
^ permalink raw reply
* Re: [RFC GSoC 2009: git-submodule for multiple, active developers on active trees]
From: Johannes Schindelin @ 2009-04-01 16:13 UTC (permalink / raw)
To: Andreas Ericsson; +Cc: P Baker, Shawn O. Pearce, git
In-Reply-To: <49D30907.6090606@op5.se>
Hi,
On Wed, 1 Apr 2009, Andreas Ericsson wrote:
> Johannes Schindelin wrote:
>
> > On Tue, 31 Mar 2009, P Baker wrote:
> >
> > > I'll paraphrase to see if I understand your points:
> > >
> > > *Moving objects from submodule .git directories into the base .git/
> > > directory would protect the submodules and is a good idea.
> >
> > No, I did not say that.
> >
> > I said that moving submodules' working directory need to protected when
> > renaming/deleting submodules.
> >
> > Even worse, I think that moving the .git/ directory into the superproject's
> > .git/ would be at least quite a bit awkward in the nested case.
> >
>
> Not necessarily. The .git directory of a submodule need not be named .git
> inside the superprojects .git directory. I could well imagine something
> like this:
>
> .git/modules/submod(.git)/modules/nested-submod(.git)
>
> For deeply nested submodules (eurgh), one might run into path length limit
> issues though. The point is that we will need some library-like function
> to find the repository of the submodule. Once that's done, the same call
> with a different $gitdir should be able to find the nested submodule.
It appears to me as a solution in need of a problem.
> I'm also thinking of libgit2 here, where each repository will be
> represented as a struct that must be passed to the various $gitdir
> searching functions. This is necessary to allow a single program to
> access multiple repositories, and the .git/modules scheme makes
> supporting submodules in the library quite trivial.
First: libgit2 is not an issue for this thread AFAIAC.
Second: accessing submodules' repositories is quite trivial at the moment.
So much so that git-submodule can still get away with being a shell
script.
Ciao,
Dscho
^ permalink raw reply
* Re: [PATCH] builtin-clone.c: fix memory leak in cmd_clone()
From: Ali Gholami Rudi @ 2009-04-01 16:12 UTC (permalink / raw)
To: Johannes Schindelin; +Cc: git
In-Reply-To: <alpine.DEB.1.00.0904011754250.13502@intel-tinevez-2-302>
Hi,
Johannes Schindelin <Johannes.Schindelin@gmx.de> wrote:
> On Wed, 1 Apr 2009, Ali Gholami Rudi wrote:
>
> > With this patch, cmd_clone() safely frees its xstrdup()-allocated
> > memory. Also junk_work_tree and junk_git_dir (used in remove_junk()
> > which is called asynchronously) were changed to use static arrays rather
> > than sharing the memory allocated in cmd_clone().
>
> If you want to go down that route, you will have a long way to go: the
> assumption is pretty much in every cmd_() and main() function that
> singletons will be free()d automatically when the process ends.
Well... I saw strbuf_release() calls in the end of cmd_clone() and had a
quick look at a few other cmd_*() functions; it seems most of them (?)
try to free their memory. I thought it might make sense to do that for
cmd_clone(). But you're right; they will be freed eventually. (It
seems like a minor leak which is respected only some of the times :-) )
Regards,
Ali
^ permalink raw reply
* Re: [RFC GSoC 2009: git-submodule for multiple, active developers on active trees]
From: Johannes Schindelin @ 2009-04-01 16:10 UTC (permalink / raw)
To: P Baker; +Cc: Shawn O. Pearce, git
In-Reply-To: <526944450903311947w2f398c71n95a4a7aa47ecdb7f@mail.gmail.com>
Hi,
On Tue, 31 Mar 2009, P Baker wrote:
> > > *Moving objects from submodule .git directories into the base .git/
> > > directory would protect the submodules and is a good idea.
> >
> > No, I did not say that.
> >
> > Even worse, I think that moving the .git/ directory into the
> > superproject's .git/ would be at least quite a bit awkward in the
> > nested case.
> >
>
> Tthe initial prompt for the proposal was: "Rewrite git-submodule,
> placing the repository for each referenced submodules in the
> superproject's $GIT_DIR/modules...This resolves issues related to
> switching between versions of the superproject..." The prompt, and
> past experience with git, helped me to form my proposal which it seems
> would fix numerous problems with git submodule, with the implied cost
> of some awkwardness/complexity. Am I misunderstanding the prompt? Or
> do you think this could be accomplished more elegantly?
Well, I think the focus here is wrong. The focus should be on the working
directory as hinted here:
> > I said that moving submodules' working directory need to protected
> > when renaming/deleting submodules.
>
> I'm sorry, I still don't understand. Where would this occur? What is
> being protected? What is the submodules' working directory? I'm still
> learning the intricacies of git, so I'd appreciate any pointers you can
> give.
If your superproject deletes a submodule, what should happen with the
working directory?
And what should happen if the submodule is _moved_? (Which is not as
easily detected as with renamed files or directories.)
> > Further, often it would come in rather handy to be able to say
> > something like "git diff $REVISION_AS_COMMITTED_IN_THE_SUPERPROJECT"
> > from within the submodule...
> >
>
> That sounds complex, and would break expectations. This would only
> work if git in the submodule working directory knows its a submodule.
... or can detect easily that it is a submodule.
> Is there a way to reference it's super project?
No.
> > Oh, and it would not hurt performance on Windows at all if
> > git-submodule would be finally made a builtin.
>
> You mean rewriting git-submodule.sh in C? What other impacts might that
> have?
Junio would hate it, I am sure.
Ciao,
Dscho
^ permalink raw reply
* Re: [PATCH] builtin-clone.c: fix memory leak in cmd_clone()
From: Johannes Schindelin @ 2009-04-01 15:56 UTC (permalink / raw)
To: Ali Gholami Rudi; +Cc: git
In-Reply-To: <20090401144056.GC2237@lilem.mirepesht>
Hi,
On Wed, 1 Apr 2009, Ali Gholami Rudi wrote:
> With this patch, cmd_clone() safely frees its xstrdup()-allocated
> memory. Also junk_work_tree and junk_git_dir (used in remove_junk()
> which is called asynchronously) were changed to use static arrays rather
> than sharing the memory allocated in cmd_clone().
If you want to go down that route, you will have a long way to go: the
assumption is pretty much in every cmd_() and main() function that
singletons will be free()d automatically when the process ends.
Ciao,
Dscho
^ permalink raw reply
* [PATCH] Allow curl to rewind the read buffers
From: Martin Storsjö @ 2009-04-01 15:10 UTC (permalink / raw)
To: git
Rewinding of the read buffers may be needed when doing HTTP PUT or POST
(or PROPFIND) with multi-pass authentication methods.
Depending on the HTTP server, the read buffers may or may not need
rewinding. (Apache returns a 401 error immediately before any data has
been read from the buffers, while Lighttpd doesn't reply until all data
has been sent.)
Signed-off-by: Martin Storsjo <martin@martin.st>
---
http-push.c | 24 ++++++++++++++++++++++++
http.c | 19 +++++++++++++++++++
http.h | 7 +++++++
3 files changed, 50 insertions(+), 0 deletions(-)
diff --git a/http-push.c b/http-push.c
index 6ce5a1d..7dc0dd4 100644
--- a/http-push.c
+++ b/http-push.c
@@ -567,6 +567,10 @@ static void start_put(struct transfer_request *request)
curl_easy_setopt(slot->curl, CURLOPT_INFILE, &request->buffer);
curl_easy_setopt(slot->curl, CURLOPT_INFILESIZE, request->buffer.buf.len);
curl_easy_setopt(slot->curl, CURLOPT_READFUNCTION, fread_buffer);
+#ifndef NO_CURL_IOCTL
+ curl_easy_setopt(slot->curl, CURLOPT_IOCTLFUNCTION, ioctl_buffer);
+ curl_easy_setopt(slot->curl, CURLOPT_IOCTLDATA, &request->buffer);
+#endif
curl_easy_setopt(slot->curl, CURLOPT_WRITEFUNCTION, fwrite_null);
curl_easy_setopt(slot->curl, CURLOPT_CUSTOMREQUEST, DAV_PUT);
curl_easy_setopt(slot->curl, CURLOPT_UPLOAD, 1);
@@ -1267,6 +1271,10 @@ static struct remote_lock *lock_remote(const char *path, long timeout)
curl_easy_setopt(slot->curl, CURLOPT_INFILE, &out_buffer);
curl_easy_setopt(slot->curl, CURLOPT_INFILESIZE, out_buffer.buf.len);
curl_easy_setopt(slot->curl, CURLOPT_READFUNCTION, fread_buffer);
+#ifndef NO_CURL_IOCTL
+ curl_easy_setopt(slot->curl, CURLOPT_IOCTLFUNCTION, ioctl_buffer);
+ curl_easy_setopt(slot->curl, CURLOPT_IOCTLDATA, &out_buffer);
+#endif
curl_easy_setopt(slot->curl, CURLOPT_FILE, &in_buffer);
curl_easy_setopt(slot->curl, CURLOPT_WRITEFUNCTION, fwrite_buffer);
curl_easy_setopt(slot->curl, CURLOPT_URL, url);
@@ -1508,6 +1516,10 @@ static void remote_ls(const char *path, int flags,
curl_easy_setopt(slot->curl, CURLOPT_INFILE, &out_buffer);
curl_easy_setopt(slot->curl, CURLOPT_INFILESIZE, out_buffer.buf.len);
curl_easy_setopt(slot->curl, CURLOPT_READFUNCTION, fread_buffer);
+#ifndef NO_CURL_IOCTL
+ curl_easy_setopt(slot->curl, CURLOPT_IOCTLFUNCTION, ioctl_buffer);
+ curl_easy_setopt(slot->curl, CURLOPT_IOCTLDATA, &out_buffer);
+#endif
curl_easy_setopt(slot->curl, CURLOPT_FILE, &in_buffer);
curl_easy_setopt(slot->curl, CURLOPT_WRITEFUNCTION, fwrite_buffer);
curl_easy_setopt(slot->curl, CURLOPT_URL, url);
@@ -1584,6 +1596,10 @@ static int locking_available(void)
curl_easy_setopt(slot->curl, CURLOPT_INFILE, &out_buffer);
curl_easy_setopt(slot->curl, CURLOPT_INFILESIZE, out_buffer.buf.len);
curl_easy_setopt(slot->curl, CURLOPT_READFUNCTION, fread_buffer);
+#ifndef NO_CURL_IOCTL
+ curl_easy_setopt(slot->curl, CURLOPT_IOCTLFUNCTION, ioctl_buffer);
+ curl_easy_setopt(slot->curl, CURLOPT_IOCTLDATA, &out_buffer);
+#endif
curl_easy_setopt(slot->curl, CURLOPT_FILE, &in_buffer);
curl_easy_setopt(slot->curl, CURLOPT_WRITEFUNCTION, fwrite_buffer);
curl_easy_setopt(slot->curl, CURLOPT_URL, repo->url);
@@ -1766,6 +1782,10 @@ static int update_remote(unsigned char *sha1, struct remote_lock *lock)
curl_easy_setopt(slot->curl, CURLOPT_INFILE, &out_buffer);
curl_easy_setopt(slot->curl, CURLOPT_INFILESIZE, out_buffer.buf.len);
curl_easy_setopt(slot->curl, CURLOPT_READFUNCTION, fread_buffer);
+#ifndef NO_CURL_IOCTL
+ curl_easy_setopt(slot->curl, CURLOPT_IOCTLFUNCTION, ioctl_buffer);
+ curl_easy_setopt(slot->curl, CURLOPT_IOCTLDATA, &out_buffer);
+#endif
curl_easy_setopt(slot->curl, CURLOPT_WRITEFUNCTION, fwrite_null);
curl_easy_setopt(slot->curl, CURLOPT_CUSTOMREQUEST, DAV_PUT);
curl_easy_setopt(slot->curl, CURLOPT_HTTPHEADER, dav_headers);
@@ -1910,6 +1930,10 @@ static void update_remote_info_refs(struct remote_lock *lock)
curl_easy_setopt(slot->curl, CURLOPT_INFILE, &buffer);
curl_easy_setopt(slot->curl, CURLOPT_INFILESIZE, buffer.buf.len);
curl_easy_setopt(slot->curl, CURLOPT_READFUNCTION, fread_buffer);
+#ifndef NO_CURL_IOCTL
+ curl_easy_setopt(slot->curl, CURLOPT_IOCTLFUNCTION, ioctl_buffer);
+ curl_easy_setopt(slot->curl, CURLOPT_IOCTLDATA, &buffer);
+#endif
curl_easy_setopt(slot->curl, CURLOPT_WRITEFUNCTION, fwrite_null);
curl_easy_setopt(slot->curl, CURLOPT_CUSTOMREQUEST, DAV_PUT);
curl_easy_setopt(slot->curl, CURLOPT_HTTPHEADER, dav_headers);
diff --git a/http.c b/http.c
index eae74aa..3e8d548 100644
--- a/http.c
+++ b/http.c
@@ -44,6 +44,25 @@ size_t fread_buffer(void *ptr, size_t eltsize, size_t nmemb, void *buffer_)
return size;
}
+#ifndef NO_CURL_IOCTL
+curlioerr ioctl_buffer(CURL *handle, int cmd, void *clientp)
+{
+ struct buffer *buffer = clientp;
+
+ switch (cmd) {
+ case CURLIOCMD_NOP:
+ return CURLIOE_OK;
+
+ case CURLIOCMD_RESTARTREAD:
+ buffer->posn = 0;
+ return CURLIOE_OK;
+
+ default:
+ return CURLIOE_UNKNOWNCMD;
+ }
+}
+#endif
+
size_t fwrite_buffer(const void *ptr, size_t eltsize, size_t nmemb, void *buffer_)
{
size_t size = eltsize * nmemb;
diff --git a/http.h b/http.h
index 905b462..26abebe 100644
--- a/http.h
+++ b/http.h
@@ -37,6 +37,10 @@
#define CURLE_HTTP_RETURNED_ERROR CURLE_HTTP_NOT_FOUND
#endif
+#if LIBCURL_VERSION_NUM < 0x070c03
+#define NO_CURL_IOCTL
+#endif
+
struct slot_results
{
CURLcode curl_result;
@@ -67,6 +71,9 @@ struct buffer
extern size_t fread_buffer(void *ptr, size_t eltsize, size_t nmemb, void *strbuf);
extern size_t fwrite_buffer(const void *ptr, size_t eltsize, size_t nmemb, void *strbuf);
extern size_t fwrite_null(const void *ptr, size_t eltsize, size_t nmemb, void *strbuf);
+#ifndef NO_CURL_IOCTL
+extern curlioerr ioctl_buffer(CURL *handle, int cmd, void *clientp);
+#endif
/* Slot lifecycle functions */
extern struct active_request_slot *get_active_slot(void);
--
1.6.0.2
^ permalink raw reply related
* Re: [PATCH] Allow any HTTP authentication scheme, not only basic
From: Martin Storsjö @ 2009-04-01 15:06 UTC (permalink / raw)
To: Johannes Schindelin; +Cc: git
In-Reply-To: <alpine.DEB.1.00.0903312104010.6676@intel-tinevez-2-302>
Hi,
My patch doesn't seem to come completely without troubles, though.
I still find this a potentially valuable scenario; e.g. for a public repo
with push access only over HTTP, but using secure digest authentication
instead of sending the credentials in plaintext.
One downside is that it causes a lot more HTTP requests, since libcurl
initially tries without any authentication for (almost?) every request,
doubling the number of requests made.
Fetching works just fine, but pushing may fail on auth problems in some
cases where it wouldn't fail otherwise, if only basic authentication was
used and libcurl automatically used that without probing what
authentication scheme the server uses.
Things generally seem to work fine with Apache, but with Lighttpd,
retrying with proper credentials may fail due to CURLE_SEND_FAIL_REWIND /*
65 - Sending the data requires a rewind that failed */. This issue can be
fixed by another patch (that I'll send soon).
Even after fixing that, there still seems to be some issues on some older
curl versions; in particular, 7.16.3, shipped in OS X Leopard, returns
error code CURLE_HTTP_RETURNED_ERROR instead of retrying properly with
authentication.
// Martin
^ permalink raw reply
* [PATCH] builtin-clone.c: fix memory leak in cmd_clone()
From: Ali Gholami Rudi @ 2009-04-01 14:40 UTC (permalink / raw)
To: git
With this patch, cmd_clone() safely frees its xstrdup()-allocated
memory. Also junk_work_tree and junk_git_dir (used in remove_junk()
which is called asynchronously) were changed to use static arrays rather
than sharing the memory allocated in cmd_clone().
Signed-off-by: Ali Gholami Rudi <ali@rudi.ir>
---
builtin-clone.c | 22 +++++++++++++---------
1 files changed, 13 insertions(+), 9 deletions(-)
diff --git a/builtin-clone.c b/builtin-clone.c
index 0031b5f..8149fc0 100644
--- a/builtin-clone.c
+++ b/builtin-clone.c
@@ -268,8 +268,8 @@ static const struct ref *clone_local(const char *src_repo,
return ret;
}
-static const char *junk_work_tree;
-static const char *junk_git_dir;
+static char junk_work_tree[PATH_MAX];
+static char junk_git_dir[PATH_MAX];
pid_t junk_pid;
static void remove_junk(void)
@@ -277,12 +277,12 @@ static void remove_junk(void)
struct strbuf sb = STRBUF_INIT;
if (getpid() != junk_pid)
return;
- if (junk_git_dir) {
+ if (*junk_git_dir) {
strbuf_addstr(&sb, junk_git_dir);
remove_dir_recursively(&sb, 0);
strbuf_reset(&sb);
}
- if (junk_work_tree) {
+ if (*junk_work_tree) {
strbuf_addstr(&sb, junk_work_tree);
remove_dir_recursively(&sb, 0);
strbuf_reset(&sb);
@@ -320,8 +320,8 @@ int cmd_clone(int argc, const char **argv, const char *prefix)
{
int is_bundle = 0;
struct stat buf;
- const char *repo_name, *repo, *work_tree, *git_dir;
- char *path, *dir;
+ const char *repo_name, *work_tree;
+ char *path, *dir, *repo, *git_dir;
int dest_exists;
const struct ref *refs, *head_points_at, *remote_head, *mapped_refs;
struct strbuf key = STRBUF_INIT, value = STRBUF_INIT;
@@ -362,7 +362,7 @@ int cmd_clone(int argc, const char **argv, const char *prefix)
else if (!strchr(repo_name, ':'))
repo = xstrdup(make_absolute_path(repo_name));
else
- repo = repo_name;
+ repo = xstrdup(repo_name);
if (argc == 2)
dir = xstrdup(argv[1]);
@@ -393,7 +393,7 @@ int cmd_clone(int argc, const char **argv, const char *prefix)
}
if (!option_bare) {
- junk_work_tree = work_tree;
+ strcpy(junk_work_tree, work_tree);
if (safe_create_leading_directories_const(work_tree) < 0)
die("could not create leading directories of '%s': %s",
work_tree, strerror(errno));
@@ -402,7 +402,7 @@ int cmd_clone(int argc, const char **argv, const char *prefix)
work_tree, strerror(errno));
set_git_work_tree(work_tree);
}
- junk_git_dir = git_dir;
+ strcpy(junk_git_dir, git_dir);
atexit(remove_junk);
sigchain_push_common(remove_junk_on_signal);
@@ -590,6 +590,10 @@ int cmd_clone(int argc, const char **argv, const char *prefix)
strbuf_release(&branch_top);
strbuf_release(&key);
strbuf_release(&value);
+ free(path);
+ free(repo);
+ free(dir);
+ free(git_dir);
junk_pid = 0;
return err;
}
^ permalink raw reply related
* Re: [PATCH 07/10] rev-list: call new "filter_skip" function
From: Johannes Schindelin @ 2009-04-01 14:36 UTC (permalink / raw)
To: Christian Couder; +Cc: Junio C Hamano, git, John Tapsell
In-Reply-To: <200904010809.41110.chriscool@tuxfamily.org>
[-- Attachment #1: Type: TEXT/PLAIN, Size: 1751 bytes --]
Hi,
On Wed, 1 Apr 2009, Christian Couder wrote:
> Le mardi 31 mars 2009, Johannes Schindelin a écrit :
> > Hi,
> >
> > On Tue, 31 Mar 2009, Christian Couder wrote:
> > > Le lundi 30 mars 2009, Johannes Schindelin a écrit :
> > > > On Mon, 30 Mar 2009, Christian Couder wrote:
> > > > > Le jeudi 26 mars 2009, Junio C Hamano a écrit :
> > > > > > I've learned to suspect without reading a qsort() callback that
> > > > > > does not derefence its arguments. Is this doing the right thing?
> > > > >
> > > > > I think so.
> > > >
> > > > I suspect something much worse: you are trying to build a list of
> > > > sha1s of commits that need to be skipped, later to look up every
> > > > commit via binary search.
> > > >
> > > > But it has been proven a lot of times that using a hash set is
> > > > superior to that approach, and even better: we already have the
> > > > framework in place in the form of struct decorate.
> > >
> > > I had a look, and "struct decorate" can be used to store objects, but I
> > > want to store only sha1s.
> >
> > No, you want to _look up_ sha1s. And struct decorate is not about
> > storing objects, but to attach things to objects.
>
> The problem is that I don't have any object to attach things to when I
> read the bisect skip refs. I just need to store the sha1 from the skip
> refs in some sha1 container.
I see, so you do not want to parse the commits just to register them as
skipped.
Fair enough.
But I still think that a hashmap/set would be better suited.
In any case, it should be refactored into something usable in all of
libgit.a. You are basically duplicating the grafts code in commit.c,
sharing that shortcoming that your code would be static again, not
encouraging reusage.
Ciao,
Dscho
^ permalink raw reply
* Re: [PATCH] Documentation: use "spurious .sp" XSLT if DOCBOOK_SUPPRESS_SP is set
From: Jeff King @ 2009-04-01 13:06 UTC (permalink / raw)
To: Chris Johnsen; +Cc: Junio C Hamano, Heiko Voigt, git
In-Reply-To: <DDA1F213-D15C-49B3-90CB-557F9A465A6A@pobox.com>
On Wed, Apr 01, 2009 at 07:19:08AM -0500, Chris Johnsen wrote:
>> In the course of your SVN research, did you find the fixes between
>> 1.73.1 and 1.74.3 that fixed the spacing issue? If so, I wonder if it's
>> worth backporting that fix to DOCBOOK_FIX_LIST_SPACING.
>
> I guess you are referring to an issue different from the one created by
> using the "spurious .sp" simpara template, but I am not familiar with
> another one. If not, then I am confused. The new patch to avoid using the
> "spurious .sp" template fixes the list spacing in pu's git-cvsimport.1
> when I generate it here (using docbook-xsl 1.74.0). For example, the extra
> blank line after "Problems related to timestamps:" goes away and a new
> blank line is inserted before "Problems related to branches:".
Sorry, I should have been more clear (it seems we have enough docbook
problems to cause confusion in referring to them :) ). What I meant is:
The original issue which caused me to investigate this, namely the
extra blank line before a list and the missing blank line after the
list, is present in 1.73 but not in 1.74 (I tested only with 1.74.3,
but your statement above leads me to believe it is fixed in 1.74.0).
Is it worth including a fix in our docbook templates to make it look
right for people on 1.73?
> My poking around in the docbook SVN repo was largely limited to the
> manpages/block.xsl file since that is where the normal simpara template
> lives. If this other issue is list specific, it seems likely that fixes
> would be in manpages/lists.xsl. It looks like there have only been around
> ten commits to that lists.xsl since 1.73.1, but none of them jumped out at
> me as likely culprits unless the spacing you mean is indentation or
> "bullet"-to-text spacing (though my brain is tired right now).
Hmm. I think part of the fix is actually in param.xsl, which contains:
<!-- * squeeze multiple .sp instances into a single .sp-->
<substitution oldstring=".sp .sp" newstring=".sp"/>
in 1.74, but not 1.73.
I am torn on whether it makes sense to try backporting this. Debian
stable, at least, will be on 1.73 for quite a long time. On the other
hand, the problem is relatively minor (it is ugly, but you can still
read the text) and I'm not sure we want to get into pulling random fixes
from upstream docbook-xsl; it could turn into a huge time sink.
-Peff
^ permalink raw reply
* [PATCH 08/10] mergetool-lib: introduce run_mergetool
From: David Aguilar @ 2009-04-01 12:55 UTC (permalink / raw)
To: gitster, charles; +Cc: git, David Aguilar
In-Reply-To: <1238590514-41893-8-git-send-email-davvid@gmail.com>
run_mergetool contains the common functionality for launching
mergetools. There's some context-specific behavior but overall
it's better to have all of this stuff in one place versus multiple
places.
Signed-off-by: David Aguilar <davvid@gmail.com>
---
Documentation/git-mergetool-lib.txt | 4 +
git-mergetool-lib.sh | 141 +++++++++++++++++++++++++++++++++++
2 files changed, 145 insertions(+), 0 deletions(-)
diff --git a/Documentation/git-mergetool-lib.txt b/Documentation/git-mergetool-lib.txt
index a8d62f5..3060673 100644
--- a/Documentation/git-mergetool-lib.txt
+++ b/Documentation/git-mergetool-lib.txt
@@ -29,6 +29,10 @@ FUNCTIONS
get_merge_tool_path::
returns the `merge_tool_path` for a `merge_tool`.
+run_mergetool::
+ launches a merge tool given the tool name and a true/false
+ flag to indicate whether a merge base is present
+
Author
------
Written by David Aguilar <davvid@gmail.com>
diff --git a/git-mergetool-lib.sh b/git-mergetool-lib.sh
index c307a5d..9c26b5f 100644
--- a/git-mergetool-lib.sh
+++ b/git-mergetool-lib.sh
@@ -3,7 +3,12 @@ diff_mode() {
test $TOOL_MODE = "diff"
}
+merge_mode() {
+ test $TOOL_MODE = "merge"
+}
+
get_merge_tool_path () {
+ path="$1"
if test -z "$2"; then
case "$1" in
emerge)
@@ -17,6 +22,11 @@ get_merge_tool_path () {
echo "$path"
}
+# Overridden in git-mergetool
+check_unchanged () {
+ true
+}
+
valid_tool () {
case "$1" in
kdiff3 | kompare | tkdiff | xxdiff | meld | opendiff | emerge | vimdiff | gvimdiff | ecmerge)
@@ -39,3 +49,134 @@ get_custom_cmd () {
test -n "$custom_cmd" &&
echo "$custom_cmd"
}
+
+run_mergetool () {
+ base_present="$2"
+ if diff_mode; then
+ base_present="false"
+ fi
+ if test -z "$base_present"; then
+ base_present="true"
+ fi
+
+ case "$1" in
+ kdiff3)
+ if $base_present; then
+ ("$merge_tool_path" --auto \
+ --L1 "$MERGED (Base)" --L2 "$MERGED (Local)" --L3 "$MERGED (Remote)" \
+ -o "$MERGED" "$BASE" "$LOCAL" "$REMOTE" > /dev/null 2>&1)
+ else
+ ("$merge_tool_path" --auto \
+ --L1 "$MERGED (Local)" --L2 "$MERGED (Remote)" \
+ -o "$MERGED" "$LOCAL" "$REMOTE" > /dev/null 2>&1)
+ fi
+ status=$?
+ ;;
+ kompare)
+ "$merge_tool_path" "$LOCAL" "$REMOTE"
+ status=$?
+ ;;
+ tkdiff)
+ if $base_present; then
+ "$merge_tool_path" -a "$BASE" -o "$MERGED" "$LOCAL" "$REMOTE"
+ else
+ if diff_mode; then
+ "$merge_tool_path" "$LOCAL" "$REMOTE"
+ else
+ "$merge_tool_path" -o "$MERGED" "$LOCAL" "$REMOTE"
+ fi
+ fi
+ status=$?
+ ;;
+ meld)
+ merge_mode && touch "$BACKUP"
+ if merge_mode; then
+ "$merge_tool_path" "$LOCAL" "$MERGED" "$REMOTE"
+ else
+ "$merge_tool_path" "$LOCAL" "$REMOTE"
+ fi
+ check_unchanged
+ ;;
+ vimdiff)
+ if merge_mode; then
+ touch "$BACKUP"
+ "$merge_tool_path" -c "wincmd l" "$LOCAL" "$MERGED" "$REMOTE"
+ check_unchanged
+ else
+ "$merge_tool_path" -c "wincmd l" "$LOCAL" "$REMOTE"
+ fi
+ ;;
+ gvimdiff)
+ if merge_mode; then
+ touch "$BACKUP"
+ "$merge_tool_path" -c "wincmd l" -f "$LOCAL" "$MERGED" "$REMOTE"
+ check_unchanged
+ else
+ "$merge_tool_path" -c "wincmd l" -f "$LOCAL" "$REMOTE"
+ fi
+ ;;
+ xxdiff)
+ merge_mode && touch "$BACKUP"
+ if $base_present; then
+ "$merge_tool_path" -X --show-merged-pane \
+ -R 'Accel.SaveAsMerged: "Ctrl-S"' \
+ -R 'Accel.Search: "Ctrl+F"' \
+ -R 'Accel.SearchForward: "Ctrl-G"' \
+ --merged-file "$MERGED" "$LOCAL" "$BASE" "$REMOTE"
+ else
+ merge_mode && extra=--show-merged-pane
+ "$merge_tool_path" -X $extra \
+ -R 'Accel.SaveAsMerged: "Ctrl-S"' \
+ -R 'Accel.Search: "Ctrl+F"' \
+ -R 'Accel.SearchForward: "Ctrl-G"' \
+ --merged-file "$MERGED" "$LOCAL" "$REMOTE"
+ fi
+ check_unchanged
+ ;;
+ opendiff)
+ merge_mode && touch "$BACKUP"
+ if $base_present; then
+ "$merge_tool_path" "$LOCAL" "$REMOTE" \
+ -ancestor "$BASE" -merge "$MERGED" | cat
+ else
+ "$merge_tool_path" "$LOCAL" "$REMOTE" \
+ -merge "$MERGED" | cat
+ fi
+ check_unchanged
+ ;;
+ ecmerge)
+ merge_mode && touch "$BACKUP"
+ if $base_present; then
+ "$merge_tool_path" "$BASE" "$LOCAL" "$REMOTE" \
+ --default --mode=merge3 --to="$MERGED"
+ else
+ "$merge_tool_path" "$LOCAL" "$REMOTE" \
+ --default --mode=merge2 --to="$MERGED"
+ fi
+ check_unchanged
+ ;;
+ emerge)
+ if $base_present; then
+ "$merge_tool_path" -f emerge-files-with-ancestor-command \
+ "$LOCAL" "$REMOTE" "$BASE" "$(basename "$MERGED")"
+ else
+ "$merge_tool_path" -f emerge-files-command \
+ "$LOCAL" "$REMOTE" "$(basename "$MERGED")"
+ fi
+ status=$?
+ ;;
+ *)
+ if test -n "$merge_tool_cmd"; then
+ if merge_mode &&
+ test "$merge_tool_trust_exit_code" = "false"; then
+ touch "$BACKUP"
+ ( eval $merge_tool_cmd )
+ check_unchanged
+ else
+ ( eval $merge_tool_cmd )
+ status=$?
+ fi
+ fi
+ ;;
+ esac
+}
--
1.6.1.3
^ permalink raw reply related
* [PATCH 09/10] difftool: use run_mergetool from git-mergetool-lib
From: David Aguilar @ 2009-04-01 12:55 UTC (permalink / raw)
To: gitster, charles; +Cc: git, David Aguilar
In-Reply-To: <1238590514-41893-9-git-send-email-davvid@gmail.com>
This refactors git-mergetool-helper to use run_mergetool.
Signed-off-by: David Aguilar <davvid@gmail.com>
---
git-difftool-helper.sh | 62 +-----------------------------------------------
1 files changed, 1 insertions(+), 61 deletions(-)
diff --git a/git-difftool-helper.sh b/git-difftool-helper.sh
index 6cc5ab5..2dfc870 100755
--- a/git-difftool-helper.sh
+++ b/git-difftool-helper.sh
@@ -43,67 +43,7 @@ launch_merge_tool () {
fi
# Run the appropriate merge tool command
- case "$merge_tool" in
- kdiff3)
- basename=$(basename "$MERGED")
- "$merge_tool_path" --auto \
- --L1 "$basename (A)" \
- --L2 "$basename (B)" \
- -o "$MERGED" "$LOCAL" "$REMOTE" \
- > /dev/null 2>&1
- ;;
-
- kompare)
- "$merge_tool_path" "$LOCAL" "$REMOTE"
- ;;
-
- tkdiff)
- "$merge_tool_path" -o "$MERGED" "$LOCAL" "$REMOTE"
- ;;
-
- meld)
- "$merge_tool_path" "$LOCAL" "$REMOTE"
- ;;
-
- vimdiff)
- "$merge_tool_path" -c "wincmd l" "$LOCAL" "$REMOTE"
- ;;
-
- gvimdiff)
- "$merge_tool_path" -c "wincmd l" -f "$LOCAL" "$REMOTE"
- ;;
-
- xxdiff)
- "$merge_tool_path" \
- -X \
- -R 'Accel.SaveAsMerged: "Ctrl-S"' \
- -R 'Accel.Search: "Ctrl+F"' \
- -R 'Accel.SearchForward: "Ctrl-G"' \
- --merged-file "$MERGED" \
- "$LOCAL" "$REMOTE"
- ;;
-
- opendiff)
- "$merge_tool_path" "$LOCAL" "$REMOTE" \
- -merge "$MERGED" | cat
- ;;
-
- ecmerge)
- "$merge_tool_path" "$LOCAL" "$REMOTE" \
- --default --mode=merge2 --to="$MERGED"
- ;;
-
- emerge)
- "$merge_tool_path" -f emerge-files-command \
- "$LOCAL" "$REMOTE" "$(basename "$MERGED")"
- ;;
-
- *)
- if test -n "$merge_tool_cmd"; then
- ( eval $merge_tool_cmd )
- fi
- ;;
- esac
+ run_mergetool "$merge_tool";
}
# Allow GIT_DIFF_TOOL and GIT_MERGE_TOOL to provide default values
--
1.6.1.3
^ permalink raw reply related
* [PATCH 10/10] mergetool: use run_mergetool from git-mergetool-lib
From: David Aguilar @ 2009-04-01 12:55 UTC (permalink / raw)
To: gitster, charles; +Cc: git, David Aguilar
In-Reply-To: <1238590514-41893-10-git-send-email-davvid@gmail.com>
This refactors git-mergetool to use run_mergetool.
Signed-off-by: David Aguilar <davvid@gmail.com>
---
git-mergetool.sh | 96 +++--------------------------------------------------
1 files changed, 6 insertions(+), 90 deletions(-)
diff --git a/git-mergetool.sh b/git-mergetool.sh
index 957993c..2c6b325 100755
--- a/git-mergetool.sh
+++ b/git-mergetool.sh
@@ -190,96 +190,12 @@ merge_file () {
read ans
fi
- case "$merge_tool" in
- kdiff3)
- if base_present ; then
- ("$merge_tool_path" --auto --L1 "$MERGED (Base)" --L2 "$MERGED (Local)" --L3 "$MERGED (Remote)" \
- -o "$MERGED" "$BASE" "$LOCAL" "$REMOTE" > /dev/null 2>&1)
- else
- ("$merge_tool_path" --auto --L1 "$MERGED (Local)" --L2 "$MERGED (Remote)" \
- -o "$MERGED" "$LOCAL" "$REMOTE" > /dev/null 2>&1)
- fi
- status=$?
- ;;
- tkdiff)
- if base_present ; then
- "$merge_tool_path" -a "$BASE" -o "$MERGED" "$LOCAL" "$REMOTE"
- else
- "$merge_tool_path" -o "$MERGED" "$LOCAL" "$REMOTE"
- fi
- status=$?
- ;;
- meld)
- touch "$BACKUP"
- "$merge_tool_path" "$LOCAL" "$MERGED" "$REMOTE"
- check_unchanged
- ;;
- vimdiff)
- touch "$BACKUP"
- "$merge_tool_path" -c "wincmd l" "$LOCAL" "$MERGED" "$REMOTE"
- check_unchanged
- ;;
- gvimdiff)
- touch "$BACKUP"
- "$merge_tool_path" -c "wincmd l" -f "$LOCAL" "$MERGED" "$REMOTE"
- check_unchanged
- ;;
- xxdiff)
- touch "$BACKUP"
- if base_present ; then
- "$merge_tool_path" -X --show-merged-pane \
- -R 'Accel.SaveAsMerged: "Ctrl-S"' \
- -R 'Accel.Search: "Ctrl+F"' \
- -R 'Accel.SearchForward: "Ctrl-G"' \
- --merged-file "$MERGED" "$LOCAL" "$BASE" "$REMOTE"
- else
- "$merge_tool_path" -X --show-merged-pane \
- -R 'Accel.SaveAsMerged: "Ctrl-S"' \
- -R 'Accel.Search: "Ctrl+F"' \
- -R 'Accel.SearchForward: "Ctrl-G"' \
- --merged-file "$MERGED" "$LOCAL" "$REMOTE"
- fi
- check_unchanged
- ;;
- opendiff)
- touch "$BACKUP"
- if base_present; then
- "$merge_tool_path" "$LOCAL" "$REMOTE" -ancestor "$BASE" -merge "$MERGED" | cat
- else
- "$merge_tool_path" "$LOCAL" "$REMOTE" -merge "$MERGED" | cat
- fi
- check_unchanged
- ;;
- ecmerge)
- touch "$BACKUP"
- if base_present; then
- "$merge_tool_path" "$BASE" "$LOCAL" "$REMOTE" --default --mode=merge3 --to="$MERGED"
- else
- "$merge_tool_path" "$LOCAL" "$REMOTE" --default --mode=merge2 --to="$MERGED"
- fi
- check_unchanged
- ;;
- emerge)
- if base_present ; then
- "$merge_tool_path" -f emerge-files-with-ancestor-command "$LOCAL" "$REMOTE" "$BASE" "$(basename "$MERGED")"
- else
- "$merge_tool_path" -f emerge-files-command "$LOCAL" "$REMOTE" "$(basename "$MERGED")"
- fi
- status=$?
- ;;
- *)
- if test -n "$merge_tool_cmd"; then
- if test "$merge_tool_trust_exit_code" = "false"; then
- touch "$BACKUP"
- ( eval $merge_tool_cmd )
- check_unchanged
- else
- ( eval $merge_tool_cmd )
- status=$?
- fi
- fi
- ;;
- esac
+ present=false
+ base_present &&
+ present=true
+
+ run_mergetool "$merge_tool" "$present"
+ status=$?
if test "$status" -ne 0; then
echo "merge of $MERGED failed" 1>&2
mv -- "$BACKUP" "$MERGED"
--
1.6.1.3
^ permalink raw reply related
* [PATCH 07/10] difftool: use valid_tool from git-mergetool-lib
From: David Aguilar @ 2009-04-01 12:55 UTC (permalink / raw)
To: gitster, charles; +Cc: git, David Aguilar
In-Reply-To: <1238590514-41893-7-git-send-email-davvid@gmail.com>
This refactors difftool to use valid_tool fro git-mergetool-lib
Signed-off-by: David Aguilar <davvid@gmail.com>
---
git-difftool-helper.sh | 29 +++--------------------------
1 files changed, 3 insertions(+), 26 deletions(-)
diff --git a/git-difftool-helper.sh b/git-difftool-helper.sh
index d1bea18..6cc5ab5 100755
--- a/git-difftool-helper.sh
+++ b/git-difftool-helper.sh
@@ -8,6 +8,7 @@
# Copyright (c) 2009 David Aguilar
# Load common functions from git-mergetool-lib
+TOOL_MODE=diff
. git-mergetool-lib
# difftool.prompt controls the default prompt/no-prompt behavior
@@ -105,29 +106,6 @@ launch_merge_tool () {
esac
}
-# Verifies that (difftool|mergetool).<tool>.cmd exists
-valid_custom_tool() {
- merge_tool_cmd="$(git config difftool.$1.cmd)"
- test -z "$merge_tool_cmd" &&
- merge_tool_cmd="$(git config mergetool.$1.cmd)"
- test -n "$merge_tool_cmd"
-}
-
-# Verifies that the chosen merge tool is properly setup.
-# Built-in merge tools are always valid.
-valid_tool() {
- case "$1" in
- kdiff3 | kompare | tkdiff | xxdiff | meld | opendiff | emerge | vimdiff | gvimdiff | ecmerge)
- ;; # happy
- *)
- if ! valid_custom_tool "$1"
- then
- return 1
- fi
- ;;
- esac
-}
-
# Allow GIT_DIFF_TOOL and GIT_MERGE_TOOL to provide default values
test -n "$GIT_MERGE_TOOL" && merge_tool="$GIT_MERGE_TOOL"
test -n "$GIT_DIFF_TOOL" && merge_tool="$GIT_DIFF_TOOL"
@@ -183,6 +161,7 @@ if test -z "$merge_tool"; then
exit 1
fi
+ merge_tool_cmd=$(get_custom_cmd "$merge_tool")
else
# A merge tool has been set, so verify that it's valid.
if ! valid_tool "$merge_tool"; then
@@ -190,9 +169,7 @@ else
exit 1
fi
- # Sets up the merge_tool_path variable.
- # This handles the difftool.<tool>.path configuration variable
- # and falls back to mergetool defaults.
+ merge_tool_cmd=$(get_custom_cmd "$merge_tool")
merge_tool_path=$(git config difftool."$1".path)
test -z "$merge_tool_path" &&
merge_tool_path=$(git config mergetool."$1".path)
--
1.6.1.3
^ permalink raw reply related
* [PATCH 04/10] mergetool: use get_mergetool_path from git-mergetool-lib
From: David Aguilar @ 2009-04-01 12:55 UTC (permalink / raw)
To: gitster, charles; +Cc: git, David Aguilar
In-Reply-To: <1238590514-41893-4-git-send-email-davvid@gmail.com>
This refactors git-mergetool to use get_mergetool_path().
Signed-off-by: David Aguilar <davvid@gmail.com>
---
git-mergetool.sh | 20 +++-----------------
1 files changed, 3 insertions(+), 17 deletions(-)
diff --git a/git-mergetool.sh b/git-mergetool.sh
index 7c04031..732a5b7 100755
--- a/git-mergetool.sh
+++ b/git-mergetool.sh
@@ -12,6 +12,7 @@ USAGE='[--tool=tool] [-y|--no-prompt|--prompt] [file to merge] ...'
SUBDIRECTORY_OK=Yes
OPTIONS_SPEC=
. git-sh-setup
+. git-mergetool-lib
require_work_tree
# Returns true if the mode reflects a symlink
@@ -355,20 +356,6 @@ valid_tool() {
esac
}
-init_merge_tool_path() {
- merge_tool_path=$(git config mergetool.$1.path)
- if test -z "$merge_tool_path" ; then
- case "$1" in
- emerge)
- merge_tool_path=emacs
- ;;
- *)
- merge_tool_path=$1
- ;;
- esac
- fi
-}
-
prompt_after_failed_merge() {
while true; do
printf "Continue merging other unresolved paths (y/n) ? "
@@ -412,7 +399,7 @@ if test -z "$merge_tool" ; then
fi
echo "merge tool candidates: $merge_tool_candidates"
for i in $merge_tool_candidates; do
- init_merge_tool_path $i
+ merge_tool_path="$(get_merge_tool_path "$i" "$merge_tool_path")"
if type "$merge_tool_path" > /dev/null 2>&1; then
merge_tool=$i
break
@@ -428,8 +415,7 @@ else
exit 1
fi
- init_merge_tool_path "$merge_tool"
-
+ merge_tool_path="$(get_merge_tool_path "$merge_tool")"
merge_keep_backup="$(git config --bool merge.keepBackup || echo true)"
merge_keep_temporaries="$(git config --bool mergetool.keepTemporaries || echo false)"
--
1.6.1.3
^ permalink raw reply related
* [PATCH 06/10] mergetool: use valid_tool from git-mergetool-lib
From: David Aguilar @ 2009-04-01 12:55 UTC (permalink / raw)
To: gitster, charles; +Cc: git, David Aguilar
In-Reply-To: <1238590514-41893-6-git-send-email-davvid@gmail.com>
This refactors git-mergetool to use valid_tool from git-mergetool-lib.
Signed-off-by: David Aguilar <davvid@gmail.com>
---
git-mergetool.sh | 21 +++------------------
1 files changed, 3 insertions(+), 18 deletions(-)
diff --git a/git-mergetool.sh b/git-mergetool.sh
index 732a5b7..957993c 100755
--- a/git-mergetool.sh
+++ b/git-mergetool.sh
@@ -11,6 +11,7 @@
USAGE='[--tool=tool] [-y|--no-prompt|--prompt] [file to merge] ...'
SUBDIRECTORY_OK=Yes
OPTIONS_SPEC=
+TOOL_MODE=merge
. git-sh-setup
. git-mergetool-lib
require_work_tree
@@ -338,24 +339,6 @@ do
shift
done
-valid_custom_tool()
-{
- merge_tool_cmd="$(git config mergetool.$1.cmd)"
- test -n "$merge_tool_cmd"
-}
-
-valid_tool() {
- case "$1" in
- kdiff3 | tkdiff | xxdiff | meld | opendiff | emerge | vimdiff | gvimdiff | ecmerge)
- ;; # happy
- *)
- if ! valid_custom_tool "$1"; then
- return 1
- fi
- ;;
- esac
-}
-
prompt_after_failed_merge() {
while true; do
printf "Continue merging other unresolved paths (y/n) ? "
@@ -409,12 +392,14 @@ if test -z "$merge_tool" ; then
echo "No known merge resolution program available."
exit 1
fi
+ merge_tool_cmd="$(git config mergetool."$merge_tool".cmd)"
else
if ! valid_tool "$merge_tool"; then
echo >&2 "Unknown merge_tool $merge_tool"
exit 1
fi
+ merge_tool_cmd="$(git config mergetool.$merge_tool.cmd)"
merge_tool_path="$(get_merge_tool_path "$merge_tool")"
merge_keep_backup="$(git config --bool merge.keepBackup || echo true)"
merge_keep_temporaries="$(git config --bool mergetool.keepTemporaries || echo false)"
--
1.6.1.3
^ permalink raw reply related
* [PATCH 05/10] difftool: use get_mergetool_path from git-mergetool-lib
From: David Aguilar @ 2009-04-01 12:55 UTC (permalink / raw)
To: gitster, charles; +Cc: git, David Aguilar
In-Reply-To: <1238590514-41893-5-git-send-email-davvid@gmail.com>
This refactors git-difftool-helper to use get_mergetool_path().
Signed-off-by: David Aguilar <davvid@gmail.com>
---
git-difftool-helper.sh | 33 ++++++++++++---------------------
1 files changed, 12 insertions(+), 21 deletions(-)
diff --git a/git-difftool-helper.sh b/git-difftool-helper.sh
index 02bb135..d1bea18 100755
--- a/git-difftool-helper.sh
+++ b/git-difftool-helper.sh
@@ -7,6 +7,9 @@
#
# Copyright (c) 2009 David Aguilar
+# Load common functions from git-mergetool-lib
+. git-mergetool-lib
+
# difftool.prompt controls the default prompt/no-prompt behavior
# and is overridden with $GIT_DIFFTOOL*_PROMPT.
should_prompt () {
@@ -125,25 +128,6 @@ valid_tool() {
esac
}
-# Sets up the merge_tool_path variable.
-# This handles the difftool.<tool>.path configuration.
-# This also falls back to mergetool defaults.
-init_merge_tool_path() {
- merge_tool_path=$(git config difftool."$1".path)
- test -z "$merge_tool_path" &&
- merge_tool_path=$(git config mergetool."$1".path)
- if test -z "$merge_tool_path"; then
- case "$1" in
- emerge)
- merge_tool_path=emacs
- ;;
- *)
- merge_tool_path="$1"
- ;;
- esac
- fi
-}
-
# Allow GIT_DIFF_TOOL and GIT_MERGE_TOOL to provide default values
test -n "$GIT_MERGE_TOOL" && merge_tool="$GIT_MERGE_TOOL"
test -n "$GIT_DIFF_TOOL" && merge_tool="$GIT_DIFF_TOOL"
@@ -187,7 +171,7 @@ if test -z "$merge_tool"; then
# Loop over each candidate and stop when a valid merge tool is found.
for i in $merge_tool_candidates
do
- init_merge_tool_path $i
+ merge_tool_path="$(get_merge_tool_path "$i")"
if type "$merge_tool_path" > /dev/null 2>&1; then
merge_tool=$i
break
@@ -206,7 +190,14 @@ else
exit 1
fi
- init_merge_tool_path "$merge_tool"
+ # Sets up the merge_tool_path variable.
+ # This handles the difftool.<tool>.path configuration variable
+ # and falls back to mergetool defaults.
+ merge_tool_path=$(git config difftool."$1".path)
+ test -z "$merge_tool_path" &&
+ merge_tool_path=$(git config mergetool."$1".path)
+ merge_tool_path="$(get_merge_tool_path "$merge_tool" \
+ "$merge_tool_path")"
if test -z "$merge_tool_cmd" && ! type "$merge_tool_path" > /dev/null 2>&1; then
echo "The merge tool $merge_tool is not available as '$merge_tool_path'"
--
1.6.1.3
^ permalink raw reply related
* [PATCH 03/10] Add a mergetool-lib scriptlet for holding common merge tool functions
From: David Aguilar @ 2009-04-01 12:55 UTC (permalink / raw)
To: gitster, charles; +Cc: git, David Aguilar
In-Reply-To: <1238590514-41893-3-git-send-email-davvid@gmail.com>
git-mergetool-lib provides common merge tool functions.
Signed-off-by: David Aguilar <davvid@gmail.com>
---
.gitignore | 1 +
Documentation/git-mergetool-lib.txt | 42 +++++++++++++++++++++++++++++++++++
Makefile | 1 +
command-list.txt | 1 +
git-mergetool-lib.sh | 41 ++++++++++++++++++++++++++++++++++
5 files changed, 86 insertions(+), 0 deletions(-)
create mode 100644 Documentation/git-mergetool-lib.txt
create mode 100644 git-mergetool-lib.sh
diff --git a/.gitignore b/.gitignore
index 966c886..75c154a 100644
--- a/.gitignore
+++ b/.gitignore
@@ -80,6 +80,7 @@ git-merge-recursive
git-merge-resolve
git-merge-subtree
git-mergetool
+git-mergetool-lib
git-mktag
git-mktree
git-name-rev
diff --git a/Documentation/git-mergetool-lib.txt b/Documentation/git-mergetool-lib.txt
new file mode 100644
index 0000000..a8d62f5
--- /dev/null
+++ b/Documentation/git-mergetool-lib.txt
@@ -0,0 +1,42 @@
+git-mergetool-lib(1)
+====================
+
+NAME
+----
+git-mergetool-lib - Common git merge tool shell scriptlets
+
+SYNOPSIS
+--------
+'. "$(git --exec-path)/git-mergetool-lib"'
+
+DESCRIPTION
+-----------
+
+This is not a command the end user would want to run. Ever.
+This documentation is meant for people who are studying the
+Porcelain-ish scripts and/or are writing new ones.
+
+The 'git-mergetool-lib' scriptlet is designed to be sourced (using
+`.`) by other shell scripts to set up functions for working
+with git merge tools.
+
+Before sourcing it, your script should set up a few variables;
+`TOOL_MODE` is used to define the operation mode for various
+functions. 'diff' and 'merge' are valid values.
+
+FUNCTIONS
+---------
+get_merge_tool_path::
+ returns the `merge_tool_path` for a `merge_tool`.
+
+Author
+------
+Written by David Aguilar <davvid@gmail.com>
+
+Documentation
+--------------
+Documentation by David Aguilar and the git-list <git@vger.kernel.org>.
+
+GIT
+---
+Part of the linkgit:git[1] suite
diff --git a/Makefile b/Makefile
index d77fd71..086f9e7 100644
--- a/Makefile
+++ b/Makefile
@@ -284,6 +284,7 @@ SCRIPT_SH += git-merge-octopus.sh
SCRIPT_SH += git-merge-one-file.sh
SCRIPT_SH += git-merge-resolve.sh
SCRIPT_SH += git-mergetool.sh
+SCRIPT_SH += git-mergetool-lib.sh
SCRIPT_SH += git-parse-remote.sh
SCRIPT_SH += git-pull.sh
SCRIPT_SH += git-quiltimport.sh
diff --git a/command-list.txt b/command-list.txt
index fb03a2e..922c815 100644
--- a/command-list.txt
+++ b/command-list.txt
@@ -69,6 +69,7 @@ git-merge-file plumbingmanipulators
git-merge-index plumbingmanipulators
git-merge-one-file purehelpers
git-mergetool ancillarymanipulators
+git-mergetool-lib purehelpers
git-merge-tree ancillaryinterrogators
git-mktag plumbingmanipulators
git-mktree plumbingmanipulators
diff --git a/git-mergetool-lib.sh b/git-mergetool-lib.sh
new file mode 100644
index 0000000..c307a5d
--- /dev/null
+++ b/git-mergetool-lib.sh
@@ -0,0 +1,41 @@
+# git-mergetool-lib is a library for common merge tool functions
+diff_mode() {
+ test $TOOL_MODE = "diff"
+}
+
+get_merge_tool_path () {
+ if test -z "$2"; then
+ case "$1" in
+ emerge)
+ path=emacs
+ ;;
+ *)
+ path="$1"
+ ;;
+ esac
+ fi
+ echo "$path"
+}
+
+valid_tool () {
+ case "$1" in
+ kdiff3 | kompare | tkdiff | xxdiff | meld | opendiff | emerge | vimdiff | gvimdiff | ecmerge)
+ if test "$1" = "kompare" && ! diff_mode; then
+ return 1
+ fi
+ ;; # happy
+ *)
+ if ! test -n "$(get_custom_cmd "$1")"; then
+ return 1
+ fi ;;
+ esac
+}
+
+get_custom_cmd () {
+ diff_mode &&
+ custom_cmd="$(git config difftool.$1.cmd)"
+ test -z "$custom_cmd" &&
+ custom_cmd="$(git config mergetool.$1.cmd)"
+ test -n "$custom_cmd" &&
+ echo "$custom_cmd"
+}
--
1.6.1.3
^ permalink raw reply related
* [PATCH 01/10] difftool: add support for a difftool.prompt config variable
From: David Aguilar @ 2009-04-01 12:55 UTC (permalink / raw)
To: gitster, charles; +Cc: git, David Aguilar
In-Reply-To: <1238590514-41893-1-git-send-email-davvid@gmail.com>
difftool now supports difftool.prompt so that users do not have to
pass --no-prompt or hit enter each time a diff tool is launched.
The --prompt flag overrides the configuration variable.
Signed-off-by: David Aguilar <davvid@gmail.com>
---
Documentation/config.txt | 3 ++
Documentation/git-difftool.txt | 10 +++++-
git-difftool-helper.sh | 10 +++++-
git-difftool.perl | 15 +++++++--
t/t7800-difftool.sh | 64 ++++++++++++++++++++++++++++++++++++++++
5 files changed, 96 insertions(+), 6 deletions(-)
diff --git a/Documentation/config.txt b/Documentation/config.txt
index 185a9ef..79c8b66 100644
--- a/Documentation/config.txt
+++ b/Documentation/config.txt
@@ -684,6 +684,9 @@ difftool.<tool>.cmd::
is set to the name of the temporary file containing the contents
of the diff post-image.
+difftool.prompt::
+ Prompt before each invocation of the diff tool.
+
diff.wordRegex::
A POSIX Extended Regular Expression used to determine what is a "word"
when performing word-by-word difference calculations. Character
diff --git a/Documentation/git-difftool.txt b/Documentation/git-difftool.txt
index a00e943..73d4782 100644
--- a/Documentation/git-difftool.txt
+++ b/Documentation/git-difftool.txt
@@ -7,7 +7,7 @@ git-difftool - Show changes using common diff tools
SYNOPSIS
--------
-'git difftool' [--tool=<tool>] [-y|--no-prompt] [<'git diff' options>]
+'git difftool' [--tool=<tool>] [-y|--no-prompt|--prompt] [<'git diff' options>]
DESCRIPTION
-----------
@@ -21,6 +21,11 @@ OPTIONS
--no-prompt::
Do not prompt before launching a diff tool.
+--prompt::
+ Prompt before each invocation of the diff tool.
+ This is the default behaviour; the option is provided to
+ override any configuration settings.
+
-t <tool>::
--tool=<tool>::
Use the diff tool specified by <tool>.
@@ -72,6 +77,9 @@ difftool.<tool>.cmd::
+
See the `--tool=<tool>` option above for more details.
+difftool.prompt::
+ Prompt before each invocation of the diff tool.
+
SEE ALSO
--------
linkgit:git-diff[1]::
diff --git a/git-difftool-helper.sh b/git-difftool-helper.sh
index b91002b..02bb135 100755
--- a/git-difftool-helper.sh
+++ b/git-difftool-helper.sh
@@ -7,9 +7,15 @@
#
# Copyright (c) 2009 David Aguilar
-# Set GIT_DIFFTOOL_NO_PROMPT to bypass the per-file prompt.
+# difftool.prompt controls the default prompt/no-prompt behavior
+# and is overridden with $GIT_DIFFTOOL*_PROMPT.
should_prompt () {
- test -z "$GIT_DIFFTOOL_NO_PROMPT"
+ prompt=$(git config --bool difftool.prompt || echo true)
+ if test "$prompt" = true; then
+ test -z "$GIT_DIFFTOOL_NO_PROMPT"
+ else
+ test -n "$GIT_DIFFTOOL_PROMPT"
+ fi
}
# This function prepares temporary files and launches the appropriate
diff --git a/git-difftool.perl b/git-difftool.perl
index 8c160e5..985dfe0 100755
--- a/git-difftool.perl
+++ b/git-difftool.perl
@@ -2,9 +2,12 @@
# Copyright (c) 2009 David Aguilar
#
# This is a wrapper around the GIT_EXTERNAL_DIFF-compatible
-# git-difftool-helper script. This script exports
-# GIT_EXTERNAL_DIFF and GIT_PAGER for use by git, and
-# GIT_DIFFTOOL_NO_PROMPT and GIT_DIFF_TOOL for use by git-difftool-helper.
+# git-difftool-helper script.
+#
+# This script exports GIT_EXTERNAL_DIFF and GIT_PAGER for use by git.
+# GIT_DIFFTOOL_NO_PROMPT, GIT_DIFFTOOL_PROMPT, and GIT_DIFF_TOOL
+# are exported for use by git-difftool-helper.
+#
# Any arguments that are unknown to this script are forwarded to 'git diff'.
use strict;
@@ -62,6 +65,12 @@ sub generate_command
}
if ($arg eq '-y' || $arg eq '--no-prompt') {
$ENV{GIT_DIFFTOOL_NO_PROMPT} = 'true';
+ delete $ENV{GIT_DIFFTOOL_PROMPT};
+ next;
+ }
+ if ($arg eq '--prompt') {
+ $ENV{GIT_DIFFTOOL_PROMPT} = 'true';
+ delete $ENV{GIT_DIFFTOOL_NO_PROMPT};
next;
}
if ($arg eq '-h' || $arg eq '--help') {
diff --git a/t/t7800-difftool.sh b/t/t7800-difftool.sh
index ceef84b..33d07e6 100755
--- a/t/t7800-difftool.sh
+++ b/t/t7800-difftool.sh
@@ -15,6 +15,7 @@ remove_config_vars()
# Unset all config variables used by git-difftool
git config --unset diff.tool
git config --unset difftool.test-tool.cmd
+ git config --unset difftool.prompt
git config --unset merge.tool
git config --unset mergetool.test-tool.cmd
return 0
@@ -26,11 +27,18 @@ restore_test_defaults()
remove_config_vars
unset GIT_DIFF_TOOL
unset GIT_MERGE_TOOL
+ unset GIT_DIFFTOOL_PROMPT
unset GIT_DIFFTOOL_NO_PROMPT
git config diff.tool test-tool &&
git config difftool.test-tool.cmd 'cat $LOCAL'
}
+prompt_given()
+{
+ prompt="$1"
+ test "$prompt" = "Hit return to launch 'test-tool': branch"
+}
+
# Create a file on master and change it on branch
test_expect_success 'setup' '
echo master >file &&
@@ -116,6 +124,62 @@ test_expect_success 'GIT_DIFFTOOL_NO_PROMPT variable' '
restore_test_defaults
'
+# git-difftool supports the difftool.prompt variable.
+# Test that GIT_DIFFTOOL_PROMPT can override difftool.prompt = false
+test_expect_success 'GIT_DIFFTOOL_PROMPT variable' '
+ git config difftool.prompt false &&
+ GIT_DIFFTOOL_PROMPT=true &&
+ export GIT_DIFFTOOL_PROMPT &&
+
+ prompt=$(echo | git difftool --prompt branch | tail -1) &&
+ prompt_given "$prompt" &&
+
+ restore_test_defaults
+'
+
+# Test that we don't have to pass --no-prompt when difftool.prompt is false
+test_expect_success 'difftool.prompt config variable is false' '
+ git config difftool.prompt false &&
+
+ diff=$(git difftool branch) &&
+ test "$diff" = "branch" &&
+
+ restore_test_defaults
+'
+
+# Test that the -y flag can override difftool.prompt = true
+test_expect_success 'difftool.prompt can overridden with -y' '
+ git config difftool.prompt true &&
+
+ diff=$(git difftool -y branch) &&
+ test "$diff" = "branch" &&
+
+ restore_test_defaults
+'
+
+# Test that the --prompt flag can override difftool.prompt = false
+test_expect_success 'difftool.prompt can overridden with --prompt' '
+ git config difftool.prompt false &&
+
+ prompt=$(echo | git difftool --prompt branch | tail -1) &&
+ prompt_given "$prompt" &&
+
+ restore_test_defaults
+'
+
+# Test that the last flag passed on the command-line wins
+test_expect_success 'difftool last flag wins' '
+ diff=$(git difftool --prompt --no-prompt branch) &&
+ test "$diff" = "branch" &&
+
+ restore_test_defaults &&
+
+ prompt=$(echo | git difftool --no-prompt --prompt branch | tail -1) &&
+ prompt_given "$prompt" &&
+
+ restore_test_defaults
+'
+
# git-difftool falls back to git-mergetool config variables
# so test that behavior here
test_expect_success 'difftool + mergetool config variables' '
--
1.6.1.3
^ permalink raw reply related
* [PATCH 02/10] mergetool: use $( ... ) instead of `backticks`
From: David Aguilar @ 2009-04-01 12:55 UTC (permalink / raw)
To: gitster, charles; +Cc: git, David Aguilar
In-Reply-To: <1238590514-41893-2-git-send-email-davvid@gmail.com>
This makes mergetool consistent with Documentation/CodingGuidelines.
Signed-off-by: David Aguilar <davvid@gmail.com>
---
git-mergetool.sh | 16 ++++++++--------
1 files changed, 8 insertions(+), 8 deletions(-)
diff --git a/git-mergetool.sh b/git-mergetool.sh
index 87fa88a..7c04031 100755
--- a/git-mergetool.sh
+++ b/git-mergetool.sh
@@ -137,7 +137,7 @@ checkout_staged_file () {
merge_file () {
MERGED="$1"
- f=`git ls-files -u -- "$MERGED"`
+ f=$(git ls-files -u -- "$MERGED")
if test -z "$f" ; then
if test ! -f "$MERGED" ; then
echo "$MERGED: file not found"
@@ -156,9 +156,9 @@ merge_file () {
mv -- "$MERGED" "$BACKUP"
cp -- "$BACKUP" "$MERGED"
- base_mode=`git ls-files -u -- "$MERGED" | awk '{if ($3==1) print $1;}'`
- local_mode=`git ls-files -u -- "$MERGED" | awk '{if ($3==2) print $1;}'`
- remote_mode=`git ls-files -u -- "$MERGED" | awk '{if ($3==3) print $1;}'`
+ base_mode=$(git ls-files -u -- "$MERGED" | awk '{if ($3==1) print $1;}')
+ local_mode=$(git ls-files -u -- "$MERGED" | awk '{if ($3==2) print $1;}')
+ remote_mode=$(git ls-files -u -- "$MERGED" | awk '{if ($3==3) print $1;}')
base_present && checkout_staged_file 1 "$MERGED" "$BASE"
local_present && checkout_staged_file 2 "$MERGED" "$LOCAL"
@@ -308,7 +308,7 @@ do
-t|--tool*)
case "$#,$1" in
*,*=*)
- merge_tool=`expr "z$1" : 'z-[^=]*=\(.*\)'`
+ merge_tool=$(expr "z$1" : 'z-[^=]*=\(.*\)')
;;
1,*)
usage ;;
@@ -356,7 +356,7 @@ valid_tool() {
}
init_merge_tool_path() {
- merge_tool_path=`git config mergetool.$1.path`
+ merge_tool_path=$(git config mergetool.$1.path)
if test -z "$merge_tool_path" ; then
case "$1" in
emerge)
@@ -387,7 +387,7 @@ prompt_after_failed_merge() {
}
if test -z "$merge_tool"; then
- merge_tool=`git config merge.tool`
+ merge_tool=$(git config merge.tool)
if test -n "$merge_tool" && ! valid_tool "$merge_tool"; then
echo >&2 "git config option merge.tool set to unknown tool: $merge_tool"
echo >&2 "Resetting to default..."
@@ -447,7 +447,7 @@ last_status=0
rollup_status=0
if test $# -eq 0 ; then
- files=`git ls-files -u | sed -e 's/^[^ ]* //' | sort -u`
+ files=$(git ls-files -u | sed -e 's/^[^ ]* //' | sort -u)
if test -z "$files" ; then
echo "No files need merging"
exit 0
--
1.6.1.3
^ permalink raw reply related
* git-{diff,merge} refactor round 2
From: David Aguilar @ 2009-04-01 12:55 UTC (permalink / raw)
To: gitster, charles; +Cc: git
Here's the 2nd round of refactoring.
This is based on Junio's pu branch.
I'm including the difftool.prompt patch in this series
because it is a dependency and including it here makes
that obvious.
I tried to keep the dependencies untangled while still being
able to manage the various command-line flags all in one
place. Alas, this is shell so it can only be so elegant.
I went ahead and rolled in the "remove -o $MERGED" from
tkdiff for the diff mode case.
Still TODO:
incorporate the "add diffuse as a merge tool" patch.
Is there more that can be refactored?
Probably the part that sets up candidate mergetools,
replacing that with a function might be useful.
Here's what I've got so far.
^ permalink raw reply
* Re: On git 1.6 (novice's opinion)
From: Andreas Ericsson @ 2009-04-01 12:40 UTC (permalink / raw)
To: Ulrich Windl; +Cc: Andreas Ericsson, Andreas Ericsson, git
In-Reply-To: <49D37190.23422.145597D@Ulrich.Windl.rkdvmks1.ngate.uni-regensburg.de>
Ulrich Windl wrote:
> On 1 Apr 2009 at 12:21, Andreas Ericsson wrote:
>
> [...]
>>> What I don't understand here is: Why wouldn't the $Id$ be updated upon upgrade?
>>> Because it's a manual process?
>>>
>> It MAY not get updated, since $Id$ tags are per-file instead of per-project.
>> Any sane project will have more than one file, and the file listing the
>> $Id$ that the end-user sees may not have changed since the last release.
>>
>> Per-file revision tags are stupid and useless for anything but a one-file
>> project.
>
> Hmm...:
> # what vmunix
> vmunix:
> ivt.s $Date: 2008/11/21 09:10:19 $Revision: r11.31/5 PATCH_11.31 (B11.3
> 1.0903LR)
> side_dumpdev - HP IDE Dump Driver B.11.31 /ux/core/kern/em/svc/dump/scs
> i_ide_dumpdev.c: Jan 8 2009, 23:48:25
> eschgr - Changer Driver B.11.31.01 /ux/core/kern/common/io/escsi/eschgr
> /eschgr.c:Jan 10 2007,17:04:47
> eschgr - Changer Driver B.11.31.01 /ux/core/kern/common/io/escsi/eschgr
> /eschgr_diag.c:Dec 27 2006,16:59:17
> [...]
> vxfs:$RCSfile: vx_portal.c,v $ $Revision: 4.14.26.3 $
> vxfs:$RCSfile: vx_portal_osrel.c,v $ $Revision: 1.1.2.1 $
> vxfs:$RCSfile: vx_portal_dlkm.c,v $ $Revision: 1.1.2.1 $
> vxfs:$RCSfile: vxportal50.modmeta,v $ $Revision: 1.1.2.5 $
> wsio_cdio.c $Date: 2008/06/03 05:52:50 $Revision: r11.31/13 PATCH_11.31
> (B11.31.0809LR)
> $Revision: wsio: B11.31.0809LR
> $Revision: wxb_hp: B.11.31_LR
> tracer.s $Date: 2008/04/28 17:14:06 $Revision: r11.31/3 PATCH_11.31 (B1
> 1.31.0809LR)
>
> For a kernel, where development is decentralized, it would make sense: Imageine a
> user (or distributor) will nut upgrade anything to the latest version, but only
> parts (subsystems). Then the single kernel version number is meaningless.
>
Not really. They can (and should) create their own version numbers. I can't make
sense of the above output. If you ask a developer to piece together the puzzle
that makes up this subsystem and then fit it into the bigger picture, he won't
love you for it. Not only because this particular subsystem might well be the
same version across several different releases with all their different API's
(the input system has changed its API's incompatibly quite frequently over the
last six months, fe, so a driver-version *alone* in that system makes absolutely
no sense if you're trying to debug it).
--
Andreas Ericsson andreas.ericsson@op5.se
OP5 AB www.op5.se
Tel: +46 8-230225 Fax: +46 8-230231
Considering the successes of the wars on alcohol, poverty, drugs and
terror, I think we should give some serious thought to declaring war
on peace.
^ permalink raw reply
page: next (older) | prev (newer) | latest
- recent:[subjects (threaded)|topics (new)|topics (active)]
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox