Git development
 help / color / mirror / Atom feed
* Re: [PATCH] git builtin "push"
From: Junio C Hamano @ 2006-04-30  7:08 UTC (permalink / raw)
  To: Linus Torvalds; +Cc: git
In-Reply-To: <Pine.LNX.4.64.0604292111570.9901@g5.osdl.org>

Linus Torvalds <torvalds@osdl.org> writes:

> Junio - I currently have a "push-all" script in each of the repos I 
> maintain. That has worked, but I'd just rather do something like
>
> 	git push all
>
> instead, and have it pick up the list of URI's from .git/remotes/all.

Makes sense.  I am still somewhat drunk (cachaça -- agua de
beber -- pretty good but strong stuff), so I will look at the
patch tomorrow, but...

> How do you do multi-targeted pushes?

I do not.  At least not that often.  I merge things up, test all
of "master", "maint", "next", and "pu" locally (the Meta/Doit
script, available after checking out "todo" branch in Meta/
subdirectory), then "git push ko-private" to push into ~/git of
the kernel.org machine and do "all branches" test again
(Meta/DoKernelOrg script).  Only after all that passes, I do a
"git push ko" from my local machine to push into the public
area, /pub/scm/git/git.git, of the kernel.org machine.

For Solaris and Cygwin testing, only occasionally, I do not push
but pull from the machines at work.  This is because I want to
catch breakage of pull side myself if there is one.

The only time I do multi-target push is just before cutting a
release.  In addition to "git push ko-private" to push into the
primary Opteron machine, I push to "git push ko-old-private" to
push into the i386 machine at kernel.org, "Meta/DoKernelOrg
master" (or "maint") to prepare RPMs for i386 there, and another
"Meta/DoKernelOrg master" (or "maint") on the Opteron to
prepare RPMs for x86-64.  So personally I never felt the need
for a multi-target push.

^ permalink raw reply

* Re: [RFC] 'Download' stat
From: Junio C Hamano @ 2006-04-30  7:11 UTC (permalink / raw)
  To: Marco Costalba; +Cc: git
In-Reply-To: <e5bfff550604292159t5fac5436q73aecd5dbd56f516@mail.gmail.com>

"Marco Costalba" <mcostalba@gmail.com> writes:

> Hi all,
>
>     none is interested in (writing ;-)  ) a kind of 'download' summary stat?
>
> If git-daemon after a connection could save a record with fields like:
>
> - date
> - command requested (clone, pull, etc..)
> - current HEAD
>
> Perhaps would be possible to show nice stat/graph about repository
> activity and most downloaded repository content tags.

Perhaps "git-daemon --verbose --syslog".  Grep for loginfo in
daemon.c for details.

^ permalink raw reply

* Fwd: More qgit defects 1/2
From: Marco Costalba @ 2006-04-30  8:19 UTC (permalink / raw)
  To: git

I would like to forward this thread to the list in case someone find
it interesting and/or suggests improvements.

---------- Forwarded message ----------
From: Pavel Roskin <proski@gnu.org>
Date: Apr 30, 2006 9:50 AM
Subject: Re: More qgit defects
To: Marco Costalba <mcostalba@gmail.com>
Cc: ydirson@altern.org


Hello, Marco!

On Fri, 2006-04-28 at 19:21 +0200, Marco Costalba wrote:
>   I have just pushed some patches according to your suggestions.

Thank you very much.

> If we don't find any issue/annoyance I would like to release 1.2 in
> the next couple of days, so to have a broader test base, and also
> because currently released 1.2rc2 has a bad crash bug.

I think it's good for the 1.2 release.

> So if you have any concerns or you would like to see something more
> added please let me know.

I think the list items in the file window need a pop-up menu.  Without
it, the users would not be able to discover what e.g. the double click
would do.

More generally, I feel that something is wrong with the user interface.
I think gitk is doing it better with a single pane that has the comments
and the diff.  Splitting the window horizontally in three panes seems to
be too much, especially when one of the panes is used for diffs.

Actually, qgit may be better for serious work, such as comparing the
description with the actual text.  But still, the panes are too small in
vertical direction, and if I tear off the diff, it will obscure
something.

The jumpiness of qgit has been largely fixed, but there are still cases
when mere selecting an item affect another window.

Is it really necessary to have a separate file window?  How different is
it from the main window with the "filter by tree" option on?  Can we
switch between diff and annotation?  More generally, what are the things
that the users are not normally viewing at the same time?

I'm not asking to fix anything, but qgit still feels odd to me.  I know
I'm not qualified to ask you to rearrange everything, because I'm not a
GUI specialist, and I don't see how qgit should work.

Maybe you could ask in the git list how to improve qgit?  I cannot find
any suitable forum about HIG (human interface guidelines), but if you
ask in the git list, maybe somebody will give you an idea where to ask.

--
Regards,
Pavel Roskin

^ permalink raw reply

* Fwd: More qgit defects 2/2
From: Marco Costalba @ 2006-04-30  8:19 UTC (permalink / raw)
  To: git

I would like to forward this thread to the list in case someone find
it interesting and/or suggests improvements.

---------- Forwarded message ----------
From: Marco Costalba <mcostalba@gmail.com>
Date: Apr 30, 2006 10:11 AM
Subject: Re: More qgit defects
To: Pavel Roskin <proski@gnu.org>
Cc: ydirson@altern.org


Hi Pavel,
>
> I think the list items in the file window need a pop-up menu.  Without
> it, the users would not be able to discover what e.g. the double click
> would do.
>

yes, I agree.

> More generally, I feel that something is wrong with the user interface.
> I think gitk is doing it better with a single pane that has the comments
> and the diff.  Splitting the window horizontally in three panes seems to
> be too much, especially when one of the panes is used for diffs.
>

Please Pavel pull from latest qgit repo. I just pushed a patch that,
at least for my
browsing style, fixes this and IMHO is better then gitk.

