Re: [PATCH] Teach parse_commit_buffer about grafting.
Linus Torvalds writes: Paul, I hate to tell you about yet another flag to git-rev-list, but did you realize that in addition to all the other magic flags, there's a flag called --parents? Cool. I didn't realize that. The current version uses it now. Umm. git-rev-list really does everything. Rule of thumb: if you _ever_ need to look at any other internal git information, you're probably doing something wrong, or you've missed yet another flag ;) I still look in [gitdir]/refs/tags/* and [gitdir]/refs/heads/*, what flag have I missed? :) Junio wants me to look at everything under [gitdir]/refs, in fact. Or are the refs not considered internal git information? Paul. - To unsubscribe from this list: send the line unsubscribe git in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: [PATCH] Teach parse_commit_buffer about grafting.
Hi, On Fri, 19 Aug 2005, Paul Mackerras wrote: Linus Torvalds writes: Paul, I hate to tell you about yet another flag [...] But why? You're doing such a fine job telling people about flags :-) Umm. git-rev-list really does everything. Rule of thumb: if you _ever_ need to look at any other internal git information, you're probably doing something wrong, or you've missed yet another flag ;) I still look in [gitdir]/refs/tags/* and [gitdir]/refs/heads/*, what flag have I missed? :) Junio wants me to look at everything under [gitdir]/refs, in fact. Or are the refs not considered internal git information? Time for git-ref-list? Joking. But there may be a use for a --refs flag to git-rev-list, which just lists all the refs' names together with their object name (SHA1). Ciao, Dscho - To unsubscribe from this list: send the line unsubscribe git in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: [PATCH] Teach parse_commit_buffer about grafting.
On Fri, 19 Aug 2005, Paul Mackerras wrote: Umm. git-rev-list really does everything. Rule of thumb: if you _ever_ need to look at any other internal git information, you're probably doing something wrong, or you've missed yet another flag ;) I still look in [gitdir]/refs/tags/* and [gitdir]/refs/heads/*, what flag have I missed? :) Junio wants me to look at everything under [gitdir]/refs, in fact. Or are the refs not considered internal git information? Ahh, ok, fair enough. git-rev-list won't give you that. And yes, the general rule is that anything under .git/refs/ is potentially a reference. If it's under heads/ or tags/ it's a branch/tag, and then the prefix heads/ or tags/ shouldn't be part of the name - you already show the difference with colors. Anything else is unusual, but bisection puts refs in the .git/refs/bisect directory for example, and if gitk were to show those, it should probably show them in yet another color, and _with_ the bisect/ prefix.. Linus - To unsubscribe from this list: send the line unsubscribe git in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: [PATCH] Teach parse_commit_buffer about grafting.
Wolfgang Denk [EMAIL PROTECTED] writes: The display in gitk --all gets changed a bit (before the branch was the leftmost line, now it's the rightmost one), but it's still a dangling head, and the selected merge point (commit 24ee89) is still displayed with just one parent (de180e) - I would expect to also see d9af3c listed as parent, and the branch merging in here? Am I missing something? The graft info is not used by anything other than those that use parse_commit() to figure out the commit ancestry information. The list of commits that appear in the top pane of the gitk is generated by git-rev-list which knows how to do it, but the parent and child links, and the lines between nodes are drawn by gitk using the information it reads directly from the commit objects. My Tcl/Tk is really rusty, and I do not like this patch, but here is my stab at teaching the code that reads commit objects how to use grafts as well. [PATCH] Teach gitk to use grafts info Finding commits to draw is done by git-rev-list which knows how to do the grafts, but the lines between commits and the parent / child links needs to be drawn by reading from the commit objects. Teach that part of the code how to grok grafts info so that fake ancestry is shown sensibly in gitk. Signed-off-by: Junio C Hamano [EMAIL PROTECTED] --- gitk | 36 +++- 1 files changed, 35 insertions(+), 1 deletion(-) diff --git a/gitk b/gitk --- a/gitk +++ b/gitk @@ -155,7 +155,7 @@ proc readcommit {id} { } proc parsecommit {id contents listed} { -global commitinfo children nchildren parents nparents cdate ncleft +global commitinfo children nchildren parents nparents cdate ncleft grafts set inhdr 1 set comment {} @@ -171,6 +171,23 @@ proc parsecommit {id contents listed} { } set parents($id) {} set nparents($id) 0 +set has_graft [array get grafts $id] +if { != $has_graft} { + set parents($id) $grafts($id) + set nparents($id) [llength $parents($id)] + foreach p $parents($id) { + if {![info exists nchildren($p)]} { + set children($p) {} + set nchildren($p) 0 + set ncleft($p) 0 + } + if {$listed [lsearch -exact $children($p) $id] 0} { + lappend children($p) $id + incr nchildren($p) + incr ncleft($p) + } + } +} foreach line [split $contents \n] { if {$inhdr} { if {$line == {}} { @@ -178,6 +195,9 @@ proc parsecommit {id contents listed} { } else { set tag [lindex $line 0] if {$tag == parent} { + if { != $has_graft} { + continue + } set p [lindex $line 1] if {![info exists nchildren($p)]} { set children($p) {} @@ -3194,6 +3214,20 @@ foreach arg $argv { set history {} set historyindex 0 +set grafts('') nothing +array unset grafts '' +if {![catch { set graft [exec cat [gitdir]/info/grafts] }]} { +global grafts +foreach line [split $graft \n] { + set commit [lindex $line 0] + set llen [llength $line] + set pp {} + for {set i 1} {$i $llen} {incr i} { + lappend pp [lindex $line $i] + } + set grafts($commit) $pp +} +} set stopped 0 set redisplaying 0 - To unsubscribe from this list: send the line unsubscribe git in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: [PATCH] Teach parse_commit_buffer about grafting.
Junio C Hamano writes: My Tcl/Tk is really rusty, and I do not like this patch, but here is my stab at teaching the code that reads commit objects how to use grafts as well. I added support for grafts to gitk just yesterday, and it should be on kernel.org by now. I also committed the changes to send lines into hyperspace. Regards, Paul. - To unsubscribe from this list: send the line unsubscribe git in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: [PATCH] Teach parse_commit_buffer about grafting.
On Thu, 18 Aug 2005, Paul Mackerras wrote: I added support for grafts to gitk just yesterday, and it should be on kernel.org by now. I also committed the changes to send lines into hyperspace. Paul, I hate to tell you about yet another flag to git-rev-list, but did you realize that in addition to all the other magic flags, there's a flag called --parents? Right now you use git-rev-list --header --topo-order, which gives you both the commit ID's and the header. Add a --parents there, and you'll notice that the first line of each NUL-terminated record changes from just the commit ID to the commit ID + parent list. That way gitk wouldn't need to actually know about grafts, because it would just pick it up from the git-rev-list output which gets it from the regular commit parsing code. Umm. git-rev-list really does everything. Rule of thumb: if you _ever_ need to look at any other internal git information, you're probably doing something wrong, or you've missed yet another flag ;) Linus - To unsubscribe from this list: send the line unsubscribe git in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html
[PATCH] Teach parse_commit_buffer about grafting.
Introduce a new file $GIT_DIR/info/grafts (or $GIT_GRAFT_FILE) which is a list of fake commit parent records. Each line of this file is a commit ID, followed by parent commit IDs, all 40-byte hex SHA1 separated by a single SP in between. The records override the parent information we would normally read from the commit objects, allowing both adding fake parents (i.e. grafting), and pretending as if a commit is not a child of some of its real parents (i.e. cauterizing). Bugs are mine, but the credits for the idea and implementation outline all go to Linus, who kept hinting how this thing should work. Signed-off-by: Junio C Hamano [EMAIL PROTECTED] --- cache.h |2 + commit.c| 114 ++- sha1_file.c | 13 ++- 3 files changed, 127 insertions(+), 2 deletions(-) 0f16b172aa7f0757b2af50ec7be58dc0e23913a6 diff --git a/cache.h b/cache.h --- a/cache.h +++ b/cache.h @@ -127,10 +127,12 @@ extern unsigned int active_nr, active_al #define DEFAULT_GIT_DIR_ENVIRONMENT .git #define DB_ENVIRONMENT GIT_OBJECT_DIRECTORY #define INDEX_ENVIRONMENT GIT_INDEX_FILE +#define GRAFT_ENVIRONMENT GIT_GRAFT_FILE extern char *get_object_directory(void); extern char *get_refs_directory(void); extern char *get_index_file(void); +extern char *get_graft_file(void); #define ALTERNATE_DB_ENVIRONMENT GIT_ALTERNATE_OBJECT_DIRECTORIES diff --git a/commit.c b/commit.c --- a/commit.c +++ b/commit.c @@ -91,11 +91,108 @@ static unsigned long parse_commit_date(c return date; } +static struct commit_graft { + unsigned char sha1[20]; + int nr_parent; + unsigned char parent[0][20]; /* more */ +} **commit_graft; +static int commit_graft_alloc, commit_graft_nr; + +static int commit_graft_pos(const unsigned char *sha1) +{ + int lo, hi; + lo = 0; + hi = commit_graft_nr; + while (lo hi) { + int mi = (lo + hi) / 2; + struct commit_graft *graft = commit_graft[mi]; + int cmp = memcmp(sha1, graft-sha1, 20); + if (!cmp) + return mi; + if (cmp 0) + hi = mi; + else + lo = mi + 1; + } + return -lo - 1; +} + +static void prepare_commit_graft(void) +{ + char *graft_file = get_graft_file(); + FILE *fp = fopen(graft_file, r); + char buf[1024]; + if (!fp) { + commit_graft = (struct commit_graft **) hack; + return; + } + while (fgets(buf, sizeof(buf), fp)) { + /* The format is just Commit Parent1 Parent2 ...\n */ + int len = strlen(buf); + int i; + struct commit_graft *graft = NULL; + + if (buf[len-1] == '\n') + buf[--len] = 0; + if (buf[0] == '#') + continue; + if ((len + 1) % 41) { + bad_graft_data: + error(bad graft data: %s, buf); + free(graft); + continue; + } + i = (len + 1) / 41 - 1; + graft = xmalloc(sizeof(*graft) + 20 * i); + graft-nr_parent = i; + if (get_sha1_hex(buf, graft-sha1)) + goto bad_graft_data; + for (i = 40; i len; i += 41) { + if (buf[i] != ' ') + goto bad_graft_data; + if (get_sha1_hex(buf + i + 1, graft-parent[i/41])) + goto bad_graft_data; + } + i = commit_graft_pos(graft-sha1); + if (0 = i) { + error(duplicate graft data: %s, buf); + free(graft); + continue; + } + i = -i - 1; + if (commit_graft_alloc = ++commit_graft_nr) { + commit_graft_alloc = alloc_nr(commit_graft_alloc); + commit_graft = xrealloc(commit_graft, + sizeof(*commit_graft) * + commit_graft_alloc); + } + if (i commit_graft_nr) + memmove(commit_graft + i + 1, + commit_graft + i, + (commit_graft_nr - i - 1) * + sizeof(*commit_graft)); + commit_graft[i] = graft; + } + fclose(fp); +} + +static struct commit_graft *lookup_commit_graft(const unsigned char *sha1) +{ + int pos; + if (!commit_graft) + prepare_commit_graft(); + pos = commit_graft_pos(sha1); + if (pos 0) + return NULL; + return commit_graft[pos]; +} + int parse_commit_buffer(struct commit *item, void *buffer, unsigned long size) {
Re: [PATCH] Teach parse_commit_buffer about grafting.
Hi, Junio C Hamano wrote: Introduce a new file $GIT_DIR/info/grafts Nice work. Has anybody git-imported the old tarfile+patch history yet? If not, I'll do it over the weekend. -- Matthias Urlichs | {M:U} IT Design @ m-u-it.de | [EMAIL PROTECTED] Disclaimer: The quote was selected randomly. Really. | http://smurf.noris.de - - Whatever occurs from love is always beyond good and evil. -- Friedrich Nietzsche - To unsubscribe from this list: send the line unsubscribe git in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: [PATCH] Teach parse_commit_buffer about grafting.
Hi, is it possible that you forgot to initialize commit_graft_nr to 0? Ciao, Dscho - To unsubscribe from this list: send the line unsubscribe git in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html