Patch description is as follow:
"Usability enhancement: use 'P' key to quick toggle patch viewer

   One of the limitation of patch browsing in qgit is the use of two
   frames, one for revision logs and the other for patch viewer.

   If patch viewer is docked the space is normally limited by revision
   log frame. If patch viewer is undocked it is always at top level and
   hides main view and revision logs.

   So this patch adds a new key binding 'P' that hides/unhides diff
   viewer window.

   The intended use is simple: open patch viewer and undock it so to cover
   a good chunk of screen space, then press 'P' key and diff viewer will
   disappear.

   Now you can browse the revisions as usual and toggle diff viewer with 'P'
   key so to easily view both logs and patches without any space constrains.
"

After a little bit of using I have found this way very natural, quick
and, especially important for me, do not compromise patch view size.

What I do is to size the undocked patch viewer on my left screen, and
toggle the P key, but other adjustment are possible, see:

http://digilander.libero.it/mcostalba/qgit_P_1.png
http://digilander.libero.it/mcostalba/qgit_P_2.png

Tip: let your mouse be always over main list view so that patch view
does not steal the focus and you can browse only with keyboard arrows
as well with new key bindings (see F1).

Let me know what you think.

               Marco

^ permalink raw reply

* Re: [PATCH] git builtin "push"
From: sean @ 2006-04-30  9:40 UTC (permalink / raw)
  To: Linus Torvalds; +Cc: junkio, git
In-Reply-To: <Pine.LNX.4.64.0604292111570.9901@g5.osdl.org>

On Sat, 29 Apr 2006 21:22:49 -0700 (PDT)
Linus Torvalds <torvalds@osdl.org> wrote:

> Comments?  I wrote it so that it _should_ be fairly easy to re-use at 
> least the branches/remotes helper functions for a built-in "git fetch" as 
> well. But I didn't have the multi-URI issue with anything but pushing.


> +	if (strncmp(ref, "tags/", 5))
> +		return 0;
[...]
> +	for_each_ref(expand_one_ref);

How about a for_each_tag() function?


> +	int i, n = get_uri(repo, uri);
[...]
> +	n = get_uri(repo, uri);
> +	if (n <= 0)
> +		die("bad repository '%s'", repo);

get_uri() called twice.


The patch looks good and is easy to read, but wouldn't it be better
to require new c code to be thread safe and not leak memory?  Assuming
run-once-and-exit is making it difficult to push into a library.

Sean

builtin-push.c |   11 +++--------
refs.c         |    5 +++++
refs.h         |    1 +
3 files changed, 9 insertions(+), 8 deletions(-)

0e0e3cff71d65ac4cdc560ae143aded03acb4ceb
diff --git a/builtin-push.c b/builtin-push.c
index a0c1caa..0d74ed1 100644
--- a/builtin-push.c
+++ b/builtin-push.c
@@ -31,10 +31,6 @@ static int expand_one_ref(const char *re
 {
 	/* Ignore the "refs/" at the beginning of the refname */
 	ref += 5;
-
-	if (strncmp(ref, "tags/", 5))
-		return 0;
-
 	add_refspec(strdup(ref));
 	return 0;
 }
@@ -51,9 +47,8 @@ static void expand_refspecs(void)
 		 */
 		return;
 	}
-	if (!tags)
-		return;
-	for_each_ref(expand_one_ref);
+	if (tags)
+		for_each_tag(expand_one_ref);
 }
 
 static void set_refspecs(const char **refs, int nr)
@@ -156,7 +151,7 @@ static int get_uri(const char *repo, con
 static int do_push(const char *repo)
 {
 	const char *uri[MAX_URI];
-	int i, n = get_uri(repo, uri);
+	int i, n;
 	int remote;
 	const char **argv;
 	int argc;
diff --git a/refs.c b/refs.c
index 03398cc..c5a2dd0 100644
--- a/refs.c
+++ b/refs.c
@@ -178,6 +178,11 @@ int head_ref(int (*fn)(const char *path,
 	return 0;
 }
 
+int for_each_tag(int (*fn)(const char *path, const unsigned char *sha1))
+{
+	return do_for_each_ref("refs/tags", fn);
+}
+
 int for_each_ref(int (*fn)(const char *path, const unsigned char *sha1))
 {
 	return do_for_each_ref("refs", fn);
diff --git a/refs.h b/refs.h
index 2625596..b74cd4d 100644
--- a/refs.h
+++ b/refs.h
@@ -7,6 +7,7 @@ #define REFS_H
  */
 extern int head_ref(int (*fn)(const char *path, const unsigned char *sha1));
 extern int for_each_ref(int (*fn)(const char *path, const unsigned char *sha1));
+extern int for_each_tag(int (*fn)(const char *path, const unsigned char *sha1));
 
 /** Reads the refs file specified into sha1 **/
 extern int get_ref_sha1(const char *ref, unsigned char *sha1);
-- 
1.3.1.g9c203

^ permalink raw reply related

* Re: More qgit defects
From: Marco Costalba @ 2006-04-30 10:13 UTC (permalink / raw)
  To: Pavel Roskin; +Cc: ydirson, git
In-Reply-To: <1146390144.13634.9.camel@dv>

On 4/30/06, Pavel Roskin <proski@gnu.org> wrote:
> On Sun, 2006-04-30 at 05:26 -0400, Pavel Roskin wrote:
> > No, something still feels wrong.  I think even the gurus of GUI cannot
> > decide what to do if many frames need to be on screen.  Do you know that
> > many graphic designers hate GIMP for the overuse of dockable toplevel
> > windows?  Krita prefers dockable frames.  Photoshop uses non-dockable
> > child windows, I believe.
> >
> > The difference for qgit is that is generally wants bigger windows.
> > Whether the revision tree or the patch, having more space allows the
> > frame to present a better picture to the users.
>
> Replying to myself, sorry.  How about tabs?
>
> One tab for the main view.  Basically what we have now.
>
> Then tabs for revisions.  We can have more than one revision open, with
> the comment and with the patch, and and with affected files.  They will
> have the GUI centered on the change made by the revision.  StGIT commits
> would have an editable comment.
>
> Then tabs for files.  Again, possibly more than one.  Each tab about a
> specific file.  The file history, annotations, maybe even an editor for
> the file.
>
> The idea was inspired by Azureus.
>

Throwing in the tabs is a *very* big change, but, just to discuss....I
agree on the note that in qgit we have three different approaches:
fixed frames (revisions, file tree, affected files), detachable frames
(patch) and separate windows (annotations).

This is a bit strange and could give an odd GUI feeling.

I like the tab idea because it's clear and simple and fixes the 'many
approaches' problem. What I would suggest is, at least at first step,
do not change the main view and have only three tabs:

Tab1: Main view with revisions, file tree (hide able), affected files.
Tab2: Patch view with patch stat and diffs
Tab3: File history + file content/annotation view

In other words just put the frames/windows as are now in browse able
tabs. In this way main view still gives a good amount of information
without requiring changing the tab and the tabs are reserved for 'big
space' needed infos only.


   Marco

^ permalink raw reply

* [PATCH] builtin-push: resurrect parsing of Push: lines
From: Johannes Schindelin @ 2006-04-30 12:05 UTC (permalink / raw)
  To: git


The C'ification of push left these behind.

Signed-off-by: Johannes Schindelin <Johannes.Schindelin@gmx.de>

---

 builtin-push.c |   26 +++++++++++++++++++++-----
 1 files changed, 21 insertions(+), 5 deletions(-)

diff --git a/builtin-push.c b/builtin-push.c
index a0c1caa..4e659f0 100644
--- a/builtin-push.c
+++ b/builtin-push.c
@@ -68,6 +68,10 @@ static void set_refspecs(const char **re
 	expand_refspecs();
 }
 
+#define MAX_REFSPECS 10
+static int current_refspec = 0;
+static char *refspecs_[MAX_REFSPECS];
+
 static int get_remotes_uri(const char *repo, const char *uri[MAX_URI])
 {
 	int n = 0;
@@ -76,11 +80,17 @@ static int get_remotes_uri(const char *r
 	if (!f)
 		return -1;
 	while (fgets(buffer, BUF_SIZE, f)) {
+		int is_refspec;
 		char *s, *p;
 
-		if (strncmp("URL: ", buffer, 5))
+		if (!strncmp("URL: ", buffer, 5)) {
+			is_refspec = 0;
+			s = buffer + 5;
+		} else if (!strncmp("Push: ", buffer, 6)) {
+			is_refspec = 1;
+			s = buffer + 6;
+		} else
 			continue;
-		s = buffer + 5;
 
 		/* Remove whitespace at the head.. */
 		while (isspace(*s))
@@ -93,9 +103,10 @@ static int get_remotes_uri(const char *r
 		while (isspace(p[-1]))
 			*--p = 0;
 
-		uri[n++] = strdup(s);
-		if (n == MAX_URI)
-			break;
+		if (!is_refspec && n < MAX_URI)
+			uri[n++] = strdup(s);
+		else if (is_refspec && current_refspec < MAX_REFSPECS)
+			refspecs_[current_refspec++] = strdup(s);
 	}
 	fclose(f);
 	if (!n)
@@ -140,6 +151,8 @@ static int get_uri(const char *repo, con
 	int n;
 
 	if (*repo != '/') {
+		current_refspec = 0;
+
 		n = get_remotes_uri(repo, uri);
 		if (n > 0)
 			return n;
@@ -165,6 +178,9 @@ static int do_push(const char *repo)
 	if (n <= 0)
 		die("bad repository '%s'", repo);
 
+	if (refspec_nr == 0)
+		set_refspecs((const char**)refspecs_, current_refspec);
+
 	argv = xmalloc((refspec_nr + 10) * sizeof(char *));
 	argv[0] = "dummy-send-pack";
 	argc = 1;

^ permalink raw reply related

* [PATCH 1/3] builtin-push: also ask config for remote information
From: Johannes Schindelin @ 2006-04-30 13:23 UTC (permalink / raw)
  To: git


Now you can store your remote information in the config file like this:

[remote.upstream]
	url = me@company.com:the-project
	push = master:iceballs

Signed-off-by: Johannes Schindelin <Johannes.Schindelin@gmx.de>

---

	Obviously, this is on top of the patch to parse Pull: lines, too.

 builtin-push.c |   33 +++++++++++++++++++++++++++++++++
 1 files changed, 33 insertions(+), 0 deletions(-)

e55eb69f6332087c45082e16ccbf4e510d721e29
diff --git a/builtin-push.c b/builtin-push.c
index 4e659f0..e3131ed 100644
--- a/builtin-push.c
+++ b/builtin-push.c
@@ -72,6 +72,36 @@ #define MAX_REFSPECS 10
 static int current_refspec = 0;
 static char *refspecs_[MAX_REFSPECS];
 
+static int repo_len = 0;
+static const char *repo_ = NULL;
+static int current_uri = 0;
+static const char **uri_;
+
+static int get_value(const char* key, const char* value)
+{
+	if (!strncmp(key, "remote.", 7) && !strncmp(key + 7, repo_, repo_len)) {
+		if (!strcmp(key + 7 + repo_len, ".url"))
+			uri_[current_uri++] = strdup(value);
+		else if (!strcmp(key + 7 + repo_len, ".push")
+				&& current_refspec < MAX_REFSPECS)
+			refspecs_[current_refspec++] = strdup(value);
+	}
+
+	return 0;
+}
+
+static int get_config_remotes_uri(const char *repo, const char *uri[MAX_URI])
+{
+	repo_len = strlen(repo);
+	repo_ = repo;
+	current_uri = 0;
+	uri_ = uri;
+
+	git_config(get_value);
+
+	return current_uri;
+}
+
 static int get_remotes_uri(const char *repo, const char *uri[MAX_URI])
 {
 	int n = 0;
@@ -153,6 +183,9 @@ static int get_uri(const char *repo, con
 	if (*repo != '/') {
 		current_refspec = 0;
 
+		n = get_config_remotes_uri(repo, uri);
+		if (n > 0)
+			return n;
 		n = get_remotes_uri(repo, uri);
 		if (n > 0)
 			return n;
-- 
1.3.1.g38c00-dirty

^ permalink raw reply related

* [PATCH 2/3] fetch, pull: ask config for remote information
From: Johannes Schindelin @ 2006-04-30 13:24 UTC (permalink / raw)
  To: git


Now you can say

[remote.junio]
	url = git://git.kernel.org/pub/scm/git/git.git
	pull = next:next

in your .git/config.

Signed-off-by: Johannes Schindelin <Johannes.Schindelin@gmx.de>

---

 git-parse-remote.sh |   55 +++++++++++++++++++++++++++++++++++++++++++++++----
 1 files changed, 51 insertions(+), 4 deletions(-)

5a1cf349639823183fce287be9f809d797f2cd84
diff --git a/git-parse-remote.sh b/git-parse-remote.sh
index c9b899e..8ce57c8 100755
--- a/git-parse-remote.sh
+++ b/git-parse-remote.sh
@@ -4,13 +4,43 @@ # git-ls-remote could be called from out
 # this would fail in that case and would issue an error message.
 GIT_DIR=$(git-rev-parse --git-dir 2>/dev/null) || :;
 
+if [ -d "$GIT_DIR"/remotes -a "$GIT_REWRITE_REMOTES" = true ]; then
+	echo "Rewriting $GIT_DIR/remotes" >&2
+	error=0
+	# rewrite into config
+	{
+		cd "$GIT_DIR"/remotes
+		ls | while read f; do
+			name=$(echo -n "$f" | tr -c "A-Za-z0-9" ".")
+			sed -n \
+			-e "s/^URL: /remote.$name.url . /p" \
+			-e "s/^Pull: /remote.$name.pull ^$ /p" \
+			-e "s/^Push: /remote.$name.push ^$ /p" \
+			< "$f"
+		done
+		echo done
+	} | while read key regex value; do
+		case $key in
+		done)
+			if [ $error = 0 ]; then
+				mv "$GIT_DIR"/remotes "$GIT_DIR"/remotes.old
+			fi ;;
+		*)
+			git-repo-config $key "$value" $regex || error=1 ;;
+		esac
+	done
+fi
+
 get_data_source () {
 	case "$1" in
 	*/*)
 		# Not so fast.	This could be the partial URL shorthand...
 		token=$(expr "z$1" : 'z\([^/]*\)/')
 		remainder=$(expr "z$1" : 'z[^/]*/\(.*\)')
-		if test -f "$GIT_DIR/branches/$token"
+		if test "$(git-repo-config --get "remote.$token.url")"
+		then
+			echo config-partial
+		elif test -f "$GIT_DIR/branches/$token"
 		then
 			echo branches-partial
 		else
@@ -18,7 +48,10 @@ get_data_source () {
 		fi
 		;;
 	*)
-		if test -f "$GIT_DIR/remotes/$1"
+		if test "$(git-repo-config --get "remote.$1.url")"
+		then
+			echo config
+		elif test -f "$GIT_DIR/remotes/$1"
 		then
 			echo remotes
 		elif test -f "$GIT_DIR/branches/$1"
@@ -35,6 +68,15 @@ get_remote_url () {
 	case "$data_source" in
 	'')
 		echo "$1" ;;
+	config-partial)
+		token=$(expr "z$1" : '\([^/]*\)/')
+		remainder=$(expr "z$1" : '[^/]*/\(.*\)')
+		url=$(git-repo-config --get "remote.$token.url")
+		echo "$url/$remainder"
+		;;
+	config)
+		git-repo-config --get "remote.$1.url"
+		;;
 	remotes)
 		sed -ne '/^URL: */{
 			s///p
@@ -56,8 +98,10 @@ get_remote_url () {
 get_remote_default_refs_for_push () {
 	data_source=$(get_data_source "$1")
 	case "$data_source" in
-	'' | branches | branches-partial)
+	'' | config-partial | branches | branches-partial)
 		;; # no default push mapping, just send matching refs.
+	config)
+		git-repo-config --get-all "remote.$1.push" ;;
 	remotes)
 		sed -ne '/^Push: */{
 			s///p
@@ -111,8 +155,11 @@ # Returns list of src: (no store), or sr
 get_remote_default_refs_for_fetch () {
 	data_source=$(get_data_source "$1")
 	case "$data_source" in
-	'' | branches-partial)
+	'' | config-partial | branches-partial)
 		echo "HEAD:" ;;
+	config)
+		canon_refs_list_for_fetch \
+			$(git-repo-config --get-all "remote.$1.pull") ;;
 	branches)
 		remote_branch=$(sed -ne '/#/s/.*#//p' "$GIT_DIR/branches/$1")
 		case "$remote_branch" in '') remote_branch=master ;; esac
-- 
1.3.1.g38c00-dirty

^ permalink raw reply related

* [PATCH 3/3] fetch: optionally store the current remote information in the config
From: Johannes Schindelin @ 2006-04-30 13:24 UTC (permalink / raw)
  To: git


Instead of editing files, you can now say

	git pull --store junio \
		git://git.kernel.org/pub/scm/git/git.git next:next

and next time, just

	git pull junio

Signed-off-by: Johannes Schindelin <Johannes.Schindelin@gmx.de>

---

	This is what the patch series is all about.

	If there is no interest in a feature like this, let's just forget
	about the whole "remote info in config" thing.

	If there is interest, I could add the same functionality to
	builtin-push.

 Documentation/fetch-options.txt |    6 ++++++
 git-fetch.sh                    |   19 +++++++++++++++++++
 git-pull.sh                     |    8 ++++++--
 3 files changed, 31 insertions(+), 2 deletions(-)

6bd937b0de211465e9664f8dc890fc5066617b73
diff --git a/Documentation/fetch-options.txt b/Documentation/fetch-options.txt
index 13f34d3..caf98de 100644
--- a/Documentation/fetch-options.txt
+++ b/Documentation/fetch-options.txt
@@ -16,6 +16,12 @@
 	fetches is a descendant of `<lbranch>`.  This option
 	overrides that check.
 
+-S, \--store <nick>::
+	Store the URL and the refnames in the config file so that
+	`git fetch <nick>` repeats the exercise.
+	If the nick exists already, edit the URL, but append the
+	refnames.
+
 \--no-tags::
 	By default, `git-fetch` fetches tags that point at
 	objects that are downloaded from the remote repository
diff --git a/git-fetch.sh b/git-fetch.sh
index 280f62e..ac122da 100755
--- a/git-fetch.sh
+++ b/git-fetch.sh
@@ -15,8 +15,10 @@ no_tags=
 tags=
 append=
 force=
+keep=
 verbose=
 update_head_ok=
+store=
 exec=
 upload_pack=
 while case "$#" in 0) break ;; esac
@@ -34,6 +36,10 @@ do
 	-f|--f|--fo|--for|--forc|--force)
 		force=t
 		;;
+	-S|--s|--st|--sto|--stor|--store)
+		store="$2"
+		shift
+		;;
 	-t|--t|--ta|--tag|--tags)
 		tags=t
 		;;
@@ -235,6 +241,12 @@ then
 	fi
 fi
 
+if test "$store"
+then
+    git-repo-config remote."$store".url $remote ||
+	die "Could not store into $store"
+fi
+
 fetch_main () {
   reflist="$1"
   refs=
@@ -243,6 +255,11 @@ fetch_main () {
   do
       refs="$refs$LF$ref"
 
+      if test "$store"
+      then
+	  git-repo-config remote."$store".pull "$ref" '^$'
+      fi
+
       # These are relative path from $GIT_DIR, typically starting at refs/
       # but may be HEAD
       if expr "z$ref" : 'z\.' >/dev/null
@@ -381,6 +398,8 @@ fetch_main () {
 
 fetch_main "$reflist"
 
+store=
+
 # automated tag following
 case "$no_tags$tags" in
 '')
diff --git a/git-pull.sh b/git-pull.sh
index 4611ae6..ab0fba3 100755
--- a/git-pull.sh
+++ b/git-pull.sh
@@ -8,7 +8,7 @@ USAGE='[-n | --no-summary] [--no-commit]
 LONG_USAGE='Fetch one or more remote refs and merge it/them into the current HEAD.'
 . git-sh-setup
 
-strategy_args= no_summary= no_commit=
+strategy_args= no_summary= no_commit= store=
 while case "$#,$1" in 0) break ;; *,-*) ;; *) break ;; esac
 do
 	case "$1" in
@@ -31,6 +31,10 @@ do
 		esac
 		strategy_args="${strategy_args}-s $strategy "
 		;;
+	-S|--store)
+		store="-S $2"
+		shift
+		;;
 	-h|--h|--he|--hel|--help)
 		usage
 		;;
@@ -43,7 +47,7 @@ do
 done
 
 orig_head=$(git-rev-parse --verify HEAD) || die "Pulling into a black hole?"
-git-fetch --update-head-ok "$@" || exit 1
+git-fetch --update-head-ok $store "$@" || exit 1
 
 curr_head=$(git-rev-parse --verify HEAD)
 if test "$curr_head" != "$orig_head"
-- 
1.3.1.g38c00-dirty

^ permalink raw reply related

* Re: cg-clone not fetching all tags?
From: Wolfgang Denk @ 2006-04-30 13:48 UTC (permalink / raw)
  To: Junio C Hamano; +Cc: git, pasky
In-Reply-To: <7vaca31z50.fsf@assigned-by-dhcp.cox.net>

Dear Junio,

in message <7vaca31z50.fsf@assigned-by-dhcp.cox.net> you wrote:
> 
> I suspect there is no need to manufacture the tag.  Something
> like this should do.

Great! Thanks a lot.

> *WARNING* Since I do not do Porcelain, and I am not a Cogito
> user, this is obviously untested.  In addition, I am seriously
> drunk right now... 

Good enough. This one actually works:

> -- >8 --
> [PATCH] (cogito) Auto-follow lightweight tags as well.


--- a/cg-fetchG	2006-04-10 19:14:14.000000000 +0200
+++ b/cg-fetch	2006-04-30 14:35:03.000000000 +0200
@@ -211,7 +211,8 @@
 	git-ls-remote --tags "$uri" |
 		# SHA1 refs/tags/v0.99.8^{} --> SHA1 tags/v0.99.8
 		# where SHA1 is the object v0.99.8 tag points at.
-		sed -ne 's:\([^	]\)	refs/\(tags/.*\)^{}$:\1 \2:p' |
+		sed -n -e 's:\([^	]\)	refs/\(tags/.*\)^{}$:\1 \2:p' \
+		       -e 's:\([^	]\)	refs/\(tags/.*\)$:\1 \2:p' | \
 		while read sha1 tagname; do
 			# Do we have the tag itself?
 			[ -s "$_git/refs/$tagname" ] && continue


Best regards,

Wolfgang Denk

-- 
Software Engineering:  Embedded and Realtime Systems,  Embedded Linux
Phone: (+49)-8142-66989-10 Fax: (+49)-8142-66989-80 Email: wd@denx.de
It's hard to think of you as the end result of millions of  years  of
evolution.

^ permalink raw reply

* Re: [PATCH 3/3] fetch: optionally store the current remote information in the config
From: Jakub Narebski @ 2006-04-30 14:19 UTC (permalink / raw)
  To: git
In-Reply-To: <Pine.LNX.4.63.0604301524080.2646@wbgn013.biozentrum.uni-wuerzburg.de>

There was thread about storing somewhere default branch we merge to during
pull, instead of using always surrent one. Different schemes were proposed,
most of them depending on the remotes configuration being available [also]
in config file.

Perhaps it would be easiest to extend existing notation in the following
way: 
  <from>:<to>[:<merge>]

By the way: it would be nice to have command/script to trasform freely
between 'remotes/' and config file.


P.S. I wonder if it would be difficult to implement 'include <file>' for
config file...

-- 
Jakub Narebski
Warsaw, Poland

^ permalink raw reply

* Re: [PATCH 3/3] fetch: optionally store the current remote information in the config
From: sean @ 2006-04-30 14:30 UTC (permalink / raw)
  To: Johannes Schindelin; +Cc: git
In-Reply-To: <Pine.LNX.4.63.0604301524080.2646@wbgn013.biozentrum.uni-wuerzburg.de>

On Sun, 30 Apr 2006 15:24:22 +0200 (CEST)
Johannes Schindelin <Johannes.Schindelin@gmx.de> wrote:

> Instead of editing files, you can now say
> 
> 	git pull --store junio \
> 		git://git.kernel.org/pub/scm/git/git.git next:next
> 
> and next time, just
> 
> 	git pull junio
> 
> Signed-off-by: Johannes Schindelin <Johannes.Schindelin@gmx.de>
> 
> ---
> 
> 	This is what the patch series is all about.
> 
> 	If there is no interest in a feature like this, let's just forget
> 	about the whole "remote info in config" thing.
> 
> 	If there is interest, I could add the same functionality to
> 	builtin-push.

Well I agree with you that doing something like this is important.  We
should take this moment of moving things to the config file to correct
the terminology and help make things clear.  We're not storing "Pull:"
information, we're storing config/remote.$NICK.fetch data.  It's really
used just by fetch, pull just happens to call fetch.

Along that same line of reasoning, it seems more appropriate to use 
git fetch --store ...  rather than git pull --store ... to set this
information.   And there needs to be a way to change and delete the 
nick information, perhaps git fetch store junio ""  would delete the
entry. Or maybe people should just be instructed to use git-repo-config
for setting, changing and deleting?

Pull needs additional logic that allows it to merge from the proper
local branch after it calls fetch.  Right now it just uses whatever 
fetch sets as FETCH_HEAD.  It's not clear to me what is set as 
FETCH_HEAD when multiple refs are fetched from the remote.  It'll 
be even more confusing once it's possible to fetch from multiple 
remotes at once.

As for these specific patches, it doesn't appear that your change to
builtin-push allows the push variable to hold more than one remote 
repo URI or even more than one refspec, or did I misread that?
Also it seems that the refspec is used from the config file even if
the user tries to override it by specifying an alternative on the
command line.

Sean

^ permalink raw reply

* Re: [RFC] [PATCH 0/5] Implement 'prior' commit object links (and
From: Jakub Narebski @ 2006-04-30 15:21 UTC (permalink / raw)
  To: git
In-Reply-To: <e30k0n$ij5$1@sea.gmane.org>

Jakub Narebski wrote:

> Junio C Hamano wrote:
> 
>> Jakub Narebski <jnareb@gmail.com> writes:
>> 
>>>  * "prior" - heads that represent topic branch merges
>> 
>> This is not any different from usual "parent" at all (but you
>> have to think about it a bit to realize it).
> [cut]
> Thanks for an explanation.
> 
> I would say that "prior" is not THAT different from usual "parent",
> rather than it is not ANY different.
> 
> My doubts about recording previous head of a "union" (pu-like) branch
> is that for merge (e.g. 'pu' to 'next', cherrypick to/from 'pu', 'pu'
> rebase) is that for merge algorithm all parents are equivalent, with
> eventual exception of first which can be treated special ('ours').

Additionally with "prior" (or at least some convention on which of parents
is to prior head of "union (pu-like) branch) I think we could fast-forward
such branches...

-- 
Jakub Narebski
Warsaw, Poland

^ permalink raw reply

* Re: [PATCH 3/3] fetch: optionally store the current remote information in the config
From: Johannes Schindelin @ 2006-04-30 15:49 UTC (permalink / raw)
  To: sean; +Cc: git
In-Reply-To: <BAYC1-PASMTP08069B2CE6005391A1AFF9AEB00@CEZ.ICE>

Hi,

On Sun, 30 Apr 2006, sean wrote:

> On Sun, 30 Apr 2006 15:24:22 +0200 (CEST)
> Johannes Schindelin <Johannes.Schindelin@gmx.de> wrote:
> 
> > Instead of editing files, you can now say
> > 
> > 	git pull --store junio \
> > 		git://git.kernel.org/pub/scm/git/git.git next:next
> > 
> > and next time, just
> > 
> > 	git pull junio
> > 
> > Signed-off-by: Johannes Schindelin <Johannes.Schindelin@gmx.de>
> > 
> > ---
> > 
> > 	This is what the patch series is all about.
> > 
> > 	If there is no interest in a feature like this, let's just forget
> > 	about the whole "remote info in config" thing.
> > 
> > 	If there is interest, I could add the same functionality to
> > 	builtin-push.
> 
> Well I agree with you that doing something like this is important.  We
> should take this moment of moving things to the config file to correct
> the terminology and help make things clear.  We're not storing "Pull:"
> information, we're storing config/remote.$NICK.fetch data.  It's really
> used just by fetch, pull just happens to call fetch.

I have no strong feelings either way.

> Along that same line of reasoning, it seems more appropriate to use 
> git fetch --store ...  rather than git pull --store ... to set this
> information.

Both works.

> And there needs to be a way to change and delete the nick information, 
> perhaps git fetch store junio ""  would delete the entry. Or maybe 
> people should just be instructed to use git-repo-config for setting, 
> changing and deleting?

The latter should be done, because "git fetch" really is about fetching, 
not playing games with the config.

> Pull needs additional logic that allows it to merge from the proper
> local branch after it calls fetch.  Right now it just uses whatever 
> fetch sets as FETCH_HEAD.  It's not clear to me what is set as 
> FETCH_HEAD when multiple refs are fetched from the remote.  It'll 
> be even more confusing once it's possible to fetch from multiple 
> remotes at once.

FETCH_HEAD can contain multiple refs. And I don't get the part about 
fetching from multiple remotes: my patch does not allow for that.

> As for these specific patches, it doesn't appear that your change to
> builtin-push allows the push variable to hold more than one remote 
> repo URI or even more than one refspec, or did I misread that?

But it does! Note the "uri_[current_uri++]" part of the patch.

> Also it seems that the refspec is used from the config file even if
> the user tries to override it by specifying an alternative on the
> command line.

No. It is only used when there were no refspecs specified on the command 
line:

        if (refspec_nr == 0)
                set_refspecs((const char**)refspecs_, current_refspec);


Ciao,
Dscho

^ permalink raw reply

* Re: [PATCH 3/3] fetch: optionally store the current remote information in the config
From: Johannes Schindelin @ 2006-04-30 15:52 UTC (permalink / raw)
  To: Jakub Narebski; +Cc: git
In-Reply-To: <e32h0o$15n$1@sea.gmane.org>

Hi,

On Sun, 30 Apr 2006, Jakub Narebski wrote:

> There was thread about storing somewhere default branch we merge to during
> pull, instead of using always surrent one. Different schemes were proposed,
> most of them depending on the remotes configuration being available [also]
> in config file.

I was not following that thread closely, since it became too confusing for 
me. However, I think that my patch could be a start in that direction.

> By the way: it would be nice to have command/script to trasform freely
> between 'remotes/' and config file.

If you set the environment variable GIT_REWRITE_REMOTES to "true", and 
call git-parse-remotes.sh, it will do the rewriting to the config file. 
Obviously, I did not test that part of the patch all that well.

> P.S. I wonder if it would be difficult to implement 'include <file>' for
> config file...

You really need that?

Ciao,
Dscho

^ permalink raw reply

* Re: [PATCH 3/3] fetch: optionally store the current remote information in the config
From: Jakub Narebski @ 2006-04-30 16:07 UTC (permalink / raw)
  To: git
In-Reply-To: <Pine.LNX.4.63.0604301749130.3641@wbgn013.biozentrum.uni-wuerzburg.de>

Johannes Schindelin wrote:

> On Sun, 30 Apr 2006, Jakub Narebski wrote:
> 
>> P.S. I wonder if it would be difficult to implement 'include <file>' for
>> config file...
> 
> You really need that?

Need? Not exactly. I don't think git ever reach complexity of Apache or
Samba configuration files, and _need_ for includes. Still dividing separate
areas of configuration (core, user, default commands options, remotes) has
it's merits.

-- 
Jakub Narebski
Warsaw, Poland

^ permalink raw reply

* Re: [PATCH 3/3] fetch: optionally store the current remote information in the config
From: sean @ 2006-04-30 16:37 UTC (permalink / raw)
  To: Johannes Schindelin; +Cc: git
In-Reply-To: <Pine.LNX.4.63.0604301743370.3641@wbgn013.biozentrum.uni-wuerzburg.de>

On Sun, 30 Apr 2006 17:49:06 +0200 (CEST)
Johannes Schindelin <Johannes.Schindelin@gmx.de> wrote:


> > the terminology and help make things clear.  We're not storing "Pull:"
> > information, we're storing config/remote.$NICK.fetch data.  It's really
> > used just by fetch, pull just happens to call fetch.
>
> I have no strong feelings either way.

Yeah, once you "get" it, it's not a problem; but it's not easy when you're
just learning git to separate fetch and pull.  It's made harder if git 
can't even keep them straight internally. :o/

[...]

> The latter should be done, because "git fetch" really is about fetching, 
> not playing games with the config.

Then we should also remove the --store option from pull and fetch.  It
can be set with git-repo-config.

> FETCH_HEAD can contain multiple refs. 

Which head does git-pull then use to merge, all of them?

> And I don't get the part about fetching from multiple remotes: 
> my patch does not allow for that.

Actually it does :o)  User just needs multiple remote.$nick.url entries 
in his config.

> But it does! Note the "uri_[current_uri++]" part of the patch.
[...]
> No. It is only used when there were no refspecs specified on the command 
> line:
> 
>         if (refspec_nr == 0)
>                 set_refspecs((const char**)refspecs_, current_refspec);

Right you are, on both counts.

Sean

^ permalink raw reply

* Re: [PATCH 3/3] fetch: optionally store the current remote information in the config
From: Jakub Narebski @ 2006-04-30 16:51 UTC (permalink / raw)
  To: git
In-Reply-To: <BAYC1-PASMTP03034CC49FFA3042562BCBAEB00@CEZ.ICE>

sean wrote:

> On Sun, 30 Apr 2006 17:49:06 +0200 (CEST)
> Johannes Schindelin <Johannes.Schindelin@gmx.de> wrote:
> 
> 
>> > the terminology and help make things clear.  We're not storing "Pull:"
>> > information, we're storing config/remote.$NICK.fetch data.  It's really
>> > used just by fetch, pull just happens to call fetch.
>>
>> I have no strong feelings either way.
> 
> Yeah, once you "get" it, it's not a problem; but it's not easy when you're
> just learning git to separate fetch and pull.  It's made harder if git
> can't even keep them straight internally. :o/

Well, it could also contain default head we merge to (instead of using what
fetch set as FETCH_HEAD, usually current head while fetching), as

        pull = master:origin:merger

> [...]
> 
> > The latter should be done, because "git fetch" really is about fetching, 
> > not playing games with the config.
> 
> Then we should also remove the --store option from pull and fetch.  It
> can be set with git-repo-config.

The --store option is similar to using 'git checkout -b newbranch' as a
shortcut for 'git branch newbranch' followed by 'git checkout newbranch'.

-- 
Jakub Narebski
Warsaw, Poland

^ permalink raw reply

* Re: [PATCH 3/3] fetch: optionally store the current remote information in the config
From: Johannes Schindelin @ 2006-04-30 17:09 UTC (permalink / raw)
  To: sean; +Cc: git
In-Reply-To: <BAYC1-PASMTP03034CC49FFA3042562BCBAEB00@CEZ.ICE>

Hi,

On Sun, 30 Apr 2006, sean wrote:

> On Sun, 30 Apr 2006 17:49:06 +0200 (CEST)
> Johannes Schindelin <Johannes.Schindelin@gmx.de> wrote:
> 
> 
> > The latter should be done, because "git fetch" really is about fetching, 
> > not playing games with the config.
> 
> Then we should also remove the --store option from pull and fetch.  It
> can be set with git-repo-config.

Well, with "--store", "git fetch" still fetches. It just happens to write 
down -- for convenience -- the possibly long url and the refspecs.

> > FETCH_HEAD can contain multiple refs. 
> 
> Which head does git-pull then use to merge, all of them?

The first one.

> > And I don't get the part about fetching from multiple remotes: 
> > my patch does not allow for that.
> 
> Actually it does :o)  User just needs multiple remote.$nick.url entries 
> in his config.

You are right. But you are also wrong. The patch uses

	git-repo-config --get remote.$nick.url

which fails if there are more than one matching line. Note that 
"--get-all" is used to get _all_ remote.$nick.pull lines...

But of course, Linus "built git-push in" so that multiple urls are 
allowed and handled. It is probably confusing, if you can push but 
cannot fetch with the same remote information... But then, I fail to see 
how you could possibly specify the refspecs for the different urls.

Ciao,
Dscho

^ permalink raw reply

* Re: [PATCH 3/3] fetch: optionally store the current remote information in the config
From: sean @ 2006-04-30 17:19 UTC (permalink / raw)
  To: Jakub Narebski; +Cc: git
In-Reply-To: <e32pto$p3a$1@sea.gmane.org>

On Sun, 30 Apr 2006 18:51:54 +0200
Jakub Narebski <jnareb@gmail.com> wrote:
 
> Well, it could also contain default head we merge to (instead of using what
> fetch set as FETCH_HEAD, usually current head while fetching), as
> 
>         pull = master:origin:merger

Then lets take a simple case; we clone a new repo, and it has:

	[remote.origin]
	  url = git://outthere.com
	  fetch = master:origin:master
	  fetch = next:next

And we create two new branches:

	git branch br1 next ; git branch br2 next

Now say that we want a bare "git pull" to cause a merge from 
the "next" branch regardless of which new branch we have checked
out.   In the above scheme we have to do something like:

	   fetch = next:next:br1:br2

That doesn't look right.  It seems better to have:
	
	[branch.origin]
		description = "Pristine master from Junio"
	[branch.br1]
		description = "blah"
		defaultMerge = "next"
	[branch.br2]
		description = "More blah"
		LastMerge = 03/27/2008 3am
		defaultMerge = "next"
		qgitTagColor = Blue

> The --store option is similar to using 'git checkout -b newbranch' as a
> shortcut for 'git branch newbranch' followed by 'git checkout newbranch'.

Okay.

Sean

^ permalink raw reply

* Re: [PATCH 3/3] fetch: optionally store the current remote information in the config
From: sean @ 2006-04-30 17:28 UTC (permalink / raw)
  To: Johannes Schindelin; +Cc: git
In-Reply-To: <Pine.LNX.4.63.0604301859280.3977@wbgn013.biozentrum.uni-wuerzburg.de>

On Sun, 30 Apr 2006 19:09:18 +0200 (CEST)
Johannes Schindelin <Johannes.Schindelin@gmx.de> wrote:

> > Which head does git-pull then use to merge, all of them?
> 
> The first one.

Which can be confusing since you can only specify one "first one"
in a remotes file (or .git/config)  yet you can pull while 
having any random local branch being checkout out, each with
a different merge branch being appropriate.

> You are right. But you are also wrong. The patch uses
> 
> 	git-repo-config --get remote.$nick.url
> 
> which fails if there are more than one matching line. Note that 
> "--get-all" is used to get _all_ remote.$nick.pull lines...
> 
> But of course, Linus "built git-push in" so that multiple urls are 
> allowed and handled. It is probably confusing, if you can push but 
> cannot fetch with the same remote information... But then, I fail to see 
> how you could possibly specify the refspecs for the different urls.

Yeah, I was speaking only of git push, but see you were speaking of 
fetch.

Anyway, thanks for helping me understand your proposal, it seems
flexible enough to handle just about any case one might want to
throw at it.

Cheers,
Sean

^ permalink raw reply

* Re: [PATCH 3/3] fetch: optionally store the current remote information in the config
From: Jakub Narebski @ 2006-04-30 17:35 UTC (permalink / raw)
  To: git
In-Reply-To: <BAYC1-PASMTP054CF113E95D45B8778DACAEB00@CEZ.ICE>

sean wrote:

> [branch.origin]
> description = "Pristine master from Junio"

I'd like to add
> pristine = true

and for git to warn if we try to commit to branch which is supposed to be
pristine (tracking external repository).

-- 
Jakub Narebski
Warsaw, Poland

^ permalink raw reply

* [PATCH] Conditionally define _GNU_SOURCE in mailinfo.c
From: Art Haas @ 2006-04-30 18:19 UTC (permalink / raw)
  To: Junio C Hamano, git

Hi.

Place the '#define _GNU_SOURCE' within an #ifndef/#endif block testing
if '_GNU_SOURCE' is already defined.

Signed-off-by: Art Haas <ahaas@airmail.net>

---

 mailinfo.c |    2 ++
 1 files changed, 2 insertions(+), 0 deletions(-)

d3932a8fca2faac8ed14bfd0e65c1f0135dc1d4b
diff --git a/mailinfo.c b/mailinfo.c
index b276519..4b99ccf 100644
--- a/mailinfo.c
+++ b/mailinfo.c
@@ -2,7 +2,9 @@
  * Another stupid program, this one parsing the headers of an
  * email to figure out authorship and subject
  */
+#ifndef _GNU_SOURCE
 #define _GNU_SOURCE
+#endif
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
-- 
1.3.1.g66ae

-- 
Man once surrendering his reason, has no remaining guard against absurdities
the most monstrous, and like a ship without rudder, is the sport of every wind.

-Thomas Jefferson to James Smith, 1822

^ permalink raw reply related

* [RFC] Terms to add to glossary
From: Jakub Narebski @ 2006-04-30 19:18 UTC (permalink / raw)
  To: git

I'd like the following terms to be added to and described in git glossary:
Any takers?


topic branches::

pickaxe::

cherry pick:: (cherry picking)

refspec::

patch::

rev::

revert:: (commit)

fast-forward:: (branch)

annotate:: (blame)

symbolic ref::


BTW. it might be worth to take a look at 
  http://en.wikipedia.org/wiki/Revision_control#Vocabulary
and either expand git glossary, or correct Wikipedia entry.

-- 
Jakub Narebski
Warsaw, Poland

^ permalink raw reply


This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox